shell bypass 403

GrazzMean Shell

: /proc/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: 3.16.149.148
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : really-simple-ssl.tar
mailer/class-mail-admin.php000064400000007726147510557610011670 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' );
			}
		}
	}
}mailer/index.php000064400000000043147510557610007645 0ustar00<?php // You don't belong here. ?>
mailer/templates/index.php000064400000000043147510557610011643 0ustar00<?php // You don't belong here. ?>
mailer/templates/block.html000064400000010050147510557610012002 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>
mailer/templates/email.html000064400000024756147510557610012021 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>
mailer/templates/email-unbranded.html000064400000024216147510557610013750 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>
mailer/templates/block-unbranded.html000064400000010050147510557610013742 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>
mailer/class-mail.php000064400000017277147510557610010604 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
			];
		}

	}
}
upgrade.php000064400000023105147510557610006720 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 );
}
testssl/serverhttpxforwardedssl1/ssl-test-page.html000064400000000237147510557610016737 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/serverhttpxforwardedssl1/.htaccess000064400000000227147510557610015156 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-SSL} !=1
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/cloudflare/.htaccess000064400000000240147510557610012172 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/cloudflare/ssl-test-page.html000064400000000237147510557610013760 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/cloudfront/ssl-test-page.html000064400000000237147510557610014017 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/cloudfront/.htaccess000064400000000245147510557610012236 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:CloudFront-Forwarded-Proto} !https
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/serverport443/ssl-test-page.html000064400000000237147510557610014306 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/serverport443/.htaccess000064400000000217147510557610012524 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/envhttps/.htaccess000064400000000214147510557610011726 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{ENV:HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/envhttps/ssl-test-page.html000064400000000237147510557610013513 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/loadbalancer/.htaccess000064400000000234147510557610012464 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/loadbalancer/ssl-test-page.html000064400000000237147510557610014247 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/serverhttpson/.htaccess000064400000000216147510557610013003 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/serverhttpson/ssl-test-page.html000064400000000237147510557610014566 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/serverhttps1/.htaccess000064400000000210147510557610012521 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=1
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/serverhttps1/ssl-test-page.html000064400000000237147510557610014312 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/serverhttpxforwardedsslon/ssl-test-page.html000064400000000237147510557610017213 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/serverhttpxforwardedsslon/.htaccess000064400000000227147510557610015432 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
testssl/serverhttpxproto/ssl-test-page.html000064400000000237147510557610015322 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
testssl/serverhttpxproto/.htaccess000064400000000220147510557610013532 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Proto} !SSL
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
assets/img/icon.png000064400000046056147510557610010306 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`�assets/img/really-simple-plugins.svg000064400000014216147510557610013620 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>assets/img/index.php000064400000000043147510557610010452 0ustar00<?php // You don't belong here. ?>
assets/img/really-simple-security-logo.svg000064400000026717147510557610014755 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>assets/templates/two_fa/profile-settings.php000064400000015253147510557610015353 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>

assets/templates/two_fa/onboarding.php000064400000014044147510557610014174 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();
assets/templates/two_fa/selectable-option.php000064400000001464147510557610015465 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>
assets/templates/two_fa/expired.php000064400000000341147510557610013505 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();assets/templates/two_fa/login.php000064400000007303147510557610013162 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>
assets/templates/two_fa/totp-config.php000064400000003706147510557610014306 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'); ?>"/>
assets/css/admin.css.map000064400000023400147510557610011226 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"}assets/css/admin.scss000064400000004416147510557610010643 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';
assets/css/rsssl-plugin.min.css000064400000005302147510557610012607 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)}assets/css/rsssl-plugin.css000064400000006664147510557610012041 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);
}assets/css/index.php000064400000000043147510557610010466 0ustar00<?php // You don't belong here. ?>
assets/css/variables.scss000064400000010157147510557610011522 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; }
}

assets/css/admin/modules/premium_overlay.scss000064400000002705147510557610015531 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;
    }
  }
}assets/css/admin/modules/xml-rpc.scss000064400000000265147510557610013673 0ustar00.rsssl div[class^=rsssl-wizard-] .rsssl-hardening-xml {
  .rsssl-locked .rsssl-shield-overlay {
      align-items: center;
      display: flex;
      justify-content: center;
  }
}
assets/css/admin/modules/placeholder.scss000064400000003300147510557610014564 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;
  }
}assets/css/admin/modules/animations.scss000064400000002604147510557610014452 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;
}assets/css/admin/modules/other-plugins.scss000064400000004032147510557610015105 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;
      }
    }
  }
}
assets/css/admin/modules/tooltip.scss000064400000000460147510557610014000 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;
    }
  }
}assets/css/admin/modules/ssltest.scss000064400000000000147510557610013775 0ustar00assets/css/admin/modules/progress.scss000064400000012476147510557610014164 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;
  }
}

assets/css/admin/modules/tips-tricks.scss000064400000002215147510557610014562 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;
	}
  }
}
assets/css/admin/modules/datatables.scss000064400000023644147510557610014423 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;
 }assets/css/admin/modules/introcontainer.scss000064400000002627147510557610015353 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); }
  }
}assets/css/admin/modules/wizard.scss000064400000011406147510557610013610 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;
      }
    }
  }
}
assets/css/admin/modules/toast/main.scss000064400000000547147510557610014372 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';
assets/css/admin/modules/toast/_closeButton.scss000064400000000600147510557610016074 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;
  }
}
assets/css/admin/modules/toast/_toastContainer.scss000064400000002056147510557610016577 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;
    }
  }
}
assets/css/admin/modules/toast/_variables.scss000064400000003356147510557610015556 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);
}
assets/css/admin/modules/toast/_progressBar.scss000064400000001026147510557610016067 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;
  }
}
assets/css/admin/modules/toast/minimal.scss000064400000000411147510557610015062 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;
}
assets/css/admin/modules/toast/animations/_spin.scss000064400000000172147510557610016712 0ustar00@keyframes #{$rt-namespace}__spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
assets/css/admin/modules/toast/animations/_bounce.scss000064400000006317147510557610017223 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;
  }
}
assets/css/admin/modules/toast/animations/_slide.scss000064400000004017147510557610017043 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;
  }
}
assets/css/admin/modules/toast/animations/_flip.scss000064400000001620147510557610016672 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;
}
assets/css/admin/modules/toast/animations/_zoom.scss000064400000000713147510557610016726 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;
}
assets/css/admin/modules/toast/_icons.scss000064400000000456147510557610014717 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;
}
assets/css/admin/modules/toast/_theme.scss000064400000003006147510557610014700 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);
  }
}
assets/css/admin/modules/toast/_toast.scss000064400000002354147510557610014735 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;
  }
}
assets/css/admin/modules/bullets.scss000064400000002456147510557610013767 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%;
	}
  }
}
assets/css/admin/modules/notices.scss000064400000000026147510557610013750 0ustar00/**
Admin notice
 */

assets/css/admin/modules/new-features.scss000064400000001375147510557610014721 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);
      }
    }
  }
}assets/css/admin/modules/header.scss000064400000001461147510557610013540 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;
	}
  }

}
assets/css/admin/modules/two-fa.scss000064400000001547147510557610013512 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 */
}assets/css/admin/modules/modal.scss000064400000006042147510557610013404 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);
//}
assets/css/admin/modules/dashboard.scss000064400000010303147510557610014232 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);
    }
  }
}assets/css/admin/modules/icons.scss000064400000000764147510557610013430 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;}
}
assets/css/admin/modules/buttons.scss000064400000006320147510557610014005 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;
      }
    }
  }
}assets/css/admin/modules/wizard/permissions-policy.scss000064400000000333147510557610017455 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);
    }
  }
}assets/css/admin/modules/wizard/snackbar.scss000064400000000606147510557610015374 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;
    }
  }
}assets/css/admin/modules/wizard/vulnerabilities.scss000064400000000702147510557610017006 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;
    }
  }
}assets/css/admin/modules/wizard/fields.scss000064400000011057147510557610015060 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;
}assets/css/admin/modules/wizard/menu.scss000064400000006161147510557610014556 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;
        }
      }
    }
  }
}assets/css/admin/modules/wizard/learning-mode.scss000064400000002153147510557610016330 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;
    }
  }
}assets/css/admin/modules/wizard/notice.scss000064400000003265147510557610015075 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);
  }
}

assets/css/admin/modules/wizard/mixed-content-scan.scss000064400000002060147510557610017304 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);
  }
}assets/css/admin/modules/wizard/letsencrypt.scss000064400000004421147510557610016163 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;
  }
}

assets/css/admin/modules/onboarding.scss000064400000001147147510557610014433 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;
        }
      }
    }
  }

}assets/css/admin/modules/badges.scss000064400000004142147510557610013534 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;
    }
  }
}assets/css/admin/states.scss000064400000005024147510557610012142 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);
	   }
  }

}
assets/css/admin/theme.scss000064400000004032147510557610011737 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);
//  }
//}assets/css/admin/index.php000064400000000034147510557610011556 0ustar00<?php
// Silence is golden.
assets/css/admin/layout.scss000064400000012556147510557610012164 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;
  }
}
}
assets/css/admin/base.scss000064400000004362147510557610011555 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;
}assets/css/rsssl-plugin.scss000064400000002015147510557610012206 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);
  }
}

assets/css/rtl/plugin.min.css000064400000005302147510557610012244 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)}assets/css/rtl/admin.min.css000064400000446667147510557610012065 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)}assets/css/rtl/rsssl-plugin.min.css000064400000005302147510557610013410 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)}assets/css/admin.css000064400000521123147510557610010457 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);
}assets/css/admin.min.css000064400000446627147510557610011260 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)}assets/two-fa/rtl/two-fa-assets.min.css000064400000003311147510557610014046 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}assets/two-fa/rtl/two-fa-assets.min.js000064400000017227147510557610013705 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()})}}assets/two-fa/rtl/two-fa.css000064400000005325147510557610011773 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 */
}assets/index.php000064400000000043147510557610007676 0ustar00<?php // You don't belong here. ?>
assets/js/qrcode.min.js000064400000075636147510557610011113 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});assets/js/qrcode.js000064400000156565147510557610010332 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;
}));
lets-encrypt/integrations/cloudways/cloudways.php000064400000020132147510557610016451 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 );
	}

}lets-encrypt/integrations/cloudways/functions.php000064400000004024147510557610016451 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' );

lets-encrypt/integrations/plesk/plesk.php000064400000006054147510557610014670 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);
	}

}

lets-encrypt/integrations/plesk/functions.php000064400000002441147510557610015556 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' );
lets-encrypt/integrations/directadmin/functions.php000064400000002525147510557610016726 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' );


lets-encrypt/integrations/directadmin/httpsocket.php000064400000023532147510557610017107 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;
	}


}lets-encrypt/integrations/directadmin/directadmin.php000064400000010060147510557610017172 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 );
	}

}





lets-encrypt/integrations/index.php000064400000000043147510557610013533 0ustar00<?php // You don't belong here. ?>
lets-encrypt/integrations/integrations.php000064400000001276147510557610015143 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' );
}

lets-encrypt/integrations/hostgator/hostgator.php000064400000000250147510557610016450 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
*/
lets-encrypt/integrations/cpanel/functions.php000064400000007263147510557610015711 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");
lets-encrypt/integrations/cpanel/cpanel.php000064400000026605147510557610015144 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);
	}


}
lets-encrypt/download.php000064400000005205147510557610011532 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;
}
lets-encrypt/functions.php000064400000041436147510557610011741 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;
	}
}lets-encrypt/index.php000064400000000043147510557610011025 0ustar00<?php // You don't belong here. ?>
lets-encrypt/class-letsencrypt-handler.php000064400000164744147510557610015033 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);
    }
}
lets-encrypt/class-le-restapi.php000064400000017765147510557610013111 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
lets-encrypt/vendor/composer/installed.json000064400000007606147510557610015217 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": []
}
lets-encrypt/vendor/composer/installed.php000064400000001650147510557610015026 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',
    ),
  ),
);
lets-encrypt/vendor/composer/autoload_psr4.php000064400000000317147510557610015626 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'),
);
lets-encrypt/vendor/composer/autoload_static.php000064400000002546147510557610016233 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);
    }
}
lets-encrypt/vendor/composer/autoload_real.php000064400000003551147510557610015664 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;
    }
}
lets-encrypt/vendor/composer/autoload_namespaces.php000064400000000322147510557610017051 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'),
);
lets-encrypt/vendor/composer/ClassLoader.php000064400000034037147510557610015250 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;
}
lets-encrypt/vendor/composer/index.php000064400000000043147510557610014151 0ustar00<?php // You don't belong here. ?>
lets-encrypt/vendor/composer/LICENSE000064400000002056147510557610013344 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.

lets-encrypt/vendor/composer/platform_check.php000064400000001635147510557610016033 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
    );
}
lets-encrypt/vendor/composer/InstalledVersions.php000064400000011632147510557610016520 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;
}
}
lets-encrypt/vendor/composer/autoload_classmap.php000064400000000350147510557610016536 0ustar00<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
);
lets-encrypt/vendor/fbett/le_acme2/README.md000064400000010431147510557610014536 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.
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/TestHelper.php000064400000001776147510557610021044 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AccountTest.php000064400000013102147510557610021203 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));
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AbstractTest.php000064400000000464147510557610021361 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/Authorizer/HTTPTest.php000064400000002064147510557610022527 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
        );
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/RequestSigner.php000064400000011041147510557610022477 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Certificate.php000064400000003650147510557610022130 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;
	}
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Base64.php000064400000001667147510557610020740 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, '-_', '+/'));
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/KeyGenerator.php000064400000004504147510557610022304 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);
        }
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Logger.php000064400000003130147510557610021116 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/AbstractKeyValuable.php000064400000005333147510557610021623 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();
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/ExpiredAuthorization.php000064400000000345147510557610024050 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class ExpiredAuthorization extends AbstractException {

    public function __construct() {
        parent::__construct("Expired authorization received");
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/RateLimitReached.php000064400000000542147510557610023034 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
        );
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AuthorizationInvalid.php000064400000000172147510557610024034 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class AuthorizationInvalid extends AbstractException {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/OpenSSLException.php000064400000000564147510557610023034 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)
		);
	}
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AbstractException.php000064400000000627147510557610023314 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.php000064400000000200147510557610024371 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class DNSAuthorizationInvalid extends AuthorizationInvalid {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/HTTPAuthorizationInvalid.php000064400000000201147510557610024525 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class HTTPAuthorizationInvalid extends AuthorizationInvalid {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/StatusInvalid.php000064400000000163147510557610022457 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class StatusInvalid extends AbstractException {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/InvalidResponse.php000064400000002043147510557610022771 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/AbstractResponse.php000064400000003566147510557610023021 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.php000064400000001055147510557610025534 0ustar00<?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.php000064400000000424147510557610025733 0ustar00<?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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Get.php000064400000002116147510557610023104 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');
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Start.php000064400000000174147510557610023464 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.php000064400000001532147510557610026712 0ustar00<?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();
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetNewNonce.php000064400000000671147510557610021705 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]);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/ChangeKeys.php000064400000000237147510557610023144 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

class ChangeKeys extends AbstractResponse {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Get.php000064400000000156147510557610021642 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Get extends AbstractAccount {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Deactivate.php000064400000000166147510557610023175 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Deactivate extends AbstractLocation {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Create.php000064400000000161147510557610022322 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Create extends AbstractAccount {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Update.php000064400000000162147510557610022342 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Update extends AbstractLocation {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/GetData.php000064400000000163147510557610022432 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.php000064400000001361147510557610024356 0ustar00<?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.php000064400000000574147510557610024207 0ustar00<?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]);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/GetCertificate.php000064400000002517147510557610023467 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Create.php000064400000000155147510557610022004 0ustar00<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

class Create extends AbstractOrder {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Finalize.php000064400000000157147510557610022344 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.php000064400000000244147510557610024176 0ustar00<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

class RevokeCertificate extends AbstractResponse {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/AbstractOrder.php000064400000003357147510557610023347 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Get.php000064400000001307147510557610021320 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetDirectory.php000064400000001674147510557610022141 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'];
    }
}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/NewNonceResponse.php000064400000001673147510557610022174 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/DirectoryResponse.php000064400000003251147510557610022416 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());
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/OrderResponse.php000064400000007465147510557610021540 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());
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AccountResponse.php000064400000005041147510557610022045 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());
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AbstractKeyValuableCache.php000064400000000477147510557610023556 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();
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/RawResponse.php000064400000002323147510557610022131 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/Connector.php000064400000006776147510557610021633 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Start.php000064400000003176147510557610023323 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Get.php000064400000002530147510557610022736 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Deactivate.php000064400000001134147510557610023023 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());
    }
}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/GetData.php000064400000001066147510557610022267 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.php000064400000002644147510557610024215 0ustar00<?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;
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Get.php000064400000002357147510557610021501 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/ChangeKeys.php000064400000005513147510557610023000 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);
    }
}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Create.php000064400000002555147510557610022165 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Update.php000064400000001467147510557610022205 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());
    }
}
lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/AbstractRequest.php000064400000001013147510557610022466 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetDirectory.php000064400000001231147510557610021760 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetNewNonce.php000064400000001250147510557610021531 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Finalize.php000064400000003270147510557610022175 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.php000064400000003441147510557610024032 0ustar00<?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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Get.php000064400000002546147510557610021160 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());
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/GetCertificate.php000064400000003175147510557610023322 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Create.php000064400000003137147510557610021641 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/HTTP.php000064400000010043147510557610020640 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractDNSWriter.php000064400000000663147510557610023375 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;
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/DNS.php000064400000004566147510557610020522 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);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractAuthorizer.php000064400000012016147510557610023703 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;
    }
}

lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Order.php000064400000033573147510557610017015 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Struct/CertificateBundle.php000064400000001024147510557610022564 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.php000064400000002100147510557610024320 0ustar00<?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));
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Account.php000064400000010365147510557610017330 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;
        }
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/SingletonTrait.php000064400000000534147510557610020677 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;
    }
}lets-encrypt/vendor/fbett/le_acme2/composer.json000064400000000752147510557610016006 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": "*"
  }
}
lets-encrypt/vendor/fbett/le_acme2/LICENSE.md000064400000002014147510557610014661 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.
lets-encrypt/vendor/fbett/index.php000064400000000043147510557610013426 0ustar00<?php // You don't belong here. ?>
lets-encrypt/vendor/plesk/index.php000064400000000043147510557610013440 0ustar00<?php // You don't belong here. ?>
lets-encrypt/vendor/plesk/api-php-lib/Dockerfile000064400000000333147510557610015716 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
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Dns/Info.php000064400000001326147510557610020643 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SecretKey/Info.php000064400000001027147510557610022013 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/DetailedEvent.php000064400000001352147510557610023463 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/Event.php000064400000001025147510557610022024 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/PhpHandler/Info.php000064400000001734147510557610022147 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/HostingInfo.php000064400000001112147510557610022350 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/GeneralInfo.php000064400000001167147510557610022324 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/Info.php000064400000000622147510557610021021 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Certificate/Info.php000064400000000710147510557610022335 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'],
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/Info.php000064400000000633147510557610021775 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/GeneralInfo.php000064400000000762147510557610023276 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Locale/Info.php000064400000000757147510557610021325 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Session/Info.php000064400000001250147510557610021536 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',
        ]);
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ProtectedDirectory.php000064400000005752147510557610023360 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Ip.php000064400000001134147510557610020100 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SiteAlias.php000064400000003677147510557610021424 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/PhpHandler.php000064400000003010147510557610021550 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SecretKey.php000064400000003367147510557610021440 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Locale.php000064400000001616147510557610020734 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Certificate.php000064400000003031147510557610021750 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);
	}

}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Session.php000064400000001421147510557610021152 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/EventLog.php000064400000001774147510557610021265 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');
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Dns.php000064400000006347147510557610020267 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Server.php000064400000010122147510557610020773 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Exception.php000064400000000301147510557610017666 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
{
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client/Exception.php000064400000000301147510557610021104 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Client;
defined('ABSPATH') or die();

/**
 * Transport layer exception.
 */
class Exception extends \Exception
{
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client.php000064400000032631147510557610017161 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');
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator.php000064400000005124147510557610017533 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct.php000064400000003656147510557610017234 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)), '_');
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/XmlResponse.php000064400000000632147510557610020216 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];
    }
}
lets-encrypt/vendor/plesk/api-php-lib/src/Api/InternalClient.php000064400000000753147510557610020656 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;
    }
}
lets-encrypt/vendor/plesk/api-php-lib/wait-for-plesk.sh000064400000000274147510557610017130 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
lets-encrypt/vendor/plesk/api-php-lib/LICENSE000064400000001074147510557610014734 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.
lets-encrypt/vendor/plesk/api-php-lib/README.md000064400000004252147510557610015207 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`
lets-encrypt/vendor/plesk/api-php-lib/composer.json000064400000002046147510557610016451 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"
        }
    }
}
lets-encrypt/vendor/index.php000064400000000043147510557610012322 0ustar00<?php // You don't belong here. ?>
lets-encrypt/vendor/autoload.php000064400000000262147510557610013026 0ustar00<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4::getLoader();
lets-encrypt/composer.json000064400000000141147510557610011726 0ustar00{
    "require": {
        "fbett/le_acme2": "^1.5",
        "plesk/api-php-lib": "^1.0"
    }
}
lets-encrypt/letsencrypt.php000064400000005263147510557610012303 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;
	}

}lets-encrypt/config/notices.php000064400000016421147510557610012636 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);
lets-encrypt/config/index.php000064400000000043147510557610012272 0ustar00<?php // You don't belong here. ?>
lets-encrypt/config/class-hosts.php000064400000066614147510557610013446 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 closurelets-encrypt/config/fields.php000064400000043075147510557610012445 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;
}
lets-encrypt/cron.php000064400000002730147510557610010664 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();
	}
}




