Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : May 4, 2026

CVE-2024-13362: Freemius <= 2.10.1 – Reflected DOM-Based Cross-Site Scripting via url Parameter (b-blocks)

Plugin b-blocks
Severity Medium (CVSS 6.1)
CWE 79
Vulnerable Version 1.9.8
Patched Version 2.0.19
Disclosed April 29, 2026

Analysis Overview

Atomic Edge analysis of CVE-2024-13362:

This is a Reflected DOM-Based Cross-Site Scripting (XSS) vulnerability in the Freemius SDK, affecting versions up to 2.10.1. The vulnerability allows unauthenticated attackers to inject arbitrary web scripts via the `url` parameter. The attack executes if a user clicks on a crafted link. The CVSS score is 6.1 (Medium).

The root cause is insufficient input sanitization and output escaping of the `url` parameter in the Freemius SDK’s JavaScript handling. The vulnerability resides in how the SDK processes the `url` parameter for redirect actions. The Freemius SDK is bundled with thousands of plugins and themes, making this a widespread issue. The vulnerable code path involves the `_redirect()` function or similar URL handling logic within the JavaScript assets that process the `url` parameter from the query string. The diff shows changes to build assets, but the actual vulnerability is in the JavaScript source files that were rebuilt.

An attacker exploits this by crafting a malicious URL that includes the `url` parameter containing JavaScript payload. The attack vector is reflected XSS: the victim must click a crafted link or visit a page with the malicious query parameter. For example: `?url=javascript:alert(document.cookie)` or a more complex payload using `data:` URIs or `vbscript:` schemes. The Freemius SDK reads this parameter and uses it in a DOM context without proper sanitization, allowing script execution.

The patch addresses the vulnerability by improving output escaping in the Freemius SDK. The diff shows version bumps and dependency changes across multiple asset files, indicating a rebuild of the JavaScript bundles. The actual fix involved sanitizing the `url` parameter before it is used in DOM manipulation, likely by adding URL validation or using safer APIs like `encodeURI()` or URL parsing with proper validation. The before state had no sanitization of the `url` parameter; the after state implements proper escaping or validation.

Exploitation allows an attacker to execute arbitrary JavaScript in the victim’s browser within the context of the WordPress admin or frontend. This can lead to session hijacking, credential theft, defacement, or redirection to malicious sites. Since the Freemius SDK is present in thousands of WordPress plugins and themes, the potential impact is widespread. Unauthenticated attackers can target any user who has the Freemius-powered plugin or theme active.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/b-blocks/build/admin-dashboard.asset.php
+++ b/b-blocks/build/admin-dashboard.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-i18n'), 'version' => '900725536788a14f1f2f');
--- a/b-blocks/build/admin-help.asset.php
+++ b/b-blocks/build/admin-help.asset.php
@@ -1 +0,0 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'f01e420d93515e5f76aa');
--- a/b-blocks/build/advanced-image/render.php
+++ b/b-blocks/build/advanced-image/render.php
@@ -0,0 +1,12 @@
+<?php
+$id = wp_unique_id( 'bBlocksAdvancedImage-' );
+extract( $attributes );
+
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+	data-featured_image_url='<?php echo esc_attr( has_post_thumbnail() ? get_the_post_thumbnail_url( get_the_ID(), $layout['size'] ?? 'full' ) : '' ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/advanced-image/view.asset.php
+++ b/b-blocks/build/advanced-image/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'd11ce115da2f7c56db5d');
--- a/b-blocks/build/advanced.asset.php
+++ b/b-blocks/build/advanced.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array(), 'version' => '4bd1a0d451bb9442fd5b');
+<?php return array('dependencies' => array('react'), 'version' => '00a33456596ffef68727');
--- a/b-blocks/build/alert/render.php
+++ b/b-blocks/build/alert/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksAlert-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/alert/view.asset.php
+++ b/b-blocks/build/alert/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '444f966857a621a286d9');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '0aa3a016acc0f9b9fdfd');
--- a/b-blocks/build/animated-text/render.php
+++ b/b-blocks/build/animated-text/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksAnimatedText-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/animated-text/view.asset.php
+++ b/b-blocks/build/animated-text/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'cbcdcc2a8336feae1ef1');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'aa64903080dc9b1dbecb');
--- a/b-blocks/build/b-blocks-ai/content-generate-ai.asset.php
+++ b/b-blocks/build/b-blocks-ai/content-generate-ai.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-i18n'), 'version' => 'f56e98d05d845778376f');
--- a/b-blocks/build/button-group/render.php
+++ b/b-blocks/build/button-group/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksButtonGroup-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/button-group/view.asset.php
+++ b/b-blocks/build/button-group/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '1c8b935874eb831bce69');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '91eb135e3402bfcb08aa');
--- a/b-blocks/build/button/render.php
+++ b/b-blocks/build/button/render.php
@@ -14,10 +14,11 @@
 } // Convert the blocks to dom elements
 ?>
 <div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
 	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
 	id='<?php echo esc_attr( $id ); ?>'
