diff --git a/assets/img/screenshot-12.png b/assets/img/screenshot-12.png new file mode 100644 index 000000000..3cfd50873 Binary files /dev/null and b/assets/img/screenshot-12.png differ diff --git a/autoload.php b/autoload.php index f76ca3d4e..8f2cb4fbf 100644 --- a/autoload.php +++ b/autoload.php @@ -111,9 +111,7 @@ protected function load_mapped_file( $prefix, $relative_class ) { // replace the namespace prefix with the base directory, // replace namespace separators with directory separators // in the relative class name, append with .php - $file = $base_dir - . str_replace( '\\', '/', $relative_class ) - . '.php'; + $file = $base_dir . str_replace( '\\', '/', $relative_class ) . '.php'; // if the mapped file exists, require it if ( $this->require_file( $file ) ) { diff --git a/classifai.php b/classifai.php index db6c1d15f..427b98352 100644 --- a/classifai.php +++ b/classifai.php @@ -4,8 +4,8 @@ * Plugin URI: https://github.com/10up/classifai * Update URI: https://classifaiplugin.com * Description: Enhance your WordPress content with Artificial Intelligence and Machine Learning services. - * Version: 2.2.3 - * Requires at least: 5.7 + * Version: 2.3.0 + * Requires at least: 5.8 * Requires PHP: 7.4 * Author: 10up * Author URI: https://10up.com @@ -16,30 +16,47 @@ */ /** - * Require PHP version 7.4+ - throw an error if the plugin is activated on an older version. + * Get the minimum version of PHP required by this plugin. * - * Note that this itself is only PHP5.3+ compatible because of the anonymous callback. + * @return string Minimum version required. */ -register_activation_hook( - __FILE__, - function() { - if ( version_compare( PHP_VERSION, '7.4.0', '<' ) ) { - wp_die( - sprintf( - wp_kses( - /* translators: PHP Update guide URL */ - __( 'ClassifAI requires PHP version 7.4. Click here to learn how to update your PHP version.', 'classifai' ), - array( - 'a' => array( 'href' => array() ), +function classifai_minimum_php_requirement() { + return '7.4'; +} + +/** + * Whether PHP installation meets the minimum requirements + * + * @return bool True if meets minimum requirements, false otherwise. + */ +function classifai_site_meets_php_requirements() { + return version_compare( phpversion(), classifai_minimum_php_requirement(), '>=' ); +} + +// Ensuring our PHP version requirement is met first before loading plugin. +if ( ! classifai_site_meets_php_requirements() ) { + add_action( + 'admin_notices', + function() { + ?> +
+ +
++ +
+ +> + + +
time(), ], - wp_get_attachment_url( $audio_id ) + $source_url ); ?> @@ -574,26 +693,28 @@ public function render_meta_box( $post ) { * @param int $post_id Post ID. */ public function save_post_metadata( $post_id ) { - if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || ! current_user_can( 'edit_post', $post_id ) || 'revision' === get_post_type( $post_id ) ) { + + if ( ! in_array( get_post_type( $post_id ), get_tts_supported_post_types(), true ) ) { return; } - if ( empty( $_POST['classifai_text_to_speech_meta'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['classifai_text_to_speech_meta'] ) ), 'classifai_text_to_speech_meta_action' ) ) { + if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || ! current_user_can( 'edit_post', $post_id ) || 'revision' === get_post_type( $post_id ) ) { return; } - $supported_post_types = $this->get_supported_post_types(); - if ( ! in_array( get_post_type( $post_id ), $supported_post_types, true ) ) { + if ( empty( $_POST['classifai_text_to_speech_meta'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['classifai_text_to_speech_meta'] ) ), 'classifai_text_to_speech_meta_action' ) ) { return; } - if ( isset( $_POST['classifai_synthesize_speech'] ) && 'yes' === sanitize_text_field( wp_unslash( $_POST['classifai_synthesize_speech'] ) ) ) { - update_post_meta( $post_id, self::SYNTHESIZE_SPEECH_KEY, 'yes' ); + if ( ! isset( $_POST['classifai_display_generated_audio'] ) ) { + update_post_meta( $post_id, self::DISPLAY_GENERATED_AUDIO, false ); + } else { + delete_post_meta( $post_id, self::DISPLAY_GENERATED_AUDIO ); + } + if ( isset( $_POST['classifai_synthesize_speech'] ) ) { $save_post_handler = new SavePostHandler(); $save_post_handler->synthesize_speech( $post_id ); - } else { - update_post_meta( $post_id, self::SYNTHESIZE_SPEECH_KEY, 'no' ); } } @@ -611,7 +732,11 @@ public function render_post_audio_controls( $content ) { return $content; } - if ( ! in_array( $_post->post_type, self::get_supported_post_types(), true ) ) { + if ( ! is_singular( $_post->post_type ) ) { + return $content; + } + + if ( ! in_array( $_post->post_type, get_tts_supported_post_types(), true ) ) { return $content; } @@ -630,8 +755,9 @@ public function render_post_audio_controls( $content ) { return $content; } - $is_audio_enabled = get_post_meta( $_post->ID, self::SYNTHESIZE_SPEECH_KEY, true ); - if ( 'no' === $is_audio_enabled ) { + // Respect the audio display settings of the post. + if ( metadata_exists( 'post', $_post->ID, self::DISPLAY_GENERATED_AUDIO ) && + ! (bool) get_post_meta( $_post->ID, self::DISPLAY_GENERATED_AUDIO, true ) ) { return $content; } @@ -752,24 +878,4 @@ protected function get_post_types_select_options() { return $options; } - /** - * Returns supported post types for Azure Text to Speech. - * - * @todo Move this to a more generic method during refactoring of the plugin. - * @return array - */ - public static function get_supported_post_types() { - $settings = \Classifai\get_plugin_settings( 'language_processing', self::FEATURE_NAME ); - $supported_post_types = isset( $settings['post_types'] ) ? $settings['post_types'] : array(); - - return array_keys( - array_filter( - $supported_post_types, - function( $post_type ) { - return '0' !== $post_type; - } - ) - ); - } - } diff --git a/includes/Classifai/Providers/OpenAI/ChatGPT.php b/includes/Classifai/Providers/OpenAI/ChatGPT.php index 97cea4360..95669a16f 100644 --- a/includes/Classifai/Providers/OpenAI/ChatGPT.php +++ b/includes/Classifai/Providers/OpenAI/ChatGPT.php @@ -6,11 +6,9 @@ namespace Classifai\Providers\OpenAI; use Classifai\Providers\Provider; -use Classifai\Providers\OpenAI\APIRequest; -use Classifai\Providers\OpenAI\Tokenizer; use Classifai\Watson\Normalizer; -use function Classifai\get_asset_info; use WP_Error; +use function Classifai\get_asset_info; class ChatGPT extends Provider { @@ -55,19 +53,64 @@ public function __construct( $service ) { 'title' => __( 'OpenAI ChatGPT', 'classifai' ), 'fields' => array( 'api-key' ), 'features' => array( - 'enable_excerpt' => __( 'Excerpt generation', 'classifai' ), - 'enable_titles' => __( 'Title generation', 'classifai' ), + 'enable_excerpt' => __( 'Excerpt generation', 'classifai' ), + 'enable_titles' => __( 'Title generation', 'classifai' ), + 'enable_resize_content' => __( 'Content resizing', 'classifai' ), ), ); } + /** + * Determine if the current user can access the feature + * + * @param string $feature Feature to check. + * @return bool + */ + public function is_feature_enabled( string $feature = '' ) { + $access = false; + $settings = $this->get_settings(); + $user_roles = wp_get_current_user()->roles ?? []; + $feature_roles = []; + + $role_keys = [ + 'enable_excerpt' => 'roles', + 'enable_titles' => 'title_roles', + 'enable_resize_content' => 'resize_content_roles', + ]; + + if ( isset( $role_keys[ $feature ] ) ) { + $feature_roles = $settings[ $role_keys[ $feature ] ] ?? []; + } + + // Check if user has access to the feature and the feature is turned on. + if ( + ( ! empty( $feature_roles ) && ! empty( array_intersect( $user_roles, $feature_roles ) ) ) + && ( isset( $settings[ $feature ] ) && 1 === (int) $settings[ $feature ] ) + ) { + $access = true; + } + + /** + * Filter to override permission to a ChatGPT generate feature. + * + * @since 2.3.0 + * @hook classifai_openai_chatgpt_{$feature} + * + * @param {bool} $access Current access value. + * @param {array} $settings Current feature settings. + * + * @return {bool} Should the user have access? + */ + return apply_filters( "classifai_openai_chatgpt_{$feature}", $access, $settings ); + } + /** * Register what we need for the plugin. * * This only fires if can_register returns true. */ public function register() { - add_action( 'enqueue_block_editor_assets', [ $this, 'enqueue_editor_assets' ] ); + add_action( 'enqueue_block_assets', [ $this, 'enqueue_editor_assets' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_assets' ] ); add_action( 'edit_form_before_permalink', [ $this, 'register_generated_titles_template' ] ); } @@ -102,14 +145,7 @@ public function enqueue_editor_assets() { return; } - $settings = $this->get_settings(); - $user_roles = wp_get_current_user()->roles ?? []; - $excerpt_roles = $settings['roles'] ?? []; - - if ( - ( ! empty( $excerpt_roles ) && empty( array_diff( $user_roles, $excerpt_roles ) ) ) - && ( isset( $settings['enable_excerpt'] ) && 1 === (int) $settings['enable_excerpt'] ) - ) { + if ( $this->is_feature_enabled( 'enable_excerpt' ) ) { // This script removes the core excerpt panel and replaces it with our own. wp_enqueue_script( 'classifai-post-excerpt', @@ -120,12 +156,7 @@ public function enqueue_editor_assets() { ); } - $title_roles = $settings['title_roles'] ?? []; - - if ( - ( ! empty( $title_roles ) && empty( array_diff( $user_roles, $title_roles ) ) ) - && ( isset( $settings['enable_titles'] ) && 1 === (int) $settings['enable_titles'] ) - ) { + if ( $this->is_feature_enabled( 'enable_titles' ) ) { wp_enqueue_script( 'classifai-post-status-info', CLASSIFAI_PLUGIN_URL . 'dist/post-status-info.js', @@ -143,6 +174,24 @@ public function enqueue_editor_assets() { 'before' ); } + + if ( $this->is_feature_enabled( 'enable_resize_content' ) ) { + wp_enqueue_script( + 'classifai-content-resizing-plugin-js', + CLASSIFAI_PLUGIN_URL . 'dist/content-resizing-plugin.js', + get_asset_info( 'content-resizing-plugin', 'dependencies' ), + get_asset_info( 'content-resizing-plugin', 'version' ), + true + ); + + wp_enqueue_style( + 'classifai-content-resizing-plugin-css', + CLASSIFAI_PLUGIN_URL . 'dist/content-resizing-plugin.css', + [], + CLASSIFAI_PLUGIN_VERSION, + 'all' + ); + } } /** @@ -155,41 +204,76 @@ public function enqueue_admin_assets( $hook_suffix = '' ) { return; } - $screen = get_current_screen(); - $settings = $this->get_settings(); - $user_roles = wp_get_current_user()->roles ?? []; - $title_roles = $settings['title_roles'] ?? []; + $screen = get_current_screen(); + $settings = $this->get_settings(); // Load the assets for the classic editor. - if ( - $screen && ! $screen->is_block_editor() - && ( ! empty( $title_roles ) && empty( array_diff( $user_roles, $title_roles ) ) ) - && ( isset( $settings['enable_titles'] ) && 1 === (int) $settings['enable_titles'] ) - ) { - wp_enqueue_style( - 'classifai-generate-title-classic-css', - CLASSIFAI_PLUGIN_URL . 'dist/generate-title-classic.css', - [], - CLASSIFAI_PLUGIN_VERSION, - 'all' - ); - - wp_enqueue_script( - 'classifai-generate-title-classic-js', - CLASSIFAI_PLUGIN_URL . 'dist/generate-title-classic.js', - array_merge( get_asset_info( 'generate-title-classic', 'dependencies' ), array( 'wp-api' ) ), - get_asset_info( 'generate-title-classic', 'version' ), - true - ); + if ( $screen && ! $screen->is_block_editor() ) { + if ( + post_type_supports( $screen->post_type, 'title' ) && + $this->is_feature_enabled( 'enable_titles' ) + ) { + wp_enqueue_style( + 'classifai-generate-title-classic-css', + CLASSIFAI_PLUGIN_URL . 'dist/generate-title-classic.css', + [], + CLASSIFAI_PLUGIN_VERSION, + 'all' + ); + + wp_enqueue_script( + 'classifai-generate-title-classic-js', + CLASSIFAI_PLUGIN_URL . 'dist/generate-title-classic.js', + array_merge( get_asset_info( 'generate-title-classic', 'dependencies' ), array( 'wp-api' ) ), + get_asset_info( 'generate-title-classic', 'version' ), + true + ); + + wp_add_inline_script( + 'classifai-generate-title-classic-js', + sprintf( + 'var classifaiChatGPTData = %s;', + wp_json_encode( $this->get_localised_vars() ) + ), + 'before' + ); + } - wp_add_inline_script( - 'classifai-generate-title-classic-js', - sprintf( - 'var classifaiChatGPTData = %s;', - wp_json_encode( $this->get_localised_vars() ) - ), - 'before' - ); + if ( + post_type_supports( $screen->post_type, 'excerpt' ) && + $this->is_feature_enabled( 'enable_excerpt' ) + ) { + wp_enqueue_style( + 'classifai-generate-title-classic-css', + CLASSIFAI_PLUGIN_URL . 'dist/generate-title-classic.css', + [], + CLASSIFAI_PLUGIN_VERSION, + 'all' + ); + + wp_enqueue_script( + 'classifai-generate-excerpt-classic-js', + CLASSIFAI_PLUGIN_URL . 'dist/generate-excerpt-classic.js', + array_merge( get_asset_info( 'generate-excerpt-classic', 'dependencies' ), array( 'wp-api' ) ), + get_asset_info( 'generate-excerpt-classic', 'version' ), + true + ); + + wp_add_inline_script( + 'classifai-generate-excerpt-classic-js', + sprintf( + 'var classifaiGenerateExcerpt = %s;', + wp_json_encode( + [ + 'path' => '/classifai/v1/openai/generate-excerpt/', + 'buttonText' => __( 'Generate excerpt', 'classifai' ), + 'regenerateText' => __( 'Re-generate excerpt', 'classifai' ), + ] + ) + ), + 'before' + ); + } } wp_enqueue_style( @@ -252,6 +336,19 @@ public function setup_fields_sections() { $roles = get_editable_roles() ?? []; $roles = array_combine( array_keys( $roles ), array_column( $roles, 'name' ) ); + /** + * Filter the allowed WordPress roles for ChatGTP + * + * @since 2.3.0 + * @hook classifai_chatgpt_allowed_roles + * + * @param {array} $roles Array of arrays containing role information. + * @param {array} $default_settings Default setting values. + * + * @return {array} Roles array. + */ + $roles = apply_filters( 'classifai_chatgpt_allowed_roles', $roles, $default_settings ); + add_settings_field( 'roles', esc_html__( 'Allowed roles', 'classifai' ), @@ -331,6 +428,60 @@ public function setup_fields_sections() { 'description' => __( 'Number of titles that will be generated in one request.', 'classifai' ), ] ); + + // Add resizing content fields. + add_settings_section( + $this->get_option_name() . '_resize_content_settings', + esc_html__( 'Resizing content settings', 'classifai' ), + '', + $this->get_option_name() + ); + + add_settings_field( + 'enable-resize-content', + esc_html__( 'Enable content resizing', 'classifai' ), + [ $this, 'render_input' ], + $this->get_option_name(), + $this->get_option_name() . '_resize_content_settings', + [ + 'label_for' => 'enable_resize_content', + 'input_type' => 'checkbox', + 'default_value' => $default_settings['enable_resize_content'], + 'description' => __( '"Shrink content" and "Grow content" menu items will be added to the paragraph block\'s toolbar menu.', 'classifai' ), + ] + ); + + $content_resize_roles = $roles; + + unset( $content_resize_roles['contributor'], $content_resize_roles['subscriber'] ); + + add_settings_field( + 'resize-content-roles', + esc_html__( 'Allowed roles', 'classifai' ), + [ $this, 'render_checkbox_group' ], + $this->get_option_name(), + $this->get_option_name() . '_resize_content_settings', + [ + 'label_for' => 'resize_content_roles', + 'options' => $content_resize_roles, + 'default_values' => $default_settings['resize_content_roles'], + 'description' => __( 'Choose which roles are allowed to resize content.', 'classifai' ), + ] + ); + + add_settings_field( + 'number-resize-content', + esc_html__( 'Number of suggestions', 'classifai' ), + [ $this, 'render_select' ], + $this->get_option_name(), + $this->get_option_name() . '_resize_content_settings', + [ + 'label_for' => 'number_resize_content', + 'options' => array_combine( range( 1, 10 ), range( 1, 10 ) ), + 'default_value' => $default_settings['number_resize_content'], + 'description' => __( 'Number of suggestions that will be generated in one request.', 'classifai' ), + ] + ); } /** @@ -383,6 +534,24 @@ public function sanitize_settings( $settings ) { $new_settings['number_titles'] = 1; } + if ( empty( $settings['enable_resize_content'] ) || 1 !== (int) $settings['enable_resize_content'] ) { + $new_settings['enable_resize_content'] = 'no'; + } else { + $new_settings['enable_resize_content'] = '1'; + } + + if ( isset( $settings['resize_content_roles'] ) && is_array( $settings['resize_content_roles'] ) ) { + $new_settings['resize_content_roles'] = array_map( 'sanitize_text_field', $settings['resize_content_roles'] ); + } else { + $new_settings['resize_content_roles'] = array_keys( get_editable_roles() ?? [] ); + } + + if ( isset( $settings['number_resize_content'] ) && is_numeric( $settings['number_resize_content'] ) && (int) $settings['number_resize_content'] >= 1 && (int) $settings['number_resize_content'] <= 10 ) { + $new_settings['number_resize_content'] = absint( $settings['number_resize_content'] ); + } else { + $new_settings['number_resize_content'] = 1; + } + return $new_settings; } @@ -398,18 +567,24 @@ public function reset_settings() { * * @return array */ - private function get_default_settings() { + public function get_default_settings() { + if ( ! function_exists( 'get_editable_roles' ) ) { + require_once ABSPATH . 'wp-admin/includes/user.php'; + } $editable_roles = get_editable_roles() ?? []; return [ - 'authenticated' => false, - 'api_key' => '', - 'enable_excerpt' => false, - 'roles' => array_keys( $editable_roles ), - 'length' => (int) apply_filters( 'excerpt_length', 55 ), - 'enable_titles' => false, - 'title_roles' => array_keys( $editable_roles ), - 'number_titles' => 1, + 'authenticated' => false, + 'api_key' => '', + 'enable_excerpt' => false, + 'roles' => array_keys( $editable_roles ), + 'length' => (int) apply_filters( 'excerpt_length', 55 ), + 'enable_titles' => false, + 'title_roles' => array_keys( $editable_roles ), + 'number_titles' => 1, + 'enable_resize_content' => false, + 'resize_content_roles' => array_keys( $editable_roles ), + 'number_resize_content' => 1, ]; } @@ -437,6 +612,8 @@ public function get_provider_debug_information( $settings = null, $configured = __( 'Generate titles', 'classifai' ) => $enable_titles ? __( 'yes', 'classifai' ) : __( 'no', 'classifai' ), __( 'Allowed roles (titles)', 'classifai' ) => implode( ', ', $settings['title_roles'] ?? [] ), __( 'Number of titles', 'classifai' ) => absint( $settings['number_titles'] ?? 1 ), + __( 'Allowed roles (resize)', 'classifai' ) => implode( ', ', $settings['resize_content_roles'] ?? [] ), + __( 'Number of suggestions', 'classifai' ) => absint( $settings['number_resize_content'] ?? 1 ), __( 'Latest response', 'classifai' ) => $this->get_formatted_latest_response( get_transient( 'classifai_openai_chatgpt_latest_response' ) ), ]; } @@ -461,11 +638,14 @@ public function rest_endpoint_callback( $post_id = 0, $route_to_call = '', $args // Handle all of our routes. switch ( $route_to_call ) { case 'excerpt': - $return = $this->generate_excerpt( $post_id ); + $return = $this->generate_excerpt( $post_id, $args ); break; case 'title': $return = $this->generate_titles( $post_id, $args ); break; + case 'resize_content': + $return = $this->resize_content( $post_id, $args ); + break; } return $return; @@ -474,19 +654,27 @@ public function rest_endpoint_callback( $post_id = 0, $route_to_call = '', $args /** * Generate an excerpt using ChatGPT. * - * @param int $post_id The Post ID we're processing + * @param int $post_id The Post ID we're processing + * @param array $args Arguments passed in. * @return string|WP_Error */ - public function generate_excerpt( int $post_id = 0 ) { + public function generate_excerpt( int $post_id = 0, array $args = [] ) { if ( ! $post_id || ! get_post( $post_id ) ) { return new WP_Error( 'post_id_required', esc_html__( 'A valid post ID is required to generate an excerpt.', 'classifai' ) ); } $settings = $this->get_settings(); + $args = wp_parse_args( + array_filter( $args ), + [ + 'content' => '', + 'title' => get_the_title( $post_id ), + ] + ); // These checks (and the one above) happen in the REST permission_callback, // but we run them again here in case this method is called directly. - if ( empty( $settings ) || ( isset( $settings['authenticated'] ) && false === $settings['authenticated'] ) || ( isset( $settings['enable_excerpt'] ) && 'no' === $settings['enable_excerpt'] && ( ! defined( 'WP_CLI' ) || ! WP_CLI ) ) ) { + if ( empty( $settings ) || ( isset( $settings['authenticated'] ) && false === $settings['authenticated'] ) || ( ! $this->is_feature_enabled( 'enable_excerpt' ) && ( ! defined( 'WP_CLI' ) || ! WP_CLI ) ) ) { return new WP_Error( 'not_enabled', esc_html__( 'Excerpt generation is disabled or OpenAI authentication failed. Please check your settings.', 'classifai' ) ); } @@ -506,7 +694,7 @@ public function generate_excerpt( int $post_id = 0 ) { * * @return {string} Prompt. */ - $prompt = apply_filters( 'classifai_chatgpt_excerpt_prompt', 'Provide a teaser for the following text using a maximum of ' . $excerpt_length . ' words', $post_id, $excerpt_length ); + $prompt = apply_filters( 'classifai_chatgpt_excerpt_prompt', sprintf( 'Summarize the following message using a maximum of %d words. Ensure this summary pairs well with the following text: %s.', $excerpt_length, $args['title'] ), $post_id, $excerpt_length ); /** * Filter the request body before sending to ChatGPT. @@ -524,12 +712,16 @@ public function generate_excerpt( int $post_id = 0 ) { [ 'model' => $this->chatgpt_model, 'messages' => [ + [ + 'role' => 'system', + 'content' => $prompt, + ], [ 'role' => 'user', - 'content' => $prompt . ': ' . $this->get_content( $post_id, $excerpt_length ) . '', + 'content' => $this->get_content( $post_id, $excerpt_length, false, $args['content'] ) . '', ], ], - 'temperature' => 0, + 'temperature' => 0.9, ], $post_id ); @@ -573,13 +765,14 @@ public function generate_titles( int $post_id = 0, array $args = [] ) { $args = wp_parse_args( array_filter( $args ), [ - 'num' => $settings['number_titles'] ?? 1, + 'num' => $settings['number_titles'] ?? 1, + 'content' => '', ] ); // These checks happen in the REST permission_callback, // but we run them again here in case this method is called directly. - if ( empty( $settings ) || ( isset( $settings['authenticated'] ) && false === $settings['authenticated'] ) || ( isset( $settings['enable_titles'] ) && 'no' === $settings['enable_titles'] ) ) { + if ( empty( $settings ) || ( isset( $settings['authenticated'] ) && false === $settings['authenticated'] ) || ! $this->is_feature_enabled( 'enable_titles' ) ) { return new WP_Error( 'not_enabled', esc_html__( 'Title generation is disabled or OpenAI authentication failed. Please check your settings.', 'classifai' ) ); } @@ -597,7 +790,7 @@ public function generate_titles( int $post_id = 0, array $args = [] ) { * * @return {string} Prompt. */ - $prompt = apply_filters( 'classifai_chatgpt_title_prompt', 'Write an SEO-friendly title for the following content that will encourage readers to clickthrough, staying within a range of 40 to 60 characters', $post_id, $args ); + $prompt = apply_filters( 'classifai_chatgpt_title_prompt', 'Write an SEO-friendly title for the following content that will encourage readers to clickthrough, staying within a range of 40 to 60 characters.', $post_id, $args ); /** * Filter the request body before sending to ChatGPT. @@ -615,9 +808,115 @@ public function generate_titles( int $post_id = 0, array $args = [] ) { [ 'model' => $this->chatgpt_model, 'messages' => [ + [ + 'role' => 'system', + 'content' => $prompt, + ], + [ + 'role' => 'user', + 'content' => $this->get_content( $post_id, absint( $args['num'] ) * 15, false, $args['content'] ) . '', + ], + ], + 'temperature' => 0.9, + 'n' => absint( $args['num'] ), + ], + $post_id + ); + + // Make our API request. + $response = $request->post( + $this->chatgpt_url, + [ + 'body' => wp_json_encode( $body ), + ] + ); + + set_transient( 'classifai_openai_chatgpt_latest_response', $response, DAY_IN_SECONDS * 30 ); + + if ( is_wp_error( $response ) ) { + return $response; + } + + if ( empty( $response['choices'] ) ) { + return new WP_Error( 'no_choices', esc_html__( 'No choices were returned from OpenAI.', 'classifai' ) ); + } + + // Extract out the text response. + $return = []; + foreach ( $response['choices'] as $choice ) { + if ( isset( $choice['message'], $choice['message']['content'] ) ) { + // ChatGPT often adds quotes to strings, so remove those as well as extra spaces. + $return[] = sanitize_text_field( trim( $choice['message']['content'], ' "\'' ) ); + } + } + + return $return; + } + + /** + * Resizes content. + * + * @param int $post_id The Post Id we're processing + * @param array $args Arguments passed in. + * @return string|WP_Error + */ + public function resize_content( int $post_id, array $args = array() ) { + if ( ! $post_id || ! get_post( $post_id ) ) { + return new WP_Error( 'post_id_required', esc_html__( 'Post ID is required to resize content.', 'classifai' ) ); + } + + $settings = $this->get_settings(); + $args = wp_parse_args( + array_filter( $args ), + [ + 'num' => $settings['number_resize_content'] ?? 1, + ] + ); + + $request = new APIRequest( $settings['api_key'] ?? '' ); + + if ( 'shrink' === $args['resize_type'] ) { + $prompt = 'Decrease the content length no more than 2 to 4 sentences.'; + } else { + $prompt = 'Increase the content length no more than 2 to 4 sentences.'; + } + + /** + * Filter the resize prompt we will send to ChatGPT. + * + * @since 2.3.0 + * + * @param {string} $prompt Resize prompt we are sending to ChatGPT. Gets added as a system prompt. + * @param {int} $post_id ID of post. + * @param {array} $args Arguments passed to endpoint. + * + * @return {string} Prompt. + */ + $prompt = apply_filters( 'classifai_chatgpt_' . $args['resize_type'] . '_content_prompt', $prompt, $post_id, $args ); + + /** + * Filter the resize request body before sending to ChatGPT. + * + * @since 2.3.0 + * @hook classifai_chatgpt_resize_content_request_body + * + * @param {array} $body Request body that will be sent to ChatGPT. + * @param {int} $post_id ID of post. + * + * @return {array} Request body. + */ + $body = apply_filters( + 'classifai_chatgpt_resize_content_request_body', + [ + 'model' => $this->chatgpt_model, + 'messages' => [ + [ + 'role' => 'system', + 'content' => $prompt, + ], [ 'role' => 'user', - 'content' => esc_html( $prompt ) . ': ' . $this->get_content( $post_id, absint( $args['num'] ) * 15, false ) . '', + 'content' => esc_html( $args['content'] ), ], ], 'temperature' => 0.9, @@ -646,6 +945,7 @@ public function generate_titles( int $post_id = 0, array $args = [] ) { // Extract out the text response. $return = []; + foreach ( $response['choices'] as $choice ) { if ( isset( $choice['message'], $choice['message']['content'] ) ) { // ChatGPT often adds quotes to strings, so remove those as well as extra spaces. @@ -659,12 +959,13 @@ public function generate_titles( int $post_id = 0, array $args = [] ) { /** * Get our content, trimming if needed. * - * @param int $post_id Post ID to get content from. - * @param int $return_length Word length of returned content. - * @param bool $use_title Whether to use the title or not. + * @param int $post_id Post ID to get content from. + * @param int $return_length Word length of returned content. + * @param bool $use_title Whether to use the title or not. + * @param string $post_content The post content. * @return string */ - public function get_content( int $post_id = 0, int $return_length = 0, bool $use_title = true ) { + public function get_content( int $post_id = 0, int $return_length = 0, bool $use_title = true, string $post_content = '' ) { $tokenizer = new Tokenizer( $this->max_tokens ); $normalizer = new Normalizer(); @@ -678,22 +979,25 @@ public function get_content( int $post_id = 0, int $return_length = 0, bool $use /** * We then subtract those tokens from the max number of tokens ChatGPT allows * in a single request, as well as subtracting out the number of tokens in our - * prompt (13). ChatGPT counts both the tokens in the request and in + * prompt (~50). ChatGPT counts both the tokens in the request and in * the response towards the max. */ - $max_content_tokens = $this->max_tokens - $return_tokens - 13; + $max_content_tokens = $this->max_tokens - $return_tokens - 50; + + if ( empty( $post_content ) ) { + $post = get_post( $post_id ); + $post_content = apply_filters( 'the_content', $post->post_content ); + } + + $post_content = preg_replace( '#\[.+\](.+)\[/.+\]#', '$1', $post_content ); // Then trim our content, if needed, to stay under the max. if ( $use_title ) { $content = $tokenizer->trim_content( - $normalizer->normalize( $post_id ), + $normalizer->normalize( $post_id, $post_content ), (int) $max_content_tokens ); } else { - $post = get_post( $post_id ); - $post_content = apply_filters( 'the_content', $post->post_content ); - $post_content = preg_replace( '#\[.+\](.+)\[/.+\]#', '$1', $post_content ); - $content = $tokenizer->trim_content( $normalizer->normalize_content( $post_content, '', $post_id ), (int) $max_content_tokens diff --git a/includes/Classifai/Providers/OpenAI/DallE.php b/includes/Classifai/Providers/OpenAI/DallE.php index 9b4a91609..7a3b4a070 100644 --- a/includes/Classifai/Providers/OpenAI/DallE.php +++ b/includes/Classifai/Providers/OpenAI/DallE.php @@ -57,29 +57,37 @@ public function __construct( $service ) { * This only fires if can_register returns true. */ public function register() { - $settings = $this->get_settings(); - - // Check if the current user has permission to generate images. - $roles = $settings['roles'] ?? []; - $user_roles = wp_get_current_user()->roles ?? []; - - if ( - current_user_can( 'upload_files' ) - && ( ! empty( $roles ) && empty( array_diff( $user_roles, $roles ) ) ) - && ( isset( $settings['enable_image_gen'] ) && 1 === (int) $settings['enable_image_gen'] ) - ) { + if ( $this->is_feature_enabled() ) { + add_action( 'admin_menu', [ $this, 'register_generate_media_page' ], 0 ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_scripts' ] ); add_action( 'print_media_templates', [ $this, 'print_media_templates' ] ); } } + /** + * Registers a Media > Generate Image submenu + */ + public function register_generate_media_page() { + $settings = $this->get_settings(); + $number_of_images = absint( $settings['number'] ); + + add_submenu_page( + 'upload.php', + $number_of_images > 1 ? esc_html__( 'Generate Images', 'classifai' ) : esc_html__( 'Generate Image', 'classifai' ), + $number_of_images > 1 ? esc_html__( 'Generate Images', 'classifai' ) : esc_html__( 'Generate Image', 'classifai' ), + 'upload_files', + esc_url( admin_url( 'upload.php?action=classifai-generate-image' ) ), + '' + ); + } + /** * Enqueue the admin scripts. * * @param string $hook_suffix The current admin page. */ public function enqueue_admin_scripts( $hook_suffix = '' ) { - if ( 'post.php' !== $hook_suffix && 'post-new.php' !== $hook_suffix ) { + if ( 'post.php' !== $hook_suffix && 'post-new.php' !== $hook_suffix && 'upload.php' !== $hook_suffix ) { return; } @@ -104,6 +112,14 @@ public function enqueue_admin_scripts( $hook_suffix = '' ) { true ); + wp_enqueue_script( + 'classifai-inserter-media-category', + CLASSIFAI_PLUGIN_URL . 'dist/inserter-media-category.js', + get_asset_info( 'inserter-media-category', 'dependencies' ), + get_asset_info( 'inserter-media-category', 'version' ), + true + ); + /** * Filter the default attribution added to generated images. * @@ -134,6 +150,28 @@ public function enqueue_admin_scripts( $hook_suffix = '' ) { 'caption' => $caption, ] ); + + if ( 'upload.php' === $hook_suffix ) { + $action = isset( $_GET['action'] ) ? sanitize_key( wp_unslash( $_GET['action'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + + if ( 'classifai-generate-image' === $action ) { + wp_enqueue_script( + 'classifai-generate-images-media-upload', + CLASSIFAI_PLUGIN_URL . 'dist/generate-image-media-upload.js', + [ 'jquery' ], + get_asset_info( 'classifai-generate-images-media-upload', 'version' ), + true + ); + + wp_localize_script( + 'classifai-generate-images-media-upload', + 'classifaiGenerateImages', + [ + 'upload_url' => esc_url( admin_url( 'upload.php' ) ), + ] + ); + } + } } /** @@ -245,6 +283,19 @@ function( $role ) { ); $roles = array_combine( array_keys( $roles ), array_column( $roles, 'name' ) ); + /** + * Filter the allowed WordPress roles for DALL·E + * + * @since 2.3.0 + * @hook classifai_openai_dalle_allowed_image_roles + * + * @param {array} $roles Array of arrays containing role information. + * @param {array} $default_settings Default setting values. + * + * @return {array} Roles array. + */ + $roles = apply_filters( 'classifai_openai_dalle_allowed_image_roles', $roles, $default_settings ); + add_settings_field( 'roles', esc_html__( 'Allowed roles', 'classifai' ), @@ -344,7 +395,7 @@ public function reset_settings() { * * @return array */ - private function get_default_settings() { + public function get_default_settings() { return [ 'authenticated' => false, 'api_key' => '', @@ -404,7 +455,7 @@ public function generate_image_callback( string $prompt = '', array $args = [] ) // These checks already ran in the REST permission_callback, // but we run them again here in case this method is called directly. - if ( ! current_user_can( 'upload_files' ) ) { + if ( ! $this->is_feature_enabled() ) { // Note that we purposely leave off the textdomain here as this is the same error // message core uses, so we want translations to load from there. return new WP_Error( 'rest_forbidden', esc_html__( 'Sorry, you are not allowed to do that.' ) ); @@ -483,4 +534,39 @@ public function generate_image_callback( string $prompt = '', array $args = [] ) return $response; } + /** + * Checks whether we can generate images. + * + * @return bool + */ + public function is_feature_enabled() { + $access = false; + $settings = $this->get_settings(); + + // Check if the current user has permission to generate images. + $roles = $settings['roles'] ?? []; + $user_roles = wp_get_current_user()->roles ?? []; + + if ( + current_user_can( 'upload_files' ) + && ( ! empty( $roles ) && empty( array_diff( $user_roles, $roles ) ) ) + && ( isset( $settings['enable_image_gen'] ) && 1 === (int) $settings['enable_image_gen'] ) + ) { + $access = true; + } + + /** + * Filter to override permission to use the image gen feature. + * + * @since 2.3.0 + * @hook classifai_openai_dalle_enable_image_gen + * + * @param {bool} $access Current access value. + * @param {array} $settings Feature settings. + * + * @return {bool} Should the user have access? + */ + return apply_filters( 'classifai_openai_dalle_enable_image_gen', $access, $settings ); + } + } diff --git a/includes/Classifai/Providers/OpenAI/Embeddings.php b/includes/Classifai/Providers/OpenAI/Embeddings.php index cefe95b69..f82b93891 100644 --- a/includes/Classifai/Providers/OpenAI/Embeddings.php +++ b/includes/Classifai/Providers/OpenAI/Embeddings.php @@ -282,7 +282,7 @@ public function reset_settings() { * * @return array */ - private function get_default_settings() { + public function get_default_settings() { return [ 'authenticated' => false, 'api_key' => '', @@ -444,7 +444,7 @@ private function set_terms( int $post_id = 0, array $embedding = [] ) { 'taxonomy' => $tax, 'hide_empty' => false, 'fields' => 'ids', - 'meta_key' => 'classifai_openai_embeddings', + 'meta_key' => 'classifai_openai_embeddings', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key // 'number' => 500, TODO: see if we need a limit here. ] ); @@ -499,7 +499,7 @@ private function trigger_taxonomy_update( string $taxonomy = '' ) { 'taxonomy' => $taxonomy, 'hide_empty' => false, 'fields' => 'ids', - 'meta_key' => 'classifai_openai_embeddings', + 'meta_key' => 'classifai_openai_embeddings', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key 'meta_compare' => 'NOT EXISTS', // 'number' => 500, TODO: see if we need a limit here. ] diff --git a/includes/Classifai/Providers/OpenAI/Whisper.php b/includes/Classifai/Providers/OpenAI/Whisper.php index 2beb0640f..6ffce1b91 100644 --- a/includes/Classifai/Providers/OpenAI/Whisper.php +++ b/includes/Classifai/Providers/OpenAI/Whisper.php @@ -300,7 +300,7 @@ public function reset_settings() { * * @return array */ - private function get_default_settings() { + public function get_default_settings() { return [ 'authenticated' => false, 'api_key' => '', diff --git a/includes/Classifai/Providers/Provider.php b/includes/Classifai/Providers/Provider.php index 488886b08..35cfe03cc 100644 --- a/includes/Classifai/Providers/Provider.php +++ b/includes/Classifai/Providers/Provider.php @@ -112,7 +112,7 @@ public function get_onboarding_options() { } /** - * Can the Provider be initalized? + * Can the Provider be initialized? */ public function can_register() { return $this->is_configured(); @@ -153,7 +153,7 @@ public function register_settings() { * @return string|array|mixed */ public function get_settings( $index = false ) { - $defaults = []; + $defaults = $this->get_default_settings(); $settings = get_option( $this->get_option_name(), [] ); $settings = wp_parse_args( $settings, $defaults ); @@ -164,6 +164,15 @@ public function get_settings( $index = false ) { return $settings; } + /** + * Returns the default settings. + * + * @return array + */ + public function get_default_settings() { + return []; + } + /** * Generic text input field callback * diff --git a/includes/Classifai/Providers/Watson/NLU.php b/includes/Classifai/Providers/Watson/NLU.php index 72f9ca0c3..f38405832 100644 --- a/includes/Classifai/Providers/Watson/NLU.php +++ b/includes/Classifai/Providers/Watson/NLU.php @@ -27,6 +27,11 @@ class NLU extends Provider { */ public $save_post_handler; + /** + * @var $nlu_features array The list of NLU features + */ + protected $nlu_features = []; + /** * Watson NLU constructor. * @@ -251,6 +256,7 @@ public function setup_fields_sections() { function() { printf( wp_kses( + /* translators: %1$s is the link to register for an IBM Cloud account, %2$s is the link to setup the NLU service */ __( 'Don\'t have an IBM Cloud account yet? Register for one and set up a Natural Language Understanding Resource to get your API key.', 'classifai' ), [ 'a' => [ @@ -270,6 +276,7 @@ function() { echo '';
printf(
wp_kses(
+ /* translators: %s is the link to the IBM Watson documentation */
__( 'The `watsonplatform.net` endpoint URLs were retired on 26 May 2021. Please update the endpoint url. Check here for details.', 'classifai' ),
[
'a' => [
diff --git a/includes/Classifai/Services/ImageProcessing.php b/includes/Classifai/Services/ImageProcessing.php
index 31ace8b49..39d314178 100644
--- a/includes/Classifai/Services/ImageProcessing.php
+++ b/includes/Classifai/Services/ImageProcessing.php
@@ -51,7 +51,7 @@ public function enqueue_media_scripts() {
true
);
- $provider = find_provider_class( $this->provider_classes ?? [], 'Computer Vision' );
+ $provider = find_provider_class( $this->provider_classes ?? [], 'AI Vision' );
if ( ! is_wp_error( $provider ) ) {
wp_add_inline_script(
'classifai-media-script',
@@ -236,7 +236,7 @@ public function computer_vision_endpoint_callback( $request ) {
}
// Find the right provider class.
- $provider = find_provider_class( $this->provider_classes ?? [], 'Computer Vision' );
+ $provider = find_provider_class( $this->provider_classes ?? [], 'AI Vision' );
// Ensure we have a provider class. Should never happen but :shrug:
if ( is_wp_error( $provider ) ) {
@@ -273,7 +273,7 @@ public function computer_vision_endpoint_permissions_check( WP_REST_Request $req
return false;
}
- $settings = \Classifai\get_plugin_settings( 'image_processing', 'Computer Vision' );
+ $settings = \Classifai\get_plugin_settings( 'image_processing', 'AI Vision' );
// For the image-tags route, ensure the taxonomy is valid and the user has permission to assign terms.
if ( 'image-tags' === $route_to_call ) {
@@ -333,31 +333,24 @@ public function generate_image( WP_REST_Request $request ) {
* @return WP_Error|bool
*/
public function generate_image_permissions_check() {
- // Ensure we have a logged in user that can upload files.
- if ( ! current_user_can( 'upload_files' ) ) {
- return false;
- }
-
+ $provider = find_provider_class( $this->provider_classes ?? [], 'DALL·E' );
$settings = \Classifai\get_plugin_settings( 'image_processing', 'DALL·E' );
+ // Ensure we have a provider class. Should never happen but :shrug:
+ if ( is_wp_error( $provider ) ) {
+ return $provider;
+ }
+
// Check if valid authentication is in place.
if ( empty( $settings ) || ( isset( $settings['authenticated'] ) && false === $settings['authenticated'] ) ) {
return new WP_Error( 'auth', esc_html__( 'Please set up valid authentication with OpenAI.', 'classifai' ) );
}
- // Check if image generation is turned on.
- if ( empty( $settings ) || ( isset( $settings['enable_image_gen'] ) && 'no' === $settings['enable_image_gen'] ) ) {
+ // Ensure the feature is enabled. Also runs a user check.
+ if ( ! $provider->is_feature_enabled() ) {
return new WP_Error( 'not_enabled', esc_html__( 'Image generation not currently enabled.', 'classifai' ) );
}
- // Check if the current user's role is allowed.
- $roles = $settings['roles'] ?? [];
- $user_roles = wp_get_current_user()->roles ?? [];
-
- if ( empty( $roles ) || ! empty( array_diff( $user_roles, $roles ) ) ) {
- return false;
- }
-
return true;
}
diff --git a/includes/Classifai/Services/LanguageProcessing.php b/includes/Classifai/Services/LanguageProcessing.php
index 462815535..0d6537abb 100644
--- a/includes/Classifai/Services/LanguageProcessing.php
+++ b/includes/Classifai/Services/LanguageProcessing.php
@@ -6,7 +6,6 @@
namespace Classifai\Services;
use Classifai\Admin\SavePostHandler;
-use Classifai\Providers\Azure\TextToSpeech;
use function Classifai\find_provider_class;
use WP_REST_Server;
use WP_REST_Request;
@@ -65,19 +64,41 @@ public function register_endpoints() {
register_rest_route(
'classifai/v1/openai',
- 'generate-excerpt/(?Phttps://LOCATION.tts.speech.microsoft.com/
. Replace "
@@ -766,54 +763,62 @@ msgid ""
"resource in Azure."
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:185
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:183
msgid "Post Types"
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:200
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:198
msgid "Voice"
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:252
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:253
msgid ""
"One or more credentials required to connect to the Azure Text to Speech "
"service is empty."
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:334
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:333
msgid "Azure Speech to Text: HTTP request failed."
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:348
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:347
msgid "Connection to Azure Text to Speech failed."
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:423
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:422
msgid "Latest response - Voices"
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:510
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:602
msgid "ClassifAI Text to Speech Processing"
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:542
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:649
msgid "Enable audio generation"
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:547
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:654
#. translators: %s Post type label
-msgid "ClassifAI will generate audio for this %s when it is published or updated"
+msgid "ClassifAI will generate audio for this %s when it is published or updated."
+msgstr ""
+
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:662
+msgid "Display audio controls"
+msgstr ""
+
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:666
+msgid "Controls the display of the audio player on the front-end."
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:705
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:831
msgid "Play audio"
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:705
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:831
msgid "Pause audio"
msgstr ""
-#: includes/Classifai/Providers/Azure/TextToSpeech.php:724
+#: includes/Classifai/Providers/Azure/TextToSpeech.php:850
msgid "Listen to this"
msgstr ""
@@ -821,131 +826,176 @@ msgstr ""
msgid "An error occured"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:55
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:53
msgid "OpenAI ChatGPT"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:58
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:56
msgid "Excerpt generation"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:59
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:57
msgid "Title generation"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:86
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:295
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:437
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:58
+msgid "Content resizing"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:129
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:392
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:612
msgid "Generate titles"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:87
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:130
msgid "Select a title"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:88
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:131
msgid "Select"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:233
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:270
+msgid "Re-generate excerpt"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:317
msgid "Excerpt settings"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:248
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:332
msgid ""
"A button will be added to the excerpt panel that can be used to generate an "
"excerpt."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:257
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:309
-#: includes/Classifai/Providers/OpenAI/DallE.php:250
-#: includes/Classifai/Providers/OpenAI/DallE.php:376
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:354
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:406
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:460
+#: includes/Classifai/Providers/OpenAI/DallE.php:301
+#: includes/Classifai/Providers/OpenAI/DallE.php:427
#: includes/Classifai/Providers/OpenAI/Whisper.php:249
#: includes/Classifai/Providers/OpenAI/Whisper.php:330
msgid "Allowed roles"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:265
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:362
msgid "Choose which roles are allowed to generate excerpts."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:271
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:436
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:368
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:611
msgid "Excerpt length"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:281
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:378
msgid ""
"How many words should the excerpt be? Note that the final result may not "
"exactly match this. In testing, ChatGPT tended to exceed this number by "
"10-15 words."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:288
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:385
msgid "Title settings"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:303
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:400
msgid ""
"A button will be added to the status panel that can be used to generate "
"titles."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:317
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:414
msgid "Choose which roles are allowed to generate titles."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:323
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:439
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:420
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:614
msgid "Number of titles"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:331
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:428
msgid "Number of titles that will be generated in one request."
msgstr ""
#: includes/Classifai/Providers/OpenAI/ChatGPT.php:435
+msgid "Resizing content settings"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:442
+msgid "Enable content resizing"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:450
+msgid ""
+"\"Shrink content\" and \"Grow content\" menu items will be added to the "
+"paragraph block's toolbar menu."
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:468
+msgid "Choose which roles are allowed to resize content."
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:474
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:616
+msgid "Number of suggestions"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:482
+msgid "Number of suggestions that will be generated in one request."
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:610
msgid "Allowed roles (excerpt)"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:438
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:613
msgid "Allowed roles (titles)"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:440
-#: includes/Classifai/Providers/OpenAI/DallE.php:379
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:615
+msgid "Allowed roles (resize)"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:617
+#: includes/Classifai/Providers/OpenAI/DallE.php:430
#: includes/Classifai/Providers/OpenAI/Embeddings.php:319
#: includes/Classifai/Providers/OpenAI/Whisper.php:331
-#: includes/Classifai/Providers/Watson/NLU.php:761
+#: includes/Classifai/Providers/Watson/NLU.php:768
msgid "Latest response"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:456
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:482
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:633
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:663
msgid "A valid post ID is required to generate an excerpt."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:490
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:678
msgid ""
"Excerpt generation is disabled or OpenAI authentication failed. Please "
"check your settings."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:569
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:761
msgid "Post ID is required to generate titles."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:583
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:776
msgid ""
"Title generation is disabled or OpenAI authentication failed. Please check "
"your settings."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/ChatGPT.php:644
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:841
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:943
msgid "No choices were returned from OpenAI."
msgstr ""
+#: includes/Classifai/Providers/OpenAI/ChatGPT.php:865
+msgid "Post ID is required to resize content."
+msgstr ""
+
#: includes/Classifai/Providers/OpenAI/DallE.php:46
msgid "OpenAI DALL·E"
msgstr ""
@@ -954,121 +1004,131 @@ msgstr ""
msgid "Image generation"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:121
+#: includes/Classifai/Providers/OpenAI/DallE.php:76
+#: includes/Classifai/Providers/OpenAI/DallE.php:77
+msgid "Generate Images"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/DallE.php:76
+#: includes/Classifai/Providers/OpenAI/DallE.php:77
+msgid "Generate Image"
+msgstr ""
+
+#: includes/Classifai/Providers/OpenAI/DallE.php:137
#. translators: %1$s is replaced with the OpenAI DALL·E URL
msgid "Image generated by OpenAI's DALL·E"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:131
-#: includes/Classifai/Providers/OpenAI/DallE.php:172
-#: includes/Classifai/Providers/OpenAI/DallE.php:375
+#: includes/Classifai/Providers/OpenAI/DallE.php:147
+#: includes/Classifai/Providers/OpenAI/DallE.php:210
+#: includes/Classifai/Providers/OpenAI/DallE.php:426
msgid "Generate images"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:131
-#: includes/Classifai/Providers/OpenAI/DallE.php:174
+#: includes/Classifai/Providers/OpenAI/DallE.php:147
+#: includes/Classifai/Providers/OpenAI/DallE.php:212
msgid "Generate image"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:132
+#: includes/Classifai/Providers/OpenAI/DallE.php:148
msgid "Something went wrong. No results found"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:133
+#: includes/Classifai/Providers/OpenAI/DallE.php:149
msgid "Select image"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:153
+#: includes/Classifai/Providers/OpenAI/DallE.php:191
msgid "Enter a prompt below to generate images."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:155
+#: includes/Classifai/Providers/OpenAI/DallE.php:193
msgid "Enter a prompt below to generate an image."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:162
+#: includes/Classifai/Providers/OpenAI/DallE.php:200
msgid ""
"Once images are generated, choose one or more of those to import into your "
"Media Library and then choose one image to insert."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:164
+#: includes/Classifai/Providers/OpenAI/DallE.php:202
msgid ""
"Once an image is generated, you can import it into your Media Library and "
"then select to insert."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:168
+#: includes/Classifai/Providers/OpenAI/DallE.php:206
msgid "Enter prompt"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:184
+#: includes/Classifai/Providers/OpenAI/DallE.php:222
msgid "Images generated from prompt:"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:186
+#: includes/Classifai/Providers/OpenAI/DallE.php:224
msgid "Image generated from prompt:"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:203
+#: includes/Classifai/Providers/OpenAI/DallE.php:241
msgid "Import into Media Library"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:204
+#: includes/Classifai/Providers/OpenAI/DallE.php:242
msgid "Import and Insert"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:226
+#: includes/Classifai/Providers/OpenAI/DallE.php:264
msgid "Enable image generation"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:234
+#: includes/Classifai/Providers/OpenAI/DallE.php:272
msgid ""
"When enabled, a new Generate images tab will be shown in the media upload "
"flow, allowing you to generate and import images."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:258
+#: includes/Classifai/Providers/OpenAI/DallE.php:309
msgid ""
"Choose which roles are allowed to generate images. Note that the roles "
"above only include those that have permissions to upload media."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:264
-#: includes/Classifai/Providers/OpenAI/DallE.php:377
+#: includes/Classifai/Providers/OpenAI/DallE.php:315
+#: includes/Classifai/Providers/OpenAI/DallE.php:428
msgid "Number of images"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:272
+#: includes/Classifai/Providers/OpenAI/DallE.php:323
msgid ""
"Number of images that will be generated in one request. Note that each "
"image will incur separate costs."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:278
-#: includes/Classifai/Providers/OpenAI/DallE.php:378
+#: includes/Classifai/Providers/OpenAI/DallE.php:329
+#: includes/Classifai/Providers/OpenAI/DallE.php:429
msgid "Image size"
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:290
+#: includes/Classifai/Providers/OpenAI/DallE.php:341
msgid "Size of generated images."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:392
+#: includes/Classifai/Providers/OpenAI/DallE.php:443
msgid "A prompt is required to generate an image."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:410
+#: includes/Classifai/Providers/OpenAI/DallE.php:461
msgid "Sorry, you are not allowed to do that."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:414
+#: includes/Classifai/Providers/OpenAI/DallE.php:465
msgid ""
"Image generation is disabled or OpenAI authentication failed. Please check "
"your settings."
msgstr ""
-#: includes/Classifai/Providers/OpenAI/DallE.php:431
+#: includes/Classifai/Providers/OpenAI/DallE.php:482
msgid ""
"Your image prompt is too long. Please ensure it doesn't exceed 1000 "
"characters."
@@ -1092,7 +1152,7 @@ msgstr ""
#: includes/Classifai/Providers/OpenAI/Embeddings.php:144
#: includes/Classifai/Providers/OpenAI/Embeddings.php:315
-#: includes/Classifai/Providers/Watson/NLU.php:759
+#: includes/Classifai/Providers/Watson/NLU.php:766
msgid "Post types"
msgstr ""
@@ -1157,12 +1217,12 @@ msgid "No data returned from OpenAI."
msgstr ""
#: includes/Classifai/Providers/OpenAI/Embeddings.php:722
-#: includes/Classifai/Providers/Watson/NLU.php:811
+#: includes/Classifai/Providers/Watson/NLU.php:818
msgid "ClassifAI Language Processing"
msgstr ""
#: includes/Classifai/Providers/OpenAI/Embeddings.php:752
-#: includes/Classifai/Providers/Watson/NLU.php:842
+#: includes/Classifai/Providers/Watson/NLU.php:849
msgid "Process content on update"
msgstr ""
@@ -1202,10 +1262,11 @@ msgid "Generate transcripts from audio files"
msgstr ""
#: includes/Classifai/Providers/OpenAI/Whisper.php:64
-#: includes/Classifai/Services/ImageProcessing.php:345
-#: includes/Classifai/Services/LanguageProcessing.php:288
-#: includes/Classifai/Services/LanguageProcessing.php:413
-#: includes/Classifai/Services/LanguageProcessing.php:496
+#: includes/Classifai/Services/ImageProcessing.php:346
+#: includes/Classifai/Services/LanguageProcessing.php:371
+#: includes/Classifai/Services/LanguageProcessing.php:488
+#: includes/Classifai/Services/LanguageProcessing.php:572
+#: includes/Classifai/Services/LanguageProcessing.php:643
msgid "Please set up valid authentication with OpenAI."
msgstr ""
@@ -1242,85 +1303,87 @@ msgstr ""
msgid "Generate transcripts"
msgstr ""
-#: includes/Classifai/Providers/Provider.php:324
+#: includes/Classifai/Providers/Provider.php:333
msgid "Alt text"
msgstr ""
-#: includes/Classifai/Providers/Provider.php:325
+#: includes/Classifai/Providers/Provider.php:334
msgid "Image caption"
msgstr ""
-#: includes/Classifai/Providers/Provider.php:326
+#: includes/Classifai/Providers/Provider.php:335
msgid "Image description"
msgstr ""
-#: includes/Classifai/Providers/Provider.php:406
-#: includes/Classifai/Providers/Watson/NLU.php:774
+#: includes/Classifai/Providers/Provider.php:415
+#: includes/Classifai/Providers/Watson/NLU.php:781
msgid "N/A"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:45
+#: includes/Classifai/Providers/Watson/NLU.php:50
#: includes/Classifai/Services/Service.php:172
msgid "Category"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:46
+#: includes/Classifai/Providers/Watson/NLU.php:51
msgid "Category Threshold (%)"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:47
+#: includes/Classifai/Providers/Watson/NLU.php:52
msgid "Category Taxonomy"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:52
+#: includes/Classifai/Providers/Watson/NLU.php:57
#: includes/Classifai/Services/Service.php:177
msgid "Keyword"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:53
+#: includes/Classifai/Providers/Watson/NLU.php:58
msgid "Keyword Threshold (%)"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:54
+#: includes/Classifai/Providers/Watson/NLU.php:59
msgid "Keyword Taxonomy"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:59
+#: includes/Classifai/Providers/Watson/NLU.php:64
#: includes/Classifai/Services/Service.php:182
msgid "Entity"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:60
+#: includes/Classifai/Providers/Watson/NLU.php:65
msgid "Entity Threshold (%)"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:61
+#: includes/Classifai/Providers/Watson/NLU.php:66
msgid "Entity Taxonomy"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:66
+#: includes/Classifai/Providers/Watson/NLU.php:71
#: includes/Classifai/Services/Service.php:187
msgid "Concept"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:67
+#: includes/Classifai/Providers/Watson/NLU.php:72
msgid "Concept Threshold (%)"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:68
+#: includes/Classifai/Providers/Watson/NLU.php:73
msgid "Concept Taxonomy"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:76
+#: includes/Classifai/Providers/Watson/NLU.php:81
msgid "IBM Watson NLU"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:84
+#: includes/Classifai/Providers/Watson/NLU.php:89
#. translators: %s is the post type label.
msgid "Automatically tag %s"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:254
+#: includes/Classifai/Providers/Watson/NLU.php:260
+#. translators: %1$s is the link to register for an IBM Cloud account, %2$s is
+#. the link to setup the NLU service
msgid ""
"Don't have an IBM Cloud account yet? Register for one and set up a here for details."
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:316
+#: includes/Classifai/Providers/Watson/NLU.php:323
msgid "API Username"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:379
+#: includes/Classifai/Providers/Watson/NLU.php:386
msgid "Post Types to Classify"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:390
+#: includes/Classifai/Providers/Watson/NLU.php:397
msgid "Post Statuses to Classify"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:541
+#: includes/Classifai/Providers/Watson/NLU.php:548
msgid "Watson Category Settings"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:546
+#: includes/Classifai/Providers/Watson/NLU.php:553
msgid "Enable"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:601
+#: includes/Classifai/Providers/Watson/NLU.php:608
msgid "Please enter your credentials."
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:719
+#: includes/Classifai/Providers/Watson/NLU.php:726
msgid ""
"OpenAI Embeddings classification is turned on. This may conflict with the "
"NLU classification feature. It is possible to run both features but if they "
"use the same taxonomies, one will overwrite the other."
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:756
+#: includes/Classifai/Providers/Watson/NLU.php:763
msgid "Configured"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:758
+#: includes/Classifai/Providers/Watson/NLU.php:765
msgid "API username"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:760
+#: includes/Classifai/Providers/Watson/NLU.php:767
msgid "Features"
msgstr ""
-#: includes/Classifai/Providers/Watson/NLU.php:849
+#: includes/Classifai/Providers/Watson/NLU.php:856
#. translators: %s Post type label
msgid "Classify %s"
msgstr ""
@@ -1420,15 +1484,15 @@ msgstr ""
msgid "Ensure the service settings have been saved."
msgstr ""
-#: includes/Classifai/Services/ImageProcessing.php:350
+#: includes/Classifai/Services/ImageProcessing.php:351
msgid "Image generation not currently enabled."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:22
+#: includes/Classifai/Services/LanguageProcessing.php:21
msgid "Language Processing"
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:59
+#: includes/Classifai/Services/LanguageProcessing.php:58
msgid "Post ID to generate tags."
msgstr ""
@@ -1436,44 +1500,69 @@ msgstr ""
msgid "Post ID to generate excerpt for."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:95
+#: includes/Classifai/Services/LanguageProcessing.php:91
+msgid "Content to summarize into an excerpt."
+msgstr ""
+
+#: includes/Classifai/Services/LanguageProcessing.php:97
+msgid "Title of content we want a summary for."
+msgstr ""
+
+#: includes/Classifai/Services/LanguageProcessing.php:116
msgid "ID of post to run text to speech conversion on."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:113
+#: includes/Classifai/Services/LanguageProcessing.php:134
msgid "Attachment ID to generate transcript for."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:131
+#: includes/Classifai/Services/LanguageProcessing.php:153
msgid "Post ID to generate title for."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:139
+#: includes/Classifai/Services/LanguageProcessing.php:161
msgid "Number of titles to generate"
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:159
+#: includes/Classifai/Services/LanguageProcessing.php:175
+msgid "Content to generate a title for"
+msgstr ""
+
+#: includes/Classifai/Services/LanguageProcessing.php:195
+msgid "Post ID to resize the content for."
+msgstr ""
+
+#: includes/Classifai/Services/LanguageProcessing.php:201
+msgid "The content to resize."
+msgstr ""
+
+#: includes/Classifai/Services/LanguageProcessing.php:207
+msgid "The type of resize operation. \"grow\" or \"shrink\"."
+msgstr ""
+
+#: includes/Classifai/Services/LanguageProcessing.php:226
msgid "Post ID is required to classify post."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:231
+#: includes/Classifai/Services/LanguageProcessing.php:298
msgid "Language Processing not enabled for current post."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:293
+#: includes/Classifai/Services/LanguageProcessing.php:376
+#: includes/Classifai/Services/LanguageProcessing.php:577
msgid "Excerpt generation not currently enabled."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:351
+#: includes/Classifai/Services/LanguageProcessing.php:426
msgid "Azure Speech synthesis is not enabled for current post."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:418
+#: includes/Classifai/Services/LanguageProcessing.php:493
msgid "Transcription is not currently enabled."
msgstr ""
-#: includes/Classifai/Services/LanguageProcessing.php:501
-msgid "Title generation not currently enabled."
+#: includes/Classifai/Services/LanguageProcessing.php:648
+msgid "Content resizing not currently enabled."
msgstr ""
#: includes/Classifai/Services/Personalizer.php:20
@@ -1548,51 +1637,63 @@ msgstr ""
msgid "Email"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:114
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:116
+#. translators: %s: Plural taxonomy label
msgid "Search %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:115
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:121
+#. translators: %s: Plural taxonomy label
msgid "Popular %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:116
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:126
+#. translators: %s: Plural taxonomy label
msgid "All %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:117
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:131
+#. translators: %s: Singular taxonomy label
msgid "Edit %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:118
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:136
+#. translators: %s: Singular taxonomy label
msgid "Update %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:119
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:141
+#. translators: %s: Singular taxonomy label
msgid "Add New %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:120
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:146
+#. translators: %s: Singular taxonomy label
msgid "New %s Name"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:121
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:151
+#. translators: %s: Plural taxonomy label
msgid "Separate %s with commas"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:122
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:156
+#. translators: %s: Plural taxonomy label
msgid "Add or remove %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:123
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:161
+#. translators: %s: Plural taxonomy label
msgid "Choose from the most used %s"
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:124
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:166
+#. translators: %s: Plural taxonomy label
msgid "No %s found."
msgstr ""
-#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:125
+#: includes/Classifai/Taxonomy/AbstractTaxonomy.php:171
+#. translators: %s: Plural taxonomy label
msgid "No %s found in Trash."
msgstr ""
diff --git a/readme.txt b/readme.txt
index b960f70a8..33400a0b8 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,10 +1,10 @@
=== ClassifAI ===
Contributors: 10up, jeffpaul, dkotter
Tags: AI, Artifical Intelligence, ML, Machine Learning, Microsoft Azure, IBM Watson, OpenAI, ChatGPT, DALL·E, Content Tagging, Classification, Smart Cropping, Alt Text
-Requires at least: 5.7
-Tested up to: 6.2
+Requires at least: 5.8
+Tested up to: 6.3
Requires PHP: 7.4
-Stable tag: 2.2.3
+Stable tag: 2.3.0
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -20,23 +20,27 @@ Tap into leading cloud-based services like [OpenAI](https://openai.com/), [Micro
* Generate a summary of post content and store it as an excerpt using [OpenAI's ChatGPT API](https://platform.openai.com/docs/guides/chat)
* Generate titles from post content using [OpenAI's ChatGPT API](https://platform.openai.com/docs/guides/chat)
+* Expand or condense text content using [OpenAI's ChatGPT API](https://platform.openai.com/docs/guides/chat)
* Generate new images on demand to use in-content or as a featured image using [OpenAI's DALL·E API](https://platform.openai.com/docs/guides/images)
* Generate transcripts of audio files using [OpenAI's Whisper API](https://platform.openai.com/docs/guides/speech-to-text)
* Convert text content into audio and output a "read-to-me" feature on the front-end to play this audio using [Microsoft Azure's Text to Speech API](https://learn.microsoft.com/en-us/azure/cognitive-services/speech-service/text-to-speech)
* Classify post content using [IBM Watson's Natural Language Understanding API](https://www.ibm.com/watson/services/natural-language-understanding/) and [OpenAI's Embedding API](https://platform.openai.com/docs/guides/embeddings)
-* BETA: Recommend content based on overall site traffic via [Microsoft Azure's Personalizer API](https://azure.microsoft.com/en-us/services/cognitive-services/personalizer/) _(note that we're gathering feedback on this feature and may significantly iterate depending on community input)_
-* Generate image alt text, image tags, and smartly crop images using [Microsoft Azure's Computer Vision API](https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/)
-* Scan images and PDF files for embedded text and save for use in post meta using [Microsoft Azure's Computer Vision API](https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/)
+* BETA: Recommend content based on overall site traffic via [Microsoft Azure's AI Personalizer API](https://azure.microsoft.com/en-us/services/cognitive-services/personalizer/) _(note that we're gathering feedback on this feature and may significantly iterate depending on community input)_
+* Generate image alt text, image tags, and smartly crop images using [Microsoft Azure's AI Vision API](https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/)
+* Scan images and PDF files for embedded text and save for use in post meta using [Microsoft Azure's AI Vision API](https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/)
* Bulk classify content with [WP-CLI](https://wp-cli.org/)
**Requirements**
* To utilize the NLU Language Processing functionality, you will need an active [IBM Watson](https://cloud.ibm.com/registration) account.
* To utilize the ChatGPT, Embeddings, or Whisper Language Processing functionality or DALL·E Image Processing functionality, you will need an active [OpenAI](https://platform.openai.com/signup) account.
-* To utilize the Computer Vision Image Processing functionality or Text to Speech Language Processing functionality, you will need an active [Microsoft Azure](https://signup.azure.com/signup) account.
+* To utilize the Azure AI Vision Image Processing functionality or Text to Speech Language Processing functionality, you will need an active [Microsoft Azure](https://signup.azure.com/signup) account.
== Upgrade Notice ==
+= 2.3.0 =
+**Note that this release bumps the WordPress minimum from 5.7 to 5.8.**
+
= 2.1.0 =
**Note that this release moves the ClassifAI settings to be nested under Tools instead of it's own menu.**
diff --git a/vendor/autoload.php b/vendor/autoload.php
index 47ee49d0f..b5e755c7f 100644
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -22,4 +22,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
-return ComposerAutoloaderInit22e9f051b25081da7e8586603613e6ea::getLoader();
+return ComposerAutoloaderInitf98701dcedbd028a2e6420130e5c49ad::getLoader();
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 2180887b3..55f6ff3e7 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -6,7 +6,7 @@
$baseDir = dirname($vendorDir);
return array(
- '7166494aeff09009178f278afd86c83f' => $vendorDir . '/yahnis-elsts/plugin-update-checker/load-v4p13.php',
+ '9b77ddcfb14408a32f5aaf74e0a11694' => $vendorDir . '/yahnis-elsts/plugin-update-checker/load-v5p1.php',
'd5afeacfe11f422b161ec2bf0bc6940f' => $baseDir . '/includes/Classifai/Helpers.php',
'dd5471419f4d492e4967fd310ef99d1b' => $baseDir . '/includes/Classifai/Blocks.php',
);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index aa3fe5936..61ee335e1 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
-class ComposerAutoloaderInit22e9f051b25081da7e8586603613e6ea
+class ComposerAutoloaderInitf98701dcedbd028a2e6420130e5c49ad
{
private static $loader;
@@ -24,16 +24,16 @@ public static function getLoader()
require __DIR__ . '/platform_check.php';
- spl_autoload_register(array('ComposerAutoloaderInit22e9f051b25081da7e8586603613e6ea', 'loadClassLoader'), true, true);
+ spl_autoload_register(array('ComposerAutoloaderInitf98701dcedbd028a2e6420130e5c49ad', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
- spl_autoload_unregister(array('ComposerAutoloaderInit22e9f051b25081da7e8586603613e6ea', 'loadClassLoader'));
+ spl_autoload_unregister(array('ComposerAutoloaderInitf98701dcedbd028a2e6420130e5c49ad', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
- call_user_func(\Composer\Autoload\ComposerStaticInit22e9f051b25081da7e8586603613e6ea::getInitializer($loader));
+ call_user_func(\Composer\Autoload\ComposerStaticInitf98701dcedbd028a2e6420130e5c49ad::getInitializer($loader));
$loader->register(true);
- $filesToLoad = \Composer\Autoload\ComposerStaticInit22e9f051b25081da7e8586603613e6ea::$files;
+ $filesToLoad = \Composer\Autoload\ComposerStaticInitf98701dcedbd028a2e6420130e5c49ad::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index c973d3c91..813da7dab 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -4,10 +4,10 @@
namespace Composer\Autoload;
-class ComposerStaticInit22e9f051b25081da7e8586603613e6ea
+class ComposerStaticInitf98701dcedbd028a2e6420130e5c49ad
{
public static $files = array (
- '7166494aeff09009178f278afd86c83f' => __DIR__ . '/..' . '/yahnis-elsts/plugin-update-checker/load-v4p13.php',
+ '9b77ddcfb14408a32f5aaf74e0a11694' => __DIR__ . '/..' . '/yahnis-elsts/plugin-update-checker/load-v5p1.php',
'd5afeacfe11f422b161ec2bf0bc6940f' => __DIR__ . '/../..' . '/includes/Classifai/Helpers.php',
'dd5471419f4d492e4967fd310ef99d1b' => __DIR__ . '/../..' . '/includes/Classifai/Blocks.php',
);
@@ -46,9 +46,9 @@ class ComposerStaticInit22e9f051b25081da7e8586603613e6ea
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
- $loader->prefixLengthsPsr4 = ComposerStaticInit22e9f051b25081da7e8586603613e6ea::$prefixLengthsPsr4;
- $loader->prefixDirsPsr4 = ComposerStaticInit22e9f051b25081da7e8586603613e6ea::$prefixDirsPsr4;
- $loader->classMap = ComposerStaticInit22e9f051b25081da7e8586603613e6ea::$classMap;
+ $loader->prefixLengthsPsr4 = ComposerStaticInitf98701dcedbd028a2e6420130e5c49ad::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInitf98701dcedbd028a2e6420130e5c49ad::$prefixDirsPsr4;
+ $loader->classMap = ComposerStaticInitf98701dcedbd028a2e6420130e5c49ad::$classMap;
}, null, ClassLoader::class);
}
diff --git a/vendor/composer/ca-bundle/res/cacert.pem b/vendor/composer/ca-bundle/res/cacert.pem
index 0bf312fe5..6b93dc34f 100644
--- a/vendor/composer/ca-bundle/res/cacert.pem
+++ b/vendor/composer/ca-bundle/res/cacert.pem
@@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
-## Certificate data from Mozilla as of: Tue Oct 26 03:12:05 2021 GMT
+## Certificate data from Mozilla as of: Tue May 30 03:12:04 2023 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@@ -13,8 +13,8 @@
## an Apache+mod_ssl webserver for SSL client authentication.
## Just configure this file as the SSLCACertificateFile.
##
-## Conversion done with mk-ca-bundle.pl version 1.28.
-## SHA256: bb36818a81feaa4cca61101e6d6276cd09e972efcb08112dfed846918ca41d7f
+## Conversion done with mk-ca-bundle.pl version 1.29.
+## SHA256: c47475103fb05bb562bbadff0d1e72346b03236154e1448a6ca191b740f83507
##
@@ -39,28 +39,6 @@ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----
-GlobalSign Root CA - R2
-=======================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
-ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
-s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
-S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
-TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
-ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
-YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
-BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
-9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
-01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
-9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
Entrust.net Premium 2048 Secure Server CA
=========================================
-----BEGIN CERTIFICATE-----
@@ -511,29 +489,6 @@ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
-----END CERTIFICATE-----
-Network Solutions Certificate Authority
-=======================================
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
-EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
-IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
-MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
-jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
-aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
-crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
-/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
-AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
-bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
-A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
-4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
-GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
-ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
COMODO ECC Certification Authority
==================================
-----BEGIN CERTIFICATE-----
@@ -573,28 +528,6 @@ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
-----END CERTIFICATE-----
-Cybertrust Global Root
-======================
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
-ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
-MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
-ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
-0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
-AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
-89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
-8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
-MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
-A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
-lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
-5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
-hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
-X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
ePKI Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
@@ -670,26 +603,6 @@ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
-----END CERTIFICATE-----
-Hongkong Post Root CA 1
-=======================
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
-DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
-NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
-IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
-ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
-auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
-qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
-V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
-HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
-h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
-l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
-IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
-T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
-c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
------END CERTIFICATE-----
-
SecureSign RootCA11
===================
-----BEGIN CERTIFICATE-----
@@ -1037,60 +950,6 @@ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE-----
-EC-ACC
-======
------BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
-BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
-ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
-VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
-CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
-BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
-MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
-SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
-Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
-cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
-w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
-ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
-HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
-E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
-0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
-VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
-Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
-dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
-lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
-Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
-l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
-E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
-5EI=
------END CERTIFICATE-----
-
-Hellenic Academic and Research Institutions RootCA 2011
-=======================================================
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
-O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
-aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
-AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
-IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
-1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
-71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
-8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
-3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
-MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
-MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
-b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
-XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
-/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
-7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
-
Actalis Authentication Root CA
==============================
-----BEGIN CERTIFICATE-----
@@ -1382,40 +1241,6 @@ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
-----END CERTIFICATE-----
-E-Tugra Certification Authority
-===============================
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
-DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
-ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
-ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
-NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
-QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
-cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
-DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
-hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
-CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
-ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
-BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
-E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
-rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
-jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
-rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
-dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
-/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
-MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
-kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
-XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
-VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
-a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
-dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
-KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
-Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
-8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
-C7TbO6Orb1wdtn7os4I07QZcJA==
------END CERTIFICATE-----
-
T-TeleSec GlobalRoot Class 2
============================
-----BEGIN CERTIFICATE-----
@@ -1737,20 +1562,6 @@ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
-----END CERTIFICATE-----
-GlobalSign ECC Root CA - R4
-===========================
------BEGIN CERTIFICATE-----
-MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
-R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
-EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
-R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
-EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
-OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
-AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
-MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
-JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
------END CERTIFICATE-----
-
GlobalSign ECC Root CA - R5
===========================
-----BEGIN CERTIFICATE-----
@@ -1766,36 +1577,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----
-Staat der Nederlanden EV Root CA
-================================
------BEGIN CERTIFICATE-----
-MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
-MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
-cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
-SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
-O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
-0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
-Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
-XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
-08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
-0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
-74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
-fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
-ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
-eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
-c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
-5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
-b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
-f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
-5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
-WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
-DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
-eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
------END CERTIFICATE-----
-
IdenTrust Commercial Root CA 1
==============================
-----BEGIN CERTIFICATE-----
@@ -2247,87 +2028,6 @@ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
-----END CERTIFICATE-----
-TrustCor RootCert CA-1
-======================
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
-MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
-U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
-MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
-YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
-VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
-dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
-jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
-pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
-JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
-gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
-/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
-BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
-mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
-ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
-qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
-3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
------END CERTIFICATE-----
-
-TrustCor RootCert CA-2
-======================
------BEGIN CERTIFICATE-----
-MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
-DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
-eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
-eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
-MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
-bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
-IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
-ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
-RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
-oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
-XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
-/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
-jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
-eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
-rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
-8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
-2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
-Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
-kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
-2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
-S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
-PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
-DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
-RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
-xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
-RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
------END CERTIFICATE-----
-
-TrustCor ECA-1
-==============
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
-MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
-U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
-N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
-MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
-IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
-MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
-xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
-p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
-fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
-YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
-f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
-AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
-/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
-hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
-J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
-jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
------END CERTIFICATE-----
-
SSL.com Root Certification Authority RSA
========================================
-----BEGIN CERTIFICATE-----
@@ -2472,96 +2172,6 @@ AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
-----END CERTIFICATE-----
-GTS Root R1
-===========
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
-EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
-b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
-A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx
-9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r
-aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW
-r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM
-LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly
-4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr
-06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92
-wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om
-3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu
-JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM
-BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
-d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv
-fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm
-ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b
-gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq
-4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr
-tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo
-pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0
-sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql
-CFF1pkgl
------END CERTIFICATE-----
-
-GTS Root R2
-===========
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
-EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
-b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
-A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk
-k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo
-7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI
-m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm
-dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu
-ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz
-cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
-Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl
-aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy
-5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM
-BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
-vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ
-+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw
-c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da
-WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r
-n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu
-Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ
-7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs
-gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld
-o/DUhgkC
------END CERTIFICATE-----
-
-GTS Root R3
-===========
------BEGIN CERTIFICATE-----
-MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
-UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
-UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
-ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU
-Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej
-QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP
-0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0
-glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa
-KaqW04MjyaR7YbPMAuhd
------END CERTIFICATE-----
-
-GTS Root R4
-===========
------BEGIN CERTIFICATE-----
-MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
-UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
-UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
-ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa
-6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj
-QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV
-2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI
-N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x
-zPKwTdb+mciUqXWi4w==
------END CERTIFICATE-----
-
UCA Global G2 Root
==================
-----BEGIN CERTIFICATE-----
@@ -3230,3 +2840,524 @@ ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW
rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw
CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud
+DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w
+gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j
+b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A
+bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL
+4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb
+LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il
+I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP
+cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA
+LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A
+lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH
+9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf
+NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE
+ZycPvEJdvSRUDewdcAZfpLz6IHxV
+-----END CERTIFICATE-----
+
+vTrus ECC Root CA
+=================
+-----BEGIN CERTIFICATE-----
+MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE
+BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS
+b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa
+BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw
+EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c
+ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n
+TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT
+QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL
+YgmRWAD5Tfs0aNoJrSEGGJTO
+-----END CERTIFICATE-----
+
+vTrus Root CA
+=============
+-----BEGIN CERTIFICATE-----
+MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG
+A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv
+b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG
+A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots
+SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI
+ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF
+XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA
+YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70
+kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2
+AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu
+/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu
+1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO
+9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg
+scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC
+AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd
+nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr
+jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4
+8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn
+xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg
+icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4
+sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW
+nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc
+SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H
+l3s=
+-----END CERTIFICATE-----
+
+ISRG Root X2
+============
+-----BEGIN CERTIFICATE-----
+MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV
+UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT
+UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT
+MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS
+RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H
+ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb
+d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF
+cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5
+U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn
+-----END CERTIFICATE-----
+
+HiPKI Root CA - G1
+==================
+-----BEGIN CERTIFICATE-----
+MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ
+IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT
+AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg
+Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0
+o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k
+wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE
+YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA
+GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd
+hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj
+1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4
+9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/
+Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF
+8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD
+AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi
+7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl
+tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE
+wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q
+JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv
+5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz
+jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg
+hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb
+yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/
+yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i
+YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i
+YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW
+ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E
+BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI
+KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg
+UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm
+-----END CERTIFICATE-----
+
+GTS Root R1
+===========
+-----BEGIN CERTIFICATE-----
+MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
+f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0
+xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w
+B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW
+nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk
+9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq
+kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A
+K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX
+V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW
+cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD
+ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe
+QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi
+ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar
+J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci
+NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me
+LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF
+fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+
+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3
+FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3
+gm3c
+-----END CERTIFICATE-----
+
+GTS Root R2
+===========
+-----BEGIN CERTIFICATE-----
+MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
+CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl
+e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb
+a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS
++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M
+kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG
+r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q
+S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV
+J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL
+dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD
+ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8
+0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh
+swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel
+/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn
+jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5
+9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M
+7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8
+0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR
+WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW
+HYbL
+-----END CERTIFICATE-----
+
+GTS Root R3
+===========
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
+MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw
+HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
+R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO
+PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
+736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA
+MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq
+Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT
+L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV
+11RZt+cRLInUue4X
+-----END CERTIFICATE-----
+
+GTS Root R4
+===========
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
+MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw
+HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
+R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO
+PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
+hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA
+MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1
+PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C
+r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh
+4rsUecrNIdSUtUlD
+-----END CERTIFICATE-----
+
+Telia Root CA v2
+================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT
+AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2
+MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK
+DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7
+6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q
+9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn
+pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl
+tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW
+5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr
+RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E
+BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4
+M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau
+BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W
+xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ
+8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5
+tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H
+eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C
+y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC
+QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15
+h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70
+sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9
+xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ
+raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc=
+-----END CERTIFICATE-----
+
+D-TRUST BR Root CA 1 2020
+=========================
+-----BEGIN CERTIFICATE-----
+MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
+RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy
+MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
+BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7
+dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu
+QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t
+MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
+bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
+PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
+AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom
+AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87
+-----END CERTIFICATE-----
+
+D-TRUST EV Root CA 1 2020
+=========================
+-----BEGIN CERTIFICATE-----
+MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
+RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy
+MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
+BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8
+ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ
+raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL
+MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
+bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
+PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
+AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR
+AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW
+-----END CERTIFICATE-----
+
+DigiCert TLS ECC P384 Root G5
+=============================
+-----BEGIN CERTIFICATE-----
+MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4
+NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg
+Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd
+lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj
+n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB
+/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds
+Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx
+AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==
+-----END CERTIFICATE-----
+
+DigiCert TLS RSA4096 Root G5
+============================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG
+EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0
+MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2
+IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8
+7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU
+AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces
+tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa
+zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV
+DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q
+TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy
+z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/
+MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk
+wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E
+FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
+GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN
+lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN
+MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/
+u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G
+OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh
+47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU
+FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ
+yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP
+bEtoL8pU9ozaMv7Da4M/OMZ+
+-----END CERTIFICATE-----
+
+Certainly Root R1
+=================
+-----BEGIN CERTIFICATE-----
+MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE
+BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN
+MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy
+dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O
+5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl
+8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl
+DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI
+XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN
+KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ
+AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb
+rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1
+VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS
+p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz
+HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
+8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v
+MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB
+GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+
+gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH
+JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7
+fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw
+x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S
+X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=
+-----END CERTIFICATE-----
+
+Certainly Root E1
+=================
+-----BEGIN CERTIFICATE-----
+MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0
+MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu
+bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4
+fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9
+YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E
+AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
+rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
+-----END CERTIFICATE-----
+
+E-Tugra Global Root CA RSA v3
+=============================
+-----BEGIN CERTIFICATE-----
+MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ
+BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb
+BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290
+IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU
+UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF
+LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg
+djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx
+jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL
+sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF
+/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q
+QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw
+bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6
+04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB
+eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM
+bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg
+h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD
+AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1
+LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ
+gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4
+38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q
+ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s
+SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY
+sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl
+DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X
+nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH
+IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX
+YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ
+-----END CERTIFICATE-----
+
+E-Tugra Global Root CA ECC v3
+=============================
+-----BEGIN CERTIFICATE-----
+MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV
+BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV
+BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB
+IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1
+Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw
+djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2
+w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31
+Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ
+zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO
+PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W
+Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3
+-----END CERTIFICATE-----
+
+Security Communication RootCA3
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw
+IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD
+b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw
+CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE
+AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r
+hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE
+NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2
+/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm
+npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY
+XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK
+p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC
+3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf
+GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw
+CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB
+/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS
+YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu
+Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O
+H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx
+YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ
+XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml
++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn
+KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9
+dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm
+6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg==
+-----END CERTIFICATE-----
+
+Security Communication ECC RootCA1
+==================================
+-----BEGIN CERTIFICATE-----
+MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD
+VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t
+dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL
+MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV
+BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo
+5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW
+BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK
+BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
+snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
+N9k=
+-----END CERTIFICATE-----
+
+BJCA Global Root CA1
+====================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG
+EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK
+Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG
+A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD
+DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm
+CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS
+sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn
+P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW
+yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj
+eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn
+MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b
+OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh
+GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK
+H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB
+AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4
+YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ
+dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8
+60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh
+TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW
+4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp
+GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx
+4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps
+3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S
+SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI=
+-----END CERTIFICATE-----
+
+BJCA Global Root CA2
+====================
+-----BEGIN CERTIFICATE-----
+MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD
+TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg
+R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE
+BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC
+SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl
+SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK
+/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI
+1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8
+W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g
+UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==
+-----END CERTIFICATE-----
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index f14f14938..3e3f99158 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -7,12 +7,12 @@
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b"
+ "reference": "90d087e988ff194065333d16bc5cf649872d9cdb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b",
- "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/90d087e988ff194065333d16bc5cf649872d9cdb",
+ "reference": "90d087e988ff194065333d16bc5cf649872d9cdb",
"shasum": ""
},
"require": {
@@ -26,7 +26,7 @@
"symfony/phpunit-bridge": "^4.2 || ^5",
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
},
- "time": "2021-10-28T20:44:15+00:00",
+ "time": "2023-06-06T12:02:59+00:00",
"default-branch": true,
"type": "library",
"extra": {
@@ -62,7 +62,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.3.1"
+ "source": "https://github.com/composer/ca-bundle/tree/1.3.6"
},
"funding": [
{
@@ -149,29 +149,29 @@
},
{
"name": "yahnis-elsts/plugin-update-checker",
- "version": "v4.13",
- "version_normalized": "4.13.0.0",
+ "version": "v5.1",
+ "version_normalized": "5.1.0.0",
"source": {
"type": "git",
"url": "https://github.com/YahnisElsts/plugin-update-checker.git",
- "reference": "6eb27a6911e0e0880d09e5b11f577d3f688f7da7"
+ "reference": "48b03e93c9c2587f9276dce00ce2b6d94c1190d2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/YahnisElsts/plugin-update-checker/zipball/6eb27a6911e0e0880d09e5b11f577d3f688f7da7",
- "reference": "6eb27a6911e0e0880d09e5b11f577d3f688f7da7",
+ "url": "https://api.github.com/repos/YahnisElsts/plugin-update-checker/zipball/48b03e93c9c2587f9276dce00ce2b6d94c1190d2",
+ "reference": "48b03e93c9c2587f9276dce00ce2b6d94c1190d2",
"shasum": ""
},
"require": {
"ext-json": "*",
- "php": ">=5.2.0"
+ "php": ">=5.6.20"
},
- "time": "2022-07-29T12:36:25+00:00",
+ "time": "2023-05-20T11:55:43+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"files": [
- "load-v4p13.php"
+ "load-v5p1.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -182,7 +182,7 @@
{
"name": "Yahnis Elsts",
"email": "whiteshadow@w-shadow.com",
- "homepage": "http://w-shadow.com/",
+ "homepage": "https://w-shadow.com/",
"role": "Developer"
}
],
@@ -196,7 +196,7 @@
],
"support": {
"issues": "https://github.com/YahnisElsts/plugin-update-checker/issues",
- "source": "https://github.com/YahnisElsts/plugin-update-checker/tree/v4.13"
+ "source": "https://github.com/YahnisElsts/plugin-update-checker/tree/v5.1"
},
"install-path": "../yahnis-elsts/plugin-update-checker"
}
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 72320d7e6..016d0e0ad 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '10up/classifai',
'pretty_version' => 'dev-trunk',
'version' => 'dev-trunk',
- 'reference' => '2aca3ab901b733038023d65e4f7fcd1cbc262c04',
+ 'reference' => '1742dc0109ff82f708f47633782dca5b179e362c',
'type' => 'wordpress-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'10up/classifai' => array(
'pretty_version' => 'dev-trunk',
'version' => 'dev-trunk',
- 'reference' => '2aca3ab901b733038023d65e4f7fcd1cbc262c04',
+ 'reference' => '1742dc0109ff82f708f47633782dca5b179e362c',
'type' => 'wordpress-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -22,7 +22,7 @@
'composer/ca-bundle' => array(
'pretty_version' => 'dev-main',
'version' => 'dev-main',
- 'reference' => '4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b',
+ 'reference' => '90d087e988ff194065333d16bc5cf649872d9cdb',
'type' => 'library',
'install_path' => __DIR__ . '/./ca-bundle',
'aliases' => array(
@@ -42,9 +42,9 @@
'dev_requirement' => false,
),
'yahnis-elsts/plugin-update-checker' => array(
- 'pretty_version' => 'v4.13',
- 'version' => '4.13.0.0',
- 'reference' => '6eb27a6911e0e0880d09e5b11f577d3f688f7da7',
+ 'pretty_version' => 'v5.1',
+ 'version' => '5.1.0.0',
+ 'reference' => '48b03e93c9c2587f9276dce00ce2b6d94c1190d2',
'type' => 'library',
'install_path' => __DIR__ . '/../yahnis-elsts/plugin-update-checker',
'aliases' => array(),
diff --git a/vendor/yahnis-elsts/plugin-update-checker/.gitattributes b/vendor/yahnis-elsts/plugin-update-checker/.gitattributes
new file mode 100644
index 000000000..ba74e7881
--- /dev/null
+++ b/vendor/yahnis-elsts/plugin-update-checker/.gitattributes
@@ -0,0 +1 @@
+/build export-ignore
diff --git a/vendor/yahnis-elsts/plugin-update-checker/Puc/v4/Factory.php b/vendor/yahnis-elsts/plugin-update-checker/Puc/v4/Factory.php
deleted file mode 100644
index 00001d9cd..000000000
--- a/vendor/yahnis-elsts/plugin-update-checker/Puc/v4/Factory.php
+++ /dev/null
@@ -1,6 +0,0 @@
-rootDir = dirname(__FILE__) . '/';
-
- if ( version_compare(PHP_VERSION, '5.3', '>=') && __NAMESPACE__ ) {
- $namespaceWithSlash = __NAMESPACE__ . '\\';
- } else {
- $namespaceWithSlash = '';
- }
-
- $nameParts = explode('_', substr(__CLASS__, strlen($namespaceWithSlash)), 3);
- $this->prefix = $namespaceWithSlash . $nameParts[0] . '_' . $nameParts[1] . '_';
-
- $this->libraryDir = $this->rootDir . '../..';
- if ( !self::isPhar() ) {
- $this->libraryDir = realpath($this->libraryDir);
- }
- $this->libraryDir = $this->libraryDir . '/';
-
- $this->staticMap = array(
- $namespaceWithSlash . 'PucReadmeParser' => 'vendor/PucReadmeParser.php',
- $namespaceWithSlash . 'Parsedown' => 'vendor/Parsedown.php',
- $namespaceWithSlash . 'Puc_v4_Factory' => 'Puc/v4/Factory.php',
- );
-
- spl_autoload_register(array($this, 'autoload'));
- }
-
- /**
- * Determine if this file is running as part of a Phar archive.
- *
- * @return bool
- */
- private static function isPhar() {
- //Check if the current file path starts with "phar://".
- static $pharProtocol = 'phar://';
- return (substr(__FILE__, 0, strlen($pharProtocol)) === $pharProtocol);
- }
-
- public function autoload($className) {
- if ( isset($this->staticMap[$className]) && file_exists($this->libraryDir . $this->staticMap[$className]) ) {
- /** @noinspection PhpIncludeInspection */
- include ($this->libraryDir . $this->staticMap[$className]);
- return;
- }
-
- if (strpos($className, $this->prefix) === 0) {
- $path = substr($className, strlen($this->prefix));
- $path = str_replace('_', '/', $path);
- $path = $this->rootDir . $path . '.php';
-
- if (file_exists($path)) {
- /** @noinspection PhpIncludeInspection */
- include $path;
- }
- }
- }
- }
-
-endif;
diff --git a/vendor/yahnis-elsts/plugin-update-checker/Puc/v4p13/DebugBar/PluginExtension.php b/vendor/yahnis-elsts/plugin-update-checker/Puc/v4p13/DebugBar/PluginExtension.php
deleted file mode 100644
index 2514a043a..000000000
--- a/vendor/yahnis-elsts/plugin-update-checker/Puc/v4p13/DebugBar/PluginExtension.php
+++ /dev/null
@@ -1,33 +0,0 @@
-updateChecker->getUniqueName('uid') ) {
- return;
- }
- $this->preAjaxRequest();
- $info = $this->updateChecker->requestInfo();
- if ( $info !== null ) {
- echo 'Successfully retrieved plugin info from the metadata URL:';
- echo '', htmlentities(print_r($info, true)), '
';
- } else {
- echo 'Failed to retrieve plugin info from the metadata URL.';
- }
- exit;
- }
- }
-
-endif;
diff --git a/vendor/yahnis-elsts/plugin-update-checker/Puc/v5/PucFactory.php b/vendor/yahnis-elsts/plugin-update-checker/Puc/v5/PucFactory.php
new file mode 100644
index 000000000..3cda059d9
--- /dev/null
+++ b/vendor/yahnis-elsts/plugin-update-checker/Puc/v5/PucFactory.php
@@ -0,0 +1,10 @@
+rootDir = dirname(__FILE__) . '/';
+
+ $namespaceWithSlash = __NAMESPACE__ . '\\';
+ $this->prefix = $namespaceWithSlash;
+
+ $this->libraryDir = $this->rootDir . '../..';
+ if ( !self::isPhar() ) {
+ $this->libraryDir = realpath($this->libraryDir);
+ }
+ $this->libraryDir = $this->libraryDir . '/';
+
+ //Usually, dependencies like Parsedown are in the global namespace,
+ //but if someone adds a custom namespace to the entire library, they
+ //will be in the same namespace as this class.
+ $isCustomNamespace = (
+ substr($namespaceWithSlash, 0, strlen(self::DEFAULT_NS_PREFIX)) !== self::DEFAULT_NS_PREFIX
+ );
+ $libraryPrefix = $isCustomNamespace ? $namespaceWithSlash : '';
+
+ $this->staticMap = array(
+ $libraryPrefix . 'PucReadmeParser' => 'vendor/PucReadmeParser.php',
+ $libraryPrefix . 'Parsedown' => 'vendor/Parsedown.php',
+ );
+
+ //Add the generic, major-version-only factory class to the static map.
+ $versionSeparatorPos = strrpos(__NAMESPACE__, '\\v');
+ if ( $versionSeparatorPos !== false ) {
+ $versionSegment = substr(__NAMESPACE__, $versionSeparatorPos + 1);
+ $pointPos = strpos($versionSegment, 'p');
+ if ( ($pointPos !== false) && ($pointPos > 1) ) {
+ $majorVersionSegment = substr($versionSegment, 0, $pointPos);
+ $majorVersionNs = __NAMESPACE__ . '\\' . $majorVersionSegment;
+ $this->staticMap[$majorVersionNs . '\\PucFactory'] =
+ 'Puc/' . $majorVersionSegment . '/Factory.php';
+ }
+ }
+
+ spl_autoload_register(array($this, 'autoload'));
+ }
+
+ /**
+ * Determine if this file is running as part of a Phar archive.
+ *
+ * @return bool
+ */
+ private static function isPhar() {
+ //Check if the current file path starts with "phar://".
+ static $pharProtocol = 'phar://';
+ return (substr(__FILE__, 0, strlen($pharProtocol)) === $pharProtocol);
+ }
+
+ public function autoload($className) {
+ if ( isset($this->staticMap[$className]) && file_exists($this->libraryDir . $this->staticMap[$className]) ) {
+ include($this->libraryDir . $this->staticMap[$className]);
+ return;
+ }
+
+ if ( strpos($className, $this->prefix) === 0 ) {
+ $path = substr($className, strlen($this->prefix));
+ $path = str_replace(array('_', '\\'), '/', $path);
+ $path = $this->rootDir . $path . '.php';
+
+ if ( file_exists($path) ) {
+ include $path;
+ }
+ }
+ }
+ }
+
+endif;
diff --git a/vendor/yahnis-elsts/plugin-update-checker/Puc/v4p13/DebugBar/Extension.php b/vendor/yahnis-elsts/plugin-update-checker/Puc/v5p1/DebugBar/Extension.php
similarity index 73%
rename from vendor/yahnis-elsts/plugin-update-checker/Puc/v4p13/DebugBar/Extension.php
rename to vendor/yahnis-elsts/plugin-update-checker/Puc/v5p1/DebugBar/Extension.php
index 4619c0fba..01f43304c 100644
--- a/vendor/yahnis-elsts/plugin-update-checker/Puc/v4p13/DebugBar/Extension.php
+++ b/vendor/yahnis-elsts/plugin-update-checker/Puc/v5p1/DebugBar/Extension.php
@@ -1,12 +1,17 @@
updateChecker = $updateChecker;
@@ -14,14 +19,14 @@ public function __construct($updateChecker, $panelClass = null) {
$this->panelClass = $panelClass;
}
- if ( version_compare(PHP_VERSION, '5.3', '>=') && (strpos($this->panelClass, '\\') === false) ) {
+ if ( (strpos($this->panelClass, '\\') === false) ) {
$this->panelClass = __NAMESPACE__ . '\\' . $this->panelClass;
}
add_filter('debug_bar_panels', array($this, 'addDebugBarPanel'));
add_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies'));
- add_action('wp_ajax_puc_v4_debug_check_now', array($this, 'ajaxCheckNow'));
+ add_action('wp_ajax_puc_v5_debug_check_now', array($this, 'ajaxCheckNow'));
}
/**
@@ -42,17 +47,17 @@ public function addDebugBarPanel($panels) {
*/
public function enqueuePanelDependencies() {
wp_enqueue_style(
- 'puc-debug-bar-style-v4',
+ 'puc-debug-bar-style-v5',
$this->getLibraryUrl("/css/puc-debug-bar.css"),
array('debug-bar'),
- '20171124'
+ '20221008'
);
wp_enqueue_script(
- 'puc-debug-bar-js-v4',
+ 'puc-debug-bar-js-v5',
$this->getLibraryUrl("/js/debug-bar.js"),
array('jquery'),
- '20201209'
+ '20221008'
);
}
@@ -61,14 +66,16 @@ public function enqueuePanelDependencies() {
* the update checking process works as expected.
*/
public function ajaxCheckNow() {
- if ( $_POST['uid'] !== $this->updateChecker->getUniqueName('uid') ) {
+ //phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce is checked in preAjaxRequest().
+ if ( !isset($_POST['uid']) || ($_POST['uid'] !== $this->updateChecker->getUniqueName('uid')) ) {
return;
}
$this->preAjaxRequest();
$update = $this->updateChecker->checkForUpdates();
if ( $update !== null ) {
echo "An update is available:";
- echo '', htmlentities(print_r($update, true)), '
';
+ //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- For debugging output.
+ echo '', esc_html(print_r($update, true)), '
';
} else {
echo 'No updates found.';
}
@@ -79,8 +86,8 @@ public function ajaxCheckNow() {
foreach (array_values($errors) as $num => $item) {
$wpError = $item['error'];
- /** @var WP_Error $wpError */
- printf('%d) %s
', $num + 1, esc_html($wpError->get_error_message()));
+ /** @var \WP_Error $wpError */
+ printf('%d) %s
', intval($num + 1), esc_html($wpError->get_error_message()));
echo '';
printf('
%s
%s
)%d %s