placeholders/class-placeholder.php000064400000042216147510557610013327 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;

		}

	}
}
placeholders/index.php000064400000000043147510557610011041 0ustar00<?php // You don't belong here. ?>
onboarding/class-onboarding.php000064400000045730147510557610012650 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;
	}

}onboarding/index.php000064400000000043147510557610010516 0ustar00<?php // You don't belong here. ?>
index.php000064400000000043147510557610006374 0ustar00<?php // You don't belong here. ?>
security.md000064400000001256147510557610006754 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.force-deactivate.txt000064400000007435147510557610010536 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>
compatibility.php000064400000004221147510557610010140 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();
			}
		}

	}
}class-cache.php000064400000006344147510557610007445 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
}
languages/really-simple-ssl-nl_NL.l10n.php000064400000465140147510557610014377 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']];
languages/really-simple-ssl.pot000064400000742347147510557610012650 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 ""
languages/index.php000064400000000042147510557610010341 0ustar00<?php //You don't belong here. ?>
modal/webpack.config.js000064400000000413147510557610011067 0ustar00const defaultConfig = require("@wordpress/scripts/config/webpack.config");

module.exports = {
    ...defaultConfig,
    output: {
        ...defaultConfig.output,
        filename: '[name].[contenthash].js',
        chunkFilename: '[name].[contenthash].js',
    }
};modal/modal.php000064400000003221147510557610007456 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');modal/build/161.a06823712424bb0f8054.js000064400000107460147510557610012210 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"})}))}}]);modal/build/433.css000064400000010310147510557610007770 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)}
modal/build/433.7705e088a625e85f6d3d.js000064400000006620147510557610012402 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"}}]);modal/build/index.d6b3038dea3995c8535e.asset.php000064400000000205147510557610014536 0ustar00<?php return array('dependencies' => array('react', 'wp-components', 'wp-element', 'wp-i18n'), 'version' => 'd6b3038dea3995c8535e');
modal/build/index.d6b3038dea3995c8535e.js000064400000015014147510557610013251 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))}))})()})();modal/build/291.26a9269d87fda5210dac.js000064400000073265147510557610012537 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}))}}}]);modal/src/index.js000064400000000736147510557610010115 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 );
        }
    }
});modal/src/components/DeactivationModal/DeactivationModal.js000064400000011375147510557610020152 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;modal/src/components/Modal/RssslModal.scss000064400000005531147510557610014647 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;
      }
    }
  }
}