-	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
 	data-nonce='<?php echo esc_attr( wp_json_encode( wp_create_nonce( 'wp_ajax' ) ) ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
 	data-info='<?php echo esc_attr( wp_json_encode( [
 		'currentPostId' => get_the_ID(),
 		'userRoles' => is_user_logged_in() ? wp_get_current_user()->roles : [],
--- a/b-blocks/build/button/view.asset.php
+++ b/b-blocks/build/button/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '7486d8a452b32d299b9b');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '3a62fd69e92f67157b81');
--- a/b-blocks/build/cards/render.php
+++ b/b-blocks/build/cards/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksCards-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/cards/view.asset.php
+++ b/b-blocks/build/cards/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '4331818106eda64029a2');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'b304fdcb7bf6c0985f51');
--- a/b-blocks/build/chart/render.php
+++ b/b-blocks/build/chart/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksChart-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/chart/view.asset.php
+++ b/b-blocks/build/chart/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'f5e55d737b3e6620ef0c');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'c2ea9d3c3fbd11fb72a0');
--- a/b-blocks/build/column/render.php
+++ b/b-blocks/build/column/render.php
@@ -6,8 +6,14 @@
 $planClass = Utils::isPro() ? 'pro' : 'free';

 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'>
-	<div class='<?php echo esc_attr( $prefix ); ?>Style'></div>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+	data-columns='<?php echo esc_attr( $block->context['b-blocks/rowColumns'] ); ?>'
+	data-column-gap='<?php echo esc_attr( $block->context['b-blocks/rowColumnGap'] ); ?>'
+>

 	<div class='<?php echo esc_attr( $prefix ); ?>'>
 		<?php echo wp_kses( $content, Utils::allowedInnerHTML() ); ?>
--- a/b-blocks/build/column/view.asset.php
+++ b/b-blocks/build/column/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'd1ceb407af327f616ebb');
+<?php return array('dependencies' => array('react'), 'version' => 'b7c2c2845c51bb692351');
--- a/b-blocks/build/container/render.php
+++ b/b-blocks/build/container/render.php
@@ -14,8 +14,10 @@
 $cSl = "$mainSl .$prefix" . "Content";

 $bBlocksContainerCSS = "
-	$mainSl{
+	#$id{
 		min-height: " . Utils::valForZero( $wrapper['minHeight'] ) . ";
+	}
+	$mainSl{
 		align-items: $horizontalAlign;
 		justify-content: $verticalAlign;
 	}
@@ -37,7 +39,10 @@

 ?>

-<div <?php echo get_block_wrapper_attributes(); ?> id='<?php echo esc_attr( $id ) ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>' data-bblocks-advanced='<?php echo esc_attr( wp_json_encode( $attributes['advanced'] ) ); ?>'>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?> id='<?php echo esc_attr( $id ) ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>' data-bblocks-advanced='<?php echo esc_attr( wp_json_encode( $attributes['advanced'] ) ); ?>'
+>
 	<style><?php echo esc_html( $bBlocksContainerCSS ); ?></style>

 	<div class='<?php echo esc_attr( $prefix ) ?>'>
--- a/b-blocks/build/container/view.asset.php
+++ b/b-blocks/build/container/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '12d12180bf3f83a96d29');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '8e534ffd06df862ef472');
--- a/b-blocks/build/content-ticker/render.php
+++ b/b-blocks/build/content-ticker/render.php
@@ -0,0 +1,11 @@
+<?php
+$id = wp_unique_id('bBlocksContentTicker-' );
+$planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
--- a/b-blocks/build/content-ticker/view.asset.php
+++ b/b-blocks/build/content-ticker/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'd719d418760e6ab93c34');
--- a/b-blocks/build/countdown/render.php
+++ b/b-blocks/build/countdown/render.php
@@ -3,6 +3,7 @@
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
 <div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
 	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
 	id='<?php echo esc_attr( $id ); ?>'
 	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
