<?php
/**
 * The main FusionBuilder class.
 *
 * @package fusion-builder
 * @since 2.0
 */

/**
 * Main FusionBuilder Class.
 *
 * @since 1.0
 */
class FusionBuilder {

	/**
	 * The one, true instance of this object.
	 *
	 * @static
	 * @access private
	 * @since 1.0
	 * @var FusionBuilder|null
	 */
	private static $instance;

	/**
	 * An array of allowed post types.
	 *
	 * @static
	 * @access private
	 * @since 1.0
	 * @var array
	 */
	private static $allowed_post_types = [];

	/**
	 * An array of the element option descriptions.
	 *
	 * @static
	 * @access public
	 * @since 2.0
	 * @var array
	 */
	public static $element_descriptions_map = [];

	/**
	 * An array of the element option dependencies.
	 *
	 * @static
	 * @access public
	 * @since 2.0
	 * @var array
	 */
	public static $element_dependency_map = [];

	/**
	 * An array of the base element CSS files.
	 *
	 * @access public
	 * @since 3.0
	 * @var array
	 */
	public $element_css_files = [];

	/**
	 * Fusion_Product_Registration
	 *
	 * @access public
	 * @var object Fusion_Product_Registration.
	 */
	public $registration;

	/**
	 * Fusion_Images.
	 *
	 * @access public
	 * @var object
	 */
	public $images;

	/**
	 * An array of body classes to be added.
	 *
	 * @access private
	 * @since 1.1
	 * @var array
	 */
	private $body_classes = [];

	/**
	 * Determine if we're currently upgrading/migration options.
	 *
	 * @static
	 * @access public
	 * @var bool
	 */
	public static $is_updating = false;

	/**
	 * Determine if we're currently upgrading plugin.
	 *
	 * @static
	 * @access public
	 * @var bool
	 */
	public static $is_upgrading = false;

	/**
	 * The Fusion_Builder_Options_Panel object.
	 *
	 * @access private
	 * @since 1.1.0
	 * @var object
	 */
	private $fusion_builder_options_panel;

	/**
	 * The Fusion_Builder_Dynamic_CSS object.
	 *
	 * @access private
	 * @since 1.1.3
	 * @var object
	 */
	private $fusion_builder_dynamic_css;

	/**
	 * URL to the js files.
	 *
	 * @static
	 * @access public
	 * @since 1.1.3
	 * @var string
	 */
	public static $js_folder_url;

	/**
	 * Path to the js files.
	 *
	 * @static
	 * @access public
	 * @since 1.1.3
	 * @var string
	 */
	public static $js_folder_path;

	/**
	 * Shortcode array for live builder.
	 *
	 * @access public
	 * @var array $shortcode_array.
	 */
	public $shortcode_array;

	/**
	 * Parent id scope for shortcode render.
	 *
	 * @access public
	 * @var mixed $shortcode_parent.
	 */
	public $shortcode_parent;

	/**
	 * Extra fonts for page to load.
	 *
	 * @access public
	 * @since 2.2
	 * @var mixed
	 */
	public $extra_fonts = null;

	/**
	 * Custom conditions.
	 *
	 * @access private
	 * @since 3.9
	 * @var mixed
	 */
	private $custom_conditions = null;

	/**
	 * Custom form actions.
	 *
	 * @access private
	 * @since 3.9
	 * @var mixed
	 */
	private $custom_form_actions = null;

	/**
	 * An array of all the menus found for current page load.
	 *
	 * @static
	 * @access public
	 * @since 3.9
	 * @var array
	 */
	public $menus = [];

	/**
	 * Post card data.
	 *
	 * @access public
	 * @since 3.3
	 * @var array
	 */
	public $post_card_data = [
		'is_rendering'          => false,
		'is_post_card_archives' => false,
		'columns'               => 1,
		'column_spacing'        => 0,
	];

	/**
	 * If we are editing post card in Live Editor.
	 *
	 * @access public
	 * @since 3.3
	 * @var boolean
	 */
	public $editing_post_card = false;

	/**
	 * Mega menu data.
	 *
	 * @access public
	 * @since 3.3
	 * @var array
	 */
	public $mega_menu_data = [
		'is_rendering' => false,
	];

	/**
	 * If we are editing mega menu in Live Editor.
	 *
	 * @access public
	 * @since 3.3
	 * @var boolean
	 */
	public $editing_mega_menu = false;


	/**
	 * Reference to Fusion_Builder_Gutenberg class.
	 *
	 * @var Fusion_Builder_Gutenberg|null
	 */
	public $fusion_builder_gutenberg;

	/**
	 * Reference to Fusion_Builder_Gutenberg class.
	 *
	 * @var Fusion_Dynamic_Data|null
	 */
	public $dynamic_data;