modal/src/components/Modal/RssslModal.js000064400000010734147510557610014311 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;class-site-health.php000064400000027110147510557610010603 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;
		}
	}
}
class-installer.php000064400000010633147510557610010373 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;
		}
	}

}
class-multisite.php000064400000051575147510557610010427 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
}
class-certificate.php000064400000016615147510557610010666 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
	}
}
rlrsssl-really-simple-ssl.php000064400000022130147510557610012346 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();
	}
}rsssl-auto-loader.php000064400000003605147510557610010654 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;
        }
    }
);
class-admin.php000064400000303435147510557610007473 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;
	}
}class-mixed-content-fixer.php000064400000013061147510557610012265 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]);
        }

    }
}

progress/index.php000064400000000043147510557610010240 0ustar00<?php // You don't belong here. ?>
progress/class-progress.php000064400000010075147510557610012106 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(),
		];
	}
}class-wp-cli.php000064400000003517147510557610007574 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';
}
security/index.php000064400000000040147510557610010240 0ustar00<?php // You don't belong here.
security/cron.php000064400000007707147510557610010113 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' ) );
}


security/hardening.php000064400000004324147510557610011101 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;
	}
}
security/functions.php000064400000043140147510557610011151 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;
}security/server/index.php000064400000000040147510557610011546 0ustar00<?php // You don't belong here.
security/server/disable-indexing.php000064400000001052147510557610013651 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.
 */