--- a/b-blocks/build/countdown/view.asset.php
+++ b/b-blocks/build/countdown/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'da76d9d70c90f610b933');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '2fde84be3f62065da64a');
--- a/b-blocks/build/counters/render.php
+++ b/b-blocks/build/counters/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksCounters-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/counters/view.asset.php
+++ b/b-blocks/build/counters/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '45744aa9d9200c28896a');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '1e77d722a429b7c0195c');
--- a/b-blocks/build/cursor/cursor.asset.php
+++ b/b-blocks/build/cursor/cursor.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'e0814487a8d622814d47');
--- a/b-blocks/build/cursor/settings.asset.php
+++ b/b-blocks/build/cursor/settings.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-editor', 'wp-i18n', 'wp-plugins'), 'version' => '1d8faa2fdbb1136f22f1');
--- a/b-blocks/build/data-table/render.php
+++ b/b-blocks/build/data-table/render.php
@@ -0,0 +1,9 @@
+<?php
+$id = wp_unique_id( 'data-table-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/data-table/view.asset.php
+++ b/b-blocks/build/data-table/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '034c6a4aceec79b85fc3');
--- a/b-blocks/build/dual-color-heading/render.php
+++ b/b-blocks/build/dual-color-heading/render.php
@@ -0,0 +1,9 @@
+<?php
+$id = wp_unique_id( 'dual-color-heading-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/dual-color-heading/view.asset.php
+++ b/b-blocks/build/dual-color-heading/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'c42774a90348f698943e');
--- a/b-blocks/build/facebook-embed/render.php
+++ b/b-blocks/build/facebook-embed/render.php
@@ -0,0 +1,8 @@
+<?php $id = wp_unique_id( 'bBlocksFacebookEmbed-' ); ?>
+
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
--- a/b-blocks/build/facebook-embed/view.asset.php
+++ b/b-blocks/build/facebook-embed/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '7ee11c2edca19127f94d');
--- a/b-blocks/build/facebook-page/render.php
+++ b/b-blocks/build/facebook-page/render.php
@@ -0,0 +1,9 @@
+<?php
+$id = wp_unique_id( 'bBlocksFacebookPage-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/facebook-page/view.asset.php
+++ b/b-blocks/build/facebook-page/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '4178fc0931d417cf6f37');
--- a/b-blocks/build/feature-boxes/render.php
+++ b/b-blocks/build/feature-boxes/render.php
@@ -63,7 +63,11 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
 	<style><?php echo esc_html( bBlocksFeatureBoxesStyle( $attributes, $id, $prefix ) ); ?></style>

 	<div class='<?php echo esc_attr( $prefix ); ?> columns-<?php echo esc_attr( $columns['desktop'] ); ?> columns-tablet-<?php echo esc_attr( $columns['tablet'] ); ?> columns-mobile-<?php echo esc_attr( $columns['mobile'] ); ?>'>
--- a/b-blocks/build/flip-boxes/render.php
+++ b/b-blocks/build/flip-boxes/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksFlipBoxes-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/flip-boxes/view.asset.php
+++ b/b-blocks/build/flip-boxes/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'df2a2a58b4b942e98563');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '73b19ec332325eb0d33b');
--- a/b-blocks/build/gif/render.php
+++ b/b-blocks/build/gif/render.php
@@ -26,7 +26,11 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
 	<style><?php echo esc_html( bBlocksGifStyle( $attributes, $id, $prefix ) ); ?></style>

 	<div class='<?php echo esc_attr( $prefix ); ?>'>
--- a/b-blocks/build/html/render.php
+++ b/b-blocks/build/html/render.php
@@ -0,0 +1,9 @@
+<?php
+$id = wp_unique_id( 'bBlocksHtml-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/html/view.asset.php
+++ b/b-blocks/build/html/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '6b0b8ac78f2abad968eb');
--- a/b-blocks/build/icon-box/render.php
+++ b/b-blocks/build/icon-box/render.php
@@ -2,4 +2,10 @@
 $id = wp_unique_id( 'bBlocksIconBox-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>' data-bblocks-advanced='<?php echo esc_attr( wp_json_encode( $attributes['advanced'] ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+	data-bblocks-advanced='<?php echo esc_attr( wp_json_encode( $attributes['advanced'] ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/icon-box/view.asset.php
+++ b/b-blocks/build/icon-box/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '28a09085d0ad475364cf');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '023b69cd01f0ef365856');
--- a/b-blocks/build/image-comparison/render.php
+++ b/b-blocks/build/image-comparison/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksImageCompare-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/image-comparison/view.asset.php
+++ b/b-blocks/build/image-comparison/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '1a558521d03fa5d8026f');
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-i18n'), 'version' => 'fe3865051e27fd2e6385');
--- a/b-blocks/build/image-gallery/render.php
+++ b/b-blocks/build/image-gallery/render.php
@@ -40,7 +40,11 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
 	<style><?php echo esc_html( bBlocksImageGalleryStyle( $attributes, $id ) ); ?></style>

 	<div class='imgGalleryWrapper columns-<?php echo esc_attr( $columns['desktop'] ); ?> columns-tablet-<?php echo esc_attr( $columns['tablet'] ); ?> columns-mobile-<?php echo esc_attr( $columns['mobile'] ); ?>'>
@@ -49,19 +53,19 @@
 			$imgUrlLarge = !empty( $image['sizes']['large']['url'] ) ? $image['sizes']['large']['url'] : $imgUrl;
 			$imgAlt = $image['alt'] ? $image['alt'] : $image['title']; ?>