	/**
	 * Creates or returns an instance of this class.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 */
	public static function get_instance() {

		global $wp_rich_edit, $is_gecko, $is_opera, $is_safari, $is_chrome, $is_edge;

		if ( ! isset( $wp_rich_edit ) ) {
			$wp_rich_edit = false;

			// Defaults to 'true' for logged out users.
			if ( 'true' == @get_user_option( 'rich_editing' ) || ! @is_user_logged_in() ) { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, Universal.Operators.StrictComparisons.LooseEqual
				if ( $is_safari && isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
					$wp_rich_edit = ! wp_is_mobile() || ( preg_match( '!AppleWebKit/(\d+)!', wp_unslash( $_SERVER['HTTP_USER_AGENT'] ), $match ) && intval( $match[1] ) >= 534 ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
				} elseif ( $is_gecko || $is_chrome || $is_edge || ( $is_opera && ! wp_is_mobile() ) ) {
					$wp_rich_edit = true;
				}
			}
		}

		if ( $wp_rich_edit ) {

			// If the single instance hasn't been set, set it now.
			if ( ! self::$instance ) {
				self::$instance = new self();
			}
		} else {
			add_action( 'edit_form_after_title', 'fusion_builder_add_notice_of_disabled_rich_editor' );
		}

		// If an instance hasn't been created and set to $instance create an instance and set it to $instance.
		if ( null === self::$instance ) {
			self::$instance = new FusionBuilder();
		}
		return self::$instance;
	}

	/**
	 * Initializes the plugin by setting localization, hooks, filters,
	 * and administrative functions.
	 *
	 * @access private
	 * @since 1.0
	 */
	private function __construct() {
		$path                  = ( true === FUSION_BUILDER_DEV_MODE ) ? '' : '/min';
		$this->shortcode_array = [];

		self::$js_folder_url  = FUSION_BUILDER_PLUGIN_URL . 'assets/js' . $path;
		self::$js_folder_path = FUSION_BUILDER_PLUGIN_DIR . 'assets/js' . $path;

		self::set_element_description_map();
		self::set_element_dependency_map();

		$this->set_is_updating();
		$this->includes();
		$this->register_scripts();
		$this->init();

		if ( is_admin() && ! class_exists( 'Avada' ) ) {
			$this->registration = new Fusion_Product_Registration(
				[
					'type' => 'plugin',
					'name' => 'Avada Builder',
				]
			);
		}
		add_action( 'fusion_settings_construct', [ $this, 'add_options_to_fusion_settings' ] );

		$this->versions_compare();

		add_action( 'wp', [ $this, 'add_media_query_styles' ] );

		add_action( 'wp_ajax_fusion_get_builder_rendered_content', [ $this, 'get_builder_rendered_content' ] );
		add_action( 'rest_api_init', [ $this, 'register_rendered_content_endpoint' ] );

		if ( function_exists( 'YoastSEO' ) && apply_filters( 'fusion_yoast_integration', true ) ) {
			add_action( 'admin_footer', [ $this, 'add_rendered_content_to_footer' ] );
		}

		if ( class_exists( 'RankMath' ) && apply_filters( 'fusion_rank_math_integration', true ) ) {
			add_action( 'admin_footer', [ $this, 'add_rendered_content_to_footer' ] );
		}
	}

	/**
	 * Initializes the plugin by setting localization, hooks, filters,
	 * and administrative functions.
	 *
	 * @access public
	 * @since 1.0
	 */
	public function init() {

		if ( is_admin() ) {
			do_action( 'fusion_builder_before_init' );
			add_action( 'wp_loaded', [ $this, 'do_fusion_builder_wp_loaded' ] );
		}

		add_action( 'admin_enqueue_scripts', [ $this, 'admin_scripts' ] );

		// Display Avada Builder wrapper.
		$options           = get_option( 'fusion_builder_settings', [] );
		$is_builder        = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );
		$enable_builder_ui = '1';
		if ( isset( $options['enable_builder_ui'] ) ) {
			$enable_builder_ui = $options['enable_builder_ui'];
		}

		if ( $enable_builder_ui ) {
			add_action( 'edit_form_after_title', [ $this, 'before_main_editor' ], 999 );
			add_action( 'edit_form_after_editor', [ $this, 'after_main_editor' ] );
		}

		// WP editor scripts.
		add_action( 'admin_print_footer_scripts', [ $this, 'enqueue_wp_editor_scripts' ] );

		// Add Page Builder meta box.
		add_action( 'add_meta_boxes', [ $this, 'add_builder_meta_box' ] );
		add_filter( 'wpseo_metabox_prio', [ $this, 'set_yoast_meta_box_priority' ] );

		// Page Builder Helper metaboxes.
		add_action( 'add_meta_boxes', [ $this, 'add_builder_helper_meta_box' ] );

		// Content filter.
		add_filter( 'the_content', [ $this, 'fix_builder_shortcodes' ] );
		add_filter( 'the_content', [ $this, 'fusion_calculate_containers' ], 1 );
		add_filter( 'widget_display_callback', [ $this, 'fusion_disable_wpautop_in_widgets' ], 10 );
		add_filter( 'no_texturize_shortcodes', [ $this, 'exempt_from_wptexturize' ] );

		// Sanitize post content.
		add_filter( 'content_save_pre', [ $this, 'filter_post_content' ], 10 );
		add_filter( 'excerpt_save_pre', [ $this, 'filter_post_content' ], 10 );
		add_filter( 'pre_kses', [ $this, 'filter_post_content_pre_kses' ], 10, 3 );
		add_filter( 'the_content', [ $this, 'filter_post_content_on_render' ], 10 );
		add_filter( 'widget_text', [ $this, 'filter_post_content_on_render' ], 9 );

		// Add checkout wrapper.
		if ( $is_builder ) {
			add_filter( 'fusion_builder_front_end_content', [ $this, 'checkout_elements_wrapper' ] );
		} else {
			add_filter( 'the_content', [ $this, 'checkout_elements_wrapper' ] );
		}

		// Save Helper metaboxes.
		add_action( 'save_post', [ $this, 'metabox_settings_save_details' ], 10, 2 );

		// Builder mce button.
		add_filter( 'mce_external_plugins', [ $this, 'add_rich_plugins' ] );
		add_filter( 'mce_buttons', [ $this, 'register_rich_buttons' ] );

		// Avada Builder menu icon.
		add_action( 'admin_head', [ $this, 'admin_styles' ] );

		// Enable shortcodes in text widgets.
		add_filter( 'widget_text', 'do_shortcode' );
		add_filter( 'body_class', [ $this, 'body_class_filter' ] );

		// Replace next page shortcode.
		add_filter( 'the_posts', [ $this, 'next_page' ] );

		// Dynamic-css additions.
		add_filter( 'fusion_dynamic_css_final', [ $this, 'shortcode_styles_dynamic_css' ], 100 );

		add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), [ $this, 'add_action_settings_link' ] );

		// Exclude post types from Events Calendar.
		add_filter( 'tribe_tickets_settings_post_types', [ $this, 'fusion_builder_exclude_post_type' ] );

		// Add admin body classes.
		add_filter( 'admin_body_class', [ $this, 'admin_body_class' ] );

		// Activate ConvertPlug element on plugin activation after Avada Builder.
		add_action( 'after_cp_activate', [ $this, 'activate_convertplug_element' ] );

		// Add Google fonts used within content.
		add_filter( 'fusion_google_fonts', [ $this, 'set_extra_google_fonts' ] );
		add_filter( 'fusion_google_fonts_extra', [ $this, 'has_extra_google_fonts' ] );

		add_action( 'wp_head', [ $this, 'add_element_media_query_styles' ] );
	}

	/**
	 * Sanitizes content for allowed HTML tags for post content on render.
	 *
	 * @access public
	 * @since 7.11.10
	 * @param string $post_content Post content to filter, expected to be escaped with slashes.
	 * @return string Filtered post content with allowed HTML tags and attributes intact.
	 */
	public function filter_post_content_on_render( $content ) {

		$override = Fusion_Template_Builder()->get_override( Fusion_Template_Builder()->get_current_override_name() );

		if ( $override && 0 === strcmp( trim( $override->post_content ), trim( $content ) ) ) {
			$author_id = $override->post_author;
		} else {
			$author_id = get_the_author_meta( 'ID' );
		}

		if ( ! user_can( $author_id, 'unfiltered_html' ) ) {
			return $this->filter_post_content( $content, false, true );
		}

		return $content;
	}

	/**
	 * Sanitizes content for allowed HTML tags for post content.
	 *
	 * @access public
	 * @since 7.11.10
	 * @param array $content Elementor element array, decoded from JSON.
	 * @return array Filtered Elementor element array.
	 */
	public function parse_elementor_content( $content ) {
		$content = json_encode( $content );
		$content = preg_replace_callback( '/"editor":"[^}]+"}/', [ $this, 'filter_elementor_content' ], $content );
		$content = json_decode( $content, true );

		return $content;
	}

	/**
	 * Callback for filtering Elementor content.
	 *
	 * @access public
	 * @since 7.11.10
	 * @param array $post_content Matched Elementor content from the "editor" indices.
	 * @return strin Filtered Elementor content.
	 */
	public function filter_elementor_content( $post_content ) {
		return '"editor":"' . $this->filter_post_content( str_replace( [ '"editor":"', '"}' ], '', $post_content[0] ), true, true ) . '"}';
	}

	/**
	 * Sanitizes content to be run through KSES.
	 * This function expects slashed data.
	 *
	 * @access public
	 * @since 7.11.10
	 * @param string         $content           Content to filter through KSES.
	 * @param array[]|string $allowed_html      An array of allowed HTML elements and attributes,
	 *                                          or a context name such as 'post'. See wp_kses_allowed_html()
	 *                                          for the list of accepted context names.
	 * @param string[]       $allowed_protocols Array of allowed URL protocols.
	 * @return string Filtered post content with allowed HTML tags and attributes intact.
	 */
	public function filter_post_content_pre_kses( $content, $allowed_html, $allowed_protocols ) {
		if ( is_string( $allowed_html ) && 'post' === $allowed_html ) {
			return $this->filter_post_content( $content, false );
		}

		return $content;
	}

	/**
	 * Sanitizes content for allowed HTML tags for post content.
	 *
	 * @access public
	 * @since 7.11.7
	 * @param string $post_content Post content to filter, expected to be escaped with slashes.
	 * @param bool   $handle_slashes Decides if we need to strip slashes or not.
	 * @param bool   $force_check Decides if we need to run the filtering in any case.
	 * @return string Filtered post content with allowed HTML tags and attributes intact.
	 */
	public function filter_post_content( $post_content, $handle_slashes = true, $force_check = false ) {
		if ( current_user_can( 'unfiltered_html' ) && ! $force_check ) {
			return $post_content;
		}

		$post_content = $handle_slashes ? stripslashes( $post_content ) : $post_content;
		$post_content = preg_replace_callback( '/( link="[^"]+"| href="[^"]+"| url="[^"]+"| link_attributes="[^"]+")/', [ $this, 'process_urls_and_links' ], $post_content );
		$post_content = preg_replace_callback( '/\[fusion_code\](.+)\[\/fusion_code\]/U', [ $this, 'process_code_block' ], $post_content );
		$post_content = $handle_slashes ? addslashes( $post_content ) : $post_content;

		return $post_content;
	}

	/**
	 * Sanitizes URLs and link attributes passed from post content that start with parameter name.
	 *
	 * @access public
	 * @since 7.11.7
	 * @param string $link_param The URL or link param to be sanitized starting with link=", url=",  href=", or link_attributes=".
	 * @return string Sanitized URL or link param.
	 */
	public function process_urls_and_links( $link_param ) {
		if ( false !== strpos( $link_param[0], 'link_attributes="' ) ) {
			return ' link_attributes=""';
		}

		$link_param_raw = str_replace( [ ' link="', ' url="', ' href="' ], '', $link_param[0] );
		$link_param_raw = trim( $link_param_raw, '"' );
		$new_link_param = sanitize_url( $link_param_raw );

		if ( $link_param_raw === str_replace( 'http://', '', $new_link_param ) ) {
			return $link_param[0];
		}

		return str_replace( $link_param_raw, $new_link_param, $link_param[0] );
	}

	/**
	 * Sanitizes code block element in post content.
	 *
	 * @access public
	 * @since 7.11.7
	 * @param string $code_block The code block including shortcode tags.
	 * @return string Sanitized code block.
	 */
	public function process_code_block( $code_block ) {
		$code_block_content     = str_replace( [ '[fusion_code]', '[/fusion_code]' ], '', $code_block[0] );
		$code_block_content_new = base64_decode( $code_block_content );

		return str_replace( $code_block_content, $code_block_content_new, $code_block[0] );
	}

	/**
	 * Do the action fusion_builder_wp_loaded.
	 *
	 * @since 3.9
	 * @return void
	 */
	public function do_fusion_builder_wp_loaded() {
		do_action( 'fusion_builder_wp_loaded' );
	}

	/**
	 * Getter for $is_upgrading static var.
	 *
	 * @access public
	 * @since 3.1
	 * @return bool.
	 */
	public static function is_upgrading() {
		return self::$is_upgrading;
	}

	/**
	 * Returns whether or not page has extra google fonts.
	 *
	 * @access public
	 * @since 2.0
	 * @param mixed $has_extra Has extra google fonts.
	 */
	public function has_extra_google_fonts( $has_extra ) {
		$extra_fonts = $this->get_extra_google_fonts();

		if ( $extra_fonts ) {
			return true;
		}
		return $has_extra;
	}

	/**
	 * Find and merge fonts for nested forms and post cards.
	 *
	 * @access public
	 * @since 3.5
	 * @param array  $extra_fonts Fonts already from content.
	 * @param string $content Content we are searching for content.
	 */
	public function get_nested_fonts( $extra_fonts = [], $content = '' ) {

		$post_ids = [];

		if ( '' === $content || ! apply_filters( 'awb_nested_google_fonts', true ) ) {
			return $extra_fonts;
		}

		// Check for encoded off canvas ID.
		if ( false !== strpos( $content, 'b2ZmX2NhbnZhc' ) && false !== strpos( $content, 'dynamic_params' ) ) {
			preg_match_all( '/(?<=dynamic_params=")(.*?)(?=\")/', $content, $matches );
			if ( ! empty( $matches ) ) {
				foreach ( (array) $matches[0] as $match ) {
					if ( false !== strpos( $match, 'b2ZmX2NhbnZhc' ) ) {
						$dynamic_params = json_decode( base64_decode( $match ), true );
						if ( ! empty( $dynamic_params ) ) {
							foreach ( $dynamic_params as $id => $data ) {
								if ( isset( $data['off_canvas_id'] ) ) {
									$post_id = $data['off_canvas_id'];

									// Already processed this item.
									if ( in_array( $post_id, $post_ids, true ) ) {
										continue;
									}

									$post_ids[] = $post_id;
								}
							}
						}
					}
				}
			}
		}

		// Check for nested content.
		if ( false !== strpos( $content, 'form_post_id=' ) || false !== strpos( $content, 'post_card=' ) ) {
			preg_match_all( '/(?<=post_card="|form_post_id=")(.*?)(?=\")/', $content, $matches );

			if ( ! empty( $matches ) ) {
				foreach ( (array) $matches[0] as $match ) {
					$post_id = $match;

					// Already processed this item.
					if ( in_array( $post_id, $post_ids, true ) ) {
						continue;
					}

					$post_ids[] = $post_id;
				}
			}
		}

		// Check for menus in top level content.
		if ( false !== strpos( $content, '[fusion_menu' ) ) {
			preg_match_all( '/(?<= menu=")(.*?)(?=\")/', $content, $matches );

			if ( ! empty( $matches ) ) {
				foreach ( (array) $matches[0] as $match ) {
					if ( in_array( $match, $this->menus, true ) ) {
						continue;
					}
					$this->menus[] = $match;
				}
			}
		}

		// If we have found any posts which need to be checked.
		if ( ! empty( $post_ids ) ) {
			foreach ( $post_ids as $post_id ) {
				$content_fonts = get_post_meta( $post_id, '_fusion_google_fonts', true );

				// Check for menus within nested content.
				if ( false !== strpos( $content, '[fusion_menu' ) ) {
					preg_match_all( '/(?<= menu=")(.*?)(?=\")/', $content, $matches );

					if ( ! empty( $matches ) ) {
						foreach ( (array) $matches[0] as $match ) {
							if ( in_array( $match, $this->menus, true ) ) {
								continue;
							}
							$this->menus[] = $match;
						}
					}
				}

				if ( is_string( $content_fonts ) ) {
					$content_fonts = maybe_unserialize( $content_fonts );
				}

				// Check for fonts inside form page option.
				$page_options = get_post_meta( $post_id, '_fusion', true );
				if ( is_array( $page_options ) ) {
					if ( ! is_array( $content_fonts ) ) {
						$content_fonts = [];
					}

					foreach ( [ 'step_pb_typo', 'step_typo' ] as $typo_option ) {
						if ( ! isset( $page_options[ $typo_option ] ) || ! is_array( $page_options[ $typo_option ] ) ) {
							continue;
						}

						if ( empty( $page_options[ $typo_option ]['font-family'] ) ) {
							continue;
						}

						$font_family = $page_options[ $typo_option ]['font-family'];

						// Add the font family.
						if ( ! isset( $content_fonts[ $font_family ] ) || ! is_array( $content_fonts[ $font_family ] ) ) {
							$content_fonts[ $font_family ] = [];
						}

						if ( ! empty( $page_options[ $typo_option ]['variant'] ) ) { // Add the variant to the font family.
							if ( ! isset( $content_fonts[ $font_family ]['variants'] ) || ! is_array( $content_fonts[ $font_family ]['variants'] ) ) {
								$content_fonts[ $font_family ]['variants'] = [ $page_options[ $typo_option ]['variant'] ];
							} elseif ( ! in_array( $page_options[ $typo_option ]['variant'], $content_fonts[ $font_family ]['variants'], true ) ) {
								array_push( $content_fonts[ $font_family ]['variants'], $page_options[ $typo_option ]['variant'] );
							}
						}
					}
				}

				if ( empty( $content_fonts ) || ! is_array( $content_fonts ) ) {
					continue;
				}

				if ( ! $extra_fonts ) {
					$extra_fonts = $content_fonts;
					continue;
				}

				foreach ( $content_fonts as $font => $details ) {
					if ( isset( $extra_fonts[ $font ] ) ) {
						$extra_fonts[ $font ]['variants'] = array_merge( $extra_fonts[ $font ]['variants'], $details['variants'] );
					} else {
						$extra_fonts[ $font ] = $details;
					}
				}
			}
		}
		return $extra_fonts;
	}

	/**
	 * Get extra fonts.
	 *
	 * @access public
	 * @since 2.2
	 * @return mixed.
	 */
	public function get_extra_google_fonts() {
		if ( null === $this->extra_fonts ) {
			$id           = get_query_var( 'fb-edit' ) ? get_query_var( 'fb-edit' ) : get_the_id();
			$extra_fonts  = (array) maybe_unserialize( get_post_meta( $id, '_fusion_google_fonts', true ) );
			$current_post = get_post( $id );

			if ( $current_post ) {
				$extra_fonts = $this->get_nested_fonts( $extra_fonts, $current_post->post_content );
			}

			if ( class_exists( 'Fusion_Template_Builder' ) && function_exists( 'get_post_type' ) && 'fusion_tb_section' !== get_post_type() ) {
				$templates     = Fusion_Template_Builder()->get_template_terms();
				$submenu_items = [];

				foreach ( $templates as $key => $template_arr ) {
					$template = Fusion_Template_Builder::get_instance()->get_override( $key );
					if ( $template ) {

						// Process nested layout section content.
						$extra_fonts = $this->get_nested_fonts( $extra_fonts, $template->post_content );

						$template_fonts = get_post_meta( $template->ID, '_fusion_google_fonts', true );
						if ( is_string( $template_fonts ) ) {
							$template_fonts = maybe_unserialize( $template_fonts );
						}

						if ( empty( $template_fonts ) || ! is_array( $template_fonts ) ) {
							continue;
						}

						if ( ! $extra_fonts ) {
							$extra_fonts = $template_fonts;
							continue;
						}

						foreach ( $template_fonts as $font => $details ) {
							if ( isset( $extra_fonts[ $font ] ) ) {
								$extra_fonts[ $font ]['variants'] = array_merge( $extra_fonts[ $font ]['variants'], $details['variants'] );
							} elseif ( is_array( $extra_fonts ) ) {
								$extra_fonts[ $font ] = $details;
							}
						}
					}
				}
			}

			if ( class_exists( 'AWB_Off_Canvas_Front_End' ) && function_exists( 'get_post_type' ) && 'awb_off_canvas' !== get_post_type() && class_exists( 'AWB_Off_Canvas' ) && false !== AWB_Off_Canvas::is_enabled() ) {
				$off_canvases = AWB_Off_Canvas_Front_End()->get_current_page_off_canvases();
				foreach ( $off_canvases as $oc => $oc_name ) {
					$off_canvas = get_post( $oc );
					if ( $off_canvas ) {

						// Process nested layout section content.
						$extra_fonts = $this->get_nested_fonts( $extra_fonts, $off_canvas->post_content );

						$off_canvas_fonts = get_post_meta( $off_canvas->ID, '_fusion_google_fonts', true );
						if ( is_string( $off_canvas_fonts ) ) {
							$off_canvas_fonts = maybe_unserialize( $off_canvas_fonts );
						}

						if ( empty( $off_canvas_fonts ) || ! is_array( $off_canvas_fonts ) ) {
							continue;
						}

						if ( ! $extra_fonts ) {
							$extra_fonts = $off_canvas_fonts;
							continue;
						}

						foreach ( $off_canvas_fonts as $font => $details ) {
							if ( isset( $extra_fonts[ $font ] ) ) {
								$extra_fonts[ $font ]['variants'] = array_merge( $extra_fonts[ $font ]['variants'], $details['variants'] );
							} else {
								$extra_fonts[ $font ] = $details;
							}
						}
					}
				}
			}

			// If we have menus and want to process to look for mega menus.
			if ( ! empty( $this->menus ) && apply_filters( 'awb_mega_menu_font_scan', true ) ) {
				$mega_menus = [];
				foreach ( $this->menus as $menu_slug ) {
					$menu_items = wp_get_nav_menu_items( $menu_slug );
					if ( $menu_items ) {
						foreach ( $menu_items as $menu_item ) {
							if ( isset( $menu_item->fusion_megamenu_select ) && ! empty( $menu_item->fusion_megamenu_select ) ) {
								if ( ! in_array( $menu_item->fusion_megamenu_select, $mega_menus, true ) ) {
									$mega_menus[] = $menu_item->fusion_megamenu_select;
								}
							}
						}
					}
				}

				foreach ( $mega_menus as $mega_menu ) {
					$mega_menu_fonts = get_post_meta( $mega_menu, '_fusion_google_fonts', true );
					if ( is_string( $mega_menu_fonts ) ) {
						$mega_menu_fonts = maybe_unserialize( $mega_menu_fonts );
					}

					if ( empty( $mega_menu_fonts ) || ! is_array( $mega_menu_fonts ) ) {
						continue;
					}

					if ( ! $extra_fonts ) {
						$extra_fonts = $mega_menu_fonts;
						continue;
					}

					foreach ( $mega_menu_fonts as $font => $details ) {
						if ( isset( $extra_fonts[ $font ] ) ) {
							$extra_fonts[ $font ]['variants'] = array_merge( $extra_fonts[ $font ]['variants'], $details['variants'] );
						} else {
							$extra_fonts[ $font ] = $details;
						}
					}
				}
			}

			$this->extra_fonts = $extra_fonts;
		}
		return $this->extra_fonts;
	}

	/**
	 * Sets inline google fonts to be enqueued.
	 *
	 * @access public
	 * @since 2.0
	 * @param mixed $fonts Fonts.
	 */
	public function set_extra_google_fonts( $fonts ) {
		$extra_fonts = $this->get_extra_google_fonts();

		if ( $extra_fonts && is_array( $extra_fonts ) ) {
			foreach ( $extra_fonts as $family => $extra_font ) {
				if ( ! isset( $fonts[ $family ] ) ) {
					$fonts[ $family ] = [];
				}
				if ( isset( $extra_font['variants'] ) && is_array( $extra_font['variants'] ) ) {
					foreach ( $extra_font['variants'] as $variant ) {
						$fonts[ $family ][] = $variant;
					}
					$fonts[ $family ] = array_unique( $fonts[ $family ] );
				} else {
					$fonts[ $family ] = [ '400', 'regular' ];
				}
			}
		}
		return $fonts;
	}

	/**
	 * Helper function for PHP 5.2 compatibility in the next_page method.
	 *
	 * @access private
	 * @since 1.1.0
	 * @param mixed $p Posts.
	 */
	private function next_page_helper( $p ) {

		if ( false !== strpos( $p->post_content, '[fusion_builder_next_page]' ) ) {
			$p->post_content = str_replace( '[fusion_builder_next_page]', '<!--nextpage-->', $p->post_content );
		}
		if ( false !== strpos( $p->post_content, '[fusion_builder_next_page last="true"]' ) ) { // Remove the last next page.
			$p->post_content = str_replace( '[fusion_builder_next_page last="true"]', '', $p->post_content );
		}

		return $p;
	}

	/**
	 * Replace fusion_builder_next_page shortcode with <!--nextpage-->
	 *
	 * @access public
	 * @since 1.1
	 * @param array $posts The array of posts.
	 */
	public function next_page( $posts ) {
		if ( null !== $posts ) {
			$posts = array_map( [ $this, 'next_page_helper' ], $posts );
		}
		return $posts;
	}

	/**
	 * Set WP editor settings.
	 *
	 * @access public
	 * @since 1.0
	 */
	public function enqueue_wp_editor_scripts() {
		global $typenow;

		if ( isset( $typenow ) && in_array( $typenow, self::allowed_post_types(), true ) ) {

			if ( ! class_exists( '_WP_Editors' ) ) {
				require wp_normalize_path( ABSPATH . WPINC . '/class-wp-editor.php' );
			}

			$set = _WP_Editors::parse_settings( 'fusion_builder_editor', [] );

			if ( ! current_user_can( 'upload_files' ) ) {
				$set['media_buttons'] = false;
			}

			_WP_Editors::editor_settings( 'fusion_builder_editor', $set );
		}
	}

	/**
	 * Processes that must run when the plugin is activated.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 */
	public static function activation() {

		if ( ! class_exists( 'Fusion' ) ) {
			// Include Fusion-Library.
			include_once FUSION_BUILDER_PLUGIN_DIR . 'inc/lib/fusion-library.php';
		}

		$installed_plugins   = get_plugins();
		$keys                = array_keys( get_plugins() );
		$fusion_core_key     = '';
		$fusion_core_slug    = 'fusion-core';
		$fusion_core_version = '';

		foreach ( $keys as $key ) {
			if ( preg_match( '|^' . $fusion_core_slug . '/|', $key ) ) {
				$fusion_core_key = $key;
			}
		}

		if ( $fusion_core_key ) {
			$fusion_core         = $installed_plugins[ $fusion_core_key ];
			$fusion_core_version = $fusion_core['Version'];

			if ( version_compare( $fusion_core_version, '3.0', '<' ) ) {
				$message  = '<style>#error-page > p{display:-webkit-flex;display:flex;}#error-page img {height: 120px;margin-right:25px;}.fb-heading{font-size: 1.17em; font-weight: bold; display: block; margin-bottom: 15px;}.fb-link{display: inline-block;margin-top:15px;}.fb-link:focus{outline:none;box-shadow:none;}</style>';
				$message .= '<img src="' . esc_url_raw( plugins_url( 'images/icons/fb_logo.svg', __FILE__ ) ) . '" />';
				$message .= '<span><span class="fb-heading">Avada Builder could not be activated</span>';
				$message .= '<span>Avada Builder can only be activated on installs that use Avada Core 3.0 or higher. Click the link below to install/activate Avada Core 3.0, then you can activate Avada Builder.</span>';
				$message .= '<a class="fb-link" href="' . esc_url_raw( admin_url( 'admin.php?page=avada-plugins' ) ) . '">' . esc_attr__( 'Go to the Avada plugin installation page', 'fusion-builder' ) . '</a></span>';
				wp_die( $message ); // phpcs:ignore WordPress.Security.EscapeOutput
			}
		}
		// Delete the patcher caches.
		delete_site_transient( 'fusion_patcher_check_num' );

		if ( ! class_exists( 'Fusion_Cache' ) ) {
			include_once FUSION_BUILDER_PLUGIN_DIR . 'inc/lib/inc/class-fusion-cache.php';
		}

		// Auto activate elements.
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/helpers.php';
		if ( function_exists( 'fusion_builder_auto_activate_element' ) ) {
			$db_version = get_option( 'fusion_builder_version', false );

			// Only activate if a user is updating from a version which is older than the version the element was added to.
			if ( version_compare( $db_version, '1.0', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_gallery' );
				if ( class_exists( 'Convert_Plug' ) ) {
					fusion_builder_auto_activate_element( 'fusion_convert_plus' );
				}
			}
			if ( version_compare( $db_version, '1.5', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_syntax_highlighter' );
				fusion_builder_auto_activate_element( 'fusion_chart' );
				fusion_builder_auto_activate_element( 'fusion_image_before_after' );
			}
			if ( version_compare( $db_version, '2.1', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_audio' ); // Added in v2.1.
			}

			if ( version_compare( $db_version, '2.2', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_search' );
				fusion_builder_auto_activate_element( 'fusion_tb_archives' );
				fusion_builder_auto_activate_element( 'fusion_tb_author' );
				fusion_builder_auto_activate_element( 'fusion_tb_comments' );
				fusion_builder_auto_activate_element( 'fusion_tb_content' );
				fusion_builder_auto_activate_element( 'fusion_tb_featured_slider' );
				fusion_builder_auto_activate_element( 'fusion_tb_pagination' );
				fusion_builder_auto_activate_element( 'fusion_tb_related' );
				fusion_builder_auto_activate_element( 'fusion_tb_results' );
			}

			if ( version_compare( $db_version, '3.0', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_menu' );
				fusion_builder_auto_activate_element( 'fusion_tb_meta' );
			}

			if ( version_compare( $db_version, '3.0.2', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_lottie' );
			}

			if ( version_compare( $db_version, '3.1', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_form_checkbox' );
				fusion_builder_auto_activate_element( 'fusion_form_date' );
				fusion_builder_auto_activate_element( 'fusion_form_select' );
				fusion_builder_auto_activate_element( 'fusion_form_email' );
				fusion_builder_auto_activate_element( 'fusion_form_hidden' );
				fusion_builder_auto_activate_element( 'fusion_form_number' );
				fusion_builder_auto_activate_element( 'fusion_form_password' );
				fusion_builder_auto_activate_element( 'fusion_form_phone_number' );
				fusion_builder_auto_activate_element( 'fusion_form_image_select' );
				fusion_builder_auto_activate_element( 'fusion_form_radio' );
				fusion_builder_auto_activate_element( 'fusion_form_range' );
				fusion_builder_auto_activate_element( 'fusion_form_rating' );
				fusion_builder_auto_activate_element( 'fusion_form_recaptcha' );
				fusion_builder_auto_activate_element( 'fusion_form_section' );
				fusion_builder_auto_activate_element( 'fusion_form_submit' );
				fusion_builder_auto_activate_element( 'fusion_form_text' );
				fusion_builder_auto_activate_element( 'fusion_form_textarea' );
				fusion_builder_auto_activate_element( 'fusion_form_time' );
				fusion_builder_auto_activate_element( 'fusion_form_upload' );
				fusion_builder_auto_activate_element( 'fusion_form_notice' );
				fusion_builder_auto_activate_element( 'fusion_form' );
			}

			if ( version_compare( $db_version, '3.2', '<' ) && class_exists( 'WooCommerce' ) ) {
				fusion_builder_auto_activate_element( 'fusion_tb_woo_price' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_cart' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_product_images' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_stock' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_rating' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_notices' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_short_description' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_related' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_upsells' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_reviews' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_tabs' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_additional_info' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_short_description' );
			}

			if ( version_compare( $db_version, '3.3', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_scroll_progress' );
				fusion_builder_auto_activate_element( 'fusion_post_cards' );
				fusion_builder_auto_activate_element( 'fusion_post_card_image' );
				fusion_builder_auto_activate_element( 'fusion_tb_post_card_archives' );

				if ( class_exists( 'WooCommerce' ) ) {
					fusion_builder_auto_activate_element( 'fusion_woo_product_grid' );
					fusion_builder_auto_activate_element( 'fusion_tb_woo_checkout_billing' );
					fusion_builder_auto_activate_element( 'fusion_tb_woo_checkout_shipping' );
					fusion_builder_auto_activate_element( 'fusion_tb_woo_checkout_payment' );
					fusion_builder_auto_activate_element( 'fusion_tb_woo_checkout_tabs' );
					fusion_builder_auto_activate_element( 'fusion_woo_sorting' );
					fusion_builder_auto_activate_element( 'fusion_tb_woo_archives' );
					fusion_builder_auto_activate_element( 'fusion_post_card_cart' );
				}

				// Clear data transient to update registration data.
				delete_transient( 'avada_dashboard_data' );
			}

			if ( version_compare( $db_version, '3.5', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_star_rating' );
				fusion_builder_auto_activate_element( 'fusion_form_honeypot' );
				fusion_builder_auto_activate_element( 'fusion_image_hotspots' );
				fusion_builder_auto_activate_element( 'fusion_views_counter' );
				fusion_builder_auto_activate_element( 'fusion_news_ticker' );
			}
			if ( version_compare( $db_version, '3.6', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_facebook_page' );
				fusion_builder_auto_activate_element( 'fusion_twitter_timeline' );
				fusion_builder_auto_activate_element( 'fusion_flickr' );
				fusion_builder_auto_activate_element( 'fusion_tagcloud' );
			}
			if ( version_compare( $db_version, '3.8', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_tb_woo_filters_active' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_filters_price' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_filters_rating' );
				fusion_builder_auto_activate_element( 'fusion_tb_woo_filters_attribute' );
				fusion_builder_auto_activate_element( 'fusion_woo_mini_cart' );
				fusion_builder_auto_activate_element( 'fusion_instagram' );
			}

			if ( version_compare( $db_version, '3.9', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_table_of_contents' );
				fusion_builder_auto_activate_element( 'fusion_circles_info' );
				fusion_builder_auto_activate_element( 'fusion_stripe_button' );
				fusion_builder_auto_activate_element( 'fusion_submenu' );
			}

			if ( version_compare( $db_version, '3.10', '<' ) ) {
				fusion_builder_auto_activate_element( 'fusion_openstreetmap' );
				if ( class_exists( 'WooCommerce' ) ) {
					fusion_builder_auto_activate_element( 'fusion_woo_order_details' );
					fusion_builder_auto_activate_element( 'fusion_woo_order_customer_details' );
					fusion_builder_auto_activate_element( 'fusion_woo_order_table' );
					fusion_builder_auto_activate_element( 'fusion_woo_order_downloads' );
					fusion_builder_auto_activate_element( 'fusion_woo_order_additional_info' );
				}
			}
		}

		$fusion_cache = new Fusion_Cache();
		$fusion_cache->reset_all_caches();

		// FLush rewrite rules.
		add_action(
			'init',
			function () {
				// Ensure the $wp_rewrite global is loaded.
				global $wp_rewrite;
				// Call flush_rules() as a method of the $wp_rewrite object.
				$wp_rewrite->flush_rules( false );
			},
			99
		);
	}

	/**
	 * Activate Convertplug element on plugin activation.
	 *
	 * @static
	 * @access public
	 * @since 1.7
	 */
	public function activate_convertplug_element() {
		if ( function_exists( 'fusion_builder_auto_activate_element' ) ) {
			fusion_builder_auto_activate_element( 'fusion_convert_plus' );
		}
	}

	/**
	 * Processes that must run when the plugin is deactivated.
	 *
	 * @static
	 * @access public
	 * @since 1.1
	 */
	public static function deactivation() {
		// Delete the patcher caches.
		delete_site_transient( 'fusion_patcher_check_num' );

		if ( ! class_exists( 'Fusion_Cache' ) ) {
			include_once FUSION_BUILDER_PLUGIN_DIR . 'inc/lib/inc/class-fusion-cache.php';
		}

		$fusion_cache = new Fusion_Cache();
		$fusion_cache->reset_all_caches();
	}

	/**
	 * Add TinyMCE rich editor button.
	 *
	 * @access public
	 * @since 1.0
	 * @param array $buttons The array of available buttons.
	 * @return array
	 */
	public function register_rich_buttons( $buttons ) {
		if ( is_array( $buttons ) ) {
			array_push( $buttons, 'fusion_button' );
		}

		return $buttons;
	}

	/**
	 * Add Avada Builder menu icon.
	 *
	 * @access public
	 * @since 1.0
	 */
	public function admin_styles() {

		if ( class_exists( 'Avada' ) ) {
			return;
		}

		$font_url = FUSION_LIBRARY_URL . '/assets/fonts/icomoon-admin';
		$font_url = str_replace( [ 'http://', 'https://' ], '//', $font_url );

		echo '<style type="text/css">';
		echo '@font-face {';
		echo 'font-family: "icomoon";';
		echo 'src:url("' . esc_url_raw( $font_url ) . '/icomoon.eot");';
		echo 'src:url("' . esc_url_raw( $font_url ) . '/icomoon.eot?#iefix") format("embedded-opentype"),';
		echo 'url("' . esc_url_raw( $font_url ) . '/icomoon.woff") format("woff"),';
		echo 'url("' . esc_url_raw( $font_url ) . '/icomoon.ttf") format("truetype"),';
		echo 'url("' . esc_url_raw( $font_url ) . '/icomoon.svg#icomoon") format("svg");';
		echo 'font-weight: normal;font-style: normal;';
		echo '}';

		if ( current_user_can( 'switch_themes' ) ) {
			echo '#wp-admin-bar-fb-edit > .ab-item::before { content: "\e971"; font-family: "icomoon"; top:2px; font-size: 16px; }';
		}

		echo '</style>';
	}

	/**
	 * Define TinyMCE rich editor js plugin.
	 *
	 * @access public
	 * @since 1.0
	 * @param array $plugin_array The plugins array.
	 * @return array.
	 */
	public function add_rich_plugins( $plugin_array ) {
		if ( is_admin() ) {
			$plugin_array['fusion_button'] = FUSION_BUILDER_PLUGIN_URL . 'js/fusion-plugin.js';
		}

		return $plugin_array;
	}

	/**
	 * Set global variables.
	 *
	 * @access public
	 * @since 1.0
	 */
	public function init_global_vars() {
		global $wp_version, $content_media_query, $six_fourty_media_query, $three_twenty_six_fourty_media_query, $ipad_portrait_media_query, $content_min_media_query, $small_media_query, $medium_media_query, $large_media_query, $six_columns_media_query, $five_columns_media_query, $four_columns_media_query, $three_columns_media_query, $two_columns_media_query, $one_column_media_query, $dynamic_css, $dynamic_css_helpers;

		$fusion_settings = awb_get_fusion_settings();

		$c_page_id           = fusion_library()->get_page_id();
		$dynamic_css         = $this->fusion_builder_dynamic_css;
		$dynamic_css_helpers = $dynamic_css->get_helpers();

		$side_header_width       = ( 'top' === fusion_get_option( 'header_position' ) ) ? 0 : intval( $fusion_settings->get( 'side_header_width' ) );
		$content_media_query     = '@media only screen and (max-width: ' . ( intval( $side_header_width ) + intval( $fusion_settings->get( 'content_break_point' ) ) ) . 'px)';
		$six_fourty_media_query  = '@media only screen and (max-width: ' . ( intval( $side_header_width ) + 640 ) . 'px)';
		$content_min_media_query = '@media only screen and (min-width: ' . ( intval( $side_header_width ) + intval( $fusion_settings->get( 'content_break_point' ) ) ) . 'px)';

		$three_twenty_six_fourty_media_query = '@media only screen and (min-device-width: 320px) and (max-device-width: 640px)';
		$ipad_portrait_media_query           = '@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait)';

		// Visible options for shortcodes.
		$small_media_query  = '@media screen and (max-width: ' . intval( $fusion_settings->get( 'visibility_small' ) ) . 'px)';
		$medium_media_query = '@media screen and (min-width: ' . ( intval( $fusion_settings->get( 'visibility_small' ) ) + 1 ) . 'px) and (max-width: ' . intval( $fusion_settings->get( 'visibility_medium' ) ) . 'px)';
		$large_media_query  = '@media screen and (min-width: ' . ( intval( $fusion_settings->get( 'visibility_medium' ) ) + 1 ) . 'px)';

		// # Grid System.
		$main_break_point = (int) $fusion_settings->get( 'grid_main_break_point' );
		if ( 640 < $main_break_point ) {
			$breakpoint_range = $main_break_point - 640;
		} else {
			$breakpoint_range = 360;
		}

		$breakpoint_interval = $breakpoint_range / 5;

		$six_columns_breakpoint   = $main_break_point + $side_header_width;
		$five_columns_breakpoint  = $six_columns_breakpoint - $breakpoint_interval;
		$four_columns_breakpoint  = $five_columns_breakpoint - $breakpoint_interval;
		$three_columns_breakpoint = $four_columns_breakpoint - $breakpoint_interval;
		$two_columns_breakpoint   = $three_columns_breakpoint - $breakpoint_interval;
		$one_column_breakpoint    = $two_columns_breakpoint - $breakpoint_interval;

		$six_columns_media_query   = '@media only screen and (min-width: ' . $five_columns_breakpoint . 'px) and (max-width: ' . $six_columns_breakpoint . 'px)';
		$five_columns_media_query  = '@media only screen and (min-width: ' . $four_columns_breakpoint . 'px) and (max-width: ' . $five_columns_breakpoint . 'px)';
		$four_columns_media_query  = '@media only screen and (min-width: ' . $three_columns_breakpoint . 'px) and (max-width: ' . $four_columns_breakpoint . 'px)';
		$three_columns_media_query = '@media only screen and (min-width: ' . $two_columns_breakpoint . 'px) and (max-width: ' . $three_columns_breakpoint . 'px)';
		$two_columns_media_query   = '@media only screen and (max-width: ' . $two_columns_breakpoint . 'px)';
		$one_column_media_query    = '@media only screen and (max-width: ' . $one_column_breakpoint . 'px)';
	}

	/**
	 * Find and include all shortcodes within shortcodes folder.
	 *
	 * @access public
	 * @since 1.0
	 * @return void
	 */
	public function init_shortcodes() {
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-alert.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-audio.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-blank-page.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-breadcrumbs.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-blog.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-button.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-chart.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-checklist.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-code-block.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-column.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-column-inner.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-contact-form7.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-container.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-content-boxes.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-convertplus.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-countdown.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-counters-box.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-counters-circle.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-dropcap.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-events.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-flip-boxes.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-fontawesome.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-gallery.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-global.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-google-map.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-gravity-form.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-highlight.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-image-before-after.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-image-carousel.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-image-hotspots.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-image.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-inline.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-layer-slider.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-lightbox.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-lottie.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-menu.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-menu-anchor.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-modal.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-news-ticker.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-nextpage.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-one-page-link.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-person.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-popover.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-post-slider.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-pricing-table.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-progress.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-star-rating.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-recent-posts.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-revolution-slider.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-row-inner.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-row.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-scroll-progress.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-section-separator.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-separator.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-social-sharing.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-slider.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-social-links.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-soundcloud.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-syntax-highlighter.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-search.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-table.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-tabs.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-tagline.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-testimonials.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-text.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-title.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-toggle.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-tooltip.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-user-login.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-vimeo.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-video.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-views-counter.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-featured-products-slider.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-product-slider.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-shortcodes.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-youtube.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-product-grid.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-cart-table.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-cart-totals.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-cart-coupons.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-cart-shipping.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-sorting.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-post-card-image.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-post-card-cart.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-post-cards.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-facebook-page.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-twitter-timeline.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-flickr.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-tagcloud.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-instagram.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-table-of-contents.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-stripe-button.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-circles-info.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-submenu.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-open-street-map.php';

		/**
		 * AWB_Widget_Framework()->init_shortcodes()
		 */
		do_action( 'awb_init_elements' );
	}

	/**
	 * Add helper meta box on allowed post types.
	 *
	 * @access public
	 * @since 1.0
	 * @param mixed $post The post (not used in this context).
	 */
	public function single_settings_meta_box( $post ) {
		global $typenow;

		wp_nonce_field( basename( __FILE__ ), 'fusion_settings_nonce' );
		?>
		<?php if ( isset( $typenow ) && in_array( $typenow, self::allowed_post_types(), true ) ) : ?>
			<p class="fusion_page_settings">
				<input type="text" id="fusion_use_builder" name="fusion_use_builder" value="<?php echo esc_attr( get_post_meta( $post->ID, 'fusion_builder_status', true ) ); ?>" />
			</p>
		<?php endif; ?>
		<?php
	}

	/**
	 * Add Fusion library message meta box.
	 *
	 * @access public
	 * @since 1.0
	 * @param mixed $post The post (not used in this context).
	 */
	public function library_single_message_box( $post ) {
		$terms   = get_the_terms( $post->ID, 'element_category' );
		$message = '';

		if ( $terms ) {
			foreach ( $terms as $term ) {
				$term_name = $term->name;

				if ( 'sections' === $term_name ) {
					$message = esc_html__( 'You are editing a saved container from the Avada Builder Library which will update with your changes when you click the update button. This is not a real page, only a saved container.', 'fusion-builder' );
				} elseif ( 'columns' === $term_name ) {
					$message = esc_html__( 'You are editing a saved column from the Avada Builder Library which will update with your changes when you click the update button. This is not a real page, only a saved column.', 'fusion-builder' );
				} elseif ( 'elements' === $term_name ) {
					$message = esc_html__( 'You are editing a saved element from the Avada Builder Library which will update with your changes when you click the update button. This is not a real page, only a saved element.', 'fusion-builder' );
				} elseif ( 'post_cards' === $term_name ) {
					$message = esc_html__( 'You are editing a post card from the Avada Builder Library which will update with your changes when you click the update button. This is not a real page, only a post card.  Individual post cards can be selected in the post cards element as a way of displaying posts.', 'fusion-builder' );
				}
			}
		}
		?>

		<p class="fusion-library-single-message">
			<?php echo $message; // phpcs:ignore WordPress.Security.EscapeOutput ?>
		</p>

		<?php
	}

	/**
	 * Add Helper MetaBox.
	 *
	 * @access public
	 * @since 1.0
	 */
	public function add_builder_helper_meta_box() {
		$screens = self::allowed_post_types();

		add_meta_box( 'fusion_settings_meta_box', esc_attr__( 'Avada Builder Settings', 'fusion-builder' ), [ $this, 'single_settings_meta_box' ], $screens, 'side', 'high' );

		add_meta_box( 'fusion_library_message_box', esc_attr__( 'Important', 'fusion-builder' ), [ $this, 'library_single_message_box' ], 'fusion_element', 'side', 'low' );
	}

	/**
	 * Save Helper MetaBox Settings.
	 *
	 * @access public
	 * @since 1.0
	 * @param int|string $post_id The post ID.
	 * @param object     $post    The post.
	 * @return int|void
	 */
	public function metabox_settings_save_details( $post_id, $post ) {
		global $pagenow;

		if ( 'post.php' !== $pagenow ) {
			return $post_id;
		}

		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
			return $post_id;
		}

		$post_type = get_post_type_object( $post->post_type );
		if ( ! current_user_can( $post_type->cap->edit_post, $post_id ) ) {
			return $post_id;
		}

		if ( ! isset( $_POST['fusion_settings_nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['fusion_settings_nonce'] ), basename( __FILE__ ) ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
			return $post_id;
		}

		// Make sure we delete, necessary for slashses.
		if ( isset( $_POST['_fusion_builder_custom_css'] ) && '' === $_POST['_fusion_builder_custom_css'] ) {
			delete_post_meta( $post_id, '_fusion_builder_custom_css' );
		}

		if ( isset( $_POST['_fusion_google_fonts'] ) && '' !== $_POST['_fusion_google_fonts'] ) {
			$google_fonts = json_decode( wp_unslash( $_POST['_fusion_google_fonts'] ), true ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
			if ( is_array( $google_fonts ) ) {
				update_post_meta( $post_id, '_fusion_google_fonts', $google_fonts );
			}
		}

		if ( isset( $_POST['fusion_use_builder'] ) ) {
			update_post_meta( $post_id, 'fusion_builder_status', sanitize_text_field( wp_unslash( $_POST['fusion_use_builder'] ) ) );
		} else {
			delete_post_meta( $post_id, 'fusion_builder_status' );
		}
	}

	/**
	 * Fix shortcode content on front end by getting rid of random p tags.
	 *
	 * @access public
	 * @since 1.0
	 * @param string $content The content.
	 * return string          The content, modified.
	 */
	public function fix_builder_shortcodes( $content ) {
		$is_builder_page = is_singular() && ( 'active' === get_post_meta( get_the_ID(), 'fusion_builder_status', true ) || 'yes' === get_post_meta( get_the_ID(), 'fusion_builder_converted', true ) );
		$has_override    = Fusion_Template_Builder::get_instance()->get_override( 'content' );
		if ( $is_builder_page || $has_override ) {
			$content = fusion_builder_fix_shortcodes( $content );
		}
		return $content;
	}

	/**
	 * Count the containers of a page.
	 *
	 * @access public
	 * @since 1.3
	 * @param string $content The content.
	 * @return string $content
	 */
	public function fusion_calculate_containers( $content ) {
		global $global_container_count;

		if ( $content && ! $this->mega_menu_data['is_rendering'] && ! $global_container_count ) {
			$global_container_count = substr_count( $content, '[fusion_builder_container' );
		}

		return $content;
	}

	/**
	 * Fixes line break issue for shortcodes in widgets.
	 *
	 * @access public
	 * @since  1.2
	 * @param  string $widget_instance The widget Instance.
	 * @return $instance
	 */
	public function fusion_disable_wpautop_in_widgets( $widget_instance ) {
		if ( isset( $widget_instance['text'] ) && false !== strpos( $widget_instance['text'], '[fusion_' ) ) {
			remove_filter( 'widget_text_content', 'wpautop' );
		}
		return $widget_instance;
	}

	/**
	 * Fixes image src issue for URLs with dashes.
	 *
	 * @access public
	 * @since  1.4
	 * @param  Array $shortcodes    Array of shortcodes to exempt.
	 * @return $shortcodes
	 */
	public function exempt_from_wptexturize( $shortcodes ) {
		$shortcodes[] = 'fusion_imageframe';
		return $shortcodes;
	}

	/**
	 * Helper function that substracts values.
	 * Added for compatibility with older PHP versions.
	 *
	 * @access public
	 * @since 1.0.3
	 * @param array $a 1st value.
	 * @param array $b 2nd value.
	 * @return int
	 */
	public function column_opening_positions_index_substract( $a, $b ) {
		return $a[0] - $b[0];
	}

	/**
	 * Add shared element styles to the array.
	 *
	 * @access private
	 * @since 3.0
	 * @return void
	 */
	public function add_shared_element_styles() {
		$fusion_settings = awb_get_fusion_settings();

		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/layout.min.css' );

		// Avada needs this, so element check may cause issues.
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/social-links.min.css' );

		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/flexslider.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/fullwidth.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/fullwidth-absolute.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/fullwidth-flex.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/fullwidth-sticky.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/image-hovers.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/isotope.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/layout-columns.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/components/pagination.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/rollover.min.css' );
		$this->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/swiper.min.css' );

		Fusion_Media_Query_Scripts::$media_query_assets[] = [
			'awb-layout-colums-md',
			FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/layout-columns-md.min.css',
			[],
			FUSION_BUILDER_VERSION,
			Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-medium' ),
		];
		Fusion_Media_Query_Scripts::$media_query_assets[] = [
			'awb-layout-colums-sm',
			FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/layout-columns-sm.min.css',
			[],
			FUSION_BUILDER_VERSION,
			Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-small' ),
		];

		// Included here because of portfolio archive layout, too early for is_tax check.
		if ( 'on' === $fusion_settings->get( 'video_facade' ) ) {
			FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/lite-yt-embed.min.css' );
			FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/lite-vimeo-embed.min.css' );
		}

		// Formerly in misc option file.
		$primary_color_elements = [
			'.fusion-date-and-formats .fusion-format-box',
			'.fusion-blog-pagination .pagination .pagination-prev:hover:before',
			'.fusion-blog-pagination .pagination .pagination-next:hover:after',

			'.fusion-filters .fusion-filter.fusion-active a',
		];

		$extras                 = apply_filters( 'fusion_builder_element_classes', [ '.fusion-dropcap' ], '.fusion-dropcap' );
		$primary_color_elements = array_merge( $primary_color_elements, $extras );

		$extras                 = apply_filters( 'fusion_builder_element_classes', [ '.fusion-popover' ], '.fusion-popover' );
		$primary_color_elements = array_merge( $primary_color_elements, $extras );

		$extras                 = apply_filters( 'fusion_builder_element_classes', [ '.tooltip-shortcode' ], '.tooltip-shortcode' );
		$primary_color_elements = array_merge( $primary_color_elements, $extras );

		$extras = apply_filters( 'fusion_builder_element_classes', [ '.fusion-login-box' ], '.fusion-login-box' );
		foreach ( $extras as $key => $val ) {
			$extras[ $key ] .= ' a:hover';
		}
		$primary_color_elements = array_merge( $primary_color_elements, $extras );

		$primary_border_color_elements = [
			'.fusion-blog-pagination .pagination .current',
			'.fusion-blog-pagination .fusion-hide-pagination-text .pagination-prev:hover',
			'.fusion-blog-pagination .fusion-hide-pagination-text .pagination-next:hover',
			'.fusion-date-and-formats .fusion-date-box',
			'.fusion-blog-pagination .pagination a.inactive:hover',
			'.fusion-hide-pagination-text .fusion-blog-pagination .pagination .pagination-next:hover',
			'.fusion-hide-pagination-text .fusion-blog-pagination .pagination .pagination-prev:hover',

			'.fusion-filters .fusion-filter.fusion-active a',

			'.table-2 table thead',

			'.fusion-tabs.classic .nav-tabs > li.active .tab-link:hover',
			'.fusion-tabs.classic .nav-tabs > li.active .tab-link:focus',
			'.fusion-tabs.classic .nav-tabs > li.active .tab-link',
			'.fusion-tabs.vertical-tabs.classic .nav-tabs > li.active .tab-link',
		];

		$main_elements = apply_filters( 'fusion_builder_element_classes', [ '.fusion-reading-box-container' ], '.fusion-reading-box-container' );
		foreach ( $extras as $key => $val ) {
			$extras[ $key ] .= ' .reading-box';
		}
		$primary_border_color_elements = array_merge( $primary_border_color_elements, $extras );

		$primary_background_color_elements = [
			'.fusion-blog-pagination .pagination .current',
			'.fusion-blog-pagination .fusion-hide-pagination-text .pagination-prev:hover',
			'.fusion-blog-pagination .fusion-hide-pagination-text .pagination-next:hover',
			'.fusion-date-and-formats .fusion-date-box',

			'.table-2 table thead',
		];

		Fusion_Dynamic_CSS::add_replace_pattern( '.fusion-builder-elements-primary_color_elements', Fusion_Dynamic_CSS_Helpers::get_elements_string( $primary_color_elements ) );
		Fusion_Dynamic_CSS::add_replace_pattern( '.fusion-builder-elements-primary_border_color_elements', Fusion_Dynamic_CSS_Helpers::get_elements_string( $primary_border_color_elements ) );
		Fusion_Dynamic_CSS::add_replace_pattern( '.fusion-builder-elements-primary_background_color_elements', Fusion_Dynamic_CSS_Helpers::get_elements_string( $primary_background_color_elements ) );
	}

	/**
	 * Add shared element styles to the array.
	 *
	 * @access private
	 * @since 3.0
	 * @param string $file Path to file.
	 * @return void
	 */
	public function add_element_css( $file ) {
		$this->element_css_files[] = $file;
	}

	/**
	 * Add shortcode styles in dynamic-css.
	 *
	 * @access public
	 * @since 1.1.5
	 * @param string $original_styles The compiled styles.
	 * @return string The compiled styles with the new ones appended.
	 */
	public function shortcode_styles_dynamic_css( $original_styles ) {

		$fusion_settings = awb_get_fusion_settings();
		$dynamic_css_obj = Fusion_Dynamic_CSS::get_instance();
		$styles          = '';
		$is_builder      = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );

		// Get full array of element CSS files we need.
		$shortcodes = apply_filters( 'fusion_element_base_css', array_unique( $this->element_css_files ) );

		// Simple bootstrap animation classes, loaded before shortcodes and not conditional.
		$styles .= fusion_file_get_contents( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/bootstrap-animations.min.css' );

		// Run through array of files.
		foreach ( $shortcodes as $file ) {
			if ( file_exists( $file ) ) {
				$styles .= fusion_file_get_contents( $file );
			}
		}

		// Animations after shortcodes for order.
		if ( 'off' !== fusion_library()->get_option( 'status_css_animations' ) || $is_builder ) {
			$styles .= fusion_file_get_contents( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/animations.min.css' );
		}

		// Stylesheet ID: fusion-builder-ilightbox.
		if ( fusion_library()->get_option( 'status_lightbox' ) ) {
			$ilightbox_styles  = fusion_file_get_contents( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/ilightbox.min.css' );
			$ilightbox_styles .= fusion_file_get_contents( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/ilightbox-' . fusion_library()->get_option( 'lightbox_skin' ) . '-skin.min.css' );
			$ilightbox_url     = set_url_scheme( FUSION_BUILDER_PLUGIN_URL . 'assets/images/' );
			$styles           .= str_replace( 'url(../../assets/images/', 'url(' . $ilightbox_url, $ilightbox_styles );
		}

		$replacement_patterns = Fusion_Dynamic_CSS::get_replacement_patterns();
		if ( ! empty( $replacement_patterns ) ) {
			$styles = str_replace( array_keys( $replacement_patterns ), array_values( $replacement_patterns ), $styles );
		}

		return $original_styles . $styles;
	}

	/**
	 * Shortcode Scripts & Styles.
	 * Registers the FB library scripts used as dependency.
	 *
	 * @access public
	 * @since 1.1
	 * @return void
	 */
	public function register_scripts() {

		$fusion_settings = awb_get_fusion_settings();
		$is_builder      = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );

		if ( 'off' !== fusion_library()->get_option( 'status_css_animations' ) || $is_builder ) {
			Fusion_Dynamic_JS::register_script(
				'fusion-animations',
				self::$js_folder_url . '/general/fusion-animations.js',
				self::$js_folder_path . '/general/fusion-animations.js',
				[ 'jquery', 'cssua' ],
				FUSION_BUILDER_VERSION,
				true
			);
		}
		Fusion_Dynamic_JS::localize_script(
			'fusion-animations',
			'fusionAnimationsVars',
			[
				'status_css_animations' => $fusion_settings->get( 'status_css_animations' ),
			]
		);

		Fusion_Dynamic_JS::register_script(
			'fusion-title',
			self::$js_folder_url . '/general/fusion-title.js',
			self::$js_folder_path . '/general/fusion-title.js',
			[ 'jquery' ],
			FUSION_BUILDER_VERSION,
			true
		);

		Fusion_Dynamic_JS::register_script(
			'jquery-count-to',
			self::$js_folder_url . '/library/jquery.countTo.js',
			self::$js_folder_path . '/library/jquery.countTo.js',
			[ 'jquery' ],
			FUSION_BUILDER_VERSION,
			true
		);
		Fusion_Dynamic_JS::register_script(
			'jquery-count-down',
			self::$js_folder_url . '/library/jquery.countdown.js',
			self::$js_folder_path . '/library/jquery.countdown.js',
			[ 'jquery' ],
			FUSION_BUILDER_VERSION,
			true
		);
		Fusion_Dynamic_JS::localize_script(
			'fusion-video',
			'fusionVideoVars',
			[
				'status_vimeo' => $fusion_settings->get( 'status_vimeo' ),
			]
		);

		// This is here because FAQ also uses it.
		Fusion_Dynamic_JS::register_script(
			'fusion-toggles',
			self::$js_folder_url . '/general/fusion-toggles.js',
			self::$js_folder_path . '/general/fusion-toggles.js',
			[ 'bootstrap-collapse', 'bootstrap-transition', 'fusion-equal-heights' ],
			FUSION_BUILDER_VERSION,
			true
		);

		$fusion_video_dependencies = [ 'jquery', 'fusion-video-general' ];
		if ( $fusion_settings->get( 'status_vimeo' ) ) {
			array_push( $fusion_video_dependencies, 'vimeo-player' );
		}
		if ( $fusion_settings->get( 'status_yt' ) ) {
			array_push( $fusion_video_dependencies, 'fusion-youtube' );
		}
		Fusion_Dynamic_JS::enqueue_script(
			'fusion-video',
			self::$js_folder_url . '/general/fusion-video.js',
			self::$js_folder_path . '/general/fusion-video.js',
			$fusion_video_dependencies,
			FUSION_BUILDER_VERSION,
			true
		);

		Fusion_Dynamic_JS::register_script(
			'lite-youtube',
			self::$js_folder_url . '/library/lite-yt-embed.js',
			self::$js_folder_path . '/library/lite-yt-embed.js',
			[],
			FUSION_BUILDER_VERSION,
			true
		);

		Fusion_Dynamic_JS::register_script(
			'lite-vimeo',
			self::$js_folder_url . '/library/lite-vimeo-embed.js',
			self::$js_folder_path . '/library/lite-vimeo-embed.js',
			[],
			FUSION_BUILDER_VERSION,
			true
		);

		Fusion_Dynamic_JS::register_script(
			'fusion-flickr',
			self::$js_folder_url . '/general/fusion-flickr.js',
			self::$js_folder_path . '/general/fusion-flickr.js',
			[ 'jquery' ],
			FUSION_BUILDER_VERSION,
			true
		);

		Fusion_Dynamic_JS::register_script(
			'fusion-instagram',
			self::$js_folder_url . '/general/fusion-instagram.js',
			self::$js_folder_path . '/general/fusion-instagram.js',
			[ 'jquery', 'packery', 'isotope', 'fusion-lightbox', 'images-loaded' ],
			FUSION_BUILDER_VERSION,
			true
		);

		// Motion Effects.
		Fusion_Dynamic_JS::register_script(
			'gsap',
			self::$js_folder_url . '/library/gsap.min.js',
			self::$js_folder_path . '/library/gsap.min.js',
			[],
			FUSION_BUILDER_VERSION,
			true
		);
		Fusion_Dynamic_JS::register_script(
			'gsap-scroll-trigger',
			self::$js_folder_url . '/library/ScrollTrigger.min.js',
			self::$js_folder_path . '/library/ScrollTrigger.min.js',
			[ 'gsap' ],
			FUSION_BUILDER_VERSION,
			true
		);
		Fusion_Dynamic_JS::register_script(
			'fusion-motion-effects',
			self::$js_folder_url . '/general/fusion-motion-effects.js',
			self::$js_folder_path . '/general/fusion-motion-effects.js',
			[ 'jquery', 'gsap-scroll-trigger' ],
			FUSION_BUILDER_VERSION,
			true
		);
		Fusion_Dynamic_JS::register_script(
			'awb-background-slider',
			self::$js_folder_url . '/general/awb-background-slider.js',
			self::$js_folder_path . '/general/awb-background-slider.js',
			[ 'jquery', 'swiper' ],
			FUSION_BUILDER_VERSION,
			true
		);
		Fusion_Dynamic_JS::enqueue_script( 'fusion-lightbox' );
	}

	/**
	 * Admin Scripts.
	 * Enqueues all necessary scripts in the WP Admin to run Avada Builder.
	 *
	 * @access public
	 * @since 1.0
	 * @return void
	 */
	public function admin_scripts() {
		global $typenow, $fusion_builder_elements, $fusion_builder_multi_elements, $pagenow, $fusion_settings;

		// Load Avada builder importer js.
		if ( 'admin.php' === $pagenow && isset( $_GET['page'] ) && 'avada-builder-options' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification
			wp_enqueue_script( 'fusion_builder_importer_js', FUSION_BUILDER_PLUGIN_URL . 'inc/importer/js/fusion-builder-importer.js', [], FUSION_BUILDER_VERSION, true );

			// Localize Scripts.
			wp_localize_script(
				'fusion_builder_importer_js',
				'fusionBuilderConfig',
				[
					'ajaxurl'             => admin_url( 'admin-ajax.php' ),
					'fusion_import_nonce' => wp_create_nonce( 'fusion_import_nonce' ),
				]
			);
		}

		// Load icons if Avada is not installed / active.
		if ( ! class_exists( 'Avada' ) ) {
			wp_enqueue_style( 'fusion-font-icomoon', FUSION_LIBRARY_URL . '/assets/fonts/icomoon-admin/icomoon.css', [], FUSION_BUILDER_VERSION, 'all' );
		}

		if ( ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) && post_type_supports( $typenow, 'editor' ) ) {

			/**
			 * TODO: has to be loaded for shortcode generator to work. Even if FB is disabled for this post type.
			if ( is_admin() && isset( $typenow ) && in_array( $typenow, self::allowed_post_types(), true ) ) {
			*/

			wp_enqueue_script( 'jquery-ui-core' );
			wp_enqueue_script( 'jquery-ui-widget' );
			wp_enqueue_script( 'jquery-ui-button' );
			wp_enqueue_script( 'jquery-ui-dialog' );
			wp_enqueue_script( 'underscore' );
			wp_enqueue_script( 'backbone' );
			wp_enqueue_script( 'jquery-color' );
			wp_enqueue_style( 'wp-jquery-ui-dialog' );

			// Code Mirror.
			if ( function_exists( 'wp_enqueue_code_editor' ) ) {
				foreach ( [ 'text/html', 'text/css', 'application/javascript' ] as $mime_type ) {
					wp_enqueue_code_editor(
						[
							'type' => $mime_type,
						]
					);
				}
			} else {
				wp_enqueue_script( 'fusion-builder-codemirror-js', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/codemirror/codemirror.js', [ 'jquery' ], FUSION_BUILDER_VERSION, true );
			}
			wp_enqueue_style( 'fusion-builder-codemirror-css', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/codemirror/codemirror.css', [], FUSION_BUILDER_VERSION, 'all' );

			// WP Editor.
			wp_enqueue_script( 'fusion-builder-wp-editor-js', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/wpeditor/wp-editor.js', [ 'jquery' ], FUSION_BUILDER_VERSION, true );

			// Our own color picker.
			if ( function_exists( 'AWB_Global_Colors' ) ) {
				AWB_Global_Colors()->enqueue();
			}

			// Studio colors overwrite scripts.
			if ( function_exists( 'Avada_Studio_Colors' ) ) {
				Avada_Studio_Colors()->enqueue();
			}

			// Bootstrap date and time picker.
			wp_enqueue_script( 'bootstrap-datetimepicker', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/datetimepicker/bootstrap-datetimepicker-back.min.js', [ 'jquery' ], FUSION_BUILDER_VERSION, false );
			wp_enqueue_style( 'bootstrap-datetimepicker', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/css/bootstrap-datetimepicker-back.css', [], FUSION_BUILDER_VERSION, 'all' );

			// The noUi Slider.
			wp_enqueue_style( 'avadaredux-nouislider-css', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/css/nouislider.css', [], FUSION_BUILDER_VERSION, 'all' );

			wp_enqueue_script( 'avadaredux-nouislider-js', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/nouislider/nouislider.min.js', [ 'jquery' ], FUSION_BUILDER_VERSION, true );

			wp_enqueue_script( 'wnumb-js', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/wNumb.js', [ 'jquery' ], FUSION_BUILDER_VERSION, true );

			// FontAwesome.
			wp_enqueue_style( 'fontawesome', Fusion_Font_Awesome::get_backend_css_url(), [], FUSION_BUILDER_VERSION );

			if ( '1' === $fusion_settings->get( 'fontawesome_v4_compatibility' ) ) {
				wp_enqueue_script( 'fontawesome-shim-script', FUSION_BUILDER_PLUGIN_URL . 'inc/lib/assets/fonts/fontawesome/js/fa-v4-shims.js', [], FUSION_BUILDER_VERSION, false );

				wp_enqueue_style( 'fontawesome-shims', Fusion_Font_Awesome::get_backend_shims_css_url(), [], FUSION_BUILDER_VERSION );
			}

			if ( '1' === $fusion_settings->get( 'status_fontawesome_pro' ) ) {
				wp_enqueue_script( 'fontawesome-search-script', FUSION_LIBRARY_URL . '/assets/fonts/fontawesome/js/icons-search-pro.js', [], FUSION_BUILDER_VERSION, false );
			} else {
				wp_enqueue_script( 'fontawesome-search-script', FUSION_LIBRARY_URL . '/assets/fonts/fontawesome/js/icons-search-free.js', [], FUSION_BUILDER_VERSION, false );
			}
			wp_enqueue_script( 'fuse-script', FUSION_LIBRARY_URL . '/assets/min/js/library/fuse.js', [], FUSION_BUILDER_VERSION, false );

			// Icomoon font.
			wp_enqueue_style( 'fusion-font-icomoon', FUSION_LIBRARY_URL . '/assets/fonts/icomoon-admin/icomoon.css', [], FUSION_BUILDER_VERSION, 'all' );

			// Select2 js & css.
			wp_enqueue_script( 'select2', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/select2/js/select2.full.min.js', [ 'jquery' ], FUSION_BUILDER_VERSION, true );
			wp_enqueue_style( 'select2', FUSION_LIBRARY_URL . '/inc/fusion-app/assets/js/select2/css/select2.min.css', [], FUSION_BUILDER_VERSION );

			$fb_template_type = false;
			$builder_options  = get_option( 'fusion_builder_settings', [] );

			if ( 'fusion_tb_section' === get_post_type() ) {

				// Layout Section category is used to filter components.
				$terms = get_the_terms( get_the_ID(), 'fusion_tb_category' );

				if ( is_array( $terms ) ) {
					$fb_template_type = $terms[0]->name;
				}
			}

			// if we are on a grid box, treat as content layout section.
			if ( 'fusion_element' === get_post_type() ) {
				$terms = get_the_terms( get_the_ID(), 'element_category' );
				if ( $terms && 'post_cards' === $terms[0]->slug ) {
					$fb_template_type = 'post_cards';
				} elseif ( $terms && 'mega_menus' === $terms[0]->slug ) {
					$fb_template_type = 'mega_menus';
				}
			}

			if ( function_exists( 'AWB_Global_Typography' ) ) {
				AWB_Global_Typography()->enqueue();
			}

			// Developer mode is enabled.
			if ( true === FUSION_BUILDER_DEV_MODE ) {

				// Utility for underscore.js templates.
				wp_enqueue_script( 'fusion_builder_app_util_js', FUSION_LIBRARY_URL . '/inc/fusion-app/util.js', [ 'jquery', 'jquery-ui-core', 'underscore', 'backbone' ], FUSION_BUILDER_VERSION, true );

				// Sticky builder header.
				wp_enqueue_script( 'fusion-sticky-header', FUSION_BUILDER_PLUGIN_URL . 'js/sticky-menu.js', [ 'jquery', 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, false );

				// Backbone Models.
				wp_enqueue_script( 'fusion_builder_model_element', FUSION_BUILDER_PLUGIN_URL . 'js/models/model-element.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_model_view_manager', FUSION_BUILDER_PLUGIN_URL . 'js/models/model-view-manager.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_dynamic_values', FUSION_BUILDER_PLUGIN_URL . 'js/models/model-dynamic-values.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_dynamic_params', FUSION_BUILDER_PLUGIN_URL . 'js/models/model-dynamic-params.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_model_studio', FUSION_BUILDER_PLUGIN_URL . 'js/models/model-studio.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_model_website', FUSION_BUILDER_PLUGIN_URL . 'js/models/model-website.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				// Backbone Element Collection.
				wp_enqueue_script( 'fusion_builder_collection_element', FUSION_BUILDER_PLUGIN_URL . 'js/collections/collection-element.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				// Backbone Views.
				wp_enqueue_script( 'fusion_builder_view_element', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-element.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_model_view_element_preview', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-element-preview.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_library_base', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-library-base.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_elements_library', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-elements-library.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_generator_elements', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-generator-elements.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_container', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-container.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_blank_page', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-blank-page.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_row', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-row.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_row_nested', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-row-nested.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_column_nested_library', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-nested-column-library.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_column_base', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-column-base.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_column_nested', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-column-nested.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_column', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-column.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_modal', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-modal.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_next_page', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-next-page.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_form_step', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-form-step.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_context_menu', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-context-menu.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_element_settings', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-element-settings.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_multi_element_child_settings', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-multi-element-child-settings.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_widget_settings', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-base-widget-settings.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_multi_element_ui', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-multi-element-sortable-ui.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_multi_element_child_ui', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-multi-element-sortable-child.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_view_column_library', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-column-library.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_bulk_add', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-bulk-add.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				// Backbone App.
				wp_enqueue_script( 'fusion_builder_app_js', FUSION_BUILDER_PLUGIN_URL . 'js/app.js', [ 'jquery', 'jquery-ui-core', 'underscore', 'backbone', 'fusion_builder_app_util_js', 'imagesloaded' ], FUSION_BUILDER_VERSION, true );

				// Shortcode Generator.
				wp_enqueue_script( 'fusion_builder_sc_generator', FUSION_BUILDER_PLUGIN_URL . 'js/fusion-shortcode-generator.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				// History.
				wp_enqueue_script( 'fusion_builder_history', FUSION_BUILDER_PLUGIN_URL . 'js/fusion-history.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_dynamic_selection', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-dynamic-selection.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				wp_enqueue_script( 'fusion_builder_dynamic_data', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-dynamic-data.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				// Checkout Form.
				wp_enqueue_script( 'fusion_builder_view_checkout_form', FUSION_BUILDER_PLUGIN_URL . 'js/views/view-woo-checkout-form.js', [ 'fusion_builder_app_util_js' ], FUSION_BUILDER_VERSION, true );

				if ( class_exists( 'RankMath' ) && apply_filters( 'fusion_rank_math_integration', true ) ) {
					wp_enqueue_script( 'fusion-rank-math-integration', FUSION_BUILDER_PLUGIN_URL . 'js/rank-math-integration.js', [ 'wp-hooks', 'rank-math-analyzer' ], FUSION_BUILDER_VERSION, true );
				}

				if ( function_exists( 'YoastSEO' ) && apply_filters( 'fusion_yoast_integration', true ) ) {
					wp_enqueue_script( 'fusion-yoast-integration', FUSION_BUILDER_PLUGIN_URL . 'js/yoast-integration.js', [], FUSION_BUILDER_VERSION, true );
				}

				// Localize Scripts.
				wp_localize_script(
					'fusion_builder_app_js',
					'fusionBuilderConfig',
					[
						'ajaxurl'                         => admin_url( 'admin-ajax.php' ),
						'admin_url'                       => admin_url(),
						'rest_url'                        => get_rest_url(),
						'fusion_load_nonce'               => wp_create_nonce( 'fusion_load_nonce' ),
						'fontawesomeicons'                => fusion_get_icons_array(),
						'fontawesomesubsets'              => fusion_library()->get_option( 'status_fontawesome' ),
						'studio_status'                   => AWB_Studio::is_studio_enabled(),
						'customIcons'                     => fusion_get_custom_icons_array(),
						'fusion_builder_plugin_dir'       => FUSION_BUILDER_PLUGIN_URL,
						'includes_url'                    => includes_url(),
						'disable_encoding'                => get_option( 'avada_disable_encoding' ),
						'full_width'                      => apply_filters( 'fusion_builder_width_hundred_percent', '' ),
						'widget_element_enabled'          => fusion_is_element_enabled( 'fusion_widget' ),
						'template_category'               => $fb_template_type,
						'fusion_options'                  => class_exists( 'Avada_Studio' ) ? $fusion_settings->get_all() : [],
						'plugins_active'                  => [
							'woocommerce'     => class_exists( 'WooCommerce' ),
							'slider_rev'      => defined( 'RS_PLUGIN_PATH' ),
							'layer_slider'    => defined( 'LS_PLUGIN_BASE' ),
							'events_calendar' => class_exists( 'Tribe__Events__Main' ),
							'cf7'             => defined( 'WPCF7_PLUGIN' ),
							'convert_plus'    => class_exists( 'Convert_Plug' ),
							'awb_studio'      => class_exists( 'Avada_Studio' ),
						],
						'post_type'                       => get_post_type(),
						'post_id'                         => get_the_id(),
						'container_legacy_support'        => 1 === (int) $fusion_settings->get( 'container_legacy_support' ) ? 1 : 0,
						'is_header_layout_section_edited' => 'fusion_tb_section' === get_post_type() && has_term( 'header', 'fusion_tb_category' ) ? 1 : 0,
						'is_content_override_active'      => function_exists( 'Fusion_Template_Builder' ) ? Fusion_Template_Builder()->get_override( 'content' ) : false,
						'predefined_choices'              => apply_filters( 'fusion_predefined_choices', [] ),
						'replaceAssets'                   => apply_filters( 'fusion_replace_studio_assets', false ),
						'builder_type'                    => isset( $builder_options['enable_builder_ui_by_default'] ) ? $builder_options['enable_builder_ui_by_default'] : 'backend',
						'removeEmptyAttributes'           => isset( $builder_options['remove_empty_attributes'] ) ? $builder_options['remove_empty_attributes'] : 'off',
					]
				);

				// Localize scripts. Text strings.
				wp_localize_script( 'fusion_builder_app_js', 'fusionBuilderText', fusion_app_textdomain_strings() );

				wp_localize_script(
					'fusion_builder',
					'fusionAppConfig',
					[
						'includes_url' => includes_url(),
					]
				);

				// Developer mode is disabled.
			} else {

				// Avada Builder js.
				wp_enqueue_script(
					'fusion_builder',
					FUSION_BUILDER_PLUGIN_URL . 'js/fusion-builder.js',
					[ 'jquery', 'jquery-ui-core', 'underscore', 'backbone', 'imagesloaded' ],
					FUSION_BUILDER_VERSION,
					true
				);

				// Localize Script.
				wp_localize_script(
					'fusion_builder',
					'fusionBuilderConfig',
					[
						'ajaxurl'                         => admin_url( 'admin-ajax.php' ),
						'admin_url'                       => admin_url(),
						'rest_url'                        => get_rest_url(),
						'fusion_load_nonce'               => wp_create_nonce( 'fusion_load_nonce' ),
						'fontawesomeicons'                => fusion_get_icons_array(),
						'fontawesomesubsets'              => fusion_library()->get_option( 'status_fontawesome' ),
						'studio_status'                   => AWB_Studio::is_studio_enabled(),
						'customIcons'                     => fusion_get_custom_icons_array(),
						'fusion_builder_plugin_dir'       => FUSION_BUILDER_PLUGIN_URL,
						'includes_url'                    => includes_url(),
						'disable_encoding'                => get_option( 'avada_disable_encoding' ),
						'full_width'                      => apply_filters( 'fusion_builder_width_hundred_percent', '' ),
						'widget_element_enabled'          => fusion_is_element_enabled( 'fusion_widget' ),
						'template_category'               => $fb_template_type,
						'fusion_options'                  => class_exists( 'Avada_Studio' ) ? $fusion_settings->get_all() : [],
						'plugins_active'                  => [
							'woocommerce'     => class_exists( 'WooCommerce' ),
							'slider_rev'      => defined( 'RS_PLUGIN_PATH' ),
							'layer_slider'    => defined( 'LS_PLUGIN_BASE' ),
							'events_calendar' => class_exists( 'Tribe__Events__Main' ),
							'cf7'             => defined( 'WPCF7_PLUGIN' ),
							'convert_plus'    => class_exists( 'Convert_Plug' ),
							'awb_studio'      => class_exists( 'Avada_Studio' ),
						],
						'post_type'                       => get_post_type(),
						'post_id'                         => get_the_id(),
						'container_legacy_support'        => 1 === (int) $fusion_settings->get( 'container_legacy_support' ) ? 1 : 0,
						'is_header_layout_section_edited' => 'fusion_tb_section' === get_post_type() && has_term( 'header', 'fusion_tb_category' ) ? 1 : 0,
						'is_content_override_active'      => function_exists( 'Fusion_Template_Builder' ) ? Fusion_Template_Builder()->get_override( 'content' ) : false,
						'predefined_choices'              => apply_filters( 'fusion_predefined_choices', [] ),
						'replaceAssets'                   => apply_filters( 'fusion_replace_studio_assets', false ),
						'builder_type'                    => isset( $builder_options['enable_builder_ui_by_default'] ) ? $builder_options['enable_builder_ui_by_default'] : 'backend',
						'removeEmptyAttributes'           => isset( $builder_options['remove_empty_attributes'] ) ? $builder_options['remove_empty_attributes'] : 'off',
					]
				);

				// Localize script. Text strings.
				wp_localize_script( 'fusion_builder', 'fusionBuilderText', fusion_app_textdomain_strings() );

				wp_localize_script(
					'fusion_builder',
					'fusionAppConfig',
					[
						'includes_url' => includes_url(),
					]
				);

			}

			// Builder Styling.
			wp_enqueue_style( 'fusion_builder_css', FUSION_BUILDER_PLUGIN_URL . 'assets/admin/css/fusion-builder.css', [], FUSION_BUILDER_VERSION );

			// Elements Preview.
			wp_enqueue_style( 'fusion_element_preview_css', FUSION_BUILDER_PLUGIN_URL . 'assets/admin/css/elements-preview.css', [], FUSION_BUILDER_VERSION );

			// Studio preview.
			wp_enqueue_script(
				'fusion-admin-notices',
				trailingslashit( Fusion_Scripts::$js_folder_url ) . 'general/awb-studio-preview-admin.js',
				[ 'jquery' ],
				FUSION_BUILDER_VERSION,
				false
			);

			// Filter disabled elements.
			$fusion_builder_elements = fusion_builder_filter_available_elements();

			// Create elements js object. Load element's js and css.
			if ( ! empty( $fusion_builder_elements ) ) {

				$fusion_builder_elements = apply_filters( 'fusion_builder_all_elements', $fusion_builder_elements );

				echo '<script>var fusionAllElements = ' . wp_json_encode( $fusion_builder_elements ) . ';</script>';

				// Load modules backend js and css.
				foreach ( $fusion_builder_elements as $module ) {
					// JS file.
					if ( ! empty( $module['admin_enqueue_js'] ) ) {
						wp_enqueue_script( $module['shortcode'], $module['admin_enqueue_js'], [], FUSION_BUILDER_VERSION, true );
					}

					// CSS file.
					if ( ! empty( $module['admin_enqueue_css'] ) ) {
						wp_enqueue_style( $module['shortcode'], $module['admin_enqueue_css'], [], FUSION_BUILDER_VERSION );
					}

					// Preview template.
					if ( ! empty( $module['preview'] ) ) {
						require_once wp_normalize_path( $module['preview'] );
					}

					// Custom settings template.
					if ( ! empty( $module['custom_settings_template_file'] ) ) {
						require_once wp_normalize_path( $module['custom_settings_template_file'] );
					}
					// Custom settings view.
					if ( ! empty( $module['custom_settings_view_js'] ) ) {
						wp_enqueue_script( $module['shortcode'] . '_custom_settings_view', $module['custom_settings_view_js'], [], FUSION_BUILDER_VERSION, true );
					}
				}
			}

			// Multi Element object.
			if ( ! empty( $fusion_builder_multi_elements ) ) {
				echo '<script>var fusionMultiElements = ' . wp_json_encode( $fusion_builder_multi_elements ) . ';</script>';
			}

			// Builder admin scripts hook.
			do_action( 'fusion_builder_admin_scripts_hook' );

			/* } */
		}
	}

	/**
	 * Include required files.
	 *
	 * @access private
	 * @since 1.0
	 * @return void
	 */
	private function includes() {

		// Helper functions.
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/helpers.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-options.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-dynamic-css.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-layout-conditions.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-template-builder.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-builder.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-hubspot.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-mailchimp.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-woocommerce.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-gutenberg.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-dynamic-data.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-elements-dynamic-css.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-element.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-column-element.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-row-element.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-component.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-woo-component.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-woo-products-component.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-component.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/critical-css/class-awb-critical-css.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-studio.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-studio-import.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-studio-remove.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-demo-import.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-off-canvas.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-off-canvas-front-end.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-woo-filters.php';
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-clone-posts.php';

		Fusion_Builder_Options::get_instance();
		new Fusion_Elements_Dynamic_CSS();

		$this->fusion_builder_dynamic_css = new Fusion_Builder_Dynamic_CSS();

		$this->fusion_builder_gutenberg = new Fusion_Builder_Gutenberg();

		$this->dynamic_data = new Fusion_Dynamic_Data();

		// Load globals media vars.
		$this->init_global_vars();

		// Adds shared element styles to array to be loaded later, priority 20 to come after elements.
		add_action( 'wp_loaded', [ $this, 'add_shared_element_styles' ], 20 );

		// Load all shortcode elements.
		$this->init_shortcodes();

		// If Avada Core is old, do not load the elements.
		if ( function_exists( 'fusion_init_shortcodes' ) && version_compare( FUSION_CORE_VERSION, '5.10', '<' ) ) {
			remove_action( 'fusion_builder_shortcodes_init', 'fusion_init_shortcodes' );
		}

		do_action( 'fusion_builder_shortcodes_init' );

		// Shortcode related functions.
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/shortcodes.php';

		// Page layouts.
		require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-library.php';

		if ( is_admin() ) {
			// Importer/Exporter.
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/importer/importer.php';
			// Builder underscores templates.
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/templates.php';
			// Settings.
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-admin.php';
		}
		if ( is_admin() || is_customize_preview() ) {
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-options-panel.php';
			// Fusion Library.
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-builder-library-table.php';
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-template-builder-table.php';
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-form-builder-table.php';
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-fusion-custom-icons-table.php';
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-off-canvas-admin.php';
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/class-awb-off-canvas-table.php';
			$this->fusion_builder_options_panel = new Fusion_Builder_Options_Panel();
		}

		// WooCommerce.
		if ( class_exists( 'WooCommerce' ) ) {
			require_once FUSION_BUILDER_PLUGIN_DIR . 'inc/woocommerce/class-fusionbuilder-woocommerce.php';
		}
	}

	/**
	 * Avada Builder wrapper.
	 *
	 * @access public
	 * @since 1.0
	 * @param object $post The post.
	 */
	public function before_main_editor( $post ) {
		global $typenow;

		if ( isset( $typenow ) && in_array( $typenow, self::allowed_post_types(), true ) && post_type_supports( $typenow, 'editor' ) ) {

			$load_live_builder    = apply_filters( 'fusion_load_live_editor', true ) && current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_', get_post_type( $post->ID ), 'live_builder_edit' ) );
			$load_backend_builder = current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_', get_post_type( $post->ID ), 'backend_builder_edit' ) );
			$builder_active       = 'active' === get_post_meta( $post->ID, 'fusion_builder_status', true ) && $load_backend_builder ? true : false;

			if ( ! $load_live_builder && ! $load_backend_builder ) {
				return;
			}

			$builder_enabled_data = '';
			$builder_settings     = get_option( 'fusion_builder_settings', [] );

			if ( ( isset( $builder_settings['enable_builder_ui_by_default'] ) && 'backend' === $builder_settings['enable_builder_ui_by_default'] && 'active' !== get_post_meta( $post->ID, 'fusion_builder_status', true ) ) || ( 'fusion_element' === $typenow && 'active' !== get_post_meta( $post->ID, 'fusion_builder_status', true ) ) ) {
				$builder_enabled_data = ' data-enabled="1"';
			}

			$editor_label   = ( $builder_active ) ? esc_attr__( 'Default Editor', 'fusion-builder' ) : esc_attr__( 'Back-end Builder', 'fusion-builder' );
			$builder_hidden = ( $builder_active ) ? 'fusion_builder_hidden' : '';
			$builder_active = ( $builder_active ) ? ' fusion_builder_is_active' : ' fusiona-FB_logo_black button-primary';

			echo '<div class="fusion-builder-toggle-buttons">';

			if ( $load_backend_builder ) {
				echo '<a href="#" id="fusion_toggle_builder" data-builder="' . esc_attr__( 'Back-end Builder', 'fusion-builder' ) . '" data-editor="' . esc_attr__( 'Default Editor', 'fusion-builder' ) . '"' . $builder_enabled_data . ' class="fusiona-FB_logo_black button button-large' . $builder_active . '"><span class="fusion-builder-button-text">' . $editor_label . '</span></a>';  // phpcs:ignore WordPress.Security.EscapeOutput
			}

			if ( $load_live_builder ) {
				$builder_link = add_query_arg( 'fb-edit', '1', get_the_permalink( $post->ID ) );
				echo '<a id="fusion_toggle_front_end" href="' . esc_url( $builder_link ) . '" class="fusiona-FB_logo_black button button-primary button-large" target=""><span class="fusion-builder-button-text">' . esc_attr__( 'Live Builder', 'fusion-builder' ) . '</span></a>';
			}

			echo '</div>';
			echo '<div id="fusion_main_editor_wrap" class="' . esc_attr( $builder_hidden ) . '">';
		}
	}

	/**
	 * Avada Builder wrapper.
	 *
	 * @package Avada Builder
	 * @author ThemeFusion
	 * @param object $post The post.
	 */
	public function after_main_editor( $post ) {
		global $typenow;

		$load_live_builder    = apply_filters( 'fusion_load_live_editor', true ) && current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_', get_post_type( $post->ID ), 'live_builder_edit' ) );
		$load_backend_builder = current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_', get_post_type( $post->ID ), 'backend_builder_edit' ) );

		if ( ! $load_live_builder && ! $load_backend_builder ) {
			return;
		}

		if ( isset( $typenow ) && in_array( $typenow, self::allowed_post_types(), true ) ) {
			echo '</div>';
		}
	}

	/**
	 * Default post types.
	 *
	 * @package Avada Builder
	 * @author ThemeFusion
	 * @since 1.0
	 */
	public static function default_post_types() {

		// Allow theme developers to change default selection via filter.  Can also do so for Avada.
		return apply_filters(
			'fusion_builder_default_post_types',
			[
				'page',
				'post',
				'avada_faq',
				'avada_portfolio',
				'fusion_template',
				'fusion_element',
				'fusion_tb_section',
				'fusion_tb_layout',
				'fusion_form',
				'awb_off_canvas',
			]
		);
	}

	/**
	 * Builder is displayed on the following post types.
	 *
	 * @package Avada Builder
	 * @author ThemeFusion
	 */
	public static function allowed_post_types() {

		if ( ! empty( self::$allowed_post_types ) ) {
			return self::$allowed_post_types;
		}

		$options = get_option( 'fusion_builder_settings', [] );

		self::$allowed_post_types = self::default_post_types();

		if ( isset( $options['post_types'] ) ) {
			// If there are options saved, use them.
			$post_types = ( ' ' === $options['post_types'] ) ? [] : $options['post_types'];
			// Add defaults to allowed post types ( bc ).
			$post_types[]             = 'fusion_element';
			$post_types[]             = 'fusion_tb_section';
			$post_types[]             = 'fusion_form';
			$post_types[]             = 'awb_off_canvas';
			self::$allowed_post_types = $post_types;
		}

		self::$allowed_post_types = array_values( array_unique( apply_filters( 'fusion_builder_allowed_post_types', self::$allowed_post_types ) ) );
		return self::$allowed_post_types;
	}

	/**
	 * Add Page Builder MetaBox.
	 *
	 * @since 1.0
	 * @param  string $post_type  Post type slug.
	 * @return void
	 */
	public function add_builder_meta_box( $post_type ) {
		if ( post_type_supports( $post_type, 'editor' ) ) {
			add_meta_box( 'fusion_builder_layout', '<span class="fusion-builder-logo-wrapper"><span class="fusion-builder-logo fusiona-avada-logo"></span><span class="fusion-builder-title">' . esc_html__( 'Avada Builder', 'fusion-builder' ) . '</span></span><a href="https://avada.com/documentation/category/builder/" target="_blank" rel="noopener noreferrer"><span class="fusion-builder-help dashicons dashicons-editor-help"></span></a>', 'fusion_pagebuilder_meta_box', null, 'normal', 'high' );
		}
	}

	/**
	 * Resets the meta box priority for Yoast SEO.
	 * Devs can override by using fusion_builder_yoast_meta_box_priority filter.
	 *
	 * @since 1.0.0
	 * @access public
	 * @return string The meta box priority.
	 */
	public function set_yoast_meta_box_priority() {
		return apply_filters( 'fusion_builder_yoast_meta_box_priority', 'default' );
	}

	/**
	 * Function to apply attributes to HTML tags.
	 * Devs can override attributes in a child theme by using the correct slug.
	 *
	 * @since 1.0.0
	 * @access public
	 * @param  string $slug    Slug to refer to the HTML tag.
	 * @param  array  $attributes Attributes for HTML tag.
	 * @return string The string of all attributes.
	 */
	public static function attributes( $slug, $attributes = [] ) {

		$out  = '';
		$attr = apply_filters( "fusion_attr_{$slug}", $attributes );

		if ( empty( $attr ) ) {
			$attr['class'] = $slug;
		}

		foreach ( $attr as $name => $value ) {
			if ( 'valueless_attribute' === $value ) {
				$out .= ' ' . esc_html( $name );
			} elseif ( ! empty( $value ) || strlen( $value ) > 0 || is_bool( $value ) ) {
				$value = str_replace( '  ', ' ', $value );
				$out  .= ' ' . esc_html( $name ) . '="' . esc_attr( $value ) . '"';
			}
		}

		return trim( $out );
	}

	/**
	 * Function to get the default shortcode param values applied.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 * @param  array  $defaults  Array of defaults.
	 * @param  array  $args      Array with user set param values.
	 * @param  string $shortcode Shortcode name.
	 * @return array
	 */
	public static function set_shortcode_defaults( $defaults, $args, $shortcode = false ) {

		if ( ! $args ) {
			$args = [];
		}

		$args    = apply_filters( 'fusion_pre_shortcode_atts', $args, $defaults, $args, $shortcode );
		$args    = shortcode_atts( $defaults, $args, $shortcode );
		$allowed = apply_filters( 'fusion_pipe_seprator_shortcodes', [] );

		foreach ( $args as $key => $value ) {
			if ( ( '' === $value || ( '|' === $value && ! in_array( $shortcode, $allowed, true ) ) ) && isset( $defaults[ $key ] ) ) {
				$args[ $key ] = $defaults[ $key ];
			}
		}

		return $args;
	}

	/**
	 * Returns an array with the rgb values.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 * @param string $hex The HEX color.
	 * @return array
	 */
	public static function hex2rgb( $hex ) {
		$hex = str_replace( '#', '', $hex );

		if ( 3 === strlen( $hex ) ) {
			$r = hexdec( substr( $hex, 0, 1 ) . substr( $hex, 0, 1 ) );
			$g = hexdec( substr( $hex, 1, 1 ) . substr( $hex, 1, 1 ) );
			$b = hexdec( substr( $hex, 2, 1 ) . substr( $hex, 2, 1 ) );
		} else {
			$r = hexdec( substr( $hex, 0, 2 ) );
			$g = hexdec( substr( $hex, 2, 2 ) );
			$b = hexdec( substr( $hex, 4, 2 ) );
		}
		return [ $r, $g, $b ];
	}

	/**
	 * Function to return animation classes for shortcodes mainly.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 * @param  array $args Animation type, direction and speed.
	 * @return array       Array with data attributes.
	 */
	public static function animations( $args = [] ) {
		$defaults = [
			'type'      => '',
			'direction' => 'left',
			'speed'     => '0.1',
			'offset'    => 'bottom-in-view',
			'delay'     => '0',
		];

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

		$animation_attribues = [];

		if ( $args['type'] ) {

			$animation_attribues['animation_class'] = 'fusion-animated';

			if ( 'static' === $args['direction'] ) {
				$args['direction'] = '';
			}

			if ( ! in_array( $args['type'], [ 'flash', 'shake', 'rubberBand', 'flipinx', 'flipiny', 'lightspeedin' ], true ) ) {
				$direction_suffix = 'In' . ucfirst( $args['direction'] );
				$args['type']    .= $direction_suffix;
			}

			$animation_attribues['data-animationType'] = $args['type'];

			if ( $args['speed'] ) {
				$animation_attribues['data-animationDuration'] = $args['speed'];
			}

			if ( $args['delay'] && 0 < (float) $args['delay'] ) {
				$animation_attribues['data-animationDelay'] = $args['delay'];
			}
		}

		if ( $args['offset'] ) {
			$animation_attribues['data-animationOffset'] = $args['offset'];
		}

		return $animation_attribues;
	}

	/**
	 * Strips the unit from a given value.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 * @param  string $value The value with or without unit.
	 * @param  string $unit_to_strip The unit to be stripped.
	 * @return string   the value without a unit.
	 */
	public static function strip_unit( $value, $unit_to_strip = 'px' ) {
		$value_length = strlen( $value );
		$unit_length  = strlen( $unit_to_strip );

		if ( $value_length > $unit_length && 0 === substr_compare( $value, $unit_to_strip, $unit_length * ( -1 ), $unit_length ) ) {
			return substr( $value, 0, $value_length - $unit_length );
		}
		return $value;
	}

	/**
	 * Get the regular expression to parse a single shortcode.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 * @param string $tagname Not used in the context of this function.
	 * @return string
	 */
	public static function get_shortcode_regex( $tagname ) {
		return '/\\['                              // Opening bracket.
			. '(\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]].
			. "($tagname)"                     // 2: Shortcode name.
			. '(?![\\w-])'                       // Not followed by word character or hyphen.
			. '('                                // 3: Unroll the loop: Inside the opening shortcode tag.
			. '[^\\]\\/]*'                   // Not a closing bracket or forward slash.
			. '(?:'
			. '\\/(?!\\])'               // A forward slash not followed by a closing bracket.
			. '[^\\]\\/]*'               // Not a closing bracket or forward slash.
			. ')*?'
			. ')'
			. '(?:'
			. '(\\/)'                        // 4: Self closing tag...
			. '\\]'                          // ...and closing bracket.
			. '|'
			. '\\]'                          // Closing bracket.
			. '(?:'
			. '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags.
			. '[^\\[]*+'             // Not an opening bracket.
			. '(?:'
			. '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag.
			. '[^\\[]*+'         // Not an opening bracket.
			. ')*+'
			. ')'
			. '\\[\\/\\2\\]'             // Closing shortcode tag.
			. ')?'
			. ')'
			. '(\\]?)/';                          // 6: Optional second closing brocket for escaping shortcodes: [[tag]].
	}

	/**
	 * Validate shortcode attribute value.
	 *
	 * @static
	 * @access public
	 * @since 1.0
	 * @param string $value         The value.
	 * @param string $accepted_unit The accepted unit.
	 * @param string $bc_support    Return value even if invalid.
	 * @return value
	 */
	public static function validate_shortcode_attr_value( $value, $accepted_unit, $bc_support = true ) {

		if ( '' !== $value ) {
			$value           = trim( $value );
			$unit            = preg_replace( '/[\d-]+/', '', $value );
			$numerical_value = preg_replace( '/[a-z,%]/', '', $value );

			if ( empty( $accepted_unit ) ) {
				return $numerical_value;
			}

			// Add unit if it's required.
			if ( empty( $unit ) ) {
				return $numerical_value . $accepted_unit;
			}

			// If unit was found use original value. BC support.
			if ( $bc_support || $unit === $accepted_unit ) {
				return $value;
			}

			return false;
		}

		return '';
	}

	/**
	 * Adds the options in the Fusion_Settings class.
	 *
	 * @access public
	 * @since 1.1.0
	 */
	public function add_options_to_fusion_settings() {

		if ( ! function_exists( 'fusion_builder_settings' ) ) {
			require_once wp_normalize_path( 'inc/class-fusion-builder-options.php' );
		}
	}

	/**
	 * Gets the value of a page option.
	 *
	 * @static
	 * @access public
	 * @param  string  $theme_option Gheme option ID.
	 * @param  string  $page_option  Page option ID.
	 * @param  integer $post_id      Post/Page ID.
	 * @since  1.0.1
	 * @return string                Gheme option or page option value.
	 */
	public static function get_page_option( $theme_option, $page_option, $post_id ) {
		$value = '';

		// If Avada is installed, use it to get the theme-option.
		if ( class_exists( 'Avada' ) ) {
			$value = fusion_get_option( $theme_option, $page_option, $post_id );
		}

		return apply_filters( 'fusion_builder_get_page_option', $value );
	}

	/**
	 * Checks if we're in the migration page.
	 * It does that by checking _GET, and then sets the $is_updating property.
	 *
	 * @access public
	 * @since 1.1.0
	 */
	public function set_is_updating() {
		if ( ! self::$is_updating && $_GET && isset( $_GET['avada_update'] ) && '1' == $_GET['avada_update'] ) { // phpcs:ignore WordPress.Security.NonceVerification, Universal.Operators.StrictComparisons.LooseEqual
			self::$is_updating = true;
		}
	}

	/**
	 * Checks if we're editing Fusion Library element.
	 *
	 * @access public
	 * @since 1.5.2
	 * @param array $classes An array of body classes.
	 * @return string
	 */
	public function admin_body_class( $classes ) {
		global $post, $typenow;

		if ( 'fusion_element' === $typenow && $post ) {
			$terms    = get_the_terms( $post->ID, 'element_category' );
			$classes .= ' fusion-builder-library-edit';

			if ( $terms ) {
				$classes .= ' fusion-element-post-type-' . $terms[0]->name . ' ';
			}
		}

		if ( 'fusion_tb_section' === $typenow && $post ) {
			$terms    = get_the_terms( $post->ID, 'fusion_tb_category' );
			$classes .= ' fusion-tb-section-edit';

			if ( $terms ) {
				$classes .= ' fusion-tb-category-' . $terms[0]->name . ' ';
			}
		}

		if ( version_compare( $GLOBALS['wp_version'], '5.5.0', '<' ) ) {
			$classes .= ' fusion-wp-core-pre-55';
		}

		if ( current_user_can( apply_filters( 'awb_role_manager_access_capability', 'manage_options', 'fusion_tb_section' ) ) ) {
			$classes .= ' show-layout-sections';
		}

		if ( ! current_user_can( apply_filters( 'awb_role_manager_access_capability', 'edit_private_posts', 'avada_library', 'global_elements' ) ) ) {
			$classes .= ' awb-global-restricted';
		}

		return $classes;
	}

	/**
	 * Adds extra classes for the <body> element, using the 'body_class' filter.
	 * Documentation: https://codex.wordpress.org/Plugin_API/Filter_Reference/body_class
	 *
	 * @since 1.1
	 * @param  array $classes CSS classes.
	 * @return array The merged and extended body classes.
	 */
	public function body_class_filter( $classes ) {
		$this->set_body_classes();
		return array_merge( $classes, $this->body_classes );
	}

	/**
	 * Calculate any extra classes for the <body> element.
	 *
	 * @return array The needed body classes.
	 */
	public function set_body_classes() {
		$classes   = [];
		$classes[] = 'fusion-image-hovers';

		if ( fusion_get_option( 'pagination_sizing' ) ) {
			$classes[] = 'fusion-pagination-sizing';
		}

		$classes[] = 'fusion-button_type-' . strtolower( fusion_get_option( 'button_type' ) );
		$classes[] = 'fusion-button_span-' . strtolower( fusion_get_option( 'button_span' ) );
		$classes[] = 'fusion-button_gradient-' . strtolower( fusion_get_option( 'button_gradient_type' ) );

		if ( fusion_get_option( 'icon_circle_image_rollover' ) ) {
			$classes[] = 'avada-image-rollover-circle-yes';
		} else {
			$classes[] = 'avada-image-rollover-circle-no';
		}
		if ( fusion_get_option( 'image_rollover' ) ) {
			$classes[] = 'avada-image-rollover-yes';
			$classes[] = 'avada-image-rollover-direction-' . fusion_get_option( 'image_rollover_direction' );
		} else {
			$classes[] = 'avada-image-rollover-no';
		}

		if ( fusion_get_option( 'button_gradient_top_color' ) !== fusion_get_option( 'button_gradient_bottom_color' ) ) {
			$classes[] = 'fusion-has-button-gradient';
		}

		if ( wp_is_mobile() && 'desktop' === fusion_library()->get_option( 'status_css_animations' ) ) {
			$classes[] = 'dont-animate';
		}

		$header = Fusion_Template_Builder()->get_override( 'header' );
		if ( $header ) {
			$position = fusion_data()->post_meta( $header->ID )->get( 'position' );
			if ( ! empty( $position ) ) {
				$classes[] = 'awbh-' . $position;
			}
		}
		return $this->body_classes = $classes;
	}

	/**
	 * Gets the fusion_builder_options_panel private property.
	 *
	 * @access public
	 * @since 1.1.0
	 * @return object
	 */
	public function get_fusion_builder_options_panel() {
		return $this->fusion_builder_options_panel;
	}

	/**
	 * Compares db and plugin versions and does stuff if needed.
	 *
	 * @access private
	 * @since 1.1.2
	 */
	private function versions_compare() {

		$db_version = get_option( 'fusion_builder_version', false );
		if ( ! $db_version || FUSION_BUILDER_VERSION !== $db_version ) {

			// Reset caches.
			$fusion_cache = new Fusion_Cache();
			$fusion_cache->reset_all_caches();

			// Allow other componenets to do their thing when FB is updated.
			do_action( 'before_fusion_builder_version_update', $db_version, FUSION_BUILDER_VERSION );

			// Update version in the database.
			update_option( 'fusion_builder_version', FUSION_BUILDER_VERSION );

			self::$is_upgrading = true;
		}
	}

	/**
	 * Compares db and plugin versions and does stuff if needed.
	 *
	 * @since 1.2.1
	 * @access private
	 * @param array $links The array of action links.
	 * @return Array The $links array plus the added settings link.
	 */
	public function add_action_settings_link( $links ) {
		$links[] = '<a href="' . admin_url( 'admin.php?page=avada-builder-options' ) . '">' . esc_html__( 'Builder Options', 'fusion-builder' ) . '</a>';

		return $links;
	}

	/**
	 * Return post types to exclude from events calendar.
	 *
	 * @since 1.3.0
	 * @access public
	 * @param array $all_post_types All allowed post types in events calendar.
	 * @return array
	 */
	public function fusion_builder_exclude_post_type( $all_post_types ) {

		unset( $all_post_types['fusion_template'] );
		unset( $all_post_types['fusion_element'] );

		return $all_post_types;
	}

	/**
	 * Adds media-query styles.
	 *
	 * @access public
	 * @since 6.0.0
	 */
	public function add_media_query_styles() {

		if ( awb_get_fusion_settings()->get( 'responsive' ) ) {
			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-max-sh-cbp',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/max-sh-cbp.min.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-sh-cbp' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-min-768-max-1024-p',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/min-768-max-1024-p.min.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-min-768-max-1024-p' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-max-640',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/max-640.min.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-640' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-max-1c',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/max-1c.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-1c' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-max-2c',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/max-2c.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-2c' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-min-2c-max-3c',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/min-2c-max-3c.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-min-2c-max-3c' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-min-3c-max-4c',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/min-3c-max-4c.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-min-3c-max-4c' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-min-4c-max-5c',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/min-4c-max-5c.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-min-4c-max-5c' ),
			];

			Fusion_Media_Query_Scripts::$media_query_assets[] = [
				'fb-min-5c-max-6c',
				FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/min-5c-max-6c.css',
				[],
				FUSION_BUILDER_VERSION,
				Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-min-5c-max-6c' ),
			];
		}
	}

	/**
	 * Add element media query styles.
	 *
	 * @access public
	 * @since 2.0
	 * @return void
	 */
	public function add_element_media_query_styles() {
		global $small_media_query, $medium_media_query, $large_media_query;

		// Visibility.
		$small_css  = '.fusion-no-small-visibility{display:none !important;}';
		$medium_css = '.fusion-no-medium-visibility{display:none !important;}';
		$large_css  = '.fusion-no-large-visibility{display:none !important;}';

		// Text align.
		$small_css .= 'body .sm-text-align-center{text-align:center !important;}';
		$small_css .= 'body .sm-text-align-left{text-align:left !important;}';
		$small_css .= 'body .sm-text-align-right{text-align:right !important;}';

		$medium_css .= 'body .md-text-align-center{text-align:center !important;}';
		$medium_css .= 'body .md-text-align-left{text-align:left !important;}';
		$medium_css .= 'body .md-text-align-right{text-align:right !important;}';

		$large_css .= 'body .lg-text-align-center{text-align:center !important;}';
		$large_css .= 'body .lg-text-align-left{text-align:left !important;}';
		$large_css .= 'body .lg-text-align-right{text-align:right !important;}';

		// Flex align.
		$small_css .= 'body .sm-flex-align-center{justify-content:center !important;}';
		$small_css .= 'body .sm-flex-align-flex-start{justify-content:flex-start !important;}';
		$small_css .= 'body .sm-flex-align-flex-end{justify-content:flex-end !important;}';

		$medium_css .= 'body .md-flex-align-center{justify-content:center !important;}';
		$medium_css .= 'body .md-flex-align-flex-start{justify-content:flex-start !important;}';
		$medium_css .= 'body .md-flex-align-flex-end{justify-content:flex-end !important;}';

		$large_css .= 'body .lg-flex-align-center{justify-content:center !important;}';
		$large_css .= 'body .lg-flex-align-flex-start{justify-content:flex-start !important;}';
		$large_css .= 'body .lg-flex-align-flex-end{justify-content:flex-end !important;}';

		// Margin auto.
		$small_css .= 'body .sm-mx-auto{margin-left:auto !important;margin-right:auto !important;}';
		$small_css .= 'body .sm-ml-auto{margin-left:auto !important;}';
		$small_css .= 'body .sm-mr-auto{margin-right:auto !important;}';

		$medium_css .= 'body .md-mx-auto{margin-left:auto !important;margin-right:auto !important;}';
		$medium_css .= 'body .md-ml-auto{margin-left:auto !important;}';
		$medium_css .= 'body .md-mr-auto{margin-right:auto !important;}';

		$large_css .= 'body .lg-mx-auto{margin-left:auto !important;margin-right:auto !important;}';
		$large_css .= 'body .lg-ml-auto{margin-left:auto !important;}';
		$large_css .= 'body .lg-mr-auto{margin-right:auto !important;}';

		// Absolute positioning.
		$absolute_css = 'position:absolute;top:auto;width:100%;';
		$small_css   .= 'body .fusion-absolute-position-small{' . $absolute_css . '}';
		$medium_css  .= 'body .fusion-absolute-position-medium{' . $absolute_css . '}';
		$large_css   .= 'body .fusion-absolute-position-large{' . $absolute_css . '}';

		// Native sticky.
		$small_css  .= '.awb-sticky.awb-sticky-small{ position: sticky; top: var(--awb-sticky-offset,0); }';
		$medium_css .= '.awb-sticky.awb-sticky-medium{ position: sticky; top: var(--awb-sticky-offset,0); }';
		$large_css  .= '.awb-sticky.awb-sticky-large{ position: sticky; top: var(--awb-sticky-offset,0); }';

		echo '<style type="text/css" id="css-fb-visibility">';
		echo wp_strip_all_tags( $small_media_query ) . '{' . $small_css . '}'; // phpcs:ignore WordPress.Security.EscapeOutput
		echo wp_strip_all_tags( $medium_media_query ) . '{' . $medium_css . '}'; // phpcs:ignore WordPress.Security.EscapeOutput
		echo wp_strip_all_tags( $large_media_query ) . '{' . $large_css . '}'; // phpcs:ignore WordPress.Security.EscapeOutput
		echo '</style>';
	}

	/**
	 * Setup the element option decsription map.
	 *
	 * @static
	 * @access public
	 * @since 2.0
	 * @return void
	 */
	public static function set_element_description_map() {
		$element_option_map = apply_filters( 'fusion_builder_map_descriptions', [] );

		// Audio.
		$element_option_map['controls_color_scheme']['fusion_audio'] = [
			'theme-option' => 'audio_controls_color_scheme',
			'type'         => 'select',
		];
		$element_option_map['progress_color']['fusion_audio']        = [
			'theme-option' => 'audio_progressbar_color',
			'reset'        => true,
		];
		$element_option_map['background_color']['fusion_audio']      = [
			'theme-option' => 'audio_background_color',
			'reset'        => true,
		];
		$element_option_map['border_color']['fusion_audio']          = [
			'theme-option' => 'audio_border_color',
			'reset'        => true,
		];
		$element_option_map['max_width']['fusion_audio']             = [
			'theme-option' => 'audio_max_width',
			'type'         => 'select',
		];
		$element_option_map['border_size']['fusion_audio']           = [
			'theme-option' => 'audio_border_size',
			'type'         => 'range',
		];
		$element_option_map['border_radius']['fusion_audio']         = [
			'theme-option' => 'audio_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];

		// Alert.
		$element_option_map['text_align']['fusion_alert']             = [
			'theme-option' => 'alert_box_text_align',
			'type'         => 'select',
		];
		$element_option_map['text_transform']['fusion_alert']         = [
			'theme-option' => 'alert_box_text_transform',
			'type'         => 'select',
		];
		$element_option_map['link_color_inheritance']['fusion_alert'] = [
			'theme-option' => 'alert_box_link_color_inheritance',
			'type'         => 'select',
		];
		$element_option_map['dismissable']['fusion_alert']            = [
			'theme-option' => 'alert_box_dismissable',
			'type'         => 'select',
		];
		$element_option_map['box_shadow']['fusion_alert']             = [
			'theme-option' => 'alert_box_shadow',
			'type'         => 'select',
		];
		$element_option_map['border_size']['fusion_alert']            = [
			'theme-option' => 'alert_border_size',
			'type'         => 'range',
		];

		// Blog.
		$element_option_map['blog_grid_columns']['fusion_blog']         = [
			'theme-option' => 'blog_grid_columns',
			'type'         => 'range',
		];
		$element_option_map['blog_grid_column_spacing']['fusion_blog']  = [
			'theme-option' => 'blog_grid_column_spacing',
			'type'         => 'range',
		];
		$element_option_map['grid_box_color']['fusion_blog']            = [
			'theme-option' => 'timeline_bg_color',
			'reset'        => true,
		];
		$element_option_map['grid_element_color']['fusion_blog']        = [
			'theme-option' => 'timeline_color',
			'reset'        => true,
		];
		$element_option_map['grid_separator_style_type']['fusion_blog'] = [
			'theme-option' => 'grid_separator_style_type',
			'type'         => 'select',
		];
		$element_option_map['grid_separator_color']['fusion_blog']      = [
			'theme-option' => 'grid_separator_color',
			'reset'        => true,
		];
		$element_option_map['blog_grid_padding']['fusion_blog']         = [
			'theme-option' => 'blog_grid_padding',
			'subset'       => [ 'top', 'left', 'bottom', 'right' ],
		];
		$element_option_map['excerpt']['fusion_blog']                   = [
			'theme-option' => 'blog_excerpt',
			'type'         => 'select',
		];
		$element_option_map['excerpt_length']['fusion_blog']            = [
			'theme-option' => 'blog_excerpt_length',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['blog_masonry_grid_ratio']['fusion_blog']   = [
			'theme-option' => 'masonry_grid_ratio',
			'type'         => 'range',
		];
		$element_option_map['blog_masonry_width_double']['fusion_blog'] = [
			'theme-option' => 'masonry_width_double',
			'type'         => 'range',
		];

		// Breadcrumbs.
		$element_option_map['prefix']['fusion_breadcrumbs']            = [ 'theme-option' => 'breacrumb_prefix' ];
		$element_option_map['separator']['fusion_breadcrumbs']         = [ 'theme-option' => 'breadcrumb_separator' ];
		$element_option_map['font_size']['fusion_breadcrumbs']         = [ 'theme-option' => 'breadcrumbs_font_size' ];
		$element_option_map['text_color']['fusion_breadcrumbs']        = [
			'theme-option' => 'breadcrumbs_text_color',
			'reset'        => true,
		];
		$element_option_map['text_hover_color']['fusion_breadcrumbs']  = [
			'theme-option' => 'breadcrumbs_text_hover_color',
			'reset'        => true,
		];
		$element_option_map['show_categories']['fusion_breadcrumbs']   = [
			'theme-option' => 'breadcrumb_show_categories',
			'type'         => 'yesno',
		];
		$element_option_map['post_type_archive']['fusion_breadcrumbs'] = [
			'theme-option' => 'breadcrumb_show_post_type_archive',
			'type'         => 'yesno',
		];
		$element_option_map['show_leaf']['fusion_breadcrumbs']         = [
			'theme-option' => 'breadcrumb_show_leaf',
			'type'         => 'yesno',
		];
		$element_option_map['bold_last']['fusion_breadcrumbs']         = [
			'theme-option' => 'breadcrumb_bold_last_item',
			'type'         => 'yesno',
		];

		// Button.
		$element_option_map['stretch']['fusion_button']                            = [
			'theme-option' => 'button_span',
			'type'         => 'select',
		];
		$element_option_map['type']['fusion_button']                               = [
			'theme-option' => 'button_type',
			'type'         => 'select',
		];
		$element_option_map['button_gradient_top_color']['fusion_button']          = [
			'theme-option' => 'button_gradient_top_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom_color']['fusion_button']       = [
			'theme-option' => 'button_gradient_bottom_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_top_color_hover']['fusion_button']    = [
			'theme-option' => 'button_gradient_top_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom_color_hover']['fusion_button'] = [
			'theme-option' => 'button_gradient_bottom_color_hover',
			'reset'        => true,
		];
		$element_option_map['accent_color']['fusion_button']                       = [
			'theme-option' => 'button_accent_color',
			'reset'        => true,
		];
		$element_option_map['accent_hover_color']['fusion_button']                 = [
			'theme-option' => 'button_accent_hover_color',
			'reset'        => true,
		];
		$element_option_map['bevel_color']['fusion_button']                        = [
			'theme-option' => 'button_bevel_color',
			'reset'        => true,
		];
		$element_option_map['bevel_color_hover']['fusion_button']                  = [
			'theme-option' => 'button_bevel_color_hover',
			'reset'        => true,
		];
		$element_option_map['border_color']['fusion_button']                       = [
			'theme-option' => 'button_border_color',
			'reset'        => true,
		];
		$element_option_map['border_hover_color']['fusion_button']                 = [
			'theme-option' => 'button_border_hover_color',
			'reset'        => true,
		];
		$element_option_map['border_width']['fusion_button']                       = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['border_radius']['fusion_button']                      = [
			'theme-option' => 'button_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];
		$element_option_map['text_transform']['fusion_button']                     = [
			'theme-option' => 'button_text_transform',
			'type'         => 'select',
		];
		$element_option_map['gradient_start_position']['fusion_button']            = [
			'theme-option' => 'button_gradient_start',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['gradient_end_position']['fusion_button']              = [
			'theme-option' => 'button_gradient_end',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['gradient_type']['fusion_button']                      = [
			'theme-option' => 'button_gradient_type',
			'type'         => 'select',
		];
		$element_option_map['radial_direction']['fusion_button']                   = [
			'theme-option' => 'button_radial_direction',
			'type'         => 'select',
		];
		$element_option_map['linear_angle']['fusion_button']                       = [
			'theme-option' => 'button_gradient_angle',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['font_size']['fusion_button']                          = [
			'theme-option' => 'button_font_size',
			'type'         => 'textfield',
		];
		$element_option_map['line_height']['fusion_button']                        = [
			'theme-option' => 'button_line_height',
			'type'         => 'textfield',
		];
		$element_option_map['padding']['fusion_button']                            = [
			'theme-option' => 'button_padding',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['button_font']['fusion_button']                        = [
			'theme-option' => 'button_typography',
			'subset'       => 'font-family',
		];
		$element_option_map['letter_spacing']['fusion_button']                     = [
			'theme-option' => 'button_typography',
			'subset'       => 'letter-spacing',
		];

		$element_option_map['button_fullwidth']['fusion_login']           = [
			'theme-option' => 'button_span',
			'type'         => 'yesno',
		];
		$element_option_map['button_fullwidth']['fusion_register']        = [
			'theme-option' => 'button_span',
			'type'         => 'yesno',
		];
		$element_option_map['button_fullwidth']['fusion_lost_password']   = [
			'theme-option' => 'button_span',
			'type'         => 'yesno',
		];
		$element_option_map['button_type']['fusion_tagline_box']          = [
			'theme-option' => 'button_type',
			'type'         => 'select',
		];
		$element_option_map['button_border_radius']['fusion_tagline_box'] = [
			'theme-option' => 'button_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];

		// Checklist.
		$element_option_map['iconcolor']['fusion_checklist']        = [
			'theme-option' => 'checklist_icons_color',
			'reset'        => true,
		];
		$element_option_map['circle']['fusion_checklist']           = [
			'theme-option' => 'checklist_circle',
			'type'         => 'yesno',
		];
		$element_option_map['circlecolor']['fusion_checklist']      = [
			'theme-option' => 'checklist_circle_color',
			'reset'        => true,
		];
		$element_option_map['divider']['fusion_checklist']          = [
			'theme-option' => 'checklist_divider',
			'type'         => 'select',
		];
		$element_option_map['divider_color']['fusion_checklist']    = [
			'theme-option' => 'checklist_divider_color',
			'reset'        => true,
		];
		$element_option_map['size']['fusion_checklist']             = [
			'theme-option' => 'checklist_item_size',
		];
		$element_option_map['odd_row_bgcolor']['fusion_checklist']  = [
			'theme-option' => 'checklist_odd_row_bgcolor',
			'reset'        => true,
		];
		$element_option_map['even_row_bgcolor']['fusion_checklist'] = [
			'theme-option' => 'checklist_even_row_bgcolor',
			'reset'        => true,
		];
		$element_option_map['item_padding']['fusion_checklist']     = [
			'theme-option' => 'checklist_item_padding',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['textcolor']['fusion_checklist']        = [
			'theme-option' => 'checklist_text_color',
			'reset'        => true,
		];

		// Columns.
		$element_option_map['dimension_margin']['fusion_builder_column']       = [
			'theme-option' => 'col_margin',
			'subset'       => [ 'top', 'bottom' ],
		];
		$element_option_map['dimension_margin']['fusion_builder_column_inner'] = [
			'theme-option' => 'col_margin',
			'subset'       => [ 'top', 'bottom' ],
		];

		// Container.
		$element_option_map['background_color']['fusion_builder_container']        = [
			'theme-option' => 'full_width_bg_color',
			'reset'        => true,
		];
		$element_option_map['gradient_start_color']['fusion_builder_container']    = [
			'theme-option' => 'full_width_gradient_start_color',
			'reset'        => true,
		];
		$element_option_map['gradient_end_color']['fusion_builder_container']      = [
			'theme-option' => 'full_width_gradient_end_color',
			'reset'        => true,
		];
		$element_option_map['full_width_border_sizes']['fusion_builder_container'] = [
			'theme-option' => 'full_width_border_sizes',
			'subset'       => [ 'top', 'left', 'bottom', 'right' ],
		];
		$element_option_map['border_sizes']['fusion_builder_container']            = [
			'theme-option' => 'full_width_border_sizes',
			'subset'       => [ 'top', 'left', 'bottom', 'right' ],
		];
		$element_option_map['border_color']['fusion_builder_container']            = [
			'theme-option' => 'full_width_border_color',
			'reset'        => true,
		];
		$element_option_map['link_color']['fusion_builder_container']              = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['link_hover_color']['fusion_builder_container']        = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];

		// Content Box.
		$element_option_map['backgroundcolor']['fusion_content_boxes']        = [
			'theme-option' => 'content_box_bg_color',
			'reset'        => true,
		];
		$element_option_map['title_size']['fusion_content_boxes']             = [ 'theme-option' => 'content_box_title_size' ];
		$element_option_map['title_color']['fusion_content_boxes']            = [
			'theme-option' => 'content_box_title_color',
			'reset'        => true,
		];
		$element_option_map['body_color']['fusion_content_boxes']             = [
			'theme-option' => 'content_box_body_color',
			'reset'        => true,
		];
		$element_option_map['icon_size']['fusion_content_boxes']              = [
			'theme-option' => 'content_box_icon_size',
			'reset'        => true,
		];
		$element_option_map['iconcolor']['fusion_content_boxes']              = [
			'theme-option' => 'content_box_icon_color',
			'reset'        => true,
		];
		$element_option_map['icon_circle']['fusion_content_boxes']            = [
			'theme-option' => 'content_box_icon_circle',
			'type'         => 'select',
		];
		$element_option_map['icon_circle_radius']['fusion_content_boxes']     = [ 'theme-option' => 'content_box_icon_circle_radius' ];
		$element_option_map['circlecolor']['fusion_content_boxes']            = [
			'theme-option' => 'content_box_icon_bg_color',
			'reset'        => true,
		];
		$element_option_map['circlebordercolor']['fusion_content_boxes']      = [
			'theme-option' => 'content_box_icon_bg_inner_border_color',
			'reset'        => true,
		];
		$element_option_map['outercirclebordercolor']['fusion_content_boxes'] = [
			'theme-option' => 'content_box_icon_bg_outer_border_color',
			'reset'        => true,
		];
		$element_option_map['circlebordersize']['fusion_content_boxes']       = [
			'theme-option' => 'content_box_icon_bg_inner_border_size',
			'type'         => 'range',
		];
		$element_option_map['outercirclebordersize']['fusion_content_boxes']  = [
			'theme-option' => 'content_box_icon_bg_outer_border_size',
			'type'         => 'range',
		];
		$element_option_map['icon_hover_type']['fusion_content_boxes']        = [
			'theme-option' => 'content_box_icon_hover_type',
			'type'         => 'select',
		];
		$element_option_map['button_span']['fusion_content_boxes']            = [
			'theme-option' => 'content_box_button_span',
			'reset'        => true,
			'type'         => 'select',
		];
		$element_option_map['hover_accent_color']['fusion_content_boxes']     = [
			'theme-option' => 'content_box_hover_animation_accent_color',
			'reset'        => true,
		];
		$element_option_map['link_type']['fusion_content_boxes']              = [
			'theme-option' => 'content_box_link_type',
			'type'         => 'select',
		];
		$element_option_map['link_area']['fusion_content_boxes']              = [
			'theme-option' => 'content_box_link_area',
			'type'         => 'select',
		];
		$element_option_map['link_target']['fusion_content_boxes']            = [
			'theme-option' => 'content_box_link_target',
			'type'         => 'select',
		];
		$element_option_map['margin_top']['fusion_content_boxes']             = [
			'theme-option' => 'content_box_margin',
			'subset'       => 'top',
		];
		$element_option_map['dimensions']['fusion_content_boxes']             = [
			'theme-option' => 'content_box_margin',
			'subset'       => [ 'top', 'bottom' ],
		];
		$element_option_map['backgroundcolor']['fusion_content_box']          = [
			'theme-option' => 'content_box_bg_color',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['iconcolor']['fusion_content_box']                = [
			'theme-option' => 'content_box_icon_color',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['icon_circle_radius']['fusion_content_box']       = [
			'theme-option' => 'content_box_icon_circle_radius',
			'type'         => 'child',
		];
		$element_option_map['circlecolor']['fusion_content_box']              = [
			'theme-option' => 'content_box_icon_bg_color',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['circlebordercolor']['fusion_content_box']        = [
			'theme-option' => 'content_box_icon_bg_inner_border_color',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['outercirclebordercolor']['fusion_content_box']   = [
			'theme-option' => 'content_box_icon_bg_outer_border_color',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['circlebordersize']['fusion_content_box']         = [
			'theme-option' => 'content_box_icon_bg_inner_border_size',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['outercirclebordersize']['fusion_content_box']    = [
			'theme-option' => 'content_box_icon_bg_outer_border_size',
			'type'         => 'child',
			'reset'        => true,
		];

		// Countdown.
		$element_option_map['timezone']['fusion_countdown']              = [
			'theme-option' => 'countdown_timezone',
			'type'         => 'select',
		];
		$element_option_map['layout']['fusion_countdown']                = [
			'theme-option' => 'countdown_layout',
			'type'         => 'select',
		];
		$element_option_map['show_weeks']['fusion_countdown']            = [
			'theme-option' => 'countdown_show_weeks',
			'type'         => 'select',
		];
		$element_option_map['label_position']['fusion_countdown']        = [
			'theme-option' => 'countdown_label_position',
			'type'         => 'select',
		];
		$element_option_map['background_color']['fusion_countdown']      = [
			'theme-option' => 'countdown_background_color',
			'reset'        => true,
		];
		$element_option_map['background_image']['fusion_countdown']      = [
			'theme-option' => 'countdown_background_image',
			'subset'       => 'thumbnail',
		];
		$element_option_map['background_repeat']['fusion_countdown']     = [
			'theme-option' => 'countdown_background_repeat',
		];
		$element_option_map['background_position']['fusion_countdown']   = [
			'theme-option' => 'countdown_background_position',
		];
		$element_option_map['counter_box_spacing']['fusion_countdown']   = [
			'theme-option' => 'countdown_counter_box_spacing',
		];
		$element_option_map['counter_box_color']['fusion_countdown']     = [
			'theme-option' => 'countdown_counter_box_color',
			'reset'        => true,
		];
		$element_option_map['counter_padding']['fusion_countdown']       = [
			'theme-option' => 'countdown_counter_padding',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['counter_border_size']['fusion_countdown']   = [
			'theme-option' => 'countdown_counter_border_size',
			'type'         => 'range',
		];
		$element_option_map['counter_border_color']['fusion_countdown']  = [
			'theme-option' => 'countdown_counter_border_color',
			'reset'        => true,
		];
		$element_option_map['counter_border_radius']['fusion_countdown'] = [
			'theme-option' => 'countdown_counter_border_radius',
		];
		$element_option_map['counter_font_size']['fusion_countdown']     = [
			'theme-option' => 'countdown_counter_font_size',
		];
		$element_option_map['counter_text_color']['fusion_countdown']    = [
			'theme-option' => 'countdown_counter_text_color',
			'reset'        => true,
		];
		$element_option_map['label_font_size']['fusion_countdown']       = [
			'theme-option' => 'countdown_label_font_size',
		];
		$element_option_map['label_color']['fusion_countdown']           = [
			'theme-option' => 'countdown_label_color',
			'reset'        => true,
		];
		$element_option_map['heading_font_size']['fusion_countdown']     = [
			'theme-option' => 'countdown_heading_font_size',
		];
		$element_option_map['heading_text_color']['fusion_countdown']    = [
			'theme-option' => 'countdown_heading_text_color',
			'reset'        => true,
		];
		$element_option_map['subheading_font_size']['fusion_countdown']  = [
			'theme-option' => 'countdown_subheading_font_size',
		];
		$element_option_map['subheading_text_color']['fusion_countdown'] = [
			'theme-option' => 'countdown_subheading_text_color',
			'reset'        => true,
		];
		$element_option_map['link_text_color']['fusion_countdown']       = [
			'theme-option' => 'countdown_link_text_color',
			'reset'        => true,
		];
		$element_option_map['link_target']['fusion_countdown']           = [
			'theme-option' => 'countdown_link_target',
			'type'         => 'select',
		];

		// Counter box.
		$element_option_map['color']['fusion_counters_box']        = [
			'theme-option' => 'counter_box_color',
			'reset'        => true,
		];
		$element_option_map['title_size']['fusion_counters_box']   = [
			'theme-option' => 'counter_box_title_size',
			'reset'        => true,
			'type'         => 'range',
		];
		$element_option_map['icon_size']['fusion_counters_box']    = [
			'theme-option' => 'counter_box_icon_size',
			'reset'        => true,
			'type'         => 'range',
		];
		$element_option_map['body_color']['fusion_counters_box']   = [
			'theme-option' => 'counter_box_body_color',
			'reset'        => true,
		];
		$element_option_map['body_size']['fusion_counters_box']    = [
			'theme-option' => 'counter_box_body_size',
			'reset'        => true,
			'type'         => 'range',
		];
		$element_option_map['border_color']['fusion_counters_box'] = [
			'theme-option' => 'counter_box_border_color',
			'reset'        => true,
		];
		$element_option_map['icon_top']['fusion_counters_box']     = [
			'theme-option' => 'counter_box_icon_top',
			'type'         => 'yesno',
		];

		// TB Comments.
		$element_option_map['border_size']['fusion_tb_comments']      = [
			'theme-option' => 'separator_border_size',
			'type'         => 'range',
		];
		$element_option_map['border_color']['fusion_tb_comments']     = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['link_color']['fusion_tb_comments']       = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['link_hover_color']['fusion_tb_comments'] = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['text_color']['fusion_tb_comments']       = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['meta_color']['fusion_tb_comments']       = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];

		// Counter Circle.
		$element_option_map['filledcolor']['fusion_counter_circle']   = [
			'theme-option' => 'counter_filled_color',
			'reset'        => true,
		];
		$element_option_map['unfilledcolor']['fusion_counter_circle'] = [
			'theme-option' => 'counter_unfilled_color',
			'reset'        => true,
		];

		// Dropcap.
		$element_option_map['color']['fusion_dropcap'] = [
			'theme-option' => 'dropcap_color',
			'shortcode'    => 'fusion_dropcap',
			'reset'        => true,
		];

		// Events.
		$element_option_map['number_posts']['fusion_events'] = [
			'theme-option' => 'events_per_page',
			'type'         => 'range',
		];

		$element_option_map['column_spacing']['fusion_events'] = [
			'theme-option' => 'events_column_spacing',
			'type'         => 'range',
		];

		$element_option_map['content_padding']['fusion_events'] = [
			'theme-option' => 'events_content_padding',
			'subset'       => [ 'top', 'left', 'bottom', 'right' ],
		];

		$element_option_map['content_length']['fusion_events'] = [
			'theme-option' => 'events_content_length',
			'type'         => 'select',
		];

		$element_option_map['excerpt_length']['fusion_events'] = [
			'theme-option' => 'excerpt_length_events',
			'type'         => 'range',
		];

		$element_option_map['strip_html']['fusion_events'] = [
			'theme-option' => 'events_strip_html_excerpt',
			'type'         => 'yesno',
		];

		// Flipboxes.
		$element_option_map['flip_direction']['fusion_flip_boxes'] = [
			'theme-option' => 'flip_boxes_flip_direction',
			'type'         => 'select',
		];
		$element_option_map['flip_direction']['fusion_flip_box']   = [
			'theme-option' => 'flip_boxes_flip_direction',
			'type'         => 'child',
		];
		$element_option_map['flip_effect']['fusion_flip_boxes']    = [
			'theme-option' => 'flip_boxes_flip_effect',
			'type'         => 'select',
		];
		$element_option_map['flip_duration']['fusion_flip_boxes']  = [
			'theme-option' => 'flip_boxes_flip_duration',
			'type'         => 'range',
		];
		$element_option_map['equal_heights']['fusion_flip_boxes']  = [
			'theme-option' => 'flip_boxes_equal_heights',
			'type'         => 'select',
		];

		$element_option_map['icon_color']['fusion_flip_boxes']           = [
			'theme-option' => 'icon_color',
			'reset'        => true,
		];
		$element_option_map['circle_color']['fusion_flip_boxes']         = [
			'theme-option' => 'icon_circle_color',
			'reset'        => true,
		];
		$element_option_map['circle_border_color']['fusion_flip_boxes']  = [
			'theme-option' => 'icon_border_color',
			'reset'        => true,
		];
		$element_option_map['background_color_front']['fusion_flip_box'] = [
			'theme-option' => 'flip_boxes_front_bg',
			'reset'        => true,
		];
		$element_option_map['title_front_color']['fusion_flip_box']      = [
			'theme-option' => 'flip_boxes_front_heading',
			'reset'        => true,
		];
		$element_option_map['text_front_color']['fusion_flip_box']       = [
			'theme-option' => 'flip_boxes_front_text',
			'reset'        => true,
		];
		$element_option_map['background_color_back']['fusion_flip_box']  = [
			'theme-option' => 'flip_boxes_back_bg',
			'reset'        => true,
		];
		$element_option_map['title_back_color']['fusion_flip_box']       = [
			'theme-option' => 'flip_boxes_back_heading',
			'reset'        => true,
		];
		$element_option_map['text_back_color']['fusion_flip_box']        = [
			'theme-option' => 'flip_boxes_back_text',
			'reset'        => true,
		];
		$element_option_map['border_size']['fusion_flip_box']            = [
			'theme-option' => 'flip_boxes_border_size',
			'type'         => 'range',
		];
		$element_option_map['border_color']['fusion_flip_box']           = [ 'theme-option' => 'flip_boxes_border_color' ];
		$element_option_map['border_radius']['fusion_flip_box']          = [ 'theme-option' => 'flip_boxes_border_radius' ];
		$element_option_map['circle_color']['fusion_flip_box']           = [
			'theme-option' => 'icon_circle_color',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['circle_border_color']['fusion_flip_box']    = [
			'theme-option' => 'icon_border_color',
			'type'         => 'child',
			'reset'        => true,
		];
		$element_option_map['icon_color']['fusion_flip_box']             = [
			'theme-option' => 'icon_color',
			'type'         => 'child',
			'reset'        => true,
		];

		// Google Map element.
		$element_option_map['api_type']['fusion_map'] = [
			'theme-option' => 'google_map_api_type',
			'type'         => 'select',
		];

		// Icon Element.
		$element_option_map['size']['fusion_fontawesome']                    = [
			'theme-option' => 'icon_size',
			'reset'        => true,
		];
		$element_option_map['circle']['fusion_fontawesome']                  = [
			'theme-option' => 'icon_circle',
			'reset'        => 'yesno',
		];
		$element_option_map['circlecolor']['fusion_fontawesome']             = [
			'theme-option' => 'icon_circle_color',
			'reset'        => true,
		];
		$element_option_map['circlecolor_hover']['fusion_fontawesome']       = [
			'theme-option' => 'icon_circle_color_hover',
			'reset'        => true,
		];
		$element_option_map['circlebordersize']['fusion_fontawesome']        = [
			'theme-option' => 'icon_border_size',
			'reset'        => true,
		];
		$element_option_map['circlebordercolor']['fusion_fontawesome']       = [
			'theme-option' => 'icon_border_color',
			'reset'        => true,
		];
		$element_option_map['circlebordercolor_hover']['fusion_fontawesome'] = [
			'theme-option' => 'icon_border_color_hover',
			'reset'        => true,
		];
		$element_option_map['iconcolor']['fusion_fontawesome']               = [
			'theme-option' => 'icon_color',
			'reset'        => true,
		];
		$element_option_map['iconcolor_hover']['fusion_fontawesome']         = [
			'theme-option' => 'icon_color_hover',
			'reset'        => true,
		];
		$element_option_map['icon_hover_type']['fusion_fontawesome']         = [
			'theme-option' => 'icon_hover_type',
			'type'         => 'select',
		];
		$element_option_map['border_radius']['fusion_fontawesome']           = [
			'theme-option' => 'icon_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];

		// Image.
		$element_option_map['style_type']['fusion_imageframe'] = [ 'theme-option' => 'imageframe_style_type' ];

		$element_option_map['blur']['fusion_imageframe']         = [
			'theme-option' => 'imageframe_blur',
			'type'         => 'range',
		];
		$element_option_map['stylecolor']['fusion_imageframe']   = [
			'theme-option' => 'imgframe_style_color',
			'reset'        => true,
		];
		$element_option_map['bordersize']['fusion_imageframe']   = [
			'theme-option' => 'imageframe_border_size',
			'type'         => 'range',
		];
		$element_option_map['bordercolor']['fusion_imageframe']  = [
			'theme-option' => 'imgframe_border_color',
			'reset'        => true,
		];
		$element_option_map['borderradius']['fusion_imageframe'] = [ 'theme-option' => 'imageframe_border_radius' ];

		$element_option_map['lightbox']['fusion_imageframe'] = [
			'theme-option' => 'status_lightbox',
			'type'         => 'yesno',
		];

		// Image Before & After.
		$element_option_map['type']['fusion_image_before_after']            = [
			'theme-option' => 'before_after_type',
			'type'         => 'select',
		];
		$element_option_map['font_size']['fusion_image_before_after']       = [
			'theme-option' => 'before_after_font_size',
			'type'         => 'range',
		];
		$element_option_map['accent_color']['fusion_image_before_after']    = [
			'theme-option' => 'before_after_accent_color',
			'reset'        => true,
		];
		$element_option_map['label_placement']['fusion_image_before_after'] = [
			'theme-option' => 'before_after_label_placement',
			'type'         => 'select',
		];
		$element_option_map['handle_type']['fusion_image_before_after']     = [
			'theme-option' => 'before_after_handle_type',
			'type'         => 'select',
		];
		$element_option_map['handle_color']['fusion_image_before_after']    = [
			'theme-option' => 'before_after_handle_color',
			'reset'        => true,
		];
		$element_option_map['handle_bg']['fusion_image_before_after']       = [
			'theme-option' => 'before_after_handle_bg',
			'reset'        => true,
		];
		$element_option_map['transition_time']['fusion_image_before_after'] = [
			'theme-option' => 'before_after_transition_time',
			'type'         => 'range',
		];
		$element_option_map['offset']['fusion_image_before_after']          = [
			'theme-option' => 'before_after_offset',
			'type'         => 'range',
		];
		$element_option_map['orientation']['fusion_image_before_after']     = [
			'theme-option' => 'before_after_orientation',
			'type'         => 'select',
		];
		$element_option_map['handle_movement']['fusion_image_before_after'] = [
			'theme-option' => 'before_after_handle_movement',
			'type'         => 'select',
		];
		$element_option_map['bordersize']['fusion_image_before_after']      = [
			'theme-option' => 'before_after_border_size',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['bordercolor']['fusion_image_before_after']     = [
			'theme-option' => 'before_after_border_color',
			'reset'        => true,
		];
		$element_option_map['borderradius']['fusion_image_before_after']    = [ 'theme-option' => 'before_after_border_radius' ];

		// Modal.
		$element_option_map['background']['fusion_modal']   = [
			'theme-option' => 'modal_bg_color',
			'reset'        => true,
		];
		$element_option_map['border_color']['fusion_modal'] = [
			'theme-option' => 'modal_border_color',
			'reset'        => true,
		];

		// TB Pagination.
		$element_option_map['border_color']['fusion_tb_pagination']       = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['font_size']['fusion_tb_pagination']          = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['text_color']['fusion_tb_pagination']         = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['text_hover_color']['fusion_tb_pagination']   = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['preview_font_size']['fusion_tb_pagination']  = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['preview_text_color']['fusion_tb_pagination'] = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];

		// TB Meta.
		$element_option_map['border_color']['fusion_tb_meta']      = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['item_border_color']['fusion_tb_meta'] = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['font_size']['fusion_tb_meta']         = [
			'theme-option' => 'meta_font_size',
		];
		$element_option_map['text_color']['fusion_tb_meta']        = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['text_hover_color']['fusion_tb_meta']  = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];

		// Person.
		$element_option_map['background_color']['fusion_person']              = [
			'theme-option' => 'person_background_color',
			'reset'        => true,
		];
		$element_option_map['pic_style']['fusion_person']                     = [ 'theme-option' => 'person_pic_style' ];
		$element_option_map['pic_style_blur']['fusion_person']                = [
			'theme-option' => 'person_pic_style_blur',
			'type'         => 'range',
		];
		$element_option_map['pic_style_color']['fusion_person']               = [
			'theme-option' => 'person_style_color',
			'reset'        => true,
		];
		$element_option_map['pic_bordercolor']['fusion_person']               = [
			'theme-option' => 'person_border_color',
			'reset'        => true,
		];
		$element_option_map['pic_bordersize']['fusion_person']                = [
			'theme-option' => 'person_border_size',
			'type'         => 'range',
		];
		$element_option_map['pic_borderradius']['fusion_person']              = [ 'theme-option' => 'person_border_radius' ];
		$element_option_map['pic_style_color']['fusion_person']               = [
			'theme-option' => 'person_style_color',
			'reset'        => true,
		];
		$element_option_map['content_alignment']['fusion_person']             = [
			'theme-option' => 'person_alignment',
			'type'         => 'select',
		];
		$element_option_map['icon_position']['fusion_person']                 = [
			'theme-option' => 'person_icon_position',
			'type'         => 'select',
		];
		$element_option_map['social_icon_colors']['fusion_person']            = [ 'theme-option' => 'social_links_icon_color' ];
		$element_option_map['social_box_colors']['fusion_person']             = [ 'theme-option' => 'social_links_box_color' ];
		$element_option_map['social_box_border_color']['fusion_person']       = [ 'theme-option' => 'social_links_border_color' ];
		$element_option_map['social_icon_colors_hover']['fusion_person']      = [ 'theme-option' => 'social_links_icon_color_hover' ];
		$element_option_map['social_box_colors_hover']['fusion_person']       = [ 'theme-option' => 'social_links_box_color_hover' ];
		$element_option_map['social_box_border_color_hover']['fusion_person'] = [ 'theme-option' => 'social_links_border_color_hover' ];

		$element_option_map['social_icon_boxed_radius']['fusion_person'] = [ 'theme-option' => 'social_links_boxed_radius' ];

		$element_option_map['social_icon_tooltip']['fusion_person'] = [
			'theme-option' => 'social_links_tooltip_placement',
			'type'         => 'select',
		];

		$element_option_map['margin']['fusion_person']        = [
			'theme-option' => 'social_links_margin',
		];
		$element_option_map['margin_top']['fusion_person']    = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'top',
		];
		$element_option_map['margin_right']['fusion_person']  = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'right',
		];
		$element_option_map['margin_bottom']['fusion_person'] = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'bottom',
		];
		$element_option_map['margin_left']['fusion_person']   = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'left',
		];

		$element_option_map['box_border']['fusion_person'] = [
			'theme-option' => 'social_links_border',
		];

		// Popover.
		$element_option_map['title_bg_color']['fusion_popover']   = [
			'theme-option' => 'popover_heading_bg_color',
			'reset'        => true,
		];
		$element_option_map['content_bg_color']['fusion_popover'] = [
			'theme-option' => 'popover_content_bg_color',
			'reset'        => true,
		];
		$element_option_map['bordercolor']['fusion_popover']      = [
			'theme-option' => 'popover_border_color',
			'reset'        => true,
		];
		$element_option_map['textcolor']['fusion_popover']        = [
			'theme-option' => 'popover_text_color',
			'reset'        => true,
		];
		$element_option_map['placement']['fusion_popover']        = [
			'theme-option' => 'popover_placement',
			'type'         => 'select',
		];

		// Post cards.
		$element_option_map['filters_color']['fusion_post_cards']              = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['filters_border_color']['fusion_post_cards']       = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['filters_hover_color']['fusion_post_cards']        = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['filters_active_color']['fusion_post_cards']       = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['active_filter_border_color']['fusion_post_cards'] = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['arrow_bgcolor']['fusion_post_cards']              = [
			'theme-option' => 'carousel_nav_color',
			'reset'        => true,
		];
		$element_option_map['arrow_hover_bgcolor']['fusion_post_cards']        = [
			'theme-option' => 'carousel_hover_color',
			'reset'        => true,
		];
		$element_option_map['dots_color']['fusion_post_cards']                 = [
			'theme-option' => 'carousel_nav_color',
			'reset'        => true,
		];
		$element_option_map['dots_active_color']['fusion_post_cards']          = [
			'theme-option' => 'carousel_hover_color',
			'reset'        => true,
		];
		$element_option_map['arrow_size']['fusion_post_cards']                 = [
			'theme-option' => 'slider_arrow_size',
			'reset'        => true,
		];
		$element_option_map['arrow_box']['fusion_post_cards']                  = [
			'theme-option' => 'slider_nav_box_dimensions',
			'subset'       => [ 'width', 'height' ],
		];

		// Post Card Archives.
		$element_option_map['arrow_bgcolor']['fusion_tb_post_card_archives']       = [
			'theme-option' => 'carousel_nav_color',
			'reset'        => true,
		];
		$element_option_map['arrow_hover_bgcolor']['fusion_tb_post_card_archives'] = [
			'theme-option' => 'carousel_hover_color',
			'reset'        => true,
		];
		$element_option_map['dots_color']['fusion_tb_post_card_archives']          = [
			'theme-option' => 'carousel_nav_color',
			'reset'        => true,
		];
		$element_option_map['dots_active_color']['fusion_tb_post_card_archives']   = [
			'theme-option' => 'carousel_hover_color',
			'reset'        => true,
		];
		$element_option_map['arrow_size']['fusion_tb_post_card_archives']          = [
			'theme-option' => 'slider_arrow_size',
			'reset'        => true,
		];
		$element_option_map['arrow_box']['fusion_tb_post_card_archives']           = [
			'theme-option' => 'slider_nav_box_dimensions',
			'subset'       => [ 'width', 'height' ],
		];

		// Pricing table.
		$element_option_map['backgroundcolor']['fusion_pricing_table']        = [
			'theme-option' => 'pricing_bg_color',
			'reset'        => true,
		];
		$element_option_map['background_color_hover']['fusion_pricing_table'] = [
			'theme-option' => 'pricing_background_color_hover',
			'reset'        => true,
		];
		$element_option_map['bordercolor']['fusion_pricing_table']            = [
			'theme-option' => 'pricing_border_color',
			'reset'        => true,
		];
		$element_option_map['dividercolor']['fusion_pricing_table']           = [
			'theme-option' => 'pricing_divider_color',
			'reset'        => true,
		];
		$element_option_map['heading_color_style_1']['fusion_pricing_table']  = [
			'theme-option' => 'full_boxed_pricing_box_heading_color',
			'reset'        => true,
		];
		$element_option_map['heading_color_style_2']['fusion_pricing_table']  = [
			'theme-option' => 'sep_pricing_box_heading_color',
			'reset'        => true,
		];
		$element_option_map['pricing_color']['fusion_pricing_table']          = [
			'theme-option' => 'pricing_box_color',
			'reset'        => true,
		];
		$element_option_map['body_text_color']['fusion_pricing_table']        = [
			'theme-option' => 'body_typography',
			'reset'        => true,
			'subset'       => 'color',
		];

		// Progress bar.
		$element_option_map['dimensions']['fusion_progress']        = [ 'theme-option' => 'progressbar_height' ];
		$element_option_map['text_position']['fusion_progress']     = [
			'theme-option' => 'progressbar_text_position',
			'type'         => 'select',
		];
		$element_option_map['filledcolor']['fusion_progress']       = [
			'theme-option' => 'progressbar_filled_color',
			'reset'        => true,
		];
		$element_option_map['filledbordercolor']['fusion_progress'] = [
			'theme-option' => 'progressbar_filled_border_color',
			'reset'        => true,
		];
		$element_option_map['filledbordersize']['fusion_progress']  = [
			'theme-option' => 'progressbar_filled_border_size',
			'type'         => 'range',
		];
		$element_option_map['unfilledcolor']['fusion_progress']     = [
			'theme-option' => 'progressbar_unfilled_color',
			'reset'        => true,
		];
		$element_option_map['textcolor']['fusion_progress']         = [
			'theme-option' => 'progressbar_text_color',
			'reset'        => true,
		];

		// Scroll Progress.
		$element_option_map['position']['fusion_scroll_progress']         = [
			'theme-option' => 'scroll_progress_position',
		];
		$element_option_map['dimensions']['fusion_scroll_progress']       = [
			'theme-option' => 'scroll_progress_height',
		];
		$element_option_map['background_color']['fusion_scroll_progress'] = [
			'theme-option' => 'scroll_progress_background_color',
			'reset'        => true,
		];
		$element_option_map['progress_color']['fusion_scroll_progress']   = [
			'theme-option' => 'scroll_progress_progress_color',
			'reset'        => true,
		];
		$element_option_map['border_size']['fusion_scroll_progress']      = [
			'theme-option' => 'scroll_progress_border_size',
			'type'         => 'range',
		];
		$element_option_map['border_color']['fusion_scroll_progress']     = [
			'theme-option' => 'scroll_progress_border_color',
			'type'         => 'range',
		];
		$element_option_map['border_radius']['fusion_scroll_progress']    = [
			'theme-option' => 'scroll_progress_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];

		// Section Separator.
		$element_option_map['backgroundcolor']['fusion_section_separator'] = [
			'theme-option' => 'section_sep_bg',
			'reset'        => true,
		];
		$element_option_map['bordersize']['fusion_section_separator']      = [
			'theme-option' => 'section_sep_border_size',
			'type'         => 'range',
		];
		$element_option_map['bordercolor']['fusion_section_separator']     = [
			'theme-option' => 'section_sep_border_color',
			'reset'        => true,
		];
		$element_option_map['icon_color']['fusion_section_separator']      = [
			'theme-option' => 'icon_color',
			'reset'        => true,
		];

		// Separator.
		$element_option_map['border_size']['fusion_separator']       = [
			'theme-option' => 'separator_border_size',
			'type'         => 'range',
		];
		$element_option_map['icon_size']['fusion_separator']         = [
			'theme-option' => 'separator_icon_size',
			'type'         => 'range',
		];
		$element_option_map['icon_circle']['fusion_separator']       = [
			'theme-option' => 'separator_circle',
			'type'         => 'yesno',
		];
		$element_option_map['icon_circle_color']['fusion_separator'] = [
			'theme-option' => 'separator_circle_bg_color',
			'reset'        => true,
		];
		$element_option_map['sep_color']['fusion_separator']         = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['icon_color']['fusion_separator']        = [
			'theme-option' => 'separator_icon_color',
			'reset'        => true,
		];
		$element_option_map['style_type']['fusion_separator']        = [
			'theme-option' => 'separator_style_type',
			'type'         => 'select',
		];
		$element_option_map['weight']['fusion_separator']            = [
			'theme-option' => 'separator_border_size',
			'type'         => 'range',
		];

		// Search.
		$element_option_map['design']['fusion_search']                             = [
			'theme-option' => 'search_form_design',
			'reset'        => true,
		];
		$element_option_map['live_search']['fusion_search']                        = [
			'theme-option' => 'live_search',
			'type'         => 'yesno',
		];
		$element_option_map['live_min_character']['fusion_search']                 = [
			'theme-option' => 'live_search_min_char_count',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['live_posts_per_page']['fusion_search']                = [
			'theme-option' => 'live_search_results_per_page',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['live_search_display_featured_image']['fusion_search'] = [
			'theme-option' => 'live_search_display_featured_image',
			'type'         => 'yesno',
		];
		$element_option_map['live_search_display_post_type']['fusion_search']      = [
			'theme-option' => 'live_search_display_post_type',
			'type'         => 'yesno',
		];
		$element_option_map['live_results_height']['fusion_search']                = [
			'theme-option' => 'live_search_results_height',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['search_limit_to_post_titles']['fusion_search']        = [
			'theme-option' => 'search_limit_to_post_titles',
			'type'         => 'yesno',
			'reset'        => true,
		];
		$element_option_map['input_height']['fusion_search']                       = [
			'theme-option' => 'form_input_height',
		];
		$element_option_map['bg_color']['fusion_search']                           = [
			'theme-option' => 'form_bg_color',
			'reset'        => true,
		];
		$element_option_map['live_results_bg_color']['fusion_search']              = [
			'theme-option' => 'form_bg_color',
			'reset'        => true,
		];
		$element_option_map['live_results_link_color']['fusion_search']            = [
			'theme-option' => 'link_color',
			'type'         => 'color',
			'reset'        => true,
		];
		$element_option_map['live_results_meta_color']['fusion_search']            = [
			'theme-option' => 'link_color',
			'type'         => 'color',
			'reset'        => true,
		];
		$element_option_map['live_results_border_size']['fusion_search']           = [
			'theme-option' => 'form_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
			'reset'        => true,
		];
		$element_option_map['live_results_border_color']['fusion_search']          = [
			'theme-option' => 'form_focus_border_color',
			'reset'        => true,
		];
		$element_option_map['text_size']['fusion_search']                          = [
			'theme-option' => 'form_text_size',
		];
		$element_option_map['text_color']['fusion_search']                         = [
			'theme-option' => 'form_text_color',
			'reset'        => true,
		];
		$element_option_map['border_size']['fusion_search']                        = [
			'theme-option' => 'form_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['border_color']['fusion_search']                       = [
			'theme-option' => 'form_border_color',
			'reset'        => true,
		];
		$element_option_map['focus_border_color']['fusion_search']                 = [
			'theme-option' => 'form_focus_border_color',
			'reset'        => true,
		];
		$element_option_map['border_radius']['fusion_search']                      = [
			'theme-option' => 'form_border_radius',
			'type'         => 'range',
			'reset'        => true,
		];

		// Sharing Box.
		$element_option_map['wrapper_adding']['fusion_sharing'] = [
			'theme-option' => 'social_sharing_padding',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];

		$element_option_map['backgroundcolor']['fusion_sharing']          = [
			'theme-option' => 'social_bg_color',
			'reset'        => true,
		];
		$element_option_map['social_share_links']['fusion_sharing']       = [
			'theme-option' => 'social_sharing',
			'reset'        => true,
		];
		$element_option_map['icons_boxed']['fusion_sharing']              = [
			'theme-option' => 'sharing_social_links_boxed',
			'type'         => 'yesno',
		];
		$element_option_map['icons_boxed_radius']['fusion_sharing']       = [ 'theme-option' => 'sharing_social_links_boxed_radius' ];
		$element_option_map['tagline_color']['fusion_sharing']            = [
			'theme-option' => 'sharing_box_tagline_text_color',
			'reset'        => true,
		];
		$element_option_map['tooltip_placement']['fusion_sharing']        = [
			'theme-option' => 'sharing_social_links_tooltip_placement',
			'type'         => 'select',
		];
		$element_option_map['color_type']['fusion_sharing']               = [
			'theme-option' => 'sharing_social_links_color_type',
			'type'         => 'select',
		];
		$element_option_map['icon_size']['fusion_sharing']                = [
			'theme-option' => 'sharing_social_links_font_size',
			'type'         => 'textfield',
		];
		$element_option_map['icon_tagline_color']['fusion_sharing']       = [
			'theme-option' => 'link_color',
			'type'         => 'colorpickeralpha',
		];
		$element_option_map['icon_tagline_color_hover']['fusion_sharing'] = [
			'theme-option' => 'primary_color',
			'type'         => 'colorpickeralpha',
		];
		$element_option_map['separator_border_color']['fusion_sharing']   = [
			'theme-option' => 'sep_color',
			'type'         => 'colorpickeralpha',
		];
		$element_option_map['icon_colors']['fusion_sharing']              = [ 'theme-option' => 'sharing_social_links_icon_color' ];
		$element_option_map['box_colors']['fusion_sharing']               = [ 'theme-option' => 'sharing_social_links_box_color' ];

		// Social Icons.
		$element_option_map['font_size']['fusion_social_links']   = [
			'theme-option' => 'social_links_font_size',
		];
		$element_option_map['color_type']['fusion_social_links']  = [
			'theme-option' => 'social_links_color_type',
			'type'         => 'select',
		];
		$element_option_map['icons_boxed']['fusion_social_links'] = [
			'theme-option' => 'social_links_boxed',
			'type'         => 'yesno',
		];

		$element_option_map['icon_colors']['fusion_social_links']            = [ 'theme-option' => 'social_links_icon_color' ];
		$element_option_map['box_colors']['fusion_social_links']             = [ 'theme-option' => 'social_links_box_color' ];
		$element_option_map['box_border_color']['fusion_social_links']       = [ 'theme-option' => 'social_links_border_color' ];
		$element_option_map['icon_colors_hover']['fusion_social_links']      = [ 'theme-option' => 'social_links_icon_color_hover' ];
		$element_option_map['box_colors_hover']['fusion_social_links']       = [ 'theme-option' => 'social_links_box_color_hover' ];
		$element_option_map['box_border_color_hover']['fusion_social_links'] = [ 'theme-option' => 'social_links_border_color_hover' ];

		$element_option_map['icons_boxed_radius']['fusion_social_links'] = [ 'theme-option' => 'social_links_boxed_radius' ];

		$element_option_map['tooltip_placement']['fusion_social_links'] = [
			'theme-option' => 'social_links_tooltip_placement',
			'type'         => 'select',
		];

		$element_option_map['margin']['fusion_social_links']        = [
			'theme-option' => 'social_links_margin',
		];
		$element_option_map['margin_top']['fusion_social_links']    = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'top',
		];
		$element_option_map['margin_right']['fusion_social_links']  = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'right',
		];
		$element_option_map['margin_bottom']['fusion_social_links'] = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'bottom',
		];
		$element_option_map['margin_left']['fusion_social_links']   = [
			'theme-option' => 'social_links_margin',
			'subset'       => 'left',
		];

		$element_option_map['box_border']['fusion_social_links'] = [
			'theme-option' => 'social_links_border',
		];

		// Social Icons for Person.
		$element_option_map['social_icon_font_size']['fusion_person']    = [ 'theme-option' => 'social_links_font_size' ];
		$element_option_map['social_icon_padding']['fusion_person']      = [ 'theme-option' => 'social_links_boxed_padding' ];
		$element_option_map['social_icon_color_type']['fusion_person']   = [
			'theme-option' => 'social_links_color_type',
			'type'         => 'select',
		];
		$element_option_map['social_icon_colors']['fusion_person']       = [ 'theme-option' => 'social_links_icon_color' ];
		$element_option_map['social_icon_boxed']['fusion_person']        = [
			'theme-option' => 'social_links_boxed',
			'type'         => 'yesno',
		];
		$element_option_map['social_icon_boxed_colors']['fusion_person'] = [ 'theme-option' => 'social_links_box_color' ];
		$element_option_map['social_icon_boxed_radius']['fusion_person'] = [ 'theme-option' => 'social_links_boxed_radius' ];
		$element_option_map['social_icon_tooltip']['fusion_person']      = [
			'theme-option' => 'social_links_tooltip_placement',
			'type'         => 'select',
		];

		// Tabs.
		$element_option_map['backgroundcolor']['fusion_tabs']         = [
			'theme-option' => 'tabs_bg_color',
			'shortcode'    => 'fusion_tabs',
			'reset'        => true,
		];
		$element_option_map['inactivecolor']['fusion_tabs']           = [
			'theme-option' => 'tabs_inactive_color',
			'shortcode'    => 'fusion_tabs',
			'reset'        => true,
		];
		$element_option_map['title_border_radius']['fusion_tabs']     = [
			'theme-option' => 'tabs_title_border_radius',
			'shortcode'    => 'fusion_tabs',
		];
		$element_option_map['bordercolor']['fusion_tabs']             = [
			'theme-option' => 'tabs_border_color',
			'shortcode'    => 'fusion_tabs',
			'reset'        => true,
		];
		$element_option_map['icon_position']['fusion_tabs']           = [
			'theme-option' => 'tabs_icon_position',
			'shortcode'    => 'fusion_tabs',
			'type'         => 'select',
		];
		$element_option_map['icon_size']['fusion_tabs']               = [
			'theme-option' => 'tabs_icon_size',
			'shortcode'    => 'fusion_tabs',
			'type'         => 'range',
		];
		$element_option_map['icon_color']['fusion_tabs']              = [
			'theme-option' => 'tabs_icon_color',
			'shortcode'    => 'fusion_tabs',
			'reset'        => true,
		];
		$element_option_map['active_icon_color']['fusion_tabs']       = [
			'theme-option' => 'tabs_active_icon_color',
			'shortcode'    => 'fusion_tabs',
			'reset'        => true,
		];
		$element_option_map['title_padding']['fusion_tabs']           = [
			'theme-option' => 'tabs_title_padding',
			'shortcode'    => 'fusion_tabs',
		];
		$element_option_map['content_padding']['fusion_tabs']         = [
			'theme-option' => 'tabs_content_padding',
			'shortcode'    => 'fusion_tabs',
		];
		$element_option_map['title_text_color']['fusion_tabs']        = [
			'theme-option' => 'tabs_title_color',
			'shortcode'    => 'fusion_tabs',
			'reset'        => true,
		];
		$element_option_map['title_active_text_color']['fusion_tabs'] = [
			'theme-option' => 'tabs_active_title_color',
			'shortcode'    => 'fusion_tabs',
			'reset'        => true,
		];
		$element_option_map['mobile_mode']['fusion_tabs']             = [
			'theme-option' => 'tabs_mobile_mode',
			'shortcode'    => 'fusion_tabs',
			'type'         => 'select',
		];
		$element_option_map['mobile_mode']['fusion_tabs']             = [
			'theme-option' => 'tabs_mobile_mode',
			'shortcode'    => 'fusion_tabs',
			'type'         => 'select',
		];
		$element_option_map['mobile_sticky_tabs']['fusion_tabs']      = [
			'theme-option' => 'tabs_mobile_sticky_tabs',
			'shortcode'    => 'fusion_tabs',
			'type'         => 'select',
		];

		// Tagline.
		$element_option_map['backgroundcolor']['fusion_tagline_box'] = [
			'theme-option' => 'tagline_bg',
			'reset'        => true,
		];
		$element_option_map['bordercolor']['fusion_tagline_box']     = [
			'theme-option' => 'tagline_border_color',
			'reset'        => true,
		];
		$element_option_map['margin_top']['fusion_tagline_box']      = [
			'theme-option' => 'tagline_margin',
			'subset'       => 'top',
		];
		$element_option_map['margin_bottom']['fusion_tagline_box']   = [
			'theme-option' => 'tagline_margin',
			'subset'       => 'bottom',
		];

		// Testimonials.
		$element_option_map['speed']['fusion_testimonials']           = [
			'theme-option' => 'testimonials_speed',
			'type'         => 'range',
			'reset'        => true,
		];
		$element_option_map['backgroundcolor']['fusion_testimonials'] = [
			'theme-option' => 'testimonial_bg_color',
			'reset'        => true,
		];

		$element_option_map['testimonial_border_width']['fusion_testimonials'] = [
			'theme-option' => 'testimonial_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];

		$element_option_map['testimonial_border_style']['fusion_testimonials'] = [
			'theme-option' => 'testimonial_border_style',
			'type'         => 'select',
		];

		$element_option_map['testimonial_border_color']['fusion_testimonials'] = [
			'theme-option' => 'testimonial_border_color',
			'reset'        => true,
		];

		$element_option_map['border_radius']['fusion_testimonials'] = [
			'theme-option' => 'testimonial_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];

		$element_option_map['textcolor']['fusion_testimonials'] = [
			'theme-option' => 'testimonial_text_color',
			'reset'        => true,
		];

		$element_option_map['random']['fusion_testimonials'] = [
			'theme-option' => 'testimonials_random',
			'type'         => 'yesno',
		];

		// Text.
		$element_option_map['columns']['fusion_text']          = [
			'theme-option' => 'text_columns',
			'type'         => 'range',
		];
		$element_option_map['column_min_width']['fusion_text'] = [
			'theme-option' => 'text_column_min_width',
		];
		$element_option_map['column_spacing']['fusion_text']   = [
			'theme-option' => 'text_column_spacing',
		];
		$element_option_map['rule_style']['fusion_text']       = [
			'theme-option' => 'text_rule_style',
			'type'         => 'select',
		];
		$element_option_map['rule_size']['fusion_text']        = [
			'theme-option' => 'text_rule_size',
			'type'         => 'range',
		];
		$element_option_map['rule_color']['fusion_text']       = [
			'theme-option' => 'text_rule_color',
			'reset'        => true,
		];
		$element_option_map['font_size']['fusion_text']        = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['line_height']['fusion_text']      = [
			'theme-option' => 'body_typography',
			'subset'       => 'line-height',
		];
		$element_option_map['letter_spacing']['fusion_text']   = [
			'theme-option' => 'body_typography',
			'subset'       => 'letter-spacing',
		];
		$element_option_map['text_color']['fusion_text']       = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
		];

		// Title.
		$element_option_map['text_transform']['fusion_title']   = [
			'theme-option' => 'title_text_transform',
			'type'         => 'select',
		];
		$element_option_map['style_type']['fusion_title']       = [
			'theme-option' => 'title_style_type',
			'type'         => 'select',
		];
		$element_option_map['sep_color']['fusion_title']        = [
			'theme-option' => 'title_border_color',
			'reset'        => true,
		];
		$element_option_map['dimensions']['fusion_title']       = [
			'theme-option' => 'title_margin',
			'subset'       => [ 'top', 'bottom' ],
		];
		$element_option_map['dimensions_small']['fusion_title'] = [
			'theme-option' => 'title_margin_mobile',
			'subset'       => [ 'top', 'bottom' ],
		];
		$element_option_map['link_color']['fusion_title']       = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['link_hover_color']['fusion_title'] = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];

		// Toggles.
		$element_option_map['type']['fusion_accordion']                       = [
			'theme-option' => 'accordion_type',
			'type'         => 'select',
		];
		$element_option_map['divider_line']['fusion_accordion']               = [
			'theme-option' => 'accordion_divider_line',
			'type'         => 'yesno',
		];
		$element_option_map['divider_color']['fusion_accordion']              = [
			'theme-option' => 'accordion_divider_color',
			'reset'        => true,
		];
		$element_option_map['divider_hover_color']['fusion_accordion']        = [
			'theme-option' => 'accordion_divider_hover_color',
			'reset'        => true,
		];
		$element_option_map['title_font']['fusion_accordion']                 = [
			'theme-option' => 'accordion_title_typography',
			'subset'       => 'font-family',
			'type'         => 'select',
		];
		$element_option_map['title_font_size']['fusion_accordion']            = [
			'theme-option' => 'accordion_title_typography',
			'subset'       => 'font-size',
			'type'         => 'select',
		];
		$element_option_map['title_color']['fusion_accordion']                = [
			'theme-option' => 'accordion_title_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['content_font']['fusion_accordion']               = [
			'theme-option' => 'accordion_content_typography',
			'subset'       => 'font-family',
			'type'         => 'select',
		];
		$element_option_map['content_font_size']['fusion_accordion']          = [
			'theme-option' => 'accordion_content_typography',
			'subset'       => 'font-size',
			'type'         => 'select',
		];
		$element_option_map['content_color']['fusion_accordion']              = [
			'theme-option' => 'accordion_content_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['boxed_mode']['fusion_accordion']                 = [
			'theme-option' => 'accordion_boxed_mode',
			'type'         => 'yesno',
		];
		$element_option_map['border_size']['fusion_accordion']                = [
			'theme-option' => 'accordion_border_size',
			'type'         => 'range',
		];
		$element_option_map['border_color']['fusion_accordion']               = [
			'theme-option' => 'accordian_border_color',
			'reset'        => true,
		];
		$element_option_map['background_color']['fusion_accordion']           = [
			'theme-option' => 'accordian_background_color',
			'reset'        => true,
		];
		$element_option_map['hover_color']['fusion_accordion']                = [
			'theme-option' => 'accordian_hover_color',
			'reset'        => true,
		];
		$element_option_map['icon_size']['fusion_accordion']                  = [
			'theme-option' => 'accordion_icon_size',
			'type'         => 'range',
		];
		$element_option_map['icon_color']['fusion_accordion']                 = [
			'theme-option' => 'accordian_icon_color',
			'reset'        => true,
		];
		$element_option_map['icon_boxed_mode']['fusion_accordion']            = [
			'theme-option' => 'accordion_icon_boxed',
			'type'         => 'yesno',
		];
		$element_option_map['icon_box_color']['fusion_accordion']             = [
			'theme-option' => 'accordian_inactive_color',
			'reset'        => true,
		];
		$element_option_map['icon_alignment']['fusion_accordion']             = [
			'theme-option' => 'accordion_icon_align',
			'type'         => 'select',
		];
		$element_option_map['toggle_hover_accent_color']['fusion_accordion']  = [
			'theme-option' => 'accordian_active_color',
			'reset'        => true,
		];
		$element_option_map['toggle_active_accent_color']['fusion_accordion'] = [
			'theme-option' => 'accordian_active_accent_color',
			'reset'        => true,
		];

		// Accordion Child.
		$element_option_map['title_font']['fusion_toggle']        = [
			'theme-option' => 'accordion_title_typography',
			'subset'       => 'font-family',
			'type'         => 'child',
		];
		$element_option_map['title_font_size']['fusion_toggle']   = [
			'theme-option' => 'accordion_title_typography',
			'subset'       => 'font-size',
			'type'         => 'child',
		];
		$element_option_map['title_color']['fusion_toggle']       = [
			'theme-option' => 'accordion_title_typography',
			'subset'       => 'color',
			'reset'        => true,
			'type'         => 'child',
		];
		$element_option_map['content_font']['fusion_toggle']      = [
			'theme-option' => 'accordion_content_typography',
			'subset'       => 'font-family',
			'type'         => 'child',
		];
		$element_option_map['content_font_size']['fusion_toggle'] = [
			'theme-option' => 'accordion_content_typography',
			'subset'       => 'font-size',
			'type'         => 'child',
		];
		$element_option_map['content_color']['fusion_toggle']     = [
			'theme-option' => 'accordion_content_typography',
			'subset'       => 'color',
			'reset'        => true,
			'type'         => 'child',
		];

		// User Login Element.
		$element_option_map['text_align']['fusion_login']            = [
			'theme-option' => 'user_login_text_align',
			'type'         => 'select',
		];
		$element_option_map['form_field_layout']['fusion_login']     = [
			'theme-option' => 'user_login_form_field_layout',
			'type'         => 'select',
		];
		$element_option_map['form_background_color']['fusion_login'] = [
			'theme-option' => 'user_login_form_background_color',
			'reset'        => true,
		];
		$element_option_map['show_labels']['fusion_login']           = [
			'theme-option' => 'user_login_form_show_labels',
			'type'         => 'select',
		];
		$element_option_map['show_placeholders']['fusion_login']     = [
			'theme-option' => 'user_login_form_show_placeholders',
			'type'         => 'select',
		];
		$element_option_map['show_remember_me']['fusion_login']      = [
			'theme-option' => 'user_login_form_show_remember_me',
			'type'         => 'select',
		];

		$element_option_map['text_align']['fusion_register']            = [
			'theme-option' => 'user_login_text_align',
			'type'         => 'select',
		];
		$element_option_map['form_field_layout']['fusion_register']     = [
			'theme-option' => 'user_login_form_field_layout',
			'type'         => 'select',
		];
		$element_option_map['form_background_color']['fusion_register'] = [
			'theme-option' => 'user_login_form_background_color',
			'reset'        => true,
		];
		$element_option_map['show_labels']['fusion_register']           = [
			'theme-option' => 'user_login_form_show_labels',
			'type'         => 'select',
		];
		$element_option_map['show_placeholders']['fusion_register']     = [
			'theme-option' => 'user_login_form_show_placeholders',
			'type'         => 'select',
		];

		$element_option_map['text_align']['fusion_lost_password']            = [
			'theme-option' => 'user_login_text_align',
			'type'         => 'select',
		];
		$element_option_map['form_background_color']['fusion_lost_password'] = [
			'theme-option' => 'user_login_form_background_color',
			'reset'        => true,
		];
		$element_option_map['show_labels']['fusion_lost_password']           = [
			'theme-option' => 'user_login_form_show_labels',
			'type'         => 'select',
		];
		$element_option_map['show_placeholders']['fusion_lost_password']     = [
			'theme-option' => 'user_login_form_show_placeholders',
			'type'         => 'select',
		];
		$element_option_map['link_color']['fusion_login']                    = [ 'theme-option' => 'link_color' ];
		$element_option_map['link_color']['fusion_register']                 = [ 'theme-option' => 'link_color' ];
		$element_option_map['link_color']['fusion_lost_password']            = [ 'theme-option' => 'link_color' ];

		// Widget Area Element.
		$element_option_map['title_color']['fusion_widget_area'] = [
			'theme-option' => 'widget_area_title_color',
			'reset'        => true,
		];
		$element_option_map['title_size']['fusion_widget_area']  = [ 'theme-option' => 'widget_area_title_size' ];

		// Gallery.
		$element_option_map['limit']['fusion_gallery']                        = [
			'theme-option' => 'gallery_limit',
			'reset'        => true,
			'type'         => 'range',
		];
		$element_option_map['pagination_type']['fusion_gallery']              = [
			'theme-option' => 'gallery_pagination_type',
			'reset'        => true,
			'type'         => 'select',
		];
		$element_option_map['load_more_btn_text']['fusion_gallery']           = [
			'theme-option' => 'gallery_load_more_button_text',
			'type'         => 'select',
		];
		$element_option_map['picture_size']['fusion_gallery']                 = [
			'theme-option' => 'gallery_picture_size',
			'reset'        => true,
			'type'         => 'select',
		];
		$element_option_map['layout']['fusion_gallery']                       = [
			'theme-option' => 'gallery_layout',
			'reset'        => true,
			'type'         => 'select',
		];
		$element_option_map['columns']['fusion_gallery']                      = [
			'theme-option' => 'gallery_columns',
			'reset'        => true,
			'type'         => 'range',
		];
		$element_option_map['column_spacing']['fusion_gallery']               = [
			'theme-option' => 'gallery_column_spacing',
			'reset'        => true,
			'type'         => 'range',
		];
		$element_option_map['lightbox_content']['fusion_gallery']             = [
			'theme-option' => 'gallery_lightbox_content',
			'reset'        => true,
			'type'         => 'select',
		];
		$element_option_map['lightbox']['fusion_gallery']                     = [
			'theme-option' => 'status_lightbox',
			'type'         => 'yesno',
		];
		$element_option_map['hover_type']['fusion_gallery']                   = [
			'theme-option' => 'gallery_hover_type',
			'reset'        => true,
			'type'         => 'select',
		];
		$element_option_map['gallery_masonry_grid_ratio']['fusion_gallery']   = [
			'theme-option' => 'masonry_grid_ratio',
			'type'         => 'range',
		];
		$element_option_map['gallery_masonry_width_double']['fusion_gallery'] = [
			'theme-option' => 'masonry_width_double',
			'type'         => 'range',
		];
		$element_option_map['bordersize']['fusion_gallery']                   = [
			'theme-option' => 'gallery_border_size',
			'type'         => 'range',
		];
		$element_option_map['bordercolor']['fusion_gallery']                  = [
			'theme-option' => 'gallery_border_color',
			'reset'        => true,
		];
		$element_option_map['border_radius']['fusion_gallery']                = [
			'theme-option' => 'gallery_border_radius',
		];

		// Image Carousel.
		$element_option_map['lightbox']['fusion_images'] = [
			'theme-option' => 'status_lightbox',
			'type'         => 'yesno',
		];

		// Slide.
		$element_option_map['lightbox']['fusion_slide'] = [
			'theme-option' => 'status_lightbox',
			'type'         => 'yesno',
		];

		// Post Slider.
		$element_option_map['lightbox']['fusion_postslider'] = [
			'theme-option' => 'status_lightbox',
			'type'         => 'yesno',
		];

		// Syntax Highlighter.
		$element_option_map['theme']['fusion_syntax_highlighter']                        = [
			'theme-option' => 'syntax_highlighter_theme',
			'type'         => 'select',
		];
		$element_option_map['line_numbers']['fusion_syntax_highlighter']                 = [
			'theme-option' => 'syntax_highlighter_line_numbers',
			'type'         => 'select',
		];
		$element_option_map['background_color']['fusion_syntax_highlighter']             = [
			'theme-option' => 'syntax_highlighter_background_color',
			'reset'        => true,
		];
		$element_option_map['line_number_background_color']['fusion_syntax_highlighter'] = [
			'theme-option' => 'syntax_highlighter_line_number_background_color',
			'reset'        => true,
		];
		$element_option_map['line_number_text_color']['fusion_syntax_highlighter']       = [
			'theme-option' => 'syntax_highlighter_line_number_text_color',
			'reset'        => true,
		];
		$element_option_map['line_wrapping']['fusion_syntax_highlighter']                = [
			'theme-option' => 'syntax_highlighter_line_wrapping',
			'type'         => 'select',
		];
		$element_option_map['copy_to_clipboard']['fusion_syntax_highlighter']            = [
			'theme-option' => 'syntax_highlighter_copy_to_clipboard',
			'type'         => 'select',
		];
		$element_option_map['copy_to_clipboard_text']['fusion_syntax_highlighter']       = [
			'theme-option' => 'syntax_highlighter_copy_to_clipboard_text',
			'type'         => 'reset',
		];
		$element_option_map['font_size']['fusion_syntax_highlighter']                    = [
			'theme-option' => 'syntax_highlighter_font_size',
			'type'         => 'range',
		];
		$element_option_map['border_size']['fusion_syntax_highlighter']                  = [
			'theme-option' => 'syntax_highlighter_border_size',
			'type'         => 'range',
		];
		$element_option_map['border_color']['fusion_syntax_highlighter']                 = [
			'theme-option' => 'syntax_highlighter_border_color',
			'reset'        => true,
		];
		$element_option_map['border_style']['fusion_syntax_highlighter']                 = [
			'theme-option' => 'syntax_highlighter_border_style',
			'type'         => 'select',
		];
		$element_option_map['margin']['fusion_syntax_highlighter']                       = [
			'theme-option' => 'syntax_highlighter_margin',
			'subset'       => [ 'top', 'left', 'bottom', 'right' ],
		];

		// Chart.
		$element_option_map['show_tooltips']['fusion_chart'] = [
			'theme-option' => 'chart_show_tooltips',
			'type'         => 'select',
		];

		$element_option_map['chart_legend_position']['fusion_chart'] = [
			'theme-option' => 'chart_legend_position',
			'type'         => 'select',
		];

		// Video.
		$element_option_map['width']['fusion_video'] = [
			'theme-option' => 'video_max_width',
			'type'         => 'select',
		];

		$element_option_map['controls']['fusion_video'] = [
			'theme-option' => 'video_controls',
			'type'         => 'select',
		];

		$element_option_map['preload']['fusion_video'] = [
			'theme-option' => 'video_preload',
			'type'         => 'select',
		];

		// Vimeo.
		$element_option_map['video_facade']['fusion_vimeo'] = [
			'theme-option' => 'video_facade',
			'type'         => 'select',
		];

		// Youtube.
		$element_option_map['video_facade']['fusion_youtube'] = [
			'theme-option' => 'video_facade',
			'type'         => 'select',
		];

		// Related posts component.
		$element_option_map['number_related_posts']['fusion_tb_related'] = [
			'theme-option' => 'number_related_posts',
			'type'         => 'range',
		];

		$element_option_map['related_posts_columns']['fusion_tb_related'] = [
			'theme-option' => 'related_posts_columns',
			'type'         => 'range',
		];

		$element_option_map['related_posts_column_spacing']['fusion_tb_related'] = [
			'theme-option' => 'related_posts_column_spacing',
			'type'         => 'range',
		];

		$element_option_map['related_posts_swipe_items']['fusion_tb_related'] = [
			'theme-option' => 'related_posts_swipe_items',
			'type'         => 'range',
		];

		$element_option_map['related_posts_image_size']['fusion_tb_related'] = [
			'theme-option' => 'related_posts_image_size',
			'type'         => 'select',
		];

		$element_option_map['related_posts_autoplay']['fusion_tb_related'] = [
			'theme-option' => 'related_posts_autoplay',
			'type'         => 'yesno',
		];

		$element_option_map['related_posts_navigation']['fusion_tb_related'] = [
			'theme-option' => 'related_posts_navigation',
			'type'         => 'yesno',
		];

		$element_option_map['related_posts_swipe']['fusion_tb_related'] = [
			'theme-option' => 'related_posts_swipe',
			'type'         => 'yesno',
		];

		// Slider element.
		$element_option_map['slideshow_autoplay']['fusion_slider'] = [
			'theme-option' => 'slideshow_autoplay',
			'type'         => 'yesno',
		];

		$element_option_map['slideshow_smooth_height']['fusion_slider'] = [
			'theme-option' => 'slideshow_smooth_height',
			'type'         => 'yesno',
		];

		$element_option_map['slideshow_speed']['fusion_slider'] = [
			'theme-option' => 'slideshow_speed',
			'type'         => 'range',
		];

		// Radio Image.
		$element_option_map['border_radius']['fusion_form_image_select']  = [
			'theme-option' => 'form_border_radius',
			'type'         => 'range',
			'check_page'   => true,
		];
		$element_option_map['active_color']['fusion_form_image_select']   = [
			'theme-option' => 'form_focus_border_color',
			'reset'        => true,
			'check_page'   => true,
		];
		$element_option_map['inactive_color']['fusion_form_image_select'] = [
			'theme-option' => 'form_border_color',
			'reset'        => true,
			'check_page'   => true,
		];

		// Rating field.
		$element_option_map['icon_color']['fusion_form_rating']        = [
			'theme-option' => 'form_border_color',
			'reset'        => true,
			'check_page'   => true,
		];
		$element_option_map['active_icon_color']['fusion_form_rating'] = [
			'theme-option' => 'form_focus_border_color',
			'reset'        => true,
			'check_page'   => true,
		];

		// reCAPTCHA.
		$element_option_map['color_theme']['fusion_form_recaptcha']    = [
			'theme-option' => 'recaptcha_color_scheme',
			'type'         => 'select',
		];
		$element_option_map['badge_position']['fusion_form_recaptcha'] = [
			'theme-option' => 'recaptcha_badge_position',
			'type'         => 'select',
		];

		// Form submit.
		$element_option_map['border_width']['fusion_form_submit']  = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['border_radius']['fusion_form_submit'] = [
			'theme-option' => 'button_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];
		$element_option_map['gradient_type']['fusion_form_submit'] = [
			'theme-option' => 'button_gradient_type',
			'type'         => 'select',
		];

		// Woo Product Images.
		$element_option_map['product_images_layout']['fusion_tb_woo_product_images']  = [
			'theme-option' => 'woocommerce_product_images_layout',
			'type'         => 'select',
		];
		$element_option_map['product_images_zoom']['fusion_tb_woo_product_images']    = [
			'theme-option' => 'woocommerce_product_images_zoom',
			'type'         => 'yesno',
		];
		$element_option_map['thumbnail_position']['fusion_tb_woo_product_images']     = [
			'theme-option' => 'woocommerce_product_images_thumbnail_position',
			'type'         => 'select',
		];
		$element_option_map['thumbnail_columns']['fusion_tb_woo_product_images']      = [
			'theme-option' => 'woocommerce_gallery_thumbnail_columns',
			'type'         => 'range',
		];
		$element_option_map['thumbnail_column_width']['fusion_tb_woo_product_images'] = [
			'theme-option' => 'woocommerce_product_images_thumbnail_column_width',
			'type'         => 'range',
		];
		$element_option_map['product_images_width']['fusion_tb_woo_product_images']   = [
			'theme-option' => 'woocommerce_single_gallery_size',
		];

		// Woo Price.
		$element_option_map['price_color']['fusion_tb_woo_price']        = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['price_font_size']['fusion_tb_woo_price']    = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['sale_color']['fusion_tb_woo_price']         = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['sale_font_size']['fusion_tb_woo_price']     = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['stock_color']['fusion_tb_woo_price']        = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['stock_font_size']['fusion_tb_woo_price']    = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['badge_text_color']['fusion_tb_woo_price']   = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['badge_font_size']['fusion_tb_woo_price']    = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['badge_border_color']['fusion_tb_woo_price'] = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];

		// Woo rating.
		$element_option_map['icon_color']['fusion_tb_woo_rating']        = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['count_color']['fusion_tb_woo_rating']       = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['count_hover_color']['fusion_tb_woo_rating'] = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['icon_size']['fusion_tb_woo_rating']         = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['count_font_size']['fusion_tb_woo_rating']   = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];

		// Woo Mini Cart.
		$element_option_map['separator_color']['fusion_woo_mini_cart']                        = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['product_title_color']['fusion_woo_mini_cart']                    = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['product_title_hover_color']['fusion_woo_mini_cart']              = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['product_price_color']['fusion_woo_mini_cart']                    = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['subtotal_text_color']['fusion_woo_mini_cart']                    = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['view_cart_link_color']['fusion_woo_mini_cart']                   = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['view_cart_link_hover_color']['fusion_woo_mini_cart']             = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_color']['fusion_woo_mini_cart']                 = [
			'theme-option' => 'button_accent_color',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_gradient_top']['fusion_woo_mini_cart']          = [
			'theme-option' => 'button_gradient_top_color',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_gradient_bottom']['fusion_woo_mini_cart']       = [
			'theme-option' => 'button_gradient_bottom_color',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_border_color']['fusion_woo_mini_cart']          = [
			'theme-option' => 'button_border_color',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_color_hover']['fusion_woo_mini_cart']           = [
			'theme-option' => 'button_accent_hover_color',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_gradient_top_hover']['fusion_woo_mini_cart']    = [
			'theme-option' => 'button_gradient_top_color_hover',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_gradient_bottom_hover']['fusion_woo_mini_cart'] = [
			'theme-option' => 'button_gradient_bottom_color_hover',
			'reset'        => true,
		];
		$element_option_map['view_cart_button_border_color_hover']['fusion_woo_mini_cart']    = [
			'theme-option' => 'button_border_hover_color',
			'reset'        => true,
		];
		$element_option_map['checkout_link_color']['fusion_woo_mini_cart']                    = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['checkout_link_hover_color']['fusion_woo_mini_cart']              = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['checkout_button_color']['fusion_woo_mini_cart']                  = [
			'theme-option' => 'button_accent_color',
			'reset'        => true,
		];
		$element_option_map['checkout_button_gradient_top']['fusion_woo_mini_cart']           = [
			'theme-option' => 'button_gradient_top_color',
			'reset'        => true,
		];
		$element_option_map['checkout_button_gradient_bottom']['fusion_woo_mini_cart']        = [
			'theme-option' => 'button_gradient_bottom_color',
			'reset'        => true,
		];
		$element_option_map['checkout_button_border_color']['fusion_woo_mini_cart']           = [
			'theme-option' => 'button_border_color',
			'reset'        => true,
		];
		$element_option_map['checkout_button_color_hover']['fusion_woo_mini_cart']            = [
			'theme-option' => 'button_accent_hover_color',
			'reset'        => true,
		];
		$element_option_map['checkout_button_gradient_top_hover']['fusion_woo_mini_cart']     = [
			'theme-option' => 'button_gradient_top_color_hover',
			'reset'        => true,
		];
		$element_option_map['checkout_button_gradient_bottom_hover']['fusion_woo_mini_cart']  = [
			'theme-option' => 'button_gradient_bottom_color_hover',
			'reset'        => true,
		];
		$element_option_map['checkout_button_border_color_hover']['fusion_woo_mini_cart']     = [
			'theme-option' => 'button_border_hover_color',
			'reset'        => true,
		];

		// Woo stock.
		$element_option_map['stock_font_size']['fusion_tb_woo_stock'] = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['stock_color']['fusion_tb_woo_stock']     = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];

		// Woo cart.
		$element_option_map['border_color']['fusion_tb_woo_cart']                 = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['label_color']['fusion_tb_woo_cart']                  = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['label_font_size']['fusion_tb_woo_cart']              = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['field_height']['fusion_tb_woo_cart']                 = [
			'theme-option' => 'form_input_height',
		];
		$element_option_map['select_font_size']['fusion_tb_woo_cart']             = [
			'theme-option' => 'form_text_size',
		];
		$element_option_map['select_color']['fusion_tb_woo_cart']                 = [
			'theme-option' => 'form_text_color',
			'reset'        => true,
		];
		$element_option_map['select_background']['fusion_tb_woo_cart']            = [
			'theme-option' => 'form_bg_color',
			'reset'        => true,
		];
		$element_option_map['select_border_sizes']['fusion_tb_woo_cart']          = [
			'theme-option' => 'form_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['select_border_color']['fusion_tb_woo_cart']          = [
			'theme-option' => 'form_border_color',
			'reset'        => true,
		];
		$element_option_map['swatch_background_color']['fusion_tb_woo_cart']      = [
			'theme-option' => 'form_bg_color',
			'reset'        => true,
		];
		$element_option_map['swatch_border_sizes']['fusion_tb_woo_cart']          = [
			'theme-option' => 'form_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['swatch_border_color']['fusion_tb_woo_cart']          = [
			'theme-option' => 'form_border_color',
			'reset'        => true,
		];
		$element_option_map['swatch_border_color_active']['fusion_tb_woo_cart']   = [
			'theme-option' => 'form_focus_border_color',
			'reset'        => true,
		];
		$element_option_map['button_swatch_font_size']['fusion_tb_woo_cart']      = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['button_swatch_color']['fusion_tb_woo_cart']          = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['button_swatch_color_active']['fusion_tb_woo_cart']   = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['clear_color']['fusion_tb_woo_cart']                  = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['clear_color_hover']['fusion_tb_woo_cart']            = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['description_color']['fusion_tb_woo_cart']            = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['description_font_size']['fusion_tb_woo_cart']        = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['price_font_size']['fusion_tb_woo_cart']              = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['price_color']['fusion_tb_woo_cart']                  = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['sale_font_size']['fusion_tb_woo_cart']               = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['sale_color']['fusion_tb_woo_cart']                   = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['stock_font_size']['fusion_tb_woo_cart']              = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
		];
		$element_option_map['stock_color']['fusion_tb_woo_cart']                  = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['quantity_color']['fusion_tb_woo_cart']               = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['quantity_border_color']['fusion_tb_woo_cart']        = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_color']['fusion_tb_woo_cart']                = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['quantity_font_size']['fusion_tb_woo_cart']           = [
			'theme-option' => 'qty_font_size',
		];
		$element_option_map['quantity_height_field']['fusion_tb_woo_cart']        = [
			'theme-option' => 'qty_size',
			'subset'       => [ 'width', 'height' ],
		];
		$element_option_map['qbutton_background']['fusion_tb_woo_cart']           = [
			'theme-option' => 'qty_bg_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_border_color']['fusion_tb_woo_cart']         = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_color_hover']['fusion_tb_woo_cart']          = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['qbutton_background_hover']['fusion_tb_woo_cart']     = [
			'theme-option' => 'qty_bg_hover_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_border_color_hover']['fusion_tb_woo_cart']   = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['button_border_width']['fusion_tb_woo_cart']          = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['button_color']['fusion_tb_woo_cart']                 = [
			'theme-option' => 'button_accent_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_top']['fusion_tb_woo_cart']          = [
			'theme-option' => 'button_gradient_top_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom']['fusion_tb_woo_cart']       = [
			'theme-option' => 'button_gradient_bottom_color',
			'reset'        => true,
		];
		$element_option_map['button_border_color']['fusion_tb_woo_cart']          = [
			'theme-option' => 'button_border_color',
			'reset'        => true,
		];
		$element_option_map['button_color_hover']['fusion_tb_woo_cart']           = [
			'theme-option' => 'button_accent_hover_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_top_hover']['fusion_tb_woo_cart']    = [
			'theme-option' => 'button_gradient_top_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom_hover']['fusion_tb_woo_cart'] = [
			'theme-option' => 'button_gradient_bottom_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_border_color_hover']['fusion_tb_woo_cart']    = [
			'theme-option' => 'button_border_hover_color',
			'reset'        => true,
		];

		// Post card cart.
		$element_option_map['button_border_width']['fusion_post_card_cart']                  = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['button_details_border_width']['fusion_post_card_cart']          = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['enable_quick_view']['fusion_post_card_cart']                    = [
			'theme-option' => 'woocommerce_enable_quick_view',
			'type'         => 'yesno',
		];
		$element_option_map['quantity_color']['fusion_post_card_cart']                       = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['quantity_border_color']['fusion_post_card_cart']                = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_color']['fusion_post_card_cart']                        = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['qbutton_background']['fusion_post_card_cart']                   = [
			'theme-option' => 'qty_bg_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_border_color']['fusion_post_card_cart']                 = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_color_hover']['fusion_post_card_cart']                  = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['qbutton_background_hover']['fusion_post_card_cart']             = [
			'theme-option' => 'qty_bg_hover_color',
			'reset'        => true,
		];
		$element_option_map['qbutton_border_color_hover']['fusion_post_card_cart']           = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['link_color']['fusion_post_card_cart']                           = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['product_link_color']['fusion_post_card_cart']                   = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['link_hover_color']['fusion_post_card_cart']                     = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['product_link_hover_color']['fusion_post_card_cart']             = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['button_border_color_hover']['fusion_post_card_cart']            = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['button_details_border_color_hover']['fusion_post_card_cart']    = [
			'theme-option' => 'sep_color',
			'reset'        => true,
		];
		$element_option_map['button_color']['fusion_post_card_cart']                         = [
			'theme-option' => 'button_accent_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_top']['fusion_post_card_cart']                  = [
			'theme-option' => 'button_gradient_top_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom']['fusion_post_card_cart']               = [
			'theme-option' => 'button_gradient_bottom_color',
			'reset'        => true,
		];
		$element_option_map['button_border_color']['fusion_post_card_cart']                  = [
			'theme-option' => 'button_border_color',
			'reset'        => true,
		];
		$element_option_map['button_color_hover']['fusion_post_card_cart']                   = [
			'theme-option' => 'button_accent_hover_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_top_hover']['fusion_post_card_cart']            = [
			'theme-option' => 'button_gradient_top_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom_hover']['fusion_post_card_cart']         = [
			'theme-option' => 'button_gradient_bottom_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_border_color_hover']['fusion_post_card_cart']            = [
			'theme-option' => 'button_border_hover_color',
			'reset'        => true,
		];
		$element_option_map['button_details_size']['fusion_post_card_cart']                  = [
			'theme-option' => 'button_font_size',
			'type'         => 'select',
		];
		$element_option_map['button_details_color']['fusion_post_card_cart']                 = [
			'theme-option' => 'button_accent_color',
			'reset'        => true,
		];
		$element_option_map['button_details_gradient_top']['fusion_post_card_cart']          = [
			'theme-option' => 'button_gradient_top_color',
			'reset'        => true,
		];
		$element_option_map['button_details_gradient_bottom']['fusion_post_card_cart']       = [
			'theme-option' => 'button_gradient_bottom_color',
			'reset'        => true,
		];
		$element_option_map['button_details_border_color']['fusion_post_card_cart']          = [
			'theme-option' => 'button_border_color',
			'reset'        => true,
		];
		$element_option_map['button_details_color_hover']['fusion_post_card_cart']           = [
			'theme-option' => 'button_accent_hover_color',
			'reset'        => true,
		];
		$element_option_map['button_details_gradient_top_hover']['fusion_post_card_cart']    = [
			'theme-option' => 'button_gradient_top_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_details_gradient_bottom_hover']['fusion_post_card_cart'] = [
			'theme-option' => 'button_gradient_bottom_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_details_border_color_hover']['']                         = [
			'theme-option' => 'button_border_hover_color',
			'reset'        => true,
		];

		$element_option_map['layout']['fusion_tb_woo_tabs'] = [
			'theme-option' => 'woocommerce_product_tab_design',
			'reset'        => true,
			'type'         => 'select',
		];

		$element_option_map['layout']['fusion_tb_woo_checkout_tabs'] = [
			'theme-option' => 'woocommerce_product_tab_design',
			'reset'        => true,
			'type'         => 'select',
		];

		// Woo Checkout payment.
		$element_option_map['label_color']['fusion_tb_woo_checkout_payment']                  = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['label_bg_color']['fusion_tb_woo_checkout_payment']               = [
			'theme-option' => 'testimonial_bg_color',
			'reset'        => true,
		];
		$element_option_map['payment_color']['fusion_tb_woo_checkout_payment']                = [
			'theme-option' => 'body_typography',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['text_font_size']['fusion_tb_woo_checkout_payment']               = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-size',
			'type'         => 'select',
		];
		$element_option_map['text_typography']['fusion_tb_woo_checkout_payment']              = [
			'theme-option' => 'body_typography',
			'subset'       => 'font-family',
			'type'         => 'select',
		];
		$element_option_map['link_color']['fusion_tb_woo_checkout_payment']                   = [
			'theme-option' => 'link_color',
			'reset'        => true,
		];
		$element_option_map['link_hover_color']['fusion_tb_woo_checkout_payment']             = [
			'theme-option' => 'primary_color',
			'reset'        => true,
		];
		$element_option_map['payment_box_bg']['fusion_tb_woo_checkout_payment']               = [
			'theme-option' => 'testimonial_bg_color',
			'reset'        => true,
		];
		$element_option_map['button_border_width']['fusion_tb_woo_checkout_payment']          = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['button_color']['fusion_tb_woo_checkout_payment']                 = [
			'theme-option' => 'button_accent_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_top']['fusion_tb_woo_checkout_payment']          = [
			'theme-option' => 'button_gradient_top_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom']['fusion_tb_woo_checkout_payment']       = [
			'theme-option' => 'button_gradient_bottom_color',
			'reset'        => true,
		];
		$element_option_map['button_border_color']['fusion_tb_woo_checkout_payment']          = [
			'theme-option' => 'button_border_color',
			'reset'        => true,
		];
		$element_option_map['button_color_hover']['fusion_tb_woo_checkout_payment']           = [
			'theme-option' => 'button_accent_hover_color',
			'reset'        => true,
		];
		$element_option_map['button_gradient_top_hover']['fusion_tb_woo_checkout_payment']    = [
			'theme-option' => 'button_gradient_top_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_gradient_bottom_hover']['fusion_tb_woo_checkout_payment'] = [
			'theme-option' => 'button_gradient_bottom_color_hover',
			'reset'        => true,
		];
		$element_option_map['button_border_color_hover']['fusion_tb_woo_checkout_payment']    = [
			'theme-option' => 'button_border_hover_color',
			'reset'        => true,
		];

		// Woo Checkout Billing.
		$element_option_map['field_bg_color']['fusion_tb_woo_checkout_billing']           = [
			'theme-option' => 'form_bg_color',
			'reset'        => true,
		];
		$element_option_map['field_text_color']['fusion_tb_woo_checkout_billing']         = [
			'theme-option' => 'form_text_color',
			'reset'        => true,
		];
		$element_option_map['field_border_color']['fusion_tb_woo_checkout_billing']       = [
			'theme-option' => 'form_border_color',
			'reset'        => true,
		];
		$element_option_map['field_border_focus_color']['fusion_tb_woo_checkout_billing'] = [
			'theme-option' => 'form_focus_border_color',
			'reset'        => true,
		];

		// Woo Checkout Shipping.
		$element_option_map['field_bg_color']['fusion_tb_woo_checkout_shipping']           = [
			'theme-option' => 'form_bg_color',
			'reset'        => true,
		];
		$element_option_map['field_text_color']['fusion_tb_woo_checkout_shipping']         = [
			'theme-option' => 'form_text_color',
			'reset'        => true,
		];
		$element_option_map['field_border_color']['fusion_tb_woo_checkout_shipping']       = [
			'theme-option' => 'form_border_color',
			'reset'        => true,
		];
		$element_option_map['field_border_focus_color']['fusion_tb_woo_checkout_shipping'] = [
			'theme-option' => 'form_focus_border_color',
			'reset'        => true,
		];

		$element_option_map['button_border_width']['fusion_tb_woo_reviews'] = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];

		// Woo Sorting Element.
		$element_option_map['number_products']['fusion_woo_sorting']         = [
			'theme-option' => 'woo_items',
			'reset'        => true,
		];
		$element_option_map['dropdown_bg_color']['fusion_woo_sorting']       = [
			'theme-option' => 'woo_dropdown_bg_color',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['dropdown_hover_bg_color']['fusion_woo_sorting'] = [
			'theme-option' => 'woo_dropdown_bg_color',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['dropdown_text_color']['fusion_woo_sorting']     = [
			'theme-option' => 'woo_dropdown_text_color',
			'subset'       => 'color',
			'reset'        => true,
		];
		$element_option_map['dropdown_border_color']['fusion_woo_sorting']   = [
			'theme-option' => 'woo_dropdown_border_color',
			'subset'       => 'color',
			'reset'        => true,
		];

		// Woo Product Grid.
		$element_option_map['number_posts']['fusion_woo_product_grid']              = [
			'theme-option' => 'woo_items',
			'reset'        => true,
		];
		$element_option_map['columns']['fusion_woo_product_grid']                   = [
			'theme-option' => 'woocommerce_shop_page_columns',
			'reset'        => true,
		];
		$element_option_map['column_spacing']['fusion_woo_product_grid']            = [
			'theme-option' => 'woocommerce_archive_grid_column_spacing',
			'reset'        => true,
		];
		$element_option_map['grid_box_color']['fusion_woo_product_grid']            = [
			'theme-option' => 'timeline_bg_color',
			'reset'        => true,
		];
		$element_option_map['grid_border_color']['fusion_woo_product_grid']         = [
			'theme-option' => 'timeline_color',
			'reset'        => true,
		];
		$element_option_map['grid_separator_color']['fusion_woo_product_grid']      = [
			'theme-option' => 'grid_separator_color',
			'reset'        => true,
		];
		$element_option_map['grid_separator_style_type']['fusion_woo_product_grid'] = [
			'theme-option' => 'grid_separator_style_type',
			'reset'        => true,
		];

		// Tag cloud.
		$element_option_map['background_color']['fusion_tagcloud']       = [
			'theme-option' => 'tagcloud_bg',
			'reset'        => true,
		];
		$element_option_map['background_hover_color']['fusion_tagcloud'] = [
			'theme-option' => 'tagcloud_bg_hover',
			'reset'        => true,
		];
		$element_option_map['text_color']['fusion_tagcloud']             = [
			'theme-option' => 'tagcloud_color',
			'reset'        => true,
		];
		$element_option_map['text_hover_color']['fusion_tagcloud']       = [
			'theme-option' => 'tagcloud_color_hover',
			'reset'        => true,
		];
		$element_option_map['border_color']['fusion_tagcloud']           = [
			'theme-option' => 'tagcloud_border_color',
			'reset'        => true,
		];
		$element_option_map['border_hover_color']['fusion_tagcloud']     = [
			'theme-option' => 'tagcloud_border_color_hover',
			'reset'        => true,
		];

		// Instagram.
		$element_option_map['buttons_span']['fusion_instagram'] = [
			'theme-option' => 'button_span',
			'shortcode'    => 'fusion_instagram',
			'type'         => 'yesno',
		];

		// Stripe Button.
		$element_option_map['api_mode']['fusion_stripe_button']      = [
			'theme-option' => 'stripe_button_api_mode',
			'type'         => 'select',
		];
		$element_option_map['border_width']['fusion_stripe_button']  = [
			'theme-option' => 'button_border_width',
			'subset'       => [ 'top', 'right', 'bottom', 'left' ],
		];
		$element_option_map['border_radius']['fusion_stripe_button'] = [
			'theme-option' => 'button_border_radius',
			'subset'       => [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ],
		];
		$element_option_map['gradient_type']['fusion_stripe_button'] = [
			'theme-option' => 'button_gradient_type',
			'type'         => 'select',
		];
		$element_option_map['type']['fusion_stripe_button']          = [
			'theme-option' => 'button_type',
			'type'         => 'select',
		];
		$element_option_map['stretch']['fusion_stripe_button']       = [
			'theme-option' => 'button_span',
			'type'         => 'yesno',
		];

		// Openstreet Map.
		$element_option_map['map_style']['fusion_openstreetmap'] = [
			'theme-option' => 'openstreetmap_map_style',
			'reset'        => true,
			'type'         => 'select',
		];

		self::$element_descriptions_map = $element_option_map;
	}

	/**
	 * Setup the element option dependency map.
	 *
	 * @static
	 * @access public
	 * @since 2.0
	 * @return void
	 */
	public static function set_element_dependency_map() {
		$element_option_map = [];

		// Audio.
		$element_option_map['border_color']['fusion_audio'][] = [
			'check'  => [
				'element-option' => 'audio_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'border_size',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Blog.
		$blog_is_excerpt = [
			'check'  => [
				'element-option' => 'blog_excerpt',
				'value'          => 'yes',
				'operator'       => '!=',
			],
			'output' => [
				'element'  => 'excerpt',
				'value'    => '',
				'operator' => '!=',
			],
		];

		$element_option_map['excerpt_length']['fusion_blog'][] = $blog_is_excerpt;
		$element_option_map['strip_html']['fusion_blog'][]     = $blog_is_excerpt;

		$blog_is_single_column = [
			'check'  => [
				'element-option' => 'blog_grid_columns',
				'value'          => '1',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'blog_grid_columns',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['blog_grid_column_spacing']['fusion_blog'][] = $blog_is_single_column;
		$element_option_map['equal_heights']['fusion_blog'][]            = $blog_is_single_column;

		// Google Map.
		$is_embed_map = [
			'check'  => [
				'element-option' => 'google_map_api_type',
				'value'          => 'embed',
				'operator'       => '!=',
			],
			'output' => [
				'element'  => 'api_type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		$element_option_map['embed_address']['fusion_map'][]  = $is_embed_map;
		$element_option_map['embed_map_type']['fusion_map'][] = $is_embed_map;

		$is_not_embed_map = [
			'check'  => [
				'element-option' => 'google_map_api_type',
				'value'          => 'embed',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'api_type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		$element_option_map['address']['fusion_map'][] = $is_not_embed_map;
		$element_option_map['type']['fusion_map'][]    = $is_not_embed_map;

		$is_static_map = [
			'check'  => [
				'element-option' => 'google_map_api_type',
				'value'          => 'static',
				'operator'       => '!=',
			],
			'output' => [
				'element'  => 'api_type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		$element_option_map['icon_static']['fusion_map'][]      = $is_static_map;
		$element_option_map['static_map_color']['fusion_map'][] = $is_static_map;

		$is_js_map = [
			'check'  => [
				'element-option' => 'google_map_api_type',
				'value'          => 'js',
				'operator'       => '!=',
			],
			'output' => [
				'element'  => 'api_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['scrollwheel']['fusion_map'][]              = $is_js_map;
		$element_option_map['scale']['fusion_map'][]                    = $is_js_map;
		$element_option_map['zoom_pancontrol']['fusion_map'][]          = $is_js_map;
		$element_option_map['animation']['fusion_map'][]                = $is_js_map;
		$element_option_map['popup']['fusion_map'][]                    = $is_js_map;
		$element_option_map['map_style']['fusion_map'][]                = $is_js_map;
		$element_option_map['overlay_color']['fusion_map'][]            = $is_js_map;
		$element_option_map['infobox_content']['fusion_map'][]          = $is_js_map;
		$element_option_map['infobox']['fusion_map'][]                  = $is_js_map;
		$element_option_map['icon']['fusion_map'][]                     = $is_js_map;
		$element_option_map['infobox_text_color']['fusion_map'][]       = $is_js_map;
		$element_option_map['infobox_background_color']['fusion_map'][] = $is_js_map;

		// Icon.
		$has_icon_background                                       = [
			'check'  => [
				'element-option' => 'icon_circle',
				'value'          => 'yes',
				'operator'       => '!=',
			],
			'output' => [
				'element'  => 'circle',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['circlecolor']['fusion_fontawesome'][] = $has_icon_background;
		$element_option_map['circlecolor_hover']['fusion_fontawesome'][]       = $has_icon_background;
		$element_option_map['circlebordercolor']['fusion_fontawesome'][]       = $has_icon_background;
		$element_option_map['circlebordercolor_hover']['fusion_fontawesome'][] = $has_icon_background;
		$element_option_map['circlebordersize']['fusion_fontawesome'][]        = $has_icon_background;

		$has_border_size = [
			'check'  => [
				'element-option' => 'icon_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'circlebordersize',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['circlebordercolor']['fusion_fontawesome'][]       = $has_icon_background;
		$element_option_map['circlebordercolor_hover']['fusion_fontawesome'][] = $has_icon_background;
		// Progress.
		$element_option_map['filledbordercolor']['fusion_progress'][] = [
			'check'  => [
				'element-option' => 'progressbar_filled_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'filledbordersize',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Social links.
		$element_option_map['icons_boxed_radius']['fusion_social_links'][] = [
			'check'  => [
				'element-option' => 'social_links_boxed',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'icons_boxed',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['box_colors']['fusion_social_links'][]         = [
			'check'  => [
				'element-option' => 'social_links_boxed',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'icons_boxed',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['icon_colors']['fusion_social_links'][]        = [
			'check'  => [
				'element-option' => 'social_links_color_type',
				'value'          => 'brand',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'color_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['box_colors']['fusion_social_links'][]         = [
			'check'  => [
				'element-option' => 'social_links_color_type',
				'value'          => 'brand',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'color_type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Sharing box.
		$element_option_map['icons_boxed_radius']['fusion_sharing'][] = [
			'check'  => [
				'element-option' => 'social_links_boxed',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'icons_boxed',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['box_colors']['fusion_sharing'][]         = [
			'check'  => [
				'element-option' => 'social_links_color_type',
				'value'          => 'brand',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'color_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['box_colors']['fusion_sharing'][]         = [
			'check'  => [
				'element-option' => 'social_links_boxed',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'icons_boxed',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['icon_colors']['fusion_sharing'][]        = [
			'check'  => [
				'element-option' => 'social_links_color_type',
				'value'          => 'brand',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'color_type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Toggles.
		$element_option_map['divider_line']['fusion_accordion'][]     = [
			'check'  => [
				'element-option' => 'accordion_boxed_mode',
				'value'          => '1',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'boxed_mode',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['border_size']['fusion_accordion'][]      = [
			'check'  => [
				'element-option' => 'accordion_boxed_mode',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'boxed_mode',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['border_color']['fusion_accordion'][]     = [
			'check'  => [
				'element-option' => 'accordion_boxed_mode',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'boxed_mode',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['background_color']['fusion_accordion'][] = [
			'check'  => [
				'element-option' => 'accordion_boxed_mode',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'boxed_mode',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['icon_box_color']['fusion_accordion'][]   = [
			'check'  => [
				'element-option' => 'accordion_icon_boxed',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'icon_boxed_mode',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['hover_color']['fusion_accordion'][]      = [
			'check'  => [
				'element-option' => 'accordion_boxed_mode',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'boxed_mode',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Checklist.
		$element_option_map['circlecolor']['fusion_checklist'][]   = [
			'check'  => [
				'element-option' => 'checklist_circle',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'circle',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['divider_color']['fusion_checklist'][] = [
			'check'  => [
				'element-option' => 'checklist_divider',
				'value'          => 'no',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'divider',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Image.
		$element_option_map['blur']['fusion_imageframe'][]        = [
			'check'  => [
				'element-option' => 'imageframe_style_type',
				'value'          => 'none',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'style_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['stylecolor']['fusion_imageframe'][]  = [
			'check'  => [
				'element-option' => 'imageframe_style_type',
				'value'          => 'none',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'style_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['bordercolor']['fusion_imageframe'][] = [
			'check'  => [
				'element-option' => 'imageframe_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'bordersize',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Image Before & After.
		$element_option_map['before_label']['fusion_image_before_after'][]    = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['after_label']['fusion_image_before_after'][]     = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['font_size']['fusion_image_before_after'][]       = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['accent_color']['fusion_image_before_after'][]    = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['label_placement']['fusion_image_before_after'][] = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['handle_type']['fusion_image_before_after'][]     = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['handle_color']['fusion_image_before_after'][]    = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['handle_bg']['fusion_image_before_after'][]       = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['handle_bg']['fusion_image_before_after'][]       = [
			'check'  => [
				'element-option' => 'before_after_handle_type',
				'value'          => 'arrows',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'handle_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['handle_bg']['fusion_image_before_after'][]       = [
			'check'  => [
				'element-option' => 'before_after_handle_type',
				'value'          => 'circle',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'handle_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['transition_time']['fusion_image_before_after'][] = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'before_after',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['offset']['fusion_image_before_after'][]          = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['orientation']['fusion_image_before_after'][]     = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['handle_movement']['fusion_image_before_after'][] = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'switch',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['link']['fusion_image_before_after'][]            = [
			'check'  => [
				'element-option' => 'before_after_type',
				'value'          => 'before_after',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Button.
		$element_option_map['bevel_color']['fusion_button'][]       = [
			'check'  => [
				'element-option' => 'button_type',
				'value'          => 'Flat',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['bevel_color_hover']['fusion_button'][] = [
			'check'  => [
				'element-option' => 'button_type',
				'value'          => 'Flat',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		$radial = [
			'check'  => [
				'element-option' => 'button_gradient_type',
				'value'          => 'linear',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'gradient_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['radial_direction']['fusion_form_submit'][] = $radial;
		$element_option_map['radial_direction']['fusion_button'][]      = $radial;

		$linear = [
			'check'  => [
				'element-option' => 'button_gradient_type',
				'value'          => 'radial',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'gradient_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['linear_angle']['fusion_form_submit'][] = $linear;
		$element_option_map['linear_angle']['fusion_button'][]      = $linear;

		// Gallery.
		$element_option_map['bordercolor']['fusion_gallery'][] = [
			'check'  => [
				'element-option' => 'gallery_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'bordersize',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Person.
		$element_option_map['pic_style_blur']['fusion_person'][]           = [
			'check'  => [
				'element-option' => 'person_pic_style',
				'value'          => 'none',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'pic_style',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['pic_style_color']['fusion_person'][]          = [
			'check'  => [
				'element-option' => 'person_pic_style',
				'value'          => 'none',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'pic_style',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['social_icon_boxed_radius']['fusion_person'][] = [
			'check'  => [
				'element-option' => 'social_links_boxed',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'social_icon_boxed',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['social_icon_boxed_colors']['fusion_person'][] = [
			'check'  => [
				'element-option' => 'social_links_boxed',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'social_icon_boxed',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['social_icon_boxed_colors']['fusion_person'][] = [
			'check'  => [
				'element-option' => 'social_links_color_type',
				'value'          => 'brand',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'social_icon_color_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['social_icon_colors']['fusion_person'][]       = [
			'check'  => [
				'element-option' => 'social_links_color_type',
				'value'          => 'brand',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'social_icon_color_type',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Content boxes.
		$element_option_map['circlebordercolor']['fusion_content_boxes'][]      = [
			'check'  => [
				'element-option' => 'content_box_icon_bg_inner_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'circlebordersize',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['outercirclebordercolor']['fusion_content_boxes'][] = [
			'check'  => [
				'element-option' => 'content_box_icon_bg_outer_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'outercirclebordersize',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['button_span']['fusion_content_boxes'][]            = [
			'check'  => [
				'element-option' => 'content_box_link_type',
				'value'          => 'button',
				'operator'       => '!=',
			],
			'output' => [
				'element'  => 'link_type',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$boxed_content_boxes = [
			'check'  => [
				'element-option' => 'content_box_icon_circle',
				'value'          => 'no',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'icon_circle',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['icon_circle_radius']['fusion_content_boxes'][]     = $boxed_content_boxes;
		$element_option_map['circlecolor']['fusion_content_boxes'][]            = $boxed_content_boxes;
		$element_option_map['circlebordercolor']['fusion_content_boxes'][]      = $boxed_content_boxes;
		$element_option_map['circlebordersize']['fusion_content_boxes'][]       = $boxed_content_boxes;
		$element_option_map['outercirclebordercolor']['fusion_content_boxes'][] = $boxed_content_boxes;
		$element_option_map['outercirclebordersize']['fusion_content_boxes'][]  = $boxed_content_boxes;

		$parent_boxed_content_boxes = [
			'check'  => [
				'element-option' => 'content_box_icon_circle',
				'value'          => 'no',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'parent_icon_circle',
				'value'    => '',
				'operator' => '!=',
			],
		];

		$element_option_map['circlecolor']['fusion_content_box'][]            = $parent_boxed_content_boxes;
		$element_option_map['circlebordercolor']['fusion_content_box'][]      = $parent_boxed_content_boxes;
		$element_option_map['circlebordersize']['fusion_content_box'][]       = $parent_boxed_content_boxes;
		$element_option_map['outercirclebordercolor']['fusion_content_box'][] = $parent_boxed_content_boxes;
		$element_option_map['outercirclebordersize']['fusion_content_box'][]  = $parent_boxed_content_boxes;

		// Flip boxes.
		$element_option_map['border_color']['fusion_flip_box'][] = [
			'check'  => [
				'element-option' => 'flip_boxes_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'border_size',
				'value'    => '',
				'operator' => '!=',
			],
		];

		/**
		 * WIP
		// Container.
		$element_option_map['border_color']['fusion_builder_container'][] = [
			'check'  => [
				'element-option' => 'full_width_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'border_size',
				'value'    => '',
				'operator' => '!=',
			],
		];
		$element_option_map['border_style']['fusion_builder_container'][] = [
			'check'  => [
				'element-option' => 'full_width_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'border_size',
				'value'    => '',
				'operator' => '!=',
			],
		];
		 */

		// Section separator.
		$element_option_map['bordercolor']['fusion_section_separator'][] = [
			'check'  => [
				'element-option' => 'section_sep_border_size',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'bordersize',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// Separator.
		$element_option_map['icon_circle_color']['fusion_separator'][] = [
			'check'  => [
				'element-option' => 'separator_circle',
				'value'          => '0',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'icon_circle',
				'value'    => '',
				'operator' => '!=',
			],
		];

		// reCAPTCHA.
		$element_option_map['color_theme']['fusion_form_recaptcha'][] = [
			'check'  => [
				'element-option' => 'recaptcha_version',
				'value'          => 'v3',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'color_theme',
				'value'    => 'v3',
				'operator' => '==',
			],
		];

		$element_option_map['tab_index']['fusion_form_recaptcha'][] = [
			'check'  => [
				'element-option' => 'recaptcha_version',
				'value'          => 'v3',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'tab_index',
				'value'    => 'v3',
				'operator' => '==',
			],
		];

		$element_option_map['badge_position']['fusion_form_recaptcha'][] = [
			'check'  => [
				'element-option' => 'recaptcha_version',
				'value'          => 'v2',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'badge_position',
				'value'    => 'v2',
				'operator' => '==',
			],
		];

		// YouTube.
		$element_option_map['thumbnail_size']['fusion_youtube'][] = [
			'check'  => [
				'element-option' => 'video_facade',
				'value'          => 'on',
				'operator'       => '==',
			],
			'output' => [
				'element'  => 'video_facade',
				'value'    => 'off',
				'operator' => '!=',
			],
		];

		self::$element_dependency_map = $element_option_map;
	}

	/**
	 * Set scope for shortcode IDs.
	 *
	 * @access public
	 * @since 2.0
	 * @param int $parent_id Id of parent element.
	 * @return void
	 */
	public function set_global_shortcode_parent( $parent_id ) {
		$this->shortcode_parent = (int) $parent_id;
	}

	/**
	 * Get scope for shortcode IDs.
	 *
	 * @access public
	 * @since 2.0
	 * @return mixed
	 */
	public function get_global_shortcode_parent() {
		if ( $this->shortcode_parent ) {
			return $this->shortcode_parent;
		}
		return false;
	}

	/**
	 * Filters content to add WC checkout form.
	 *
	 * @access public
	 * @since  3.3
	 * @param  String $content The page content.
	 * @return $content
	 */
	public function checkout_elements_wrapper( $content ) {
		if ( ! class_exists( 'WooCommerce' ) ) {
			return $content;
		}

		$form       = '<form name="checkout" method="post" class="checkout woocommerce-checkout" action="' . esc_url( wc_get_checkout_url() ) . '" enctype="multipart/form-data">';
		$is_builder = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );
		$checkout   = WC()->checkout();
		$shortcode  = '[fusion_woo_checkout_form]';
		$count      = substr_count( $content, $shortcode );
		$before     = '';
		$after      = '';

		if ( fusion_library()->woocommerce->is_checkout_layout() && ( false !== strpos( $content, 'fusion_tb_woo_checkout_' ) || $is_builder ) ) {

			// If we are on the order received endpoint, revert to default output.
			if ( is_wc_endpoint_url() ) {
				return '[fusion_builder_container type="flex"][fusion_builder_row][fusion_builder_column type="1_1"][woocommerce_checkout][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]';
			}

			ob_start();
			do_action( 'woocommerce_before_checkout_form', $checkout );

			$before = ob_get_clean();

			ob_start();
			do_action( 'woocommerce_after_checkout_form', $checkout );
			$after = ob_get_clean();

			switch ( $count ) {
				case '0':
					$content = $before . $form . $content . '</form>' . $after;
					break;

				case '1':
					$content  = str_replace( $shortcode, $before . $form, $content );
					$content .= '</form>' . $after;
					break;

				case '2':
					$pos     = strpos( $content, $shortcode );
					$content = substr_replace( $content, $before . $form, $pos, strlen( $shortcode ) );
					$pos     = strpos( $content, $shortcode );
					$content = substr_replace( $content, '</form>' . $after, $pos, strlen( $shortcode ) );
					break;
			}
		}

		return $content;
	}
	/**
	 * Ajax get builder rendered content used for SEO plugins -> Rankmath or yoast.
	 *
	 * @access public
	 * @since  3.9
	 */
	public function get_builder_rendered_content() {
		check_ajax_referer( 'fusion_load_nonce', 'fusion_load_nonce' );

		$content = isset( $_POST['shortcodes'] ) ? wp_unslash( $_POST['shortcodes'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput

		die( wp_json_encode( [ 'content' => apply_filters( 'the_content', $content ) ] ) );
	}

	/**
	 * Add rendered content in first load for SEO plugins -> Rankmath or yoast.
	 *
	 * @access public
	 * @since  3.9
	 */
	public function add_rendered_content_to_footer() {
		$post      = get_post();
		$post_type = get_post_type( $post );

		// Exit if post type not public. SEO plugins only works with public post types.
		if ( ! is_object( $post ) || ! is_post_type_viewable( $post_type ) ) {
			return;
		}

		// Add the render content only inside edit screen.
		$screen = get_current_screen();

		if ( is_object( $screen ) && property_exists( $screen, 'base' ) && 'post' === $screen->base ) {
			?>
				<textarea id="fusion-builder-rendered-content" style="display:none;">
					<?php echo esc_textarea( apply_filters( 'the_content', $post->post_content ) ); ?>
				</textarea>
			<?php
		}
	}


	/**
	 * Registers Rendered content endpoint.
	 *
	 * @access public
	 * @since 3.9
	 */
	public function register_rendered_content_endpoint() {
		// User media.
		register_rest_route(
			'awb',
			'/rendered_content',
			[
				'methods'             => 'POST',
				'callback'            => [ $this, 'rendered_content_endpoint' ],
				'permission_callback' => '__return_true',
			]
		);
	}

	/**
	 * Rendered Content endpoint.
	 *
	 * @access public
	 * @param Object $data The enpoint data.
	 * @since 3.8
	 */
	public function rendered_content_endpoint( $data ) {
		$content = apply_filters( 'the_content', $data->get_param( 'content' ) );

		return [ 'content' => $content ];
	}

	/**
	 * Get custom conditional rendering options if set.
	 *
	 * @access public
	 * @since 3.8
	 */
	public function get_custom_conditions() {
		if ( null !== $this->custom_conditions ) {
			return $this->custom_conditions;
		}
		$this->custom_conditions = (array) apply_filters( 'awb_custom_rendering_conditions', [] );
		return $this->custom_conditions;
	}

	/**
	 * Get custom form action data.
	 *
	 * @access public
	 * @since 3.8
	 */
	public function get_custom_form_actions() {
		if ( null !== $this->custom_form_actions ) {
			return $this->custom_form_actions;
		}
		$this->custom_form_actions = (array) apply_filters( 'awb_custom_form_actions', [] );
		return $this->custom_form_actions;
	}
}