security/wordpress/vulnerabilities/FileStorage.php000064400000005704147510557610016602 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);
            }
        }
    }
}security/wordpress/vulnerabilities/class-rsssl-file-storage.php000064400000010614147510557610021222 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 );
			}
		}
	}
}security/wordpress/vulnerabilities/class-rsssl-folder-name.php000064400000003206147510557610021031 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;
	}
}security/wordpress/two-fa/class-rsssl-two-factor-on-board-api.php000064400000044126147510557610021175 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;
    }
}
security/wordpress/two-fa/function-login-header.php000064400000017026147510557610016553 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
}security/wordpress/two-fa/class-rsssl-two-factor-admin.php000064400000053721147510557610020016 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);
    }
}
security/wordpress/two-fa/traits/trait-rsssl-email-trait.php000064400000012724147510557610020375 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;
	}
}
security/wordpress/two-fa/traits/trait-rsssl-two-fa-helper.php000064400000002617147510557610020637 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 );
	}
}
security/wordpress/two-fa/class-rsssl-parameter-validation.php000064400000012073147510557610020746 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);
    }
}
security/wordpress/two-fa/class-rsssl-request-parameters.php000064400000003761147510557610020473 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);
        }
	}
}
security/wordpress/two-fa/class-rsssl-two-factor-totp.php000064400000076257147510557610017725 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 );
    }
}
security/wordpress/two-fa/interface-rsssl-two-factor-provider-interface.php000064400000001672147510557610023347 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;
}
security/wordpress/two-fa/class-rsssl-two-fa-authentication.php000064400000006342147510557610021052 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' );
	}
}
security/wordpress/two-fa/class-rsssl-two-fa-status.php000064400000007566147510557610017367 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;
	}
}
security/wordpress/two-fa/class-rsssl-two-fa-data-parameters.php000064400000005622147510557610021105 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';
	}
}
security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php000064400000030345147510557610021263 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;
	}
}
security/wordpress/two-fa/class-rsssl-two-factor.php000064400000211147147510557610016726 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);
    }
);
security/wordpress/two-fa/class-rsssl-two-factor-compat.php000064400000002605147510557610020204 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' ) );
	}
}
security/wordpress/two-fa/assets/css/two-fa.scss000064400000000102147510557610016030 0ustar00@import "profile-settings.scss";
@import "two-fa-onboarding.scss";security/wordpress/two-fa/assets/css/profile-settings.scss000064400000002014147510557610020135 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;
  }
}security/wordpress/two-fa/assets/css/two-fa-onboarding.scss000064400000003043147510557610020157 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 */
}security/wordpress/two-fa/assets/js/onboarding.js000064400000017036147510557610016260 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);
        }
    }
}security/wordpress/two-fa/assets/js/BaseAuth.js000064400000010210147510557610015615 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);
        });
    }

}security/wordpress/two-fa/assets/js/initialize_two_fa.js000064400000005050147510557610017627 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();
    }
}security/wordpress/two-fa/assets/js/profile.js000064400000014171147510557610015573 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();
                }
            });
        }
    }
}security/wordpress/two-fa/class-rsssl-provider-loader.php000064400000011077147510557610017737 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;
	}
}
security/wordpress/two-fa/class-rsssl-two-factor-provider.php000064400000006766147510557610020567 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 );
	}
}
security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php000064400000040366147510557610022225 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;
        }
    }
}
security/wordpress/two-fa/function-login-footer.php000064400000003560147510557610016617 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
}security/wordpress/two-fa/class-rsssl-two-factor-settings.php000064400000055537147510557610020575 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();
security/wordpress/two-fa/class-rsssl-two-factor-email.php000064400000042760147510557610020016 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 );
	}
}security/wordpress/two-fa/class-rsssl-two-factor-reset-factory.php000064400000006116147510557610021511 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;
        }
    }
}security/wordpress/user-registration.php000064400000000371147510557610014656 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 );security/wordpress/rename-admin-user.php000064400000016442147510557610014507 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;
}