-			<a class='imgGalleryImgLink'
+			<a class='imgGalleryImgLink'
 				<?php if( $isCap ){}else{ ?>
 					href='#'
 					data-fancybox='imgGalleryPreviewBtn'
 					data-src='<?php echo esc_url( $imgUrl ); ?>'
-					data-srcset='<?php echo esc_url( $imgUrlLarge ); ?> 576w, <?php echo esc_url( $imgUrl ); ?> 992w'
-					data-sizes='( max-width: 576px ) 576px, 992px'
+					data-srcset='<?php echo esc_url( $imgUrlLarge ); ?> 576w, <?php echo esc_url( $imgUrl ); ?> 1024w'
+					data-sizes='( max-width: 640px ) 640px, 1024px'
 					data-caption='<?php echo wp_kses_post( $image['caption'] ); ?>'
 				<?php } ?>>

 				<img src='<?php echo esc_url( $imgUrl ); ?>' alt='<?php echo esc_html( $imgAlt ); ?>' class='imgGalleryImg' />

-				<?php if( $isCap && ( !empty( $imgAlt ) || $isPreview ) ){ ?>
+				<?php if( $isCap &&  $isPreview ){ ?>
 					<div class='imgGalleryImgCaption'>
 						<div class='captionContent'>
 							<?php echo !empty( $imgAlt ) ? "<h4>". wp_kses_post( $image['caption'] ) ."</h4>" : '' ; ?>
@@ -71,8 +75,8 @@
 								<button class='imgGalleryPreviewBtn'
 									data-fancybox='imgGalleryPreviewBtn'
 									data-src='<?php echo esc_url( $imgUrl ); ?>'
-									data-srcset='<?php echo esc_url( $imgUrlLarge ); ?> 576w, <?php echo esc_url( $imgUrl ); ?> 992w'
-									data-sizes='( max-width: 576px ) 576px, 992px'
+									data-srcset='<?php echo esc_url( $imgUrlLarge ); ?> 576w, <?php echo esc_url( $imgUrl ); ?> 1024w'
+									data-sizes='( max-width: 640px ) 640px, 1024px'
 									data-caption='<?php echo wp_kses_post( $image['caption'] ); ?>'>
 									<i class='fa fa-eye'></i><?php echo esc_html__( 'Preview', 'b-blocks' ); ?>
 								</button>
@@ -83,4 +87,4 @@
 			</a> <!-- Image Gallery Link -->
 		<?php } ?> <!-- Image Gallery Loop -->
 	</div> <!-- Image Gallery Wrapper -->
-</div>
 No newline at end of file
+</div>
--- a/b-blocks/build/image-gallery/view.asset.php
+++ b/b-blocks/build/image-gallery/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array(), 'version' => 'ac3f115df801d2d92f35');
+<?php return array('dependencies' => array(), 'version' => '5135756fe7a8f78ae968');
--- a/b-blocks/build/image-hotspot/render.php
+++ b/b-blocks/build/image-hotspot/render.php
@@ -0,0 +1,9 @@
+<?php
+$id = wp_unique_id( 'image-hotspot-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/image-hotspot/view.asset.php
+++ b/b-blocks/build/image-hotspot/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '4d62c773c0ca25c74adb');
--- a/b-blocks/build/image-scroller/render.php
+++ b/b-blocks/build/image-scroller/render.php
@@ -0,0 +1,9 @@
+<?php
+$id = wp_unique_id( 'bBlocksImageScroller-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/image-scroller/view.asset.php
+++ b/b-blocks/build/image-scroller/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'de8880f4963500076ea3');
--- a/b-blocks/build/index.asset.php
+++ b/b-blocks/build/index.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-i18n', 'wp-rich-text'), 'version' => '7f8c07b37b1df9cd6b0c');
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-i18n', 'wp-rich-text'), 'version' => 'c3d2d8c34b80c2660ad7');
--- a/b-blocks/build/info-box/render.php
+++ b/b-blocks/build/info-box/render.php
@@ -62,8 +62,14 @@

 $btnTab = $isLinkNewTab ? '_blank' : '';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
-	<style><?php echo esc_html( bBlocksInfoBoxStyle( $attributes, $id, $prefix ) ); ?></style>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
+	<style>
+		<?php echo esc_html( bBlocksInfoBoxStyle( $attributes, $id, $prefix ) ); ?>
+	</style>

 	<div class='bBlocksInfoBox'>
 		<?php echo $isIcon && $icon['class'] ? "<div class='infoBoxIcon'><i class='". esc_html( $icon['class'] ) ."'></i></div>" : ''; ?>
--- a/b-blocks/build/login-form/render.php
+++ b/b-blocks/build/login-form/render.php
@@ -0,0 +1,12 @@
+<?php
+extract($attributes);
+	$id = wp_unique_id('bBlocksLoginForm-');
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr($id); ?>'
+	data-nonce="<?php echo esc_attr(wp_create_nonce('wp_ajax')) ?>"
+	data-logged='<?php echo esc_attr( wp_json_encode( [ 'isLoggedIn' => is_user_logged_in(), 'logoutUrl' => esc_url( wp_logout_url( $additional['logoutRedirect'] ) ) ] ) ); ?>'
+	data-attributes='<?php echo esc_attr(wp_json_encode($attributes)); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/login-form/view.asset.php
+++ b/b-blocks/build/login-form/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'ee0211b5aec53c4de38a');
--- a/b-blocks/build/logo-slider/render.php
+++ b/b-blocks/build/logo-slider/render.php
@@ -0,0 +1,10 @@
+<?php
+$id = wp_unique_id( 'bBlocksLogoSlider-' );
+$planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/logo-slider/view.asset.php
+++ b/b-blocks/build/logo-slider/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'e03779f525776af08340');
--- a/b-blocks/build/lottie-player/render.php
+++ b/b-blocks/build/lottie-player/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksLottiePlayer-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/lottie-player/view.asset.php
+++ b/b-blocks/build/lottie-player/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '8a4096ccc0b0db86d622');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '299db4a7c8a3d1f85051');
--- a/b-blocks/build/mailto/render.php
+++ b/b-blocks/build/mailto/render.php
@@ -35,8 +35,14 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
-	<style><?php echo esc_html( bBlocksMailtoStyle( $attributes, $id, $prefix ) ); ?></style>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
+	<style>
+		<?php echo esc_html( bBlocksMailtoStyle( $attributes, $id, $prefix ) ); ?>
+	</style>

 	<div class='<?php echo esc_attr( $prefix ); ?>'>
 		<a href='<?php echo 'mailto:' . esc_attr( sanitize_email( $receiverMail ) ); ?>' class='mailtoui mailtoButton'>
--- a/b-blocks/build/mailto/view.asset.php
+++ b/b-blocks/build/mailto/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array(), 'version' => '630901cb03a1e7c2721d');
+<?php return array('dependencies' => array(), 'version' => '9ee874f189809549976f');
--- a/b-blocks/build/navigation/render.php
+++ b/b-blocks/build/navigation/render.php
@@ -0,0 +1,26 @@
+<?php
+$prefix = 'bBlocksNavigation';
+$id = wp_unique_id( "$prefix-" );
+
+extract( $attributes );
+
+$orientation = $layout['orientation'];
+$isWrapMultipleLine = $layout['isWrapMultipleLine'];
+$displayMenu = $hamburger['displayMenu'];
+
+$align = ($orientation === 'is-vertical') ? 'vertical-align-' . $layout['verticalAlignment'] : 'horizontal-align-' . $layout['alignment'];
+
+$className = "$prefix $orientation $displayMenu ". ( $isWrapMultipleLine ? '' : 'no-wrap' ) ." $align";
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+>
+	<div class='<?php echo esc_attr( $className ) ?>'>
+		<?php echo wp_kses( $content, BBlocksIncUtils::allowedInnerHTML() ); ?>
+	</div>
+</div>
+
+
--- a/b-blocks/build/navigation/view.asset.php
+++ b/b-blocks/build/navigation/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react'), 'version' => 'f670a79d6f46f548654a');
--- a/b-blocks/build/posts/render.php
+++ b/b-blocks/build/posts/render.php
@@ -21,6 +21,7 @@
 ];
 ?>
 <div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
 	<?php echo get_block_wrapper_attributes( [ 'class' => "$planClass align$align" ] ); ?>
 	id='<?php echo esc_attr( $id ); ?>'
 	data-nonce='<?php echo esc_attr( wp_json_encode( wp_create_nonce( 'wp_ajax' ) ) ); ?>'
--- a/b-blocks/build/posts/view.asset.php
+++ b/b-blocks/build/posts/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '40b81d271243b5938082');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '19c58d27c15c1601caad');
--- a/b-blocks/build/price-lists/render.php
+++ b/b-blocks/build/price-lists/render.php
@@ -64,7 +64,11 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
 	<style><?php echo esc_html( bBlocksPriceListsStyle( $attributes, $id, $prefix ) ); ?></style>

 	<div class='<?php echo esc_attr( $prefix ); ?> <?php echo esc_attr( $layout ?? 'vertical' ); ?> columns-<?php echo esc_attr( $columns['desktop'] ); ?> columns-tablet-<?php echo esc_attr( $columns['tablet'] ); ?> columns-mobile-<?php echo esc_attr( $columns['mobile'] ); ?>'>
--- a/b-blocks/build/pricing-table/render.php
+++ b/b-blocks/build/pricing-table/render.php
@@ -8,4 +8,9 @@
 $isUltimate = false !== strpos($className, 'ultimate');
 $basicClass = !$isStandard && !$isUltimate ? 'is-style-basic': '';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => "$planClass $basicClass" ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => "$planClass $basicClass" ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/pricing-table/view.asset.php