security/wordpress/block-code-execution-uploads.php000064400000004417147510557610016645 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;
}

security/wordpress/class-rsssl-simple-404-interceptor.php000064400000010525147510557610017573 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();security/wordpress/user-enumeration.php000064400000002522147510557610014472 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
);security/wordpress/disable-xmlrpc.php000064400000000605147510557610014076 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;






security/wordpress/index.php000064400000000043147510557610012273 0ustar00<?php // You don't belong here. ?>
security/wordpress/hide-wp-version.php000064400000005205147510557610014211 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();security/wordpress/prevent-login-info-leakage.php000064400000001747147510557610016311 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' );
security/wordpress/display-name-is-login-name.php000064400000003046147510557610016212 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' );security/wordpress/vulnerabilities.php000064400000174516147510557610014406 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 */
security/wordpress/file-editing.php000064400000002230147510557610013524 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;
}security/wordpress/rest-api.php000064400000003263147510557610012717 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 );security/notices.php000064400000014036147510557610010607 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');
security/security.php000064400000003203147510557610011004 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);security/sync-settings.php000064400000005454147510557610011761 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);
security/tests/index.php000064400000000043147510557610011405 0ustar00<?php // You don't belong here. ?>
security/tests/code-execution.php000064400000000233147510557610013212 0ustar00<?php
/**
 * Test file for Really Simple Security to check if uploads directory has code execution permissions
 *
 */