+++ b/b-blocks/build/pricing-table/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'd9f63389f3f3106575c4');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'a54eeb9dc05d0a676887');
--- a/b-blocks/build/qr-code/render.php
+++ b/b-blocks/build/qr-code/render.php
@@ -9,8 +9,14 @@

 $qrUrl = "https://api.qrserver.com/v1/create-qr-code/?size=$dimension"."x"."$dimension&color=". str_replace( '#', '', $color ) ."&bgcolor=". str_replace( '#', '', $bgColor ) ."&ecc=L&qzone=1&data=$siteUrl";
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
-	<style><?php echo esc_html( $qrStyles ); ?></style>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
+	<style>
+		<?php echo esc_html( $qrStyles ); ?>
+	</style>

 	<div class='<?php echo esc_attr( $prefix ); ?>'>
 		<img src='<?php echo esc_url( $qrUrl ); ?>' alt='<?php echo esc_url( $url ); ?>' />
--- a/b-blocks/build/register-form/render.php
+++ b/b-blocks/build/register-form/render.php
@@ -0,0 +1,10 @@
+<?php
+$id = wp_unique_id( 'bBlocksRegisterForm-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+	data-nonce="<?php echo esc_attr(wp_create_nonce('wp_ajax')) ?>"
+></div>
 No newline at end of file
--- a/b-blocks/build/register-form/view.asset.php
+++ b/b-blocks/build/register-form/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'cef559f3a3b5c8d8eb59');
--- a/b-blocks/build/row/render.php
+++ b/b-blocks/build/row/render.php
@@ -7,9 +7,12 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'>
-	<div class='<?php echo esc_attr( $prefix ); ?>Style'></div>
-
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+>
 	<div class='<?php echo esc_attr( $prefix ); ?>'>
 		<?php echo wp_kses( $content, Utils::allowedInnerHTML() ); ?>
 	</div>
--- a/b-blocks/build/row/view.asset.php
+++ b/b-blocks/build/row/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '324f3cdf2b095eff9f56');
+<?php return array('dependencies' => array('react'), 'version' => 'a6106e7c09f64bcc60db');
--- a/b-blocks/build/script.asset.php
+++ b/b-blocks/build/script.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array(), 'version' => 'b73ccda4a2f13a7439c0');
+<?php return array('dependencies' => array(), 'version' => '025fc7c909bbc44b9229');
--- a/b-blocks/build/section-heading/render.php
+++ b/b-blocks/build/section-heading/render.php
@@ -39,8 +39,14 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
-	<style><?php echo esc_html( bBlocksSectionHeadingStyle( $attributes, $id, $prefix ) ); ?></style>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
+	<style>
+		<?php echo esc_html( bBlocksSectionHeadingStyle( $attributes, $id, $prefix ) ); ?>
+	</style>

 	<div class='bBlocksSectionHeading'>
 		<h2 class='sectionHeadingTitle'><?php echo wp_kses_post( $title ); ?></h2>
--- a/b-blocks/build/service/render.php
+++ b/b-blocks/build/service/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksService-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/service/view.asset.php
+++ b/b-blocks/build/service/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '582b20db3b7f76e2c8cc');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'd241ed4c143b9d03c43a');
--- a/b-blocks/build/services/render.php
+++ b/b-blocks/build/services/render.php
@@ -5,7 +5,12 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+>
 	<div class='<?php echo esc_attr( $prefix ); ?>Style'></div>

 	<div class='<?php echo esc_attr( $prefix ); ?> <?php echo esc_attr( $layout ); ?> columns-<?php echo esc_attr( $columns['desktop'] ); ?> columns-tablet-<?php echo esc_attr( $columns['tablet'] ); ?> columns-mobile-<?php echo esc_attr( $columns['mobile'] ); ?>'>
--- a/b-blocks/build/services/view.asset.php
+++ b/b-blocks/build/services/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '613e982da4d28a7c7489');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '2c76790cf0b4af84c30b');
--- a/b-blocks/build/shape-divider/render.php
+++ b/b-blocks/build/shape-divider/render.php
@@ -63,8 +63,14 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => "$planClass align$align" ] ); ?> id='<?php echo esc_attr( $id ); ?>'>
-	<style><?php echo esc_html( bBlocksShapeDividerStyle( $attributes, $id, $prefix ) ); ?></style>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => "$planClass align$align" ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+>
+	<style>
+		<?php echo esc_html( bBlocksShapeDividerStyle( $attributes, $id, $prefix ) ); ?>
+	</style>

 	<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1200 120' preserveAspectRatio='none'>
 		<?php echo wp_kses( bBlocksShapePath( $shape ), ['path' => [ 'd' => [], 'opacity' => [] ] ] ); ?>
--- a/b-blocks/build/shape-divider/view.asset.php
+++ b/b-blocks/build/shape-divider/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array(), 'version' => 'ae38866e1e2a98c316c6');
+<?php return array('dependencies' => array(), 'version' => '72e8664b5dfd4445d6de');
--- a/b-blocks/build/slider/render.php
+++ b/b-blocks/build/slider/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksSlider-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/slider/view.asset.php
+++ b/b-blocks/build/slider/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '74381272f8b5ff1df19a');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'c39c81d63f8cd352f786');
--- a/b-blocks/build/social-share/render.php
+++ b/b-blocks/build/social-share/render.php
@@ -5,7 +5,11 @@

 extract( $attributes );
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+>
 	<div class='<?php echo esc_attr( $prefix ); ?>Style'></div>

 	<ul class='<?php echo esc_attr( $prefix ); ?>'>
--- a/b-blocks/build/social-share/view.asset.php
+++ b/b-blocks/build/social-share/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '3a2312d7713803055822');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'a8818d3763002e6cdfdd');
--- a/b-blocks/build/star-rating/render.php
+++ b/b-blocks/build/star-rating/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksRating-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/star-rating/view.asset.php
+++ b/b-blocks/build/star-rating/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'f5c11b4c10a090d57756');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'c296614e51ab238f5b33');
--- a/b-blocks/build/svg-draw/render.php
+++ b/b-blocks/build/svg-draw/render.php
@@ -0,0 +1,9 @@
+<?php
+$id = wp_unique_id( 'bBlocksSvgDraw-' );
+?>
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/svg-draw/view.asset.php
+++ b/b-blocks/build/svg-draw/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'e9dab5c36844b011a1f9');
--- a/b-blocks/build/table-of-content/render.php
+++ b/b-blocks/build/table-of-content/render.php
@@ -0,0 +1,13 @@
+<?php
+if ( !defined( 'ABSPATH' ) ) { exit; }
+
+$id = wp_unique_id( 'tbcnbBlock-' );
+
+?>
+
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes(); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/table-of-content/view.asset.php
+++ b/b-blocks/build/table-of-content/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '31b18d3daf79b8c5ed73');
--- a/b-blocks/build/td-viewer/render.php
+++ b/b-blocks/build/td-viewer/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocks3DViewer-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/td-viewer/view.asset.php
+++ b/b-blocks/build/td-viewer/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '04098465e2d42564049e');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'c5572b20172efcabb83d');
--- a/b-blocks/build/team-members/render.php
+++ b/b-blocks/build/team-members/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksTeamMembers-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/team-members/view.asset.php
+++ b/b-blocks/build/team-members/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '70efa801434a64094156');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => 'e34e00a1977f1fe69139');
--- a/b-blocks/build/template-library.asset.php
+++ b/b-blocks/build/template-library.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-i18n'), 'version' => 'b65341d3d8e41f27b34e');
+<?php return array('dependencies' => array('react', 'react-dom', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-i18n'), 'version' => 'f362624776923867694e');
--- a/b-blocks/build/video/render.php
+++ b/b-blocks/build/video/render.php
@@ -2,4 +2,9 @@
 $id = wp_unique_id( 'bBlocksVideo-' );
 $planClass = BBlocksIncUtils::isPro() ? 'pro' : 'free';
 ?>
-<div <?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?> id='<?php echo esc_attr( $id ); ?>' data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'></div>
 No newline at end of file
+<div
+	<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- get_block_wrapper_attributes() is properly escaped ?>
+	<?php echo get_block_wrapper_attributes( [ 'class' => $planClass ] ); ?>
+	id='<?php echo esc_attr( $id ); ?>'
+	data-attributes='<?php echo esc_attr( wp_json_encode( $attributes ) ); ?>'
+></div>
 No newline at end of file
--- a/b-blocks/build/video/view.asset.php
+++ b/b-blocks/build/video/view.asset.php
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '7d83802b5b0508fb6990');
+<?php return array('dependencies' => array('react', 'react-dom'), 'version' => '0663e2fdbf207a5fe769');
--- a/b-blocks/freemius/includes/class-freemius.php
+++ b/b-blocks/freemius/includes/class-freemius.php
@@ -110,6 +110,12 @@
         private $_enable_anonymous = true;

         /**
+         * @since 2.9.1
+         * @var string|null Hints the SDK whether the plugin supports parallel activation mode, preventing the auto-deactivation of the free version when the premium version is activated, and vice versa.
+         */
+        private $_premium_plugin_basename_from_parallel_activation;
+
+        /**
          * @since 1.1.7.5
          * @var bool Hints the SDK if plugin should run in anonymous mode (only adds feedback form).
          */
@@ -1651,6 +1657,31 @@
                     );
                 }
             }