echo "RSSSL CODE EXECUTION MARKER";
security/tests.php000064400000032610147510557610010303 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;
}security/deactivate-integration.php000064400000003113147510557610013567 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 );
	}
}security/integrations.php000064400000011204147510557610011643 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', [] ) );
	}
}security/firewall-manager.php000064400000057041147510557610012363 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 );
	}

}uninstall.php000064400000013566147510557610007314 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);
	}
}
upgrade/index.php000064400000000040147510557610010020 0ustar00<?php // You don't belong here.
upgrade/img/complianz-gdpr.png000064400000010744147510557610012424 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`�upgrade/img/burst.png000064400000012212147510557610010625 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`�upgrade/img/really-simple-ssl.png000064400000027727147510557610013065 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`�upgrade/upgrade-to-pro.js000064400000007771147510557610011425 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);upgrade/upgrade-to-pro.css.map000064400000005050147510557610012341 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"}upgrade/ajax.js000064400000002410147510557610007464 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)
};
upgrade/upgrade-to-pro.php000064400000063544147510557610011600 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();
}
upgrade/upgrade-to-pro.css000064400000014420147510557610011566 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 */upgrade/upgrade-to-pro.less000064400000005550147510557610011750 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;
    }

  }

}









upgrade/upgrade-to-pro.min.css000064400000012720147510557610012351 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}upgrade/upgrade-to-pro.min.js000064400000006611147510557610012177 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);upgrade/ajax.min.js000064400000001611147510557610010250 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)};ssl-test-page.php000064400000003636147510557610007770 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>
lib/admin/class-encryption.php000064400000007110147510557610012422 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' );

	}
}
lib/admin/class-helper.php000064400000003077147510557610011517 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 );
		}
	}

}
system-status.php000064400000042206147510557610010141 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 );
}
readme.txt000064400000067227147510557610006573 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.settings/config/menu.php000064400000125237147510557610011353 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;
}


settings/config/index.php000064400000000043147510557610011501 0ustar00<?php // You don't belong here. ?>
settings/config/disable-fields-filter.php000064400000005537147510557610014541 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")
			),
	];
}
settings/config/fields/hardening-extended.php000064400000016175147510557610015412 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 );
settings/config/fields/access-control.php000064400000007250147510557610014566 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 );
settings/config/fields/encryption.php000064400000011165147510557610014041 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 );
settings/config/fields/vulnerability-detection.php000064400000020370147510557610016512 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 );
settings/config/fields/firewall.php000064400000022310147510557610013446 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 );
settings/config/fields/general.php000064400000015507147510557610013270 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 );
settings/config/fields/two-fa.php000064400000011426147510557610013044 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 );
settings/config/fields/limit-login-attempts.php000064400000025036147510557610015734 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 );
settings/config/fields/hibp-integration.php000064400000001227147510557610015110 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 );settings/config/fields/hardening-basic.php000064400000013467147510557610014674 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 );
settings/config/fields/hardening-xml.php000064400000004505147510557610014404 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 );
settings/config/fields/hardening-file-change-detection.php000064400000006033147510557610017720 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 );
settings/config/fields/security-headers.php000064400000033315147510557610015130 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 );

settings/config/fields/letsencrypt.php000064400000000772147510557610014225 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 );
settings/config/mails.php000064400000000233147510557610011500 0ustar00<?php
defined('ABSPATH') or die();

/**
 * @param $fields
 *
 * @return mixed
 */
function rsssl_mails(){
	return apply_filters('rsssl_mails', [

	]);
}


settings/config/config.php000064400000003105147510557610011641 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 );
}settings/webpack.config.js000064400000001175147510557610011641 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',
            },
        ],
    },
};settings/index.php000064400000000043147510557610010234 0ustar00<?php // You don't belong here. ?>
settings/src/Header.js000064400000005723147510557610010743 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 Headersettings/src/Page.js000064400000013442147510557610010424 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 Pagesettings/src/Modal/ModalControl.js000064400000000732147510557610013177 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 ModalControlsettings/src/Modal/Modal.js000064400000006357147510557610011647 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;settings/src/Modal/ModalData.js000064400000001441147510557610012426 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;
settings/src/utils/autoCompleteTheme.js000064400000002235147510557610014332 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;settings/src/utils/Icon.js000064400000110310147510557610011570 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;settings/src/utils/getAnchor.js000064400000002576147510557610012630 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;
settings/src/utils/AddUrlRef.js000064400000000466147510557610012522 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;
}settings/src/utils/Flag/Flag.js000064400000000446147510557610012432 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;settings/src/utils/Error.js000064400000005004147510557610011774 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 Errorsettings/src/utils/api.js000064400000012472147510557610011463 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);
}
settings/src/utils/formatting.js000064400000003454147510557610013064 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)
    }
  }
}settings/src/utils/lib.js000064400000000577147510557610011463 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;
}

settings/src/utils/ErrorBoundary.js000064400000002352147510557610013503 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;settings/src/utils/sleeper.js000064400000000410147510557610012336 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;settings/src/utils/Hyperlink.js000064400000001634147510557610012655 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;settings/src/index.php000064400000000043147510557610011023 0ustar00<?php // You don't belong here. ?>
settings/src/Dashboard/Progress/ProgressBlock.js000064400000007675147510557610016035 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>
  );
};settings/src/Dashboard/Progress/ProgressData.js000064400000002610147510557610015634 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;

settings/src/Dashboard/Progress/ProgressBlockHeader.js000064400000003603147510557610017131 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;
settings/src/Dashboard/Progress/ProgressFooter.js000064400000006763147510557610016236 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;
settings/src/Dashboard/SslLabs/SslLabs.js000064400000030135147510557610014343 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;settings/src/Dashboard/SslLabs/SslLabsHeader.js000064400000000652147510557610015455 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;settings/src/Dashboard/SslLabs/SslLabsFooter.js000064400000001204147510557610015515 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;settings/src/Dashboard/SslLabs/SslLabsData.js000064400000015444147510557610015143 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;







settings/src/Dashboard/DashboardPage.js000064400000004621147510557610014122 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 DashboardPagesettings/src/Dashboard/GridBlock.js000064400000002171147510557610013274 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;settings/src/Dashboard/OtherPlugins/OtherPluginsHeader.js000064400000001136147510557620017614 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;settings/src/Dashboard/OtherPlugins/OtherPlugins.js000064400000003460147510557620016505 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;
settings/src/Dashboard/OtherPlugins/OtherPluginsData.js000064400000005416147510557620017302 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];
}

settings/src/Dashboard/TaskElement.js000064400000007344147510557620013660 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;settings/src/Dashboard/Vulnerabilities/VulnerabilitiesHeader.js000064400000001443147510557620021051 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;settings/src/Dashboard/Vulnerabilities/VulnerabilitiesFooter.js000064400000002002147510557620021107 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;
settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js000064400000030262147510557620017741 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;
settings/src/Dashboard/TipsTricks/TipsTricks.js000064400000004300147510557620015627 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 TipsTrickssettings/src/Dashboard/TipsTricks/TipsTricksFooter.js000064400000000634147510557620017014 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 TipsTricksFootersettings/src/Onboarding/Onboarding.js000064400000007464147510557620013724 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;settings/src/Onboarding/Steps/StepEmail.js000064400000002607147510557620014615 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)settings/src/Onboarding/Steps/StepLicense.js000064400000002011147510557620015135 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);settings/src/Onboarding/Steps/StepPro.js000064400000002140147510557620014316 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);settings/src/Onboarding/Steps/StepFeatures.js000064400000002261147510557620015340 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)settings/src/Onboarding/Steps/StepPlugins.js000064400000001571147510557620015206 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);settings/src/Onboarding/Steps/StepConfig.js000064400000002362147510557620014771 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);
settings/src/Onboarding/OnboardingModal.js000064400000004434147510557620014673 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;settings/src/Onboarding/Items/ListItem.js000064400000003745147510557620014453 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)settings/src/Onboarding/Items/PremiumItem.js000064400000000454147510557620015150 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)settings/src/Onboarding/Items/CheckboxItem.js000064400000001367147510557620015264 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)settings/src/Onboarding/checkbox.scss000064400000003050147510557620013752 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;
    }
  }
}
settings/src/Onboarding/OnboardingData.js000064400000023171147510557620014507 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;settings/src/Onboarding/PremiumItem.scss000064400000000200147510557620014413 0ustar00.rsssl-modal-premium-container {
  background-color: var(--rsp-dark-blue);
  color:#fff;
  padding:0 5px;
  margin-right:22px;
}settings/src/Onboarding/OnboardingControls.js000064400000021471147510557620015442 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;settings/src/Onboarding/onboarding.scss000064400000002047147510557620014313 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;
        }
      }
    }

}settings/src/Settings/FieldsData.js000064400000036466147510557620013364 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;
}
settings/src/Settings/PremiumOverlay.js000064400000003647147510557620014337 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;settings/src/Settings/SettingsGroup.js000064400000020113147510557620014157 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
settings/src/Settings/Password.js000064400000001761147510557620013154 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;settings/src/Settings/RolesDropDown.js000064400000007153147510557620014114 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;settings/src/Settings/DataTable/Buttons/ControlButton.js000064400000001414147510557620017440 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;settings/src/Settings/DataTable/Buttons/Buttons.scss000064400000000776147510557620016633 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;
    }
  }
}settings/src/Settings/DataTable/Buttons/MultiSelectButton.js000064400000001461147510557620020254 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)settings/src/Settings/DataTable/Buttons/RowButton.js000064400000001330147510557620016564 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);settings/src/Settings/DataTable/SelectedRowsControl/SelectedRowsControl.js000064400000003121147510557620023073 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);
settings/src/Settings/DataTable/SelectedRowsControl/SelectedRowsControl.scss000064400000000505147510557620023435 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);
  }
}settings/src/Settings/DataTable/DataTable.scss000064400000002056147510557620015351 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;
  }

}

settings/src/Settings/DataTable/DataTableStore.js000064400000006523147510557620016032 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;settings/src/Settings/DataTable/SearchBar/SearchBar.scss000064400000001136147510557620017212 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 */
}settings/src/Settings/DataTable/SearchBar/SearchBar.js000064400000001701147510557620016651 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);settings/src/Settings/DataTable/Checkboxes.scss000064400000001432147510557620015603 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;
  }
}settings/src/Settings/DataTable/DataTableWrapper.js000064400000016213147510557620016353 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);settings/src/Settings/DynamicDataTable/SearchBar.js000064400000001573147510557620016333 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;settings/src/Settings/DynamicDataTable/DynamicDataTable.js000064400000014302147510557620017621 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;
settings/src/Settings/DynamicDataTable/DynamicDataTableStore.js000064400000004661147510557620020645 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;settings/src/Settings/DynamicDataTable/AddButton.js000064400000001471147510557620016362 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;settings/src/Settings/PermissionsPolicy.js000064400000017636147510557620015055 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 PermissionsPolicysettings/src/Settings/Button.js000064400000002757147510557620012633 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 Buttonsettings/src/Settings/RiskConfiguration/datatable.scss000064400000000317147510557620017266 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;
    }

}settings/src/Settings/RiskConfiguration/NotificationTester.js000064400000011260147510557620020622 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 NotificationTestersettings/src/Settings/RiskConfiguration/modal.scss000064400000000113147510557620016433 0ustar00.rsssl-modal.rsssl-vulnerabilities-modal{
  ul {
    column-count: 1;
  }
}settings/src/Settings/RiskConfiguration/RunnerData.js000064400000003216147510557620017052 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;settings/src/Settings/RiskConfiguration/RiskData.js000064400000017613147510557620016517 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;
settings/src/Settings/RiskConfiguration/VulnerabilitiesOverview.js000064400000014230147510557620021675 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;
settings/src/Settings/RiskConfiguration/RiskComponent.js000064400000007373147510557620017612 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;
settings/src/Settings/SelectControl.js000064400000002616147510557620014132 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 SelectControlsettings/src/Settings/Support.js000064400000003627147510557620013031 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;settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js000064400000026462147510557620020630 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;settings/src/Settings/LimitLoginAttempts/IpAddressInput.js000064400000002443147510557620020037 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;settings/src/Settings/LimitLoginAttempts/IpAddressDataTableStore.js000064400000033432147510557620021600 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;settings/src/Settings/LimitLoginAttempts/UserDataTableStore.js000064400000013324147510557620020636 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;settings/src/Settings/LimitLoginAttempts/Cidr.js000064400000004273147510557620016025 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;
settings/src/Settings/LimitLoginAttempts/AddUserModal.js000064400000007323147510557620017447 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;settings/src/Settings/LimitLoginAttempts/LimitLoginAttemptsData.js000064400000001262147510557620021522 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;settings/src/Settings/LimitLoginAttempts/AddIpAddressModal.js000064400000010504147510557620020402 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;settings/src/Settings/LimitLoginAttempts/UserDatatable.js000064400000024273147510557620017666 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;


settings/src/Settings/LimitLoginAttempts/CountryDatatable.js000064400000042452147510557620020412 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;
settings/src/Settings/LimitLoginAttempts/CountryDataTableStore.js000064400000017174147510557620021372 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;settings/src/Settings/TwoFA/RolesStore.js000064400000002501147510557620014424 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;

settings/src/Settings/TwoFA/TwoFaRolesDropDown.js000064400000012672147510557620016037 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;
settings/src/Settings/TwoFA/TwoFaEnabledDropDown.js000064400000011703147510557620016277 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;
settings/src/Settings/TwoFA/TwoFaDataTableStore.js000064400000011232147510557620016123 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;settings/src/Settings/TwoFA/TwoFaDataTable.js000064400000030333147510557620015111 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;settings/src/Settings/TwoFA/select.scss000064400000000052147510557620014140 0ustar00div[class$="MenuPortal"] {
  z-index:30;
}settings/src/Settings/CheckboxControl.js000064400000005420147510557620014435 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 CheckboxControlsettings/src/Settings/Host/HostData.js000064400000001337147510557620013775 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;

settings/src/Settings/Host/Host.js000064400000004057147510557620013205 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);
settings/src/Settings/Settings.js000064400000016416147510557620013155 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>
  );
};
settings/src/Settings/FilterData.js000064400000001116147510557620013363 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;
settings/src/Settings/GeoBlockList/AddButton.js000064400000001305147510557620015551 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;settings/src/Settings/GeoBlockList/GeoDatatable.js000064400000047537147510557620016222 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;
settings/src/Settings/GeoBlockList/TrustIpAddressModal.js000064400000012667147510557620017577 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;settings/src/Settings/GeoBlockList/WhiteListTableStore.js000064400000016445147510557620017601 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;settings/src/Settings/GeoBlockList/GeoDataTableStore.js000064400000027266147510557620017174 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;settings/src/Settings/GeoBlockList/WhiteListDatatable.js000064400000035662147510557620017420 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;settings/src/Settings/GeoBlockList/BlockListDatatable.js000064400000031701147510557620017360 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;settings/src/Settings/FileChangeDetection/FileChangeDetection.js000064400000003011147510557620021010 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;settings/src/Settings/LearningMode/LearningMode.js000064400000041366147510557620016267 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
settings/src/Settings/LearningMode/Delete.js000064400000001752147510557620015120 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 Deletesettings/src/Settings/LearningMode/LearningModeData.js000064400000005577147510557620017065 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;


settings/src/Settings/LearningMode/ChangeStatus.js000064400000001131147510557620016276 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 ChangeStatussettings/src/Settings/MixedContentScan/MixedContentData.js000064400000006253147510557620017754 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;
    })
}

settings/src/Settings/MixedContentScan/MixedContentScan.js000064400000023775147510557620017777 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;
settings/src/Settings/Captcha/CaptchaData.js000064400000002725147510557620015053 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;settings/src/Settings/Captcha/ReCaptcha.js000064400000004276147510557620014553 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;settings/src/Settings/Captcha/CaptchaKey.js000064400000002422147510557620014724 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;settings/src/Settings/Captcha/HCaptcha.js000064400000002470147510557620014366 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;settings/src/Settings/Captcha/Captcha.js000064400000007041147510557620014255 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;settings/src/Settings/PostDropDown.js000064400000005561147510557620013756 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;
settings/src/Settings/Notices.js000064400000001416147510557620012753 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;settings/src/Settings/EventLog/EventLogDataTable.js000064400000020564147510557620016364 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],
    };
}

settings/src/Settings/EventLog/EventLogDataTableStore.js000064400000005446147510557620017403 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;settings/src/Settings/AutoComplete/AutoCompleteControl.js000064400000004226147510557620017714 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 AutoCompleteControlsettings/src/Settings/AutoComplete/AutoComplete.scss000064400000001420147510557620016703 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;
    }
  }
}settings/src/Settings/Help.js000064400000002751147510557620012242 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 Helpsettings/src/Settings/firewall/UserAgentModal.js000064400000013356147510557620016034 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;settings/src/Settings/firewall/UserAgentStore.js000064400000003764147510557620016076 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;settings/src/Settings/firewall/UserAgentTable.js000064400000023640147510557620016024 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;settings/src/Settings/Field.js000064400000050334147510557620012375 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;settings/src/Settings/License/LicenseData.js000064400000003154147510557620015106 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;settings/src/Settings/License/License.js000064400000004521147510557620014313 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;settings/src/Menu/Menu.js000064400000001676147510557620011367 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;
settings/src/Menu/MenuData.js000064400000023532147510557620012154 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;
}settings/src/Menu/MenuItem.js000064400000006161147510557620012200 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;
};
settings/src/LetsEncrypt/DnsVerification.js000064400000007372147510557620015121 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;settings/src/LetsEncrypt/Activate.js000064400000000330147510557620013555 0ustar00import Onboarding from "../Onboarding/Onboarding";

const Activate = () => {
    return (
        <div className="rsssl-lets-encrypt-tests">
            <Onboarding/>
         </div>
    )
}

export default Activate;settings/src/LetsEncrypt/Directories.js000064400000020403147510557620014274 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;settings/src/LetsEncrypt/Installation.js000064400000012051147510557620014461 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;settings/src/LetsEncrypt/LetsEncrypt.js000064400000026405147510557620014304 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;settings/src/LetsEncrypt/Generation.js000064400000004217147510557620014120 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;settings/src/LetsEncrypt/letsEncryptData.js000064400000004410147510557620015126 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;

settings/src/Placeholder/PagePlaceholder.js000064400000001753147510557620015014 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;

settings/src/Placeholder/MenuPlaceholder.js000064400000000553147510557620015041 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;settings/src/Placeholder/Placeholder.js000064400000000704147510557620014212 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;settings/src/Placeholder/DashboardPlaceholder.js000064400000000635147510557620016025 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;

settings/src/Placeholder/DatatablePlaceholder.js000064400000000554147510557620016017 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;settings/src/Placeholder/SettingsPlaceholder.js000064400000001065147510557620015734 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;
settings/src/index.js000064400000001324147510557620010654 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);
    }
});

settings/build/439.bfb64c5def4e403805bc.js000064400000077257147510557620013451 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}))}}}]);settings/build/814.css000064400000023031147510557620010544 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)}
settings/build/928.css000064400000023523147510557620010560 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}
settings/build/778.60eedd33628297ab6b97.js000064400000122272147510557620013241 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)))}}}]);settings/build/519.cd578c0795e645866066.js000064400000112702147510557620013023 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"})}))}}]);settings/build/838.c841004b517cdf3abd86.js000064400000051311147510557620013266 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}()}()}}]);settings/build/928.a4828756026ad32cf7bc.js000064400002474356147510557620013242 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"}}}}})}}]);settings/build/483.426b909c845c79e7eec5.js000064400000005312147510557620013237 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}}}]);settings/build/129.cebe3ab8c4a7c3479015.js000064400000415244147510557620013354 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}}]);settings/build/573.d6decd01a88d3b0dcf3b.js000064400000771713147510557620013600 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}}}}]);settings/build/43.3e98c0eeb2e262efa304.js000064400000202376147510557620013267 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}))}}}]);settings/build/index.dc0e12538832ff741b9e.asset.php000064400000000273147510557620015301 0ustar00<?php return array('dependencies' => array('react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices'), 'version' => 'dc0e12538832ff741b9e');
settings/build/814.bf34d42ff1e29e8eb70d.js000064400000157623147510557620013452 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"}}}}})}}]);settings/build/index.dc0e12538832ff741b9e.js000064400000162051147510557620014013 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))}))})()})();settings/settings.php000064400000076523147510557620011006 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 );class-server.php000064400000010632147510557620007704 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
}
functions.php000064400000022115147510557620007302 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();
}class-front-end.php000064400000004054147510557620010273 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;
			}
		}
	}
}
© 2025 GrazzMean