+
+            if (
+                $this->is_user_in_admin() &&
+                $this->is_parallel_activation() &&
+                $this->_premium_plugin_basename !== $this->_premium_plugin_basename_from_parallel_activation
+            ) {
+                $this->_premium_plugin_basename = $this->_premium_plugin_basename_from_parallel_activation;
+
+                register_activation_hook(
+                    dirname( $this->_plugin_dir_path ) . '/' . $this->_premium_plugin_basename,
+                    array( &$this, '_activate_plugin_event_hook' )
+                );
+            }
+        }
+
+        /**
+         * Determines if a plugin is running in parallel activation mode.
+         *
+         * @author Leo Fajardo (@leorw)
+         * @since 2.9.1
+         *
+         * @return bool
+         */
+        private function is_parallel_activation() {
+            return ! empty( $this->_premium_plugin_basename_from_parallel_activation );
         }

         /**
@@ -3598,7 +3629,7 @@

             $this->delete_current_install( false );

-            $license_key = false;
+            $license = null;

             if (
                 is_object( $this->_license ) &&
@@ -3606,20 +3637,21 @@
                     ( WP_FS__IS_LOCALHOST_FOR_SERVER || FS_Site::is_localhost_by_address( self::get_unfiltered_site_url() ) )
                 )
             ) {
-                $license_key = $this->_license->secret_key;
+                $license = $this->_license;
             }

             return $this->opt_in(
                 false,
                 false,
                 false,
-                $license_key,
+                ( is_object( $license ) ? $license->secret_key : false ),
                 false,
                 false,
                 false,
                 null,
                 array(),
-                false
+                false,
+                ( is_object( $license ) ? $license->user_id : null )
             );
         }

@@ -4463,33 +4495,31 @@
                 return;
             }

-            if ( $this->has_api_connectivity() ) {
-                if ( self::is_cron() ) {
-                    $this->hook_callback_to_sync_cron();
-                } else if ( $this->is_user_in_admin() ) {
-                    /**
-                     * Schedule daily data sync cron if:
-                     *
-                     *  1. User opted-in (for tracking).
-                     *  2. If skipped, but later upgraded (opted-in via upgrade).
-                     *
-                     * @author Vova Feldman (@svovaf)
-                     * @since  1.1.7.3
-                     *
-                     */
-                    if ( $this->is_registered() && $this->is_tracking_allowed() ) {
-                        $this->maybe_schedule_sync_cron();
-                    }
+            $this->hook_callback_to_sync_cron();

-                    /**
-                     * Check if requested for manual blocking background sync.
-                     */
-                    if ( fs_request_has( 'background_sync' ) ) {
-                        self::require_pluggable_essentials();
-                        self::wp_cookie_constants();
+            if ( $this->has_api_connectivity() && ! self::is_cron() && $this->is_user_in_admin() ) {
+                /**
+                 * Schedule daily data sync cron if:
+                 *
+                 *  1. User opted-in (for tracking).
+                 *  2. If skipped, but later upgraded (opted-in via upgrade).
+                 *
+                 * @author Vova Feldman (@svovaf)
+                 * @since  1.1.7.3
+                 *
+                 */
+                if ( $this->is_registered() && $this->is_tracking_allowed() ) {
+                    $this->maybe_schedule_sync_cron();
+                }

-                        $this->run_manual_sync();
-                    }
+                /**
+                 * Check if requested for manual blocking background sync.
+                 */
+                if ( fs_request_has( 'background_sync' ) ) {
+                    self::require_pluggable_essentials();
+                    self::wp_cookie_constants();
+
+                    $this->run_manual_sync();
                 }
             }

@@ -5155,11 +5185,35 @@
                 $this->_plugin :
                 new FS_Plugin();

+            $is_premium     = $this->get_bool_option( $plugin_info, 'is_premium', true );
             $premium_suffix = $this->get_option( $plugin_info, 'premium_suffix', '(Premium)' );

+            $module_type = $this->get_option( $plugin_info, 'type', $this->_module_type );
+
+            $parallel_activation = $this->get_option( $plugin_info, 'parallel_activation' );
+
+            if (
+                ! $is_premium &&
+                is_array( $parallel_activation ) &&
+                ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ) &&
+                $this->get_bool_option( $parallel_activation, 'enabled' )
+            ) {
+                $premium_basename = $this->get_option( $parallel_activation, 'premium_version_basename' );
+
+                if ( empty( $premium_basename ) ) {
+                    throw new Exception('You need to specify the premium version basename to enable parallel version activation.');
+                }
+
+                $this->_premium_plugin_basename_from_parallel_activation = $premium_basename;
+
+                if ( is_plugin_active( $premium_basename ) ) {
+                    $is_premium = true;
+                }
+            }
+
             $plugin->update( array(
                 'id'                   => $id,
-                'type'                 => $this->get_option( $plugin_info, 'type', $this->_module_type ),
+                'type'                 => $module_t

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School