소재지 ₍₍◝(・'ω'・)◟⁾⁾ 🐟️?看XM(^_−)☆哈先看看刚看过卡卡国看过了回来冷藏柜好极过估计 PNG %k25u25%fgd5n!PKwL\m{J9 9 akismet/akismet.phpnu[protect your blog from spam. Akismet Anti-spam keeps your site protected even while you sleep. To get started: activate the Akismet plugin and then go to your Akismet Settings page to set up your API key. Version: 5.3.3 Requires at least: 5.8 Requires PHP: 5.6.20 Author: Automattic - Anti-spam Team Author URI: https://automattic.com/wordpress-plugins/ License: GPLv2 or later Text Domain: akismet */ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Copyright 2005-2023 Automattic, Inc. */ // Make sure we don't expose any info if called directly if ( !function_exists( 'add_action' ) ) { echo 'Hi there! I\'m just a plugin, not much I can do when called directly.'; exit; } define( 'AKISMET_VERSION', '5.3.3' ); define( 'AKISMET__MINIMUM_WP_VERSION', '5.8' ); define( 'AKISMET__PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'AKISMET_DELETE_LIMIT', 10000 ); register_activation_hook( __FILE__, array( 'Akismet', 'plugin_activation' ) ); register_deactivation_hook( __FILE__, array( 'Akismet', 'plugin_deactivation' ) ); require_once AKISMET__PLUGIN_DIR . 'class.akismet.php'; require_once AKISMET__PLUGIN_DIR . 'class.akismet-widget.php'; require_once AKISMET__PLUGIN_DIR . 'class.akismet-rest-api.php'; add_action( 'init', array( 'Akismet', 'init' ) ); add_action( 'rest_api_init', array( 'Akismet_REST_API', 'init' ) ); if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) { require_once AKISMET__PLUGIN_DIR . 'class.akismet-admin.php'; add_action( 'init', array( 'Akismet_Admin', 'init' ) ); } //add wrapper class around deprecated akismet functions that are referenced elsewhere require_once AKISMET__PLUGIN_DIR . 'wrapper.php'; if ( defined( 'WP_CLI' ) && WP_CLI ) { require_once AKISMET__PLUGIN_DIR . 'class.akismet-cli.php'; } PKwL\p_akismet/.htaccessnu[# Only allow direct access to specific Web-available files. # Apache 2.2 Order Deny,Allow Deny from all # Apache 2.4 Require all denied # Akismet CSS and JS Allow from all Require all granted # Akismet images Allow from all Require all granted PKwL\WTaaakismet/class.akismet-admin.phpnu[ array( 'href' => true, 'title' => true, ), 'b' => array(), 'code' => array(), 'del' => array( 'datetime' => true, ), 'em' => array(), 'i' => array(), 'q' => array( 'cite' => true, ), 'strike' => array(), 'strong' => array(), ); public static function init() { if ( ! self::$initiated ) { self::init_hooks(); } if ( isset( $_POST['action'] ) && $_POST['action'] == 'enter-key' ) { self::enter_api_key(); } } public static function init_hooks() { // The standalone stats page was removed in 3.0 for an all-in-one config and stats page. // Redirect any links that might have been bookmarked or in browser history. if ( isset( $_GET['page'] ) && 'akismet-stats-display' == $_GET['page'] ) { wp_safe_redirect( esc_url_raw( self::get_page_url( 'stats' ) ), 301 ); die; } self::$initiated = true; add_action( 'admin_init', array( 'Akismet_Admin', 'admin_init' ) ); add_action( 'admin_menu', array( 'Akismet_Admin', 'admin_menu' ), 5 ); # Priority 5, so it's called before Jetpack's admin_menu. add_action( 'admin_notices', array( 'Akismet_Admin', 'display_notice' ) ); add_action( 'admin_enqueue_scripts', array( 'Akismet_Admin', 'load_resources' ) ); add_action( 'activity_box_end', array( 'Akismet_Admin', 'dashboard_stats' ) ); add_action( 'rightnow_end', array( 'Akismet_Admin', 'rightnow_stats' ) ); add_action( 'manage_comments_nav', array( 'Akismet_Admin', 'check_for_spam_button' ) ); add_action( 'admin_action_akismet_recheck_queue', array( 'Akismet_Admin', 'recheck_queue' ) ); add_action( 'wp_ajax_akismet_recheck_queue', array( 'Akismet_Admin', 'recheck_queue' ) ); add_action( 'wp_ajax_comment_author_deurl', array( 'Akismet_Admin', 'remove_comment_author_url' ) ); add_action( 'wp_ajax_comment_author_reurl', array( 'Akismet_Admin', 'add_comment_author_url' ) ); add_action( 'jetpack_auto_activate_akismet', array( 'Akismet_Admin', 'connect_jetpack_user' ) ); add_filter( 'plugin_action_links', array( 'Akismet_Admin', 'plugin_action_links' ), 10, 2 ); add_filter( 'comment_row_actions', array( 'Akismet_Admin', 'comment_row_action' ), 10, 2 ); add_filter( 'plugin_action_links_'.plugin_basename( plugin_dir_path( __FILE__ ) . 'akismet.php'), array( 'Akismet_Admin', 'admin_plugin_settings_link' ) ); add_filter( 'wxr_export_skip_commentmeta', array( 'Akismet_Admin', 'exclude_commentmeta_from_export' ), 10, 3 ); add_filter( 'all_plugins', array( 'Akismet_Admin', 'modify_plugin_description' ) ); // priority=1 because we need ours to run before core's comment anonymizer runs, and that's registered at priority=10 add_filter( 'wp_privacy_personal_data_erasers', array( 'Akismet_Admin', 'register_personal_data_eraser' ), 1 ); } public static function admin_init() { if ( get_option( 'Activated_Akismet' ) ) { delete_option( 'Activated_Akismet' ); if ( ! headers_sent() ) { $admin_url = self::get_page_url( 'init' ); wp_redirect( $admin_url ); } } load_plugin_textdomain( 'akismet' ); add_meta_box( 'akismet-status', __('Comment History', 'akismet'), array( 'Akismet_Admin', 'comment_status_meta_box' ), 'comment', 'normal' ); if ( function_exists( 'wp_add_privacy_policy_content' ) ) { wp_add_privacy_policy_content( __( 'Akismet', 'akismet' ), __( 'We collect information about visitors who comment on Sites that use our Akismet Anti-spam service. The information we collect depends on how the User sets up Akismet for the Site, but typically includes the commenter\'s IP address, user agent, referrer, and Site URL (along with other information directly provided by the commenter such as their name, username, email address, and the comment itself).', 'akismet' ) ); } } public static function admin_menu() { if ( class_exists( 'Jetpack' ) ) { add_action( 'jetpack_admin_menu', array( 'Akismet_Admin', 'load_menu' ) ); } else { self::load_menu(); } } public static function admin_head() { if ( !current_user_can( 'manage_options' ) ) return; } public static function admin_plugin_settings_link( $links ) { $settings_link = ''.__('Settings', 'akismet').''; array_unshift( $links, $settings_link ); return $links; } public static function load_menu() { if ( class_exists( 'Jetpack' ) ) { $hook = add_submenu_page( 'jetpack', __( 'Akismet Anti-spam', 'akismet' ), __( 'Akismet Anti-spam', 'akismet' ), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) ); } else { $hook = add_options_page( __( 'Akismet Anti-spam', 'akismet' ), __( 'Akismet Anti-spam', 'akismet' ), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) ); } if ( $hook ) { add_action( "load-$hook", array( 'Akismet_Admin', 'admin_help' ) ); } } public static function load_resources() { global $hook_suffix; if ( in_array( $hook_suffix, apply_filters( 'akismet_admin_page_hook_suffixes', array( 'index.php', # dashboard 'edit-comments.php', 'comment.php', 'post.php', 'settings_page_akismet-key-config', 'jetpack_page_akismet-key-config', 'plugins.php', ) ) ) ) { $akismet_css_path = is_rtl() ? '_inc/rtl/akismet-rtl.css' : '_inc/akismet.css'; wp_register_style( 'akismet', plugin_dir_url( __FILE__ ) . $akismet_css_path, array(), self::get_asset_file_version( $akismet_css_path ) ); wp_enqueue_style( 'akismet' ); wp_register_style( 'akismet-font-inter', plugin_dir_url( __FILE__ ) . '_inc/fonts/inter.css', array(), self::get_asset_file_version( '_inc/fonts/inter.css' ) ); wp_enqueue_style( 'akismet-font-inter' ); $akismet_admin_css_path = is_rtl() ? '_inc/rtl/akismet-admin-rtl.css' : '_inc/akismet-admin.css'; wp_register_style( 'akismet-admin', plugin_dir_url( __FILE__ ) . $akismet_admin_css_path, array(), self::get_asset_file_version( $akismet_admin_css_path ) ); wp_enqueue_style( 'akismet-admin' ); wp_register_script( 'akismet.js', plugin_dir_url( __FILE__ ) . '_inc/akismet.js', array( 'jquery' ), self::get_asset_file_version( '_inc/akismet.js' ) ); wp_enqueue_script( 'akismet.js' ); wp_register_script( 'akismet-admin.js', plugin_dir_url( __FILE__ ) . '_inc/akismet-admin.js', array(), self::get_asset_file_version( '/_inc/akismet-admin.js' ) ); wp_enqueue_script( 'akismet-admin.js' ); $inline_js = array( 'comment_author_url_nonce' => wp_create_nonce( 'comment_author_url_nonce' ), 'strings' => array( 'Remove this URL' => __( 'Remove this URL' , 'akismet'), 'Removing...' => __( 'Removing...' , 'akismet'), 'URL removed' => __( 'URL removed' , 'akismet'), '(undo)' => __( '(undo)' , 'akismet'), 'Re-adding...' => __( 'Re-adding...' , 'akismet'), ) ); if ( isset( $_GET['akismet_recheck'] ) && wp_verify_nonce( $_GET['akismet_recheck'], 'akismet_recheck' ) ) { $inline_js['start_recheck'] = true; } if ( apply_filters( 'akismet_enable_mshots', true ) ) { $inline_js['enable_mshots'] = true; } wp_localize_script( 'akismet.js', 'WPAkismet', $inline_js ); } } /** * Add help to the Akismet page * * @return false if not the Akismet page */ public static function admin_help() { $current_screen = get_current_screen(); // Screen Content if ( current_user_can( 'manage_options' ) ) { if ( !Akismet::get_api_key() || ( isset( $_GET['view'] ) && $_GET['view'] == 'start' ) ) { //setup page $current_screen->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' , 'akismet'), 'content' => '

' . esc_html__( 'Akismet Setup' , 'akismet') . '

' . '

' . esc_html__( 'Akismet filters out spam, so you can focus on more important things.' , 'akismet') . '

' . '

' . esc_html__( 'On this page, you are able to set up the Akismet plugin.' , 'akismet') . '

', ) ); $current_screen->add_help_tab( array( 'id' => 'setup-signup', 'title' => __( 'New to Akismet' , 'akismet'), 'content' => '

' . esc_html__( 'Akismet Setup' , 'akismet') . '

' . '

' . esc_html__( 'You need to enter an API key to activate the Akismet service on your site.' , 'akismet') . '

' . '

' . sprintf( __( 'Sign up for an account on %s to get an API Key.' , 'akismet'), 'Akismet.com' ) . '

', ) ); $current_screen->add_help_tab( array( 'id' => 'setup-manual', 'title' => __( 'Enter an API Key' , 'akismet'), 'content' => '

' . esc_html__( 'Akismet Setup' , 'akismet') . '

' . '

' . esc_html__( 'If you already have an API key' , 'akismet') . '

' . '
    ' . '
  1. ' . esc_html__( 'Copy and paste the API key into the text field.' , 'akismet') . '
  2. ' . '
  3. ' . esc_html__( 'Click the Use this Key button.' , 'akismet') . '
  4. ' . '
', ) ); } elseif ( isset( $_GET['view'] ) && $_GET['view'] == 'stats' ) { //stats page $current_screen->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' , 'akismet'), 'content' => '

' . esc_html__( 'Akismet Stats' , 'akismet') . '

' . '

' . esc_html__( 'Akismet filters out spam, so you can focus on more important things.' , 'akismet') . '

' . '

' . esc_html__( 'On this page, you are able to view stats on spam filtered on your site.' , 'akismet') . '

', ) ); } else { //configuration page $current_screen->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview' , 'akismet'), 'content' => '

' . esc_html__( 'Akismet Configuration' , 'akismet') . '

' . '

' . esc_html__( 'Akismet filters out spam, so you can focus on more important things.' , 'akismet') . '

' . '

' . esc_html__( 'On this page, you are able to update your Akismet settings and view spam stats.' , 'akismet') . '

', ) ); $current_screen->add_help_tab( array( 'id' => 'settings', 'title' => __( 'Settings' , 'akismet'), 'content' => '

' . esc_html__( 'Akismet Configuration' , 'akismet') . '

' . ( Akismet::predefined_api_key() ? '' : '

' . esc_html__( 'API Key' , 'akismet') . ' - ' . esc_html__( 'Enter/remove an API key.' , 'akismet') . '

' ) . '

' . esc_html__( 'Comments' , 'akismet') . ' - ' . esc_html__( 'Show the number of approved comments beside each comment author in the comments list page.' , 'akismet') . '

' . '

' . esc_html__( 'Strictness' , 'akismet') . ' - ' . esc_html__( 'Choose to either discard the worst spam automatically or to always put all spam in spam folder.' , 'akismet') . '

', ) ); if ( ! Akismet::predefined_api_key() ) { $current_screen->add_help_tab( array( 'id' => 'account', 'title' => __( 'Account' , 'akismet'), 'content' => '

' . esc_html__( 'Akismet Configuration' , 'akismet') . '

' . '

' . esc_html__( 'Subscription Type' , 'akismet') . ' - ' . esc_html__( 'The Akismet subscription plan' , 'akismet') . '

' . '

' . esc_html__( 'Status' , 'akismet') . ' - ' . esc_html__( 'The subscription status - active, cancelled or suspended' , 'akismet') . '

', ) ); } } } // Help Sidebar $current_screen->set_help_sidebar( '

' . esc_html__( 'For more information:' , 'akismet') . '

' . '

' . esc_html__( 'Akismet FAQ' , 'akismet') . '

' . '

' . esc_html__( 'Akismet Support' , 'akismet') . '

' ); } public static function enter_api_key() { if ( ! current_user_can( 'manage_options' ) ) { die( __( 'Cheatin’ uh?', 'akismet' ) ); } if ( !wp_verify_nonce( $_POST['_wpnonce'], self::NONCE ) ) return false; foreach( array( 'akismet_strictness', 'akismet_show_user_comments_approved' ) as $option ) { update_option( $option, isset( $_POST[$option] ) && (int) $_POST[$option] == 1 ? '1' : '0' ); } if ( ! empty( $_POST['akismet_comment_form_privacy_notice'] ) ) { self::set_form_privacy_notice_option( $_POST['akismet_comment_form_privacy_notice'] ); } else { self::set_form_privacy_notice_option( 'hide' ); } if ( Akismet::predefined_api_key() ) { return false; //shouldn't have option to save key if already defined } $new_key = preg_replace( '/[^a-f0-9]/i', '', $_POST['key'] ); $old_key = Akismet::get_api_key(); if ( empty( $new_key ) ) { if ( !empty( $old_key ) ) { delete_option( 'wordpress_api_key' ); self::$notices[] = 'new-key-empty'; } } elseif ( $new_key != $old_key ) { self::save_key( $new_key ); } return true; } public static function save_key( $api_key ) { $key_status = Akismet::verify_key( $api_key ); if ( $key_status == 'valid' ) { $akismet_user = self::get_akismet_user( $api_key ); if ( $akismet_user ) { if ( in_array( $akismet_user->status, array( 'active', 'active-dunning', 'no-sub' ) ) ) update_option( 'wordpress_api_key', $api_key ); if ( $akismet_user->status == 'active' ) self::$notices['status'] = 'new-key-valid'; elseif ( $akismet_user->status == 'notice' ) self::$notices['status'] = $akismet_user; else self::$notices['status'] = $akismet_user->status; } else self::$notices['status'] = 'new-key-invalid'; } elseif ( in_array( $key_status, array( 'invalid', 'failed' ) ) ) self::$notices['status'] = 'new-key-'.$key_status; } public static function dashboard_stats() { if ( did_action( 'rightnow_end' ) ) { return; // We already displayed this info in the "Right Now" section } if ( !$count = get_option('akismet_spam_count') ) return; global $submenu; echo '

' . esc_html( _x( 'Spam', 'comments' , 'akismet') ) . '

'; echo '

'.sprintf( _n( 'Akismet has protected your site from %3$s spam comment.', 'Akismet has protected your site from %3$s spam comments.', $count , 'akismet'), 'https://akismet.com/wordpress/', esc_url( add_query_arg( array( 'page' => 'akismet-admin' ), admin_url( isset( $submenu['edit-comments.php'] ) ? 'edit-comments.php' : 'edit.php' ) ) ), number_format_i18n($count) ).'

'; } // WP 2.5+ public static function rightnow_stats() { if ( $count = get_option('akismet_spam_count') ) { $intro = sprintf( _n( 'Akismet has protected your site from %2$s spam comment already. ', 'Akismet has protected your site from %2$s spam comments already. ', $count , 'akismet'), 'https://akismet.com/wordpress/', number_format_i18n( $count ) ); } else { $intro = sprintf( __('Akismet blocks spam from getting to your blog. ', 'akismet'), 'https://akismet.com/wordpress/' ); } $link = add_query_arg( array( 'comment_status' => 'spam' ), admin_url( 'edit-comments.php' ) ); if ( $queue_count = self::get_spam_count() ) { $queue_text = sprintf( _n( 'There’s %1$s comment in your spam queue right now.', 'There are %1$s comments in your spam queue right now.', $queue_count , 'akismet'), number_format_i18n( $queue_count ), esc_url( $link ) ); } else { $queue_text = sprintf( __( "There’s nothing in your spam queue at the moment." , 'akismet'), esc_url( $link ) ); } $text = $intro . '
' . $queue_text; echo "

$text

\n"; } public static function check_for_spam_button( $comment_status ) { // The "Check for Spam" button should only appear when the page might be showing // a comment with comment_approved=0, which means an un-trashed, un-spammed, // not-yet-moderated comment. if ( 'all' != $comment_status && 'moderated' != $comment_status ) { return; } $link = ''; $comments_count = wp_count_comments(); echo ''; echo '
'; $classes = array( 'button-secondary', 'checkforspam', 'button-disabled' // Disable button until the page is loaded ); if ( $comments_count->moderated > 0 ) { $classes[] = 'enable-on-load'; if ( ! Akismet::get_api_key() ) { $link = self::get_page_url(); $classes[] = 'ajax-disabled'; } } echo '' . esc_html__('Check for Spam', 'akismet') . ''; echo ''; } public static function recheck_queue() { global $wpdb; Akismet::fix_scheduled_recheck(); if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) ) { return; } if ( ! wp_verify_nonce( $_POST['nonce'], 'akismet_check_for_spam' ) ) { wp_send_json( array( 'error' => __( 'You don’t have permission to do that.', 'akismet' ), )); return; } $result_counts = self::recheck_queue_portion( empty( $_POST['offset'] ) ? 0 : $_POST['offset'], empty( $_POST['limit'] ) ? 100 : $_POST['limit'] ); if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { wp_send_json( array( 'counts' => $result_counts, )); } else { $redirect_to = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : admin_url( 'edit-comments.php' ); wp_safe_redirect( $redirect_to ); exit; } } public static function recheck_queue_portion( $start = 0, $limit = 100 ) { global $wpdb; $paginate = ''; if ( $limit <= 0 ) { $limit = 100; } if ( $start < 0 ) { $start = 0; } $moderation = $wpdb->get_col( $wpdb->prepare( "SELECT * FROM {$wpdb->comments} WHERE comment_approved = '0' LIMIT %d OFFSET %d", $limit, $start ) ); $result_counts = array( 'processed' => is_countable( $moderation ) ? count( $moderation ) : 0, 'spam' => 0, 'ham' => 0, 'error' => 0, ); foreach ( $moderation as $comment_id ) { $api_response = Akismet::recheck_comment( $comment_id, 'recheck_queue' ); if ( 'true' === $api_response ) { ++$result_counts['spam']; } elseif ( 'false' === $api_response ) { ++$result_counts['ham']; } else { ++$result_counts['error']; } } return $result_counts; } // Adds an 'x' link next to author URLs, clicking will remove the author URL and show an undo link public static function remove_comment_author_url() { if ( !empty( $_POST['id'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) { $comment_id = intval( $_POST['id'] ); $comment = get_comment( $comment_id, ARRAY_A ); if ( $comment && current_user_can( 'edit_comment', $comment['comment_ID'] ) ) { $comment['comment_author_url'] = ''; do_action( 'comment_remove_author_url' ); print( wp_update_comment( $comment ) ); die(); } } } public static function add_comment_author_url() { if ( !empty( $_POST['id'] ) && !empty( $_POST['url'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) { $comment_id = intval( $_POST['id'] ); $comment = get_comment( $comment_id, ARRAY_A ); if ( $comment && current_user_can( 'edit_comment', $comment['comment_ID'] ) ) { $comment['comment_author_url'] = esc_url( $_POST['url'] ); do_action( 'comment_add_author_url' ); print( wp_update_comment( $comment ) ); die(); } } } public static function comment_row_action( $a, $comment ) { $akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true ); if ( ! $akismet_result && get_comment_meta( $comment->comment_ID, 'akismet_skipped', true ) ) { $akismet_result = 'skipped'; // Akismet chose to skip the comment-check request. } $akismet_error = get_comment_meta( $comment->comment_ID, 'akismet_error', true ); $user_result = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true ); $comment_status = wp_get_comment_status( $comment->comment_ID ); $desc = null; if ( $akismet_error ) { $desc = __( 'Awaiting spam check' , 'akismet'); } elseif ( !$user_result || $user_result == $akismet_result ) { // Show the original Akismet result if the user hasn't overridden it, or if their decision was the same if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' ) $desc = __( 'Flagged as spam by Akismet' , 'akismet'); elseif ( $akismet_result == 'false' && $comment_status == 'spam' ) $desc = __( 'Cleared by Akismet' , 'akismet'); } else { $who = get_comment_meta( $comment->comment_ID, 'akismet_user', true ); if ( $user_result == 'true' ) $desc = sprintf( __('Flagged as spam by %s', 'akismet'), $who ); else $desc = sprintf( __('Un-spammed by %s', 'akismet'), $who ); } // add a History item to the hover links, just after Edit if ( $akismet_result && is_array( $a ) ) { $b = array(); foreach ( $a as $k => $item ) { $b[ $k ] = $item; if ( $k == 'edit' || $k == 'unspam' ) { $b['history'] = ' '. esc_html__('History', 'akismet') . ''; } } $a = $b; } if ( $desc ) echo ''.esc_html( $desc ).''; $show_user_comments_option = get_option( 'akismet_show_user_comments_approved' ); if ( $show_user_comments_option === false ) { // Default to active if the user hasn't made a decision. $show_user_comments_option = '1'; } $show_user_comments = apply_filters( 'akismet_show_user_comments_approved', $show_user_comments_option ); $show_user_comments = $show_user_comments === 'false' ? false : $show_user_comments; //option used to be saved as 'false' / 'true' if ( $show_user_comments ) { $comment_count = Akismet::get_user_comments_approved( $comment->user_id, $comment->comment_author_email, $comment->comment_author, $comment->comment_author_url ); $comment_count = intval( $comment_count ); echo ''; } return $a; } public static function comment_status_meta_box( $comment ) { $history = Akismet::get_comment_history( $comment->comment_ID ); if ( $history ) { foreach ( $history as $row ) { $message = ''; if ( ! empty( $row['message'] ) ) { // Old versions of Akismet stored the message as a literal string in the commentmeta. // New versions don't do that for two reasons: // 1) Save space. // 2) The message can be translated into the current language of the blog, not stuck // in the language of the blog when the comment was made. $message = esc_html( $row['message'] ); } else if ( ! empty( $row['event'] ) ) { // If possible, use a current translation. switch ( $row['event'] ) { case 'recheck-spam': $message = esc_html( __( 'Akismet re-checked and caught this comment as spam.', 'akismet' ) ); break; case 'check-spam': $message = esc_html( __( 'Akismet caught this comment as spam.', 'akismet' ) ); break; case 'recheck-ham': $message = esc_html( __( 'Akismet re-checked and cleared this comment.', 'akismet' ) ); break; case 'check-ham': $message = esc_html( __( 'Akismet cleared this comment.', 'akismet' ) ); break; case 'wp-blacklisted': case 'wp-disallowed': $message = sprintf( /* translators: The placeholder is a WordPress PHP function name. */ esc_html( __( 'Comment was caught by %s.', 'akismet' ) ), function_exists( 'wp_check_comment_disallowed_list' ) ? 'wp_check_comment_disallowed_list' : 'wp_blacklist_check' ); break; case 'report-spam': if ( isset( $row['user'] ) ) { /* translators: The placeholder is a username. */ $message = esc_html( sprintf( __( '%s reported this comment as spam.', 'akismet' ), $row['user'] ) ); } else if ( ! $message ) { $message = esc_html( __( 'This comment was reported as spam.', 'akismet' ) ); } break; case 'report-ham': if ( isset( $row['user'] ) ) { /* translators: The placeholder is a username. */ $message = esc_html( sprintf( __( '%s reported this comment as not spam.', 'akismet' ), $row['user'] ) ); } else if ( ! $message ) { $message = esc_html( __( 'This comment was reported as not spam.', 'akismet' ) ); } break; case 'cron-retry-spam': $message = esc_html( __( 'Akismet caught this comment as spam during an automatic retry.', 'akismet' ) ); break; case 'cron-retry-ham': $message = esc_html( __( 'Akismet cleared this comment during an automatic retry.', 'akismet' ) ); break; case 'check-error': if ( isset( $row['meta'], $row['meta']['response'] ) ) { /* translators: The placeholder is an error response returned by the API server. */ $message = sprintf( esc_html( __( 'Akismet was unable to check this comment (response: %s) but will automatically retry later.', 'akismet' ) ), '' . esc_html( $row['meta']['response'] ) . '' ); } else { $message = esc_html( __( 'Akismet was unable to check this comment but will automatically retry later.', 'akismet' ) ); } break; case 'recheck-error': if ( isset( $row['meta'], $row['meta']['response'] ) ) { /* translators: The placeholder is an error response returned by the API server. */ $message = sprintf( esc_html( __( 'Akismet was unable to recheck this comment (response: %s).', 'akismet' ) ), '' . esc_html( $row['meta']['response'] ) . '' ); } else { $message = esc_html( __( 'Akismet was unable to recheck this comment.', 'akismet' ) ); } break; case 'webhook-spam': $message = esc_html( __( 'Akismet caught this comment as spam and updated its status via webhook.', 'akismet' ) ); break; case 'webhook-ham': $message = esc_html( __( 'Akismet cleared this comment and updated its status via webhook.', 'akismet' ) ); break; case 'webhook-spam-noaction': $message = esc_html( __( 'Akismet determined this comment was spam during a recheck. It did not update the comment status because it had already been modified by another user or plugin.', 'akismet' ) ); break; case 'webhook-ham-noaction': $message = esc_html( __( 'Akismet cleared this comment during a recheck. It did not update the comment status because it had already been modified by another user or plugin.', 'akismet' ) ); break; case 'akismet-skipped': $message = esc_html( __( 'This comment was not sent to Akismet when it was submitted because it was caught by something else.', 'akismet' ) ); break; case 'akismet-skipped-disallowed': $message = esc_html( __( 'This comment was not sent to Akismet when it was submitted because it was caught by the comment disallowed list.', 'akismet' ) ); break; default: if ( preg_match( '/^status-changed/', $row['event'] ) ) { // Half of these used to be saved without the dash after 'status-changed'. // See https://plugins.trac.wordpress.org/changeset/1150658/akismet/trunk $new_status = preg_replace( '/^status-changed-?/', '', $row['event'] ); /* translators: The placeholder is a short string (like 'spam' or 'approved') denoting the new comment status. */ $message = sprintf( esc_html( __( 'Comment status was changed to %s', 'akismet' ) ), '' . esc_html( $new_status ) . '' ); } else if ( preg_match( '/^status-/', $row['event'] ) ) { $new_status = preg_replace( '/^status-/', '', $row['event'] ); if ( isset( $row['user'] ) ) { /* translators: %1$s is a username; %2$s is a short string (like 'spam' or 'approved') denoting the new comment status. */ $message = sprintf( esc_html( __( '%1$s changed the comment status to %2$s.', 'akismet' ) ), $row['user'], '' . esc_html( $new_status ) . '' ); } } break; } } if ( ! empty( $message ) ) { echo '

'; if ( isset( $row['time'] ) ) { $time = gmdate( 'D d M Y @ h:i:s a', (int) $row['time'] ) . ' GMT'; /* translators: The placeholder is an amount of time, like "7 seconds" or "3 days" returned by the function human_time_diff(). */ $time_html = '' . sprintf( esc_html__( '%s ago', 'akismet' ), human_time_diff( $row['time'] ) ) . ''; echo sprintf( /* translators: %1$s is a human-readable time difference, like "3 hours ago", and %2$s is an already-translated phrase describing how a comment's status changed, like "This comment was reported as spam." */ esc_html( __( '%1$s - %2$s', 'akismet' ) ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $time_html, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $message ); // esc_html() is done above so that we can use HTML in $message. } else { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $message; // esc_html() is done above so that we can use HTML in $message. } echo '

'; } } } else { echo '

'; echo esc_html( __( 'No comment history.', 'akismet' ) ); echo '

'; } } public static function plugin_action_links( $links, $file ) { if ( $file == plugin_basename( plugin_dir_url( __FILE__ ) . '/akismet.php' ) ) { $links[] = ''.esc_html__( 'Settings' , 'akismet').''; } return $links; } // Total spam in queue // get_option( 'akismet_spam_count' ) is the total caught ever public static function get_spam_count( $type = false ) { global $wpdb; if ( !$type ) { // total $count = wp_cache_get( 'akismet_spam_count', 'widget' ); if ( false === $count ) { $count = wp_count_comments(); $count = $count->spam; wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 ); } return $count; } elseif ( 'comments' == $type || 'comment' == $type ) { // comments $type = ''; } return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM {$wpdb->comments} WHERE comment_approved = 'spam' AND comment_type = %s", $type ) ); } // Check connectivity between the WordPress blog and Akismet's servers. // Returns an associative array of server IP addresses, where the key is the IP address, and value is true (available) or false (unable to connect). public static function check_server_ip_connectivity() { $servers = $ips = array(); // Some web hosts may disable this function if ( function_exists( 'gethostbynamel' ) ) { $ips = gethostbynamel( 'rest.akismet.com' ); if ( $ips && is_array($ips) && count($ips) ) { $api_key = Akismet::get_api_key(); foreach ( $ips as $ip ) { $response = Akismet::verify_key( $api_key, $ip ); // even if the key is invalid, at least we know we have connectivity if ( $response == 'valid' || $response == 'invalid' ) $servers[$ip] = 'connected'; else $servers[$ip] = $response ? $response : 'unable to connect'; } } } return $servers; } // Simpler connectivity check public static function check_server_connectivity($cache_timeout = 86400) { $debug = array(); $debug[ 'PHP_VERSION' ] = PHP_VERSION; $debug[ 'WORDPRESS_VERSION' ] = $GLOBALS['wp_version']; $debug[ 'AKISMET_VERSION' ] = AKISMET_VERSION; $debug[ 'AKISMET__PLUGIN_DIR' ] = AKISMET__PLUGIN_DIR; $debug[ 'SITE_URL' ] = site_url(); $debug[ 'HOME_URL' ] = home_url(); $servers = get_option('akismet_available_servers'); if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) { $servers = self::check_server_ip_connectivity(); update_option('akismet_available_servers', $servers); update_option('akismet_connectivity_time', time()); } if ( wp_http_supports( array( 'ssl' ) ) ) { $response = wp_remote_get( 'https://rest.akismet.com/1.1/test' ); } else { $response = wp_remote_get( 'http://rest.akismet.com/1.1/test' ); } $debug[ 'gethostbynamel' ] = function_exists('gethostbynamel') ? 'exists' : 'not here'; $debug[ 'Servers' ] = $servers; $debug[ 'Test Connection' ] = $response; Akismet::log( $debug ); if ( $response && 'connected' == wp_remote_retrieve_body( $response ) ) return true; return false; } // Check the server connectivity and store the available servers in an option. public static function get_server_connectivity($cache_timeout = 86400) { return self::check_server_connectivity( $cache_timeout ); } /** * Find out whether any comments in the Pending queue have not yet been checked by Akismet. * * @return bool */ public static function are_any_comments_waiting_to_be_checked() { return !! get_comments( array( // Exclude comments that are not pending. This would happen if someone manually approved or spammed a comment // that was waiting to be checked. The akismet_error meta entry will eventually be removed by the cron recheck job. 'status' => 'hold', // This is the commentmeta that is saved when a comment couldn't be checked. 'meta_key' => 'akismet_error', // We only need to know whether at least one comment is waiting for a check. 'number' => 1, ) ); } public static function get_page_url( $page = 'config' ) { $args = array( 'page' => 'akismet-key-config' ); if ( $page == 'stats' ) { $args = array( 'page' => 'akismet-key-config', 'view' => 'stats' ); } elseif ( $page == 'delete_key' ) { $args = array( 'page' => 'akismet-key-config', 'view' => 'start', 'action' => 'delete-key', '_wpnonce' => wp_create_nonce( self::NONCE ) ); } elseif ( $page === 'init' ) { $args = array( 'page' => 'akismet-key-config', 'view' => 'start' ); } return add_query_arg( $args, menu_page_url( 'akismet-key-config', false ) ); } public static function get_akismet_user( $api_key ) { $akismet_user = false; $request_args = array( 'key' => $api_key, 'blog' => get_option( 'home' ), ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'get-subscription' ); $subscription_verification = Akismet::http_post( Akismet::build_query( $request_args ), 'get-subscription' ); if ( ! empty( $subscription_verification[1] ) ) { if ( 'invalid' !== $subscription_verification[1] ) { $akismet_user = json_decode( $subscription_verification[1] ); } } return $akismet_user; } public static function get_stats( $api_key ) { $stat_totals = array(); foreach( array( '6-months', 'all' ) as $interval ) { $request_args = array( 'blog' => get_option( 'home' ), 'key' => $api_key, 'from' => $interval, ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'get-stats' ); $response = Akismet::http_post( Akismet::build_query( $request_args ), 'get-stats' ); if ( ! empty( $response[1] ) ) { $data = json_decode( $response[1] ); /* * The json decoded response should be an object. If it's not an object, something's wrong, and the data * shouldn't be added to the stats_totals array. */ if ( is_object( $data ) ) { $stat_totals[ $interval ] = $data; } } } return $stat_totals; } public static function verify_wpcom_key( $api_key, $user_id, $extra = array() ) { $request_args = array_merge( array( 'user_id' => $user_id, 'api_key' => $api_key, 'get_account_type' => 'true', ), $extra ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'verify-wpcom-key' ); $akismet_account = Akismet::http_post( Akismet::build_query( $request_args ), 'verify-wpcom-key' ); if ( ! empty( $akismet_account[1] ) ) $akismet_account = json_decode( $akismet_account[1] ); Akismet::log( compact( 'akismet_account' ) ); return $akismet_account; } public static function connect_jetpack_user() { if ( $jetpack_user = self::get_jetpack_user() ) { if ( isset( $jetpack_user['user_id'] ) && isset( $jetpack_user['api_key'] ) ) { $akismet_user = self::verify_wpcom_key( $jetpack_user['api_key'], $jetpack_user['user_id'], array( 'action' => 'connect_jetpack_user' ) ); if ( is_object( $akismet_user ) ) { self::save_key( $akismet_user->api_key ); return in_array( $akismet_user->status, array( 'active', 'active-dunning', 'no-sub' ) ); } } } return false; } public static function display_alert() { Akismet::view( 'notice', array( 'type' => 'alert', 'code' => (int) get_option( 'akismet_alert_code' ), 'msg' => get_option( 'akismet_alert_msg' ) ) ); } public static function get_usage_limit_alert_data() { return array( 'type' => 'usage-limit', 'code' => (int) get_option( 'akismet_alert_code' ), 'msg' => get_option( 'akismet_alert_msg' ), 'api_calls' => get_option( 'akismet_alert_api_calls' ), 'usage_limit' => get_option( 'akismet_alert_usage_limit' ), 'upgrade_plan' => get_option( 'akismet_alert_upgrade_plan' ), 'upgrade_url' => get_option( 'akismet_alert_upgrade_url' ), 'upgrade_type' => get_option( 'akismet_alert_upgrade_type' ), 'upgrade_via_support' => get_option( 'akismet_alert_upgrade_via_support' ) === 'true', ); } public static function display_usage_limit_alert() { Akismet::view( 'notice', self::get_usage_limit_alert_data() ); } public static function display_spam_check_warning() { Akismet::fix_scheduled_recheck(); if ( wp_next_scheduled('akismet_schedule_cron_recheck') > time() && self::are_any_comments_waiting_to_be_checked() ) { /* * The 'akismet_display_cron_disabled_notice' filter can be used to control whether the WP-Cron disabled notice is displayed. */ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON && apply_filters( 'akismet_display_cron_disabled_notice', true ) ) { Akismet::view( 'notice', array( 'type' => 'spam-check-cron-disabled' ) ); } else { /* translators: The Akismet configuration page URL. */ $link_text = apply_filters( 'akismet_spam_check_warning_link_text', sprintf( __( 'Please check your Akismet configuration and contact your web host if problems persist.', 'akismet' ), esc_url( self::get_page_url() ) ) ); Akismet::view( 'notice', array( 'type' => 'spam-check', 'link_text' => $link_text ) ); } } } public static function display_api_key_warning() { Akismet::view( 'notice', array( 'type' => 'plugin' ) ); } public static function display_page() { if ( !Akismet::get_api_key() || ( isset( $_GET['view'] ) && $_GET['view'] == 'start' ) ) self::display_start_page(); elseif ( isset( $_GET['view'] ) && $_GET['view'] == 'stats' ) self::display_stats_page(); else self::display_configuration_page(); } public static function display_start_page() { if ( isset( $_GET['action'] ) ) { if ( $_GET['action'] == 'delete-key' ) { if ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( $_GET['_wpnonce'], self::NONCE ) ) delete_option( 'wordpress_api_key' ); } } if ( $api_key = Akismet::get_api_key() && ( empty( self::$notices['status'] ) || 'existing-key-invalid' != self::$notices['status'] ) ) { self::display_configuration_page(); return; } //the user can choose to auto connect their API key by clicking a button on the akismet done page //if jetpack, get verified api key by using connected wpcom user id //if no jetpack, get verified api key by using an akismet token $akismet_user = false; if ( isset( $_GET['token'] ) && preg_match('/^(\d+)-[0-9a-f]{20}$/', $_GET['token'] ) ) $akismet_user = self::verify_wpcom_key( '', '', array( 'token' => $_GET['token'] ) ); elseif ( $jetpack_user = self::get_jetpack_user() ) $akismet_user = self::verify_wpcom_key( $jetpack_user['api_key'], $jetpack_user['user_id'] ); if ( isset( $_GET['action'] ) ) { if ( $_GET['action'] == 'save-key' ) { if ( is_object( $akismet_user ) ) { self::save_key( $akismet_user->api_key ); self::display_configuration_page(); return; } } } Akismet::view( 'start', compact( 'akismet_user' ) ); /* // To see all variants when testing. $akismet_user->status = 'no-sub'; Akismet::view( 'start', compact( 'akismet_user' ) ); $akismet_user->status = 'cancelled'; Akismet::view( 'start', compact( 'akismet_user' ) ); $akismet_user->status = 'suspended'; Akismet::view( 'start', compact( 'akismet_user' ) ); $akismet_user->status = 'other'; Akismet::view( 'start', compact( 'akismet_user' ) ); $akismet_user = false; */ } public static function display_stats_page() { Akismet::view( 'stats' ); } public static function display_configuration_page() { $api_key = Akismet::get_api_key(); $akismet_user = self::get_akismet_user( $api_key ); if ( ! $akismet_user ) { // This could happen if the user's key became invalid after it was previously valid and successfully set up. self::$notices['status'] = 'existing-key-invalid'; self::display_start_page(); return; } $stat_totals = self::get_stats( $api_key ); // If unset, create the new strictness option using the old discard option to determine its default. // If the old option wasn't set, default to discarding the blatant spam. if ( get_option( 'akismet_strictness' ) === false ) { add_option( 'akismet_strictness', ( get_option( 'akismet_discard_month' ) === 'false' ? '0' : '1' ) ); } // Sync the local "Total spam blocked" count with the authoritative count from the server. if ( isset( $stat_totals['all'], $stat_totals['all']->spam ) ) { update_option( 'akismet_spam_count', $stat_totals['all']->spam ); } $notices = array(); if ( empty( self::$notices ) ) { if ( ! empty( $stat_totals['all'] ) && isset( $stat_totals['all']->time_saved ) && $akismet_user->status == 'active' && $akismet_user->account_type == 'free-api-key' ) { $time_saved = false; if ( $stat_totals['all']->time_saved > 1800 ) { $total_in_minutes = round( $stat_totals['all']->time_saved / 60 ); $total_in_hours = round( $total_in_minutes / 60 ); $total_in_days = round( $total_in_hours / 8 ); $cleaning_up = __( 'Cleaning up spam takes time.' , 'akismet'); if ( $total_in_days > 1 ) $time_saved = $cleaning_up . ' ' . sprintf( _n( 'Akismet has saved you %s day!', 'Akismet has saved you %s days!', $total_in_days, 'akismet' ), number_format_i18n( $total_in_days ) ); elseif ( $total_in_hours > 1 ) $time_saved = $cleaning_up . ' ' . sprintf( _n( 'Akismet has saved you %d hour!', 'Akismet has saved you %d hours!', $total_in_hours, 'akismet' ), $total_in_hours ); elseif ( $total_in_minutes >= 30 ) $time_saved = $cleaning_up . ' ' . sprintf( _n( 'Akismet has saved you %d minute!', 'Akismet has saved you %d minutes!', $total_in_minutes, 'akismet' ), $total_in_minutes ); } $notices[] = array( 'type' => 'active-notice', 'time_saved' => $time_saved ); } } if ( !isset( self::$notices['status'] ) && in_array( $akismet_user->status, array( 'cancelled', 'suspended', 'missing', 'no-sub' ) ) ) { $notices[] = array( 'type' => $akismet_user->status ); } $alert_code = get_option( 'akismet_alert_code' ); if ( isset( Akismet::$limit_notices[ $alert_code ] ) ) { $notices[] = self::get_usage_limit_alert_data(); } elseif ( $alert_code > 0 ) { $notices[] = array( 'type' => 'alert', 'code' => (int) get_option( 'akismet_alert_code' ), 'msg' => get_option( 'akismet_alert_msg' ), ); } /* * To see all variants when testing. * * You may also want to comment out the akismet_view_arguments filter in Akismet::view() * to ensure that you can see all of the notices (e.g. suspended, active-notice). */ // $notices[] = array( 'type' => 'active-notice', 'time_saved' => 'Cleaning up spam takes time. Akismet has saved you 1 minute!' ); // $notices[] = array( 'type' => 'plugin' ); // $notices[] = array( 'type' => 'notice', 'notice_header' => 'This is the notice header.', 'notice_text' => 'This is the notice text.' ); // $notices[] = array( 'type' => 'missing-functions' ); // $notices[] = array( 'type' => 'servers-be-down' ); // $notices[] = array( 'type' => 'active-dunning' ); // $notices[] = array( 'type' => 'cancelled' ); // $notices[] = array( 'type' => 'suspended' ); // $notices[] = array( 'type' => 'missing' ); // $notices[] = array( 'type' => 'no-sub' ); // $notices[] = array( 'type' => 'new-key-valid' ); // $notices[] = array( 'type' => 'new-key-invalid' ); // $notices[] = array( 'type' => 'existing-key-invalid' ); // $notices[] = array( 'type' => 'new-key-failed' ); // $notices[] = array( 'type' => 'usage-limit', 'api_calls' => '15000', 'usage_limit' => '10000', 'upgrade_plan' => 'Enterprise', 'upgrade_url' => 'https://akismet.com/account/', 'code' => 10502 ); // $notices[] = array( 'type' => 'spam-check', 'link_text' => 'Link text.' ); // $notices[] = array( 'type' => 'spam-check-cron-disabled' ); // $notices[] = array( 'type' => 'alert', 'code' => 123 ); Akismet::log( compact( 'stat_totals', 'akismet_user' ) ); Akismet::view( 'config', compact( 'api_key', 'akismet_user', 'stat_totals', 'notices' ) ); } public static function display_notice() { global $hook_suffix; if ( in_array( $hook_suffix, array( 'jetpack_page_akismet-key-config', 'settings_page_akismet-key-config' ) ) ) { // This page manages the notices and puts them inline where they make sense. return; } // To see notice variants while testing. // Akismet::view( 'notice', array( 'type' => 'spam-check-cron-disabled' ) ); // Akismet::view( 'notice', array( 'type' => 'spam-check' ) ); // Akismet::view( 'notice', array( 'type' => 'alert', 'code' => 123, 'msg' => 'Message' ) ); if ( in_array( $hook_suffix, array( 'edit-comments.php' ) ) && (int) get_option( 'akismet_alert_code' ) > 0 ) { Akismet::verify_key( Akismet::get_api_key() ); //verify that the key is still in alert state $alert_code = get_option( 'akismet_alert_code' ); if ( isset( Akismet::$limit_notices[ $alert_code ] ) ) { self::display_usage_limit_alert(); } elseif ( $alert_code > 0 ) { self::display_alert(); } } elseif ( ( 'plugins.php' === $hook_suffix || 'edit-comments.php' === $hook_suffix ) && ! Akismet::get_api_key() ) { // Show the "Set Up Akismet" banner on the comments and plugin pages if no API key has been set. self::display_api_key_warning(); } elseif ( $hook_suffix == 'edit-comments.php' && wp_next_scheduled( 'akismet_schedule_cron_recheck' ) ) { self::display_spam_check_warning(); } if ( isset( $_GET['akismet_recheck_complete'] ) ) { $recheck_count = (int) $_GET['recheck_count']; $spam_count = (int) $_GET['spam_count']; if ( $recheck_count === 0 ) { $message = __( 'There were no comments to check. Akismet will only check comments awaiting moderation.', 'akismet' ); } else { $message = sprintf( _n( 'Akismet checked %s comment.', 'Akismet checked %s comments.', $recheck_count, 'akismet' ), number_format( $recheck_count ) ); $message .= ' '; if ( $spam_count === 0 ) { $message .= __( 'No comments were caught as spam.', 'akismet' ); } else { $message .= sprintf( _n( '%s comment was caught as spam.', '%s comments were caught as spam.', $spam_count, 'akismet' ), number_format( $spam_count ) ); } } echo '

' . esc_html( $message ) . '

'; } else if ( isset( $_GET['akismet_recheck_error'] ) ) { echo '

' . esc_html( __( 'Akismet could not recheck your comments for spam.', 'akismet' ) ) . '

'; } } public static function display_status() { if ( ! self::get_server_connectivity() ) { Akismet::view( 'notice', array( 'type' => 'servers-be-down' ) ); } else if ( ! empty( self::$notices ) ) { foreach ( self::$notices as $index => $type ) { if ( is_object( $type ) ) { $notice_header = $notice_text = ''; if ( property_exists( $type, 'notice_header' ) ) { $notice_header = wp_kses( $type->notice_header, self::$allowed ); } if ( property_exists( $type, 'notice_text' ) ) { $notice_text = wp_kses( $type->notice_text, self::$allowed ); } if ( property_exists( $type, 'status' ) ) { $type = wp_kses( $type->status, self::$allowed ); Akismet::view( 'notice', compact( 'type', 'notice_header', 'notice_text' ) ); unset( self::$notices[ $index ] ); } } else { Akismet::view( 'notice', compact( 'type' ) ); unset( self::$notices[ $index ] ); } } } } private static function get_jetpack_user() { if ( !class_exists('Jetpack') ) return false; if ( defined( 'JETPACK__VERSION' ) && version_compare( JETPACK__VERSION, '7.7', '<' ) ) { // For version of Jetpack prior to 7.7. Jetpack::load_xml_rpc_client(); } $xml = new Jetpack_IXR_ClientMulticall( array( 'user_id' => get_current_user_id() ) ); $xml->addCall( 'wpcom.getUserID' ); $xml->addCall( 'akismet.getAPIKey' ); $xml->query(); Akismet::log( compact( 'xml' ) ); if ( !$xml->isError() ) { $responses = $xml->getResponse(); if ( ( is_countable( $responses ) ? count( $responses ) : 0 ) > 1 ) { // Due to a quirk in how Jetpack does multi-calls, the response order // can't be trusted to match the call order. It's a good thing our // return values can be mostly differentiated from each other. $first_response_value = array_shift( $responses[0] ); $second_response_value = array_shift( $responses[1] ); // If WPCOM ever reaches 100 billion users, this will fail. :-) if ( preg_match( '/^[a-f0-9]{12}$/i', $first_response_value ) ) { $api_key = $first_response_value; $user_id = (int) $second_response_value; } else { $api_key = $second_response_value; $user_id = (int) $first_response_value; } return compact( 'api_key', 'user_id' ); } } return false; } /** * Some commentmeta isn't useful in an export file. Suppress it (when supported). * * @param bool $exclude * @param string $key The meta key * @param object $meta The meta object * @return bool Whether to exclude this meta entry from the export. */ public static function exclude_commentmeta_from_export( $exclude, $key, $meta ) { if ( in_array( $key, array( 'akismet_as_submitted', 'akismet_rechecking', 'akismet_delayed_moderation_email' ) ) ) { return true; } return $exclude; } /** * When Akismet is active, remove the "Activate Akismet" step from the plugin description. */ public static function modify_plugin_description( $all_plugins ) { if ( isset( $all_plugins['akismet/akismet.php'] ) ) { if ( Akismet::get_api_key() ) { $all_plugins['akismet/akismet.php']['Description'] = __( 'Used by millions, Akismet is quite possibly the best way in the world to protect your blog from spam. Your site is fully configured and being protected, even while you sleep.', 'akismet' ); } else { $all_plugins['akismet/akismet.php']['Description'] = __( 'Used by millions, Akismet is quite possibly the best way in the world to protect your blog from spam. It keeps your site protected even while you sleep. To get started, just go to your Akismet Settings page to set up your API key.', 'akismet' ); } } return $all_plugins; } private static function set_form_privacy_notice_option( $state ) { if ( in_array( $state, array( 'display', 'hide' ) ) ) { update_option( 'akismet_comment_form_privacy_notice', $state ); } } public static function register_personal_data_eraser( $erasers ) { $erasers['akismet'] = array( 'eraser_friendly_name' => __( 'Akismet', 'akismet' ), 'callback' => array( 'Akismet_Admin', 'erase_personal_data' ), ); return $erasers; } /** * When a user requests that their personal data be removed, Akismet has a duty to discard * any personal data we store outside of the comment itself. Right now, that is limited * to the copy of the comment we store in the akismet_as_submitted commentmeta. * * FWIW, this information would be automatically deleted after 15 days. * * @param $email_address string The email address of the user who has requested erasure. * @param $page int This function can (and will) be called multiple times to prevent timeouts, * so this argument is used for pagination. * @return array * @see https://developer.wordpress.org/plugins/privacy/adding-the-personal-data-eraser-to-your-plugin/ */ public static function erase_personal_data( $email_address, $page = 1 ) { $items_removed = false; $number = 50; $page = (int) $page; $comments = get_comments( array( 'author_email' => $email_address, 'number' => $number, 'paged' => $page, 'order_by' => 'comment_ID', 'order' => 'ASC', ) ); foreach ( (array) $comments as $comment ) { $comment_as_submitted = get_comment_meta( $comment->comment_ID, 'akismet_as_submitted', true ); if ( $comment_as_submitted ) { delete_comment_meta( $comment->comment_ID, 'akismet_as_submitted' ); $items_removed = true; } } // Tell core if we have more comments to work on still $done = ( is_countable( $comments ) ? count( $comments ) : 0 ) < $number; return array( 'items_removed' => $items_removed, 'items_retained' => false, // always false in this example 'messages' => array(), // no messages in this example 'done' => $done, ); } /** * Return an array of HTML elements that are allowed in a notice. * * @return array */ public static function get_notice_kses_allowed_elements() { return self::$allowed; } /** * Return a version to append to the URL of an asset file (e.g. CSS and images). * * @param string $relative_path Relative path to asset file * @return string */ public static function get_asset_file_version( $relative_path ) { $full_path = AKISMET__PLUGIN_DIR . $relative_path; // If the AKISMET_VERSION contains a lower-case letter, it's a development version (e.g. 5.3.1a2). // Use the file modified time in development. if ( preg_match( '/[a-z]/', AKISMET_VERSION ) && file_exists( $full_path ) ) { return filemtime( $full_path ); } // Otherwise, use the AKISMET_VERSION. return AKISMET_VERSION; } } PKwL\B;akismet/class.akismet-cli.phpnu[... * : The ID(s) of the comment(s) to check. * * [--noaction] * : Don't change the status of the comment. Just report what Akismet thinks it is. * * ## EXAMPLES * * wp akismet check 12345 * * @alias comment-check */ public function check( $args, $assoc_args ) { foreach ( $args as $comment_id ) { if ( isset( $assoc_args['noaction'] ) ) { // Check the comment, but don't reclassify it. $api_response = Akismet::check_db_comment( $comment_id, 'wp-cli' ); } else { $api_response = Akismet::recheck_comment( $comment_id, 'wp-cli' ); } if ( 'true' === $api_response ) { WP_CLI::line( sprintf( __( "Comment #%d is spam.", 'akismet' ), $comment_id ) ); } else if ( 'false' === $api_response ) { WP_CLI::line( sprintf( __( "Comment #%d is not spam.", 'akismet' ), $comment_id ) ); } else { if ( false === $api_response ) { WP_CLI::error( __( "Failed to connect to Akismet.", 'akismet' ) ); } else if ( is_wp_error( $api_response ) ) { WP_CLI::warning( sprintf( __( "Comment #%d could not be checked.", 'akismet' ), $comment_id ) ); } } } } /** * Recheck all comments in the Pending queue. * * ## EXAMPLES * * wp akismet recheck_queue * * @alias recheck-queue */ public function recheck_queue() { $batch_size = 100; $start = 0; $total_counts = array(); do { $result_counts = Akismet_Admin::recheck_queue_portion( $start, $batch_size ); if ( $result_counts['processed'] > 0 ) { foreach ( $result_counts as $key => $count ) { if ( ! isset( $total_counts[ $key ] ) ) { $total_counts[ $key ] = $count; } else { $total_counts[ $key ] += $count; } } $start += $batch_size; $start -= $result_counts['spam']; // These comments will have been removed from the queue. } } while ( $result_counts['processed'] > 0 ); WP_CLI::line( sprintf( _n( "Processed %d comment.", "Processed %d comments.", $total_counts['processed'], 'akismet' ), number_format( $total_counts['processed'] ) ) ); WP_CLI::line( sprintf( _n( "%d comment moved to Spam.", "%d comments moved to Spam.", $total_counts['spam'], 'akismet' ), number_format( $total_counts['spam'] ) ) ); if ( $total_counts['error'] ) { WP_CLI::line( sprintf( _n( "%d comment could not be checked.", "%d comments could not be checked.", $total_counts['error'], 'akismet' ), number_format( $total_counts['error'] ) ) ); } } /** * Fetches stats from the Akismet API. * * ## OPTIONS * * [] * : The time period for which to retrieve stats. * --- * default: all * options: * - days * - months * - all * --- * * [--format=] * : Allows overriding the output of the command when listing connections. * --- * default: table * options: * - table * - json * - csv * - yaml * - count * --- * * [--summary] * : When set, will display a summary of the stats. * * ## EXAMPLES * * wp akismet stats * wp akismet stats all * wp akismet stats days * wp akismet stats months * wp akismet stats all --summary */ public function stats( $args, $assoc_args ) { $api_key = Akismet::get_api_key(); if ( empty( $api_key ) ) { WP_CLI::error( __( 'API key must be set to fetch stats.', 'akismet' ) ); } switch ( $args[0] ) { case 'days': $interval = '60-days'; break; case 'months': $interval = '6-months'; break; default: $interval = 'all'; break; } $request_args = array( 'blog' => get_option( 'home' ), 'key' => $api_key, 'from' => $interval, ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'get-stats' ); $response = Akismet::http_post( Akismet::build_query( $request_args ), 'get-stats' ); if ( empty( $response[1] ) ) { WP_CLI::error( __( 'Currently unable to fetch stats. Please try again.', 'akismet' ) ); } $response_body = json_decode( $response[1], true ); if ( is_null( $response_body ) ) { WP_CLI::error( __( 'Stats response could not be decoded.', 'akismet' ) ); } if ( isset( $assoc_args['summary'] ) ) { $keys = array( 'spam', 'ham', 'missed_spam', 'false_positives', 'accuracy', 'time_saved', ); WP_CLI\Utils\format_items( $assoc_args['format'], array( $response_body ), $keys ); } else { $stats = $response_body['breakdown']; WP_CLI\Utils\format_items( $assoc_args['format'], $stats, array_keys( end( $stats ) ) ); } } }PKwL\|E E akismet/class.akismet-widget.phpnu[ __( 'Display the number of spam comments Akismet has caught' , 'akismet') ) ); if ( is_active_widget( false, false, $this->id_base ) ) { add_action( 'wp_head', array( $this, 'css' ) ); } } function css() { ?>

'FIRST_MONTH_OVER_LIMIT', 10502 => 'SECOND_MONTH_OVER_LIMIT', 10504 => 'THIRD_MONTH_APPROACHING_LIMIT', 10508 => 'THIRD_MONTH_OVER_LIMIT', 10516 => 'FOUR_PLUS_MONTHS_OVER_LIMIT', ); private static $last_comment = ''; private static $initiated = false; private static $prevent_moderation_email_for_these_comments = array(); private static $last_comment_result = null; private static $comment_as_submitted_allowed_keys = array( 'blog' => '', 'blog_charset' => '', 'blog_lang' => '', 'blog_ua' => '', 'comment_agent' => '', 'comment_author' => '', 'comment_author_IP' => '', 'comment_author_email' => '', 'comment_author_url' => '', 'comment_content' => '', 'comment_date_gmt' => '', 'comment_tags' => '', 'comment_type' => '', 'guid' => '', 'is_test' => '', 'permalink' => '', 'reporter' => '', 'site_domain' => '', 'submit_referer' => '', 'submit_uri' => '', 'user_ID' => '', 'user_agent' => '', 'user_id' => '', 'user_ip' => '' ); public static function init() { if ( ! self::$initiated ) { self::init_hooks(); } } /** * Initializes WordPress hooks */ private static function init_hooks() { self::$initiated = true; add_action( 'wp_insert_comment', array( 'Akismet', 'auto_check_update_meta' ), 10, 2 ); add_filter( 'preprocess_comment', array( 'Akismet', 'auto_check_comment' ), 1 ); add_filter( 'rest_pre_insert_comment', array( 'Akismet', 'rest_auto_check_comment' ), 1 ); add_action( 'comment_form', array( 'Akismet', 'load_form_js' ) ); add_action( 'do_shortcode_tag', array( 'Akismet', 'load_form_js_via_filter' ), 10, 4 ); add_action( 'akismet_scheduled_delete', array( 'Akismet', 'delete_old_comments' ) ); add_action( 'akismet_scheduled_delete', array( 'Akismet', 'delete_old_comments_meta' ) ); add_action( 'akismet_scheduled_delete', array( 'Akismet', 'delete_orphaned_commentmeta' ) ); add_action( 'akismet_schedule_cron_recheck', array( 'Akismet', 'cron_recheck' ) ); add_action( 'comment_form', array( 'Akismet', 'add_comment_nonce' ), 1 ); add_action( 'comment_form', array( 'Akismet', 'output_custom_form_fields' ) ); add_filter( 'script_loader_tag', array( 'Akismet', 'set_form_js_async' ), 10, 3 ); add_filter( 'comment_moderation_recipients', array( 'Akismet', 'disable_moderation_emails_if_unreachable' ), 1000, 2 ); add_filter( 'pre_comment_approved', array( 'Akismet', 'last_comment_status' ), 10, 2 ); add_action( 'transition_comment_status', array( 'Akismet', 'transition_comment_status' ), 10, 3 ); // Run this early in the pingback call, before doing a remote fetch of the source uri add_action( 'xmlrpc_call', array( 'Akismet', 'pre_check_pingback' ), 10, 3 ); // Jetpack compatibility add_filter( 'jetpack_options_whitelist', array( 'Akismet', 'add_to_jetpack_options_whitelist' ) ); add_filter( 'jetpack_contact_form_html', array( 'Akismet', 'inject_custom_form_fields' ) ); add_filter( 'jetpack_contact_form_akismet_values', array( 'Akismet', 'prepare_custom_form_values' ) ); // Gravity Forms add_filter( 'gform_get_form_filter', array( 'Akismet', 'inject_custom_form_fields' ) ); add_filter( 'gform_akismet_fields', array( 'Akismet', 'prepare_custom_form_values' ) ); // Contact Form 7 add_filter( 'wpcf7_form_elements', array( 'Akismet', 'append_custom_form_fields' ) ); add_filter( 'wpcf7_akismet_parameters', array( 'Akismet', 'prepare_custom_form_values' ) ); // Formidable Forms add_filter( 'frm_filter_final_form', array( 'Akismet', 'inject_custom_form_fields' ) ); add_filter( 'frm_akismet_values', array( 'Akismet', 'prepare_custom_form_values' ) ); // Fluent Forms /* * The Fluent Forms hook names were updated in version 5.0.0. The last version that supported * the original hook names was 4.3.25, and version 4.3.25 was tested up to WordPress version 6.1. * * The legacy hooks are fired before the new hooks. See * https://github.com/fluentform/fluentform/commit/cc45341afcae400f217470a7bbfb15efdd80454f * * The legacy Fluent Forms hooks will be removed when Akismet no longer supports WordPress version 6.1. * This will provide compatibility with previous versions of Fluent Forms for a reasonable amount of time. */ add_filter( 'fluentform_form_element_start', array( 'Akismet', 'output_custom_form_fields' ) ); add_filter( 'fluentform_akismet_fields', array( 'Akismet', 'prepare_custom_form_values' ), 10, 2 ); // Current Fluent Form hooks. add_filter( 'fluentform/form_element_start', array( 'Akismet', 'output_custom_form_fields' ) ); add_filter( 'fluentform/akismet_fields', array( 'Akismet', 'prepare_custom_form_values' ), 10, 2 ); add_action( 'update_option_wordpress_api_key', array( 'Akismet', 'updated_option' ), 10, 2 ); add_action( 'add_option_wordpress_api_key', array( 'Akismet', 'added_option' ), 10, 2 ); add_action( 'comment_form_after', array( 'Akismet', 'display_comment_form_privacy_notice' ) ); } public static function get_api_key() { return apply_filters( 'akismet_get_api_key', defined('WPCOM_API_KEY') ? constant('WPCOM_API_KEY') : get_option('wordpress_api_key') ); } /** * Exchange the API key for a token that can only be used to access stats pages. * * @return string */ public static function get_access_token() { static $access_token = null; if ( is_null( $access_token ) ) { $request_args = array( 'api_key' => self::get_api_key() ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'token' ); $response = self::http_post( self::build_query( $request_args ), 'token' ); $access_token = $response[1]; } return $access_token; } public static function check_key_status( $key, $ip = null ) { $request_args = array( 'key' => $key, 'blog' => get_option( 'home' ), ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'verify-key' ); return self::http_post( self::build_query( $request_args ), 'verify-key', $ip ); } public static function verify_key( $key, $ip = null ) { // Shortcut for obviously invalid keys. if ( strlen( $key ) != 12 ) { return 'invalid'; } $response = self::check_key_status( $key, $ip ); if ( $response[1] != 'valid' && $response[1] != 'invalid' ) return 'failed'; return $response[1]; } public static function deactivate_key( $key ) { $request_args = array( 'key' => $key, 'blog' => get_option( 'home' ), ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'deactivate' ); $response = self::http_post( self::build_query( $request_args ), 'deactivate' ); if ( $response[1] != 'deactivated' ) return 'failed'; return $response[1]; } /** * Add the akismet option to the Jetpack options management whitelist. * * @param array $options The list of whitelisted option names. * @return array The updated whitelist */ public static function add_to_jetpack_options_whitelist( $options ) { $options[] = 'wordpress_api_key'; return $options; } /** * When the akismet option is updated, run the registration call. * * This should only be run when the option is updated from the Jetpack/WP.com * API call, and only if the new key is different than the old key. * * @param mixed $old_value The old option value. * @param mixed $value The new option value. */ public static function updated_option( $old_value, $value ) { // Not an API call if ( ! class_exists( 'WPCOM_JSON_API_Update_Option_Endpoint' ) ) { return; } // Only run the registration if the old key is different. if ( $old_value !== $value ) { self::verify_key( $value ); } } /** * Treat the creation of an API key the same as updating the API key to a new value. * * @param mixed $option_name Will always be "wordpress_api_key", until something else hooks in here. * @param mixed $value The option value. */ public static function added_option( $option_name, $value ) { if ( 'wordpress_api_key' === $option_name ) { return self::updated_option( '', $value ); } } public static function rest_auto_check_comment( $commentdata ) { return self::auto_check_comment( $commentdata, 'rest_api' ); } /** * Check a comment for spam. * * @param array $commentdata * @param string $context What kind of request triggered this comment check? Possible values are 'default', 'rest_api', and 'xml-rpc'. * @return array|WP_Error Either the $commentdata array with additional entries related to its spam status * or a WP_Error, if it's a REST API request and the comment should be discarded. */ public static function auto_check_comment( $commentdata, $context = 'default' ) { // If no key is configured, then there's no point in doing any of this. if ( ! self::get_api_key() ) { return $commentdata; } self::$last_comment_result = null; // Skip the Akismet check if the comment matches the Disallowed Keys list. if ( function_exists( 'wp_check_comment_disallowed_list' ) ) { $comment_author = isset( $commentdata['comment_author'] ) ? $commentdata['comment_author'] : ''; $comment_author_email = isset( $commentdata['comment_author_email'] ) ? $commentdata['comment_author_email'] : ''; $comment_author_url = isset( $commentdata['comment_author_url'] ) ? $commentdata['comment_author_url'] : ''; $comment_content = isset( $commentdata['comment_content'] ) ? $commentdata['comment_content'] : ''; $comment_author_ip = isset( $commentdata['comment_author_IP'] ) ? $commentdata['comment_author_IP'] : ''; $comment_agent = isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : ''; if ( wp_check_comment_disallowed_list( $comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_ip, $comment_agent ) ) { self::set_last_comment( $commentdata ); return $commentdata; } } $comment = $commentdata; $comment['user_ip'] = self::get_ip_address(); $comment['user_agent'] = self::get_user_agent(); $comment['referrer'] = self::get_referer(); $comment['blog'] = get_option( 'home' ); $comment['blog_lang'] = get_locale(); $comment['blog_charset'] = get_option('blog_charset'); $comment['permalink'] = get_permalink( $comment['comment_post_ID'] ); if ( ! empty( $comment['user_ID'] ) ) { $comment['user_role'] = Akismet::get_user_roles( $comment['user_ID'] ); } /** See filter documentation in init_hooks(). */ $akismet_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); $comment['akismet_comment_nonce'] = 'inactive'; if ( $akismet_nonce_option == 'true' || $akismet_nonce_option == '' ) { $comment['akismet_comment_nonce'] = 'failed'; if ( isset( $_POST['akismet_comment_nonce'] ) && wp_verify_nonce( $_POST['akismet_comment_nonce'], 'akismet_comment_nonce_' . $comment['comment_post_ID'] ) ) $comment['akismet_comment_nonce'] = 'passed'; // comment reply in wp-admin if ( isset( $_POST['_ajax_nonce-replyto-comment'] ) && check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ) ) $comment['akismet_comment_nonce'] = 'passed'; } if ( self::is_test_mode() ) $comment['is_test'] = 'true'; foreach( $_POST as $key => $value ) { if ( is_string( $value ) ) $comment["POST_{$key}"] = $value; } foreach ( $_SERVER as $key => $value ) { if ( ! is_string( $value ) ) { continue; } if ( preg_match( "/^HTTP_COOKIE/", $key ) ) { continue; } // Send any potentially useful $_SERVER vars, but avoid sending junk we don't need. if ( preg_match( "/^(HTTP_|REMOTE_ADDR|REQUEST_URI|DOCUMENT_URI)/", $key ) ) { $comment[ "$key" ] = $value; } } $post = get_post( $comment['comment_post_ID'] ); if ( ! is_null( $post ) ) { // $post can technically be null, although in the past, it's always been an indicator of another plugin interfering. $comment[ 'comment_post_modified_gmt' ] = $post->post_modified_gmt; // Tags and categories are important context in which to consider the comment. $comment['comment_context'] = array(); $tag_names = wp_get_post_tags( $post->ID, array( 'fields' => 'names' ) ); if ( $tag_names && ! is_wp_error( $tag_names ) ) { foreach ( $tag_names as $tag_name ) { $comment['comment_context'][] = $tag_name; } } $category_names = wp_get_post_categories( $post->ID, array( 'fields' => 'names' ) ); if ( $category_names && ! is_wp_error( $category_names ) ) { foreach ( $category_names as $category_name ) { $comment['comment_context'][] = $category_name; } } } /** * Filter the data that is used to generate the request body for the API call. * * @since 5.3.1 * * @param array $comment An array of request data. * @param string $endpoint The API endpoint being requested. */ $comment = apply_filters( 'akismet_request_args', $comment, 'comment-check' ); $response = self::http_post( self::build_query( $comment ), 'comment-check' ); do_action( 'akismet_comment_check_response', $response ); $commentdata['comment_as_submitted'] = array_intersect_key( $comment, self::$comment_as_submitted_allowed_keys ); // Also include any form fields we inject into the comment form, like ak_js foreach ( $_POST as $key => $value ) { if ( is_string( $value ) && strpos( $key, 'ak_' ) === 0 ) { $commentdata['comment_as_submitted'][ 'POST_' . $key ] = $value; } } $commentdata['akismet_result'] = $response[1]; if ( isset( $response[0]['x-akismet-pro-tip'] ) ) $commentdata['akismet_pro_tip'] = $response[0]['x-akismet-pro-tip']; if ( isset( $response[0]['x-akismet-guid'] ) ) { $commentdata['akismet_guid'] = $response[0]['x-akismet-guid']; } if ( isset( $response[0]['x-akismet-error'] ) ) { // An error occurred that we anticipated (like a suspended key) and want the user to act on. // Send to moderation. self::$last_comment_result = '0'; } else if ( 'true' == $response[1] ) { // akismet_spam_count will be incremented later by comment_is_spam() self::$last_comment_result = 'spam'; $discard = ( isset( $commentdata['akismet_pro_tip'] ) && $commentdata['akismet_pro_tip'] === 'discard' && self::allow_discard() ); do_action( 'akismet_spam_caught', $discard ); if ( $discard ) { // The spam is obvious, so we're bailing out early. // akismet_result_spam() won't be called so bump the counter here if ( $incr = apply_filters( 'akismet_spam_count_incr', 1 ) ) { update_option( 'akismet_spam_count', get_option( 'akismet_spam_count' ) + $incr ); } if ( 'rest_api' === $context ) { return new WP_Error( 'akismet_rest_comment_discarded', __( 'Comment discarded.', 'akismet' ) ); } else if ( 'xml-rpc' === $context ) { // If this is a pingback that we're pre-checking, the discard behavior is the same as the normal spam response behavior. return $commentdata; } else { // Redirect back to the previous page, or failing that, the post permalink, or failing that, the homepage of the blog. $redirect_to = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : ( $post ? get_permalink( $post ) : home_url() ); wp_safe_redirect( esc_url_raw( $redirect_to ) ); die(); } } else if ( 'rest_api' === $context ) { // The way the REST API structures its calls, we can set the comment_approved value right away. $commentdata['comment_approved'] = 'spam'; } } // if the response is neither true nor false, hold the comment for moderation and schedule a recheck if ( 'true' != $response[1] && 'false' != $response[1] ) { if ( !current_user_can('moderate_comments') ) { // Comment status should be moderated self::$last_comment_result = '0'; } if ( ! wp_next_scheduled( 'akismet_schedule_cron_recheck' ) ) { wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); do_action( 'akismet_scheduled_recheck', 'invalid-response-' . $response[1] ); } self::$prevent_moderation_email_for_these_comments[] = $commentdata; } // Delete old comments daily if ( ! wp_next_scheduled( 'akismet_scheduled_delete' ) ) { wp_schedule_event( time(), 'daily', 'akismet_scheduled_delete' ); } self::set_last_comment( $commentdata ); self::fix_scheduled_recheck(); return $commentdata; } public static function get_last_comment() { return self::$last_comment; } public static function set_last_comment( $comment ) { if ( is_null( $comment ) ) { self::$last_comment = null; } else { // We filter it here so that it matches the filtered comment data that we'll have to compare against later. // wp_filter_comment expects comment_author_IP self::$last_comment = wp_filter_comment( array_merge( array( 'comment_author_IP' => self::get_ip_address() ), $comment ) ); } } // this fires on wp_insert_comment. we can't update comment_meta when auto_check_comment() runs // because we don't know the comment ID at that point. public static function auto_check_update_meta( $id, $comment ) { // wp_insert_comment() might be called in other contexts, so make sure this is the same comment // as was checked by auto_check_comment if ( is_object( $comment ) && !empty( self::$last_comment ) && is_array( self::$last_comment ) ) { if ( self::matches_last_comment( $comment ) ) { load_plugin_textdomain( 'akismet' ); // normal result: true or false if ( isset( self::$last_comment['akismet_result'] ) && self::$last_comment['akismet_result'] == 'true' ) { update_comment_meta( $comment->comment_ID, 'akismet_result', 'true' ); self::update_comment_history( $comment->comment_ID, '', 'check-spam' ); if ( $comment->comment_approved != 'spam' ) { self::update_comment_history( $comment->comment_ID, '', 'status-changed-' . $comment->comment_approved ); } } elseif ( isset( self::$last_comment['akismet_result'] ) && self::$last_comment['akismet_result'] == 'false' ) { update_comment_meta( $comment->comment_ID, 'akismet_result', 'false' ); self::update_comment_history( $comment->comment_ID, '', 'check-ham' ); // Status could be spam or trash, depending on the WP version and whether this change applies: // https://core.trac.wordpress.org/changeset/34726 if ( $comment->comment_approved == 'spam' || $comment->comment_approved == 'trash' ) { if ( function_exists( 'wp_check_comment_disallowed_list' ) ) { if ( wp_check_comment_disallowed_list( $comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent ) ) { self::update_comment_history( $comment->comment_ID, '', 'wp-disallowed' ); } else { self::update_comment_history( $comment->comment_ID, '', 'status-changed-' . $comment->comment_approved ); } } else { self::update_comment_history( $comment->comment_ID, '', 'status-changed-' . $comment->comment_approved ); } } } elseif ( ! isset( self::$last_comment['akismet_result'] ) ) { // akismet_result isn't set, so the comment wasn't sent to Akismet. update_comment_meta( $comment->comment_ID, 'akismet_skipped', 'true' ); $caught_by_disallowed_list = false; if ( function_exists( 'wp_check_comment_disallowed_list' ) ) { $caught_by_disallowed_list = wp_check_comment_disallowed_list( $comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent ); } if ( $caught_by_disallowed_list ) { self::update_comment_history( $comment->comment_ID, '', 'wp-disallowed' ); self::update_comment_history( $comment->comment_ID, '', 'akismet-skipped-disallowed' ); } else { // Add a generic skipped history item. self::update_comment_history( $comment->comment_ID, '', 'akismet-skipped' ); } } else { // abnormal result: error update_comment_meta( $comment->comment_ID, 'akismet_error', time() ); self::update_comment_history( $comment->comment_ID, '', 'check-error', array( 'response' => substr( self::$last_comment['akismet_result'], 0, 50 ) ) ); } // record the complete original data as submitted for checking if ( isset( self::$last_comment['comment_as_submitted'] ) ) { update_comment_meta( $comment->comment_ID, 'akismet_as_submitted', self::$last_comment['comment_as_submitted'] ); } if ( isset( self::$last_comment['akismet_pro_tip'] ) ) { update_comment_meta( $comment->comment_ID, 'akismet_pro_tip', self::$last_comment['akismet_pro_tip'] ); } if ( isset( self::$last_comment['akismet_guid'] ) ) { update_comment_meta( $comment->comment_ID, 'akismet_guid', self::$last_comment['akismet_guid'] ); } } } } public static function delete_old_comments() { global $wpdb; /** * Determines how many comments will be deleted in each batch. * * @param int The default, as defined by AKISMET_DELETE_LIMIT. */ $delete_limit = apply_filters( 'akismet_delete_comment_limit', defined( 'AKISMET_DELETE_LIMIT' ) ? AKISMET_DELETE_LIMIT : 10000 ); $delete_limit = max( 1, intval( $delete_limit ) ); /** * Determines how many days a comment will be left in the Spam queue before being deleted. * * @param int The default number of days. */ $delete_interval = apply_filters( 'akismet_delete_comment_interval', 15 ); $delete_interval = max( 1, intval( $delete_interval ) ); while ( $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_id FROM {$wpdb->comments} WHERE DATE_SUB(NOW(), INTERVAL %d DAY) > comment_date_gmt AND comment_approved = 'spam' LIMIT %d", $delete_interval, $delete_limit ) ) ) { if ( empty( $comment_ids ) ) return; $wpdb->queries = array(); $comments = array(); foreach ( $comment_ids as $comment_id ) { $comments[ $comment_id ] = get_comment( $comment_id ); do_action( 'delete_comment', $comment_id, $comments[ $comment_id ] ); do_action( 'akismet_batch_delete_count', __FUNCTION__ ); } // Prepared as strings since comment_id is an unsigned BIGINT, and using %d will constrain the value to the maximum signed BIGINT. $format_string = implode( ', ', array_fill( 0, is_countable( $comment_ids ) ? count( $comment_ids ) : 0, '%s' ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->comments} WHERE comment_id IN ( " . $format_string . " )", $comment_ids ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->commentmeta} WHERE comment_id IN ( " . $format_string . " )", $comment_ids ) ); foreach ( $comment_ids as $comment_id ) { do_action( 'deleted_comment', $comment_id, $comments[ $comment_id ] ); unset( $comments[ $comment_id ] ); } clean_comment_cache( $comment_ids ); do_action( 'akismet_delete_comment_batch', is_countable( $comment_ids ) ? count( $comment_ids ) : 0 ); } if ( apply_filters( 'akismet_optimize_table', ( mt_rand(1, 5000) == 11), $wpdb->comments ) ) // lucky number $wpdb->query("OPTIMIZE TABLE {$wpdb->comments}"); } public static function delete_old_comments_meta() { global $wpdb; $interval = apply_filters( 'akismet_delete_commentmeta_interval', 15 ); # enforce a minimum of 1 day $interval = absint( $interval ); if ( $interval < 1 ) $interval = 1; // akismet_as_submitted meta values are large, so expire them // after $interval days regardless of the comment status while ( $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT m.comment_id FROM {$wpdb->commentmeta} as m INNER JOIN {$wpdb->comments} as c USING(comment_id) WHERE m.meta_key = 'akismet_as_submitted' AND DATE_SUB(NOW(), INTERVAL %d DAY) > c.comment_date_gmt LIMIT 10000", $interval ) ) ) { if ( empty( $comment_ids ) ) return; $wpdb->queries = array(); foreach ( $comment_ids as $comment_id ) { delete_comment_meta( $comment_id, 'akismet_as_submitted' ); do_action( 'akismet_batch_delete_count', __FUNCTION__ ); } do_action( 'akismet_delete_commentmeta_batch', is_countable( $comment_ids ) ? count( $comment_ids ) : 0 ); } if ( apply_filters( 'akismet_optimize_table', ( mt_rand(1, 5000) == 11), $wpdb->commentmeta ) ) // lucky number $wpdb->query("OPTIMIZE TABLE {$wpdb->commentmeta}"); } // Clear out comments meta that no longer have corresponding comments in the database public static function delete_orphaned_commentmeta() { global $wpdb; $last_meta_id = 0; $start_time = isset( $_SERVER['REQUEST_TIME_FLOAT'] ) ? $_SERVER['REQUEST_TIME_FLOAT'] : microtime( true ); $max_exec_time = max( ini_get('max_execution_time') - 5, 3 ); while ( $commentmeta_results = $wpdb->get_results( $wpdb->prepare( "SELECT m.meta_id, m.comment_id, m.meta_key FROM {$wpdb->commentmeta} as m LEFT JOIN {$wpdb->comments} as c USING(comment_id) WHERE c.comment_id IS NULL AND m.meta_id > %d ORDER BY m.meta_id LIMIT 1000", $last_meta_id ) ) ) { if ( empty( $commentmeta_results ) ) return; $wpdb->queries = array(); $commentmeta_deleted = 0; foreach ( $commentmeta_results as $commentmeta ) { if ( 'akismet_' == substr( $commentmeta->meta_key, 0, 8 ) ) { delete_comment_meta( $commentmeta->comment_id, $commentmeta->meta_key ); do_action( 'akismet_batch_delete_count', __FUNCTION__ ); $commentmeta_deleted++; } $last_meta_id = $commentmeta->meta_id; } do_action( 'akismet_delete_commentmeta_batch', $commentmeta_deleted ); // If we're getting close to max_execution_time, quit for this round. if ( microtime(true) - $start_time > $max_exec_time ) return; } if ( apply_filters( 'akismet_optimize_table', ( mt_rand(1, 5000) == 11), $wpdb->commentmeta ) ) // lucky number $wpdb->query("OPTIMIZE TABLE {$wpdb->commentmeta}"); } // how many approved comments does this author have? public static function get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) { global $wpdb; /** * Which comment types should be ignored when counting a user's approved comments? * * Some plugins add entries to the comments table that are not actual * comments that could have been checked by Akismet. Allow these comments * to be excluded from the "approved comment count" query in order to * avoid artificially inflating the approved comment count. * * @param array $comment_types An array of comment types that won't be considered * when counting a user's approved comments. * * @since 4.2.2 */ $excluded_comment_types = apply_filters( 'akismet_excluded_comment_types', array() ); $comment_type_where = ''; if ( is_array( $excluded_comment_types ) && ! empty( $excluded_comment_types ) ) { $excluded_comment_types = array_unique( $excluded_comment_types ); foreach ( $excluded_comment_types as $excluded_comment_type ) { $comment_type_where .= $wpdb->prepare( ' AND comment_type <> %s ', $excluded_comment_type ); } } if ( ! empty( $user_id ) ) { return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE user_id = %d AND comment_approved = 1" . $comment_type_where, $user_id ) ); } if ( ! empty( $comment_author_email ) ) { return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_author_email = %s AND comment_author = %s AND comment_author_url = %s AND comment_approved = 1" . $comment_type_where, $comment_author_email, $comment_author, $comment_author_url ) ); } return 0; } /** * Get the full comment history for a given comment, as an array in reverse chronological order. * Each entry will have an 'event', a 'time', and possible a 'message' member (if the entry is old enough). * Some entries will also have a 'user' or 'meta' member. * * @param int $comment_id The relevant comment ID. * @return array|bool An array of history events, or false if there is no history. */ public static function get_comment_history( $comment_id ) { $history = get_comment_meta( $comment_id, 'akismet_history', false ); if ( empty( $history ) || empty( $history[ 0 ] ) ) { return false; } /* // To see all variants when testing. $history[] = array( 'time' => 445856401, 'message' => 'Old versions of Akismet stored the message as a literal string in the commentmeta.', 'event' => null ); $history[] = array( 'time' => 445856402, 'event' => 'recheck-spam' ); $history[] = array( 'time' => 445856403, 'event' => 'check-spam' ); $history[] = array( 'time' => 445856404, 'event' => 'recheck-ham' ); $history[] = array( 'time' => 445856405, 'event' => 'check-ham' ); $history[] = array( 'time' => 445856406, 'event' => 'wp-blacklisted' ); $history[] = array( 'time' => 445856406, 'event' => 'wp-disallowed' ); $history[] = array( 'time' => 445856407, 'event' => 'report-spam' ); $history[] = array( 'time' => 445856408, 'event' => 'report-spam', 'user' => 'sam' ); $history[] = array( 'message' => 'sam reported this comment as spam (hardcoded message).', 'time' => 445856400, 'event' => 'report-spam', 'user' => 'sam' ); $history[] = array( 'time' => 445856409, 'event' => 'report-ham', 'user' => 'sam' ); $history[] = array( 'message' => 'sam reported this comment as ham (hardcoded message).', 'time' => 445856400, 'event' => 'report-ham', 'user' => 'sam' ); // $history[] = array( 'time' => 445856410, 'event' => 'cron-retry-spam' ); $history[] = array( 'time' => 445856411, 'event' => 'cron-retry-ham' ); $history[] = array( 'time' => 445856412, 'event' => 'check-error' ); // $history[] = array( 'time' => 445856413, 'event' => 'check-error', 'meta' => array( 'response' => 'The server was taking a nap.' ) ); $history[] = array( 'time' => 445856414, 'event' => 'recheck-error' ); // Should not generate a message. $history[] = array( 'time' => 445856415, 'event' => 'recheck-error', 'meta' => array( 'response' => 'The server was taking a nap.' ) ); $history[] = array( 'time' => 445856416, 'event' => 'status-changedtrash' ); $history[] = array( 'time' => 445856417, 'event' => 'status-changedspam' ); $history[] = array( 'time' => 445856418, 'event' => 'status-changedhold' ); $history[] = array( 'time' => 445856419, 'event' => 'status-changedapprove' ); $history[] = array( 'time' => 445856420, 'event' => 'status-changed-trash' ); $history[] = array( 'time' => 445856421, 'event' => 'status-changed-spam' ); $history[] = array( 'time' => 445856422, 'event' => 'status-changed-hold' ); $history[] = array( 'time' => 445856423, 'event' => 'status-changed-approve' ); $history[] = array( 'time' => 445856424, 'event' => 'status-trash', 'user' => 'sam' ); $history[] = array( 'time' => 445856425, 'event' => 'status-spam', 'user' => 'sam' ); $history[] = array( 'time' => 445856426, 'event' => 'status-hold', 'user' => 'sam' ); $history[] = array( 'time' => 445856427, 'event' => 'status-approve', 'user' => 'sam' ); $history[] = array( 'time' => 445856427, 'event' => 'webhook-spam' ); $history[] = array( 'time' => 445856427, 'event' => 'webhook-ham' ); $history[] = array( 'time' => 445856427, 'event' => 'webhook-spam-noaction' ); $history[] = array( 'time' => 445856427, 'event' => 'webhook-ham-noaction' ); */ usort( $history, array( 'Akismet', '_cmp_time' ) ); return $history; } /** * Log an event for a given comment, storing it in comment_meta. * * @param int $comment_id The ID of the relevant comment. * @param string $message The string description of the event. No longer used. * @param string $event The event code. * @param array $meta Metadata about the history entry. e.g., the user that reported or changed the status of a given comment. */ public static function update_comment_history( $comment_id, $message, $event=null, $meta=null ) { global $current_user; $user = ''; $event = array( 'time' => self::_get_microtime(), 'event' => $event, ); if ( is_object( $current_user ) && isset( $current_user->user_login ) ) { $event['user'] = $current_user->user_login; } if ( ! empty( $meta ) ) { $event['meta'] = $meta; } // $unique = false so as to allow multiple values per comment $r = add_comment_meta( $comment_id, 'akismet_history', $event, false ); } public static function check_db_comment( $id, $recheck_reason = 'recheck_queue' ) { global $wpdb; if ( ! self::get_api_key() ) { return new WP_Error( 'akismet-not-configured', __( 'Akismet is not configured. Please enter an API key.', 'akismet' ) ); } $c = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->comments} WHERE comment_ID = %d", $id ), ARRAY_A ); if ( ! $c ) { return new WP_Error( 'invalid-comment-id', __( 'Comment not found.', 'akismet' ) ); } $c['user_ip'] = $c['comment_author_IP']; $c['user_agent'] = $c['comment_agent']; $c['referrer'] = ''; $c['blog'] = get_option( 'home' ); $c['blog_lang'] = get_locale(); $c['blog_charset'] = get_option('blog_charset'); $c['permalink'] = get_permalink($c['comment_post_ID']); $c['recheck_reason'] = $recheck_reason; $c['user_role'] = ''; if ( ! empty( $c['user_ID'] ) ) { $c['user_role'] = Akismet::get_user_roles( $c['user_ID'] ); } if ( self::is_test_mode() ) $c['is_test'] = 'true'; $c = apply_filters( 'akismet_request_args', $c, 'comment-check' ); $response = self::http_post( self::build_query( $c ), 'comment-check' ); if ( ! empty( $response[1] ) ) { return $response[1]; } return false; } public static function recheck_comment( $id, $recheck_reason = 'recheck_queue' ) { add_comment_meta( $id, 'akismet_rechecking', true ); $api_response = self::check_db_comment( $id, $recheck_reason ); if ( is_wp_error( $api_response ) ) { // Invalid comment ID. } else if ( 'true' === $api_response ) { wp_set_comment_status( $id, 'spam' ); update_comment_meta( $id, 'akismet_result', 'true' ); delete_comment_meta( $id, 'akismet_error' ); delete_comment_meta( $id, 'akismet_delayed_moderation_email' ); Akismet::update_comment_history( $id, '', 'recheck-spam' ); } elseif ( 'false' === $api_response ) { update_comment_meta( $id, 'akismet_result', 'false' ); delete_comment_meta( $id, 'akismet_error' ); delete_comment_meta( $id, 'akismet_delayed_moderation_email' ); Akismet::update_comment_history( $id, '', 'recheck-ham' ); } else { // abnormal result: error update_comment_meta( $id, 'akismet_result', 'error' ); Akismet::update_comment_history( $id, '', 'recheck-error', array( 'response' => substr( $api_response, 0, 50 ) ) ); } delete_comment_meta( $id, 'akismet_rechecking' ); return $api_response; } public static function transition_comment_status( $new_status, $old_status, $comment ) { if ( $new_status == $old_status ) return; if ( 'spam' === $new_status || 'spam' === $old_status ) { // Clear the cache of the "X comments in your spam queue" count on the dashboard. wp_cache_delete( 'akismet_spam_count', 'widget' ); } # we don't need to record a history item for deleted comments if ( $new_status == 'delete' ) return; if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) ) return; if ( defined('WP_IMPORTING') && WP_IMPORTING == true ) return; // if this is present, it means the status has been changed by a re-check, not an explicit user action if ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) ) return; if ( function_exists( 'getallheaders' ) ) { $request_headers = getallheaders(); foreach ( $request_headers as $header => $value ) { if ( strtolower( $header ) == 'x-akismet-webhook' ) { // This change is due to a webhook request. return; } } } // Assumption alert: // We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status // is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to // determine why the transition_comment_status action was triggered. And there are several different ways by which // to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others. // We'll assume that this is an explicit user action if certain POST/GET variables exist. if ( // status=spam: Marking as spam via the REST API or... // status=unspam: I'm not sure. Maybe this used to be used instead of status=approved? Or the UI for removing from spam but not approving has been since removed?... // status=approved: Unspamming via the REST API (Calypso) or... ( isset( $_POST['status'] ) && in_array( $_POST['status'], array( 'spam', 'unspam', 'approved', ) ) ) // spam=1: Clicking "Spam" underneath a comment in wp-admin and allowing the AJAX request to happen. || ( isset( $_POST['spam'] ) && (int) $_POST['spam'] == 1 ) // unspam=1: Clicking "Not Spam" underneath a comment in wp-admin and allowing the AJAX request to happen. Or, clicking "Undo" after marking something as spam. || ( isset( $_POST['unspam'] ) && (int) $_POST['unspam'] == 1 ) // comment_status=spam/unspam: It's unclear where this is happening. || ( isset( $_POST['comment_status'] ) && in_array( $_POST['comment_status'], array( 'spam', 'unspam' ) ) ) // action=spam: Choosing "Mark as Spam" from the Bulk Actions dropdown in wp-admin (or the "Spam it" link in notification emails). // action=unspam: Choosing "Not Spam" from the Bulk Actions dropdown in wp-admin. // action=spamcomment: Following the "Spam" link below a comment in wp-admin (not allowing AJAX request to happen). // action=unspamcomment: Following the "Not Spam" link below a comment in wp-admin (not allowing AJAX request to happen). || ( isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'spam', 'unspam', 'spamcomment', 'unspamcomment', ) ) ) // action=editedcomment: Editing a comment via wp-admin (and possibly changing its status). || ( isset( $_POST['action'] ) && in_array( $_POST['action'], array( 'editedcomment' ) ) ) // for=jetpack: Moderation via the WordPress app, Calypso, anything powered by the Jetpack connection. || ( isset( $_GET['for'] ) && ( 'jetpack' == $_GET['for'] ) && ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) ) // Certain WordPress.com API requests || ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST ) // WordPress.org REST API requests || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) { return self::submit_spam_comment( $comment->comment_ID ); } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { return self::submit_nonspam_comment( $comment->comment_ID ); } } self::update_comment_history( $comment->comment_ID, '', 'status-' . $new_status ); } public static function submit_spam_comment( $comment_id ) { global $wpdb, $current_user, $current_site; $comment_id = (int) $comment_id; $comment = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->comments} WHERE comment_ID = %d", $comment_id ), ARRAY_A ); if ( ! $comment ) { // it was deleted return; } if ( 'spam' != $comment['comment_approved'] ) { return; } self::update_comment_history( $comment_id, '', 'report-spam' ); // If the user hasn't configured Akismet, there's nothing else to do at this point. if ( ! self::get_api_key() ) { return; } // use the original version stored in comment_meta if available $as_submitted = self::sanitize_comment_as_submitted( get_comment_meta( $comment_id, 'akismet_as_submitted', true ) ); if ( $as_submitted && is_array( $as_submitted ) && isset( $as_submitted['comment_content'] ) ) { $comment = array_merge( $comment, $as_submitted ); } $comment['blog'] = get_option( 'home' ); $comment['blog_lang'] = get_locale(); $comment['blog_charset'] = get_option( 'blog_charset' ); $comment['permalink'] = get_permalink( $comment['comment_post_ID'] ); if ( is_object( $current_user ) ) { $comment['reporter'] = $current_user->user_login; } if ( is_object( $current_site ) ) { $comment['site_domain'] = $current_site->domain; } $comment['user_role'] = ''; if ( ! empty( $comment['user_ID'] ) ) { $comment['user_role'] = self::get_user_roles( $comment['user_ID'] ); } if ( self::is_test_mode() ) { $comment['is_test'] = 'true'; } $post = get_post( $comment['comment_post_ID'] ); if ( ! is_null( $post ) ) { $comment['comment_post_modified_gmt'] = $post->post_modified_gmt; } $comment = apply_filters( 'akismet_request_args', $comment, 'submit-spam' ); $response = self::http_post( self::build_query( $comment ), 'submit-spam' ); update_comment_meta( $comment_id, 'akismet_user_result', 'true' ); if ( $comment['reporter'] ) { update_comment_meta( $comment_id, 'akismet_user', $comment['reporter'] ); } do_action('akismet_submit_spam_comment', $comment_id, $response[1]); } public static function submit_nonspam_comment( $comment_id ) { global $wpdb, $current_user, $current_site; $comment_id = (int) $comment_id; $comment = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->comments} WHERE comment_ID = %d", $comment_id ), ARRAY_A ); if ( ! $comment ) { // it was deleted return; } self::update_comment_history( $comment_id, '', 'report-ham' ); // If the user hasn't configured Akismet, there's nothing else to do at this point. if ( ! self::get_api_key() ) { return; } // use the original version stored in comment_meta if available $as_submitted = self::sanitize_comment_as_submitted( get_comment_meta( $comment_id, 'akismet_as_submitted', true ) ); if ( $as_submitted && is_array( $as_submitted ) && isset( $as_submitted['comment_content'] ) ) { $comment = array_merge( $comment, $as_submitted ); } $comment['blog'] = get_option( 'home' ); $comment['blog_lang'] = get_locale(); $comment['blog_charset'] = get_option( 'blog_charset' ); $comment['permalink'] = get_permalink( $comment['comment_post_ID'] ); $comment['user_role'] = ''; if ( is_object( $current_user ) ) { $comment['reporter'] = $current_user->user_login; } if ( is_object( $current_site ) ) { $comment['site_domain'] = $current_site->domain; } if ( ! empty( $comment['user_ID'] ) ) { $comment['user_role'] = self::get_user_roles( $comment['user_ID'] ); } if ( self::is_test_mode() ) { $comment['is_test'] = 'true'; } $post = get_post( $comment['comment_post_ID'] ); if ( ! is_null( $post ) ) { $comment['comment_post_modified_gmt'] = $post->post_modified_gmt; } $comment = apply_filters( 'akismet_request_args', $comment, 'submit-ham' ); $response = self::http_post( self::build_query( $comment ), 'submit-ham' ); update_comment_meta( $comment_id, 'akismet_user_result', 'false' ); if ( $comment['reporter'] ) { update_comment_meta( $comment_id, 'akismet_user', $comment['reporter'] ); } do_action('akismet_submit_nonspam_comment', $comment_id, $response[1]); } public static function cron_recheck() { global $wpdb; $api_key = self::get_api_key(); $status = self::verify_key( $api_key ); if ( get_option( 'akismet_alert_code' ) || $status == 'invalid' ) { // since there is currently a problem with the key, reschedule a check for 6 hours hence wp_schedule_single_event( time() + 21600, 'akismet_schedule_cron_recheck' ); do_action( 'akismet_scheduled_recheck', 'key-problem-' . get_option( 'akismet_alert_code' ) . '-' . $status ); return false; } delete_option('akismet_available_servers'); $comment_errors = $wpdb->get_col( "SELECT comment_id FROM {$wpdb->commentmeta} WHERE meta_key = 'akismet_error' LIMIT 100" ); load_plugin_textdomain( 'akismet' ); foreach ( (array) $comment_errors as $comment_id ) { // if the comment no longer exists, or is too old, remove the meta entry from the queue to avoid getting stuck $comment = get_comment( $comment_id ); if ( ! $comment // Comment has been deleted || strtotime( $comment->comment_date_gmt ) < strtotime( "-15 days" ) // Comment is too old. || $comment->comment_approved !== "0" // Comment is no longer in the Pending queue ) { delete_comment_meta( $comment_id, 'akismet_error' ); delete_comment_meta( $comment_id, 'akismet_delayed_moderation_email' ); continue; } add_comment_meta( $comment_id, 'akismet_rechecking', true ); $status = self::check_db_comment( $comment_id, 'retry' ); $event = ''; if ( $status == 'true' ) { $event = 'cron-retry-spam'; } elseif ( $status == 'false' ) { $event = 'cron-retry-ham'; } // If we got back a legit response then update the comment history // other wise just bail now and try again later. No point in // re-trying all the comments once we hit one failure. if ( !empty( $event ) ) { delete_comment_meta( $comment_id, 'akismet_error' ); self::update_comment_history( $comment_id, '', $event ); update_comment_meta( $comment_id, 'akismet_result', $status ); // make sure the comment status is still pending. if it isn't, that means the user has already moved it elsewhere. $comment = get_comment( $comment_id ); if ( $comment && 'unapproved' == wp_get_comment_status( $comment_id ) ) { if ( $status == 'true' ) { wp_spam_comment( $comment_id ); } elseif ( $status == 'false' ) { // comment is good, but it's still in the pending queue. depending on the moderation settings // we may need to change it to approved. if ( check_comment($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent, $comment->comment_type) ) wp_set_comment_status( $comment_id, 1 ); else if ( get_comment_meta( $comment_id, 'akismet_delayed_moderation_email', true ) ) wp_notify_moderator( $comment_id ); } } delete_comment_meta( $comment_id, 'akismet_delayed_moderation_email' ); } else { // If this comment has been pending moderation for longer than MAX_DELAY_BEFORE_MODERATION_EMAIL, // send a moderation email now. if ( ( intval( gmdate( 'U' ) ) - strtotime( $comment->comment_date_gmt ) ) < self::MAX_DELAY_BEFORE_MODERATION_EMAIL ) { delete_comment_meta( $comment_id, 'akismet_delayed_moderation_email' ); wp_notify_moderator( $comment_id ); } delete_comment_meta( $comment_id, 'akismet_rechecking' ); wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); do_action( 'akismet_scheduled_recheck', 'check-db-comment-' . $status ); return; } delete_comment_meta( $comment_id, 'akismet_rechecking' ); } $remaining = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->commentmeta} WHERE meta_key = 'akismet_error'" ); if ( $remaining && !wp_next_scheduled('akismet_schedule_cron_recheck') ) { wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); do_action( 'akismet_scheduled_recheck', 'remaining' ); } } public static function fix_scheduled_recheck() { $future_check = wp_next_scheduled( 'akismet_schedule_cron_recheck' ); if ( !$future_check ) { return; } if ( get_option( 'akismet_alert_code' ) > 0 ) { return; } $check_range = time() + 1200; if ( $future_check > $check_range ) { wp_clear_scheduled_hook( 'akismet_schedule_cron_recheck' ); wp_schedule_single_event( time() + 300, 'akismet_schedule_cron_recheck' ); do_action( 'akismet_scheduled_recheck', 'fix-scheduled-recheck' ); } } public static function add_comment_nonce( $post_id ) { /** * To disable the Akismet comment nonce, add a filter for the 'akismet_comment_nonce' tag * and return any string value that is not 'true' or '' (empty string). * * Don't return boolean false, because that implies that the 'akismet_comment_nonce' option * has not been set and that Akismet should just choose the default behavior for that * situation. */ if ( ! self::get_api_key() ) { return; } $akismet_comment_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); if ( $akismet_comment_nonce_option == 'true' || $akismet_comment_nonce_option == '' ) { echo '

'; wp_nonce_field( 'akismet_comment_nonce_' . $post_id, 'akismet_comment_nonce', FALSE ); echo '

'; } } public static function is_test_mode() { return defined('AKISMET_TEST_MODE') && AKISMET_TEST_MODE; } public static function allow_discard() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) return false; if ( is_user_logged_in() ) return false; return ( get_option( 'akismet_strictness' ) === '1' ); } public static function get_ip_address() { return isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : null; } /** * Do these two comments, without checking the comment_ID, "match"? * * @param mixed $comment1 A comment object or array. * @param mixed $comment2 A comment object or array. * @return bool Whether the two comments should be treated as the same comment. */ private static function comments_match( $comment1, $comment2 ) { $comment1 = (array) $comment1; $comment2 = (array) $comment2; // Set default values for these strings that we check in order to simplify // the checks and avoid PHP warnings. if ( ! isset( $comment1['comment_author'] ) ) { $comment1['comment_author'] = ''; } if ( ! isset( $comment2['comment_author'] ) ) { $comment2['comment_author'] = ''; } if ( ! isset( $comment1['comment_author_email'] ) ) { $comment1['comment_author_email'] = ''; } if ( ! isset( $comment2['comment_author_email'] ) ) { $comment2['comment_author_email'] = ''; } $comments_match = ( isset( $comment1['comment_post_ID'], $comment2['comment_post_ID'] ) && intval( $comment1['comment_post_ID'] ) == intval( $comment2['comment_post_ID'] ) && ( // The comment author length max is 255 characters, limited by the TINYTEXT column type. // If the comment author includes multibyte characters right around the 255-byte mark, they // may be stripped when the author is saved in the DB, so a 300+ char author may turn into // a 253-char author when it's saved, not 255 exactly. The longest possible character is // theoretically 6 bytes, so we'll only look at the first 248 bytes to be safe. substr( $comment1['comment_author'], 0, 248 ) == substr( $comment2['comment_author'], 0, 248 ) || substr( stripslashes( $comment1['comment_author'] ), 0, 248 ) == substr( $comment2['comment_author'], 0, 248 ) || substr( $comment1['comment_author'], 0, 248 ) == substr( stripslashes( $comment2['comment_author'] ), 0, 248 ) // Certain long comment author names will be truncated to nothing, depending on their encoding. || ( ! $comment1['comment_author'] && strlen( $comment2['comment_author'] ) > 248 ) || ( ! $comment2['comment_author'] && strlen( $comment1['comment_author'] ) > 248 ) ) && ( // The email max length is 100 characters, limited by the VARCHAR(100) column type. // Same argument as above for only looking at the first 93 characters. substr( $comment1['comment_author_email'], 0, 93 ) == substr( $comment2['comment_author_email'], 0, 93 ) || substr( stripslashes( $comment1['comment_author_email'] ), 0, 93 ) == substr( $comment2['comment_author_email'], 0, 93 ) || substr( $comment1['comment_author_email'], 0, 93 ) == substr( stripslashes( $comment2['comment_author_email'] ), 0, 93 ) // Very long emails can be truncated and then stripped if the [0:100] substring isn't a valid address. || ( ! $comment1['comment_author_email'] && strlen( $comment2['comment_author_email'] ) > 100 ) || ( ! $comment2['comment_author_email'] && strlen( $comment1['comment_author_email'] ) > 100 ) ) ); return $comments_match; } // Does the supplied comment match the details of the one most recently stored in self::$last_comment? public static function matches_last_comment( $comment ) { return self::comments_match( self::$last_comment, $comment ); } private static function get_user_agent() { return isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : null; } private static function get_referer() { return isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : null; } // return a comma-separated list of role names for the given user public static function get_user_roles( $user_id ) { $comment_user = null; $roles = false; if ( !class_exists('WP_User') ) return false; if ( $user_id > 0 ) { $comment_user = new WP_User( $user_id ); if ( isset( $comment_user->roles ) ) $roles = implode( ',', $comment_user->roles ); } if ( is_multisite() && is_super_admin( $user_id ) ) { if ( empty( $roles ) ) { $roles = 'super_admin'; } else { $comment_user->roles[] = 'super_admin'; $roles = implode( ',', $comment_user->roles ); } } return $roles; } // filter handler used to return a spam result to pre_comment_approved public static function last_comment_status( $approved, $comment ) { if ( is_null( self::$last_comment_result ) ) { // We didn't have reason to store the result of the last check. return $approved; } // Only do this if it's the correct comment if ( ! self::matches_last_comment( $comment ) ) { self::log( "comment_is_spam mismatched comment, returning unaltered $approved" ); return $approved; } if ( 'trash' === $approved ) { // If the last comment we checked has had its approval set to 'trash', // then it failed the comment blacklist check. Let that blacklist override // the spam check, since users have the (valid) expectation that when // they fill out their blacklists, comments that match it will always // end up in the trash. return $approved; } // bump the counter here instead of when the filter is added to reduce the possibility of overcounting if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); return self::$last_comment_result; } /** * If Akismet is temporarily unreachable, we don't want to "spam" the blogger with * moderation emails for comments that will be automatically cleared or spammed on * the next retry. * * For comments that will be rechecked later, empty the list of email addresses that * the moderation email would be sent to. * * @param array $emails An array of email addresses that the moderation email will be sent to. * @param int $comment_id The ID of the relevant comment. * @return array An array of email addresses that the moderation email will be sent to. */ public static function disable_moderation_emails_if_unreachable( $emails, $comment_id ) { if ( ! empty( self::$prevent_moderation_email_for_these_comments ) && ! empty( $emails ) ) { $comment = get_comment( $comment_id ); if ( $comment ) { foreach ( self::$prevent_moderation_email_for_these_comments as $possible_match ) { if ( self::comments_match( $possible_match, $comment ) ) { update_comment_meta( $comment_id, 'akismet_delayed_moderation_email', true ); return array(); } } } } return $emails; } public static function _cmp_time( $a, $b ) { return $a['time'] > $b['time'] ? -1 : 1; } public static function _get_microtime() { $mtime = explode( ' ', microtime() ); return $mtime[1] + $mtime[0]; } /** * Make a POST request to the Akismet API. * * @param string $request The body of the request. * @param string $path The path for the request. * @param string $ip The specific IP address to hit. * @return array A two-member array consisting of the headers and the response body, both empty in the case of a failure. */ public static function http_post( $request, $path, $ip=null ) { $akismet_ua = sprintf( 'WordPress/%s | Akismet/%s', $GLOBALS['wp_version'], constant( 'AKISMET_VERSION' ) ); $akismet_ua = apply_filters( 'akismet_ua', $akismet_ua ); $host = self::API_HOST; $api_key = self::get_api_key(); if ( $api_key ) { $request = add_query_arg( 'api_key', $api_key, $request ); } $http_host = $host; // use a specific IP if provided // needed by Akismet_Admin::check_server_connectivity() if ( $ip && long2ip( ip2long( $ip ) ) ) { $http_host = $ip; } $http_args = array( 'body' => $request, 'headers' => array( 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option( 'blog_charset' ), 'Host' => $host, 'User-Agent' => $akismet_ua, ), 'httpversion' => '1.0', 'timeout' => 15 ); $akismet_url = $http_akismet_url = "http://{$http_host}/1.1/{$path}"; /** * Try SSL first; if that fails, try without it and don't try it again for a while. */ $ssl = $ssl_failed = false; // Check if SSL requests were disabled fewer than X hours ago. $ssl_disabled = get_option( 'akismet_ssl_disabled' ); if ( $ssl_disabled && $ssl_disabled < ( time() - 60 * 60 * 24 ) ) { // 24 hours $ssl_disabled = false; delete_option( 'akismet_ssl_disabled' ); } else if ( $ssl_disabled ) { do_action( 'akismet_ssl_disabled' ); } if ( ! $ssl_disabled && ( $ssl = wp_http_supports( array( 'ssl' ) ) ) ) { $akismet_url = set_url_scheme( $akismet_url, 'https' ); do_action( 'akismet_https_request_pre' ); } $response = wp_remote_post( $akismet_url, $http_args ); Akismet::log( compact( 'akismet_url', 'http_args', 'response' ) ); if ( $ssl && is_wp_error( $response ) ) { do_action( 'akismet_https_request_failure', $response ); // Intermittent connection problems may cause the first HTTPS // request to fail and subsequent HTTP requests to succeed randomly. // Retry the HTTPS request once before disabling SSL for a time. $response = wp_remote_post( $akismet_url, $http_args ); Akismet::log( compact( 'akismet_url', 'http_args', 'response' ) ); if ( is_wp_error( $response ) ) { $ssl_failed = true; do_action( 'akismet_https_request_failure', $response ); do_action( 'akismet_http_request_pre' ); // Try the request again without SSL. $response = wp_remote_post( $http_akismet_url, $http_args ); Akismet::log( compact( 'http_akismet_url', 'http_args', 'response' ) ); } } if ( is_wp_error( $response ) ) { do_action( 'akismet_request_failure', $response ); return array( '', '' ); } if ( $ssl_failed ) { // The request failed when using SSL but succeeded without it. Disable SSL for future requests. update_option( 'akismet_ssl_disabled', time() ); do_action( 'akismet_https_disabled' ); } $simplified_response = array( $response['headers'], $response['body'] ); $alert_code_check_paths = array( 'verify-key', 'comment-check', 'get-stats', ); if ( in_array( $path, $alert_code_check_paths ) ) { self::update_alert( $simplified_response ); } return $simplified_response; } // given a response from an API call like check_key_status(), update the alert code options if an alert is present. public static function update_alert( $response ) { $alert_option_prefix = 'akismet_alert_'; $alert_header_prefix = 'x-akismet-alert-'; $alert_header_names = array( 'code', 'msg', 'api-calls', 'usage-limit', 'upgrade-plan', 'upgrade-url', 'upgrade-type', 'upgrade-via-support', ); foreach ( $alert_header_names as $alert_header_name ) { $value = null; if ( isset( $response[0][ $alert_header_prefix . $alert_header_name ] ) ) { $value = $response[0][ $alert_header_prefix . $alert_header_name ]; } $option_name = $alert_option_prefix . str_replace( '-', '_', $alert_header_name ); if ( $value != get_option( $option_name ) ) { if ( ! $value ) { delete_option( $option_name ); } else { update_option( $option_name, $value ); } } } } /** * Mark akismet-frontend.js as deferred. Because nothing depends on it, it can run at any time * after it's loaded, and the browser won't have to wait for it to load to continue * parsing the rest of the page. */ public static function set_form_js_async( $tag, $handle, $src ) { if ( 'akismet-frontend' !== $handle ) { return $tag; } return preg_replace( '/^'; } $fields .= '

'; return $fields; } public static function output_custom_form_fields( $post_id ) { if ( 'fluentform/form_element_start' === current_filter() && did_action( 'fluentform_form_element_start' ) ) { // Already did this via the legacy filter. return; } // phpcs:ignore WordPress.Security.EscapeOutput echo self::get_akismet_form_fields(); } public static function inject_custom_form_fields( $html ) { $html = str_replace( '', self::get_akismet_form_fields() . '', $html ); return $html; } public static function append_custom_form_fields( $html ) { $html .= self::get_akismet_form_fields(); return $html; } /** * Ensure that any Akismet-added form fields are included in the comment-check call. * * @param array $form * @param array $data Some plugins will supply the POST data via the filter, since they don't * read it directly from $_POST. * @return array $form */ public static function prepare_custom_form_values( $form, $data = null ) { if ( 'fluentform/akismet_fields' === current_filter() && did_filter( 'fluentform_akismet_fields' ) ) { // Already updated the form fields via the legacy filter. return $form; } if ( is_null( $data ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing $data = $_POST; } $prefix = 'ak_'; // Contact Form 7 uses _wpcf7 as a prefix to know which fields to exclude from comment_content. if ( 'wpcf7_akismet_parameters' === current_filter() ) { $prefix = '_wpcf7_ak_'; } foreach ( $data as $key => $val ) { if ( 0 === strpos( $key, $prefix ) ) { $form[ 'POST_ak_' . substr( $key, strlen( $prefix ) ) ] = $val; } } return $form; } private static function bail_on_activation( $message, $deactivate = true ) { ?>

$plugin ) { if ( $plugin === $akismet ) { $plugins[$i] = false; $update = true; } } if ( $update ) { update_option( 'active_plugins', array_filter( $plugins ) ); } } exit; } public static function view( $name, array $args = array() ) { $args = apply_filters( 'akismet_view_arguments', $args, $name ); foreach ( $args as $key => $val ) { $$key = $val; } load_plugin_textdomain( 'akismet' ); $file = AKISMET__PLUGIN_DIR . 'views/'. $name . '.php'; include( $file ); } /** * Attached to activate_{ plugin_basename( __FILES__ ) } by register_activation_hook() * @static */ public static function plugin_activation() { if ( version_compare( $GLOBALS['wp_version'], AKISMET__MINIMUM_WP_VERSION, '<' ) ) { load_plugin_textdomain( 'akismet' ); $message = ''.sprintf(esc_html__( 'Akismet %s requires WordPress %s or higher.' , 'akismet'), AKISMET_VERSION, AKISMET__MINIMUM_WP_VERSION ).' '.sprintf(__('Please upgrade WordPress to a current version, or downgrade to version 2.4 of the Akismet plugin.', 'akismet'), 'https://codex.wordpress.org/Upgrading_WordPress', 'https://wordpress.org/extend/plugins/akismet/download/'); Akismet::bail_on_activation( $message ); } elseif ( ! empty( $_SERVER['SCRIPT_NAME'] ) && false !== strpos( $_SERVER['SCRIPT_NAME'], '/wp-admin/plugins.php' ) ) { add_option( 'Activated_Akismet', true ); } } /** * Removes all connection options * @static */ public static function plugin_deactivation( ) { self::deactivate_key( self::get_api_key() ); // Remove any scheduled cron jobs. $akismet_cron_events = array( 'akismet_schedule_cron_recheck', 'akismet_scheduled_delete', ); foreach ( $akismet_cron_events as $akismet_cron_event ) { $timestamp = wp_next_scheduled( $akismet_cron_event ); if ( $timestamp ) { wp_unschedule_event( $timestamp, $akismet_cron_event ); } } } /** * Essentially a copy of WP's build_query but one that doesn't expect pre-urlencoded values. * * @param array $args An array of key => value pairs * @return string A string ready for use as a URL query string. */ public static function build_query( $args ) { return _http_build_query( $args, '', '&' ); } /** * Log debugging info to the error log. * * Enabled when WP_DEBUG_LOG is enabled (and WP_DEBUG, since according to * core, "WP_DEBUG_DISPLAY and WP_DEBUG_LOG perform no function unless * WP_DEBUG is true), but can be disabled via the akismet_debug_log filter. * * @param mixed $akismet_debug The data to log. */ public static function log( $akismet_debug ) { if ( apply_filters( 'akismet_debug_log', defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG && defined( 'AKISMET_DEBUG' ) && AKISMET_DEBUG ) ) { error_log( print_r( compact( 'akismet_debug' ), true ) ); } } /** * Check pingbacks for spam before they're saved to the DB. * * @param string $method The XML-RPC method that was called. * @param array $args This and the $server arg are marked as optional since plugins might still be * calling do_action( 'xmlrpc_action', [...] ) without the arguments that were added in WP 5.7. * @param wp_xmlrpc_server $server */ public static function pre_check_pingback( $method, $args = array(), $server = null ) { if ( $method !== 'pingback.ping' ) { return; } /* * $args looks like this: * * Array * ( * [0] => http://www.example.net/?p=1 // Site that created the pingback. * [1] => https://www.example.com/?p=2 // Post being pingback'd on this site. * ) */ if ( ! is_null( $server ) && ! empty( $args[1] ) ) { $is_multicall = false; $multicall_count = 0; if ( 'system.multicall' === $server->message->methodName ) { $is_multicall = true; $multicall_count = is_countable( $server->message->params ) ? count( $server->message->params ) : 0; } $post_id = url_to_postid( $args[1] ); // If pingbacks aren't open on this post, we'll still check whether this request is part of a potential DDOS, // but indicate to the server that pingbacks are indeed closed so we don't include this request in the user's stats, // since the user has already done their part by disabling pingbacks. $pingbacks_closed = false; $post = get_post( $post_id ); if ( ! $post || ! pings_open( $post ) ) { $pingbacks_closed = true; } $comment = array( 'comment_author_url' => $args[0], 'comment_post_ID' => $post_id, 'comment_author' => '', 'comment_author_email' => '', 'comment_content' => '', 'comment_type' => 'pingback', 'akismet_pre_check' => '1', 'comment_pingback_target' => $args[1], 'pingbacks_closed' => $pingbacks_closed ? '1' : '0', 'is_multicall' => $is_multicall, 'multicall_count' => $multicall_count, ); $comment = self::auto_check_comment( $comment, 'xml-rpc' ); if ( isset( $comment['akismet_result'] ) && 'true' == $comment['akismet_result'] ) { // Sad: tightly coupled with the IXR classes. Unfortunately the action provides no context and no way to return anything. $server->error( new IXR_Error( 0, 'Invalid discovery target' ) ); // Also note that if this was part of a multicall, a spam result will prevent the subsequent calls from being executed. // This is probably fine, but it raises the bar for what should be acceptable as a false positive. } } } /** * Ensure that we are loading expected scalar values from akismet_as_submitted commentmeta. * * @param mixed $meta_value * @return mixed */ private static function sanitize_comment_as_submitted( $meta_value ) { if ( empty( $meta_value ) ) { return $meta_value; } $meta_value = (array) $meta_value; foreach ( $meta_value as $key => $value ) { if ( ! is_scalar( $value ) ) { unset( $meta_value[ $key ] ); } else { // These can change, so they're not explicitly listed in comment_as_submitted_allowed_keys. if ( strpos( $key, 'POST_ak_' ) === 0 ) { continue; } if ( ! isset( self::$comment_as_submitted_allowed_keys[ $key ] ) ) { unset( $meta_value[ $key ] ); } } } return $meta_value; } public static function predefined_api_key() { if ( defined( 'WPCOM_API_KEY' ) ) { return true; } return apply_filters( 'akismet_predefined_api_key', false ); } /** * Controls the display of a privacy related notice underneath the comment form using the `akismet_comment_form_privacy_notice` option and filter respectively. * Default is top not display the notice, leaving the choice to site admins, or integrators. */ public static function display_comment_form_privacy_notice() { if ( 'display' !== apply_filters( 'akismet_comment_form_privacy_notice', get_option( 'akismet_comment_form_privacy_notice', 'hide' ) ) ) { return; } echo apply_filters( 'akismet_comment_form_privacy_notice_markup', '

' . sprintf( __( 'This site uses Akismet to reduce spam. Learn how your comment data is processed.', 'akismet' ), 'https://akismet.com/privacy/' ) . '

' ); } public static function load_form_js() { if ( ! is_admin() && ( ! function_exists( 'amp_is_request' ) || ! amp_is_request() ) && self::get_api_key() ) { wp_register_script( 'akismet-frontend', plugin_dir_url( __FILE__ ) . '_inc/akismet-frontend.js', array(), filemtime( plugin_dir_path( __FILE__ ) . '_inc/akismet-frontend.js' ), true ); wp_enqueue_script( 'akismet-frontend' ); } } /** * Add the form JavaScript when we detect that a supported form shortcode is being parsed. */ public static function load_form_js_via_filter( $return_value, $tag, $attr, $m ) { if ( in_array( $tag, array( 'contact-form', 'gravityform', 'contact-form-7', 'formidable', 'fluentform' ) ) ) { self::load_form_js(); } return $return_value; } /** * Was the last entry in the comment history created by Akismet? * * @param int $comment_id The ID of the comment. * @return bool */ public static function last_comment_status_change_came_from_akismet( $comment_id ) { $history = self::get_comment_history( $comment_id ); if ( empty( $history ) ) { return false; } $most_recent_history_event = $history[0]; if ( ! isset( $most_recent_history_event['event'] ) ) { return false; } $akismet_history_events = array( 'check-error', 'cron-retry-ham', 'cron-retry-spam', 'check-ham', 'check-spam', 'recheck-error', 'recheck-ham', 'recheck-spam', 'webhook-ham', 'webhook-spam', ); if ( in_array( $most_recent_history_event['event'], $akismet_history_events ) ) { return true; } return false; } } PKwL\)Y}}akismet/views/title.phpnu[

PKwL\d!akismet/views/connect-jp.phpnu[

status, array( 'no-sub', 'missing' ) ) ) { ?>

user_email, null, null, null, array( 'class' => 'akismet-jetpack-gravatar' ) ); ?>

' . esc_html( $akismet_user->user_login ) . '' ); ?>
user_email ); ?>

status == 'cancelled' ) { ?>

user_email, null, null, null, array( 'class' => 'akismet-jetpack-gravatar' ) ); ?>

user_email ) ); ?>
user_email ); ?>

status == 'suspended' ) { ?>

user_email ) ); ?>

user_email, null, null, null, array( 'class' => 'akismet-jetpack-gravatar' ) ); ?>

' . esc_html( $akismet_user->user_login ) . '' ); ?>
user_email ); ?>


PKwL\Sc66akismet/views/notice.phpnu[ array( 'href' => true, 'target' => true, ), ); $kses_allow_strong = array( 'strong' => true ); if ( ! isset( $type ) ) { $type = false; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited } /* * Some notices (plugin, spam-check, spam-check-cron-disabled, alert and usage-limit) are also shown elsewhere in wp-admin, so have different classes applied so that they match the standard WordPress notice format. */ ?>
A
Almost done - configure Akismet and say goodbye to spam', 'akismet' ), $kses_allow_strong ); ?>

https://akismet.com/errors/' . esc_attr( $code ) . '' ); ?>

gethostbynamel function. Akismet cannot work correctly until this is fixed. Please contact your web host or firewall administrator and give them this information about Akismet’s system requirements.', 'akismet' ), esc_url( 'https://akismet.com/akismet-hosting-faq/' ) ), array_merge( $kses_allow_link, $kses_allow_strong, array( 'code' => true ) ) ); ?>

our guide about firewalls.', 'akismet' ), esc_url( 'https://akismet.com/akismet-hosting-faq/' ) ), $kses_allow_link ); ?>

update your payment details.', 'akismet' ), esc_url( 'https://akismet.com/account/' ) ), $kses_allow_link ); ?>

Akismet account page to reactivate your subscription.', 'akismet' ), esc_url( 'https://akismet.com/account/' ) ), $kses_allow_link ); ?>

Akismet support for assistance.', 'akismet' ), esc_url( 'https://akismet.com/contact/' ) ), $kses_allow_link ); ?>

contributing a token amount.', 'akismet' ), esc_url( 'https://akismet.com/pricing' ) ), $kses_allow_link ); ?>

Akismet support for assistance.', 'akismet' ), esc_url( 'https://akismet.com/contact/' ) ), $kses_allow_link ); ?>

choose a plan to get started with Akismet.', 'akismet' ), esc_url( 'https://akismet.com/pricing' ) ), $kses_allow_link ); ?>

get_var( "SELECT comment_ID FROM {$wpdb->comments} WHERE comment_approved = '0' LIMIT 1" ); if ( $at_least_one_comment_in_moderation ) { $check_pending_link = 'edit-comments.php?akismet_recheck=' . wp_create_nonce( 'akismet_recheck' ); } ?>

check pending comments?', 'akismet' ), esc_url( $check_pending_link ) ), $kses_allow_link ); ?>

contact Akismet support.', 'akismet' ), 'https://akismet.com/contact/' ), $kses_allow_link ); ?>

our guide about firewalls and check your server configuration.', 'akismet' ), 'https://blog.akismet.com/akismet-hosting-faq/' ), $kses_allow_link ); ?>

'; echo esc_html( __( 'Learn more about usage limits.', 'akismet' ) ); echo ''; break; case 'SECOND_MONTH_OVER_LIMIT': echo esc_html( __( 'Your Akismet usage has been over your plan’s limit for two consecutive months. Next month, we will restrict your account after you reach the limit. Please consider upgrading your plan.', 'akismet' ) ); echo ' '; echo ''; echo esc_html( __( 'Learn more about usage limits.', 'akismet' ) ); echo ''; break; case 'THIRD_MONTH_APPROACHING_LIMIT': echo esc_html( __( 'Your Akismet usage is nearing your plan’s limit for the third consecutive month. We will restrict your account after you reach the limit. Upgrade your plan so Akismet can continue blocking spam.', 'akismet' ) ); echo ' '; echo ''; echo esc_html( __( 'Learn more about usage limits.', 'akismet' ) ); echo ''; break; case 'THIRD_MONTH_OVER_LIMIT': case 'FOUR_PLUS_MONTHS_OVER_LIMIT': echo esc_html( __( 'Your Akismet usage has been over your plan’s limit for three consecutive months. We have restricted your account for the rest of the month. Upgrade your plan so Akismet can continue blocking spam.', 'akismet' ) ); echo ' '; echo ''; echo esc_html( __( 'Learn more about usage limits.', 'akismet' ) ); echo ''; break; default: } ?>

PKwL\6;;akismet/views/config.phpnu[ array( 'href' => true, ), ); ?>
$name ) ) ); ?>
  • spam ); ?> spam, 'akismet' ) ); ?>
  • spam ); ?> spam, 'akismet' ) ); ?>
  • accuracy ); ?>% missed_spam, 'akismet' ), number_format( $stat_totals['all']->missed_spam ) ) ) . ', '; /* translators: %s: number of false positive spam flagged by Akismet */ echo esc_html( sprintf( _n( '%s false positive', '%s false positives', $stat_totals['all']->false_positives, 'akismet' ), number_format( $stat_totals['all']->false_positives ) ) ); ?>

%s', esc_url( admin_url( 'edit-comments.php?comment_status=spam' ) ), esc_html__( 'spam folder', 'akismet' ) ); // The _n() needs to be on one line so the i18n tooling can extract the translator comment. /* translators: %1$s: spam folder link, %2$d: delete interval in days */ $delete_message = _n( 'Spam in the %1$s older than %2$d day is deleted automatically.', 'Spam in the %1$s older than %2$d days is deleted automatically.', $delete_interval, 'akismet' ); printf( wp_kses( $delete_message, $kses_allow_link_href ), wp_kses( $spam_folder_link, $kses_allow_link_href ), esc_html( $delete_interval ) ); ?>

next_billing_date ) : ?>
status === 'active' ) : ?>
( $akismet_user->account_type === 'free-api-key' && $akismet_user->status === 'active' ? __( 'Upgrade', 'akismet' ) : __( 'Change', 'akismet' ) ), 'redirect' => 'upgrade', ) ); ?>
PKwL\}Ό//akismet/views/stats.phpnu[
true ) ); ?>
PKwL\Hnakismet/views/logo.phpnu[ PKwL\{xakismet/views/activate.phpnu[

PKwL\?U!akismet/views/get.phpnu[ 0 ) { $submit_classes_attr = implode( ' ', $classes ); } ?>
PKwL\=X>>akismet/views/setup.phpnu[

__( 'Choose an Akismet plan', 'akismet' ), 'classes' => array( 'akismet-button', 'akismet-is-primary' ) ) ); ?>
PKwL\w)N>>akismet/views/predefined.phpnu[

wp-config.php' ); ?>

PKwL\ gsakismet/views/enter.phpnu[

PKwL\.,00akismet/views/start.phpnu[
status, array( 'active', 'active-dunning', 'no-sub', 'missing', 'cancelled', 'suspended' ) ) ) { Akismet::view( 'connect-jp', compact( 'akismet_user' ) ); } else { Akismet::view( 'activate' ); } ?>
PKwL\00 akismet/_inc/rtl/akismet-rtl.cssnu[/* This file was automatically generated on Aug 25 2023 03:41:43 */ .wp-admin.jetpack_page_akismet-key-config, .wp-admin.settings_page_akismet-key-config { background-color:#f3f6f8; } #submitted-on { position: relative; } #the-comment-list .author .akismet-user-comment-count { display: inline; } #the-comment-list .author a span { text-decoration: none; color: #999; } #the-comment-list .author a span.akismet-span-link { text-decoration: inherit; color: inherit; } #the-comment-list .akismet_remove_url { margin-right: 3px; color: #999; padding: 2px 0 2px 3px; } #the-comment-list .akismet_remove_url:hover { color: #A7301F; font-weight: bold; padding: 2px 0 2px 2px; } #dashboard_recent_comments .akismet-status { display: none; } .akismet-status { float: left; } .akismet-status a { color: #AAA; font-style: italic; } table.comments td.comment p a { text-decoration: underline; } table.comments td.comment p a:after { content: attr(href); color: #aaa; display: inline-block; /* Show the URL without the link's underline extending under it. */ padding: 0 1ex; /* Because it's inline block, we can't just use spaces in the content: attribute to separate it from the link text. */ } .mshot-arrow { width: 0; height: 0; border-top: 10px solid transparent; border-bottom: 10px solid transparent; border-left: 10px solid #5C5C5C; position: absolute; right: -6px; top: 91px; } .mshot-container { background: #5C5C5C; position: absolute; top: -94px; padding: 7px; width: 450px; height: 338px; z-index: 20000; -moz-border-radius: 6px; border-radius: 6px; -webkit-border-radius: 6px; } .akismet-mshot { position: absolute; z-index: 100; } .akismet-mshot .mshot-image { margin: 0; height: 338px; width: 450px; } .checkforspam { display: inline-block !important; } .checkforspam-spinner { display: inline-block; margin-top: 7px; } .akismet-right { float: left; } .akismet-card .akismet-right { margin: 1em 0; } .akismet-alert-text { color: #dd3d36; font-weight: bold; font-size: 120%; margin-top: .5rem; } .akismet-new-snapshot { margin-top: 1em; text-align: center; background: #fff; } .akismet-new-snapshot h3 { background: #f5f5f5; color: #888; font-size: 11px; margin: 0; } .akismet-new-snapshot ul li { color: #999; font-size: 11px; text-transform: uppercase; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -ms-box-sizing: border-box; } .akismet-new-snapshot__number { display: block; font-size: 32px; font-weight: lighter; line-height: 1.5em; } .akismet-settings th:first-child { vertical-align: top; padding-top: 15px; } .akismet-settings th.akismet-api-key { vertical-align: middle; padding-top: 0; } .akismet-settings span.akismet-note{ float: right; padding-right: 23px; font-size: 75%; margin-top: -10px; } /** * For the activation notice on the plugins page. */ #akismet_setup_prompt { background: none; border: none; margin: 0; padding: 0; width: 100%; } .akismet_activate { border: 1px solid #4F800D; padding: 5px; margin: 15px 0; background: #83AF24; background-image: -webkit-gradient(linear, 0% 0, 80% 100%, from(#83AF24), to(#4F800D)); background-image: -moz-linear-gradient(-80% 100% 120deg, #4F800D, #83AF24); -moz-border-radius: 3px; border-radius: 3px; -webkit-border-radius: 3px; position: relative; overflow: hidden; } .akismet_activate .aa_a { position: absolute; top: -5px; left: 10px; font-size: 140px; color: #769F33; font-family: Georgia, "Times New Roman", Times, serif; } .akismet_activate .aa_button { font-weight: bold; border: 1px solid #029DD6; border-top: 1px solid #06B9FD; font-size: 15px; text-align: center; padding: 9px 0 8px 0; color: #FFF; background: #029DD6; background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1)); background-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6); -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; width: 100%; cursor: pointer; margin: 0; } .akismet_activate .aa_button:hover { text-decoration: none !important; border: 1px solid #029DD6; border-bottom: 1px solid #00A8EF; font-size: 15px; text-align: center; padding: 9px 0 8px 0; color: #F0F8FB; background: #0079B1; background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#0079B1), to(#0092BF)); background-image: -moz-linear-gradient(0% 100% 90deg, #0092BF, #0079B1); -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; } .akismet_activate .aa_button_border { border: 1px solid #006699; -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; background: #029DD6; background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1)); background-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6); } .akismet_activate .aa_button_container { box-sizing: border-box; display: inline-block; background: #DEF1B8; padding: 5px; -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; width: 266px; } .akismet_activate .aa_description { position: absolute; top: 22px; right: 285px; margin-right: 25px; color: #E5F2B1; font-size: 15px; } .akismet_activate .aa_description strong { color: #FFF; font-weight: normal; } @media (max-width: 550px) { .akismet_activate .aa_a { display: none; } .akismet_activate .aa_button_container { width: 100%; } } @media (max-width: 782px) { .akismet_activate { min-width: 0; } } @media (max-width: 850px) { #akismet_setup_prompt .aa_description { display: none; } .akismet_activate { min-width: 0; } } .jetpack_page_akismet-key-config #wpcontent, .settings_page_akismet-key-config #wpcontent { padding-right: 0; } .akismet-masthead { background-color:#fff; text-align:center; box-shadow:0 1px 0 rgba(200,215,225,0.5),0 1px 2px #e9eff3 } @media (max-width: 45rem) { .akismet-masthead { padding:0 1.25rem } } .akismet-masthead__inside-container { padding:.375rem 0; margin:0 auto; width:100%; max-width:45rem; text-align: right; } .akismet-masthead__logo-container { padding:.3125rem 0 0 } .akismet-masthead__logo-link { display:inline-block; outline:none; vertical-align:middle } .akismet-masthead__logo-link:focus { line-height:0; box-shadow:0 0 0 2px #78dcfa } .akismet-masthead__logo-link+code { margin:0 10px; padding:5px 9px; border-radius:2px; background:#e6ecf1; color:#647a88 } .akismet-masthead__links { display:-ms-flexbox; display:flex; -ms-flex-flow:row wrap; flex-flow:row wrap; -ms-flex:2 50%; flex:2 50%; -ms-flex-pack:end; justify-content:flex-end; margin:0 } @media (max-width: 480px) { .akismet-masthead__links { padding-left:.625rem } } .akismet-masthead__link-li { margin:0; padding:0 } .akismet-masthead__link { font-style:normal; color:#0087be; padding:.625rem; display:inline-block } .akismet-masthead__link:visited { color:#0087be } .akismet-masthead__link:active,.akismet-masthead__link:hover { color:#00aadc } .akismet-masthead__link:hover { text-decoration:underline } .akismet-masthead__link .dashicons { display:none } @media (max-width: 480px) { .akismet-masthead__link:hover,.akismet-masthead__link:active { text-decoration:none } .akismet-masthead__link .dashicons { display:block; font-size:1.75rem } .akismet-masthead__link span+span { display:none } } .akismet-masthead__link-li:last-of-type .akismet-masthead__link { padding-left:0 } .akismet-lower { margin: 0 auto; text-align: right; max-width: 45rem; padding: 1.5rem; } .akismet-lower .notice { margin-bottom: 2rem; } .akismet-card { margin-top: 1rem; margin-bottom: 0; position: relative; box-sizing: border-box; background: white; } .akismet-card:after, .akismet-card .inside:after, .akismet-masthead__logo-container:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .akismet-card .inside { padding: 1.5rem; padding-top: 1rem; } .akismet-card .akismet-card-actions { margin-top: 1rem; } .jetpack_page_akismet-key-config .update-nag, .settings_page_akismet-key-config .update-nag { display: none; } .akismet-masthead .akismet-right { line-height: 2.125rem; font-size: 0.9rem; } .akismet-box { box-sizing: border-box; background: white; border: 1px solid rgba(200, 215, 225, 0.5); } .akismet-box h2, .akismet-box h3 { padding: 1.5rem 1.5rem .5rem 1.5rem; margin: 0; } .akismet-box p { padding: 0 1.5rem 1.5rem 1.5rem; margin: 0; } .akismet-jetpack-email { font-style: oblique; } .akismet-jetpack-gravatar { padding: 0 1.5rem 0 0; float: right; margin-left: 1rem; width: 54px; height: 54px; } .akismet-box p:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .akismet-box .akismet-right { padding-left: 1.5rem; } .akismet-boxes .akismet-box { margin-bottom: 0; padding: 0; margin-top: -1px; } .akismet-boxes .akismet-box:last-child { margin-bottom: 1.5rem; } .akismet-boxes .akismet-box:first-child { margin-top: 1.5rem; } .akismet-box-header { max-width: 700px; margin: 0 auto 40px auto; line-height: 1.5; } .akismet-box-header h2 { margin: 1.5rem 10% 0; font-size: 1.375rem; font-weight: 700; color: #000; } .akismet-box .centered { text-align: center; } .akismet-box .akismet-toggles { margin: 3rem 0; } .akismet-box .akismet-ak-connect, .akismet-box .toggle-jp-connect { display: none; } .akismet-button, .akismet-button:hover, .akismet-button:visited { background: white; border-color: #c8d7e1; border-style: solid; border-width: 1px 1px 2px; color: #2e4453; cursor: pointer; display: inline-block; margin: 0; outline: 0; overflow: hidden; font-size: 14px; font-weight: 500; text-overflow: ellipsis; text-decoration: none; vertical-align: top; box-sizing: border-box; font-size: 14px; line-height: 21px; border-radius: 4px; padding: 7px 14px 9px; -webkit-appearance: none; -moz-appearance: none; appearance: none; } .akismet-button:hover { border-color: #a8bece; } .akismet-button:active { border-width: 2px 1px 1px; } .akismet-is-primary, .akismet-is-primary:hover, .akismet-is-primary:visited { background: #00aadc; border-color: #0087be; color: white; } .akismet-is-primary:hover, .akismet-is-primary:focus { border-color: #005082; } .akismet-is-primary:hover { border-color: #005082; } .akismet-section-header { position: relative; margin: 0 auto 0.625rem auto; padding: 1rem; box-sizing: border-box; box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #e9eff3; background: #ffffff; width: 100%; padding-top: 0.6875rem; padding-bottom: 0.6875rem; display: flex; } .akismet-section-header__label { display: -ms-flexbox; display: flex; -ms-flex-align: center; align-items: center; -ms-flex-positive: 1; flex-grow: 1; line-height: 1.75rem; position: relative; font-size: 0.875rem; color: #4f748e; } .akismet-section-header__actions { line-height: 1.75rem; } .akismet-setup-instructions { text-align: center; } .akismet-setup-instructions form { padding-bottom: 1.5rem; } div.error.akismet-usage-limit-alert { padding: 25px 15px 25px 45px; display: flex; align-items: center; } #akismet-plugin-container .akismet-usage-limit-alert { margin: 0 auto 0.625rem auto; box-sizing: border-box; box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #e9eff3; border: none; border-right: 4px solid #d63638; } .akismet-usage-limit-alert .akismet-usage-limit-logo { width: 38px; min-width: 38px; height: 38px; border-radius: 20px; margin-left: 18px; background: black; position: relative; } .akismet-usage-limit-alert .akismet-usage-limit-logo img { position: absolute; width: 22px; right: 8px; top: 10px; } .akismet-usage-limit-alert .akismet-usage-limit-text { flex-grow: 1; margin-left: 18px; } .akismet-usage-limit-alert h3 { margin: 0; } .akismet-usage-limit-alert .akismet-usage-limit-cta { text-align: left; } #akismet-plugin-container .akismet-usage-limit-cta a { color: #d63638; } @media (max-width: 550px) { div.error.akismet-usage-limit-alert { display: block; } .akismet-usage-limit-alert .akismet-usage-limit-logo, .akismet-usage-limit-alert .akismet-usage-limit-text { margin-bottom: 15px; } .akismet-usage-limit-alert .akismet-usage-limit-cta { text-align: right; } }PKwL\K22&akismet/_inc/rtl/akismet-admin-rtl.cssnu[/* This file was automatically generated on Nov 20 2023 03:10:42 */ #akismet-plugin-container { background-color: var(--akismet-color-light-grey); font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; --akismet-color-charcoal: #272635; --akismet-color-light-grey: #f6f7f7; --akismet-color-mid-grey: #a7aaad; --akismet-color-dark-grey: #646970; --akismet-color-grey-80: #2c3338; --akismet-color-grey-100: #101517; --akismet-color-white: #fff; --akismet-color-mid-green: #357b49; --akismet-color-mid-red: #e82c3f; --akismet-color-light-blue: #256eff; --akismet-color-notice-light-green: #dbf0e1; --akismet-color-notice-dark-green: #69bf82; --akismet-color-notice-light-red: #ffdbde; --akismet-color-notice-dark-red: #ff6676; } #akismet-plugin-container a { color: var(--akismet-color-mid-green); } #akismet-plugin-container button:focus-visible, #akismet-plugin-container input:focus-visible { border: 0; box-shadow: none; outline: 2px solid var(--akismet-color-light-blue); } .akismet-masthead { box-shadow: none; } .akismet-masthead__logo { margin: 20px 0; } .akismet-section-header { box-shadow: none; margin-bottom: 0; } .akismet-section-header__label { color: var(--akismet-color-charcoal); font-weight: 600; } .akismet-button, .akismet-button:hover { background-color: var(--akismet-color-mid-green); border: 0; color: #fff; } /* Need this specificity to override the existing header rule */ .akismet-new-snapshot h3.akismet-new-snapshot__header { background: none; font-size: 13px; color: var(--akismet-color-charcoal); text-align: right; text-transform: none; } .akismet-new-snapshot .akismet-new-snapshot__number { color: var(--akismet-color-charcoal); letter-spacing: -1px; text-align: right; } .akismet-new-snapshot li.akismet-new-snapshot__item { color: var(--akismet-color-dark-grey); font-size: 13px; text-align: right; text-transform: none; } .akismet-masthead__logo-link { min-height: 50px; } .akismet-masthead__back-link-container { margin-top: 16px; margin-bottom: 2px; } /* Need this specificity to override the existing link rule */ #akismet-plugin-container a.akismet-masthead__back-link { background-image: url(../img/arrow-left.svg); background-position: right; background-repeat: no-repeat; background-size: 16px; color: var(--akismet-color-charcoal); font-weight: 400; padding-right: 20px; text-decoration: none; } #akismet-plugin-container a.akismet-masthead__back-link:hover { text-decoration: underline; } .akismet-new-snapshot__item { border-top: 1px solid var(--akismet-color-light-grey); border-right: 1px solid var(--akismet-color-light-grey); padding: 1em; } .akismet-new-snapshot li:first-child { border-right: none; } .akismet-new-snapshot__list { display: flex; margin-bottom: 0; } .akismet-new-snapshot__item { flex: 1 0 33.33%; margin-bottom: 0; padding-right: 1.5em; padding-left: 1.5em; } .akismet-new-snapshot__chart { padding: 1em; } .akismet-box { border: 0; } .akismet-box, .akismet-card { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06), 0 0 2px rgba(0, 0, 0, 0.16); border-radius: 8px; overflow: hidden; } .akismet-card { margin: 32px auto 0 auto; } .akismet-lower { padding-top: 0; } .akismet-lower .inside { padding: 0; } .akismet-section-header__label { margin: 0; } .akismet-settings__row { border-bottom: 1px solid var(--akismet-color-light-grey); display: block; padding: 1em 1.5em; } .akismet-settings__row-input { margin-right: auto; } .akismet-settings__row-title { font-weight: 500; font-size: 1em; margin: 0; margin-bottom: 1em; } .akismet-settings__row-description { margin-top: 0.5em; } .akismet-card-actions { display: flex; justify-content: flex-end; padding: 1em; } .akismet-card-actions__secondary-action { align-self: center; margin-left: auto; } .akismet-card-actions__secondary-action a[target="_blank"]::after { background: url('../img/icon-external.svg') no-repeat; background-size: contain; content: ""; display: inline-block; height: 16px; margin-right: 5px; vertical-align: middle; width: 16px; } .akismet-settings__row label { padding-bottom: 1em; } .akismet-settings__row-note { font-size: 0.9em; margin-top: 0.4em; } .akismet-settings__row input[type="checkbox"], .akismet-settings__row input[type="radio"] { accent-color: var(--akismet-color-mid-green); box-shadow: none; flex-shrink: 0; margin: 2px 0 0 0; } .akismet-settings__row input[type="checkbox"] { margin-top: 1px; vertical-align: top; -webkit-appearance: checkbox; } .akismet-settings__row input[type="radio"] { -webkit-appearance: radio; } /* Fix up misbehaving wp-admin styles in Chrome (from forms and colors stylesheets) */ .akismet-settings__row input[type="checkbox"]:checked:before { content: ''; } .akismet-settings__row input[type="radio"]:checked:before { background: none; } .akismet-settings__row input[type="checkbox"]:checked:hover, .akismet-settings__row input[type="radio"]:checked:hover { accent-color: var(--akismet-color-mid-green); } .akismet-button:disabled { background-color: var(--akismet-color-mid-grey); color: var(--akismet-color-white); cursor: arrow; } .akismet-awaiting-stats, .akismet-account { padding: 0 1rem 1rem 1rem; margin: 0; } .akismet-account { padding-bottom: 0; } .akismet-account th { font-weight: 500; padding-left: 1em; } .akismet-account th, .akismet-account td { padding-bottom: 1em; } .akismet-settings__row-input-label { align-items: center; display: flex; } .akismet-settings__row-label-text { padding-right: 0.5em; margin-top: 2px; } .akismet-alert { border-right: 8px solid; border-radius: 8px; margin: 20px 0; padding: 0.2em 1em; } .akismet-alert__heading { font-size: 1em; } .akismet-alert.is-good { background-color: var(--akismet-color-notice-light-green); border-right-color: var(--akismet-color-notice-dark-green); } .akismet-alert.is-neutral { background-color: var(--akismet-color-white); border-right-color: var(--akismet-color-dark-grey); } .akismet-alert.is-bad { background-color: var(--akismet-color-notice-light-red); border-right-color: var(--akismet-color-notice-dark-red); } #akismet-plugin-container .akismet-alert.is-good a, #akismet-plugin-container .akismet-alert.is-bad a { /* For better contrast - green isn't great */ color: var(--akismet-color-grey-80); } /* Setup - API key input */ .akismet-enter-api-key-box { margin: 1.5rem 0; } .akismet-enter-api-key-box__reveal { background: none; border: 0; color: var(--akismet-color-mid-green); cursor: pointer; text-decoration: underline; } .akismet-enter-api-key-box__form-wrapper { display: none; margin-top: 1.5rem; } .akismet-enter-api-key-box__input-wrapper { box-sizing: border-box; display: flex; flex-wrap: nowrap; padding: 0 1.5rem; width: 100%; } .akismet-enter-api-key-box__key-input { flex-grow: 1; margin-left: 1rem; } h3.akismet-enter-api-key-box__header { padding-top: 0; padding-bottom: 1em; text-align: right; } @media screen and (max-width: 782px) { .akismet-new-snapshot__list { display: block; } .akismet-new-snapshot__number { float: left; font-size: 20px; font-weight: 500; margin-top: -16px; } .akismet-new-snapshot__header { font-size: 14px; font-weight: 500; } .akismet-new-snapshot__text { font-size: 12px; } .akismet-settings__row input[type="checkbox"], .akismet-settings__row input[type="radio"] { height: 24px; width: 24px; } .akismet-settings__row-label-text { padding-right: 0.8em; } .akismet-settings__row input[type="checkbox"], .akismet-settings__row input[type="radio"] { margin-top: 0; } }PKwL\rIh00akismet/_inc/akismet.cssnu[.wp-admin.jetpack_page_akismet-key-config, .wp-admin.settings_page_akismet-key-config { background-color:#f3f6f8; } #submitted-on { position: relative; } #the-comment-list .author .akismet-user-comment-count { display: inline; } #the-comment-list .author a span { text-decoration: none; color: #999; } #the-comment-list .author a span.akismet-span-link { text-decoration: inherit; color: inherit; } #the-comment-list .akismet_remove_url { margin-left: 3px; color: #999; padding: 2px 3px 2px 0; } #the-comment-list .akismet_remove_url:hover { color: #A7301F; font-weight: bold; padding: 2px 2px 2px 0; } #dashboard_recent_comments .akismet-status { display: none; } .akismet-status { float: right; } .akismet-status a { color: #AAA; font-style: italic; } table.comments td.comment p a { text-decoration: underline; } table.comments td.comment p a:after { content: attr(href); color: #aaa; display: inline-block; /* Show the URL without the link's underline extending under it. */ padding: 0 1ex; /* Because it's inline block, we can't just use spaces in the content: attribute to separate it from the link text. */ } .mshot-arrow { width: 0; height: 0; border-top: 10px solid transparent; border-bottom: 10px solid transparent; border-right: 10px solid #5C5C5C; position: absolute; left: -6px; top: 91px; } .mshot-container { background: #5C5C5C; position: absolute; top: -94px; padding: 7px; width: 450px; height: 338px; z-index: 20000; -moz-border-radius: 6px; border-radius: 6px; -webkit-border-radius: 6px; } .akismet-mshot { position: absolute; z-index: 100; } .akismet-mshot .mshot-image { margin: 0; height: 338px; width: 450px; } .checkforspam { display: inline-block !important; } .checkforspam-spinner { display: inline-block; margin-top: 7px; } .akismet-right { float: right; } .akismet-card .akismet-right { margin: 1em 0; } .akismet-alert-text { color: #dd3d36; font-weight: bold; font-size: 120%; margin-top: .5rem; } .akismet-new-snapshot { margin-top: 1em; text-align: center; background: #fff; } .akismet-new-snapshot h3 { background: #f5f5f5; color: #888; font-size: 11px; margin: 0; } .akismet-new-snapshot ul li { color: #999; font-size: 11px; text-transform: uppercase; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -ms-box-sizing: border-box; } .akismet-new-snapshot__number { display: block; font-size: 32px; font-weight: lighter; line-height: 1.5em; } .akismet-settings th:first-child { vertical-align: top; padding-top: 15px; } .akismet-settings th.akismet-api-key { vertical-align: middle; padding-top: 0; } .akismet-settings span.akismet-note{ float: left; padding-left: 23px; font-size: 75%; margin-top: -10px; } /** * For the activation notice on the plugins page. */ #akismet_setup_prompt { background: none; border: none; margin: 0; padding: 0; width: 100%; } .akismet_activate { border: 1px solid #4F800D; padding: 5px; margin: 15px 0; background: #83AF24; background-image: -webkit-gradient(linear, 0% 0, 80% 100%, from(#83AF24), to(#4F800D)); background-image: -moz-linear-gradient(80% 100% 120deg, #4F800D, #83AF24); -moz-border-radius: 3px; border-radius: 3px; -webkit-border-radius: 3px; position: relative; overflow: hidden; } .akismet_activate .aa_a { position: absolute; top: -5px; right: 10px; font-size: 140px; color: #769F33; font-family: Georgia, "Times New Roman", Times, serif; } .akismet_activate .aa_button { font-weight: bold; border: 1px solid #029DD6; border-top: 1px solid #06B9FD; font-size: 15px; text-align: center; padding: 9px 0 8px 0; color: #FFF; background: #029DD6; background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1)); background-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6); -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; width: 100%; cursor: pointer; margin: 0; } .akismet_activate .aa_button:hover { text-decoration: none !important; border: 1px solid #029DD6; border-bottom: 1px solid #00A8EF; font-size: 15px; text-align: center; padding: 9px 0 8px 0; color: #F0F8FB; background: #0079B1; background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#0079B1), to(#0092BF)); background-image: -moz-linear-gradient(0% 100% 90deg, #0092BF, #0079B1); -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; } .akismet_activate .aa_button_border { border: 1px solid #006699; -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; background: #029DD6; background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1)); background-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6); } .akismet_activate .aa_button_container { box-sizing: border-box; display: inline-block; background: #DEF1B8; padding: 5px; -moz-border-radius: 2px; border-radius: 2px; -webkit-border-radius: 2px; width: 266px; } .akismet_activate .aa_description { position: absolute; top: 22px; left: 285px; margin-left: 25px; color: #E5F2B1; font-size: 15px; } .akismet_activate .aa_description strong { color: #FFF; font-weight: normal; } @media (max-width: 550px) { .akismet_activate .aa_a { display: none; } .akismet_activate .aa_button_container { width: 100%; } } @media (max-width: 782px) { .akismet_activate { min-width: 0; } } @media (max-width: 850px) { #akismet_setup_prompt .aa_description { display: none; } .akismet_activate { min-width: 0; } } .jetpack_page_akismet-key-config #wpcontent, .settings_page_akismet-key-config #wpcontent { padding-left: 0; } .akismet-masthead { background-color:#fff; text-align:center; box-shadow:0 1px 0 rgba(200,215,225,0.5),0 1px 2px #e9eff3 } @media (max-width: 45rem) { .akismet-masthead { padding:0 1.25rem } } .akismet-masthead__inside-container { padding:.375rem 0; margin:0 auto; width:100%; max-width:45rem; text-align: left; } .akismet-masthead__logo-container { padding:.3125rem 0 0 } .akismet-masthead__logo-link { display:inline-block; outline:none; vertical-align:middle } .akismet-masthead__logo-link:focus { line-height:0; box-shadow:0 0 0 2px #78dcfa } .akismet-masthead__logo-link+code { margin:0 10px; padding:5px 9px; border-radius:2px; background:#e6ecf1; color:#647a88 } .akismet-masthead__links { display:-ms-flexbox; display:flex; -ms-flex-flow:row wrap; flex-flow:row wrap; -ms-flex:2 50%; flex:2 50%; -ms-flex-pack:end; justify-content:flex-end; margin:0 } @media (max-width: 480px) { .akismet-masthead__links { padding-right:.625rem } } .akismet-masthead__link-li { margin:0; padding:0 } .akismet-masthead__link { font-style:normal; color:#0087be; padding:.625rem; display:inline-block } .akismet-masthead__link:visited { color:#0087be } .akismet-masthead__link:active,.akismet-masthead__link:hover { color:#00aadc } .akismet-masthead__link:hover { text-decoration:underline } .akismet-masthead__link .dashicons { display:none } @media (max-width: 480px) { .akismet-masthead__link:hover,.akismet-masthead__link:active { text-decoration:none } .akismet-masthead__link .dashicons { display:block; font-size:1.75rem } .akismet-masthead__link span+span { display:none } } .akismet-masthead__link-li:last-of-type .akismet-masthead__link { padding-right:0 } .akismet-lower { margin: 0 auto; text-align: left; max-width: 45rem; padding: 1.5rem; } .akismet-lower .notice { margin-bottom: 2rem; } .akismet-card { margin-top: 1rem; margin-bottom: 0; position: relative; box-sizing: border-box; background: white; } .akismet-card:after, .akismet-card .inside:after, .akismet-masthead__logo-container:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .akismet-card .inside { padding: 1.5rem; padding-top: 1rem; } .akismet-card .akismet-card-actions { margin-top: 1rem; } .jetpack_page_akismet-key-config .update-nag, .settings_page_akismet-key-config .update-nag { display: none; } .akismet-masthead .akismet-right { line-height: 2.125rem; font-size: 0.9rem; } .akismet-box { box-sizing: border-box; background: white; border: 1px solid rgba(200, 215, 225, 0.5); } .akismet-box h2, .akismet-box h3 { padding: 1.5rem 1.5rem .5rem 1.5rem; margin: 0; } .akismet-box p { padding: 0 1.5rem 1.5rem 1.5rem; margin: 0; } .akismet-jetpack-email { font-style: oblique; } .akismet-jetpack-gravatar { padding: 0 0 0 1.5rem; float: left; margin-right: 1rem; width: 54px; height: 54px; } .akismet-box p:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .akismet-box .akismet-right { padding-right: 1.5rem; } .akismet-boxes .akismet-box { margin-bottom: 0; padding: 0; margin-top: -1px; } .akismet-boxes .akismet-box:last-child { margin-bottom: 1.5rem; } .akismet-boxes .akismet-box:first-child { margin-top: 1.5rem; } .akismet-box-header { max-width: 700px; margin: 0 auto 40px auto; line-height: 1.5; } .akismet-box-header h2 { margin: 1.5rem 10% 0; font-size: 1.375rem; font-weight: 700; color: #000; } .akismet-box .centered { text-align: center; } .akismet-box .akismet-toggles { margin: 3rem 0; } .akismet-box .akismet-ak-connect, .akismet-box .toggle-jp-connect { display: none; } .akismet-button, .akismet-button:hover, .akismet-button:visited { background: white; border-color: #c8d7e1; border-style: solid; border-width: 1px 1px 2px; color: #2e4453; cursor: pointer; display: inline-block; margin: 0; outline: 0; overflow: hidden; font-size: 14px; font-weight: 500; text-overflow: ellipsis; text-decoration: none; vertical-align: top; box-sizing: border-box; font-size: 14px; line-height: 21px; border-radius: 4px; padding: 7px 14px 9px; -webkit-appearance: none; -moz-appearance: none; appearance: none; } .akismet-button:hover { border-color: #a8bece; } .akismet-button:active { border-width: 2px 1px 1px; } .akismet-is-primary, .akismet-is-primary:hover, .akismet-is-primary:visited { background: #00aadc; border-color: #0087be; color: white; } .akismet-is-primary:hover, .akismet-is-primary:focus { border-color: #005082; } .akismet-is-primary:hover { border-color: #005082; } .akismet-section-header { position: relative; margin: 0 auto 0.625rem auto; padding: 1rem; box-sizing: border-box; box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #e9eff3; background: #ffffff; width: 100%; padding-top: 0.6875rem; padding-bottom: 0.6875rem; display: flex; } .akismet-section-header__label { display: -ms-flexbox; display: flex; -ms-flex-align: center; align-items: center; -ms-flex-positive: 1; flex-grow: 1; line-height: 1.75rem; position: relative; font-size: 0.875rem; color: #4f748e; } .akismet-section-header__actions { line-height: 1.75rem; } .akismet-setup-instructions { text-align: center; } .akismet-setup-instructions form { padding-bottom: 1.5rem; } div.error.akismet-usage-limit-alert { padding: 25px 45px 25px 15px; display: flex; align-items: center; } #akismet-plugin-container .akismet-usage-limit-alert { margin: 0 auto 0.625rem auto; box-sizing: border-box; box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #e9eff3; border: none; border-left: 4px solid #d63638; } .akismet-usage-limit-alert .akismet-usage-limit-logo { width: 38px; min-width: 38px; height: 38px; border-radius: 20px; margin-right: 18px; background: black; position: relative; } .akismet-usage-limit-alert .akismet-usage-limit-logo img { position: absolute; width: 22px; left: 8px; top: 10px; } .akismet-usage-limit-alert .akismet-usage-limit-text { flex-grow: 1; margin-right: 18px; } .akismet-usage-limit-alert h3 { margin: 0; } .akismet-usage-limit-alert .akismet-usage-limit-cta { border-color: none; text-align: right; } #akismet-plugin-container .akismet-usage-limit-cta a { color: #d63638; } @media (max-width: 550px) { div.error.akismet-usage-limit-alert { display: block; } .akismet-usage-limit-alert .akismet-usage-limit-logo, .akismet-usage-limit-alert .akismet-usage-limit-text { margin-bottom: 15px; } .akismet-usage-limit-alert .akismet-usage-limit-cta { text-align: left; } }PKwL\: ,akismet/_inc/img/akismet-refresh-logo@2x.pngnu[PNG  IHDRX!PLTEGpL?O4zH4{I5zI4zI5{I4{H5{I5zJ7G4|I4{I5zH6xH4zJ6zJ/O6zH5{H6{I5|I4{I4{IhwN`􁭍BTͻрO`ů[kƁ[lu6zI5zH5zG7wG5{I3{G5{G4zI4|I1qPtRNSpϏ` opp@0`P p_o`   NIDATxч A@~?C@ޕ0[q)Ţ3M yauC;12nba5`& K\aKa/(l-:[tn1V(ܫ< ŐXܞyxGkqpD`9U,#YOko@\4]:}Xno]XN|U9ޚ뻾a{#*bJ,}? X^uXDF, g(STÌ/E;!E,E*|QZvW?>,I54e+ZJ>%`uyKֳ5[ݛ#/ŊvHa`ûsvWgu&,x4cpa,`P0z,q7}m_?uj닾,HrssN̸WT+XrX_7>36Y-{fq~#^ 뎼We+vSɻ0L/]Y}=66;_9C[8߫ӟvu+LtX`*y}bJڢɻ6b!' _V"*ý>Q(.ȉqpUQGufroJEb }'PRzGέ \ kD*+K0M|z ,@ֱƷbvF[-C!_?1T52v(,ĩ `9ND<1Q` Go9ky殳?=*"hG98(uUm 0uXT4KјjGx:p%RtNClI2yUr~eJFѩ؝KyifoGC(\dY,)?`7t0 !-"87@Qt&Gm0 .ja_g1őN^-X%UF;³z7͙XuY0uf/$Ϗv,2Ǣ"ol jhC|kas%Cg] ^3t ChYd!MҢI gl$1* 97{VSUM]6k''ibѡؓamGf  p G@Tvuf_UyX:iE?]&Đw$itDe5EA>\km2aƻIWqwbAk }&>jFSeI}0Ig#@fYv,' 0D^ř>bMr*Y,v}pO֫a_wŰx Ţ_*sA,AQ FzbgbESe;yXa d c`}-F,Lsa,t* o].KKVND52Q,BnWUrȻ\~WtҡݗӕƂ jtKg+&c/GR W0‡'tՙt_.瘅 І́K-gcq,X._.Ӣ_"…&"*Kxsוrte%}.fU}ve-y~)-LqJ׳T`J\͂.}RύX\ Kmre,1Hiˇ5jY@?@%^5Ak -CR,fuq Q&nv{y,BO8_`cX,h[;Z-^F5$l:P4yGrrV;h= 4ڒ IXFh+KPKwL\e%akismet/_inc/img/arrow-left.svgnu[PKwL\!akismet/_inc/img/logo-full-2x.pngnu[PNG  IHDRBɻ*PLTE_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>DtRNS  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~z9|4lIDATyxV BD p[qcQpĭQKđ*VBu@Q+ZEF h 6ÎI|9}|\k7 ~ ҳ~af4 DH/41aK-O @0y4ͥcE[!]+e I%] …Ԋ&AO>r~vvQVFǒt-ef8+,C#$Gc%?$FRKm5J*SȀɡm& ҷT4 |tLQ(2Jdmpaj7QH &#-Ӗ^6j7Q4&#- [LjYp P.Rm 6r=4)VUxH._a .Tq2Bޢm~!m9HG7jMy9 GU"Km;.%!{!/C@;:!@2iFL~!% ~S_7jMI<#cT* d! T攓r@NC6\^0jHHgr#c+⓳eBDOAoRa <AITFl*zhI ZI RxBRdЕ /-}M ZAڞAAT*T@d u+aaP, ~T*k 32T.D˧RYj#%A -ԑ#L.) LD@=C0ZBe1T 7iقtT ZI J{đO AQ a=LS?< 2P{ ~TK--#'C!d$ݰK۞,ĒO A0줲U90{UrG1t!*eA&r3؆!d"/ѶXfRY68< UQ-IY02~uulp  !}GA RרP)Bȣm2J7ԊaTMe|F1N^^7GP5&i_#&z2@#T@a[  ӶAvLZP5 6kڵw8€w͂ Jb(c Uhz_V;aөLJۏel]AXk?%ȧuQ59d ET2ƒ?E=}CS!oZFT~Q'j&OCNo @`VHV3i5阏 ̃~ |*aԉZSP, ҡ"RYH9LZ=t2&WU 0H- F5T«;mkaTHe"-NaҊވg%INijʇ0 *E0N- F5T΅ׅTb*} 0[DvCm9HF~ P)QjY0:B,xS@:JG9dr2qP鈣x$'ȜJ(R@kv jG:JL@ôLF tA,Ԯx1l,"<mO&=e¨JWxE %T#5yN~OW&v--UP#װu(T/LRi˨A:ʨGZ>G r&]C6`KSt`D  ̇Qj0Tv <z R3ĐM ( F ":*K*`ԇZkQ9U*!mHm(]6A@mYB"2FWS5Rx2)LH-]6pu P?ЁH%T`" LQIe0Rj :"Z. uFyjTB^rFRXjqd F*6\#R.pHZN 9j@>^Ti0MFQC7"cɷB* QzrKrp L3}PyFsjO90*>^G ٴhD\j- =$zS$„FD:DePIe/QHɦm ktZ g•0UාEDDm9L 0 Cp~ mo7z,k mǫtu),`Hm~6R\JGO MFN&ԗ"@T^BR:"nC*FUAJt54P0BWwO?C52DaetM zzۺbۛvTQ_ӵ khd2qeB1I GszC8B^g0 KiDYIWm 9&܉S0b:ޒ5k6Ztd"`$hkת)Ϡ :[Z7]{f %oajND)aC=^FA#Լ A4I{]` >>4v_\@l_a_xAՖśSZM/Acr9} z[ēH n奭5\tu޸aJF坐p,C=M6C4{d~M*zv>Lٕ43LnaHOhR?fydc}@l&q~NH X L_2nǐ{ {hs$or-@pL~@F!HȞ@5dC<[nv>lm+7,lV}XtRi)8& }oaC΀&AwOd _{o 8: AX;t1W5AjF h8j11MIENDB`PKwL\ؑˆakismet/_inc/img/logo-a-2x.pngnu[PNG  IHDR, iFz pHYs%%IR$sRGBgAMA aIDATx͘MHQKC++ccתZDAצڵ JA1(hrU}$Hedm,̏<s77f|o|o^{w#X̼qR=(+]|5Q0V&9UGX0 b`hozr I0ԠAn=<0nk-ð\_Eq\TSNF@2L_| &jy(gנP{zeYRA9l|I;]7̸.cX&ʗ0aN(j=`)Z49A4;ĩ:I&2p)Mrm J(WdhrO0L?Zp 9f'_rzl3BlfW"O _ra=0NSט>i0Ui@%zc;R>quh`ٛ)K!UU>JQ6}$uc=۟Sn=l+.H@f"WP\ٻ/{lqAtlwyhb;_q]+0"bboI\7rV gZO_Gb;ij&磐*YJ>=S_A׹+N ĩ]IENDB`PKwL\t^^"akismet/_inc/img/icon-external.svgnu[PKwL\QK.akismet/_inc/fonts/inter.cssnu[@font-face { font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-Regular.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-Regular.woff?v=3.19") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 400; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-Italic.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-Italic.woff?v=3.19") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 500; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-Medium.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-Medium.woff?v=3.19") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 500; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-MediumItalic.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-MediumItalic.woff?v=3.19") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-SemiBold.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-SemiBold.woff?v=3.19") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 600; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-SemiBoldItalic.woff?v=3.19") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 700; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-Bold.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-Bold.woff?v=3.19") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 700; font-display: swap; src: url("https://s0.wp.com/i/fonts/inter/Inter-BoldItalic.woff2?v=3.19") format("woff2"), url("https://s0.wp.com/i/fonts/inter/Inter-BoldItalic.woff?v=3.19") format("woff"); } PKwL\BHakismet/_inc/akismet-admin.cssnu[#akismet-plugin-container { background-color: var(--akismet-color-light-grey); font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; --akismet-color-charcoal: #272635; --akismet-color-light-grey: #f6f7f7; --akismet-color-mid-grey: #a7aaad; --akismet-color-dark-grey: #646970; --akismet-color-grey-80: #2c3338; --akismet-color-grey-100: #101517; --akismet-color-white: #fff; --akismet-color-mid-green: #357b49; --akismet-color-mid-red: #e82c3f; --akismet-color-light-blue: #256eff; --akismet-color-notice-light-green: #dbf0e1; --akismet-color-notice-dark-green: #69bf82; --akismet-color-notice-light-red: #ffdbde; --akismet-color-notice-dark-red: #ff6676; } #akismet-plugin-container a { color: var(--akismet-color-mid-green); } #akismet-plugin-container button:focus-visible, #akismet-plugin-container input:focus-visible { border: 0; box-shadow: none; outline: 2px solid var(--akismet-color-light-blue); } .akismet-masthead { box-shadow: none; } .akismet-masthead__logo { margin: 20px 0; } .akismet-section-header { box-shadow: none; margin-bottom: 0; } .akismet-section-header__label { color: var(--akismet-color-charcoal); font-weight: 600; } .akismet-button, .akismet-button:hover { background-color: var(--akismet-color-mid-green); border: 0; color: #fff; } /* Need this specificity to override the existing header rule */ .akismet-new-snapshot h3.akismet-new-snapshot__header { background: none; font-size: 13px; color: var(--akismet-color-charcoal); text-align: left; text-transform: none; } .akismet-new-snapshot .akismet-new-snapshot__number { color: var(--akismet-color-charcoal); letter-spacing: -1px; text-align: left; } .akismet-new-snapshot li.akismet-new-snapshot__item { color: var(--akismet-color-dark-grey); font-size: 13px; text-align: left; text-transform: none; } .akismet-masthead__logo-link { min-height: 50px; } .akismet-masthead__back-link-container { margin-top: 16px; margin-bottom: 2px; } /* Need this specificity to override the existing link rule */ #akismet-plugin-container a.akismet-masthead__back-link { background-image: url(img/arrow-left.svg); background-position: left; background-repeat: no-repeat; background-size: 16px; color: var(--akismet-color-charcoal); font-weight: 400; padding-left: 20px; text-decoration: none; } #akismet-plugin-container a.akismet-masthead__back-link:hover { text-decoration: underline; } .akismet-new-snapshot__item { border-top: 1px solid var(--akismet-color-light-grey); border-left: 1px solid var(--akismet-color-light-grey); padding: 1em; } .akismet-new-snapshot li:first-child { border-left: none; } .akismet-new-snapshot__list { display: flex; margin-bottom: 0; } .akismet-new-snapshot__item { flex: 1 0 33.33%; margin-bottom: 0; padding-left: 1.5em; padding-right: 1.5em; } .akismet-new-snapshot__chart { padding: 1em; } .akismet-box { border: 0; } .akismet-box, .akismet-card { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06), 0 0 2px rgba(0, 0, 0, 0.16); border-radius: 8px; overflow: hidden; } .akismet-card { margin: 32px auto 0 auto; } .akismet-lower { padding-top: 0; } .akismet-lower .inside { padding: 0; } .akismet-section-header__label { margin: 0; } .akismet-settings__row { border-bottom: 1px solid var(--akismet-color-light-grey); display: block; padding: 1em 1.5em; } .akismet-settings__row-input { margin-left: auto; } .akismet-settings__row-title { font-weight: 500; font-size: 1em; margin: 0; margin-bottom: 1em; } .akismet-settings__row-description { margin-top: 0.5em; } .akismet-card-actions { display: flex; justify-content: flex-end; padding: 1em; } .akismet-card-actions__secondary-action { align-self: center; margin-right: auto; } .akismet-card-actions__secondary-action a[target="_blank"]::after { background: url('img/icon-external.svg') no-repeat; background-size: contain; content: ""; display: inline-block; height: 16px; margin-left: 5px; vertical-align: middle; width: 16px; } .akismet-settings__row label { padding-bottom: 1em; } .akismet-settings__row-note { font-size: 0.9em; margin-top: 0.4em; } .akismet-settings__row input[type="checkbox"], .akismet-settings__row input[type="radio"] { accent-color: var(--akismet-color-mid-green); box-shadow: none; flex-shrink: 0; margin: 2px 0 0 0; } .akismet-settings__row input[type="checkbox"] { margin-top: 1px; vertical-align: top; -webkit-appearance: checkbox; } .akismet-settings__row input[type="radio"] { -webkit-appearance: radio; } /* Fix up misbehaving wp-admin styles in Chrome (from forms and colors stylesheets) */ .akismet-settings__row input[type="checkbox"]:checked:before { content: ''; } .akismet-settings__row input[type="radio"]:checked:before { background: none; } .akismet-settings__row input[type="checkbox"]:checked:hover, .akismet-settings__row input[type="radio"]:checked:hover { accent-color: var(--akismet-color-mid-green); } .akismet-button:disabled { background-color: var(--akismet-color-mid-grey); color: var(--akismet-color-white); cursor: arrow; } .akismet-awaiting-stats, .akismet-account { padding: 0 1rem 1rem 1rem; margin: 0; } .akismet-account { padding-bottom: 0; } .akismet-account th { font-weight: 500; padding-right: 1em; } .akismet-account th, .akismet-account td { padding-bottom: 1em; } .akismet-settings__row-input-label { align-items: center; display: flex; } .akismet-settings__row-label-text { padding-left: 0.5em; margin-top: 2px; } .akismet-alert { border-left: 8px solid; border-radius: 8px; margin: 20px 0; padding: 0.2em 1em; } .akismet-alert__heading { font-size: 1em; } .akismet-alert.is-good { background-color: var(--akismet-color-notice-light-green); border-left-color: var(--akismet-color-notice-dark-green); } .akismet-alert.is-neutral { background-color: var(--akismet-color-white); border-left-color: var(--akismet-color-dark-grey); } .akismet-alert.is-bad { background-color: var(--akismet-color-notice-light-red); border-left-color: var(--akismet-color-notice-dark-red); } #akismet-plugin-container .akismet-alert.is-good a, #akismet-plugin-container .akismet-alert.is-bad a { /* For better contrast - green isn't great */ color: var(--akismet-color-grey-80); } /* Setup - API key input */ .akismet-enter-api-key-box { margin: 1.5rem 0; } .akismet-enter-api-key-box__reveal { background: none; border: 0; color: var(--akismet-color-mid-green); cursor: pointer; text-decoration: underline; } .akismet-enter-api-key-box__form-wrapper { display: none; margin-top: 1.5rem; } .akismet-enter-api-key-box__input-wrapper { box-sizing: border-box; display: flex; flex-wrap: nowrap; padding: 0 1.5rem; width: 100%; } .akismet-enter-api-key-box__key-input { flex-grow: 1; margin-right: 1rem; } h3.akismet-enter-api-key-box__header { padding-top: 0; padding-bottom: 1em; text-align: left; } @media screen and (max-width: 782px) { .akismet-new-snapshot__list { display: block; } .akismet-new-snapshot__number { float: right; font-size: 20px; font-weight: 500; margin-top: -16px; } .akismet-new-snapshot__header { font-size: 14px; font-weight: 500; } .akismet-new-snapshot__text { font-size: 12px; } .akismet-settings__row input[type="checkbox"], .akismet-settings__row input[type="radio"] { height: 24px; width: 24px; } .akismet-settings__row-label-text { padding-left: 0.8em; } .akismet-settings__row input[type="checkbox"], .akismet-settings__row input[type="radio"] { margin-top: 0; } }PKwL\ʲy|,|, akismet/_inc/akismet-frontend.jsnu[/** * Observe how the user enters content into the comment form in order to determine whether it's a bot or not. * * Note that no actual input is being saved here, only counts and timings between events. */ ( function() { // Passive event listeners are guaranteed to never call e.preventDefault(), // but they're not supported in all browsers. Use this feature detection // to determine whether they're available for use. var supportsPassive = false; try { var opts = Object.defineProperty( {}, 'passive', { get : function() { supportsPassive = true; } } ); window.addEventListener( 'testPassive', null, opts ); window.removeEventListener( 'testPassive', null, opts ); } catch ( e ) {} function init() { var input_begin = ''; var keydowns = {}; var lastKeyup = null; var lastKeydown = null; var keypresses = []; var modifierKeys = []; var correctionKeys = []; var lastMouseup = null; var lastMousedown = null; var mouseclicks = []; var mousemoveTimer = null; var lastMousemoveX = null; var lastMousemoveY = null; var mousemoveStart = null; var mousemoves = []; var touchmoveCountTimer = null; var touchmoveCount = 0; var lastTouchEnd = null; var lastTouchStart = null; var touchEvents = []; var scrollCountTimer = null; var scrollCount = 0; var correctionKeyCodes = [ 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown' ]; var modifierKeyCodes = [ 'Shift', 'CapsLock' ]; var forms = document.querySelectorAll( 'form[method=post]' ); for ( var i = 0; i < forms.length; i++ ) { var form = forms[i]; var formAction = form.getAttribute( 'action' ); // Ignore forms that POST directly to other domains; these could be things like payment forms. if ( formAction ) { // Check that the form is posting to an external URL, not a path. if ( formAction.indexOf( 'http://' ) == 0 || formAction.indexOf( 'https://' ) == 0 ) { if ( formAction.indexOf( 'http://' + window.location.hostname + '/' ) != 0 && formAction.indexOf( 'https://' + window.location.hostname + '/' ) != 0 ) { continue; } } } form.addEventListener( 'submit', function () { var ak_bkp = prepare_timestamp_array_for_request( keypresses ); var ak_bmc = prepare_timestamp_array_for_request( mouseclicks ); var ak_bte = prepare_timestamp_array_for_request( touchEvents ); var ak_bmm = prepare_timestamp_array_for_request( mousemoves ); var input_fields = { // When did the user begin entering any input? 'bib': input_begin, // When was the form submitted? 'bfs': Date.now(), // How many keypresses did they make? 'bkpc': keypresses.length, // How quickly did they press a sample of keys, and how long between them? 'bkp': ak_bkp, // How quickly did they click the mouse, and how long between clicks? 'bmc': ak_bmc, // How many mouseclicks did they make? 'bmcc': mouseclicks.length, // When did they press modifier keys (like Shift or Capslock)? 'bmk': modifierKeys.join( ';' ), // When did they correct themselves? e.g., press Backspace, or use the arrow keys to move the cursor back 'bck': correctionKeys.join( ';' ), // How many times did they move the mouse? 'bmmc': mousemoves.length, // How many times did they move around using a touchscreen? 'btmc': touchmoveCount, // How many times did they scroll? 'bsc': scrollCount, // How quickly did they perform touch events, and how long between them? 'bte': ak_bte, // How many touch events were there? 'btec' : touchEvents.length, // How quickly did they move the mouse, and how long between moves? 'bmm' : ak_bmm }; var akismet_field_prefix = 'ak_'; if ( this.getElementsByClassName ) { // Check to see if we've used an alternate field name prefix. We store this as an attribute of the container around some of the Akismet fields. var possible_akismet_containers = this.getElementsByClassName( 'akismet-fields-container' ); for ( var containerIndex = 0; containerIndex < possible_akismet_containers.length; containerIndex++ ) { var container = possible_akismet_containers.item( containerIndex ); if ( container.getAttribute( 'data-prefix' ) ) { akismet_field_prefix = container.getAttribute( 'data-prefix' ); break; } } } for ( var field_name in input_fields ) { var field = document.createElement( 'input' ); field.setAttribute( 'type', 'hidden' ); field.setAttribute( 'name', akismet_field_prefix + field_name ); field.setAttribute( 'value', input_fields[ field_name ] ); this.appendChild( field ); } }, supportsPassive ? { passive: true } : false ); form.addEventListener( 'keydown', function ( e ) { // If you hold a key down, some browsers send multiple keydown events in a row. // Ignore any keydown events for a key that hasn't come back up yet. if ( e.key in keydowns ) { return; } var keydownTime = ( new Date() ).getTime(); keydowns[ e.key ] = [ keydownTime ]; if ( ! input_begin ) { input_begin = keydownTime; } // In some situations, we don't want to record an interval since the last keypress -- for example, // on the first keypress, or on a keypress after focus has changed to another element. Normally, // we want to record the time between the last keyup and this keydown. But if they press a // key while already pressing a key, we want to record the time between the two keydowns. var lastKeyEvent = Math.max( lastKeydown, lastKeyup ); if ( lastKeyEvent ) { keydowns[ e.key ].push( keydownTime - lastKeyEvent ); } lastKeydown = keydownTime; }, supportsPassive ? { passive: true } : false ); form.addEventListener( 'keyup', function ( e ) { if ( ! ( e.key in keydowns ) ) { // This key was pressed before this script was loaded, or a mouseclick happened during the keypress, or... return; } var keyupTime = ( new Date() ).getTime(); if ( 'TEXTAREA' === e.target.nodeName || 'INPUT' === e.target.nodeName ) { if ( -1 !== modifierKeyCodes.indexOf( e.key ) ) { modifierKeys.push( keypresses.length - 1 ); } else if ( -1 !== correctionKeyCodes.indexOf( e.key ) ) { correctionKeys.push( keypresses.length - 1 ); } else { // ^ Don't record timings for keys like Shift or backspace, since they // typically get held down for longer than regular typing. var keydownTime = keydowns[ e.key ][0]; var keypress = []; // Keypress duration. keypress.push( keyupTime - keydownTime ); // Amount of time between this keypress and the previous keypress. if ( keydowns[ e.key ].length > 1 ) { keypress.push( keydowns[ e.key ][1] ); } keypresses.push( keypress ); } } delete keydowns[ e.key ]; lastKeyup = keyupTime; }, supportsPassive ? { passive: true } : false ); form.addEventListener( "focusin", function ( e ) { lastKeydown = null; lastKeyup = null; keydowns = {}; }, supportsPassive ? { passive: true } : false ); form.addEventListener( "focusout", function ( e ) { lastKeydown = null; lastKeyup = null; keydowns = {}; }, supportsPassive ? { passive: true } : false ); } document.addEventListener( 'mousedown', function ( e ) { lastMousedown = ( new Date() ).getTime(); }, supportsPassive ? { passive: true } : false ); document.addEventListener( 'mouseup', function ( e ) { if ( ! lastMousedown ) { // If the mousedown happened before this script was loaded, but the mouseup happened after... return; } var now = ( new Date() ).getTime(); var mouseclick = []; mouseclick.push( now - lastMousedown ); if ( lastMouseup ) { mouseclick.push( lastMousedown - lastMouseup ); } mouseclicks.push( mouseclick ); lastMouseup = now; // If the mouse has been clicked, don't record this time as an interval between keypresses. lastKeydown = null; lastKeyup = null; keydowns = {}; }, supportsPassive ? { passive: true } : false ); document.addEventListener( 'mousemove', function ( e ) { if ( mousemoveTimer ) { clearTimeout( mousemoveTimer ); mousemoveTimer = null; } else { mousemoveStart = ( new Date() ).getTime(); lastMousemoveX = e.offsetX; lastMousemoveY = e.offsetY; } mousemoveTimer = setTimeout( function ( theEvent, originalMousemoveStart ) { var now = ( new Date() ).getTime() - 500; // To account for the timer delay. var mousemove = []; mousemove.push( now - originalMousemoveStart ); mousemove.push( Math.round( Math.sqrt( Math.pow( theEvent.offsetX - lastMousemoveX, 2 ) + Math.pow( theEvent.offsetY - lastMousemoveY, 2 ) ) ) ); if ( mousemove[1] > 0 ) { // If there was no measurable distance, then it wasn't really a move. mousemoves.push( mousemove ); } mousemoveStart = null; mousemoveTimer = null; }, 500, e, mousemoveStart ); }, supportsPassive ? { passive: true } : false ); document.addEventListener( 'touchmove', function ( e ) { if ( touchmoveCountTimer ) { clearTimeout( touchmoveCountTimer ); } touchmoveCountTimer = setTimeout( function () { touchmoveCount++; }, 500 ); }, supportsPassive ? { passive: true } : false ); document.addEventListener( 'touchstart', function ( e ) { lastTouchStart = ( new Date() ).getTime(); }, supportsPassive ? { passive: true } : false ); document.addEventListener( 'touchend', function ( e ) { if ( ! lastTouchStart ) { // If the touchstart happened before this script was loaded, but the touchend happened after... return; } var now = ( new Date() ).getTime(); var touchEvent = []; touchEvent.push( now - lastTouchStart ); if ( lastTouchEnd ) { touchEvent.push( lastTouchStart - lastTouchEnd ); } touchEvents.push( touchEvent ); lastTouchEnd = now; // Don't record this time as an interval between keypresses. lastKeydown = null; lastKeyup = null; keydowns = {}; }, supportsPassive ? { passive: true } : false ); document.addEventListener( 'scroll', function ( e ) { if ( scrollCountTimer ) { clearTimeout( scrollCountTimer ); } scrollCountTimer = setTimeout( function () { scrollCount++; }, 500 ); }, supportsPassive ? { passive: true } : false ); } /** * For the timestamp data that is collected, don't send more than `limit` data points in the request. * Choose a random slice and send those. */ function prepare_timestamp_array_for_request( a, limit ) { if ( ! limit ) { limit = 100; } var rv = ''; if ( a.length > 0 ) { var random_starting_point = Math.max( 0, Math.floor( Math.random() * a.length - limit ) ); for ( var i = 0; i < limit && i < a.length; i++ ) { rv += a[ random_starting_point + i ][0]; if ( a[ random_starting_point + i ].length >= 2 ) { rv += "," + a[ random_starting_point + i ][1]; } rv += ";"; } } return rv; } if ( document.readyState !== 'loading' ) { init(); } else { document.addEventListener( 'DOMContentLoaded', init ); } })();PKwL\akismet/_inc/akismet-admin.jsnu[document.addEventListener( 'DOMContentLoaded', function() { // Prevent aggressive iframe caching in Firefox var statsIframe = document.getElementById( 'stats-iframe' ); if ( statsIframe ) { statsIframe.contentWindow.location.href = statsIframe.src; } } );PKwL\33akismet/_inc/akismet.jsnu[jQuery( function ( $ ) { var mshotRemovalTimer = null; var mshotRetryTimer = null; var mshotTries = 0; var mshotRetryInterval = 1000; var mshotEnabledLinkSelector = 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a'; var preloadedMshotURLs = []; $('.akismet-status').each(function () { var thisId = $(this).attr('commentid'); $(this).prependTo('#comment-' + thisId + ' .column-comment'); }); $('.akismet-user-comment-count').each(function () { var thisId = $(this).attr('commentid'); $(this).insertAfter('#comment-' + thisId + ' .author strong:first').show(); }); akismet_enable_comment_author_url_removal(); $( '#the-comment-list' ).on( 'click', '.akismet_remove_url', function () { var thisId = $(this).attr('commentid'); var data = { action: 'comment_author_deurl', _wpnonce: WPAkismet.comment_author_url_nonce, id: thisId }; $.ajax({ url: ajaxurl, type: 'POST', data: data, beforeSend: function () { // Removes "x" link $("a[commentid='"+ thisId +"']").hide(); // Show temp status $("#author_comment_url_"+ thisId).html( $( '' ).text( WPAkismet.strings['Removing...'] ) ); }, success: function (response) { if (response) { // Show status/undo link $("#author_comment_url_"+ thisId) .attr('cid', thisId) .addClass('akismet_undo_link_removal') .html( $( '' ).text( WPAkismet.strings['URL removed'] ) ) .append( ' ' ) .append( $( '' ) .text( WPAkismet.strings['(undo)'] ) .addClass( 'akismet-span-link' ) ); } } }); return false; }).on( 'click', '.akismet_undo_link_removal', function () { var thisId = $(this).attr('cid'); var thisUrl = $(this).attr('href'); var data = { action: 'comment_author_reurl', _wpnonce: WPAkismet.comment_author_url_nonce, id: thisId, url: thisUrl }; $.ajax({ url: ajaxurl, type: 'POST', data: data, beforeSend: function () { // Show temp status $("#author_comment_url_"+ thisId).html( $( '' ).text( WPAkismet.strings['Re-adding...'] ) ); }, success: function (response) { if (response) { // Add "x" link $("a[commentid='"+ thisId +"']").show(); // Show link. Core strips leading http://, so let's do that too. $("#author_comment_url_"+ thisId).removeClass('akismet_undo_link_removal').text( thisUrl.replace( /^http:\/\/(www\.)?/ig, '' ) ); } } }); return false; }); // Show a preview image of the hovered URL. Applies to author URLs and URLs inside the comments. if ( "enable_mshots" in WPAkismet && WPAkismet.enable_mshots ) { $( '#the-comment-list' ).on( 'mouseover', mshotEnabledLinkSelector, function () { clearTimeout( mshotRemovalTimer ); if ( $( '.akismet-mshot' ).length > 0 ) { if ( $( '.akismet-mshot:first' ).data( 'link' ) == this ) { // The preview is already showing for this link. return; } else { // A new link is being hovered, so remove the old preview. $( '.akismet-mshot' ).remove(); } } clearTimeout( mshotRetryTimer ); var linkUrl = $( this ).attr( 'href' ); if ( preloadedMshotURLs.indexOf( linkUrl ) !== -1 ) { // This preview image was already preloaded, so begin with a retry URL so the user doesn't see the placeholder image for the first second. mshotTries = 2; } else { mshotTries = 1; } var mShot = $( '
' ); mShot.data( 'link', this ); mShot.data( 'url', linkUrl ); mShot.find( 'img' ).on( 'load', function () { $( '.akismet-mshot' ).data( 'pending-request', false ); } ); var offset = $( this ).offset(); mShot.offset( { left : Math.min( $( window ).width() - 475, offset.left + $( this ).width() + 10 ), // Keep it on the screen if the link is near the edge of the window. top: offset.top + ( $( this ).height() / 2 ) - 101 // 101 = top offset of the arrow plus the top border thickness } ); $( 'body' ).append( mShot ); mshotRetryTimer = setTimeout( retryMshotUntilLoaded, mshotRetryInterval ); } ).on( 'mouseout', 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a', function () { mshotRemovalTimer = setTimeout( function () { clearTimeout( mshotRetryTimer ); $( '.akismet-mshot' ).remove(); }, 200 ); } ); var preloadDelayTimer = null; $( window ).on( 'scroll resize', function () { clearTimeout( preloadDelayTimer ); preloadDelayTimer = setTimeout( preloadMshotsInViewport, 500 ); } ); preloadMshotsInViewport(); } /** * The way mShots works is if there was no screenshot already recently generated for the URL, * it returns a "loading..." image for the first request. Then, some subsequent request will * receive the actual screenshot, but it's unknown how long it will take. So, what we do here * is continually re-request the mShot, waiting a second after every response until we get the * actual screenshot. */ function retryMshotUntilLoaded() { clearTimeout( mshotRetryTimer ); var imageWidth = $( '.akismet-mshot img' ).get(0).naturalWidth; if ( imageWidth == 0 ) { // It hasn't finished loading yet the first time. Check again shortly. setTimeout( retryMshotUntilLoaded, mshotRetryInterval ); } else if ( imageWidth == 400 ) { // It loaded the preview image. if ( mshotTries == 20 ) { // Give up if we've requested the mShot 20 times already. return; } if ( ! $( '.akismet-mshot' ).data( 'pending-request' ) ) { $( '.akismet-mshot' ).data( 'pending-request', true ); mshotTries++; $( '.akismet-mshot .mshot-image' ).attr( 'src', akismet_mshot_url( $( '.akismet-mshot' ).data( 'url' ), mshotTries ) ); } mshotRetryTimer = setTimeout( retryMshotUntilLoaded, mshotRetryInterval ); } else { // All done. } } function preloadMshotsInViewport() { var windowWidth = $( window ).width(); var windowHeight = $( window ).height(); $( '#the-comment-list' ).find( mshotEnabledLinkSelector ).each( function ( index, element ) { var linkUrl = $( this ).attr( 'href' ); // Don't attempt to preload an mshot for a single link twice. if ( preloadedMshotURLs.indexOf( linkUrl ) !== -1 ) { // The URL is already preloaded. return true; } if ( typeof element.getBoundingClientRect !== 'function' ) { // The browser is too old. Return false to stop this preloading entirely. return false; } var rect = element.getBoundingClientRect(); if ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth ) { akismet_preload_mshot( linkUrl ); $( this ).data( 'akismet-mshot-preloaded', true ); } } ); } $( '.checkforspam.enable-on-load' ).on( 'click', function( e ) { if ( $( this ).hasClass( 'ajax-disabled' ) ) { // Akismet hasn't been configured yet. Allow the user to proceed to the button's link. return; } e.preventDefault(); if ( $( this ).hasClass( 'button-disabled' ) ) { window.location.href = $( this ).data( 'success-url' ).replace( '__recheck_count__', 0 ).replace( '__spam_count__', 0 ); return; } $('.checkforspam').addClass('button-disabled').addClass( 'checking' ); $('.checkforspam-spinner').addClass( 'spinner' ).addClass( 'is-active' ); akismet_check_for_spam(0, 100); }).removeClass( 'button-disabled' ); var spam_count = 0; var recheck_count = 0; function akismet_check_for_spam(offset, limit) { var check_for_spam_buttons = $( '.checkforspam' ); var nonce = check_for_spam_buttons.data( 'nonce' ); // We show the percentage complete down to one decimal point so even queues with 100k // pending comments will show some progress pretty quickly. var percentage_complete = Math.round( ( recheck_count / check_for_spam_buttons.data( 'pending-comment-count' ) ) * 1000 ) / 10; // Update the progress counter on the "Check for Spam" button. $( '.checkforspam' ).text( check_for_spam_buttons.data( 'progress-label' ).replace( '%1$s', percentage_complete ) ); $.post( ajaxurl, { 'action': 'akismet_recheck_queue', 'offset': offset, 'limit': limit, 'nonce': nonce }, function(result) { if ( 'error' in result ) { // An error is only returned in the case of a missing nonce, so we don't need the actual error message. window.location.href = check_for_spam_buttons.data( 'failure-url' ); return; } recheck_count += result.counts.processed; spam_count += result.counts.spam; if (result.counts.processed < limit) { window.location.href = check_for_spam_buttons.data( 'success-url' ).replace( '__recheck_count__', recheck_count ).replace( '__spam_count__', spam_count ); } else { // Account for comments that were caught as spam and moved out of the queue. akismet_check_for_spam(offset + limit - result.counts.spam, limit); } } ); } if ( "start_recheck" in WPAkismet && WPAkismet.start_recheck ) { $( '.checkforspam' ).click(); } if ( typeof MutationObserver !== 'undefined' ) { // Dynamically add the "X" next the the author URL links when a comment is quick-edited. var comment_list_container = document.getElementById( 'the-comment-list' ); if ( comment_list_container ) { var observer = new MutationObserver( function ( mutations ) { for ( var i = 0, _len = mutations.length; i < _len; i++ ) { if ( mutations[i].addedNodes.length > 0 ) { akismet_enable_comment_author_url_removal(); // Once we know that we'll have to check for new author links, skip the rest of the mutations. break; } } } ); observer.observe( comment_list_container, { attributes: true, childList: true, characterData: true } ); } } function akismet_enable_comment_author_url_removal() { $( '#the-comment-list' ) .find( 'tr.comment, tr[id ^= "comment-"]' ) .find( '.column-author a[href^="http"]:first' ) // Ignore mailto: links, which would be the comment author's email. .each(function () { if ( $( this ).parent().find( '.akismet_remove_url' ).length > 0 ) { return; } var linkHref = $(this).attr( 'href' ); // Ignore any links to the current domain, which are diagnostic tools, like the IP address link // or any other links another plugin might add. var currentHostParts = document.location.href.split( '/' ); var currentHost = currentHostParts[0] + '//' + currentHostParts[2] + '/'; if ( linkHref.indexOf( currentHost ) != 0 ) { var thisCommentId = $(this).parents('tr:first').attr('id').split("-"); $(this) .attr("id", "author_comment_url_"+ thisCommentId[1]) .after( $( 'x' ) .attr( 'commentid', thisCommentId[1] ) .attr( 'title', WPAkismet.strings['Remove this URL'] ) ); } }); } /** * Generate an mShot URL if given a link URL. * * @param string linkUrl * @param int retry If retrying a request, the number of the retry. * @return string The mShot URL; */ function akismet_mshot_url( linkUrl, retry ) { var mshotUrl = '//s0.wp.com/mshots/v1/' + encodeURIComponent( linkUrl ) + '?w=900'; if ( retry > 1 ) { mshotUrl += '&r=' + encodeURIComponent( retry ); } mshotUrl += '&source=akismet'; return mshotUrl; } /** * Begin loading an mShot preview of a link. * * @param string linkUrl */ function akismet_preload_mshot( linkUrl ) { var img = new Image(); img.src = akismet_mshot_url( linkUrl ); preloadedMshotURLs.push( linkUrl ); } $( '.akismet-could-be-primary' ).each( function () { var form = $( this ).closest( 'form' ); form.data( 'initial-state', form.serialize() ); form.on( 'change keyup', function () { var self = $( this ); var submit_button = self.find( '.akismet-could-be-primary' ); if ( self.serialize() != self.data( 'initial-state' ) ) { submit_button.addClass( 'akismet-is-primary' ); } else { submit_button.removeClass( 'akismet-is-primary' ); } } ); } ); /** * Shows the Enter API key form */ $( '.akismet-enter-api-key-box__reveal' ).on( 'click', function ( e ) { e.preventDefault(); var div = $( '.akismet-enter-api-key-box__form-wrapper' ); div.show( 500 ); div.find( 'input[name=key]' ).focus(); $( this ).hide(); } ); /** * Hides the Connect with Jetpack form | Shows the Activate Akismet Account form */ $( 'a.toggle-ak-connect' ).on( 'click', function ( e ) { e.preventDefault(); $( '.akismet-ak-connect' ).slideToggle('slow'); $( 'a.toggle-ak-connect' ).hide(); $( '.akismet-jp-connect' ).hide(); $( 'a.toggle-jp-connect' ).show(); } ); /** * Shows the Connect with Jetpack form | Hides the Activate Akismet Account form */ $( 'a.toggle-jp-connect' ).on( 'click', function ( e ) { e.preventDefault(); $( '.akismet-jp-connect' ).slideToggle('slow'); $( 'a.toggle-jp-connect' ).hide(); $( '.akismet-ak-connect' ).hide(); $( 'a.toggle-ak-connect' ).show(); } ); }); PKwL\RUUakismet/changelog.txtnu[=== Akismet Anti-spam === == Archived Changelog Entries == This file contains older changelog entries, so we can keep the size of the standard WordPress readme.txt file reasonable. For the latest changes, please see the "Changelog" section of the [readme.txt file](https://plugins.svn.wordpress.org/akismet/trunk/readme.txt). = 4.1.12 = *Release Date - 3 September 2021* * Fixed "Use of undefined constant" notice. * Improved styling of alert notices. = 4.1.11 = *Release Date - 23 August 2021* * Added support for Akismet API usage notifications on Akismet settings and edit-comments admin pages. * Added support for the deleted_comment action when bulk-deleting comments from Spam. = 4.1.10 = *Release Date - 6 July 2021* * Simplified the code around checking comments in REST API and XML-RPC requests. * Updated Plus plan terminology in notices to match current subscription names. * Added `rel="noopener"` to the widget link to avoid warnings in Google Lighthouse. * Set the Akismet JavaScript as deferred instead of async to improve responsiveness. * Improved the preloading of screenshot popups on the edit comments admin page. = 4.1.9 = *Release Date - 2 March 2021* * Improved handling of pingbacks in XML-RPC multicalls = 4.1.8 = *Release Date - 6 January 2021* * Fixed missing fields in submit-spam and submit-ham calls that could lead to reduced accuracy. * Fixed usage of deprecated jQuery function. = 4.1.7 = *Release Date - 22 October 2020* * Show the "Set up your Akismet account" banner on the comments admin screen, where it's relevant to mention if Akismet hasn't been configured. * Don't use wp_blacklist_check when the new wp_check_comment_disallowed_list function is available. = 4.1.6 = *Release Date - 4 June 2020* * Disable "Check for Spam" button until the page is loaded to avoid errors with clicking through to queue recheck endpoint directly. * Added filter "akismet_enable_mshots" to allow disabling screenshot popups on the edit comments admin page. = 4.1.5 = *Release Date - 29 April 2020* * Based on user feedback, we have dropped the in-admin notice explaining the availability of the "privacy notice" option in the AKismet settings screen. The option itself is available, but after displaying the notice for the last 2 years, it is now considered a known fact. * Updated the "Requires at least" to WP 4.6, based on recommendations from https://wp-info.org/tools/checkplugini18n.php?slug=akismet * Moved older changelog entries to a separate file to keep the size of this readme reasonable, also based on recommendations from https://wp-info.org/tools/checkplugini18n.php?slug=akismet = 4.1.4 = *Release Date - 17 March 2020* * Only redirect to the Akismet setup screen upon plugin activation if the plugin was activated manually from within the plugin-related screens, to help users with non-standard install workflows, like WP-CLI. * Update the layout of the initial setup screen to be more readable on small screens. * If no API key has been entered, don't run code that expects an API key. * Improve the readability of the comment history entries. * Don't modify the comment form HTML if no API key has been set. = 4.1.3 = *Release Date - 31 October 2019* * Prevented an attacker from being able to cause a user to unknowingly recheck their Pending comments for spam. * Improved compatibility with Jetpack 7.7+. * Updated the plugin activation page to use consistent language and markup. * Redirecting users to the Akismet connnection/settings screen upon plugin activation, in an effort to make it easier for people to get setup. = 4.1.2 = *Release Date - 14 May 2019* * Fixed a conflict between the Akismet setup banner and other plugin notices. * Reduced the number of API requests made by the plugin when attempting to verify the API key. * Include additional data in the pingback pre-check API request to help make the stats more accurate. * Fixed a bug that was enabling the "Check for Spam" button when no comments were eligible to be checked. * Improved Akismet's AMP compatibility. = 4.1.1 = *Release Date - 31 January 2019* * Fixed the "Setup Akismet" notice so it resizes responsively. * Only highlight the "Save Changes" button in the Akismet config when changes have been made. * The count of comments in your spam queue shown on the dashboard show now always be up-to-date. = 4.1 = *Release Date - 12 November 2018* * Added a WP-CLI method for retrieving stats. * Hooked into the new "Personal Data Eraser" functionality from WordPress 4.9.6. * Added functionality to clear outdated alerts from Akismet.com. = 4.0.8 = *Release Date - 19 June 2018* * Improved the grammar and consistency of the in-admin privacy related notes (notice and config). * Revised in-admin explanation of the comment form privacy notice to make its usage clearer. * Added `rel="nofollow noopener"` to the comment form privacy notice to improve SEO and security. = 4.0.7 = *Release Date - 28 May 2018* * Based on user feedback, the link on "Learn how your comment data is processed." in the optional privacy notice now has a `target` of `_blank` and opens in a new tab/window. * Updated the in-admin privacy notice to use the term "comment" instead of "contact" in "Akismet can display a notice to your users under your comment forms." * Only show in-admin privacy notice if Akismet has an API Key configured = 4.0.6 = *Release Date - 26 May 2018* * Moved away from using `empty( get_option() )` to instantiating a variable to be compatible with older versions of PHP (5.3, 5.4, etc). = 4.0.5 = *Release Date - 26 May 2018* * Corrected version number after tagging. Sorry... = 4.0.4 = *Release Date - 26 May 2018* * Added a hook to provide Akismet-specific privacy information for a site's privacy policy. * Added tools to control the display of a privacy related notice under comment forms. * Fixed HTML in activation failure message to close META and HEAD tag properly. * Fixed a bug that would sometimes prevent Akismet from being correctly auto-configured. = 4.0.3 = *Release Date - 19 February 2018* * Added a scheduled task to remove entries in wp_commentmeta that no longer have corresponding comments in wp_comments. * Added a new `akismet_batch_delete_count` action to the batch delete methods for people who'd like to keep track of the numbers of records being processed by those methods. = 4.0.2 = *Release Date - 18 December 2017* * Fixed a bug that could cause Akismet to recheck a comment that has already been manually approved or marked as spam. * Fixed a bug that could cause Akismet to claim that some comments are still waiting to be checked when no comments are waiting to be checked. = 4.0.1 = *Release Date - 6 November 2017* * Fixed a bug that could prevent some users from connecting Akismet via their Jetpack connection. * Ensured that any pending Akismet-related events are unscheduled if the plugin is deactivated. * Allow some JavaScript to be run asynchronously to avoid affecting page render speeds. = 4.0 = *Release Date - 19 September 2017* * Added REST API endpoints for configuring Akismet and retrieving stats. * Increased the minimum supported WordPress version to 4.0. * Added compatibility with comments submitted via the REST API. * Improved the progress indicator on the "Check for Spam" button. = 3.3.4 = *Release Date - 3 August 2017* * Disabled Akismet's debug log output by default unless AKISMET_DEBUG is defined. * URL previews now begin preloading when the mouse moves near them in the comments section of wp-admin. * When a comment is caught by the Comment Blacklist, Akismet will always allow it to stay in the trash even if it is spam as well. * Fixed a bug that was preventing an error from being shown when a site can't reach Akismet's servers. = 3.3.3 = *Release Date - 13 July 2017* * Reduced amount of bandwidth used by the URL Preview feature. * Improved the admin UI when the API key is manually pre-defined for the site. * Removed a workaround for WordPress installations older than 3.3 that will improve Akismet's compatibility with other plugins. * The number of spam blocked that is displayed on the WordPress dashboard will now be more accurate and updated more frequently. * Fixed a bug in the Akismet widget that could cause PHP warnings. = 3.3.2 = *Release Date - 10 May 2017* * Fixed a bug causing JavaScript errors in some browsers. = 3.3.1 = *Release Date - 2 May 2017* * Improve performance by only requesting the akismet_comment_nonce option when absolutely necessary. * Fixed two bugs that could cause PHP warnings. * Fixed a bug that was preventing the "Remove author URL" feature from working after a comment was edited using "Quick Edit." * Fixed a bug that was preventing the URL preview feature from working after a comment was edited using "Quick Edit." = 3.3 = *Release Date - 23 February 2017* * Updated the Akismet admin pages with a new clean design. * Fixed bugs preventing the `akismet_add_comment_nonce` and `akismet_update_alert` wrapper functions from working properly. * Fixed bug preventing the loading indicator from appearing when re-checking all comments for spam. * Added a progress indicator to the "Check for Spam" button. * Added a success message after manually rechecking the Pending queue for spam. = 3.2 = *Release Date - 6 September 2016* * Added a WP-CLI module. You can now check comments and recheck the moderation queue from the command line. * Stopped using the deprecated jQuery function `.live()`. * Fixed a bug in `remove_comment_author_url()` and `add_comment_author_url()` that could generate PHP notices. * Fixed a bug that could cause an infinite loop for sites with very very very large comment IDs. * Fixed a bug that could cause the Akismet widget title to be blank. = 3.1.11 = *Release Date - 12 May 2016* * Fixed a bug that could cause the "Check for Spam" button to skip some comments. * Fixed a bug that could prevent some spam submissions from being sent to Akismet. * Updated all links to use https:// when possible. * Disabled Akismet debug logging unless WP_DEBUG and WP_DEBUG_LOG are both enabled. = 3.1.10 = *Release Date - 1 April 2016* * Fixed a bug that could cause comments caught as spam to be placed in the Pending queue. * Fixed a bug that could have resulted in comments that were caught by the core WordPress comment blacklist not to have a corresponding History entry. * Fixed a bug that could have caused avoidable PHP warnings in the error log. = 3.1.9 = *Release Date - 28 March 2016* * Add compatibility with Jetpack so that Jetpack can automatically configure Akismet settings when appropriate. * Fixed a bug preventing some comment data from being sent to Akismet. = 3.1.8 = *Release Date - 4 March 2016* * Fixed a bug preventing Akismet from being used with some plugins that rewrite admin URLs. * Reduced the amount of bandwidth used on Akismet API calls * Reduced the amount of space Akismet uses in the database * Fixed a bug that could cause comments caught as spam to be placed in the Pending queue. = 3.1.7 = *Release Date - 4 January 2016* * Added documentation for the 'akismet_comment_nonce' filter. * The post-install activation button is now accessible to screen readers and keyboard-only users. * Fixed a bug that was preventing the "Remove author URL" feature from working in WordPress 4.4 = 3.1.6 = *Release Date - 14 December 2015* * Improve the notices shown after activating Akismet. * Update some strings to allow for the proper plural forms in all languages. = 3.1.5 = *Release Date - 13 October 2015* * Closes a potential XSS vulnerability. = 3.1.4 = *Release Date - 24 September 2015* * Fixed a bug that was preventing some users from automatically connecting using Jetpack if they didn't have a current Akismet subscription. * Fixed a bug that could cause comments caught as spam to be placed in the Pending queue. * Error messages and instructions have been simplified to be more understandable. * Link previews are enabled for all links inside comments, not just the author's website link. = 3.1.3 = *Release Date - 6 July 2015* * Notify users when their account status changes after previously being successfully set up. This should help any users who are seeing blank Akismet settings screens. = 3.1.2 = *Release Date - 7 June 2015* * Reduced the amount of space Akismet uses in the commentmeta table. * Fixed a bug where some comments with quotes in the author name weren't getting history entries * Pre-emptive security improvements to ensure that the Akismet plugin can't be used by attackers to compromise a WordPress installation. * Better UI for the key entry field: allow whitespace to be included at the beginning or end of the key and strip it out automatically when the form is submitted. * When deactivating the plugin, notify the Akismet API so the site can be marked as inactive. * Clearer error messages. = 3.1.1 = *Release Date - 17th March, 2015* * Improvements to the "Remove comment author URL" JavaScript * Include the pingback pre-check from the 2.6 branch. = 3.1 = *Release Date - 11th March, 2015* * Use HTTPS by default for all requests to Akismet. * Fix for a situation where Akismet might strip HTML from a comment. = 3.0.4 = *Release Date - 11th December, 2014* * Fix to make .htaccess compatible with Apache 2.4. * Fix to allow removal of https author URLs. * Fix to avoid stripping part of the author URL when removing and re-adding. * Removed the "Check for Spam" button from the "Trash" and "Approved" queues, where it would have no effect. * Allow automatic API key configuration when Jetpack is installed and connected to a WordPress.com account = 3.0.3 = *Release Date - 3rd November, 2014* * Fix for sending the wrong data to delete_comment action that could have prevented old spam comments from being deleted. * Added a filter to disable logging of Akismet debugging information. * Added a filter for the maximum comment age when deleting old spam comments. * Added a filter for the number per batch when deleting old spam comments. * Removed the "Check for Spam" button from the Spam folder. = 3.0.2 = *Release Date - 18th August, 2014* * Performance improvements. * Fixed a bug that could truncate the comment data being sent to Akismet for checking. = 3.0.1 = *Release Date - 9th July, 2014* * Removed dependency on PHP's fsockopen function * Fix spam/ham reports to work when reported outside of the WP dashboard, e.g., from Notifications or the WP app * Remove jQuery dependency for comment form JavaScript * Remove unnecessary data from some Akismet comment meta * Suspended keys will now result in all comments being put in moderation, not spam. = 3.0.0 = *Release Date - 15th April, 2014* * Move Akismet to Settings menu * Drop Akismet Stats menu * Add stats snapshot to Akismet settings * Add Akismet subscription details and status to Akismet settings * Add contextual help for each page * Improve Akismet setup to use Jetpack to automate plugin setup * Fix "Check for Spam" to use AJAX to avoid page timing out * Fix Akismet settings page to be responsive * Drop legacy code * Tidy up CSS and Javascript * Replace the old discard setting with a new "discard pervasive spam" feature. = 2.6.0 = *Release Date - 18th March, 2014* * Add ajax paging to the check for spam button to handle large volumes of comments * Optimize javascript and add localization support * Fix bug in link to spam comments from right now dashboard widget * Fix bug with deleting old comments to avoid timeouts dealing with large volumes of comments * Include X-Pingback-Forwarded-For header in outbound WordPress pingback verifications * Add pre-check for pingbacks, to stop spam before an outbound verification request is made = 2.5.9 = *Release Date - 1st August, 2013* * Update 'Already have a key' link to redirect page rather than depend on javascript * Fix some non-translatable strings to be translatable * Update Activation banner in plugins page to redirect user to Akismet config page = 2.5.8 = *Release Date - 20th January, 2013* * Simplify the activation process for new users * Remove the reporter_ip parameter * Minor preventative security improvements = 2.5.7 = *Release Date - 13th December, 2012* * FireFox Stats iframe preview bug * Fix mshots preview when using https * Add .htaccess to block direct access to files * Prevent some PHP notices * Fix Check For Spam return location when referrer is empty * Fix Settings links for network admins * Fix prepare() warnings in WP 3.5 = 2.5.6 = *Release Date - 26th April, 2012* * Prevent retry scheduling problems on sites where wp_cron is misbehaving * Preload mshot previews * Modernize the widget code * Fix a bug where comments were not held for moderation during an error condition * Improve the UX and display when comments are temporarily held due to an error * Make the Check For Spam button force a retry when comments are held due to an error * Handle errors caused by an invalid key * Don't retry comments that are too old * Improve error messages when verifying an API key = 2.5.5 = *Release Date - 11th January, 2012* * Add nonce check for comment author URL remove action * Fix the settings link = 2.5.4 = *Release Date - 5th January, 2012* * Limit Akismet CSS and Javascript loading in wp-admin to just the pages that need it * Added author URL quick removal functionality * Added mShot preview on Author URL hover * Added empty index.php to prevent directory listing * Move wp-admin menu items under Jetpack, if it is installed * Purge old Akismet comment meta data, default of 15 days = 2.5.3 = *Release Date - 8th Febuary, 2011* * Specify the license is GPL v2 or later * Fix a bug that could result in orphaned commentmeta entries * Include hotfix for WordPress 3.0.5 filter issue = 2.5.2 = *Release Date - 14th January, 2011* * Properly format the comment count for author counts * Look for super admins on multisite installs when looking up user roles * Increase the HTTP request timeout * Removed padding for author approved count * Fix typo in function name * Set Akismet stats iframe height to fixed 2500px. Better to have one tall scroll bar than two side by side. = 2.5.1 = *Release Date - 17th December, 2010* * Fix a bug that caused the "Auto delete" option to fail to discard comments correctly * Remove the comment nonce form field from the 'Akismet Configuration' page in favor of using a filter, akismet_comment_nonce * Fixed padding bug in "author" column of posts screen * Added margin-top to "cleared by ..." badges on dashboard * Fix possible error when calling akismet_cron_recheck() * Fix more PHP warnings * Clean up XHTML warnings for comment nonce * Fix for possible condition where scheduled comment re-checks could get stuck * Clean up the comment meta details after deleting a comment * Only show the status badge if the comment status has been changed by someone/something other than Akismet * Show a 'History' link in the row-actions * Translation fixes * Reduced font-size on author name * Moved "flagged by..." notification to top right corner of comment container and removed heavy styling * Hid "flagged by..." notification while on dashboard = 2.5.0 = *Release Date - 7th December, 2010* * Track comment actions under 'Akismet Status' on the edit comment screen * Fix a few remaining deprecated function calls ( props Mike Glendinning ) * Use HTTPS for the stats IFRAME when wp-admin is using HTTPS * Use the WordPress HTTP class if available * Move the admin UI code to a separate file, only loaded when needed * Add cron retry feature, to replace the old connectivity check * Display Akismet status badge beside each comment * Record history for each comment, and display it on the edit page * Record the complete comment as originally submitted in comment_meta, to use when reporting spam and ham * Highlight links in comment content * New option, "Show the number of comments you've approved beside each comment author." * New option, "Use a nonce on the comment form." = 2.4.0 = *Release Date - 23rd August, 2010* * Spell out that the license is GPLv2 * Fix PHP warnings * Fix WordPress deprecated function calls * Fire the delete_comment action when deleting comments * Move code specific for older WP versions to legacy.php * General code clean up = 2.3.0 = *Release Date - 5th June, 2010* * Fix "Are you sure" nonce message on config screen in WPMU * Fix XHTML compliance issue in sidebar widget * Change author link; remove some old references to WordPress.com accounts * Localize the widget title (core ticket #13879) = 2.2.9 = *Release Date - 2nd June, 2010* * Eliminate a potential conflict with some plugins that may cause spurious reports = 2.2.8 = *Release Date - 27th May, 2010* * Fix bug in initial comment check for ipv6 addresses * Report comments as ham when they are moved from spam to moderation * Report comments as ham when clicking undo after spam * Use transition_comment_status action when available instead of older actions for spam/ham submissions * Better diagnostic messages when PHP network functions are unavailable * Better handling of comments by logged-in users = 2.2.7 = *Release Date - 17th December, 2009* * Add a new AKISMET_VERSION constant * Reduce the possibility of over-counting spam when another spam filter plugin is in use * Disable the connectivity check when the API key is hard-coded for WPMU = 2.2.6 = *Release Date - 20th July, 2009* * Fix a global warning introduced in 2.2.5 * Add changelog and additional readme.txt tags * Fix an array conversion warning in some versions of PHP * Support a new WPCOM_API_KEY constant for easier use with WordPress MU = 2.2.5 = *Release Date - 13th July, 2009* * Include a new Server Connectivity diagnostic check, to detect problems caused by firewalls = 2.2.4 = *Release Date - 3rd June, 2009* * Fixed a key problem affecting the stats feature in WordPress MU * Provide additional blog information in Akismet API calls PKwL\4&&akismet/wrapper.phpnu[ Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. PKwL\E:GEGE"akismet/class.akismet-rest-api.phpnu[ WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_key' ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'set_key' ), 'args' => array( 'key' => array( 'required' => true, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ), array( 'methods' => WP_REST_Server::DELETABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'delete_key' ), ) ) ); register_rest_route( 'akismet/v1', '/settings/', array( array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_settings' ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'set_boolean_settings' ), 'args' => array( 'akismet_strictness' => array( 'required' => false, 'type' => 'boolean', 'description' => __( 'If true, Akismet will automatically discard the worst spam automatically rather than putting it in the spam folder.', 'akismet' ), ), 'akismet_show_user_comments_approved' => array( 'required' => false, 'type' => 'boolean', 'description' => __( 'If true, show the number of approved comments beside each comment author in the comments list page.', 'akismet' ), ), ), ) ) ); register_rest_route( 'akismet/v1', '/stats', array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_stats' ), 'args' => array( 'interval' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_interval' ), 'description' => __( 'The time period for which to retrieve stats. Options: 60-days, 6-months, all', 'akismet' ), 'default' => 'all', ), ), ) ); register_rest_route( 'akismet/v1', '/stats/(?P[\w+])', array( 'args' => array( 'interval' => array( 'description' => __( 'The time period for which to retrieve stats. Options: 60-days, 6-months, all', 'akismet' ), 'type' => 'string', ), ), array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_stats' ), ) ) ); register_rest_route( 'akismet/v1', '/alert', array( array( 'methods' => WP_REST_Server::READABLE, 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'get_alert' ), 'args' => array( 'key' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ), array( 'methods' => WP_REST_Server::EDITABLE, 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'set_alert' ), 'args' => array( 'key' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ), array( 'methods' => WP_REST_Server::DELETABLE, 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), 'callback' => array( 'Akismet_REST_API', 'delete_alert' ), 'args' => array( 'key' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), ), ), ) ) ); register_rest_route( 'akismet/v1', '/webhook', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( 'Akismet_REST_API', 'receive_webhook' ), 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), ) ); } /** * Get the current Akismet API key. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_key( $request = null ) { return rest_ensure_response( Akismet::get_api_key() ); } /** * Set the API key, if possible. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function set_key( $request ) { if ( defined( 'WPCOM_API_KEY' ) ) { return rest_ensure_response( new WP_Error( 'hardcoded_key', __( 'This site\'s API key is hardcoded and cannot be changed via the API.', 'akismet' ), array( 'status'=> 409 ) ) ); } $new_api_key = $request->get_param( 'key' ); if ( ! self::key_is_valid( $new_api_key ) ) { return rest_ensure_response( new WP_Error( 'invalid_key', __( 'The value provided is not a valid and registered API key.', 'akismet' ), array( 'status' => 400 ) ) ); } update_option( 'wordpress_api_key', $new_api_key ); return self::get_key(); } /** * Unset the API key, if possible. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function delete_key( $request ) { if ( defined( 'WPCOM_API_KEY' ) ) { return rest_ensure_response( new WP_Error( 'hardcoded_key', __( 'This site\'s API key is hardcoded and cannot be deleted.', 'akismet' ), array( 'status'=> 409 ) ) ); } delete_option( 'wordpress_api_key' ); return rest_ensure_response( true ); } /** * Get the Akismet settings. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_settings( $request = null ) { return rest_ensure_response( array( 'akismet_strictness' => ( get_option( 'akismet_strictness', '1' ) === '1' ), 'akismet_show_user_comments_approved' => ( get_option( 'akismet_show_user_comments_approved', '1' ) === '1' ), ) ); } /** * Update the Akismet settings. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function set_boolean_settings( $request ) { foreach ( array( 'akismet_strictness', 'akismet_show_user_comments_approved', ) as $setting_key ) { $setting_value = $request->get_param( $setting_key ); if ( is_null( $setting_value ) ) { // This setting was not specified. continue; } // From 4.7+, WP core will ensure that these are always boolean // values because they are registered with 'type' => 'boolean', // but we need to do this ourselves for prior versions. $setting_value = Akismet_REST_API::parse_boolean( $setting_value ); update_option( $setting_key, $setting_value ? '1' : '0' ); } return self::get_settings(); } /** * Parse a numeric or string boolean value into a boolean. * * @param mixed $value The value to convert into a boolean. * @return bool The converted value. */ public static function parse_boolean( $value ) { switch ( $value ) { case true: case 'true': case '1': case 1: return true; case false: case 'false': case '0': case 0: return false; default: return (bool) $value; } } /** * Get the Akismet stats for a given time period. * * Possible `interval` values: * - all * - 60-days * - 6-months * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_stats( $request ) { $api_key = Akismet::get_api_key(); $interval = $request->get_param( 'interval' ); $stat_totals = array(); $request_args = array( 'blog' => get_option( 'home' ), 'key' => $api_key, 'from' => $interval, ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'get-stats' ); $response = Akismet::http_post( Akismet::build_query( $request_args ), 'get-stats' ); if ( ! empty( $response[1] ) ) { $stat_totals[$interval] = json_decode( $response[1] ); } return rest_ensure_response( $stat_totals ); } /** * Get the current alert code and message. Alert codes are used to notify the site owner * if there's a problem, like a connection issue between their site and the Akismet API, * invalid requests being sent, etc. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function get_alert( $request ) { return rest_ensure_response( array( 'code' => get_option( 'akismet_alert_code' ), 'message' => get_option( 'akismet_alert_msg' ), ) ); } /** * Update the current alert code and message by triggering a call to the Akismet server. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function set_alert( $request ) { delete_option( 'akismet_alert_code' ); delete_option( 'akismet_alert_msg' ); // Make a request so the most recent alert code and message are retrieved. Akismet::verify_key( Akismet::get_api_key() ); return self::get_alert( $request ); } /** * Clear the current alert code and message. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function delete_alert( $request ) { delete_option( 'akismet_alert_code' ); delete_option( 'akismet_alert_msg' ); return self::get_alert( $request ); } private static function key_is_valid( $key ) { $request_args = array( 'key' => $key, 'blog' => get_option( 'home' ), ); $request_args = apply_filters( 'akismet_request_args', $request_args, 'verify-key' ); $response = Akismet::http_post( Akismet::build_query( $request_args ), 'verify-key' ); if ( $response[1] == 'valid' ) { return true; } return false; } public static function privileged_permission_callback() { return current_user_can( 'manage_options' ); } /** * For calls that Akismet.com makes to the site to clear outdated alert codes, use the API key for authorization. */ public static function remote_call_permission_callback( $request ) { $local_key = Akismet::get_api_key(); return $local_key && ( strtolower( $request->get_param( 'key' ) ) === strtolower( $local_key ) ); } public static function sanitize_interval( $interval, $request, $param ) { $interval = trim( $interval ); $valid_intervals = array( '60-days', '6-months', 'all', ); if ( ! in_array( $interval, $valid_intervals ) ) { $interval = 'all'; } return $interval; } public static function sanitize_key( $key, $request, $param ) { return trim( $key ); } /** * Process a webhook request from the Akismet servers. * * @param WP_REST_Request $request * @return WP_Error|WP_REST_Response */ public static function receive_webhook( $request ) { Akismet::log( array( 'Webhook request received', $request->get_body() ) ); /** * The request body should look like this: * array( * 'key' => '1234567890abcd', * 'endpoint' => '[comment-check|submit-ham|submit-spam]', * 'comments' => array( * array( * 'guid' => '[...]', * 'result' => '[true|false]', * 'comment_author' => '[...]', * [...] * ), * array( * 'guid' => '[...]', * [...], * ), * [...] * ) * ) * * Multiple comments can be included in each request, and the only truly required * field for each is the guid, although it would be friendly to include also * comment_post_ID, comment_parent, and comment_author_email, if possible to make * searching easier. */ // The response will include statuses for the result of each comment that was supplied. $response = array( 'comments' => array(), ); $endpoint = $request->get_param( 'endpoint' ); switch ( $endpoint ) { case 'comment-check': $webhook_comments = $request->get_param( 'comments' ); if ( ! is_array( $webhook_comments ) ) { return rest_ensure_response( new WP_Error( 'malformed_request', __( 'The \'comments\' parameter must be an array.', 'akismet' ), array( 'status' => 400 ) ) ); } foreach ( $webhook_comments as $webhook_comment ) { $guid = $webhook_comment['guid']; if ( ! $guid ) { // Without the GUID, we can't be sure that we're matching the right comment. // We'll make it a rule that any comment without a GUID is ignored intentionally. continue; } // Search on the fields that are indexed in the comments table, plus the GUID. // The GUID is the only thing we really need to search on, but comment_meta // is not indexed in a useful way if there are many many comments. This // should help narrow it down first. $queryable_fields = array( 'comment_post_ID' => 'post_id', 'comment_parent' => 'parent', 'comment_author_email' => 'author_email', ); $query_args = array(); $query_args['status'] = 'any'; $query_args['meta_key'] = 'akismet_guid'; $query_args['meta_value'] = $guid; foreach ( $queryable_fields as $queryable_field => $wp_comment_query_field ) { if ( isset( $webhook_comment[ $queryable_field ] ) ) { $query_args[ $wp_comment_query_field ] = $webhook_comment[ $queryable_field ]; } } $comments_query = new WP_Comment_Query( $query_args ); $comments = $comments_query->comments; if ( ! $comments ) { // Unexpected, although the comment could have been deleted since being submitted. Akismet::log( 'Webhook failed: no matching comment found.' ); $response['comments'][ $guid ] = array( 'status' => 'error', 'message' => __( 'Could not find matching comment.', 'akismet' ) ); continue; } if ( count( $comments ) > 1 ) { // Two comments shouldn't be able to match the same GUID. Akismet::log( 'Webhook failed: multiple matching comments found.', $comments ); $response['comments'][ $guid ] = array( 'status' => 'error', 'message' => __( 'Multiple comments matched request.', 'akismet' ) ); continue; } else { // We have one single match, as hoped for. Akismet::log( 'Found matching comment.', $comments ); $current_status = wp_get_comment_status( $comments[0] ); $result = $webhook_comment['result']; if ( 'true' == $result ) { Akismet::log( 'Comment should be spam' ); // The comment should be classified as spam. if ( 'spam' != $current_status ) { // The comment is not classified as spam. If Akismet was the one to act on it, move it to spam. if ( Akismet::last_comment_status_change_came_from_akismet( $comments[0]->comment_ID ) ) { Akismet::log( 'Comment is not spam; marking as spam.' ); wp_spam_comment( $comments[0] ); Akismet::update_comment_history( $comments[0]->comment_ID, '', 'webhook-spam' ); } else { Akismet::log( 'Comment is not spam, but it has already been manually handled by some other process.' ); Akismet::update_comment_history( $comments[0]->comment_ID, '', 'webhook-spam-noaction' ); } } } else if ( 'false' == $result ) { Akismet::log( 'Comment should be ham' ); // The comment should be classified as ham. if ( 'spam' == $current_status ) { Akismet::log( 'Comment is spam.' ); // The comment is classified as spam. If Akismet was the one to label it as spam, unspam it. if ( Akismet::last_comment_status_change_came_from_akismet( $comments[0]->comment_ID ) ) { Akismet::log( 'Akismet marked it as spam; unspamming.' ); wp_unspam_comment( $comments[0] ); akismet::update_comment_history( $comments[0]->comment_ID, '', 'webhook-ham' ); } else { Akismet::log( 'Comment is not spam, but it has already been manually handled by some other process.' ); Akismet::update_comment_history( $comments[0]->comment_ID, '', 'webhook-ham-noaction' ); } } } $response['comments'][ $guid ] = array( 'status' => 'success' ); } } break; case 'submit-ham': case 'submit-spam': // Nothing to do for submit-ham or submit-spam. break; default: // Unsupported endpoint. break; } /** * Allow plugins to do things with a successfully processed webhook request, like logging. * * @since 5.3.2 * * @param WP_REST_Request $request The REST request object. */ do_action( 'akismet_webhook_received', $request ); Akismet::log( 'Done processing webhook.' ); return rest_ensure_response( $response ); } } PKwL\-akismet/readme.txtnu[=== Akismet Anti-spam: Spam Protection === Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, eoigal, cfinke, automattic, jgs, procifer, stephdau, kbrownkd, bluefuton, akismetantispam Tags: comments, spam, antispam, anti-spam, contact form Requires at least: 5.8 Tested up to: 6.5.3 Stable tag: 5.3.3 License: GPLv2 or later The best anti-spam protection to block spam comments and spam in a contact form. The most trusted antispam solution for WordPress and WooCommerce. == Description == The best anti-spam protection to block spam comments and spam in a contact form. The most trusted antispam solution for WordPress and WooCommerce. Akismet checks your comments and contact form submissions against our global database of spam to prevent your site from publishing malicious content. You can review the comment spam it catches on your blog's "Comments" admin screen. Major features in Akismet include: * Automatically checks all comments and filters out the ones that look like spam. * Each comment has a status history, so you can easily see which comments were caught or cleared by Akismet and which were spammed or unspammed by a moderator. * URLs are shown in the comment body to reveal hidden or misleading links. * Moderators can see the number of approved comments for each user. * A discard feature that outright blocks the worst spam, saving you disk space and speeding up your site. PS: You'll be prompted to get an Akismet.com API key to use it, once activated. Keys are free for personal blogs; paid subscriptions are available for businesses and commercial sites. == Installation == Upload the Akismet plugin to your blog, activate it, and then enter your Akismet.com API key. 1, 2, 3: You're done! == Changelog == = 5.3.3 = *Release Date - 10 July 2024* * Make setup step clearer for new users. * Remove the stats section from the configuration page if the site has been revoked from the key. * Skip the Akismet comment check when the comment matches something in the disallowed list. * Prompt users on legacy plans to contact Akismet support for upgrades. = 5.3.2 = *Release Date - 21 March 2024* * Improve the empty state shown to new users when no spam has been caught yet. * Update the message shown to users without a current subscription. * Add foundations for future webhook support. = 5.3.1 = *Release Date - 17 January 2024* * Make the plugin more resilient when asset files are missing (as seen in WordPress Playground). * Add a link to the 'Account overview' page on akismet.com. * Fix a minor error that occurs when another plugin removes all comment actions from the dashboard. * Add the akismet_request_args filter to allow request args in Akismet API requests to be filtered. * Fix a bug that causes some contact forms to include unnecessary data in the comment_content parameter. = 5.3 = *Release Date - 14 September 2023* * Improve display of user notices. * Add stylesheets for RTL languages. * Remove initial disabled state from 'Save changes' button. * Improve accessibility of API key entry form. * Add new filter hooks for Fluent Forms. * Fix issue with PHP 8.1 compatibility. = 5.2 = *Release Date - 21 June 2023* * Visual refresh of Akismet stats. * Improve PHP 8.1 compatibility. * Improve appearance of plugin to match updated stats. * Change minimum supported PHP version to 5.6 to match WordPress. * Drop IE11 support and update minimum WordPress version to 5.8 (where IE11 support was removed from WP Core). = 5.1 = *Release Date - 20 March 2023* * Removed unnecessary limit notices from admin page. * Improved spam detection by including post taxonomies in the comment-check call. * Removed API keys from stats iframes to avoid possible inadvertent exposure. = 5.0.2 = *Release Date - 1 December 2022* * Improved compatibility with themes that hide or show UI elements based on mouse movements. * Increased security of API keys by sending them in request bodies instead of subdomains. = 5.0.1 = *Release Date - 28 September 2022* * Added an empty state for the Statistics section on the admin page. * Fixed a bug that broke some admin page links when Jetpack plugins are active. * Marked some event listeners as passive to improve performance in newer browsers. * Disabled interaction observation on forms that post to other domains. = 5.0 = *Release Date - 26 July 2022* * Added a new feature to catch spammers by observing how they interact with the page. = 4.2.5 = *Release Date - 11 July 2022* * Fixed a bug that added unnecessary comment history entries after comment rechecks. * Added a notice that displays when WP-Cron is disabled and might be affecting comment rechecks. = 4.2.4 = *Release Date - 20 May 2022* * Improved translator instructions for comment history. * Bumped the "Tested up to" tag to WP 6.0. = 4.2.3 = *Release Date - 25 April 2022* * Improved compatibility with Fluent Forms * Fixed missing translation domains * Updated stats URL. * Improved accessibility of elements on the config page. = 4.2.2 = *Release Date - 24 January 2022* * Improved compatibility with Formidable Forms * Fixed a bug that could cause issues when multiple contact forms appear on one page. * Updated delete_comment and deleted_comment actions to pass two arguments to match WordPress core since 4.9.0. * Added a filter that allows comment types to be excluded when counting users' approved comments. = 4.2.1 = *Release Date - 1 October 2021* * Fixed a bug causing AMP validation to fail on certain pages with forms. = 4.2 = *Release Date - 30 September 2021* * Added links to additional information on API usage notifications. * Reduced the number of network requests required for a comment page when running Akismet. * Improved compatibility with the most popular contact form plugins. * Improved API usage buttons for clarity on what upgrade is needed. For older changelog entries, please see the [additional changelog.txt file](https://plugins.svn.wordpress.org/akismet/trunk/changelog.txt) delivered with the plugin. PKwL\J index.phpnu[Hello, Dolly in the upper right of your admin screen on every page. Author: Matt Mullenweg Version: 1.7.2 Author URI: http://ma.tt/ */ function hello_dolly_get_lyric() { /** These are the lyrics to Hello Dolly */ $lyrics = "Hello, Dolly Well, hello, Dolly It's so nice to have you back where you belong You're lookin' swell, Dolly I can tell, Dolly You're still glowin', you're still crowin' You're still goin' strong I feel the room swayin' While the band's playin' One of our old favorite songs from way back when So, take her wrap, fellas Dolly, never go away again Hello, Dolly Well, hello, Dolly It's so nice to have you back where you belong You're lookin' swell, Dolly I can tell, Dolly You're still glowin', you're still crowin' You're still goin' strong I feel the room swayin' While the band's playin' One of our old favorite songs from way back when So, golly, gee, fellas Have a little faith in me, fellas Dolly, never go away Promise, you'll never go away Dolly'll never go away again"; // Here we split it into lines. $lyrics = explode( "\n", $lyrics ); // And then randomly choose a line. return wptexturize( $lyrics[ mt_rand( 0, count( $lyrics ) - 1 ) ] ); } // This just echoes the chosen line, we'll position it later. function hello_dolly() { $chosen = hello_dolly_get_lyric(); $lang = ''; if ( 'en_' !== substr( get_user_locale(), 0, 3 ) ) { $lang = ' lang="en"'; } printf( '

%s %s

', __( 'Quote from Hello Dolly song, by Jerry Herman:' ), $lang, $chosen ); } // Now we set that function up to execute when the admin_notices action is called. add_action( 'admin_notices', 'hello_dolly' ); // We need some CSS to position the paragraph. function dolly_css() { echo " "; } add_action( 'admin_head', 'dolly_css' ); PKwL\L< Klimit-login-attempts-reloaded/assets/css/fonts/CoFoRobert-RegularItalic.eotnu[ LP Mj.CoFo Robert ItalicrVersion 1.001;PS 1.1;hotconv 16.6.54;makeotf.lib2.5.65590$CoFo Robert Italic FFTMGDEF58-GPOSL=vGSUB#9\OS/2cr`cmap4Rcvt 5 "fpgm?x gaspglyfT1XPheado,6hhead$hmtx)nvloca:$"maxp%v name9v6post3$prep !\.jM_<ZZ<6]<6*:w4LXKXJ^2 COFO   +M-6DuVN/<u4bOeDx4,":  (78'-7"NNYNO}0u@G,@>3GQFefppze[@z#xQ_34- :-J-3+<!A"/>$U')Y*L*2-#-5S?CC<6)Kp@:1NeN4W4NVol)/Nh.r }N0tNs^$HGpN1 M!M#<@GGGG>>>>GGGGGN^Fffffze\34-4-4-4-4-4-)-3333/>/>/./:0L*22222Nn2BCBCBCBC))4-4-4-@-@-@-@-J-J-G3G3G3G3G3@!@!@!@!A"B">/>>/>>/>>/>/>'M>$U3')3'3')25)3'L*L*L*L*L*G2G2G2|@255e\e\?e\"fBCfBCfBCfBCfBCfBCp6ze)ze[[[j9j-9)t*fBC)T -)F2e\ze)$U(mHtqKK GG,e3F>XKef1\q3GGGQ@`g1PMxZj;H{%4-@) 23|BCBC202C+2L*--Z*)0DC0R=J=+>>%&33 -/>/8U+A"20BC)DC5*E2a) L*p6p6p6G3ze)MPEd"]U3s@]0 {xguS\Rtgtv\v]x&p t su\t%tH}vN4N&N*N&#VpdypdxgdqNdRN>NXNgNhBSBSBSBSBSBSBSBSBSBSBSBSxvxQFPFr<M<d4D+;+;>2>2>2d>2dDOBSBSBSBSBSBSBSBSBSBSXd2%22%2228FMEyR4,a8>M>@31-\]s}1q}soI}?K1='5i'J^3V"(88N NN`NP+O+PXlclc= ; lr%<%<GGg1;{%.!|  E!d:!<JCDP=4-3BC2)>%&{ \F %%e*W&+& %J6EF'FF % % % % %%%%%ee*WWWWWW&&&&&&&&%%   %J%J%J%J6E6E6E6E6E6E6E6E6E6E6E'F'F'F'FFFFFFEBBBW[!hh'e&[ %%J)+5XHP`JJ%2Jh)_h&)N4N4NNNN N5NINXN.N#OFOFj08(%UYhN?E8NQNQNDN!;3N&GPC:$~7~37Y_cuGc      " & 0 : D p y !!!"!.!!""""H"`"e$i$$%%%%%&&'')++0 0 927YbrFb      % 0 9 D p t !!!"!.!!""""H"`"d$`$$%%%%%&&''v)++00{uh[S;%"bhfX>pTzaZSK}+߹߶ݼ<(܈܀a^?%֨փD4Z ~   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivok ujrgglzcnm{b7w[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-),# bfc`KTX# .]!!Y-*,# bfc`KTX# .q!!Y-+,# bfc&`KTX# .r!!Y-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpBE1*B@ XL8&*B@ ^RB/* B@@@ @ *B@@@@@ *D$QX@XdD&QX@cTXDYYYY@ ZN:( *DdDDLL**II++II++;;++{|;;++6,ddddhtXD $ T 4 X  T0H4||t\H| @!$!"d"#H#$x$%p%&&d&&',()t*++- .0012305067t949;H<$<=?@ABCDDEpEEFGHItJ0JtKL@MlNNODQQTQR<RSTTUUUVVXY Z[\\] ]^_`\ahcdefh hiijDjklmhno pp@pqrTrstu\w`yd{h}`<`x xhX@L <lH ( 88pLt<hʤdӈLռ֐$ڐ$۸|@px<l@h@` 04t0X D P  L@48L@D|`$ <!"8#%&'H'*x+ ,\-@-/\01L13347L9:< =>@C@CDF HLILKtMOQRSTUVWXLY@YZZ[$[[\\\]^^P^^_p_`abcdde\efdfgi<jklmn|nopppqxr@tvwXx`yz{0{|t|}|~|~$tP<@| <D40x| \p$h\lxtt4$h\d<żȸɜPld L؄x۸ސ@TT(t|4dT@x` 0,44\4h `x|   D ,L< x<D \!L"#$&8&($)4)*8*d***+ +0+T+t++, ,H-8---01235L667 788889$::@:d:::;;X;;<=\=>$>??@@4@`@A8BCETG HlI,IJKLN`NNOP P8PdPPQSUVHVWXYxZ[\^`4abdedfxgPhhi\jlmmo(q,r<slt\uwXyz|}}T}}~ ~~P\<p l\8,Hxx|| @4<  THtHL` lPtżƌHɴp˴̜@|ӌԔՔ<L8$ݰ\ P(|L,D, \8(HDT$     ` hh|!""$%%&'( )D*4+,../ 01d2457@9P;>\@AB<BCLD<EEFGGHIJJ|K,L4LMtN`NOPQHQRDRST|U<V(VWpXP>  0+!%!! '7`222j:F%!6%)@&pBK[CL( +7#>7>7>32"&54632$$  =I$$XH+G@+C'(uu $@!sBL   # +7>3237>32u#Wf#W$%  $%  HK PX@&  gb  a=LKPX@%  sb  a=L@.r  sb U Y  MYY@ +737#73733733#3##7##7#737#l?1.01/1no?./.-/.j?{4444/C/:Ei@f/2 <1% $ Jrp  nsK[KK [ LA=6*: +373#4&'#"&'#7.'#737'.546327.#"'232654&y%) !%),"04Ah[ &"7!!+8*8>@dH P/ 3:)^63E&CM C-5 67KY7>$C6; ?2IC')%l :."$<f! +7^@[pc  d  c;K [ CL-,31,7-7%#++   +7"&546323#72654&#""&54632'2654&#"KTgPLT.Er;[<@8/0:A4KTgPMS.E,?9009A3VKNiVC&F4ET9+9L92:VLNiWB&F54T9+9M91:BN\U@RZF7+U2Jpc[BK[CK[CLSQMKA?;9*$%' +326?3#"&'#"&5467.54632>7#"&54632%>54&#"3267/.'f(4, % (  . +?0g2Va|f dT@Kw_? *  RU&+0=6?([(nLU`$F>6&5%&&4($#(TPWk<"Wh@4TY z  -22#:S9!*Di9L"Xu @sBL # +7>32u#W$%  4 0+.54>7* _w7f^1B%LЏXl#*JBq_Qa 0+7'>54.k _w7f^1B%LЏXl#*JBq_Q G5@2=A3(JWc[O)),))* +#"&/#"&546?#"&546?'.54632'.546327>32RQ C B TS A B   ;Z  Z:  !  ;Z  Z: eq$ )@&rsUZN +3733##7#r636 636c/a]@JG[CL$& +'>7#"&54632 D<$+B) D!&%<2%DR&@UYM +%#73A9{b @[CL   +"&54632<$$ '(@r?L +3#55,,-@*[K[ L +"&54>32'2>54&#"[n+Li>ak'Jl?/P8 FA3R8M oVBuX3nW6s]<91L^-AK.I`1>N #@ YKYL+#7!#3!73Ls66v66'>@;pc[KYL ''+"32#"&54632!73!?>54&$/BpVLg1M`.t=*5]%M?(?"  EU9E-G=6Dn4h27<"++<C@@:Jcc_ [ K[ L53$"$!&#$" +%#"&54632+32>54&+732654&#"32#"&54632mK[=0!?/MF +g]?10?qYKe[P/4[`v?6"0!+>(1*+Y54&#"'!!>32HZ9,.G1?<$D]O>?N]|>7#/#"5C!62.? DHm7s&4A@>!Jpcc[ L('0.'4(4&'$&$+%#"&54>32#"&5467.#">322>54&#"%B_9Y^(OuLH]2$&J<. !\1Lf'@-<6QhG5^E)fZLQ;3%%Db<"(G$:M(42oW5>8!@pqYL+#7!#>7!c+5?fK4U?Wl=9?9??5- s+='@$; Jc[ L0.&$,$+%#"&5467.54>32'>54&#"32>54&/.'&B[5_iD<!8M,Qi64 * ,*G==R93QD#>.?*; 331P9\BE_5"+D.GB0W;aL*-2A6)1 3E'7",-  Q"$4?@<Jc_[K[ L&%.,%4&4&$"$$ +#"&54632#3267#"&54>32'"32>54&EsUHe E,Ud#P6Sg&AV0Vl"=->3(@.DCCY;9"0',TK8\@#^16J,67#"&54632$$ D<$+Bq'() D!&%<2%0+%%7% u-+8Y+"@aUYM +!7!!7!\ -[ //c0+77%0" /-+8O!-9@6pc[BK[CL#")'"-#-&$( +#7>54&#"2#"&54>32"&54632}c7 /I133(G 5F&QX$$*cd&6C%+6""(=)N'(0 9kFV@  76JK'PX@)c  c \CK[?LK1PX@0  pc  c \CK[?L@.  pc  c d[?LYY@HGPNGVHV(%(&%&'$ +#"&7467#"&54>327332>54&#"3267#".54>322>54&#"9;W87'&K'55 6J+.6+3F $>.Wi;.QpAN76YT]2Bwc5<1'% 4%;By\74%9=H=2eP3<.d.(1Qk;K}[KwS,3<=?3^ScSG6IM-:1HU$(0c8@5Jb:K Y;L +7#7333#73'#73 JF,J W p111w119e*E@B J aY:KY;L  * )#! +)73#7!232>54&+ 32>54&# XW aQY]==,MnUt0D*5=pQKp3O4>B1G0M8Bn B30T<#x1<*-4F',-@&@ JK'PX@+pn[BK;K[CL@/pn:K[BK;K[CLY@!  && +"32673#7#"&54>3273#>54&DfB!IVQn4@%f9n{1[Q@^'%84SU|;UfdQN'0wQP31^  ?A0@-Y:KY;L&! +732#!73332>54&# 5jm XOWZR'Ufx0nIS1GMt>UiqK PX@/hpaY:K Y;L@0ppaY:K Y;LY@ +%73!73#7!#7#3#=(2 XW 2( D K11G00egK PX@&haY:KY;L@'paY:KY;LY@  +#3#3!73#7!#F Io XW 2)x111G0@-c@ $ JKPX@-  pa [BK;K[CLKPX@)  pa [BK[;LKPX@-  pa [BK;K[CLK!PX@)  pa [BK[;LK'PX@-  pa [BK;K[CL@1  pa:K [BK;K[CLYYYYY@('&%"  -- +"326?#73##7#"&54>3273#>54&DeB &<(QfNAP' b;qw1YPA^&%80VR|A%A0Zf33U+1kXN20\  ?AC>@;  aY:K  Y  ; L +'3#73#!7#73#3#73!3#XW WB`BW WW WMMW 1G0000111 #@ Y:KY;L +'3#73#3#XW XX 1G001*+@(cY:K[CL#$# +%#7!##"&54632+326sh  XssX9?'" &6J00Kkb6(*0II@F Ja Y :K Y ;L +37#73#3#73#3#73#731@dU NB [bOV XW x0011"11G00 2@/pY:KY;L  +%73!73#7!#?(5 XW  [11G00<@9 J Y :KY;L +3#3#73# 3#73#7WNz WW V^XW XW %011/k11G0:0@- JY:KY;L +3#73## 3#73#V W@W XW 00B11GG(@%[BK[CL  +.54>32'32>54&#"8v{4]Mt2\LTCfE#JTBgF$sW}KwKTXfU};TcQyb:@7a Y:KY;L$! +%!73#732+32>54&# XW jiY:US:V6:E111G0QItG!9M,1;F_#=JT@QA1!Jpc_[BK[ CLIG:8.,'& ## +.54>32326?3#".67'.54632>54&#">?6&#"7v{5]Lt8P3 .# ( 47#&,IP<:=-.KTBgF$  3(sW}Kw:zo]1I$#':I/<WeA?ULR!UZ['TcQyD  !EP>\'2P@M J p  a Y:KY;K[CL20*(''+!%# +%#"&574&+3#73#732326?%32>54&+W 6+4$2bDV XW bdnX)   \)I6;54&#"#"&'#7332654.546327$+0HB:?UfUw_<]&)/W:COTeTlP>T  1<>06>3273326?32>54&#"6$"% 0\1?9%?X39@;.\ $"H;&.,'A-g<4"$/MOSG9w_>I8zH#&dAY\4I32"32>54&?Se[ l*b;;B,KgF#I<'/%*J5! 1?$j1S/AVG?@d>@^o.1%?]m,%7-%6@3Jpn[=K[CL&'$&" +%3#"&54>32#"&5467.#"326X/RBRY 5#;T_$32#73326?32>54&#"5*'!'e2?A%AY48FOL  $"H;&12&A/g<3&'=QQH;w_3232673#"&"7>54&3&D]61CP 9E8-JGeW#:N+ E/(<5@ -JK PX@/hh[BKY =K\GLK PX@0hp[BKY =K\GL@1pp[BKY =K\GLYY@54'$#'$# +##"&5463232>7#737>32#"&5467.#"3AdMU1;$~M K X?)8 (3 iPi,*$(4+'^V($"I=, &6 @ !JKPX@-p=K[=K[CK[GLKPX@)p[=K[CK[GLKPX@-p=K[=K[CK[GLK!PX@)p[=K[CK[GL@-p=K[=K[CK[GLYYYY@('0.'6(6'$#&# +7#"&54>3273#"&54632326'2>54&#"F/6]5?A$?Y3V^ 5H;Xh,-;"3JKPX@,pY:K[=K;K[CLKPX@(pY:K[=K[;L@,pY:K[=K;K[CLYY@ #+%& +%7>54&#"##73>32326?3#"&546r&  #J?0 &IZd/6>"37 -   $ 8*(#a2>Xc%y/!A2-*3s<!% <3)G> %@@=p[7#7#"OH0;#m 2%([^[+-$ )5+ 9T@QJpc Y:K[=K;K[CL987653.,)(%#$%! +3326?>32#"&5467326?3#"&?6&+##zl,6,4* $# % 1%.)31BH[p#3%0$ ,", = C9=+(3,6+>y)(@%pY:K[CL#& +3326?3#"&5467#x  $ 7*)$[; % <3)I*3L* JKPX@3p [=K  Y  =K;K[CLKPX@$p [ =KY;LKPX@3p [=K  Y  =K;K[CLK!PX@(p [ =K;K[CL@3p [=K  Y  =K;K[CLYYYY@LLKJ&+#+)% +>32>32326?3#"&546?>54&#"#>54&#"##77/6=!1- +2;"/6 .   $ 5*(# '  %B7) .JY $C9+ /J~[ױ#C3.$ / <.-'2w7 !% <3'"Be432326?3#"&546?>54&#"*~[8.7@$1; *   $ 5*(# ( &F:, 3+"B4!**6#j5!% <4+Fc27P[$2%(@%[=K[CL  +"&54>32'3267>54&#"QS!?]?6D!9;;(E JKPX@-[=KY=K[CK Y?LKPX@#[=K[CK Y?LKPX@-[=KY=K[CK Y?LK!PX@#[=K[CK Y?LK-PX@-[=KY=K[CK Y?L@+[=KY=K[CK Y?LYYYYY@%#&# +#73#73>32#"&'4&#"32> H[(4]3??&@Y32A Mt-#H;%12&A0,,z+RHPK:w_<7+.;=V^ 4I;Wg- &G@DJ=K[=K [CKY?L &&&# +#73#"&54>3273'2>54&#" \a3^5?A%AY432#"&5467&"#"#Z-,`6"!;7- -I+Qa& 1M_.7E@B5Jpn[=K[CL0.(& 77 +72654.54632#"&5467.#"#".54632*FCQC`D!<, ="(?3326?3#"&5467#"&546?#7[ B<0 2Ha  $ 3)&08?!13 PR 1:T^$& !% ;4$:<$I:%+(5+<+JKPX@ Y=K[=K[CLKPX@#[=K[=K[CLKPX@ Y=K[=K[CLK!PX@#[=K[=K[CL@ Y=K[=K[CLYYYY@++($)& +32>54&'#"&54632#"&546?#7I  0Q9   #EkH>; <\%S!!9Wi/ &33{hG:0%Z#+6@@ 3JKPX@"Y=K[=K[CLKPX@%Y=KY=K[CLKPX@"Y=K[=K[CLK!PX@%Y=KY=K[CL@"Y=K[=K[CLYYYY@ $)%&&$ +#"&7#"&546?#7332>?332>54&'#"&54632#Ca=N,(.46: ?\M 90' ADB $&F5 T3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3Af@c 4".1Jpn[ =K[ =K[CK[CL@>+$%"+$# +>32#"&546732673#"&/#"&54632>7'.#"#>32/Q5"C1( %,)%( 9U6L2 $0.($RS^'ZY%?3#"&54632326?#"&546?#7U ! A7* 1IhnBS 6GP5*2>$/A JQ 02IV$n;3$h\ =/002+?T@Q%Jpnn[=K[ CL=<:8,*! ?? +".'#"&5467"&/.#"#>32.54632632673886##  :1#% ,8531 $  E2!% ,   /  (*HM  / (+IL0.@+$ J[BK[GL0/! +#";#"&54>54&'7>54&54>3 #N; >8"#!"+5 7H@$*$*(54&+732#H #N; >8"#!"+5 7H@$*$*(3232673#"." +7.3/.+ 5/3/-#1C'3A! *@'pq[=L    +2#"&5>3#"&7>7>%$$% A&'WH*HA*Ce>-@ JK PX@0fpng[K[ LKPX@.rpns[K[ L@,rpnsd[ LYY@ &'&+%3+#7.54>;73#"&5467.#"3260dB*@Q >\;*3C 7%/C*B61JJG\` ]K9mU4`d :,#:QXCM84*B@?pc a[K Y  L*)$#"$# +37>32#"&5467.#"3#!73!7>?#u< bV?E (39 } $0.&%v7%C ,Zf"32654&. ;Y"WX!\9$=]"\Z!\?%>KM<;JJY#W;"'@Y"[]"[@&!9Y#Z4H32#"&5463.#">54&/.'Mf !!J5;T81$;D\E6I*"?1  B&?P9. :BSE!t  ;B3. CF04C?'0.G:)2O6Nf<()>()%.!82'7I9Gf:#WePW3%: U1*8. 3dD@(W[O      +D"&546323"&54632 "!!.')%'l'GgdD@\; /Jc  W   aU cW[O)(CA?>=<9731.-,+(G)G((($ +D4>32#".732>54.#"2653#'#"&5463273#.#"l&Fe??eF&&Fe>?eG&$">X55W>"#>W55W>"(# 0<3273326?32>54&#"!7!3 %I%1/3E(+2.-G  7-$"0" S0' $;=A7,[J09,`7 H0@D)7,BP#+1/$  0+'?'7 /#V!>%b˼ʽh e>K PX@gUYM@sUYMY +!7!#26/r.ENdD: JK!PX@<  h c  c  c dW[OK-PX@=  p c  c  c dW[O@B  p c  c  c U  dW[OYY@NLHFEEB@5321%%$&(" +D4632#".732654&#"#"&/.+3#535#532326='32654&+r|d/P;":Q22S; !fYZahSYf6 `o&2#  %'by 9Q11S<""54&#"#"&54632373J q38$ J646O<^6(_+F+  -9+'9M-IB^+~>J@G6Jpcc[^K[_L=;42.,+)%#! " +4632#"&5&632#32654&+732654&#"#"&K/3>%  VA29   +0!' 2' # V+1,*"4  :D+% 6'8"  + dD@ Gi% +D'7>32yY  vg )$2@/pcY:K[GL&#"$$ +#"&54632#326?#"&54>;#E"2G3733#73_ ,  )XV ^]& ((1!%3@0][^K[[L%$#"  +"&54>32'3267>54&#"!7!>D2I.BB2Jr*%*( @8I@+VD*G@(UF.*."e&*0"]1#{  0+7'7'7'7'7 /#V!>%b#˼ʽM"dD"JK PX@Arr  p  hq a b   U  Z  N@Brr  p  pq a b   U  Z  NY@! ! +D3##73267>733#73##7#?33#37,-e_ ,  )XV ^,: FI,}:Ff& ((UU%M7ndD@c! Jrr   p  ns a  c b  U Y M7654.,(&! +D3##73267>733#73#?>54&#"#"&54632373,-l_ ,  )XV ^ q38$ J646O<^Ff& (((_+F+  -9+'9M-IB<>BMPdD@ 6PJK PX@Opp h q cccc U Z   N@Ppp p q cccc U Z   NY@$ONMLKJHGFEDCBA@?=;42.,+)%#! " +D4632#"&5&632#32654&+732654&#"#"&%3#%##7#?33#37qK/3>%  VA29   +0!' 2' # ,-),: FI,}:V+1,*"4  :D+% 6'8"  hF^UU%!a +;@8pd_[=L*("    +2#"&54646?33267.54632#"&1$%zc7 `b36%F"7H%NV&'cvnoI+5!"(=)L^q B@?  Jr  b:K Y;L   % +.54632#7333#73'#73f  n JF,J W p$ XF11w119^i B@? Jr  b:K Y;L   % +'7>32#7333#73'#735  j JF,J W p2T 11w119^mE@B Jr  b:K Y;L +''73#7333#73'#73U^6 JF,J W pQQr11w119zf/2b@_2Jcc  b:K Y ;L 10 / /.-,+*)('&%$#"!  +"#7>32326?3#"&/.#7333#73'#73 '6$   ' +%#  JF,J W p23,  ",+ 11w119dX '*[@X* J c  b:K Y;L )(''&%$#"!      +"&546323"&54632#7333#73'#73j#!#"p JF,J W p%%&$;11w119_a&)?@<)  J  c  b:KY;L('%#&" +46323#73'#3#73.732654&#"3^E-/B2%+J W qU Ju*))'!*3;;3,91111a 2""))""''7JK PX@:h  pa  aY:K Y ;L@;p  pa  aY:K Y ;LY@ +7#73#7!#7#3#!73!737#73 Su 3(A K>(3 W3ެR111G00獾11@;KPX@2 JKPX@2 J@2 JYYK PX@=  pnh  [  BK;K[CK[?LKPX@>  pnp  [  BK;K[CK[?LKPX@:  pnp  [  BK[;K[?LK'PX@>  pnp  [  BK;K[CK[?L@B  pnp :K  [ BK;K[CK[?LYYYY@65430.('&%! ;; +"32673#7#"&'732654&'7.54>3273#>54&DfB!IVQn4@%^6$*):52 ,"-5cl1[Q@^'%84SU|;UfdQN%/L!!)3 ) opQP31^  ?Aqq  JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@  % +.5463273!73#7!#7#3#>  =(2 XW 2( D K$ XF1G00qi JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@  % +'7>3273!73#7!#7#3#  =(2 XW 2( D K2T 1G00qm@ JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@ +''7373!73#7!#7#3#7^6P=(2 XW 2( D KQQrč1G00qX +K PX@;   h  pc  a Y:K Y;L@<   p  pc  a Y:K Y;LY@+ ++*)('&%$#"!      +"&546323"&5463273!73#7!#7#3#M#!#"=(2 XW 2( D K%%&$;1G00q /@, JrY:KY;L% +.546323#73#3#  PXW XX $ XFG001i /@,JrY:KY;L% +'7>323#73#3#  VXW XX 2T G001m2@/JrY:KY;L +''733#73#3#^6XW XX QQrG001X #E@B  cY:K Y ; L #"!     +"&546323"&546323#73#3##!#"MXW XX %%&$;G001!@@= a Y:KY;L! &! +73#732#!733#32>54&#I JDW 5jm XLD LYZR'UfM,0nIS1+,Mt>Ui:f3\@Y+" Jcc Y:K  Y  ; L3210/.-,*)('&%$#!   +"#7>32326?3#"&/.3#73## 3#73# '6$   ' +%# ֗V W@W XW23,  ",+  00B11GGq +4@1 Jr[BK[CL (&   % +.54632.54>32'32>54&#"h  v{4]Mt2\LTCfE#JTBgF$$ X sW}KwKTXfU};TcQyGi +4@1Jr[BK[CL (&   % +'7>32.54>32'32>54&#"6  v{4]Mt2\LTCfE#JTBgF$2T sW}KwKTXfU};TcQyGm&7@4Jr[BK[CL#! +''73.54>32'32>54&#"X^6v{4]Mt2\LTCfE#JTBgF$QQrsW}KwKTXfU};TcQyGf/?K@H cc [BK[ CL! <:42)' /!/  +"#7>32326?3#"&/..54>32'32>54&#" '6$   ' +%# lv{4]Mt2\LTCfE#JTBgF$23,  ",+ sW}KwKTXfU};TcQyGX '7D@A c[BK[ CL 42,*!''    +"&546323"&54632.54>32'32>54&#"l#!#"v{4]Mt2\LTCfE#JTBgF$%%&$sW}KwKTXfU};TcQy^ 0+%''7'77ii(gk$$F'1@. J[BK[CL$"  +.54>32'.#"%4&'32>7u|5]Ms2\z;)BgE% ?+CgE#sW}KwKT3Qy5/U}f3q %3@0 JrY:K[CL##% +.546323#3267#73##"&7#  , VY!5cek]V O](Y(ZN$ XC0zoY00Qf3i %3@0JrY:K[CL##% +'7>323#3267#73##"&7#w   VY!5cek]V O](Y(ZN2T z0zoY00Qf3m 6@3JrY:K[CL## +''733#3267#73##"&7#^6] VY!5cek]V O](Y(ZNQQr0zoY00Qf3X 1K@H  c Y:K [ C L 10-+('&%$#      +"&546323"&546323#3267#73##"&7##!#"' VY!5cek]V O](Y(ZN%%&$N0zoY00Qei @@=JrY :KY;L % +'7>32##73#3!737#7-   XNS K7e f7^J 2T z0C0011y0@nKPX@(   aaY:KY;L@&a   aaY;LY@"$! +#7!#32+3!7332654&#o  WTjj\ n XMUse:F01eNIi{x11fM1:4kJK PX@/hc[ BKY;K\CLKPX@0pc[ BKY;K\CLKPX@(pc[ BK\CLKPX@0pc[ BKY;K\CLK!PX@2pc[ BKZ;K\CL@0pc[ BKY;K\CLYYYYY@10/.+)#!  44 +2#"&?332>54&+732>54&#"#73>EMKK674L0<< ( #" 1"9D##(:%$*:LEstA3273326?32>54&#"  P6$"% 0\1?9%?X39@;.\ $"H;&.,'A-n   Y<4"$/MOSG9w_>I8zH#&dAY\4I32#"&5467#"&54>3273326?32>54&#"yY  N6$"% 0\1?9%?X39@;.\ $"H;&.,'A-vg <4"$/MOSG9w_>I8zH#&dAY\4I3273326?32>54&#"T9t6$"% 0\1?9%?X39@;.\ $"H;&.,'A-#ki<4"$/MOSG9w_>I8zH#&dAY\4I32326?3#"&/.#"&5467#"&54>3273326?32>54&#" # (! # %$ 6$"% 0\1?9%?X39@;.\ $"H;&.,'A-~*()  +&-  <4"$/MOSG9w_>I8zH#&dAY\4I GE>M?M=<9710-+%#     +"&546323"&54632#"&5467#"&54>3273326?32>54&#" "!!86$"% 0\1?9%?X39@;.\ $"H;&.,'A-.')%'9<4"$/MOSG9w_>I8zH#&dAY\4IGE>M?M=<&&'$$$$" +4632#"&732654&#"#"&5467#"&54>3273326?32>54&#"=(*;=((=)   6$"% 0\1?9%?X39@;.\ $"H;&.,'A-s-55-.66.!!! <4"$/MOSG9w_>I8zH#&dAY\4I32>3232673"7>54&26?#"FT "gA27iE -7%73B"6F "Z2AJ[or/3/F0\@^cND$-3_9Hd MCJF8(ZH1FB  0!.&(,=1CP"9E8-JGiSD1#xTH9<-:@-JK PX@5pnh[=K[CK[?L@6pnp[=K[CK[?LY@ &'$(%& +%3#"&'732654&'7.54>32#"&5467.#"326X/O<%*):52 ,"-6EJ 5#;T_$3232673#"&"7>54&  P&D]61CP 9E8-JGeW#:N+ E/(3 '3p@ -JKPX@#pBK[=K[CL@#rp[=K[CLY@)((3)3"+)% +'7>324>3232673#"&"7>54&yY  &D]61CP 9E8-JGeW#:N+ E/(3".r@(JKPX@#p:K[=K[CL@#rp[=K[CLY@$##.$."+% +''734>3232673#"&"7>54&T9&D]61CP 9E8-JGeW#:N+ E/(3 3?9$JK!PX@,p  [3232673#"&"7>54& "!!&D]61CP 9E8-JGeW#:N+ E/(>  %c JKPX@"pBKY=K[CL@"rpY=K[CLY@ #&% +.54632#73326?3#"&5467w  PB[Y  $ 8*(# n   b+C $% <3&"B>; %cJKPX@"pBKY=K[CL@"rpY=K[CLY@ #&% +'7>32#73326?3#"&5467yY  [Y  $ 8*(# vg +C $% <3&"B.I f@ JKPX@"p:KY=K[CL@"rpY=K[CLY@ #& +''73#73326?3#"&5467IT9`[Y  $ 8*(# #ki+C $% <3&"B:Y 1K!PX@+p  [32.''7.'37'2>54.#"TQ!=U3%6(a S3J&a T-9"?\5*B-(,?(/ dK8nW6!?"#2(#%9~F7t^=*>Ye&';Wd(89*%S% JKPX@D   pc[BK [=K Y=K ;K [ C LKPX@:   pc[BK [=K ;K [ C LKPX@D   pc[BK [=K Y=K ;K [ C LK!PX@:   pc[BK [=K ;K [ C LK-PX@D   pc[BK [=K Y=K ;K [ C L@Kp   pc[BK [=K Y=K ;K [ C LYYYYY@'  S SNLA?<;86+)$#"!  +"#7>32326?3#"&/.#73>32326?3#"&546?>54&#"F# (! # %$ ~[8.7@$1; *   $ 5*(# ( &F:, 3~*()  +&-  +"B4!**6#j5!% <4+Fc27P[$2 1\ JKPX@BK[=K[CL@r[=K[CLY@ +)   % +.54632"&54>32'3267>54&#"  PQS!?]?6D!9;;2 1\JKPX@BK[=K[CL@r[=K[CLY@ +)   % +'7>32"&54>32'3267>54&#"yY  QS!?]?6D!9;;2,_@ JKPX@:K[=K[CL@r[=K[CLY@&$ +''73"&54>32'3267>54&#"T9QS!?]?6D!9;;2/EK-PX@+c [BK [=K[ CL@2pc [BK [=K[ CLY@! ?=42)' /!/  +"#7>32326?3#"&/."&54>32'3267>54&#"# (! # %$ 0QS!?]?6D!9;;2 '=sK!PX@$ [32'3267>54&#" "!!QS!?]?6D!9;;no!( <@9caW[O    +"&54632!7!"&54632d#$Z #$&'/&'2-1@.#"J[=K[CL'%  +2#"&54>.#"%4&'3267>+UQ!?_?C& >x@ 0JKPX@&pBKY =K[CL@&rpY =K[CLY@ > >)#&+% +.5463232>?3326?3#"&5467#"&546?#7  Pv[ B<0 2Ha  $ 3)&08?!13 PR n   71:T^$& !% ;4$:<$I:%+(5+C& >x@ 0JKPX@&pBKY =K[CL@&rpY =K[CLY@ > >)#&+% +'7>3232>?3326?3#"&5467#"&546?#7yY  [ B<0 2Ha  $ 3)&08?!13 PR vg 1:T^$& !% ;4$:<$I:%+(5+C&9z@ +JKPX@&p:KY =K[CL@&rpY =K[CLY@99)#&' +''7332>?3326?3#"&5467#"&546?#7T9[ B<0 2Ha  $ 3)&08?!13 PR #ki1:T^$& !% ;4$:<$I:%+(5+C& J< JK!PX@/  p  [?3326?3#"&5467#"&546?#7 "!![ B<0 2Ha  $ 3)&08?!13 PR .')%'W1:T^$& !% ;4$:<$I:%+(5+ ?@1*JKPX@.pBKY =K[CK[GL@.rpY =K[CK[GLY@ ? ?''$#+% +'7>3232>?3#"&54632326?#"&546?#7yY  U ! A7* 1IhnBS 6GP5*2>$/A JQ vg 02IV$n;3$h\ =/002+(H@E JY:K[=K[CK Y?L%#&# +#73#73>32#"&'4&#"32> H[a4]3??&@Y32A Nt-#H;%12&A0,,K+RHPK:w_<8..;=V^ 4I;Wg K@ = 6JK!PX@7  p  [?3#"&54632326?#"&546?#7 "!!U ! A7* 1IhnBS 6GP5*2>$/A JQ .')%'W02IV$n;3$h\ =/002+oBB@? Ja  b:K Y;L +!!#7333#73'#73] JF,J W pB2!11w119-b)9  JKPX@-  pa=K [=K [CLKPX@)  pa [=K [CLKPX@-  pa=K [=K [CLK!PX@)  pa [=K [CL@-  pa=K [=K [CLYYYY@+*31*9+9&&'# +3##"&5467#"&54>3273326?32>54&#"6$"% 0\1?9%?X39@;.\ $"H;&.,'A-b/4<4"$/MOSG9w_>I8zH#&dAY\4I+ JKPX@3  pc:K=K [=K [CLKPX@/  pc:K [=K [CLKPX@3  pc:K=K [=K [CLK!PX@/  pc:K [=K [CL@3  pc:K=K [=K [CLYYYY@;:CA:I;I98&&''"% +332673#"&546#"&5467#"&54>3273326?32>54&#"$%8%EB+, 6$"% 0\1?9%?X39@;.\ $"H;&.,'A- &1IA(* <4"$/MOSG9w_>I8zH#&dAY\4I3273326?33267'2>54&#" *,6D< 1[1?9%?X38@;.\ $ #:M& "H;&.,'A- %".L%".KOSG9w_>H7xH#& *2 %G# AY\4I32"32673#7#"&54>3273#>54&@  DfB!IVQn4@%f9n{1[Q@^'%84S2T U|;UfdQN'0wQP31^  ?A- 1q@ $JKPX@'p[=K[BK[CL@%pc[=K[CLY@ &'$&"% +'7>323#"&54>32#"&5467.#"326yY  ;/RBRY 5#;T_$3273#>54&J^6ZDfB!IVQn4@%f9n{1[Q@^'%84SQQrU|;UfdQN'0wQP31^  ?A-,y@ JKPX@)pn:K[=K[CL@)rpn[=K[CLY@ &'$&" +''733#"&54>32#"&5467.#"326T9/RBRY 5#;T_$3273#>54&%$@DfB!IVQn4@%f9n{1[Q@^'%84S%%uU|;UfdQN'0wQP31^  ?A- 1O@L$Jpn[32#"&5467.#"3264## /RBRY 5#;T_$3273#>54&\^6DfB!IVQn4@%f9n{1[Q@^'%84SWQQreU|;UfdQN'0wQP31^  ?A-,C@@JHrpn[=K[CL&'$&" +77#3#"&54>32#"&5467.#"326T9U/RBRY 5#;T_$54&#7^6 5jm XOWZR'UfWQQrl0nIS1GMt>Ui-:JU@* JKPX@4  pY:K[BK [=K [CLKPX@6  p[BK[BK [=K [CLKPX@4  pY:K[BK [=K [CLK!PX@6  p[BK[BK [=K [CL@4  pY:K[BK [=K [CLYYYY@<;DB;J7#"&54632#"&5467#"&54>32#73326?32>54&#"a #95*'!'e2?A%AY48FOL  $"H;&12&A/!%".Kg<3&'=QQH;w_54&#I JDW 5jm XLD LYZR'UfM,0nIS1+,Mt>Ui-x/?^@[. J  p  aY:K [ =K [CL10970?1?//,*'#& +737#733#326?3#"&5467#"&54>3272>54&#"T K "P Nd  $ 5*'!'e2?A%AY48F0"H;&12&A/ %I.w%A#& <3&'=QQH;w_3232673#"&"7>54&&D]61CP 9E8-JGeW#:N+ E/(qd%K PX@=r   h  pc  a Y:K Y;L@>r   p  pc  a Y:K Y;LY@%%$#"! "# +332673#"&54673!73#7!#7#3#9)!&*A)PE66^=(2 XW 2( D Kd "!')E<0+֍1G003/;G@D5 Jpc:K [=K[CL100;1;"+)"% +332673#"&5464>3232673#"&"7>54&$%8%EB+,&D]61CP 9E8-JGeW#:N+ E/(q[ K PX@8 h  p c  aY:K Y;L@9  p  p c  aY:K Y;LY@#       +"&5463273!73#7!#7#3#%$6=(2 XW 2( D K%%>1G003 '3L@I-Jp[3232673#"&"7>54&2##&D]61CP 9E8-JGeW#:N+ E/(q&׵  JK PX@8h  p aY:KY;K [ ? LK)PX@9p  p aY:KY;K [ ? L@6p  p a _Y:KY;LYY@%# +467!73#7!#7#3#!733267#"&PHL XW 2( D K=(2BQ& *,7/S%1G00獾#I# 1 %31=v@ 71JK'PX@(p[=K[CK[?L@%p_[=K[CLY@322=3=(+&E" +#"&5467"#"&54>32326733267"7>54& "%3@; OW&D]61CP 9E8-1@$O" ]";N+ E/(qmHK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@ +77#73!73#7!#7#3#7^6=(2 XW 2( D KWQQrM1G003".B@?(JHrp[=K[CL$##.$."+% +77#4>3232673#"&"7>54&T9&D]61CP 9E8-JGeW#:N+ E/(@m4@+ JKPX@2r  pa [ BK;K[CLKPX@.r  pa [ BK[;LKPX@2r  pa [ BK;K[CLK!PX@.r  pa [ BK[;LK'PX@2r  pa [ BK;K[CL@6r  pa :K [BK;K[CLYYYYY@/.-,)'!44 +''73"326?#73##7#"&54>3273#>54&H^6ZDeB &<(QfNAP' b;qw1YPA^&%80VQQrR|A%A0Zf33U+1kXN20\  ?A -=x@(JKPX@2p:K=K[=K [CK[GLKPX@.p:K[=K [CK[GLKPX@2p:K=K[=K [CK[GLKPX@.p:K[=K [CK[GLK!PX@.rp[=K [CK[GL@2rp=K[=K [CK[GLYYYYY@/.75.=/='$#&$ +''737#"&54>3273#"&54632326'2>54&#"T9C/6]5?A$?Y3V^ 5H;Xh,-;@d?@ 6 (JKPX@6 c  aa [  BK ;K [ C LKPX@2 c  aa [  BK [  ; LKPX@6 c  aa [  BK ;K [ C LK!PX@2 c  aa [  BK [  ; LK'PX@6 c  aa [  BK ;K [ C L@: c  aa :K [ BK ;K [ C LYYYYY@:98742,*'&%$#"! ??"# +332673#"&546"326?#73##7#"&54>3273#>54&L)!&*A)PE66RDeB &<(QfNAP' b;qw1YPA^&%80Vd "!')E<0+R|A%A0Zf33U+1kXN20\  ?A :Jk@ # 5 JKPX@;  pc:K=K [=K  [CK [GLKPX@7  pc:K [=K  [CK [GLKPX@;  pc:K=K [=K  [CK [GLK!PX@7  pc:K [=K  [CK [GL@;  pc:K=K [=K  [CK [GLYYYY@<;DB;J3273#"&54632326'2>54&#"$%8%EB+,W/6]5?A$?Y3V^ 5H;Xh,-;@[ 9@ 0 "JKPX@6  p  ca  [  BK;K[CLKPX@2  p  ca  [  BK[;LKPX@6  p  ca  [  BK;K[CLK!PX@2  p  ca  [  BK[;LK'PX@6  p  ca  [  BK;K[CL@:  p  ca :K  [ BK;K[CLYYYYY@# 4321.,&$!  9 9   +"&54632"326?#73##7#"&54>3273#>54&%$ADeB &<(QfNAP' b;qw1YPA^&%80V%%tR|A%A0Zf33U+1kXN20\  ?A  2Be@   -JKPX@8p [3273#"&54632326'2>54&#"Q##&/6]5?A$?Y3V^ 5H;Xh,-;@-B@$ 2 JKPX@4  pa _ [BK;K[CLKPX@0  pa _ [BK[;LKPX@4  pa _ [BK;K[CLK!PX@0  pa _ [BK[;LK'PX@4  pa _ [BK;K[CL@8  pa _:K [BK;K[CLYYYYY@<:64('&%"  -- +"326?#73##7#"&54>3273#>54&7>7#"&54632DeB &<(QfNAP' b;qw1YPA^&%80V(2 !%9R|A%A0Zf33U+1kXN20\  ?Ae&,!$2) ;KN@$ 6JKPX@5pc=K [=K [CK[GLKPX@1pc [=K [CK[GLKPX@5pc=K [=K [CK[GLK!PX@1pc [=K [CK[GL@5pc=K [=K [CK[GLYYYY@=32#"&54>7#"&54>3273#"&54632326'2>54&#"(2 !%9E/6]5?A$?Y3V^ 5H;Xh,-;Cm"N@KJr  aY:K  Y ; L"!  +''733#73#!7#73#3#73!3#^6XW WB`BW WW WMMW QQrG0000111"S:@ JKPX@1rpY:K[=K;K[CLKPX@-rpY:K[=K[;L@1rpY:K[=K;K[CLYY@ #+%' +''737>54&#"##73>32326?3#"&546p^6S&  #J?0 &IZd/6>"37 -   $ 8*(#QQrka2>Xc%y/!A2-*3s<!% <3)GC#'V@S  aa Y:K  Y ; L'&%$#"!  +'3#737#73#!7#73#3#3#73!3#!7!XpS R!W W d W W!\ [pW WMKU  d1+z00zz00z+^111S";ε JKPX@6 paY:K[=K;K [ C LKPX@2 paY:K[=K [ ;L@6 paY:K[=K;K [ C LYY@7521.,%& +%7>54&#"##737#733#>32326?3#"&546s&  #K@0 %H_ ]Zu t;/7@"37 -   $ 8*(#a2>Xc% %I.w%"A3-*3s<!% <3)Gf+L@I cc Y:K  Y ; L+*)('&%$#"!   +"#7>32326?3#"&/.3#73#3# '6$   ' +%# XW XX 23,  ",+ G001>_9K-PX@2  pc [BKY=K [ C L@9p  pc [BKY=K [ C LY@42/.+)#"!   +"#7>32326?3#"&/.#73326?3#"&5467# (! # %$ [Y  $ 8*(# ~*()  +&-  +C $% <3&"BB-@*aY:KY;L +!!3#73#3#XW XX B2!G001>Db2@/paY=K[CL#& +3##73326?3#"&5467WY[Y  $ 8*(# b/+C $% <3&"Bd6@3rcY:K Y ; L"# +332673#"&5463#73#3#)!&*A)PE66XW XX d "!')E<0+G001>k-:@7pc:KY=K[CL#&"% +332673#"&546#73326?3#"&5467v$%8%EB+,/[Y  $ 8*(#  &1IA(* +C $% <3&"BbJK)PX@"Y:KY;K[?L@_Y:KY;LY@ %% +467#73#73#3#3267#"&41g XW XX `32& *,6+R$1G001!K# 1 ( 88JK)PX@/pn[G001> (@%pY=K[CL#& +#73326?3#"&5467[Y  $ 8*(# +C $% <3&"B' *A@> a cY:K [ C L)'$# +3#73#3##7!##".54632+3264XJW XJX bf  Xc%w2H-%#  A;Qs\0011~00z$,+0'e>C 1MB JK PX@?p  h[7#7"!#"[Y  $ 8*(# ΐOH0;#m 2%(%(+C $% <3&"B^[+-$ )5+@m#:@7JrcY:K[CL#$# +''73#7!##"&54632+326@^6sh  XssX9?'" &6JQQrU00Kkb6(*0IUM"@ JK PX@"h:KY=K\GLKPX@#p:KY=K\GL@#rpY=K\GLYY@""'$$ +''73#"&5463232>7#7MT9OH0;#m #ki^[+-$ )5+1X@U !Ja_ Y :K Y ;L+)%# +37#73#3#73#3#73#737>7#"&546321@dU NB [bOV XW (2 !%9x0011"11G00l&,!$2) 9Nc@`> Jpc _ Y:K[=K;K[CLHFB@987653.,)(%#$%! +3326?>32#"&5467326?3#"&?6&+##7>7#"&54632zl,6,4* $# % 1%.)31BH[(2 !%9p#3%0$ ,", = C9=+(3,6+>yk&,!$2)i >@;JrpY:KY;L  % +'7>3273!73#7!#  ?(5 XW  [2T 1G00)kK %4@1JrpY:K[CL#&% +'7>323326?3#"&5467#G  ⢔  $ 7*)$[&F ]; % <3)I "C@@Jp_Y:K Y;L  +%73!73#7!# 7>7#"&54632?(5 XW  [(2 !%911G00&,!$2).7@4Jp_Y:K[CL$'#& +3326?3#"&5467#7>7#"&54632x  $ 7*)$[p(2 !%9; % <3)Ik&,!$2) D@AJpY:K[BK Y;L  $& +7>7#"&5463273!73#7!# #9;?(5 XW  [!%".K/1G00),JKPX@'pY:K[BK[CLKPX@)p[BK[BK[CLKPX@'pY:K[BK[CLK!PX@)p[BK[BK[CL@'pY:K[BK[CLYYYY@ #&$& +7>7#"&54632'3326?3#"&5467#& #9ꢔ  $ 7*)$[!%".K; % <3)I C@@p cY:K Y;L  +%73!73#7!#%"&54632>(4 XW  [%%$11G00%%)]%9@6pcY:K[CL!%%#& +3326?3#"&5467#"&54636x  $ 7*)$[!"; % <3)I$&;@8JpY:KY;L +%!73?#7!#7!75 WHklEW  \> P ?1 13200<3=ԓ!0@-!JpY:K[CL#* +?#737326?3#"&546? OR[VW Z0  $ 7*)$#/$/,2,; % <3)Iv:i ;@8Jr Y:KY;L% +'7>323#73## 3#73#]  )V W@W XW2T z 00B11G*% ?KPX@ JKPX@ JKPX@ JK!PX@ J@ JYYYYKPX@4pBK[=KY=K ;K[CLKPX@*pBK[=K ;K[CLKPX@4pBK[=KY=K ;K[CLKPX@*pBK[=K ;K[CLK!PX@*rp[=K ;K[CL@4rp[=KY=K ;K[CLYYYYY@ ? ?+#+%% +'7>32#73>32326?3#"&546?>54&#"yY  R~[8.7@$1; *   $ 5*(# ( &F:, 3vg +"B4!**6#j5!% <4+Fc27P[$:(?@<  J _Y:KY;L"  +3#73## 3#73#7>7#"&54632V W@W XWL(2 !%9 00B11Gl&,!$2)*%3HC@ 8 JKPX@6p  _[=KY=K ;K[CLKPX@,p  _[=K ;K[CLKPX@6p  _[=KY=K ;K[CLK!PX@,p  _[=K ;K[CL@6p  _[=KY=K ;K[CLYYYY@B@<:33+#+% +3#73>32326?3#"&546?>54&#"7>7#"&54632*~[8.7@$1; *   $ 5*(# ( &F:, 3 (2 !%9+"B4!**6#j5!% <4+Fc27P[$&,!$2):m>@; JHr Y:KY;L +77#3#73## 3#73#u^6ӗV W@W XWWQQr< 00B11G*4:9@ JHKPX@4rp[=KY=K ;K[CLKPX@*rp[=K ;K[CLKPX@4rp[=KY=K ;K[CLK!PX@*rp[=K ;K[CL@4rp[=KY=K ;K[CLYYYY@::+#+% +77##73>32326?3#"&546?>54&#"T9~[8.7@$1; *   $ 5*(# ( &F:, 3ki+"B4!**6#j5!% <4+Fc27P[$*%FP@ JKPX@9p[BK[=KY=K  ;K[CLKPX@/p[BK[=K  ;K[CLKPX@9p[BK[=KY=K  ;K[CLK!PX@/p[BK[=K  ;K[CL@9p[BK[=KY=K  ;K[CLYYYY@FF+#+%$& +7>7#"&54632#73>32326?3#"&546?>54&#"d #9v~[8.7@$1; *   $ 5*(# ( &F:, 3!%".K+"B4!**6#j5!% <4+Fc27P[$(:*V@S J c  _Y:KY;L%$  ** +267 3#73#73#73##"&54632#*'a5EW XW V W^X9=("!&RTD11G000km6()1*5H@ "JK PX@-h[=KY=K;K\GLKPX@.p[=KY=K;K\GLKPX@$p[=K;K\GLKPX@.p[=KY=K;K\GLK!PX@$p[=K;K\GL@.p[=KY=K;K\GLYYYYY@ *'$(% +7##73>32#"&5463232>7>54&#"3J~[8.7@$1; kLH/<! j&F:,+"B4!**5$^[*,& )6j17P[GB#2@/a[BK[CL   +!!.54>32'32>54&#"U v{4]Mt2\LTCfE#JTBgF$B2sW}KwKTXfU};TcQy2b)2@/a[=K[CL#!  +3#"&54>32'3267>54&#" QS!?]?6D!9;;Gd!1:@7rc[BK[CL.,&$!!"# +332673#"&546.54>32'32>54&#"e)!&*A)PE66,v{4]Mt2\LTCfE#JTBgF$d "!')E<0+sW}KwKTXfU};TcQy2#9:@7c:K[=K[CL31(&##"% +332673#"&546"&54>32'3267>54&#"$%8%EB+,QS!?]?6D!9;;G '7<@9 Jrr[BK[CL42,*!''*% +'7>32'7>32.54>32'32>54&#"     v{4]Mt2\LTCfE#JTBgF$Uj  L'@sW}KwKTXfU};TcQy2 '=@  JK PX@#p32'7>32"&54>32'3267>54&#"DmN    QS!?]?6D!9;;@!xK PX@4  hfpaY:K Y;LKPX@5  hnpaY:K Y;LKPX@0ppa Y:K Y;LKPX@5  hnpaY:K Y;LK!PX@0ppa Y:K Y;L@5  hnpaY:K Y;LYYYYY@!!!$ +74>3!#7#3#!73!"&3#"@3dc3(D K>(3K}*ZRvI"oWwH0獾N@Kr>Yb2)5IF@C/Jp [=K[CL+*BA*5+5))-$&$" +%#"&'#"&54>32>323267"7>54&67>56&'&\E8M`6QS!?]<3N"`3BI3L0p-3/F1 9- cMF%</ !54" $JG5/-7cN6oY8.301=1%0  9E8-+!7K*71#s5989R(s.8R\i 3>Z@W( Jr   p  a Y:KY;K[CL ><64 3 3+!%(% +'7>32#"&574&+3#73#732326?%32>54&+  A 6+4$2bDV XW bdnX)   \)I6;32#73>32#"&5467&"#"#yY  Z-,`6"!;7- -Ivg +Qa& 1M_.\'2G_@\ 7 J p  a _ Y:KY;K[CLA?;920*(''+!%# +%#"&574&+3#73#732326?%32>54&+7>7#"&54632W 6+4$2bDV XW bdnX)   \)I6;32#"&5467&"#"#7>7#"&54632Z-,`6"!;7- -IS(2 !%9+Qa& 1M_.&,!$2)\m.9]@Z# JHr   p  a Y:KY;K[CL971/..+!%$ +77##"&574&+3#73#732326?%32>54&+^6 6+4$2bDV XW bdnX)   \)I6;32#"&5467&"#"#T9cZ-,`6"!;7- -Ikig+Qa& 1M_.$i ;N@K:"Jpa[ BK;K[CL ; ;)%)%% +'7>32#>54&#"#"&'#7332654.546327  ;+0HB:?UfUw_<]&)/W:COTeTlP>T2T u  1<>06>322654.54632#"&5467.#"#".54632iyY  *FCQC`D!<, ="(54&#"#"&'#7332654.546327^6z+0HB:?UfUw_<]&)/W:COTeTlP>TQQr  1<>06>@ <JKPX@*pn:K[=K[CL@*rpn[=K[CLY@75/-$">> +''732654.54632#"&5467.#"#".54632T9*FCQC`D!<, ="(54&#"#"&'732654&'7.'#7332654.546327$+0HB:?UfUr\$*):52 ,"-51K&)/W:COTeTlP>T  1<>06>54&#"#"&'#7332654.546327^6+0HB:?UfUw_<]&)/W:COTeTlP>TWQQr7  1<>06>R@O <JHrpn[=K[CL75/-$">> +77#2654.54632#"&5467.#"#".54632T99*FCQC`D!<, ="(7#"&54632{ bG(6@6( a (2 !%91GȘ1&,!$2)]O4z$ JK PX@,fp  _Y=K[CL@+rp  _Y=K[CLY@.,'#% +7326?3#"&546?#73733#7>7#"&54632   $ 5*)% GSR$G$jh(2 !%98 % <3* C+xx+8&,!$2)emA@>HrpY:KY ;L +77#73##7!#7#3P^6 bG(6@6( a WQQr1GȘ1?2JK PX@0hp[BK Y=K[CL@1pp[BK Y=K[CLY@21#*$& +7>7#"&54632326?3#"&546?#73733#. #9   $ 5*)% GSR$G$jh!%".K8 % <3* C+xx+eD@Ap aY:K  Y  ; L +373#73##7!#7#3#3| bL DG(6@6( D~ ~La 1,Ș,1"]O'}K PX@/fp  a Y=K[CL@.rp  a Y=K[CLY@'&%$#"#% +7326?3#"&546?#737#73733#3#  # 5*(# M L%SR$D#lk%n l8 % <3* CK%}+xx+}%f3f9R@Occ Y :K [ C L98530/.-,+(&#"!   +"#7>32326?3#"&/.3#3267#73##"&7# '6$   ' +%#  VY!5cek]V O](Y(ZN23,  ",+ 0zoY00QC&RD JK-PX@6  pc[BK Y =K [  C L@=p  pc[BK Y =K [  C LY@'  R RQPJH?=:964.-(&  +"#7>32326?3#"&/.32>?3326?3#"&5467#"&546?#7%# (! # %$ 4[ B<0 2Ha  $ 3)&08?!13 PR ~*()  +&-  1:T^$& !% ;4$:<$I:%+(5+f3B2@/a Y:K[CL## +!!3#3267#73##"&7# VY!5cek]V O](Y(ZNB2h0zoY00QC&b6D@A(JpaY =K[CL66)#&' +3#32>?3326?3#"&5467#"&546?#7[ B<0 2Ha  $ 3)&08?!13 PR b/\1:T^$& !% ;4$:<$I:%+(5+f3d+<@9rc Y:K [ C L+*'%"!#"# +332673#"&5463#3267#73##"&7#)!&*A)PE66 VY!5cek]V O](Y(ZNd "!')E<0+0zoY00QC&FN@K8 J  pc:K Y =K[ CLFFED><#&+"% +332673#"&54632>?3326?3#"&5467#"&546?#7$%8%EB+,[ B<0 2Ha  $ 3)&08?!13 PR  &1IA(* 1:T^$& !% ;4$:<$I:%+(5+f3 1>@;cc Y:K [ C L10-+('#$$$" +4632#"&732654&#"3#3267#73##"&7#C,.@B,,C)''& ' VY!5cek]V O](Y(ZN?1;;13;;3"''"!&%0zoY00QC& JP@M< J  pcc Y =K[ CLJJIHB@#&($$$" +4632#"&732654&#"32>?3326?3#"&5467#"&546?#7=(*;=((=)   *[ B<0 2Ha  $ 3)&08?!13 PR s-55-.66.!!! 1:T^$& !% ;4$:<$I:%+(5+f3 1<@9 Jrr Y:K[CL10##*% +'7>32'7>323#3267#73##"&7#       VY!5cek]V O](Y(ZNUj  L'@m0zoY00QC& J*@  <JK PX@.pp32'7>3232>?3326?3#"&5467#"&546?#7jmN    [ B<0 2Ha  $ 3)&08?!13 PR cLa  "6T  u1:T^$& !% ;4$:<$I:%+(5+f3,f, JK)PX@#Y:K[CK [?L@ _Y:K[CLY@*(#" +#"&5467.7#73#3267#73#3267k *,6@=W(ZN VY!5cek]V O]$zf9D&  %".K%Q00zoY00 #D" C&Ey@ EJK)PX@)pY=K[CK[?L@&p_Y=K[CLY@ )&&/" +#"&5467.5467#"&546?#7332>?3326?33267 *,6E< 07? 13 PR [ B<0 2Ha  $ $:L&  %"-N%7>$H:$+(5+1:T^$& !% +3 %F# pimA@> Jr Y :K;L +''733##73####73##^6 W)W I69$J X.\QQr000y006GKPX@ :JKPX@:JKPX@ :JK!PX@:J@ :JYYYYKPX@':KY=K [ =K[CLKPX@*:KY =KY =K[CLKPX@':KY=K [ =K[CLKPX@*:KY =KY =K[CLK!PX@*rY =KY =K[CL@' rY=K [ =K[CLYYYYY@DB)%&&% +''73#"&7#"&546?#7332>?332>54&'#"&54632\T9#Ca=N,(.46: ?\M 90' ADB $&F5 #ki3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3emC@@ JrY :KY;L +''73##73#3!737#7O^6 XNS K7e f7^J QQr0C0011y0:@,%JKPX@.p:KY =K[CK[GL@.rpY =K[CK[GLY@::''$#' +''7332>?3#"&54632326?#"&546?#7T9U ! A7* 1IhnBS 6GP5*2>$/A JQ #ki02IV$n;3$h\ =/002+eX ,Z@W)J c Y :K  Y ; L ,,+*('&%$#!      +"&546323"&54632##73#3!737#7b#!#" XNS K7e f7^J %%&$N0C0011y0i B@?JrpnY:KY;L  % +'7>327!!73!7!  _3 K?'3 =2T ɽ01G K@1JKPX@1  p  n[=K[BK[ CL@/  p  nc[=K[ CLY@ IHFD86-+)(&$ K K% +'7>32".'#"&5467"&/.#"#>32.54632632673qyY  b886##  :1#% ,8531 $  E2!% ,vg y   /  (*HM  / (+IL[ L@I pncY:KY;L      +"&546327!!73!7!%$3 K?'3 =%%01G Kg@d1 Jp  n  n [32.54632632673## 886##  :1#% ,8531 $  E2!% ,.()   /  (*HM  / (+ILmC@@HrpnY:KY;L +77#7!!73!7!/^63 K?'3 =WQQr01GFa@^, JHrp  n  n[=K[ CLDCA?31(&$#!FF +77#".'#"&5467"&/.#"#>32.54632632673T9886##  :1#% ,8531 $  E2!% ,ki   /  (*HM  / (+IL9W -D@AJpb:K[BK[CL!!!-!-'#%$ +#"&5467!>54&#"#73>323267>7W.WQce CU@7. 16% !h9nl= B;?_ QReZ-U&7Tb(A/N'0BHFJ9D" m#.a@^Hr  pn Y:K Y;L$$$.$-'%##"!&" +77#732#!737!!73!7!%32>54&#^6 5jm X23 K?'3 =WZR'UfWQQrl0nIS1G01GMt>Uik `H@F &JHKPX@N  p p  n nY:K [  =KY;K[CLKPX@Q  p p  n nY:K [  =KY;K[CL@N  p p  n nY:K [  =KY;K[CLYY@+"!^][YMKB@>=;943-+!`"` &" +77#%732#!73332>54&#".'#"&5467"&/.#"#>32.54632632673PT9 5jm XOWZR'Uf0886##  :1#% ,8531 $  E2!% ,kie0nIS1GMt>Ui   /  (*HM  / (+IL-.n~@T  4JHK-PX@`p p  n nY:K[ =K [ =K[ CK[ CL@fp p  n n nY:K[ =K [ =K[ CK[ CLY@)po0/xvo~p~lkig[YPNLKIGBA;9/n0n&&'# +77##"&5467#"&54>32#73326?3".'#"&5467"&/.#"#>32.54632632673%2>54&#"T95*'!'e2?A%AY48FOL  $886##  :1#% ,8531 $  E2!% ,H"H;&12&A/kiT<3&'=QQH;w_7#7?(5 XW  [H#"OH0;#m 11G00%([^[+-$ )5+)9%A6 JK PX@D  p hY:K [7#7x  $ 7*)$[#"OH0;#m ; % <3)IG%([^[+-$ )5+0V@S   J  c Y :KY;K [ C L/-*)%# +3#73## 3#73##7!##"&54632+326V W@W XW>sh  XssX9?'" &6J 00B11GJ00Kkb6(*0I;@  0 JK PX@A  hY:K [ 7#7V W@W XWP#"OH0;#m  00B11GF%([^[+-$ )5+*s ?[4@ P JK PX@Op  h[32326?3#"&546?>54&#"#"&5463232>7#74#"~[8.7@$1; *   $ 5*(# ( &F:, 3OH0;#m 2%(+"B4!**6#j5!% <4+Fc27P[$^[+-$ )5+f3m 4@1HrY:K[CL## +77#3#3267#73##"&7#^6 VY!5cek]V O](Y(ZNWQQr<0zoY00QC&9G@D+JHrpY =K[CL99)#&' +77#32>?3326?3#"&5467#"&546?#7T9F[ B<0 2Ha  $ 3)&08?!13 PR ki<1:T^$& !% ;4$:<$I:%+(5+B""JK PX@Bh  pa  a aY:K Y ;L@Cp  pa  a aY:K Y ;LY@ !  +!!#73#7!#7#3#!73!737#73[ Su 3(A K>(3 W3ެRB2!11G00獾11)b?ITIKPX@ ) JKPX@ ) J@ ) JYYKPX@Ip  pa   c [=K[CK [CLKPX@>p pa   c [=K [CL@Ip  pa   c [=K[CK [CLYY@-KJA@PNJTKTEC@IAI=<:831-+'% ?? +3#"&'#"&546;76&#"#"&54>32>3232673"7>54&26?#"pFT "gA27iE -7%73B"6F "Z2AJ[or/3/F0\@^cND$-3_9Hdb/MCJF8(ZH1FB  0!.&(,=1CP"9E8-JGiSD1#xTH9< m#.a@^Hr  pn Y:K Y;L$$$.$-'%##"!&" +77#732#!737!!73!7!%32>54&#^6 5jm X/3 K?'3 =WZR'UfWQQrl0nIS1G01GMt>UiJY"@ ? JKPX@F  p  n  nY:K [  =KY;K [CLKPX@I  p  n nY:K [  =K Y;K [CL@F  p  n  nY:K [  =KY;K [CLYY@*WVTRFD;97642-,&$YY&! +732#!73332>54&#".'#"&5467"&/.#"#>32.54632632673 5jm XOWZR'Uf-886##  :1#% ,8531 $  E2!% ,x0nIS1GMt>Ui   /  (*HM  / (+IL-'gw@M  -JK-PX@X p  n nY:K[ =K [ =K[CK[CL@^ p  n n nY:K[ =K [ =K[CK[CLY@(ih)(qohwiwedb`TRIGEDB@;:42(g)g&&'" +%#"&5467#"&54>32#73326?3".'#"&5467"&/.#"#>32.54632632673%2>54&#"5*'!'e2?A%AY48FOL  $-886##  :1#% ,8531 $  E2!% ,7"H;&12&A/g<3&'=QQH;w_32#73#7!#7#3#!73!737#73s  K Su 3(A K>(3 W3ެR2T 11G00獾11) GQ\KPX@1  JKPX@1  J@1  JYYKPX@Fp   p  cBK [=K [CK [CLKPX@;p   p  cBK [=K  [CLKPX@Fp   p  cBK [=K [CK [CL@Frp   p  c [=K [CK [CLYYY@,SRIH XVR\S\MKHQIQEDB@;953/-'% G G% +'7>32"&'#"&546;76&#"#"&54>32>3232673"7>54&26?#"%yY  0FT "gA27iE -7%73B"6F "Z2AJ[or/3/F0\@^cND$-3_9Hdvg yMCJF8(ZH1FB  0!.&(,=1CP"9E8-JGiSD1#xTH9<Fi '3;@8,+ Jr[BK[CL 0.$"  % +'7>32.54>32'.#"%4&'32>#  u|5]Ms2\z;)BgE% ?+CgE#2T sW}KwKT3Qy5/U}2 *9d@/. JKPX@BK[=K[CL@r[=K[CLY@ 31$"  % +'7>322#"&54>.#"%4&'3267>yY  qUQ!?_?$/DW@T.4 Jpn  _[ BK;K[CL><86//)%)% +#>54&#"#"&'#7332654.5463277>7#"&54632$+0HB:?UfUw_<]&)/W:COTeTlP>T(2 !%9  1<>06>0.(& 77 +72654.54632#"&5467.#"#".546327>7#"&54632*FCQC`D!<, ="(7#"&54632{ bG(6@6( a (2 !%91GȘ1&,!$2)]O4z$ JK PX@,fp  _Y=K[CL@+rp  _Y=K[CLY@.,'#% +7326?3#"&546?#73733#7>7#"&54632   $ 5*)% GSR$G$jh(2 !%98 % <3* C+xx+8&,!$2)eBA@>Ja Y :KY;L +!!##73#3!737#7T XNS K7e f7^J B2h0C0011y0b7P@M)"JpaY =K[CK[GL77''$#' +3#32>?3#"&54632326?#"&546?#7U ! A7* 1IhnBS 6GP5*2>$/A JQ b/\02IV$n;3$h\ =/002+U]JK PX@hY=K\GL@pY=K\GLY@ '$# +#"&5463232>7#7OH0;#m ^[+-$ )5+('/@,$ Jp[=K[CL$"+$ +#"&546?6454&#"#>3232>7&D]60DU 9E9,JGe(#:N+ FdD@Gi +D''73T9#kidD@Hi +D77#T9ki(dD@rW[O"% +D332673#"&546$%8%EB+, &1IA(* . 'dD@W[O   +D"&54632##.()` *dD@cW[O$$$" +D4632#"&732654&#"=(*;=((=)   s-55-.66.!!! ,dD@! JrW[O%% +D;3267#"&546h3:M& *,7K%G# 1 %"/Q.fdDK-PX@cW[O@"pcW[OY@  +D"#7>32326?3#"&/.# (! # %$ ~*()  +&-    dD@ Gri*% +D'7>32'7>32mN    cLa  "6T  t dD@ Gi% +D'7>32yY  vg "0+!7 !mX<<l0 0+#7!!73!7704(uM6(39z2#45-10+##7332>?3326?3#"&5467#"&'-JR \ A<0 2Ha  $ 3*&08? ) w+1:T^$& !% ;4$7>$H:$ 60+3##7!#3267#"&7#UIbCc (  Ac,,9*0KJ!qq  JK PX@4rh  p  aY(K Y)L@5rp  p  aY(K Y)LY@  % +.5463273!73#7!#7#3#K  =(2 XW 2( D K$ XF1G00qX +K PX@;   h  pc  a Y(K Y)L@<   p  pc  a Y(K Y)LY@+ ++*)('&%$#"!     +"&546323"&5463273!73#7!#7#3#:#!#"|=(2 XW 2( D K%%&$;1G00eD+N@KJG pcY(KY)L++*)('&%$# # +7!#7#>32'>54.#"3!73#e6@5( EP1%B1.Ka3,N:!-,QI_ bFƖ %A3MkT# R_p>)2  11G_i 8@5JrpY(KY)L%+'7>32!73#7!#7#3   XW 5( ݜ^2T 1G0ȘF,@ # JK'PX@4  ppa [/K)K[0L@8  ppa(K [/K)K[0LY@'&%$! ,, +"!!32673#7#"&54>3273#>54&1O>-  IVQn4@%f9n{1[Q@^'%84S-I^104UfdQN'0wQP31^  ?A$/H@E.Jpn[/K)K[0L//)%)% +#>54&#"#"&'#7332654.546327$+0HB:?UfUw_<]&)/W:COTeTlP>T  1<>06>7>?#7!#>32#!7;2>5.#"A'-- Q4! ! 2,)&e  X?=Qi,OpD WNk3N3E99x35|q'32#'32>54&#" WNOW XW W@VAW Y@=Qj+NpE[k3N3E:91$11G0000CO6\B&1%:H#5-e+M@JJ pc Y(K Y )L++*)('&%&#+7!#7#>323#737>54&#"3!73#e6@5( EQ1$B1 &W V& A8-QI` bFƖ ,!=11 2+ 11Gi S@-8 JK-PX@Dr  p  aY(K[/K  Y )K  [ 0 L@Ar  p  aY(K[/K  Y )K [ 0 LY@ S SRQPNIGDC@>$)!%+'7>3273#7!#3267>7>32#"&5467326?3#"&?6&+3Y  v XW  ]Dc(4")"#  ($   - 3B6  ,7cLV 2T 1G00>>: )  4<;:987$'$&$%+3267"&54632#"&54632 #"&54632>7##73##73 *!(B 0B$BM.3:$"*# .H)QO MH O e-11*3"B2 * XC00z00U46@3s Y (KY)L +%3!#7!73#73#!#73#3m=+ XW VOW X111G00G00c8@5Jb(K Y)L +7#7333#73'#73 JF,J W p111w119w#<@9JpcY(KY)L6"2$ +%#!73#7!#7#>3232>54&#" $EhC XW 5' CB[]ux.G/4:C&3\F)1G0Ɩ?!7J))0`*E@B J aY(KY)L  * )#! +3!73#7!232>54&+ 32>54&# XW aQY]==,MnUt0D*5=pQKp3O4>B1G0M8Bn B30T<#x1<*-4F',-_ ,@)pY(KY)L+3!73#7!#7#3 XW 5( ݜ^1G0ȘU#5@2sY(K Y)L## +'3267>?#7!#3#7!#%#;3*J"'! c  Wn;/F0 "'/1S<)aaY"R00ܫG=;20,*#%!+!#73#"#"&?3326?>7.'&4>'.'#"&54632;7#73#3267>7>32#"&5467326?3#"&?6&+3. XKR;F @;C - #"C2 ,(") *'XDX XD](8 '%%  (%   - .A6" +7gLX1*?^JGO6..'(./c6B 2/*#-13400@C> )   8?>EHW+%('.'7U?BXG7?;W@09JKPX@4pc [ /KY(K)K[0LKPX@6pc[ (K[ (K)K[0LKPX@4pc [ /KY(K)K[0LK!PX@6pc[ (K[ (K)K[0L@4pc [ /KY(K)K[0LYYYY@42&%&%$ +%#"&'#7332>54&#"732>54&#"#73>32+H`39V%03O4%B1@?&)0E-:8B]30% [1Re\X8<8Y< -+N  =41F)397-= .1JJH('M@Ii ?G8@5JY(K Y )L + 3#73#73#7#73#3#73u.W XW W| W XX W^211G002,0011G;W@T.Jc d  Y  (KY)L;:9876543210-,+*$&$%+3267"&54632#"&546323#73#73#7#73#3#73 *!(B 0B$BM.W XW W| W XX We-11*^211G002,0011G@ !, JK-PX@? p  aY(K[/K  Y  )K  [ 0 L@< p  aY(K[/K  Y  )K [ 0 LY@GGFEDB=;8742$)!+#73#7!#3267>7>32#"&5467326?3#"&?6&+3 XW  ]Dc(4")"#  ($   - 3B6  ,7cLV 1G00>>: )  47>7?e  XX W'-- Q4! ! 2,)&x0011G35|q'@;  aY(K  Y  ) L+'3#73#!7#73#3#73!3#XW WB`BW WW WMMW 1G0000111GIK PX@[/K[0L@[/K[+LY@ +.54>32'32>54&#"8v{4]Mt2\LTCfE#JTBgF$sW}KwKTXfU};TcQy6,@)Y(K Y)L +!3#73#7!#3#73X XW  WW Wx11G0011b:@7a Y(KY)L$! +%!73#732+32>54&# XW jiY:US:V6:E111G0QItG!9M,1;@&@ JK'PX@+pn[/K)K[0L@/pn(K[/K)K[0LY@!  && +"32673#7#"&54>3273#>54&DfB!IVQn4@%f9n{1[Q@^'%84SU|;UfdQN'0wQP31^  ?A`4@1pY(KY)L +373##7!#7#3v bG(6@6( a 1GȘ11"xJKPX@(pf Y(K\0L@)pn Y(K\0LY@""$% + #"&54632>7##73##73.3:$"*# .H)QO MH O x3"B2 * XC00z00M6#-7' JK-PX@+  c  c Y(KY+L@) a  c  cY+LY@3210)(##+#3#737.5467>37#73"%4&'267>832'32>54&#" WG'5 X?=Qk+Ppk4N4E;91G0CN6_E(1'32'32>54&#" XX XX XW Y?=Qj+Ppj4N4E;91G0011G00CN6_E(1'32'32>54&#" XW Y?=Qj+Ppj4N4E;91G00CN6_E(1'7!7!>54&#"#73>32D\%%54&24Q<(  ?U?h45% _7rb+Sz 81_ %6#3Sh41(Z\M]J(+lQR!1wK PX@3  a [/KY(KY)K [0LKPX@3  a [/KY(KY)K [+LKPX@.  a [/K Y(K [)LKPX@3  a [/KY(KY)K [+LK!PX@9  a [/K Y(K Y)K [+L@3  a [/KY(KY)K [+LYYYYY@.,&$! &$ +73#73#73#3>32#.5467#32>54&#"X XW XE?Vl>t2\Qv{LTCfE#JTBgF$111G00AsU1wKTs+^XfU};TcQy)4 JK PX@2h   a Y(KY)K \0L@3p   a Y(KY)K \0LY@!+*.,*4+4&%" )) +726?>7.54>3!#3#737#"#"&?33#"<8:+5<+Jd9' WW WCe,@97.?, YpLy1F.>'"y)1 F58T7011--z11B=47&%41@#1;-%5 JKPX@%p*K[1K[+LKPX@!p[1K[+LKPX@%p*K[1K[+LK!PX@!p[1K[+L@%p*K[1K[+LYYYY@'&/-&5'5&&'" +%#"&5467#"&54>3273326?32>54&#"6$"% 0\1?9%?X39@;.\ $"H;&.,'A-g<4"$/MOSG9w_>I8zH#&dAY\4I;73#">32#"&"3267>54&@%Q]U"!'nHeB' )4?#QU!>[:Qf&953+@.H[2t.Nj< ;,ZD=uZ8lL( 'j63K7))a*8A)%43@0a[1K[0L20*( %%$+74>3223#"&"7>54&32>54&))Gb8?C:5 (-tWNN4+" 7T` (3/%8@X;u\:6+,=*(MbTk/@":0 /7#2+0 '1@.%$J[1K[+L"  ''+"&546?>54&#"'>32326732>54.#"'>32'2>54.#"TQ">Y6=F -!"@!T.3C&!EkD+B-%.B)/ dK8oW7N9%K <. '&$Ye&';Wc(893'5@2! Jp[1K[+L''"+$+74>3232673#"&"7>54&3&D]61CP 9E8-JGeW#:N+ E/(q[  JK PX@K  p h  n  cb*K [1K)K \+LKPX@L  p  p  n  cb*K [1K)K \+LKPX@H  p  p  n  cb [1K)K \+LKPX@L  p  p  n  cb*K [1K)K \+LK!PX@H  p  p  n  cb [1K)K \+L@L  p  p  n  cb*K [1K)K \+LYYYYY@ ZXTSRQPOJHFECA;97620$"&'"+7463232>54&#"#>323733>32#"&5463.#"32673#"&5467##7##"& (;'"2'P067a6B6a '2>#13$8'#"/'D7<5c9C:_ %3C(14Q'Hdm%#123NBA90.O:!0(%>^p1$332HHN72.T@&27W@T2Jpcc [ 1K[ +L-+)(&$  77 +".54632+32654&#"732654&#"#>326*9!5B%7  " ?8-+)83]9IL;;$+j *$D/(*)<(&&%@8<0,D 1%B\C&2g$JK PX@!pY*K[0L@!pY*K[+LY@22)#&& +32>?3326?3#"&5467#"&546?#7[ B<0 2Ha  $ 3)&08?!13 PR 1:T^$& !% ;4$:<$I:%+(5+C&QյC JK PX@5  pc[(K Y *K [  0 LK'PX@5  pc[(K Y *K [  + L@3  pcc Y *K [  + LYY@QQPOIG><98&($$$""+'3267#"&54632#"&5463232>?3326?3#"&5467#"&546?#79 16XH0M =[ B<0 2Ha  $ 3)&08?!13 PR y7:*.%1:T^$& !% ;4$:<$I:%+(5+09]@ #*JKPX@5  p cY*K[1K)K[ +LKPX@7  p c[*K[*K)K[ +LKPX@5  p cY*K[1K)K[ +LK!PX@7  p c[*K[*K)K[ +L@5  p cY*K[1K)K[ +LYYYY@6520 99 +"&?4&+##73326?>32#"&5467326?.!30DG|[ :*5*2'  &'$ 5 2..+;+";$/$ 2"/6%?59.)2>@;JpY*K[0K[0L#&$"+7#"&54632>7>7#7!326?3#"&546?#.  'I"YX]  $ 8)+!J,I+)  .+;%!<2*I7\@Y2/ JpY*K[ 0K)K[ 0L10)'$# 77 +"&54632>7>7#733326?3#"&546?#+  %L"X^b  % 7*+M)N". )  -+g;%!<2(Ka++ !@@=paY *K)K[+L!!#& +373326?3#"&546?###732'3267>54&#"QS!?]?6D!9;;*%3JKPX@/p[1KY*K)K[+LKPX@%p[*K)K[+LKPX@/p[1KY*K)K[+LK!PX@%p[*K)K[+L@/p[1KY*K)K[+LYYYY@33+#+% +3#73>32326?3#"&546?>54&#"*~[8.7@$1; *   $ 5*(# ( &F:, 3+"B4!**6#j5!% <4+Fc27P[$(E JKPX@-[1KY*K[+K Y,LKPX@#[*K[+K Y,LKPX@-[1KY*K[+K Y,LK!PX@#[*K[+K Y,LK-PX@-[1KY*K[+K Y,L@+[1KY*K[+K Y,LYYYYY@%#&# +#73#73>32#"&'4&#"32> H[(4]3??&@Y32A Mt-#H;%12&A0,,z+RHPK:w_<7+.;=V^ 4I;Wg-%6@3Jpn[1K[+L&'$&"+%3#"&54>32#"&5467.#"326X/RBRY 5#;T_$32>32326?3#"&546?>54&#"#>54&#"##77/6=!1- +2;"/6 .   $ 5*(# '  %B7) .JY $C9+ /J~[ױ#C3.$ / <.-'2w7 !% <3'"Be4?3#"&54632326?#"&546?#7U ! A7* 1IhnBS 6GP5*2>$/A JQ 02IV$n;3$h\ =/002+0'7GX@U' JY(K  [1K  [+KY,L98)(A?8G9G1/(7)7&#&#+#73>32#"&'3#73#"&54>327"32>54&2>54&#"c VI5><9T647SN NRF*BC"+$%"+$# +>32#"&546732673#"&/#"&54632>7'.#"#>32/Q5"C1( %,)%( 9U6L2 $0.($RS^'ZY%?3326?3+73267> '08> 13 PR\ A<0 3G`  $ 80$  $7>$H:$+(5+1:T^$& !%=>I#"6!()0/l JK PX@&pcY*K[0L@&pcY*K[+LY@ &&("+%#"&546?#"&546?#73326?3326?38*(" >"/E R" !#+A :Hc  $f<2)J#185+b7!+>%=5Ll!JK PX@#pY *K [0L@#pY *K [+LY@LKFD&)*#% +%326?3#"&546?#"&5467#"&546?#7332>?332>?3  $ 3*$ .4;2)-4>"/0 VR a $D:, 0JZ $C8+ 1H& !% ;4$0"@12* (=.-'4 +69Ta(4:Ta'=H5[~  JK PX@*  p _Y*K [0L@*  p _Y*K [+LY@WUTRLKHF&&)*" +%#"&546?#"&5467#"&546?#7332>?332>?3326?3+73267>  $  .5;2)-5="/0 VR a $D:, 0JZ $C8+ 1Hc  $ 70$  $)#@12* ) =/-'4 +69Ta(4:Ta'& !%A7##7!>32#"&732>54&#"r ]5+ #2(E4 3B%=O*4@/&&2''!2@X.3g-Mx, L(>4'K;$'L *!4@!"A>-?(JK PX@)pcY *K [0LK-PX@)pcY *K [+L@3pcY *K[+K [+LYY@<:20,*'&%$#& +326?3#"&5467#"&'&6?#73>324&#"32>`  $ 7*(# ]";O.3= HQ I<%3CI'"4  &2'8 % <3)E#L=(#b++;,!"?&!4@>'/@,JcY*K[+L($#$+%#"&'&6?#73>324&#"32>";O.3= HQ I<%3CI'"4  &2'#L=(#b++;,!"?&!4@-J@Gpac[1K[ 0L'%#"  -- +"&54632+3267>7#73>54&#"#>32@R 2"(=  .3.@2d=VL<[ :4&-%9' 6A33LEdK7pY9%1KPX@-a[1KY*K)K[ 0LKPX@%a[*K)K[ 0LKPX@-a[1KY*K)K[ 0LK!PX@%a[*K)K[ 0L@-a[1KY*K)K[ 0LYYYY@+)   +"&5467###733>32'3267>54&#"QT\EG~[ 8\ *;M.TR!@^+60 (6"5 dN+)L:"dK4o[;6D<>?6D!9;;5>JK PX@(h c Y*K\0LK-PX@)p c Y*K\0L@3p c Y*K[0K\0LYY@76:86>7>&#&+#" +7#"&?3326?>7.546;326?3#"&546?#"737#"*-/ $ /"(8uZ]  $ >)) A%)iE?b3232673#"&"7>54&  P&D]61CP 9E8-JGeW#:N+ E/(3 3?9$JKPX@,p  [(K [1K[+L@*p  c [1K[+LY@!54 4?5?20.-+)    +"&546323"&546324>3232673#"&"7>54& "!!&D]61CP 9E8-JGeW#:N+ E/(p)=@:J)GaY(K[1K)L%' +>54&#"##737#733#>32;^@"#J?0 &J\ Z[{ y>06< 4/-PoBo"u2"->Xc%&C/r&"C5 <:Cs  3d@10JKPX@/K[1K[+L@r[1K[+LY@ .,! 3 3%+'7>32"&546?>54&#"'>323267SyY  Jppa[1K[+L%'$&"+%3#"&54>32#"&5467.#"3#326X/RBRY 5#1? ' 7#7#"OH0;#m 2%([^[+-$ )5+.@C@@JcY*K[0K[0L&(&#$% +##"&54632>7>7#7!>32#"&'&6732>54&#".H"/  &I"XWH<%3>!9P/2= +&2&#!3 +)  ,+82%M?)!Y8&!4@!"?+-B@? J  caY*K)K[+L)'$#$ +%#"&'&67###73373>3232>54&#"!9P/2= AI}[ 2&""4%M?)!W6+8!4@!1O";  JK PX@6 paY(K[1K)K [ 0 LKPX@6 paY(K[1K)K [ + LKPX@2 paY(K[1K [ )L@6 paY(K[1K)K [ + LYYY@7521.,%& +%7>54&#"##737#733#>32326?3#"&546r&  #J?0 &I] ZZ| y</6>"37 -   $ 8*(#a2>Xc%&C/r&!A2-*3s<!% <3)G0 E!KPX@/6JKPX@/6JKPX@/6JK!PX@/6J@/6JYYYYKPX@:   p c/KY*K[1K)K [ +LKPX@<   p c/K[*K[*K)K [ +LKPX@:   p c/KY*K[1K)K [ +LKPX@<   p c/K[*K[*K)K [ +LK!PX@<r   p c[*K[*K)K [ +L@:r   p cY*K[1K)K [ +LYYYYY@ BA><*($" E E% +'7>32"&?4&+##73326?>32#"&5467326?yY  :.!30DG|[ :*5*2'  &'$ 5vg y2..+;+";$/$ 2"/6%?59.)C& >@ 0JK PX@&p/KY *K[0LKPX@&p/KY *K[+L@&rpY *K[+LYY@ > >)#&+% +.5463232>?3326?3#"&5467#"&546?#7  Ps[ B<0 2Ha  $ 3)&08?!13 PR n   71:T^$& !% ;4$:<$I:%+(5+R@ D = JK PX@= pc[(K Y *K [ 0K [3LK'PX@= pc[(K Y *K [ +K [3L@; pcc Y *K [ +K [3LYY@RRQPJHA?86#($$$""+'3267#"&54632#"&5463232>?3#"&54632326?#"&546?#71 16XH0M ?U ! A7* 1IhnBS 6GP5*2>$/A JQ y7:*.%02IV$n;3$h\ =/002+CI%2N@$3 B4 A JK PX@0p  c _Y *K[0L@0p  c _Y *K[+LY@MKFD?=8622)#&& +32>?3326?3#"&5467#"&546?#7.#"#"&'7326?>32\ A<0 3G`  $ 3*'08?!13 PR  %"   # 1:T^$& !% ;4$;=%I;%+(5+ % #5 - JK PX@8  hn   a  cY(K Y)L@9  pn   a  cY(K Y)LY@,)#! &2+>32#!73##737#73#!#732>54&#"-=Pk%JnH XF(5X Y/'k3K1E;9 8O0S>#1ܗA//A$1A#5%*/A@ %JKPX@.c[1KY*K)K[0LKPX@$c[*K)K[0LKPX@.c[1KY*K)K[0LK!PX@$c[*K)K[0L@.c[1KY*K)K[0LYYYY@ &'%+&# +>32#"&'&6?>54&#"##73>3232>54&#"9%3> :P01?  &F:, 3J~[8.7@$1; @&2&#!3 83%M?)!Y6B27P[$+"B4!**6&!4@!!@E'cK PX@a[/K[0L@a[/K[+LY@%$  +.54>32"!>54&32>7!6v{5]Ms2\"1Q@/KKT2T@/ hsW}KwKT-Ja2*TciXf2Of4/2)4@1a[1K[+L'&! +"&54>323>54&#"3267>7#QS!?] 6D!6CK'#a1@.JY(K[/K)L$"+>32#"&5467##73#.Y<"'$ #?-57J X,Wa!+  PQ(y00 @  JKPX@Y*K[1K)LKPX@[*K[*K)LKPX@Y*K[1K)LK!PX@[*K[*K)L@Y*K[1K)LYYYY@ $$+##73#7>32#"&5467H7 ; Cp-O6:++Qf! St? /@,rY(KY)L +7!73#7!73! XW mG'/111G0 +t@ )(JKPX@#p*K[1K[+L@#rp[1K[+LY@&$ +++"&546?>54&#"#73>32326732326?3#"&546?>54&#""&54632*~[8.7@$1; *   $ 5*(# ( &F:, 3c$$+"B4!**6#j5!% <4+Fc27P[$'(N$/;X@U.Jpn  _[ BK;K[CL10750;1;//)%)% +#>54&#"#"&'#7332654.546327"&54632$+0HB:?UfUw_<]&)/W:COTeTlP>T$$  1<>06>?332>54&'#"&54632  P#Ca=N,(.46: ?\M 90' ADB $&F5 n   3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3pii $>@;"Jr Y :K;L$#! % +'7>323##73####73##   W)W I69$J X.\2T z000y006 LKPX@ ?JKPX@?JKPX@ ?JK!PX@?J@ ?JYYYYKPX@'BKY=K [ =K[CLKPX@*BKY =KY =K[CLKPX@'BKY=K [ =K[CLKPX@*BKY =KY =K[CLK!PX@*rY =KY =K[CL@' rY=K [ =K[CLYYYYY@IG)%&&)% +'7>32#"&7#"&546?#7332>?332>54&'#"&54632yY  #Ca=N,(.46: ?\M 90' ADB $&F5 vg 3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3piX 0X@U.% Jc Y :K  ; L 0/-,+*)('&$#"!      +"&546323"&546323##73####73####!#" W)W I69$J X.\%%&$N000y006 XN@ K   JKPX@0 [?332>54&'#"&54632w "!!#Ca=N,(.46: ?\M 90' ADB $&F5 .')%'3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3qf3K PX@B hpc c  a  Y :KY;L@C ppc c  a  Y :KY;LY@+  3 3210/.-,+*)('&%$#"!  +"#7>32326?3#"&/.73!73#7!#7#3#e '6$   ' +%# "=(2 XW 2( D K23,  ",+ 1G003;GA, JK-PX@3  pc [BK  [=K [ C L@:p  pc [BK  [=K [ C LY@!=<32326?3#"&/.4>3232673#"&"7>54&# (! # %$ &D]61CP 9E8-JGeW#:N+ E/(eq @@= JrY :KY;L % +.54632##73#3!737#7A   XNS K7e f7^J $ XC0C0011y0 ?@ 1*JKPX@.pBKY =K[CK[GL@.rpY =K[CK[GLY@ ? ?''$#+% +.5463232>?3#"&54632326?#"&546?#7  P|U ! A7* 1IhnBS 6GP5*2>$/A JQ n   702IV$n;3$h\ =/002+Eg!@UYM +%!7!V4dN#@UYM +%!7!>&6@@JW[O$& +>32#"&54>@(3 "*>/7! :-2@J[BL$& +7>7#"&54632(4 "*>/8! :/tW@J[CL$& +7>7#"&54632(3 #*>/7!!:.)$@!JW[O$-$& +>32#"&54>7>32#"&54>@(2 "*>(2 #)>/7! :-/7! :-)@J[BL$-$& +7>7#"&546327>7#"&54632(3 ")>(2 ")>/7! :./7! :.tVW)@J[CL$-$& +7>7#"&546327>7#"&54632(4 "*>(3 #*>/7!!:./7!!:.] +U@ JK-PX@cBK?L@rc?LY@ %)$ +7>327>32#"&/#7#"&54632 6  *k=  : Qs@?QC8*JK-PX@ ccBK?L@r cc?LY@ML)'))'$ +%7>32#"&/#"&546?#"&546327#"&546327>327>32#"&/!X~ 4w |"Ow  t7z     3x @W[O   +7"&54632~!*."!)-("%+("%+Db %@"[CL      +"&54632#"&54632$$$$ '('(b #0@-[CL ##    +"&54632#"&54632#"&54632$$$$$$ '('('(6! +9IUj@gpc    d c;K  [CLKJ-,QOJUKUFD><31,9-9*("    +%"&546323#72654&#"4632#"&"&54632%32>54&#"2654&#"KTgPMS.Er;[;?9009A3kUCP1J/?QJTgPLT.F.+2!0+1!@8/0:A4VKNiVC&F4ET9+9L92:]uK<'L;$HHVLNiWB&F5(-.:(--;pT9+9M91:0!0+'7 G%kǻ0+7'7'7 G%kǻ@:K;L +3#,-Fg,!-@*[^K[_L!!  +"&54>32'267>54&#";90C*<:1D&-"-,D?/\I.E:0^J.*0%"P"!%1(!I"#'S1 '@$ JbZK[L +##7#?33#37h,: FI,}:UU%R'&>@;!JccYZK[_L#$"$" +#"&54632#326'4&#"'73#>32XTH/;  #1/(7! !18AY)% C, /o+g-'5C@@"Jpc[^K[_L)(1/(5)5$'$)$ +#"&54>7>32#"&5467.#">322>54&#"r%7%9> ='-;   15./:  /."8+;6=;7&$  EE,!+F*"1"@pYZK[L +#>7##73>$5D$" %3)1$VWT Ew$%HOS\+'7)@&5 J[^K[_L,*" *" +#"&'467.54632'>54&#"326'4&/.'oSD6F+" E>1A!L&!#)g'%(7% ?G1.,: "7<,'#3 %B-! !%) 4]-'3C@@Jpc[^K[_L)(/-(3)3&$'$" +#"&546323267"&54>32"32654&E8*.A &.3%/D%6#<<93H+F)!&R|!-@*[RK[SL!!  +"&54>32'267>54&#";90C*<:1D&-"- D?/\I.E:0^J.*0%"P"!%1(!I"#'  v%@"aNKZOL! +#73267>733#73_ ,  )XV ^+& (( 6{"6@3 Jpn[NKYOL$'' +!#?>54&#"#"&54632373 q38$ J646O<^(_+F+  -9+'9M-IB=|>J@G6Jpcc[RK[SL=;42.,+)%#! " +4632#"&5&632#32654&+732654&#"#"&RK/3>%  VA29   +0!' 2' #  +1,*"4  :D+% 6'8"  Ox '@$ JbNKOL +%##7#?33#37',: FI,}:UUU%E{&>@;!JccYNK[SL#$"$" +%#"&54632#326'4&#"'73#>32TH/;  #1/(7! !18AY)% C, /o+%J{'5C@@"Jpc[NK[SL)(1/(5)5$'$)$ +%#"&54>7>32#"&5467.#">322>54&#"0%7%9> ='-;   15./:  /."8+;6=;7&$  EE,!+F*"Hew"@pYNKOL +3#>7##73>$5D$" %3)$VWT Ew$%HOSD'75 JK PX@[RK[SLK PX@[NK[SLK PX@[RK[SLK PX@[NK[SL@[RK[SLYYYY@ ,*" *" +%#"&'467.54632'>54&#"326'4&/.'.SD6F+" E>1A!L&!#)g'%(7% }?G1.,: "7<,'#3 %B-! !%) 4C{'3C@@Jpc[NK[SL)(/-(3)3&$'$" +%#"&546323267"&54>32"32654&8*.A &.3%/D%6#<<93H+F)!(,m@ ! JK PX@/ h a  cY:KY ;LKPX@0  p a  cY:KY ;LKPX@/p U   cY:KY ;LKPX@0  p a  cY:KY ;LK!PX@/p U   cY:KY ;L@0  p a  cY:KY ;LYYYYY@(' +#3!73#7!#7#!>32#"&5467#40Io XW 2)F:$'J24.' D2>11G0HH$ /GY,J440T@Q pca  a[K Y  L0/+*)('&#"! ""$#+737#735>32#"&5467.#"3#3#!73!7>7#eFH @ hY@N -6@ } y &).&%v1'L:#Zf:1"KE#:$+=d8 D.&Q8@ 0 JK!PX@;p pa  a[K [  LK"PX@?p pa  a[K K [ LK#PX@;p pa  a[K [  LK.PX@?p pa  a[K K [ L@Cp pa  aK[K K [ LYYYY@8742/.-,*(#"! %"+73>7#73>3273#>5.#"3#3#32673#7#"&'5#2BD F!~U3I!+1>2;R   6@=Q13L.WcJ#$Ke#!?-.P6$#$7!7!>54&#"#73>323#3!32673#7#"&5467#9~(] 4%131Za _54&#"706?)FFP=/3ZQ$#97 $u@>VNR@'Bzb/1HQ~8C"0&DG6Dp-=OS @ QPF>5.0+!#"&54632>7#73>32#"&54677"&54>32'267>54&#"7!*+4% (:*H .-3"!(;-.<)9 76):!" ! ~ }]%)*gz_( ) $^/3%D450&C2"= @,,8(@JGKPX@'h  ] Y:L@(p  ] Y:LY@"(('&%$#"!  +#53##5!#'#373#3#53#3#53#55OIO4`_22-}v,228'!LssLH'''6''!'V! 0+".54>32!32673"!4&{PqE)LpG\w[c5hcle 2[LO\4OPih~d ""@JHUYM +%'%!!rI =y@H;L +'#' = IId # @HGUYM +'7!5!'7 IIV = x@G:L +737 =II  0+%'35'537375}jg&VV%gjUVWqghuabi 0+%'#'7373'#3'uכqgh:abigj}jg&VV%UVWd;  0+5##57'533537'#;qghuabiLjg&VV%gjUVW 0+%#575#7##='7FV%gj}jg&UVW^huכq9abi"0+!7 !mX<<ld5d@UYM +!7! Z 5/R#/ )$ 0+#"&'#"&54632>323267.#"%"32654&J=3K""O38LI>4O""M2@B2*&@A(&2%@ >%*//ICJ>((>GC;OB((BN<0/6%&=11:%&96,+1>;/*0+"#>3232673#"."#>3232673#".*+P(-(*$+ +?3"1)&R)+M*.)*$* ,@3"0('!9:"#E2!9:"#E2Xk*, 0+%##7#737#73733#3N/N{ e T/T} eii//qq/g:<   0+%%7%!7!  o0+7t/h:   0+7-7!7!w> KF oL7tv0/S'82JKPX@*a [ BK[=K[CL@(aa [ BK[CLY@876543,*)(''  +2#".54>"32>54.#53267>533#53N^55^NN\44\NHyV00WxHH{W12WzWK ,GK1ZOO]33]OOZ1.TyKH{X12XzHJyU.' ''S'J@ ? 5JKPX@6  pf  cb [ BK[CL@7  pn  cb [ BK[CLY@#)(FD=;43210/(J)J''  +2#".54>"32>54.2373#57>54&#"#"&546N^55^NN\44\NHyV00WxHH{W12WzG5A?2H ^&+#% F1ZOO]33]OOZ1.TyKH{X12XzHJyU.1/0F(:@p.P A& -1S'`x@uI [4J  pp ccc [ BK\CL)(VTPNGEA?><86/-(`)`''  +2#".54>"32>54."&5463232654&+532654&#"#"&54632N^55^NN\44\NHyV00WxHH{W12WzR1B '!/%(! %$$ ' I.5H#+,'S1ZOO]33]OOZ1.TyKH{X12XzHJyU.&*  !'#$(  +++/!0*%<4S':^@[65,Jpp b [ BK[CL:987430/+*)(''  +2#".54>"32>54.#5#5>733573#N^55^NN\44\NHyV00WxHH{W12Wz802> >.8**1ZOO]33]OOZ1.TyKH{X12XzHJyU. H)3mUZk.Nc+S'No@l721 L J  pa c   c [ BK\CL)(GEA?;96543/-(N)N''  +2#".54>"32>54.2654&#"'73#>32#"&54632N^55^NN\44\NHyV00WxHH{W12WzS%'*#( ӱ$;EK?-E '1ZOO]33]OOZ1.TyKH{X12XzHJyU.%()#$  5`27:A'+  S'JVo@lH+ Jp c  c  c [ BK[CLLK)(RPKVLVCA=;75/-(J)J''  +2#".54>"32>54.">32#"&54632#"&5467.2654&#"N^55^NN\44\NHyV00WxHH{W12Wz:.)/3G%/HANH+= !!"&%"'%%1ZOO]33]OOZ1.TyKH{X12XzHJyU.@K3<.X[nW#(  /##))"%.S'9@ 6*(JKPX@&ha[BK[CL@'pa[BK[CLY@543210''  +2#".54>"32>54.#54>7##53N^55^NN\44\NHyV00WxHH{W12Wz4>!, )41ZOO]33]OOZ1.TyKH{X12XzHJyU.#PNJ:q":S'?L\M@JA=1Jcc [BK[CLQOHF86,*''  +2#".54>"32>54.#"&5467.54632'>54&#"32654&/.'N^55^NN\44\NHyV00WxHH{W12WzFO99O H66AB (&(()%.D 1ZOO]33]OOZ1.TyKH{X12XzHJyU.v7939- *01/+* 0[""$  'S'HTo@l+ FJp  c  c c [ BK\CLJI)(PNITJTA?;953/-(H)H''  +2#".54>"32>54.267#"&54632#"&54632"32654&N^55^NN\44\NHyV00WxHH{W12WzU2&)5EP3I=GO,C %""#""'" 1ZOO]33]OOZ1.TyKH{X12XzHJyU./>H5"32>54."&54632#53267>533#532654&#"N^55^NN\44\NHyV00WxHH{W12Wz"ACCBE>A7+18..-1ZOO]33]OOZ1.TyKH{X12XzHJyU.^]_^^_Za)' ''MFIMMIENS'3? @ 94-( 0+2#".54>"32>54."&54632'2654&#"N^55^NN\44\NHyV00WxHH{W12WzGAHHBEFIB..-1ZOO]33]OOZ1.TyKH{X12XzHJyU.]]_^^_Z`'NEHNNHDOS+ %  0+2#".54>2654&#"7"&54632N^55^NN\44\OCIFEBHHB.-.1ZOO]33]OOZ1`Z_^^_]]'ODHNNHENx30+3!xDx &0+7!%!!xX QFP3=0+7!FPFP2=0+7!%!!F}Pi<A^? 0+%".54>32'2654&#"N8eJ++Je88dI++Id89KK99LLA%B_9:_B$$B_:9_B%{F>?EE?>F<A9? 0+%".54>32<:_C$$C_:8^B%%B^A%D_97]C&&C\69`D&dD 0+".54>32'2654&#"Oa77aOOb88bMZml[Zoo2\QOX00XNQ\2t[WkoWXsD0+)!!Kmq h;0+#%!!#73!=# u*K6 xUlX;  0+)!!''7'77KkuG l2 <LX RMD=<,0+%'"&/#''.'.5.'>7&'&5467>7>7646;76#"37265'4&2#"&546Y  4  ( 5 ]@ =*I"#(b< "X  k    !    6          2 <LX RME=0+7&574632>7>''&'.'&'##'7"326574&#2#"&546P  X" 7&'&5467>7>7646;76326?>32326?>32326?>32;2654&/.&727>32'.#"#"37265'4&2#"&546"#"&#"32654&Y  4  ( 5 ]@ =*I"#(b< "X  D.(   )& 2" "Cq?9%3   L      u!    6     gW ] T F? ."0       /d<@ v:!0+?'46?5.7.'.7>7>3>7&67&6322#"&'&#"&/&&#"&/&326?>'&6'.#"&7>54&4&54654&#"32654&#"3726'#"&54632j!    6     gW ] T F? ."0       Y  4  ( 5 ]@ =*I"#(b< "X  .(   )& 2" "Cq?9%3   v      2o <@ o\0+7&574632>7>''&'.'&'##'%.#"&7>322767>54&'&'&;2632326/.54676&32326/.5467>32326'%"326574&#2#"&546"32654&#"#"&P  X" 7"&='&637237265'4&#"4632#"&654&/.5467>32654&/.547>32654&/.546=4&#"3267>'64'.54676732654&#"!    6         gW ] T F? ."0   Y  4  ( 5 ]@ =*I"#(b< "X  k    .(   )& 2" "Cq?9%3   v  Oyb0+#u=#6 xUS$KPX@)h[BKY =K[CLK)PX@'h a[BK[CL@(p a[BK[CLYY@$$#!  +2#".54>#35##+N^55^NN\44\@KG,1ZOO]33]OOZ1''? 'S6S@P*4Jpn[BK[=K\CL65.,%#  +2#".54>##7>54&#"32654&'>32!N^55^NN\44\ G2@A62G %"+&^1ZOO]33]OOZ1a?9(G0/00-!%B O.SL@)>JK#PX@0c c[ BK[=K [CL@.cc c[ BK [CLY@KIEC<:6431-+$"  +2#".54>4&'>54&#"32654&'>32+32#"&'>54&#"326N^55^NN\44\'++"I5-I ( %$% !(%/!& A1:T1ZOO]33]OOZ1Z%)0!/+++  (" #'! *'5S&@ "JKPX@&pf[BK\CL@'pn[BK\CLY@&%$#  +2#".54>35#5#>7#33N^55^NN\44\))9.= >1091ZOO]33]OOZ1>+cN.kZTn3)HS:@ ,JK1PX@0pc[ BKY=K[CL@.pcc[ BK[CLY@9731*($"  +2#".54>4&#"735#>32#"&'>54&#"326N^55^NN\44\E;$'#*'%& E.?J1ZOO]33]OOZ1d72_5  $#)(  +'AS6B@ JKPX@1p c[ BK[=K\CL@/pc c[ BK\CLY@87><7B8B31-+'%  +2#".54>4&#">3232654&#"32>"&54632N^55^NN\44\G3/*.  =,HMAH/%&&%("$%1ZOO]33]OOZ1i<2K@  (#Wo[W.7.%")*"#/S%?@<%#Jpn[BKCL  +2#".54>46?5#3733N^55^NN\44\b4) ,">1ZOO]33]OOZ1Q:"q:JMP$S+8Hj@ <8#JKPX@ [BK[=K[CL@c[BK[CLY@GE31*(  +2#".54>4&'>54&#"326'.54632467#"&N^55^NN\44\A66G P99N&)  D-%*(1ZOO]33]OOZ1a/*+/2/* -949"j'  $S4@Y@V &Jp cc[ BK[CL65<:5@6@31-+$"  +2#".54>4&#"3267#"&'>54&#"326'2#"&546N^55^NN\44\=J3OE4(&3$ A,PG(!"(""#1ZOO]33]OOZ1SU8C<5 2654&#"#35##+"&54632N^55^NN\44\CA>EBCC81+R...1ZOO]33]OOZ1aZ_^^_]^)''? 'NEIMMIFMd 0+".54>32M[33[MN[22[4]LK\44\KL]420+!  Y a`20+%%' a 20+ '7Y T TR20+ 7% TRY 20+)kG20+ N80+TkGt0+7F0+ #;l$A`0+3Mk;7.   0+!#3'3#6}TQ())[  0+7!!733#3~5~džUQ(T)[E/fJK PX@ h[BKZ;L@!p[BKZ;LY@//)* +%!7>54.#"#733.54>32371,O;#'B/@bA"%(%' 3ZK?_>o:6Uet<'G5 ?hH7#"&54632(2 !%9&,!$2)0+'3267#"&54632#"&546324 16XH0M y7:*.%RR%/;cks{[A,|xtpljd_K82*&" 0+#"&54632.#"32674632#"&'#5353'4&#"32632654&/.54632.#"#"&'#'##73!3##5#%3##5#%32#'##7''2654&+4632#"&'3#3##%3#"&=33265'#5353732+%4&#"3262654&+32#'##7'373#'2654&+N! %&!*(!!''!!(RTj "! D;88978_:&#'q'p( "&&" (iVSSQT'9$$%%7%:&#'<0/<z'A)$%)" )$**$$))'~~K!!!!   '**<99;JJ :$))$%((p4?[[[;~~'$$'K !!t+<999]II[;K  :,'4@1%$Jc[CL''  +"&54>32'.#"2>54&'[n+Li>ak'Jl95#3R8/P8 6 oVBuX3nW6s]< .I`1L^- aZi #BR@O Jr a  c Y :K [ C LA?<;75/-*)('*% +'7>32'7>323#73#3##7!##".54632+326  p  %XJW XJX bf  Xc%w2H-%#  A;Qs2T 2T :0011~00z$,+0'e> %@@=p[c 1M@  B JK PX@7p hBK Y =K[CK \GLKPX@8p  pBK Y =K[CK \GL@8rp  p Y =K[CK \GLYY@222M2MLKFD$)#&*% +'7>32'7>32#73326?3#"&5467#"&5463232>7#7'yY  yY  P[Y  $ 8*(# ΐOH0;#m vg g +C $% <3&"B^[+-$ )5+ +;@8d[BK=K[CL*("    +2#"&5>>?33267"&74632#"&a&${c7"_d26%F#8H%NU&'cvnoI*6""(=)L@~*$0+#7>54&#"32#"&54632"&54632~qT7\M*+$7  YKCN$$Qc?eO<%& :E<2'(] *'0+2#"&54646?33267#"&54632#"&0$$qT7\M*+$7  YKCN'(gQc?eO<%& :E<1- +@(p[BKCL    +2#"&5>3#"&7>7>%$$% A&'WI*G@*D- 0+7#>7>7>32"&54632$  )F$$+G,F%7Kd'(  0+2#"&5>3#"&74>%$$ !+'(+G,F%7Kd\Fj@UYM +#73YF9]Fz@UYM +!7!nF4sF]|@UYM +!7!M&F61y:FVNGC90+#"&7467#"&54>327332>54&#"3267#".54>322>54&#":;W87'&K'55 6J+.6+3F $>.Wi;.QpAN76YT]2Bwc5<1'% 4%By\74%9=H=2eP3<.d.(1Qk;K}[KwS,3<=?3^ScSG6IM-:1HU$(00+3#330+3#2/10+3#,,GS0+3#k4n3SBoS0+3#o12SBI` 0+.54>7? _w7f^1B{%LЏXl#*JBq_Q]v 0+7'>54. _w7f^1B%LЏXl#*JBq_Qk"@aUYM +#3#3}ִ)kN"@aUYM +3#73#4}ִm[)T1b01@.$ JcW[O0/! +#";#"&54>54&'7>54&54>3 #N; >8"#!"+5 7H@$*$*(54&+732#3 #N; >8"#!"+5 7H@$*$*(7.54>7!_s7e[iW ^v4]QLvO*1C$N؆Wl%)KD$NԊWl%)%f|MBr`Q;# 0+7'>54&?'>54.!_s7e[iW ^v4]QLvO*1C$N؆Wl%)KD$NԊWl%)%f|MBr`QJa# 0+.54>7.54>7!_s7e[iW ^v4]QLvO*1C{$N؆Wl%)KD$NԊWl%)%f|MBr`QaP# 0+7'>54&?'>54.!_s7e[iW ^v4]QLvO*1C$N؆Wl%)KD$NԊWl%)%f|MBr`Q^  0+ # ;l $Ax 0+35k;{7.3`# 0+26?#"&54>;##"&54632+08QR(E^6 @{KL30zKALJN;Z= +T]T+"% "be0+737#73733733#3##7##7#737#1l?8-78/8np>9/88/8i?ٶ33331AQUt@q-  J  c  cY:K[BK Y ;K[CLRRCB32RURUTSKIBQCQ;92A3A$%$% +!##"&54632>7#73>32#"&5467"&54>32'2>54&#"7!/>%77A0"" "+-2!Z %77@.#" "-/51>,=#8:,>#)'>7 0  Iך0ɧ߄6 1  W26)K8":4(I7 &!3=""4@//8%5GS@Pd  c:K[BK;K [ CL'&FD=;/-&5'5$"  +"&54>323#>54&#"326"&54>327>54&#"326>E!6H(=J6J667f! #/$+O>F!6I(323#>54&#"326"&54>32!"&54>32%>54&#"326%>54&#"326>E!6H(=J6J667f! #/$+>D!8I(F!6I(53. +373#>54&'+#7.'#73.54>327.#"4&'>' - &,/*$54)}b '-F%(0G1=9.4G'  A,29G5%:CQN &Q  #3 $-:%`lFK1S  4J #,9'+B,+89p+7N<@ 4 JK'PX@?p pa  a[BK ;K [CL@Cp pa  a:K[BK ;K [CLY@<;863210.,'&%$%$ +3>7#73>3273#>54&#"3#3#32673#7#"&=#)JS T8IX2:G#"409;%@4)  9MHW1;"T3ceR+(+7cH+5.]  9C$;O++(+TdcPI%-w`"S@P J  a  aY:K Y;L"!  +3'#73'#73##73#3#3#3!737#k x2H XLS Hv ? 5e f5%U,00E00,U,11)I@F a a Y:K  Y ; L)(" &! +737#73#732+3#3!737#32>54&#Bfk jPW je*OqGH !m W!e,PC6S69EH,,0IH6[A%H,{11{!6J(12+i1X@UJp pa  a[BK Y ; L1/+*)('&#"'$# +37#737>32#"&5467.#"3#3#!73!7>75#uUME z`BK ?Q ;2,2&(J8? \!M+;kr20#gT,+M+B]mD_C+i*F@CJpp a[BKY;L*)'$# +37>32#"&5467.#"3#!73!7>?#qiz`BK @P;3,2&(J8? prbkr20#gTS,LC`mD_CQXq-@ JK PX@3fpngdW[O@1rpnsdW[OY@ &'& +%3+#7.54>;73#"&5467.#"3260dB*BQ >\;*2B 7%/C*B61JKFZ^ ^K9mU4ae ;+#:QYCL8T'I@ = /JK#PX@4  W   aU c[BK[CLK-PX@2c  W   aU c[CL@8c  W   aa cW[OYY@)(ECA@?>;931.-,+(I)I((($ +4>32#".732>54.#"2653#'#"&54>3273#.#"6`NN_77`MN`7(1WvECvU22VuDDwV1K+6-?%Oc/@"'> -8*;01VS]22]SS^32^TLzT--TzLLzS--Sz-10sd2M511+RQPXl* 0+>32#"&54>(0 ")=/0 4+c/ 0+7>7#"&54632c(/ "(=/0/! 5*l*)! 0+>32#"&54>7>32#"&'4>'/ ")='/ #(=0/! 5*0/! 5*c0)! 0+7>7#"&546327>7#"&54632c'/ #(='/ ")=00/! 5*0/! 5*=\.0+'7 G%kǻ\0+7'7'7( G%k\ǻ;\  0+'?'7 /#V!>%b˼ʽ \  0+7'7'7'7'7) /#V!>%b\˼ʽrR{G90+#"&/#"&546?#"&546?'.54632'.546327>32{ON A   A QQ ?  A .   9X   X9     9W  W8 <Z@ N JK PX@Ih  p  ha[BK  Y=K[CK \ G LKPX@Jh  p   pa[BK  Y=K[CK \ G L@Kp  p   pa[BK  Y=K[CK \ G LYY@ZYXWRPIGCA>=#&'$#% +4&54632%>32#"&5467&"#"!326?3#"&546?##"&5463232>7#73V>%* (1 X  $ 6*)  G~JU1;$~M K ^V$$ E=,C $% <3&"CPi,*$(4+<fKW@ ? JK PX@Fp  h[BK [32#"&5467.#"!326?3#"&546?##"&5463232>7#73%"&54632W@(: (4 X  $ 6*(! G~JU1;$~N K!!^V($"H=,B $% <3&"APi,*$(4+W%'g-@* J:KY;L +7#7333#73 JE-J W$111w11"ri B@? Jr  b:K Y;L   % +'7>32#7333#73'#73N  V JF,J W p2T 11w119qi JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@  % +'7>3273!73#7!#7#3#  =(2 XW 2( D K2T 1G00Gi 'C@@Jr Y:K Y ;L'&%$#"! % +'7>323#73#73#7#73#3#73~  .W XW W| W XX W2T ^211G002,0011Gi +4@1Jr[BK[CL (&   % +'7>32.54>32'32>54&#"F  v{4]Mt2\LTCfE#JTBgF$2T sW}KwKTXfU};TcQy1i .@ )JKPX@-rpf Y :K\CL@.rpn Y :K\CLY@ . .-,$*% +'7>32#"&54632>7##73##73H  8.3:$"*# .H)QO MH O 2T 3"B2 * XC00z00i ,9V@S" Jr  c Y :K Y;L85/-&#! ,,% +'7>323#73#3#)73#73#>32'32>54&#"  XX XX XW Y?=Qj+Ppj4N4E;92T G0011G00CN6_E(1'32"&'#7332>7!7!>54&#"#73>321  D\%%54&24Q<(  ?U?h45% _7rb+Sz2T 81_ %6#3Sh41(Z\M]J(+lQRi -=]JKPX@8r  a [BKY:KY;K [ C LKPX@3r  a [BK Y:K [ ;LKPX@8r  a [BKY:KY;K [ C LK!PX@>r  a [BK Y:K Y;K  [ C L@8r  a [BKY:KY;K [ C LYYYY@:820-,'%$% +'7>323#73#73#3>32#.5467#32>54&#"  qX XW XE?Vl>t2\Qv{LTCfE#JTBgF$2T 11G00AsU1wKTs+^XfU};TcQyi 5@@  JK PX@7r  h   a Y:KY;K \CL@8r  p   a Y:KY;K \CLY@"76 :86@7@21.,'%$#"!  5 5% +'7>3226?>7.54>3!#3#737#"#"&?33#"  8:+5<+Jd9' WW WCe,@97.?, YpLy1F.>2T "y)1 F58T7011--z11B=47&%41@#1;.!1:@7Jc[BK[CL.,&$  +"&?>327>54&#"32>54&#"]I<"MHH 5C#=J"BbGDhe'(;YVC&B/36 =obs<1+H5"=6(\N3`j@$'cHa)?M$*2 &6 @ !JKPX@-p=K[=K[CK[GLKPX@)p[=K[CK[GLKPX@-p=K[=K[CK[GLK!PX@)p[=K[CK[GL@-p=K[=K[CK[GLYYYY@('0.'6(6'$#&# +7#"&54>3273#"&54632326'2>54&#"F/6]5?A$?Y3V^ 5H;Xh,-; j[̵  JK PX@K  p h  n  ca:K [=K;K \CL@L  p  p  n  ca:K [=K;K \CLY@ ZXTSRQPOJHFECA;97620$"&'" +7463232>54&#"#>32333>32#"&5463.#"32673#"&5467##7##"& (<&"3(P067[kCkZ '3>#12$8'##.(E7<5\9C9Y %3B(24Q'Hdm%#123NBA90^.O:!0(%>^p1$332HHN72.T@&26K@H4Jppc[=K[GL"&#$'$" +#"&5463232654&#"732>54&#"#>32Zk:  " (>+-0+F 3f?LRbM0?k;3%k]9J01B$-61.L@P;Vk K 9e@b#*  J  p cY:K[=K;K[ CL6520 99 +"&?6&+##73326?>32#"&5467326?r.)31BG[m+6+5) '% $ 1 3-2,?y/o#6%.$ .",>C;>+'1I@FaY:K[=K;K[ CL+)   +"&5467###733>32'3267>54&#"QT]EG[ r\ *;M.TR!@^+60 (6"4 cN}+e)L:"dK4oZ;6C<>?6D!9;;  $5,@)1JrY7'.546;73#"32>54&/!?\:,?'8M.-C?#!%!$R"310%B/*'$=+1fR4/="4aO:6(0432#"&54675$: C.G7"8<**S_! S!'9@6a[K[ L%$  +"&'4>32"!>5.32>7!_e)Jh=]i(Ih$=0# 19:?&>0# bWAx[7_Y9v`=!4E$32+73##73733#732>54&#"e&/ATm Ci8$*K'#P':&5--43273#"&54632326'2>54&#"F/6]5?A$?Y3V^ 5H;Xh,-;JYb0+3##73326?3#"&5467b W[Y  $ 8*(# b'+C $% <3&"BD@b6D@A(JpaY =K[CL66)#&' +!!32>?3326?3#"&5467#"&546?#7 F\ A<0 2Ha  $ 3*&08? 12 PRb'd1:T^$& !% ;4$7>$H:$+(5+=RbPI@F%JpaY =K [CLPOJHBA<:)*#& +!!326?3#"&546?#"&5467#"&546?#7332>?332>?3 /K  % 3*$  .4;3) -4>".1 URb %D:, 1IY #C8+ 1Hb'L& !% ;4$*#@12* ) =/-'4 +69Ta(4:Ta'- 1AB@ #JKPX@*pBK=K[=K [CLKPX@&pBK[=K [CLKPX@*pBK=K[=K [CLKPX@&pBK[=K [CLK!PX@&rp[=K [CL@*rp=K[=K [CLYYYYY@32;92A3A&&''% +'7>32#"&5467#"&54>3273326?32>54&#"yY  D6$"% 0\1?9%?X39@;.\ $"H;&.,'A-vg <4"$/MOSG9w_>I8zH#&dAY\4I324>3232673#"&"7>54&yY  &D]61CP 9E8-JGeW#:N+ E/(C& >x@ 0JKPX@&pBKY =K[CL@&rpY =K[CLY@ > >)#&+% +'7>3232>?3326?3#"&5467#"&546?#7yY  [ B<0 2Ha  $ 3)&08?!13 PR vg 1:T^$& !% ;4$:<$I:%+(5+2 1\JKPX@BK[=K[CL@r[=K[CLY@ +)   % +'7>32"&54>32'3267>54&#"yY  QS!?]?6D!9;; ?@1*JKPX@.pBKY =K[CK[GL@.rpY =K[CK[GLY@ ? ?''$#+% +'7>3232>?3#"&54632326?#"&546?#7yY  U ! A7* 1IhnBS 6GP5*2>$/A JQ vg 02IV$n;3$h\ =/002+> #9K@ 4 JKPX@.  p  cBKY =K [CLK-PX@.r  p  cY =K [CL@8r  p  cY =K[CK [CLYY@ HF><863210*( # ##+% +'7>32326?3#"&5467#"&'&6?#73>324&#"32>yY  `  $ 7*(# ]";O.3= HQ I<%3CI'"4  &2'vg 8 % <3)E#L=(#b++;,!"?&!4@% '=KPXJKPXJKPXJK!PXJJYYYYKPX@2aBK [=KY=K;K[ CLKPX@*aBK [=K;K[ CLKPX@2aBK [=KY=K;K[ CLKPX@*aBK [=K;K[ CLK!PX@*ra [=K;K[ CL@2ra [=KY=K;K[ CLYYYYY@ 75,*! ' '% +'7>32"&5467###733>32'3267>54&#"yY  wQT\EG~[ 8\ *;M.TR!@^+60 (6"5 vg xdN+)L:"dK4o[;6D<>?6D!9;; 9 JKPX@3pacBK [ =K[ CL@3 rpac [ =K[ CLY@ 31/.,*%$#" 9 9% +'7>32"&54632+3267>7#73>54&#"#>32kyY  @R 2"(=  .3.@2d=VL<[vg x:4&-%9' 6A33LEdK7pY9 AJ@  JK PX@-h   cBK Y=K\CLKPX@.p   cBK Y=K\CLK-PX@.rp   c Y=K\CL@8rp   c Y=K[CK\CLYYY@CBFDBJCJ&#&+#'% +'7>32#"&?3326?>7.546;326?3#"&546?#"737#"yY  *-/ $ /"(8uZ]  $ >)) A%)iE?b7#"&54632 #9!%".Ki @ Gi% +'7>32  2T d @rW[O"# +332673#"&546)!&*A)PE66d "!')E<0+ Em@Hi +77# ^6WQQrm@Gi +''73^6QQrX +@(W[O      +"&546323"&54632#!#"%%&$"[ @W[O   +"&54632%$%%1 @ Gri*% +'7>32'7>32n     Uj  L'@q @ Gi% +.54632  $ XB@UYM +!!B2f1@.cW[O  +"#7>32326?3#"&/. '6$   ' +%# 23,  ",+ *@'JcW\P$&$% +3267"&54632#"&54632> *!(B 0B$BMe-11* 0+4632#"&732654&#"C,.@B,,C)''& '@1;;13;;3"''"!&%NT 0+"&54632$$'(F 0+"&54636r!"$&8@5JbK YL +7#7333#73'#73' 6,E): C Rk+++5++$E@B J aYKYL$# +3#73#73232654&+326'4&# FuF QL=H1/\K4+0N=8YPR14+*4/5K /(L\G+ !L:!!%&@ JK!PX@'pn[K[LK"PX@+pn[KK[ LK#PX@'pn[K[LK.PX@+pn[KK[ L@/pnK[KK[ LYYYY@!  && +"32673#7#"&'&>3273#>5.>4M26@=R12 M,Xb&HgA3I!,0=?\i*54&#b hm)TW DtKuADb>@M*]S;u\:+_4Qe23273#>54&;4L0:<@;  aYK  Y   L+'3#73#!7#73#3#737!3#DsD C0 1C CtC D79D +****_+++@ #@ YKYL+'3#73#3#ErD CuD +**_++@(cYK[ L"$#+7#73##"&54632#326VP CWVE64#8;**RI0"' 1^I@F Ja Y K Y L+37#73#3#73'#3#73#731MB ;s4 EeL9A DsD ̰**++++** 2@/pYKYL +%73!73#73#E3$*p CuC Gv+k+**_ <@9 J Y KYL +3#3#73# 3#73#7= BtC BoFpB CtD {*_++Gj++*0@- JYKYL +3#73## 3#73#ogA C;hB DsDgo**4++&(@%[K[ L +"&'4>32'32>5.#"^e)Jg>]h'Ii9>3N38?2M4bWAx[7_Y9v`==G?\j*;F=Zi:@7c YKYL$! +7#73#732+326'4&# EvD WYzF,xA?ZS,6++++<9Wk[?#)&#=JX@U1!JAIpc_[K[  LIG:8.,'& ## +"&'4>32326?3#".47'.54632>5.#">?6&#"^e)Jg>]h.B)$ # ),  591/1% ! 9?3N5i  ' bWAx[7_Y,\SD%3$-2#- >BA0'0 JK&PX@5 p  a YKYK[ L@2 p  a YKYK[ LY@0.*(''+!%# +%#"&5'.+3#73#732326?%32654&+ /%,%K3B EvD WUOJ   IES14Bx(3%1(B''+++17BU ,%Q)GD!3H@E2Jpn[KK[ L33+%+% +#>54&#"#"&'#7332654&/.546327%):0,6# +E_P3I !!+B/4<2!#4UE/F$0)%&=7C[$#?.5=+&*71AE$<JH_K PX@ hYKYL@!pYKYLY@ +373##7!#7#3a Kv8%++#vK +nn^+Ez'@$YK[ L##+3#326?#73##"&?#u BD%LNQDA @@=J Y KYL +7#73#3#73'3#737'#73MA 8e6 DRC 8`7 ̣**++++**FL6@3JY KYL +#7#73#3#737#7 DJB :*N N*X9 ***))* 6@3pnYKYL +7!373!7#F*y r3#)z 2f*_e+f C@@ Jr  bK YL   % +'7>32#7333#73'#73'yY   6,E): C Rkg ++5++#&L@I& Jrc  bK YL%$##"! "%+332673#"&546#7333#73'#73'$%8%EB+,w 6,E): C Rk &1IA(* ++5++E@B Jr  bK YL +''73#7333#73'#73'T9 6,E): C Rk/kie++5++ '*[@X* J c  bK YL )(''&%$#"!     +"&546323"&54632#7333#73'#73' "!! 6,E): C Rk:')%'++5++ C@@  Jr  bK YL   % +.54632#7333#73'#73'  P 6,E): C Rkz   ++5++nB@? Ja  bK YL +3##7333#73'#73'Z 6,E): C Rkn/++5++#&C@@&  J  b _KYL%$"  +467#73'#3#7333#3267#"&3'KAX C RB 6,E): <:M& *,7'/Q'+++5+%G# 1 %&)?@<)  J  c  bKYL('%#&" +46323#73'#3#73.732654&#"3'>)+:%&: C RB 6*  !n4.55-%1 V++++ -""! /22JK.PX@0cc  bK Y L@7pcc  bK Y LY@) 10 / /.-,+*)('&%$#"! +"#7>32326?3#"&/.#7333#73'#73''# (! # %$  6,E): C Rk*()  +&-  ++5++% 2*@)JK!PX@(pa [K[LK"PX@,pa [KK[ LK#PX@(pa [K[LK.PX@,pa [KK[ L@0paK [KK[ LYYYY@ -,+*'% 2 2% +'7>32"32673#7#"&'&>3273#>5.yY  w4M26@=R12 M,Xb&HgA3I!,0=g ?\i*3273#>5.T9 4M26@=R12 M,Xb&HgA3I!,0=kiK?\i*3273#>5.>4M26@=R12 B&&*):52 ,"-6NW&HgA3I!,0=?\i*3273#>5.T9R4M26@=R12 M,Xb&HgA3I!,0=/ki?\i*3273#>5.U##24M26@=R12 M,Xb&HgA3I!,0=:()f?\i*54 41D hm)TW D91 ~9DDb>@M%*]S;u\:+հ%4Qe254 41D hm)TW D91 ~9DDb>@M%*]S;u\:+հ%4Qe254&#T9 hm)TW DtKuADb>@MkiS*]S;u\:+_4Qe23273!73#7!#7#3#yY  j0#(v CvD '% 3 8g e+*f)'K PX@=r   h  pc  a YK YL@>r   p  pc  a YK YLY@''&%$#"! "%+332673#"&54673!73#7!#7#3#$%8%EB+,`0#(v CvD '% 3 8 &1IA(* e+*f)HK PX@4rh  p  aYK YL@5rp  p  aYK YLY@ +77#73!73#7!#7#3#T90#(v CvD '% 3 8ki e+*f)@ JK PX@4rh  p  aYK YL@5rp  p  aYK YLY@ +''7373!73#7!#7#3#T9G0#(v CvD '% 3 8&kine+*f) +K PX@;   h  pc  a YK YL@<   p  pc  a YK YLY@+ ++*)('&%$#"!     +"&546323"&5463273!73#7!#7#3# "!!0#(v CvD '% 3 8:')%'e+*f) K PX@8 h  p c  aYK YL@9  p  p c  aYK YLY@#      +"&5463273!73#7!#7#3#N##(0#(v CvD '% 3 8:()e+*f)  JK PX@4rh  p  aYK YL@5rp  p  aYK YLY@  % +.5463273!73#7!#7#3#  P-0#(v CvD '% 3 8z   e+*f)nK PX@7 h  pa  aYK YL@8  p  pa  aYK YLY@ +3#73!73#7!#7#3#q0#(v CvD '% 3 8n/e+*f)&  JK PX@5h  p a _YKYL@6p  p a _YKYLY@%# +467!73#7!#7#3#3733267#"&MA CvD '% 3 80#(9P& *,6/Q'+*f)e%G# 1 %3K PX@B hpc c  a  Y KYLK.PX@C ppc c  a  Y KYL@Jp ppc c  a  Y KYLYY@+  3 3210/.-,+*)('&%$#"! +"#7>32326?3#"&/.73!73#7!#7#3## (! # %$ %0#(v CvD '% 3 8*()  +&-  e+*f)% >@ 5 'JK&PX@2 c  ab [  K [   LK.PX@6 c  ab [  K K [ L@: c  ab K [ K K [ LYY@987631+)&%$#"! >>"%+332673#"&546"3267#73##7#"&54>3273#>54&$%8%EB+,D4L0:<3273#>54&T9M4L0:<3273#>54&W##74L0:<3273#>54&7>7#"&54632;4L0:<323#73#3#?yY  ErD CuD g **_+6@3rcYK Y  L"% +332673#"&5463#73#3#$%8%EB+,ErD CuD  &1IA(* **_+l2@/JrYKYL+''733#73#3#lT9ErD CuD /kie**_+w #E@B  cYK Y  L #"!     +"&546323"&546323#73#3# "!!ErD CuD :')%'**_+@ 0@- JrYKYL%+.546323#73#3#  PErD CuD z   **_+cn-@*aYKYL+3#3#73#3#vxErD CuD n/**_+@4@1J_YKYL%% +467#73#73#3#3267#"&211N ErD CuD N1/& *-6(U$+**_+!K# 1 ({+K.PX@* cc YK  Y  L@1p cc YK  Y  LY@+*)('&%$#"!   +"#7>32326?3#"&/.3#73#3## (! # %$ ErD CuD *()  +&-  **_+@ :@7cYKYL   +"&546323#73#3###ErD CuD :()**_+@  0+'3#73#3#ErD CuD +**_+":@7JrcYK[ L"$#+''73#73##"&54632#326T9VP CWVE64#8Aki;**RI0"' 1^1X@U !Ja_ Y K Y L+)%#+37#73#3#73'#3#73#737>7#"&546321MB ;s4 EeL9A DsD (2 !%9̰**++++**&,!$2) "C@@Jp_YK YL  +%73!73#73# 7>7#"&54632E3$*p CuC Gv(2 !%9+k+**_&,!$2) C@@p cYK YL  +%73!73#73#%"&54632E2$)p CuC Gv""+i+**_$% ?@<JrpYKYL  % +'7>3273!73#73#:yY  3$*p CuC Gvg k+**_ D@AJpYK[K YL  $& +7>7#"&5463273!73#73#E #9<3$*p CuC GvM!%".Kk+**_4@1 JpYKYL+?#73#7373!737 O7C G/e g93$*p C0.%**312k+ <@9Jr YKYL% +'7>323#73## 3#73#yY  gA C;hB DsDg go**4++>@; JHr YKYL +77#3#73## 3#73# T9偱gA C;hB DsDki)go**4++(?@<  J _YKYL"  +3#73## 3#73#7>7#"&54632ogA C;hB DsD3(2 !%9go**4++&,!$2)3+" JK.PX@-cc YK  Y   L@4pcc YK  Y   LY@%3210/.-,*)('&%$#!  +"#7>32326?3#"&/.3#73## 3#73#S# (! # %$ gA C;hB DsD*()  +&-  go**4++S@@= J  _YKYL +3#73## 3#73#"&54632ogA C;hB DsDy$$go**4++'(e(N@K#JIc_ Y KYL(('&%$"$# +#"&54632#326? 3#73#73#738DE104hB DsD fA #FD/"' )2++*fp**& +5@2Jr[K[ L (&   %+'7>32"&'4>32'32>5.#"yY  ^e)Jg>]h'Ii9>3N38?2M4g obWAx[7_Y9v`==G?\j*;F=Zi&#3:@7rc[K[ L0.(&##"% +332673#"&546"&'4>32'32>5.#"$%8%EB+,^e)Jg>]h'Ii9>3N38?2M4 &1IA(* YbWAx[7_Y9v`==G?\j*;F=Zi&&7@4Jr[K[ L#!+''73"&'4>32'32>5.#"T9^e)Jg>]h'Ii9>3N38?2M4/ki4bWAx[7_Y9v`==G?\j*;F=Zi& '7D@A c[K[  L 42,*!''    +"&546323"&54632"&'4>32'32>5.#" "!!^e)Jg>]h'Ii9>3N38?2M4:')%'bWAx[7_Y9v`==G?\j*;F=Zi& +5@2 Jr[K[ L (&   %+.54632"&'4>32'32>5.#"  P^e)Jg>]h'Ii9>3N38?2M4z   bWAx[7_Y9v`==G?\j*;F=Zi&/?K.PX@) cc [K[  L@0p cc [K[  LY@! <:42)' /!/  +"#7>32326?3#"&/."&'4>32'32>5.#" # (! # %$ A^e)Jg>]h'Ii9>3N38?2M4*()  +&-  pbWAx[7_Y9v`==G?\j*;F=Zi& '7=@: Jrr[K[ L42,*!''*%+'7>32'7>32"&'4>32'32>5.#"ZmN    ^e)Jg>]h'Ii9>3N38?2M4oLa  "6T  bWAx[7_Y9v`==G?\j*;F=Zi&n#2@/a[K[ L  +3#"&'4>32'32>5.#"^e)Jg>]h'Ii9>3N38?2M4n/bWAx[7_Y9v`==G?\j*;F=Zi%'1@. J[K[ L$" +"&'4>32'.#"%4&'32>^e)Jg>]h'Ii!0"3N5I*3N4cW@x\7_Y9w_>&O=Zi ?\j% '3<@9,+ Jr[K[ L 0.$"  %+'7>32"&'4>32'.#"%4&'32>yY  ^e)Jg>]h'Ii!0"3N5I*3N4g gcW@x\7_Y9w_>&O=Zi ?\jD@A  a  cY KYL$! +#32+3#73#7#32654&FDAO]yEU EvD J=>ZR3+F132#"&5'.+3#73#732326?%32654&+yY  T /%,%K3B EvD WUOJ   IES14Bg (3%1(B''+++17BU ,%Q)GD!.7@ # JHK&PX@:r   p  a YKYK[ L@7r   p  a YKYK[ LY@751/..+!%$ +77##"&5'.+3#73#732326?%32654&+T9 /%,%K3B EvD WUOJ   IES14BkiY(3%1(B''+++17BU ,%Q)GD!'0E@  5 JK&PX@< p  a _ YKYK[ L@9 p  a _ YKYK[ LY@?=970.*(''+!%#+%#"&5'.+3#73#732326?%32654&+7>7#"&54632 /%,%K3B EvD WUOJ   IES14Bt(2 !%9x(3%1(B''+++17BU ,%Q)GD!&,!$2) ?O@L>$Jpa[ KK[ L ? ?+%+%% +'7>32#>54&#"#"&'#7332654&/.546327wyY  ?%):0,6# +E_P3I !!+B/4<2!#4UE/Fg $0)%&=7C[$#?.5=+&*71AE$<:U@R9JHrpn[ KK[ L::+%+% +77##>54&#"#"&'#7332654&/.546327T9%):0,6# +E_P3I !!+B/4<2!#4UE/Fki%$0)%&=7C[$#?.5=+&*71AE$<H@G-* JK PX@9pnh_ [  KK[ L@:pnp_ [  KK[ LY@HHEC%%&% +#>54&#"##"&'732654&'7.'#7332654&/.546327%):0,6# +E^K%*):52 ,"-6&7 !!+B/4<2!#4UE/F$0)%&=7C[N!!)3 ) r#?.5=+&*71AE$<:U@R9Jrpn[ KK[ L::+%+% +''73#>54&#"#"&'#7332654&/.546327T9Q%):0,6# +E_P3I !!+B/4<2!#4UE/F&kiÖ$0)%&=7C[$#?.5=+&*71AE$<3HW@T28 Jpn  _[ KK[ LB@<:33+%+% +#>54&#"#"&'#7332654&/.5463277>7#"&54632%):0,6# +E_P3I !!+B/4<2!#4UE/F(2 !%9$0)%&=7C[$#?.5=+&*71AE$<&,!$2)N3?X@U2Jpn  _[ KK[ L54;94?5?33+%+% +#>54&#"#"&'#7332654&/.546327"&54632%):0,6# +E_P3I !!+B/4<2!#4UE/F$$$0)%&=7C[$#?.5=+&*71AE$7#"&54632a Kv8%++#vK (2 !%9+nn^+&,!$2)JH$x JK PX@'h  _YKY L@(p  _YKY LY@ +373##7!#7#37>7#"&54632a Kv8%++#vK (2 !%9+nn^+&,!$2)JHrHK PX@%rhYKY L@&rpYKY LY@ +77#73##7!#7#3T9 Kv8%++#vK ki+nn^+JHyK PX@*h aYK  Y   L@+p aYK  Y   LY@ +3737#737##7!#7#3#3a J7b `58%++#4e d6K +%nn%+Ez %4@1JrYK[ L##% +'7>323#326?#73##"&?#yY  y BD%LNQDA 32'7>323#326?#73##"&?#mN    I BD%LNQDA @;cc YK [ L10-+('#$$$" +4632#"&732654&#"3#326?#73##"&?#&=(*;=((=)   BD%LNQDA 32326?3#"&/.3#326?#73##"&?#V# (! # %$  BD%LNQDA 323##73## ##73##LyY   CC 946: CGyg *g**3|**kFqA@> Jr Y KL +''733##73## ##73##~T9 CC 946: CG&ki*g**3|**kFq 0X@U.% Jc Y K   L 0/-,+*)('&$#"!     +"&546323"&546323##73## ##73## "!! CC 946: CG1')%';*g**3|**kFq $?@< "Jr Y KL$#! % +.546323##73## ##73##  Pp CC 946: CGq   *g**3|**kFLeA@>Ja Y KYL +3##7#73#3#737#72 DJB :*N N*X9 e/@***))*FL A@>JrY KYL % +'7>32#7#73#3#737#7yY   DJB :*N N*X9 yg ***))*FLC@@ JrY KYL +''73#7#73#3#737#7T9 DJB :*N N*X9 &ki***))*FL ,Z@W)J c Y K  Y  L ,,+*('&%$#!     +"&546323"&54632#7#73#3#737#7 "!! DJB :*N N*X9 1')%';***))*FL A@> JrY KYL % +.54632#7#73#3#737#7  PT DJB :*N N*X9 q   ***))* C@@JrpnYKYL  %+'7>327!373!7#yY  *y r3#)z 2yg *_e+fC@@HrpnYKYL+77#7!373!7#T9*y r3#)z 2ki*_e+f L@I pncYKYL      +"&546327!373!7#3##*y r3#)z 21()ː*_e+f '*@ *JK PX@?rh  pa  aYK Y L@@rp  pa  aYK Y LY@ )( ' '&%$#"! %+'7>327!#7#3#373!737#3#7337yY   (% 6 <0$(h D*B :šHg +e)e*++JK PX@:h  pa  a YK Y L@;p  pa  a YK Y LY@+7!#7#3#373!737#3#7337f (% 6 <0$(h D*B :šH+e)e*++w""JK PX@Bh  paa  aYK  Y   L@Cp  paa  aYK  Y   LY@ ! +3#7!#7#3#373!737#3#7337h (% 6 <0$(h D*B :šHw/}+e)e*++E!yK PX@.hpa YKYL@/ppa YKYLY@$!$ +74>3!#7#3#373!"&7;#"E-PqD(% 4 70#(|Q\K<@.v3;Y;AuX5f)ebJ>C9Ve*K@HJpbK[K[ L('#!  +"&5467!>5.#"#73>32'32>7!TQ H2@1V,* O/XQ$Df26&=-  IK M"31$:J%7 )[@X  pa  c YKYK [ L(&$# +%73!73#7!#%#73##"&54632#326?(5 XW  [=VP CWVE64#811G00`;**RI0"' 1{ )K!PX@9  p  c YK YK  [ LK"PX@5  p  c YKYK [ LK#PX@9  p  c YK YK  [ L@5  p  c YKYK [ LYYY@(&$# +%73!73#73#%#73##"&54632#326E3$*p CuC GvVP CWVE64#8+k+**_f;**RI0"' 1,/\@Y   J a  c  Y KYK [ L.,*)%#+3#73## 3#73##73##"&54632#326V W@W XWVP CWVE64#8 00B11G;**RI0"' 1/@   JK!PX@2  c Y KYK [ LK"PX@/  c Y KYK [ LK#PX@2  c Y KYK [ L@/  c Y KYK [ LYYY@.,*)%#+3#73## 3#73##73##"&54632#326ogA C;hB DsDyVP CWVE64#8go**4++;**RI0"' 1g'K&PX@3  p n  a YKY L@=  p n  a YKY KY LY@$''&%#"! &!+732#!73332>54&#7!373!7# 5jm XOWZR'Uf>*y r3#)z 2x0nIS1GMt>Ui*_e+fg .@JHK&PX@;p p  n a YKY L@Ep p  n a YKY KY LY@%!!!.!.-,*)('&%#" &"+77#%732#!73332>54&#7!373!7#?T9 5jm XOWZR'Uf>*y r3#)z 2kib0nIS1GMt>Ui*_e+f#.a@^Hr  pn YK YL$$$.$-'%##"!&"+77#732+737!373!7#%32>54&#T9I hm)TW Dt*y r3#)z 2vuADb>@MkiJ*]S;u\:+f*_e+ff_4Qe254&#b hm)TW Dt*y r3#)z 2vuADb>@M*]S;u\:+f*_e+ff_4Qe2<:953/-*)('*%+'7>32'7>323#73#3#%#73##"&54632#326>yY  yY  ErD CuD VP CWVE64#8g g **_+;**RI0"' 1&@@=Jc YK YL&%$#$& +7>7#"&546323#73## 3#73#w #9DgA C;hB DsD!%".K!go**4++[3gg@df2LJp n [K K [  L444g4gdbWUPONMJH=;6533+%+%+#>54&#"#"&'#7332654&/.546327!#>54&#"#"&'#7332654&/.546327%):0,6# +E_P3I !!+B/4<2!#4UE/F%):0,6# +E_P3I !!+B/4<2!#4UE/F$0)%&=7C[$#?.5=+&*71AE$<$0)%&=7C[$#?.5=+&*71AE$<8@5JbK YL +7#7333#73'#73' 6,E): C Rk+++5++!nJK PX@&hcYKYL@'pcYKYLY@ 4"#$ +%+73#7!#7#>3232654&#";Y; CtC )#34CPQQK',5&E3+*k-S< $E@B J aYKYL$# +3#73#73232654&+326'4&# FuF QL=H1/\K4+0N=8YPR14+*4/5K /(L\G+ !L:!! UK PX@hYKYL@pYKYLY@ +3#73#7!#7#3 DtC q*$wJ+*n_qT5@2sYK YL +'3267>?#7!#3#7!#%#/%#H+ M  DuX4)rA+v -(+U=7y3,**_"?2-DK PX@/hpaYK YL@0ppaYK YLY@ +%73!73#7!#7#3#A0#(v CvD '% 3 8+e+*f);m@O$ L U JKPX@Eh   c  Y K[KZK\ LK.PX@Fp   c  Y K[KZK\ L@Bp   c  Y K[KYK\ LYY@"mkfda`][JHDB><;:987653$/#%!+%3#737#"#"&?3326?>7.76&'#"&5&632;7#73#3267>32#"&5467326?3#"&?6&+C E9<.5$/17 #  +5( #"-,G1D D0?045.+"#   $ /(0!,B***%%U+2@*$e)*@/#%%9@19**43?=! (-0=-*T&&6+11M("7@,5JK.PX@6pc[ K[ KK[ L@4pc [ KYKK[ LY@0.$34%$ +%#"&'#73326'4&#"732654&#"#73>32"8K)/H"&1:*;N,1   I>/*1G0&I$AWBC+))A-!$=(-I<$(/G.!$0:/563O/8@5JYK Y L + 3#73#73#7#73#3#73 D CsC CZ`C CtC Dn++**&**_++:V@S- Jc c  Y  KYL:9876543210/,+*)('$$$""+'3267#"&54632#"&546323#73#73#7#73#3#73d 16XH0M  D CsC CZ`C CtC D7:*.%++**&**_++&=@ & JK&PX@? p   cYK[K YK  [ L@< p   cYK[KYK [ LY@=<7521.,$$!+73#73#73#3267>32#"&5467326?3#"&?6&#7>7T  DsC Du  E;+**^**$MOM@N# 4'NOK <@9 J Y KYL +3#3#73# 3#73#7= BtC BoFpB CtD {*_++Gj++*>@;  aYK  Y   L+'3#73#!7#73#3#737!3#DsD C0 1C CtC D79D +****_+++&(@%[K[ L +"&'4>32'32>5.#"^e)Jg>]h'Ii9>3N38?2M4bWAx[7_Y9v`==G?\j*;F=Zi,@)YK YL +!3#73#7!#3#73uD CtD  DtD C_++**_++:@7c YKYL$! +7#73#732+326'4&# EvD WYzF,xA?ZS,6++++<9Wk[?#)%&@ JK!PX@'pn[K[LK"PX@+pn[KK[ LK#PX@'pn[K[LK.PX@+pn[KK[ L@/pnK[KK[ LYYYY@!  && +"32673#7#"&'&>3273#>5.>4M26@=R12 M,Xb&HgA3I!,0=?\i*7##73##73#f ";!E> ;;< 2'*0 ?0;****1%+)3# JK!PX@+  c  c YKYL@) a  c  cYLY@/.-,%$+#3#737.'467>37#73"%4&'267> `x53(oB C B ^r73(j= B ~HEV3R!!IKU2Q%%&EH6]&))(O@=[%)).>/K%25Q>@@=J Y KYL +7#73#3#73'3#737'#73MA 8e6 DRC 8`7 ̣**++++**qeK PX@"g YK YL@!s YK YLY@ +%#7!73#73#!#73##3) DvD CwvC Cv++**_**_Xf'@@=JcYK  Y  L''&%&# +%7#".546?#73#326?#73#3#7Y1D)4(C B0+ D8A CrD + !/[**Z&  **_++y8@5 Y K  Y  L+73#73#3#73#3!73#73#|tA AttB CuE CsC B+**_**_++**q?@<s Y K YL+)73#73#3#73#3#73#3# CuD BvvB AvtB DuX3)+**_**_**_J7!K.PX@*p   cYKY L@0p  c  cYKY LY@!   +!#73##7!#>32'32>54&#"E Ct6$+Q D.0ASO(;'5,*+m*39Qn++5%! +K.PX@(   c Y K YL@.  c  c Y K YLY@! +*)'!  +%3#73#3+73#73#>32'32>54&#"CuC DuC CsC D//ATP';'4-++**_++**39Rm++5%!sK.PX@" cYKY L@( c  cYKY LY@  +3#73#73#>32'32>54&#" CsC D//ATP';'4-++**39Rm++5%!,]@Z"Jpa [ KYKK[  L&$!  ,, +"&'#7332>7#73>5.#"#73>324G )2B)&=. 1@1Q0* M/XQ#Dd+%H43$9J%*"32#"&'467#732>5.#" EqC C4` 2EW2]i'IiA_ed48?3M37?2N3+++**1V?%_Y9v`=bW  }=G?\j*;F=Zi?+4͵ JKPX@4h   a YKZK\ LK.PX@5p   a YKZK\ L@2p   a YKYK\ LYY@-,0.,4-4!-#" +7#".6?3326?>7.'4>;#3#737#"737#",/ #  &1"*2";Q. CvC C0Q"+aX:`JD.O'0&"M%7()>)*_++!fK3#-  JK PX@4rh  p  aYK YL@5rp  p  aYK YLY@  % +.5463273!73#7!#7#3#  P-0#(v CvD '% 3 8z   e+*f) +K PX@;   h  pc  a YK YL@<   p  pc  a YK YLY@+ ++*)('&%$#"!     +"&546323"&5463273!73#7!#7#3# "!!0#(v CvD '% 3 8:')%'e+*f)Jz+~ JK PX@*h  cYK Y L@+p  cYK Y LY@+*'%# +!#73##7!#7#>323#737>54&#"3A Kr8%+*#2C*5(C A0+ D7G+mk !.X++W'   hJK PX@#rhYKYL@$rpYKYLY@ %+'7>32#73#7!#7#3yY   DtC q*$wJg v+*n_%,G@ JK!PX@0  pp   a[K[LK"PX@4  pp   a[KK[ LK#PX@0  pp   a[K[LK.PX@4  pp   a[KK[ L@8  pp   aK[KK[ LYYYY@,,%&#% +#32673#7#"&'&>3273#>5.#"J 8@=R12 M,Xb&HgA3I!,0=2%<.! '&54&#"#"&'#7332654&/.546327%):0,6# +E_P3I !!+B/4<2!#4UE/F$0)%&=7C[$#?.5=+&*71AE$<@ #@ YKYL+'3#73#3#ErD CuD +**_+w #E@B  cYK Y  L #"!     +"&546323"&546323#73#3# "!!ErD CuD :')%'**_++@(cYK[ L"$#+7#73##"&54632#326VP CWVE64#8;**RI0"' 11>W@TJ    cYK Y K[ L>=<:42-+*)('&%$# 11+!#73##"&54632>7>?#7!#>32'32>54&#" Du  I1. S  C.(ATC';'5-"*$"NON"8I# 4'ILM#%**39Rm++5%!"/IK.PX@.W c Y KY L@5pW a Y KY LY@ /.-+%#"!+!737!3#73#73#!7#73#>32#'32>54&#"8 C89D DsD C0 0C E00AUnCP';&6-++++****-9Rm++5%JqN'x@ " JGK PX@' h  cYKYL@(  p  cYKYLY@&$- +%'>54&#"3#73##7!#7#>32N6O1:--6>8K Kt7%++#27EW'TPI?FK#91 ++mm <& I@,) 2 JK&PX@Dr  p  cYK [K YK  [ L@Ar  p  cYK [KYK [ LY@ I HCA>=:8'%$!%+'7>323#73#73#3267>32#"&5467326?3#"&?6&#yY  7##73##73#< 16XH0M  ";!E> ;;< 2'*07:*.%J ?0;****1%qiK PX@#g Y K YL@"s Y K YLY@ +%##7!73#73#!#73#" 6) DvD CwvC Cv+++**_**_e /@,rYKYL +7#73#7!73# DtC 24$%w+++*o_ JK PX@rY;LKPX@=KY;LKPX@rY;LKPX@=KY;L@rY;LYYYY@ +7#7333#73 | 6,E): C +++5++} @  JK PX@"r r  b Y;LKPX@"r  b=K Y;LKPX@"r r  b Y;LKPX@"r  b=K Y;L@"r r  b Y;LYYYY@   % +'7>32#7333#73'#73'yY   6,E): C Rkg ++5++ '@ JK PX@ r b Y ;LKPX@"r Y=K Y ;LKPX@ r b Y ;LKPX@"r Y=K Y ;L@ r b Y ;LYYYY@'&%$#"! % +'7>323#73#73#7#73#3#73yY   D CsC CZ`C CtC Dg ++**&**_++ JK PX@2rh  pb  a Y;LK PX@4rh  p  aY=K Y;LKPX@5rp  p  aY=K Y;LKPX@3rp  pb  a Y;LKPX@5rp  p  aY=K Y;L@3rp  pb  a Y;LYYYYY@  % +'7>3273!73#7!#7#3#yY  m0#(v CvD '% 3 8g e+*f)& +3@0Jrc[CL (&   % +'7>32"&'4>32'32>5.#"yY  ^e)Jg>]h'Ii9>3N38?2M4g ^bWAx[7_Y9v`==G?\j*;F=Zi)C ..@ #JK PX@+rpf  b\ CLKPX@-rpf Y =K\ CLKPX@+rpf  b\ CLKPX@-rpf Y =K\ CL@,rpn  b\ CLYYYY@ )('&%$"!  . .% +'7>32"&54632>7##73##73#yY   ";!E> ;;< 2'*0g \ ?0;****1% *7hJK PX@+r   b   cY;LKPX@-r   c Y =KY;LKPX@+r   b   cY;LKPX@-r   c Y =KY;LK-PX@+r   b   cY;L@1r   b  c  cY;LYYYYY@"7653-+&$#"! **% +'7>323#73#3+73#73#>32'32>54&#"#yY  ~CuC DuC CsC D//ATP';'4-+g **_++**39Rm++5%! 8KPX@ .JKPX@ .J@ .JYYK PX@6 rp  c  aa;K[ CLKPX@8 rp  ca Y =K;K[ CLKPX@1 rp W   aa[ CLKPX@8 rp  ca Y =K;K[ CL@6 rp  c  aa;K[ CLYYYY@ 20-,+*(&!  8 8% +'7>32"&'#7332>7#73>5.#"#73>32yY  4G )2B)&=. 1@1Q0* M/XQ#Ddg Y+%H43$9J%*"32#73#73#3>32#"&'467#732>5.#":yY  ~ EqC C4` 2EW2]i'IiA_ed48?3M37?2N3g ++**1V?%_Y9v`=bW  }=G?\j*;F=Zi? 7@@ ! JK PX@7r h  a   aZ;K\CLK PX@9r h   a Y=KZ;K\CLKPX@:r  p   a Y=KZ;K\CLKPX@-r  p  a   a\CLKPX@:r  p   a Y=KZ;K\CLK-PX@8r  p  a   aZ;K\CL@5r  p  a   aY;K\CLYYYYYY@98<:8@9@53-#'% +'7>32#".6?3326?>7.'4>;#3#737#"737#"yY  ,/ #  &1"*2";Q. CvC C0Q"+aX:`JD.g '0&"M%7()>)*_++!fK3#-4'4@1%$Jc[CL''  +"&54>32'.#"2>54&'[n+Lj>`l(Jl73"3Q8/P8 8 oVBuX3nW6s]< .I`1L^-#4-@*[K[ L +"&54>32'2>54&#"[n+Lj>`l(Jl>/P8 FB3Q8M oVBuX3nW6s]<91L^-AK.I`1>N+ #@ YKYL+#7!#3!734r66v66(D@Apnn[KZL ((+"2#"&54>32!73!?>54&G$T$%).=J@G;Jpnd_ [ K[ L64$$!&#&" +%#".54632+32>54&+732654&#"2#"&54632ˋt"@/ G(&C2LF" +g]@1/O{`Ke[Q05[`v,"0!+>(2*+Y=/+  ETD1/o55-J@G#Jc_YK[ L'%"!  -- +".54632+32>54&#"'!!>32!>/ ?--H1?=$KZZ;@S^&Da|+#/#%9I#11%? A@;aE'I&s&4A@>!Jpcc[ L('0.'4(4&'$&$+%#"&54>32#"&5467.#">322>54&#"$B_9Y^(NuMH]2$&J>. !]1Kf'A-=6PiG4^F)f[KR;3%%Dc<")G$:M(42oW5>XA!@pqYL+#7!#>7!+,GvV9 W Db}E9?;??6.s+='@$; Jc[ L0.&$,$+%#"&5467.54>32'>54&#"32>54&/.'&B[5_iD<!8M,Qi64 * ,*G==R93QD#>.?*; 331P9\BE_5"+D.GB0W;aL*-2A6)1 3E'7",-  Q#$4?@<Jc_[K[ L&%.,%4&4&$"$$ +#"&54632#3267#"&54>32'"32>54&EsUHe E,Ud#P6Sg&AV/Vm"=->3(@.DCCY;9"0',TK9]?"\/6J,632'.#"%4&'3267> db.RqBbd,PrE .$)C% _ 2*)C$ zrVOuvLW +%!UZ\%M !-&"X[\F?%(@%[BK[CL  +"&54>32'3267>54&#" db.RqBbd,Pr4E)C# 1D)C% zrVOuvLWV[-&"X\[&TW+%!UZ\b%@"a:KY;L! +#73267>733!73{ "3 3d ]>.  11%>@;pc[BKY;L %% +"32#"&54632!73!?>54&W-Nv]Y`%A[5&4(3Y]n7%.!ObKE.OJL+z;PH*6("FH@E  pccc [ BK[CLA@97$"&!$#$$ +%#"&54632+32654&+732>54&#"32#"&54>32'Ea8Vc""J4PeEL- @/C*;<.K#9L)Wf>9!  &)5U:LA&0#*eQ92/.733?3V$O N#tG0D\;2O@;&! JccY:K[CL#&#$$ +#"&54632+32>54&#"'!!>32$Ee?Qg#"L10I/>9%KZh:9"We8cI+HE&0$)%=O+94IC QYK(8K@HJcc[BK [CL*)20)8*8 (( +2#"&546;.#">32#"&54>7>2>54&#"Pf"K-]m ^#2 )2WO3bK/f_,ih_"6Aw*BT)1;%=N(5HhC"@pY:K;L +7#7>7!#7!TLf{?@'6A6_N; C93B7?:-=)@&; J[BK[CL20(&.$ +%#".5467.54>32'>54&#"32654&/.'&D^7.O:"O?";Q/dd87!+ **GDGMB/VBKh53: <-5U; +>(Qk8'0J1UE;^&;fY.6:G553A@TH)6"i80(8@@=Jcc[BK[CL*)20)8*8&$#$" +%#"&54632+3267&54>32"32>54&(_KNl#"R3Xd "L7Tq>_@\r ),?(C<.C)CY11EF&0"*%$WR2bK.cc%ork)?P&9>&=O(:AQJ-0@-#"J[BK[CL'%  +"&54>32'.#"%4&'3267>db/QqBbd,PrA - (D% ^ 4.(C$ zrUPtwKX  +%!UZ\*M%'-&"X\[QJ%(@%[BK[CL  +"&54>32'3267>54&#"db/QqBbd,Pr3F(C$ 2D(D% zrUPtwKXV[-&"X\[&TW+%!UZ\D%@"a:KY;L! +#73267>733!73w ."> 1 >.  11!2%>@;pc[BKY;L %% +"32#"&54632!73!?>54&o-Nx]X`$AZ5%4'2Z]n7%.!ObKE.OJL+z;PH*633FH@E  pccc [ BK[CLA@97$"&!$#$$ +%#"&54632+32654&+732>54&#"32#"&54>32(Ea8Vc""K3QdEL- ?/E,<;.K#:L)WfD9!  &*5U:LA&0#*eQ92/.73!?3V$O W#t@;&! JccY:K[CL#&#$$ +#"&54632+32>54&#"'!!>32 %Ee?Qf""L10H/>9%KYg9:"We8cI+HE&0$)%=O+94IC QPB(8K@HJcc[BK [CL*)20)8*8 (( +2#"&546;.#">32#"&54>7>2>54&#"Pf"K-]m ^#2 )2WO3bK/f_,ih_"6Aw*BT)1;%=N(5H~"@pY:K;L +7#7>7!#7!UNh~?@&6@6bP= C93B7C>-=)@&; J[BK[CL20(&.$ +%#".5467.54>32'>54&#"32654&/.'&C^7.P:!O?!;Q/Wr97!++*Q(Qk9'0J1UE;^&;fY.6:G553A@TH)6"i:2(8@@=Jcc[BK[CL*)20)8*8&$#$" +%#"&54632+3267&54>32"32>54&(`JNl#"Q4Xd "M7Tp>_?]r ),?(C<.C)CY11EF&0"*%$WR2bK.cc%ork)?P&9>&=O(:A>J #b93>6  R      F $ r 0m | >u ( < :q  Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo RobertCoFo RobertItalicItalic1.001;COFO;CoFoRobert-RegularItalic1.001;COFO;CoFoRobert-RegularItalicCoFo Robert ItalicCoFo Robert ItalicVersion 1.001;PS 1.1;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.1;hotconv 16.6.54;makeotf.lib2.5.65590CoFoRobert-RegularItalicCoFoRobert-RegularItalicCoFo Robert is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Robert is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Elizaveta RasskazovaElizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.lizarasskazova.comhttp://www.lizarasskazova.comRegular ItalicRegular Italic  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni00A0AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecombuni0394Sigmauni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Atwodotenleader zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferiorliraEurouni20B4rubeluni2113uni2116 estimateduni2190arrowupuni2192 arrowdownuni21E6uni21E7uni21E8uni21E9uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni25A0uni25A1uni25AAuni25ABuni25CBuni25CFuni25EFuni2610uni2611uni2612uni261Auni261Buni261Cuni261Duni261Euni261Funi2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi2981uni2B9Cuni2B9Duni2B9Euni2B9Funi2BC5uni2BC6uni2BC7uni2BC8uni3008uni3009uni301Auni301B commaaccentcyrbreveCR zero.zero Iacute_Jacutei.TRK iacute_jacutequestiondown.cap question.smcpquestiondown.smcpexclamdown.cap exclam.smcpexclamdown.smcp hyphen.cap endash.cap emdash.capat.lnum slash.cap backslash.capbar.cap slash.smcpbackslash.smcp parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.cap uni301A.cap uni301B.cap dblparenleft dblparenrightdblparenleft.capdblparenright.cap uni3008.cap uni3009.capparagraph.smcpnumbersign.lnum uni2116.lnum percent.lnumperthousand.lnum dollar.lnum Euro.lnumyen.lnum rubel.lnum lira.lnum sterling.lnum cent.lnumcopyright.pnum_lnumquoteleft.smcpquoteright.smcpquotedblleft.smcpquotedblright.smcpguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap asterisk.smcpf_igrave f_idieresis uni041B.bgr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni0432.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni043A.BUL uni044E.BUL uni0431.SRB uni0475.smcp uni0473.smcp uni0463.smcp uni0434.SRB uni0433.SRB uni043F.SRB uni0442.SRB uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044E0301 uni044D0301 uni044F0301 caron.alt acute.cap breve.cap caron.capcircumflex.cap dieresis.cap dotaccent.caphungarumlaut.cap grave.cap macron.cap tilde.capCyrbrevering.cap dotbelowcmbperiodcentered.smcpa.smcpb.smcpc.smcpd.smcpe.smcpf.smcpg.smcph.smcpi.smcpj.smcpk.smcpl.smcpm.smcpn.smcpo.smcpp.smcpq.smcpr.smcps.smcpt.smcpu.smcpv.smcpw.smcpx.smcpy.smcpz.smcp aacute.smcp abreve.smcpacircumflex.smcpadieresis.smcp agrave.smcp amacron.smcp aogonek.smcp aring.smcp atilde.smcp cacute.smcp ccaron.smcp ccedilla.smcpccircumflex.smcpcdotaccent.smcpeth.smcp dcroat.smcp dcaron.smcp eacute.smcp ebreve.smcp ecaron.smcpecircumflex.smcpedieresis.smcpedotaccent.smcp egrave.smcp emacron.smcp eogonek.smcp uni1EBD.smcp gbreve.smcpgcircumflex.smcpgdotaccent.smcpgcommaaccent.smcphcircumflex.smcp hbar.smcp iacute.smcp ibreve.smcpicircumflex.smcpidieresis.smcp igrave.smcp imacron.smcp iogonek.smcp itilde.smcpidotaccent.smcp i.TRK.smcpjcircumflex.smcpkcommaaccent.smcplcommaaccent.smcp ldot.smcp lacute.smcp lcaron.smcp lslash.smcp nacute.smcp ncaron.smcpncommaaccent.smcp ntilde.smcp uni1E47.smcpeng.smcp oacute.smcp obreve.smcpocircumflex.smcpodieresis.smcp ograve.smcp otilde.smcpohungarumlaut.smcp omacron.smcp oslash.smcposlashacute.smcp thorn.smcp racute.smcp rcaron.smcprcommaaccent.smcp sacute.smcp scaron.smcp scedilla.smcpscircumflex.smcpscommaaccent.smcp uni1E63.smcptcommaaccent.smcp uni021B.smcp tcaron.smcp tbar.smcp uacute.smcp ubreve.smcpucircumflex.smcpudieresis.smcp ugrave.smcpuhungarumlaut.smcp umacron.smcp uogonek.smcp uring.smcp utilde.smcp uni01D4.smcp wacute.smcpwcircumflex.smcpwdieresis.smcp wgrave.smcp uni0233.smcp yacute.smcpycircumflex.smcpydieresis.smcp ygrave.smcp zacute.smcp zcaron.smcpzdotaccent.smcp aeacute.smcpae.smcp uni01E3.smcpoe.smcp uni0259.smcp uni01C8.smcp uni01C9.smcp uni01CB.smcp uni01CC.smcp uni01F2.smcp uni01C5.smcp uni01C6.smcp uni01F3.smcpij.smcpiacute_jacute.smcpnapostrophe.smcpgermandbls.smcp uni0430.smcp uni0431.smcp uni0432.smcp uni0433.smcp uni0434.smcp uni0435.smcp uni0436.smcp uni0437.smcp uni0438.smcp uni0439.smcp uni043A.smcp uni043B.smcp uni043C.smcp uni043D.smcp uni043E.smcp uni043F.smcp uni0440.smcp uni0441.smcp uni0442.smcp uni0443.smcp uni0444.smcp uni0445.smcp uni0446.smcp uni0447.smcp uni0448.smcp uni0449.smcp uni044A.smcp uni044B.smcp uni044C.smcp uni044D.smcp uni044E.smcp uni044F.smcp uni0450.smcp uni0451.smcp uni045B.smcp uni0453.smcp uni0454.smcp uni0455.smcp uni0456.smcp uni0457.smcp uni0458.smcp uni0459.smcp uni045A.smcp uni0452.smcp uni045C.smcp uni045D.smcp uni045E.smcp uni045F.smcp uni0491.smcpuni043B_BUL.smcpuni04300301.smcpuni04380301.smcpuni04350301.smcpuni043E0301.smcpuni04430301.smcpuni044B0301.smcpuni044D0301.smcpuni044E0301.smcpuni044F0301.smcpzero.tnum_onum_zerozero.tnum_onum one.tnum_onum two.tnum_onumthree.tnum_onumfour.tnum_onumfive.tnum_onum six.tnum_onumseven.tnum_onumeight.tnum_onumnine.tnum_onumzero.pnum_lnum_zerozero.pnum_lnum one.pnum_lnum two.pnum_lnumthree.pnum_lnumfour.pnum_lnumfive.pnum_lnum six.pnum_lnumseven.pnum_lnumeight.pnum_lnumnine.pnum_lnumzero.tnum_lnum_zerozero.tnum_lnum one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum jkklnoop      $%89ABUVVWWXXY DFLTcyrlZt $ 0 $ b  p B 0.Hz&2xj j`T3~45{yhijklm\}YO@ ,(*+8:L    NB!SU&'1.)0-/49<>=IJDEFG2AHK?"%7CPSUXY[\]^`acdefghijklmopq{stuvwxyzr|}~#635;`az|~xnoMrsged"% >@CDEFGHIJKMNOPQRSTUVWXYZ[\]^`cdegjkmpu{   !$&(*,.02469;=@ACDFGIKMNPRTVXZ[\]^ab NORUWXpq{|}~ $[6r|"(.4:@FLRX`flrx~_UW gedf T$VQRTVWZ_bnLL ff  """, gedffSTUV"%!" $STUV"%!" $6",-MV-XM,L L[ (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $""4"styy 6L"styystyy"8Nd"styystyystyy$:Pf|"styystyystyystyy&<Rh~"styystyystyystyystyy(>Tj"styystyystyystyystyystyy *@Vl"styystyystyystyystyystyystyy" ,BXn"styystyystyystyystyystyystyystyy$ .DZp"styystyystyystyystyystyystyystyystyy#O@ ,(*+8:L    NB! $&'1.)0-/49<>=IJDEFG2AHK?"%7CPQRSTUVWXYZ[\]^_`abcdefghijklmnopq{stuvwxyzr|}~#635;MgedDEFGHIJKLMNOPQRSTUVWXYZ[\]   "$&(*,.02469;=@ACDFGIKMNPRTVXZX{|}~W>{yhi_jklm\}Y`az|~xnors> >@C^`cdegjkmpu{[\]^ab NORUpqU<ged{={yhi_jklm\}Y`az|~xnors= >@C^`cdegjkmpu{[\]^ab NORpq. . n4ystystystystyst UUn4st yy  UU Ir$(2  702:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz$ $i$ $i$ $i$ $i$ $i$ $i$$ $$i$A $Ai# #i# #i# #i# #i# #i# #i## ##i#@ #@i" "i" "i" "i" "i" "i" "i"" ""i"? "?i! !i! !i! !i! !i! !i! !i!! !!i!> !>i   i   i   i   i   i   i    i =  =i i i i i i i i< <i i i i it ti i i; ;i i i i is si i i: :i i i i iy yi i i9 9io5 o5ioU oUik& k&ikF kFi !A "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrzA@AkA@AkA@AkA@AkA@AkA@AkA$@A$kAA@AAk@@@k@@@k@@@k@@@k@@@k@@@k@#@@#k@@@@@k?@?k?@?k?@?k?@?k?@?k?@?k?"@?"k??@??k>@>k>@>k>@>k>@>k>@>k>@>k>!@>!k>>@>>k=@=k=@=k=@=k=@=k=@=k=@=k= @= k==@==k<@<k<@<k<@<k<@<k<@<k<@<k<@<k<<@<<k;@;k;@;k;@;k;@;k;t@;tk;@;k;@;k;;@;;k:@:k:@:k:@:k:@:k:s@:sk:@:k:@:k::@::k9@9k9@9k9@9k9@9k9y@9yk9@9k9@9k99@99k2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz$ $i$ $i$ $i$ $i$ $i$ $i$$ $$i$A $Ai# #i# #i# #i# #i# #i# #i## ##i#@ #@i" "i" "i" "i" "i" "i" "i"" ""i"? "?i! !i! !i! !i! !i! !i! !i!! !!i!> !>i   i   i   i   i   i   i    i =  =i i i i i i i i< <i i i i it ti i i; ;i i i i is si i i: :i i i i iy yi i i9 9io5 o5ioU oUik& k&ikF kFi"*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrzA@AkA@AkA@AkA@AkA@AkA@AkA$@A$kAA@AAk@@@k@@@k@@@k@@@k@@@k@@@k@#@@#k@@@@@k?@?k?@?k?@?k?@?k?@?k?@?k?"@?"k??@??k>@>k>@>k>@>k>@>k>@>k>@>k>!@>!k>>@>>k=@=k=@=k=@=k=@=k=@=k=@=k= @= k==@==k<@<k<@<k<@<k<@<k<@<k<@<k<@<k<<@<<k;@;k;@;k;@;k;@;k;t@;tk;@;k;@;k;;@;;k:@:k:@:k:@:k:@:k:s@:sk:@:k:@:k::@::k9@9k9@9k9@9k9@9k9y@9yk9@9k9@9k99@99k >AhjJ<FPZdnx",6@cccccccccccccccccccccccccccx}PUX^ckmno yst xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernfZbz     !#%')+-/13578:<>?BEHJLOQSUWhijklmnopqrstuvwxyz{|}~V|~D~F&*06<j&*****      < j  p  v   j   j      p 8       4 j t z      p   2 < B H f  * x  "T L: ;$>em'p'rB|000&$SE[p|$ ?dek d?dfo eg ?dfgkog ?[defeg?defg|g ?def|g#?[def| Tdeg ?def| g ?dfeg; ;?[w cdi ";B5[kbci ";?B[cdi );?uES[lz>mp|*wC"uf %0  d P-"#;I?G@R`]ko^::M';DV1; ]I    C-B ?[k  ?S[   ; ;?cd??;M)) Y) 79:!#%3UIM Y+ILXYZ\  (*,.0246IXWX ?|didgipTdgux ?|doidgx!< "?|iTdegx/ "?Bmp~|cdiTdgx "?BBmp|cdiTgux ddg ? ???ii%;cn>m|Y~dfmggb||| ??   Bj ]f;Bw-]f g TdegB|fTegxy fTegxdgydgxxydgx ?|Tdeg;?eg;?f{e ;?g;?f{eg ;?{#;ES[f|{Tdeg;?f{g;?E{Te #%)39:=>?BEGHIORSTUYZ[^defgw 348:<?KLPRZhijkmnopstuvwy{|}~ bcdfghltxQ`derx{NEGZcMAmp|brr6 .@[uffqUe\Xp]n 9===H@ZR]e,6G N~  $ u$$  !s000090E-0'000000BB00000'0pnyY4  # $ 1 86/-##))33>>?? BB:IITT&[[W^^ ccddggYww%(jj<mm=pp>ss?yy@ABCGKMOQUYY)ZZ'[[*\\^^bbcc2dd ff3gg +,FHDVT "X5CC;QQE``IddJeeLrrSuuPxxR{{N!970.,M++      6S5ZHHH/SSSS(!TTT#   SSSSHSSSSSS        S S S S SGS5 Z Z Z Z Z H H HH H H H H     0 / / S S S S S S SS(((  Z H S   /S599J999IJ99;919999KE999I993993J;999J99E97CCbC?QQ=LL=C=C=QCQQQQQ?=ACCbCQQL==QQQJ3C9b H  S S S S,, "TTTTTTT..........MGSS&'6612::4<:F:8C?]PCQQQDDRDRR>@B%%%%%%%%%%%%)*%%%%%%%%%%%%%%%%%%%%%%%\%%%%%%%%%%%%%%%%%)))))))))))*** % % %%%%%U[[[[Y_[[[a[[][[]PN[[[P[[_[W[$P[][[$P$$N$[UV\\^O\`\X--Z #%)3>?BIT[^cdgwjmpsyYZ[\^bcdfgCQ`derux{  )M? :$i:z-&H-B$0B22CCC$888K--E 66U-''66U-- 9 f\iA@vj{s st yy      UU _a 2'3~/=KgKKKgKK?KKKKgKgKR@SAABT OOOOzO{WOOE{{{ {X164======>gKKKKKKKKKKggggggSSSSBKOOOOOOOOOOOO{{{{OOOOOOO{{{{{{=O=O=OgOgOgOgOKOKOKOKOKOKOKOgOgOgOhOKKK{K{K{K{K{y{?WKKKKKKKKKKgOgOgOgOKKKRRRR@F@E@ES{S{S{S{S{S{A{B{BTXTXTX KKOKKKKS{>OKKO>OgOR@EB{WGGCGfGGL(CGG9G;GGGGDcGGGLGGkGGkC9!GGGCGGcG7w w"ws#iiwwiw%iii iisUwww0iiiiiCkw )GKRA{A{A{KOB{~~5y{{zz;<HHl:HdH8ws+*qawiiixxjxjjtV]n|nnn|nn_nnnn|n|nM}PPQ`]]]]]]]]]|||||nnnnnnnnnnnnn||||nnnnnnnnnnpn_nnnnnnnnnnnn||||||||||nnnnNMMM}}}}}}}}}}}PPPPQQQQQ```^^^|KnKnKKnnnnn[oooobYoooooqooqaI$o&ooaooYouomaoq,oo-.mammImo[\pprJpZpvee#styU_`a(b #6"{}Myxfa?/1 '' Rn mgg u'&*Br!! $x  no k00ihikkllqrttvvxxzz{{||}}~~  !!                 PPRRSSTTUUVVWWXY ZZ[] ^^__ aabbcc ffgh iijjkk llmnoo pqssttvw yz||}} ~~    HeH,j+/.)(*u""$$z??@@'BB0``&mmnstlyyl{{tzzzzhiojjMkkomm7noopp1qqfssMtuovvBwwoxxqy{o||!}}o~~g<ofoYoYMB o oMo<o:R"Ri8RNW[T[R[$R[WRWW%WN[PRviR2W9T[v[WMYRoieJKIJKIHmslwUUj_a>cc-ddff gg5ii6aUbVqrpZCp=p;#RNv_?RWSXSX\OQxyx^yPPDQS]TT UU]VVhWW@XZ][[L\]]^^__`]aa_bb?ccFddee ff]gghi]jj?kl]mm@nn]oocpp]rr?ss]tt_uu3vw]xxyy4{{?~~F]DE^`G^A^dk hiklnoqrtxz ,<HJLSVXY[]^PPbR_cacqfqtstvwyz|4$&,.k$MbyfaAVwZvtm-[JxT=tTc}  nY s$$,                                 ,,     !&-"#$%&&'()**+, !!!!!&&&----------""""#$%%%%%#&&&&&&&&&&'''(((((()))))))))))****+++++,,,----####,,,,#(% <;<d)+( 2DD3gMgggMgg5ggggMgMgY>?667@ &````Z`[\][^__``_IJ\\\#\h$RfffH3333334MggggggggggMMMMMM????7g'````````````\\\\`_``````\\\\\*\3`3`3`M`M`M`M`g`g`g`g`g`g`g`M`M`M`N`g[g[g\g\g\g\g\\5]g[g^g^g^g^g^g_g_g__g_M`M`M`M`g_g_g_YIYIYIYI>K>J>J?\?\?\?\?\?\6\7\7@h@h@hgg`gg^gg_?\4`gg`4`M`YI>J7\]L"g_YI6\6\6\g`7\;;EF=EF=<QGfffffffjjjjjjjjjjd\\/.ccc -01UOVP,ZZ8TaTTTaTT:TTTTaTaTAWbBB Ci888888888aaaaaTTTTTTTTTTTTTaaaaTTTTTTTTTTT:TTTTTTTTTTTTaaaaaaaaaaTTTTAAAAAAXWWWbbbbbbbbbbbBBBBCCCCCiii999agTgTggTTTTTASSSSSee!$$&(*24= DHJSUZ&\],.EK[a!#ZVX")T#l%BuDO! ( )$}Myxfa?/1 '' Rn -mm{{""       $$$%\k\2154/' .0HVVVVVVJVVVVVVKLLM-6nnnnnnnP!,HHHHHHIVVVVVVVVVVMVnnnnnnnnnnnnnnnnnnnHnHnHnnnnnVnVnVnVnVnVnVnnnnnVVVVVVVJVVVVVVVVVVnnnnVVVKQKPKPLMMVVnVVVVInVVnInnKPMRRNRRR7WNRRDRFRRRRO@RRRWRRuRRuND R RRNRR@R>e(eeasswggwew*ewsesss+ssawceee8ssgwwsssNue RVLLLVnMkk^_]^_]\;BBB3" <&=}q~rFGSSvESAS?)ea{CesssfftfttxbdhjloophhhhhhhhhzjmllloooopppppiiiVVVVZyyyyXyyy`yy{yy{CTyyyCyyXyyCy{9yy :CTyZ[zz|UzYz# mm{{"""$$#$դ'ZZPKwL\HKlimit-login-attempts-reloaded/assets/css/fonts/CoFoRobert-RegularItalic.ttfnu[ FFTMGDEF58-GPOSL=vGSUB#9\OS/2cr`cmap4Rcvt 5 "fpgm?x gaspglyfT1XPheado,6hhead$hmtx)nvloca:$"maxp%v name9v6post3$prep !\.jM_<ZZ<6]<6*:w4LXKXJ^2 COFO   +M-6DuVN/<u4bOeDx4,":  (78'-7"NNYNO}0u@G,@>3GQFefppze[@z#xQ_34- :-J-3+<!A"/>$U')Y*L*2-#-5S?CC<6)Kp@:1NeN4W4NVol)/Nh.r }N0tNs^$HGpN1 M!M#<@GGGG>>>>GGGGGN^Fffffze\34-4-4-4-4-4-)-3333/>/>/./:0L*22222Nn2BCBCBCBC))4-4-4-@-@-@-@-J-J-G3G3G3G3G3@!@!@!@!A"B">/>>/>>/>>/>/>'M>$U3')3'3')25)3'L*L*L*L*L*G2G2G2|@255e\e\?e\"fBCfBCfBCfBCfBCfBCp6ze)ze[[[j9j-9)t*fBC)T -)F2e\ze)$U(mHtqKK GG,e3F>XKef1\q3GGGQ@`g1PMxZj;H{%4-@) 23|BCBC202C+2L*--Z*)0DC0R=J=+>>%&33 -/>/8U+A"20BC)DC5*E2a) L*p6p6p6G3ze)MPEd"]U3s@]0 {xguS\Rtgtv\v]x&p t su\t%tH}vN4N&N*N&#VpdypdxgdqNdRN>NXNgNhBSBSBSBSBSBSBSBSBSBSBSBSxvxQFPFr<M<d4D+;+;>2>2>2d>2dDOBSBSBSBSBSBSBSBSBSBSXd2%22%2228FMEyR4,a8>M>@31-\]s}1q}soI}?K1='5i'J^3V"(88N NN`NP+O+PXlclc= ; lr%<%<GGg1;{%.!|  E!d:!<JCDP=4-3BC2)>%&{ \F %%e*W&+& %J6EF'FF % % % % %%%%%ee*WWWWWW&&&&&&&&%%   %J%J%J%J6E6E6E6E6E6E6E6E6E6E6E'F'F'F'FFFFFFEBBBW[!hh'e&[ %%J)+5XHP`JJ%2Jh)_h&)N4N4NNNN N5NINXN.N#OFOFj08(%UYhN?E8NQNQNDN!;3N&GPC:$~7~37Y_cuGc      " & 0 : D p y !!!"!.!!""""H"`"e$i$$%%%%%&&'')++0 0 927YbrFb      % 0 9 D p t !!!"!.!!""""H"`"d$`$$%%%%%&&''v)++00{uh[S;%"bhfX>pTzaZSK}+߹߶ݼ<(܈܀a^?%֨փD4Z ~   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivok ujrgglzcnm{b7w[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-),# bfc`KTX# .]!!Y-*,# bfc`KTX# .q!!Y-+,# bfc&`KTX# .r!!Y-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpBE1*B@ XL8&*B@ ^RB/* B@@@ @ *B@@@@@ *D$QX@XdD&QX@cTXDYYYY@ ZN:( *DdDDLL**II++II++;;++{|;;++6,ddddhtXD $ T 4 X  T0H4||t\H| @!$!"d"#H#$x$%p%&&d&&',()t*++- .0012305067t949;H<$<=?@ABCDDEpEEFGHItJ0JtKL@MlNNODQQTQR<RSTTUUUVVXY Z[\\] ]^_`\ahcdefh hiijDjklmhno pp@pqrTrstu\w`yd{h}`<`x xhX@L <lH ( 88pLt<hʤdӈLռ֐$ڐ$۸|@px<l@h@` 04t0X D P  L@48L@D|`$ <!"8#%&'H'*x+ ,\-@-/\01L13347L9:< =>@C@CDF HLILKtMOQRSTUVWXLY@YZZ[$[[\\\]^^P^^_p_`abcdde\efdfgi<jklmn|nopppqxr@tvwXx`yz{0{|t|}|~|~$tP<@| <D40x| \p$h\lxtt4$h\d<żȸɜPld L؄x۸ސ@TT(t|4dT@x` 0,44\4h `x|   D ,L< x<D \!L"#$&8&($)4)*8*d***+ +0+T+t++, ,H-8---01235L667 788889$::@:d:::;;X;;<=\=>$>??@@4@`@A8BCETG HlI,IJKLN`NNOP P8PdPPQSUVHVWXYxZ[\^`4abdedfxgPhhi\jlmmo(q,r<slt\uwXyz|}}T}}~ ~~P\<p l\8,Hxx|| @4<  THtHL` lPtżƌHɴp˴̜@|ӌԔՔ<L8$ݰ\ P(|L,D, \8(HDT$     ` hh|!""$%%&'( )D*4+,../ 01d2457@9P;>\@AB<BCLD<EEFGGHIJJ|K,L4LMtN`NOPQHQRDRST|U<V(VWpXP>  0+!%!! '7`222j:F%!6%)@&pBK[CL( +7#>7>7>32"&54632$$  =I$$XH+G@+C'(uu $@!sBL   # +7>3237>32u#Wf#W$%  $%  HK PX@&  gb  a=LKPX@%  sb  a=L@.r  sb U Y  MYY@ +737#73733733#3##7##7#737#l?1.01/1no?./.-/.j?{4444/C/:Ei@f/2 <1% $ Jrp  nsK[KK [ LA=6*: +373#4&'#"&'#7.'#737'.546327.#"'232654&y%) !%),"04Ah[ &"7!!+8*8>@dH P/ 3:)^63E&CM C-5 67KY7>$C6; ?2IC')%l :."$<f! +7^@[pc  d  c;K [ CL-,31,7-7%#++   +7"&546323#72654&#""&54632'2654&#"KTgPLT.Er;[<@8/0:A4KTgPMS.E,?9009A3VKNiVC&F4ET9+9L92:VLNiWB&F54T9+9M91:BN\U@RZF7+U2Jpc[BK[CK[CLSQMKA?;9*$%' +326?3#"&'#"&5467.54632>7#"&54632%>54&#"3267/.'f(4, % (  . +?0g2Va|f dT@Kw_? *  RU&+0=6?([(nLU`$F>6&5%&&4($#(TPWk<"Wh@4TY z  -22#:S9!*Di9L"Xu @sBL # +7>32u#W$%  4 0+.54>7* _w7f^1B%LЏXl#*JBq_Qa 0+7'>54.k _w7f^1B%LЏXl#*JBq_Q G5@2=A3(JWc[O)),))* +#"&/#"&546?#"&546?'.54632'.546327>32RQ C B TS A B   ;Z  Z:  !  ;Z  Z: eq$ )@&rsUZN +3733##7#r636 636c/a]@JG[CL$& +'>7#"&54632 D<$+B) D!&%<2%DR&@UYM +%#73A9{b @[CL   +"&54632<$$ '(@r?L +3#55,,-@*[K[ L +"&54>32'2>54&#"[n+Li>ak'Jl?/P8 FA3R8M oVBuX3nW6s]<91L^-AK.I`1>N #@ YKYL+#7!#3!73Ls66v66'>@;pc[KYL ''+"32#"&54632!73!?>54&$/BpVLg1M`.t=*5]%M?(?"  EU9E-G=6Dn4h27<"++<C@@:Jcc_ [ K[ L53$"$!&#$" +%#"&54632+32>54&+732654&#"32#"&54632mK[=0!?/MF +g]?10?qYKe[P/4[`v?6"0!+>(1*+Y54&#"'!!>32HZ9,.G1?<$D]O>?N]|>7#/#"5C!62.? DHm7s&4A@>!Jpcc[ L('0.'4(4&'$&$+%#"&54>32#"&5467.#">322>54&#"%B_9Y^(OuLH]2$&J<. !\1Lf'@-<6QhG5^E)fZLQ;3%%Db<"(G$:M(42oW5>8!@pqYL+#7!#>7!c+5?fK4U?Wl=9?9??5- s+='@$; Jc[ L0.&$,$+%#"&5467.54>32'>54&#"32>54&/.'&B[5_iD<!8M,Qi64 * ,*G==R93QD#>.?*; 331P9\BE_5"+D.GB0W;aL*-2A6)1 3E'7",-  Q"$4?@<Jc_[K[ L&%.,%4&4&$"$$ +#"&54632#3267#"&54>32'"32>54&EsUHe E,Ud#P6Sg&AV0Vl"=->3(@.DCCY;9"0',TK8\@#^16J,67#"&54632$$ D<$+Bq'() D!&%<2%0+%%7% u-+8Y+"@aUYM +!7!!7!\ -[ //c0+77%0" /-+8O!-9@6pc[BK[CL#")'"-#-&$( +#7>54&#"2#"&54>32"&54632}c7 /I133(G 5F&QX$$*cd&6C%+6""(=)N'(0 9kFV@  76JK'PX@)c  c \CK[?LK1PX@0  pc  c \CK[?L@.  pc  c d[?LYY@HGPNGVHV(%(&%&'$ +#"&7467#"&54>327332>54&#"3267#".54>322>54&#"9;W87'&K'55 6J+.6+3F $>.Wi;.QpAN76YT]2Bwc5<1'% 4%;By\74%9=H=2eP3<.d.(1Qk;K}[KwS,3<=?3^ScSG6IM-:1HU$(0c8@5Jb:K Y;L +7#7333#73'#73 JF,J W p111w119e*E@B J aY:KY;L  * )#! +)73#7!232>54&+ 32>54&# XW aQY]==,MnUt0D*5=pQKp3O4>B1G0M8Bn B30T<#x1<*-4F',-@&@ JK'PX@+pn[BK;K[CL@/pn:K[BK;K[CLY@!  && +"32673#7#"&54>3273#>54&DfB!IVQn4@%f9n{1[Q@^'%84SU|;UfdQN'0wQP31^  ?A0@-Y:KY;L&! +732#!73332>54&# 5jm XOWZR'Ufx0nIS1GMt>UiqK PX@/hpaY:K Y;L@0ppaY:K Y;LY@ +%73!73#7!#7#3#=(2 XW 2( D K11G00egK PX@&haY:KY;L@'paY:KY;LY@  +#3#3!73#7!#F Io XW 2)x111G0@-c@ $ JKPX@-  pa [BK;K[CLKPX@)  pa [BK[;LKPX@-  pa [BK;K[CLK!PX@)  pa [BK[;LK'PX@-  pa [BK;K[CL@1  pa:K [BK;K[CLYYYYY@('&%"  -- +"326?#73##7#"&54>3273#>54&DeB &<(QfNAP' b;qw1YPA^&%80VR|A%A0Zf33U+1kXN20\  ?AC>@;  aY:K  Y  ; L +'3#73#!7#73#3#73!3#XW WB`BW WW WMMW 1G0000111 #@ Y:KY;L +'3#73#3#XW XX 1G001*+@(cY:K[CL#$# +%#7!##"&54632+326sh  XssX9?'" &6J00Kkb6(*0II@F Ja Y :K Y ;L +37#73#3#73#3#73#731@dU NB [bOV XW x0011"11G00 2@/pY:KY;L  +%73!73#7!#?(5 XW  [11G00<@9 J Y :KY;L +3#3#73# 3#73#7WNz WW V^XW XW %011/k11G0:0@- JY:KY;L +3#73## 3#73#V W@W XW 00B11GG(@%[BK[CL  +.54>32'32>54&#"8v{4]Mt2\LTCfE#JTBgF$sW}KwKTXfU};TcQyb:@7a Y:KY;L$! +%!73#732+32>54&# XW jiY:US:V6:E111G0QItG!9M,1;F_#=JT@QA1!Jpc_[BK[ CLIG:8.,'& ## +.54>32326?3#".67'.54632>54&#">?6&#"7v{5]Lt8P3 .# ( 47#&,IP<:=-.KTBgF$  3(sW}Kw:zo]1I$#':I/<WeA?ULR!UZ['TcQyD  !EP>\'2P@M J p  a Y:KY;K[CL20*(''+!%# +%#"&574&+3#73#732326?%32>54&+W 6+4$2bDV XW bdnX)   \)I6;54&#"#"&'#7332654.546327$+0HB:?UfUw_<]&)/W:COTeTlP>T  1<>06>3273326?32>54&#"6$"% 0\1?9%?X39@;.\ $"H;&.,'A-g<4"$/MOSG9w_>I8zH#&dAY\4I32"32>54&?Se[ l*b;;B,KgF#I<'/%*J5! 1?$j1S/AVG?@d>@^o.1%?]m,%7-%6@3Jpn[=K[CL&'$&" +%3#"&54>32#"&5467.#"326X/RBRY 5#;T_$32#73326?32>54&#"5*'!'e2?A%AY48FOL  $"H;&12&A/g<3&'=QQH;w_3232673#"&"7>54&3&D]61CP 9E8-JGeW#:N+ E/(<5@ -JK PX@/hh[BKY =K\GLK PX@0hp[BKY =K\GL@1pp[BKY =K\GLYY@54'$#'$# +##"&5463232>7#737>32#"&5467.#"3AdMU1;$~M K X?)8 (3 iPi,*$(4+'^V($"I=, &6 @ !JKPX@-p=K[=K[CK[GLKPX@)p[=K[CK[GLKPX@-p=K[=K[CK[GLK!PX@)p[=K[CK[GL@-p=K[=K[CK[GLYYYY@('0.'6(6'$#&# +7#"&54>3273#"&54632326'2>54&#"F/6]5?A$?Y3V^ 5H;Xh,-;"3JKPX@,pY:K[=K;K[CLKPX@(pY:K[=K[;L@,pY:K[=K;K[CLYY@ #+%& +%7>54&#"##73>32326?3#"&546r&  #J?0 &IZd/6>"37 -   $ 8*(#a2>Xc%y/!A2-*3s<!% <3)G> %@@=p[7#7#"OH0;#m 2%([^[+-$ )5+ 9T@QJpc Y:K[=K;K[CL987653.,)(%#$%! +3326?>32#"&5467326?3#"&?6&+##zl,6,4* $# % 1%.)31BH[p#3%0$ ,", = C9=+(3,6+>y)(@%pY:K[CL#& +3326?3#"&5467#x  $ 7*)$[; % <3)I*3L* JKPX@3p [=K  Y  =K;K[CLKPX@$p [ =KY;LKPX@3p [=K  Y  =K;K[CLK!PX@(p [ =K;K[CL@3p [=K  Y  =K;K[CLYYYY@LLKJ&+#+)% +>32>32326?3#"&546?>54&#"#>54&#"##77/6=!1- +2;"/6 .   $ 5*(# '  %B7) .JY $C9+ /J~[ױ#C3.$ / <.-'2w7 !% <3'"Be432326?3#"&546?>54&#"*~[8.7@$1; *   $ 5*(# ( &F:, 3+"B4!**6#j5!% <4+Fc27P[$2%(@%[=K[CL  +"&54>32'3267>54&#"QS!?]?6D!9;;(E JKPX@-[=KY=K[CK Y?LKPX@#[=K[CK Y?LKPX@-[=KY=K[CK Y?LK!PX@#[=K[CK Y?LK-PX@-[=KY=K[CK Y?L@+[=KY=K[CK Y?LYYYYY@%#&# +#73#73>32#"&'4&#"32> H[(4]3??&@Y32A Mt-#H;%12&A0,,z+RHPK:w_<7+.;=V^ 4I;Wg- &G@DJ=K[=K [CKY?L &&&# +#73#"&54>3273'2>54&#" \a3^5?A%AY432#"&5467&"#"#Z-,`6"!;7- -I+Qa& 1M_.7E@B5Jpn[=K[CL0.(& 77 +72654.54632#"&5467.#"#".54632*FCQC`D!<, ="(?3326?3#"&5467#"&546?#7[ B<0 2Ha  $ 3)&08?!13 PR 1:T^$& !% ;4$:<$I:%+(5+<+JKPX@ Y=K[=K[CLKPX@#[=K[=K[CLKPX@ Y=K[=K[CLK!PX@#[=K[=K[CL@ Y=K[=K[CLYYYY@++($)& +32>54&'#"&54632#"&546?#7I  0Q9   #EkH>; <\%S!!9Wi/ &33{hG:0%Z#+6@@ 3JKPX@"Y=K[=K[CLKPX@%Y=KY=K[CLKPX@"Y=K[=K[CLK!PX@%Y=KY=K[CL@"Y=K[=K[CLYYYY@ $)%&&$ +#"&7#"&546?#7332>?332>54&'#"&54632#Ca=N,(.46: ?\M 90' ADB $&F5 T3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3Af@c 4".1Jpn[ =K[ =K[CK[CL@>+$%"+$# +>32#"&546732673#"&/#"&54632>7'.#"#>32/Q5"C1( %,)%( 9U6L2 $0.($RS^'ZY%?3#"&54632326?#"&546?#7U ! A7* 1IhnBS 6GP5*2>$/A JQ 02IV$n;3$h\ =/002+?T@Q%Jpnn[=K[ CL=<:8,*! ?? +".'#"&5467"&/.#"#>32.54632632673886##  :1#% ,8531 $  E2!% ,   /  (*HM  / (+IL0.@+$ J[BK[GL0/! +#";#"&54>54&'7>54&54>3 #N; >8"#!"+5 7H@$*$*(54&+732#H #N; >8"#!"+5 7H@$*$*(3232673#"." +7.3/.+ 5/3/-#1C'3A! *@'pq[=L    +2#"&5>3#"&7>7>%$$% A&'WH*HA*Ce>-@ JK PX@0fpng[K[ LKPX@.rpns[K[ L@,rpnsd[ LYY@ &'&+%3+#7.54>;73#"&5467.#"3260dB*@Q >\;*3C 7%/C*B61JJG\` ]K9mU4`d :,#:QXCM84*B@?pc a[K Y  L*)$#"$# +37>32#"&5467.#"3#!73!7>?#u< bV?E (39 } $0.&%v7%C ,Zf"32654&. ;Y"WX!\9$=]"\Z!\?%>KM<;JJY#W;"'@Y"[]"[@&!9Y#Z4H32#"&5463.#">54&/.'Mf !!J5;T81$;D\E6I*"?1  B&?P9. :BSE!t  ;B3. CF04C?'0.G:)2O6Nf<()>()%.!82'7I9Gf:#WePW3%: U1*8. 3dD@(W[O      +D"&546323"&54632 "!!.')%'l'GgdD@\; /Jc  W   aU cW[O)(CA?>=<9731.-,+(G)G((($ +D4>32#".732>54.#"2653#'#"&5463273#.#"l&Fe??eF&&Fe>?eG&$">X55W>"#>W55W>"(# 0<3273326?32>54&#"!7!3 %I%1/3E(+2.-G  7-$"0" S0' $;=A7,[J09,`7 H0@D)7,BP#+1/$  0+'?'7 /#V!>%b˼ʽh e>K PX@gUYM@sUYMY +!7!#26/r.ENdD: JK!PX@<  h c  c  c dW[OK-PX@=  p c  c  c dW[O@B  p c  c  c U  dW[OYY@NLHFEEB@5321%%$&(" +D4632#".732654&#"#"&/.+3#535#532326='32654&+r|d/P;":Q22S; !fYZahSYf6 `o&2#  %'by 9Q11S<""54&#"#"&54632373J q38$ J646O<^6(_+F+  -9+'9M-IB^+~>J@G6Jpcc[^K[_L=;42.,+)%#! " +4632#"&5&632#32654&+732654&#"#"&K/3>%  VA29   +0!' 2' # V+1,*"4  :D+% 6'8"  + dD@ Gi% +D'7>32yY  vg )$2@/pcY:K[GL&#"$$ +#"&54632#326?#"&54>;#E"2G3733#73_ ,  )XV ^]& ((1!%3@0][^K[[L%$#"  +"&54>32'3267>54&#"!7!>D2I.BB2Jr*%*( @8I@+VD*G@(UF.*."e&*0"]1#{  0+7'7'7'7'7 /#V!>%b#˼ʽM"dD"JK PX@Arr  p  hq a b   U  Z  N@Brr  p  pq a b   U  Z  NY@! ! +D3##73267>733#73##7#?33#37,-e_ ,  )XV ^,: FI,}:Ff& ((UU%M7ndD@c! Jrr   p  ns a  c b  U Y M7654.,(&! +D3##73267>733#73#?>54&#"#"&54632373,-l_ ,  )XV ^ q38$ J646O<^Ff& (((_+F+  -9+'9M-IB<>BMPdD@ 6PJK PX@Opp h q cccc U Z   N@Ppp p q cccc U Z   NY@$ONMLKJHGFEDCBA@?=;42.,+)%#! " +D4632#"&5&632#32654&+732654&#"#"&%3#%##7#?33#37qK/3>%  VA29   +0!' 2' # ,-),: FI,}:V+1,*"4  :D+% 6'8"  hF^UU%!a +;@8pd_[=L*("    +2#"&54646?33267.54632#"&1$%zc7 `b36%F"7H%NV&'cvnoI+5!"(=)L^q B@?  Jr  b:K Y;L   % +.54632#7333#73'#73f  n JF,J W p$ XF11w119^i B@? Jr  b:K Y;L   % +'7>32#7333#73'#735  j JF,J W p2T 11w119^mE@B Jr  b:K Y;L +''73#7333#73'#73U^6 JF,J W pQQr11w119zf/2b@_2Jcc  b:K Y ;L 10 / /.-,+*)('&%$#"!  +"#7>32326?3#"&/.#7333#73'#73 '6$   ' +%#  JF,J W p23,  ",+ 11w119dX '*[@X* J c  b:K Y;L )(''&%$#"!      +"&546323"&54632#7333#73'#73j#!#"p JF,J W p%%&$;11w119_a&)?@<)  J  c  b:KY;L('%#&" +46323#73'#3#73.732654&#"3^E-/B2%+J W qU Ju*))'!*3;;3,91111a 2""))""''7JK PX@:h  pa  aY:K Y ;L@;p  pa  aY:K Y ;LY@ +7#73#7!#7#3#!73!737#73 Su 3(A K>(3 W3ެR111G00獾11@;KPX@2 JKPX@2 J@2 JYYK PX@=  pnh  [  BK;K[CK[?LKPX@>  pnp  [  BK;K[CK[?LKPX@:  pnp  [  BK[;K[?LK'PX@>  pnp  [  BK;K[CK[?L@B  pnp :K  [ BK;K[CK[?LYYYY@65430.('&%! ;; +"32673#7#"&'732654&'7.54>3273#>54&DfB!IVQn4@%^6$*):52 ,"-5cl1[Q@^'%84SU|;UfdQN%/L!!)3 ) opQP31^  ?Aqq  JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@  % +.5463273!73#7!#7#3#>  =(2 XW 2( D K$ XF1G00qi JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@  % +'7>3273!73#7!#7#3#  =(2 XW 2( D K2T 1G00qm@ JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@ +''7373!73#7!#7#3#7^6P=(2 XW 2( D KQQrč1G00qX +K PX@;   h  pc  a Y:K Y;L@<   p  pc  a Y:K Y;LY@+ ++*)('&%$#"!      +"&546323"&5463273!73#7!#7#3#M#!#"=(2 XW 2( D K%%&$;1G00q /@, JrY:KY;L% +.546323#73#3#  PXW XX $ XFG001i /@,JrY:KY;L% +'7>323#73#3#  VXW XX 2T G001m2@/JrY:KY;L +''733#73#3#^6XW XX QQrG001X #E@B  cY:K Y ; L #"!     +"&546323"&546323#73#3##!#"MXW XX %%&$;G001!@@= a Y:KY;L! &! +73#732#!733#32>54&#I JDW 5jm XLD LYZR'UfM,0nIS1+,Mt>Ui:f3\@Y+" Jcc Y:K  Y  ; L3210/.-,*)('&%$#!   +"#7>32326?3#"&/.3#73## 3#73# '6$   ' +%# ֗V W@W XW23,  ",+  00B11GGq +4@1 Jr[BK[CL (&   % +.54632.54>32'32>54&#"h  v{4]Mt2\LTCfE#JTBgF$$ X sW}KwKTXfU};TcQyGi +4@1Jr[BK[CL (&   % +'7>32.54>32'32>54&#"6  v{4]Mt2\LTCfE#JTBgF$2T sW}KwKTXfU};TcQyGm&7@4Jr[BK[CL#! +''73.54>32'32>54&#"X^6v{4]Mt2\LTCfE#JTBgF$QQrsW}KwKTXfU};TcQyGf/?K@H cc [BK[ CL! <:42)' /!/  +"#7>32326?3#"&/..54>32'32>54&#" '6$   ' +%# lv{4]Mt2\LTCfE#JTBgF$23,  ",+ sW}KwKTXfU};TcQyGX '7D@A c[BK[ CL 42,*!''    +"&546323"&54632.54>32'32>54&#"l#!#"v{4]Mt2\LTCfE#JTBgF$%%&$sW}KwKTXfU};TcQy^ 0+%''7'77ii(gk$$F'1@. J[BK[CL$"  +.54>32'.#"%4&'32>7u|5]Ms2\z;)BgE% ?+CgE#sW}KwKT3Qy5/U}f3q %3@0 JrY:K[CL##% +.546323#3267#73##"&7#  , VY!5cek]V O](Y(ZN$ XC0zoY00Qf3i %3@0JrY:K[CL##% +'7>323#3267#73##"&7#w   VY!5cek]V O](Y(ZN2T z0zoY00Qf3m 6@3JrY:K[CL## +''733#3267#73##"&7#^6] VY!5cek]V O](Y(ZNQQr0zoY00Qf3X 1K@H  c Y:K [ C L 10-+('&%$#      +"&546323"&546323#3267#73##"&7##!#"' VY!5cek]V O](Y(ZN%%&$N0zoY00Qei @@=JrY :KY;L % +'7>32##73#3!737#7-   XNS K7e f7^J 2T z0C0011y0@nKPX@(   aaY:KY;L@&a   aaY;LY@"$! +#7!#32+3!7332654&#o  WTjj\ n XMUse:F01eNIi{x11fM1:4kJK PX@/hc[ BKY;K\CLKPX@0pc[ BKY;K\CLKPX@(pc[ BK\CLKPX@0pc[ BKY;K\CLK!PX@2pc[ BKZ;K\CL@0pc[ BKY;K\CLYYYYY@10/.+)#!  44 +2#"&?332>54&+732>54&#"#73>EMKK674L0<< ( #" 1"9D##(:%$*:LEstA3273326?32>54&#"  P6$"% 0\1?9%?X39@;.\ $"H;&.,'A-n   Y<4"$/MOSG9w_>I8zH#&dAY\4I32#"&5467#"&54>3273326?32>54&#"yY  N6$"% 0\1?9%?X39@;.\ $"H;&.,'A-vg <4"$/MOSG9w_>I8zH#&dAY\4I3273326?32>54&#"T9t6$"% 0\1?9%?X39@;.\ $"H;&.,'A-#ki<4"$/MOSG9w_>I8zH#&dAY\4I32326?3#"&/.#"&5467#"&54>3273326?32>54&#" # (! # %$ 6$"% 0\1?9%?X39@;.\ $"H;&.,'A-~*()  +&-  <4"$/MOSG9w_>I8zH#&dAY\4I GE>M?M=<9710-+%#     +"&546323"&54632#"&5467#"&54>3273326?32>54&#" "!!86$"% 0\1?9%?X39@;.\ $"H;&.,'A-.')%'9<4"$/MOSG9w_>I8zH#&dAY\4IGE>M?M=<&&'$$$$" +4632#"&732654&#"#"&5467#"&54>3273326?32>54&#"=(*;=((=)   6$"% 0\1?9%?X39@;.\ $"H;&.,'A-s-55-.66.!!! <4"$/MOSG9w_>I8zH#&dAY\4I32>3232673"7>54&26?#"FT "gA27iE -7%73B"6F "Z2AJ[or/3/F0\@^cND$-3_9Hd MCJF8(ZH1FB  0!.&(,=1CP"9E8-JGiSD1#xTH9<-:@-JK PX@5pnh[=K[CK[?L@6pnp[=K[CK[?LY@ &'$(%& +%3#"&'732654&'7.54>32#"&5467.#"326X/O<%*):52 ,"-6EJ 5#;T_$3232673#"&"7>54&  P&D]61CP 9E8-JGeW#:N+ E/(3 '3p@ -JKPX@#pBK[=K[CL@#rp[=K[CLY@)((3)3"+)% +'7>324>3232673#"&"7>54&yY  &D]61CP 9E8-JGeW#:N+ E/(3".r@(JKPX@#p:K[=K[CL@#rp[=K[CLY@$##.$."+% +''734>3232673#"&"7>54&T9&D]61CP 9E8-JGeW#:N+ E/(3 3?9$JK!PX@,p  [3232673#"&"7>54& "!!&D]61CP 9E8-JGeW#:N+ E/(>  %c JKPX@"pBKY=K[CL@"rpY=K[CLY@ #&% +.54632#73326?3#"&5467w  PB[Y  $ 8*(# n   b+C $% <3&"B>; %cJKPX@"pBKY=K[CL@"rpY=K[CLY@ #&% +'7>32#73326?3#"&5467yY  [Y  $ 8*(# vg +C $% <3&"B.I f@ JKPX@"p:KY=K[CL@"rpY=K[CLY@ #& +''73#73326?3#"&5467IT9`[Y  $ 8*(# #ki+C $% <3&"B:Y 1K!PX@+p  [32.''7.'37'2>54.#"TQ!=U3%6(a S3J&a T-9"?\5*B-(,?(/ dK8nW6!?"#2(#%9~F7t^=*>Ye&';Wd(89*%S% JKPX@D   pc[BK [=K Y=K ;K [ C LKPX@:   pc[BK [=K ;K [ C LKPX@D   pc[BK [=K Y=K ;K [ C LK!PX@:   pc[BK [=K ;K [ C LK-PX@D   pc[BK [=K Y=K ;K [ C L@Kp   pc[BK [=K Y=K ;K [ C LYYYYY@'  S SNLA?<;86+)$#"!  +"#7>32326?3#"&/.#73>32326?3#"&546?>54&#"F# (! # %$ ~[8.7@$1; *   $ 5*(# ( &F:, 3~*()  +&-  +"B4!**6#j5!% <4+Fc27P[$2 1\ JKPX@BK[=K[CL@r[=K[CLY@ +)   % +.54632"&54>32'3267>54&#"  PQS!?]?6D!9;;2 1\JKPX@BK[=K[CL@r[=K[CLY@ +)   % +'7>32"&54>32'3267>54&#"yY  QS!?]?6D!9;;2,_@ JKPX@:K[=K[CL@r[=K[CLY@&$ +''73"&54>32'3267>54&#"T9QS!?]?6D!9;;2/EK-PX@+c [BK [=K[ CL@2pc [BK [=K[ CLY@! ?=42)' /!/  +"#7>32326?3#"&/."&54>32'3267>54&#"# (! # %$ 0QS!?]?6D!9;;2 '=sK!PX@$ [32'3267>54&#" "!!QS!?]?6D!9;;no!( <@9caW[O    +"&54632!7!"&54632d#$Z #$&'/&'2-1@.#"J[=K[CL'%  +2#"&54>.#"%4&'3267>+UQ!?_?C& >x@ 0JKPX@&pBKY =K[CL@&rpY =K[CLY@ > >)#&+% +.5463232>?3326?3#"&5467#"&546?#7  Pv[ B<0 2Ha  $ 3)&08?!13 PR n   71:T^$& !% ;4$:<$I:%+(5+C& >x@ 0JKPX@&pBKY =K[CL@&rpY =K[CLY@ > >)#&+% +'7>3232>?3326?3#"&5467#"&546?#7yY  [ B<0 2Ha  $ 3)&08?!13 PR vg 1:T^$& !% ;4$:<$I:%+(5+C&9z@ +JKPX@&p:KY =K[CL@&rpY =K[CLY@99)#&' +''7332>?3326?3#"&5467#"&546?#7T9[ B<0 2Ha  $ 3)&08?!13 PR #ki1:T^$& !% ;4$:<$I:%+(5+C& J< JK!PX@/  p  [?3326?3#"&5467#"&546?#7 "!![ B<0 2Ha  $ 3)&08?!13 PR .')%'W1:T^$& !% ;4$:<$I:%+(5+ ?@1*JKPX@.pBKY =K[CK[GL@.rpY =K[CK[GLY@ ? ?''$#+% +'7>3232>?3#"&54632326?#"&546?#7yY  U ! A7* 1IhnBS 6GP5*2>$/A JQ vg 02IV$n;3$h\ =/002+(H@E JY:K[=K[CK Y?L%#&# +#73#73>32#"&'4&#"32> H[a4]3??&@Y32A Nt-#H;%12&A0,,K+RHPK:w_<8..;=V^ 4I;Wg K@ = 6JK!PX@7  p  [?3#"&54632326?#"&546?#7 "!!U ! A7* 1IhnBS 6GP5*2>$/A JQ .')%'W02IV$n;3$h\ =/002+oBB@? Ja  b:K Y;L +!!#7333#73'#73] JF,J W pB2!11w119-b)9  JKPX@-  pa=K [=K [CLKPX@)  pa [=K [CLKPX@-  pa=K [=K [CLK!PX@)  pa [=K [CL@-  pa=K [=K [CLYYYY@+*31*9+9&&'# +3##"&5467#"&54>3273326?32>54&#"6$"% 0\1?9%?X39@;.\ $"H;&.,'A-b/4<4"$/MOSG9w_>I8zH#&dAY\4I+ JKPX@3  pc:K=K [=K [CLKPX@/  pc:K [=K [CLKPX@3  pc:K=K [=K [CLK!PX@/  pc:K [=K [CL@3  pc:K=K [=K [CLYYYY@;:CA:I;I98&&''"% +332673#"&546#"&5467#"&54>3273326?32>54&#"$%8%EB+, 6$"% 0\1?9%?X39@;.\ $"H;&.,'A- &1IA(* <4"$/MOSG9w_>I8zH#&dAY\4I3273326?33267'2>54&#" *,6D< 1[1?9%?X38@;.\ $ #:M& "H;&.,'A- %".L%".KOSG9w_>H7xH#& *2 %G# AY\4I32"32673#7#"&54>3273#>54&@  DfB!IVQn4@%f9n{1[Q@^'%84S2T U|;UfdQN'0wQP31^  ?A- 1q@ $JKPX@'p[=K[BK[CL@%pc[=K[CLY@ &'$&"% +'7>323#"&54>32#"&5467.#"326yY  ;/RBRY 5#;T_$3273#>54&J^6ZDfB!IVQn4@%f9n{1[Q@^'%84SQQrU|;UfdQN'0wQP31^  ?A-,y@ JKPX@)pn:K[=K[CL@)rpn[=K[CLY@ &'$&" +''733#"&54>32#"&5467.#"326T9/RBRY 5#;T_$3273#>54&%$@DfB!IVQn4@%f9n{1[Q@^'%84S%%uU|;UfdQN'0wQP31^  ?A- 1O@L$Jpn[32#"&5467.#"3264## /RBRY 5#;T_$3273#>54&\^6DfB!IVQn4@%f9n{1[Q@^'%84SWQQreU|;UfdQN'0wQP31^  ?A-,C@@JHrpn[=K[CL&'$&" +77#3#"&54>32#"&5467.#"326T9U/RBRY 5#;T_$54&#7^6 5jm XOWZR'UfWQQrl0nIS1GMt>Ui-:JU@* JKPX@4  pY:K[BK [=K [CLKPX@6  p[BK[BK [=K [CLKPX@4  pY:K[BK [=K [CLK!PX@6  p[BK[BK [=K [CL@4  pY:K[BK [=K [CLYYYY@<;DB;J7#"&54632#"&5467#"&54>32#73326?32>54&#"a #95*'!'e2?A%AY48FOL  $"H;&12&A/!%".Kg<3&'=QQH;w_54&#I JDW 5jm XLD LYZR'UfM,0nIS1+,Mt>Ui-x/?^@[. J  p  aY:K [ =K [CL10970?1?//,*'#& +737#733#326?3#"&5467#"&54>3272>54&#"T K "P Nd  $ 5*'!'e2?A%AY48F0"H;&12&A/ %I.w%A#& <3&'=QQH;w_3232673#"&"7>54&&D]61CP 9E8-JGeW#:N+ E/(qd%K PX@=r   h  pc  a Y:K Y;L@>r   p  pc  a Y:K Y;LY@%%$#"! "# +332673#"&54673!73#7!#7#3#9)!&*A)PE66^=(2 XW 2( D Kd "!')E<0+֍1G003/;G@D5 Jpc:K [=K[CL100;1;"+)"% +332673#"&5464>3232673#"&"7>54&$%8%EB+,&D]61CP 9E8-JGeW#:N+ E/(q[ K PX@8 h  p c  aY:K Y;L@9  p  p c  aY:K Y;LY@#       +"&5463273!73#7!#7#3#%$6=(2 XW 2( D K%%>1G003 '3L@I-Jp[3232673#"&"7>54&2##&D]61CP 9E8-JGeW#:N+ E/(q&׵  JK PX@8h  p aY:KY;K [ ? LK)PX@9p  p aY:KY;K [ ? L@6p  p a _Y:KY;LYY@%# +467!73#7!#7#3#!733267#"&PHL XW 2( D K=(2BQ& *,7/S%1G00獾#I# 1 %31=v@ 71JK'PX@(p[=K[CK[?L@%p_[=K[CLY@322=3=(+&E" +#"&5467"#"&54>32326733267"7>54& "%3@; OW&D]61CP 9E8-1@$O" ]";N+ E/(qmHK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@ +77#73!73#7!#7#3#7^6=(2 XW 2( D KWQQrM1G003".B@?(JHrp[=K[CL$##.$."+% +77#4>3232673#"&"7>54&T9&D]61CP 9E8-JGeW#:N+ E/(@m4@+ JKPX@2r  pa [ BK;K[CLKPX@.r  pa [ BK[;LKPX@2r  pa [ BK;K[CLK!PX@.r  pa [ BK[;LK'PX@2r  pa [ BK;K[CL@6r  pa :K [BK;K[CLYYYYY@/.-,)'!44 +''73"326?#73##7#"&54>3273#>54&H^6ZDeB &<(QfNAP' b;qw1YPA^&%80VQQrR|A%A0Zf33U+1kXN20\  ?A -=x@(JKPX@2p:K=K[=K [CK[GLKPX@.p:K[=K [CK[GLKPX@2p:K=K[=K [CK[GLKPX@.p:K[=K [CK[GLK!PX@.rp[=K [CK[GL@2rp=K[=K [CK[GLYYYYY@/.75.=/='$#&$ +''737#"&54>3273#"&54632326'2>54&#"T9C/6]5?A$?Y3V^ 5H;Xh,-;@d?@ 6 (JKPX@6 c  aa [  BK ;K [ C LKPX@2 c  aa [  BK [  ; LKPX@6 c  aa [  BK ;K [ C LK!PX@2 c  aa [  BK [  ; LK'PX@6 c  aa [  BK ;K [ C L@: c  aa :K [ BK ;K [ C LYYYYY@:98742,*'&%$#"! ??"# +332673#"&546"326?#73##7#"&54>3273#>54&L)!&*A)PE66RDeB &<(QfNAP' b;qw1YPA^&%80Vd "!')E<0+R|A%A0Zf33U+1kXN20\  ?A :Jk@ # 5 JKPX@;  pc:K=K [=K  [CK [GLKPX@7  pc:K [=K  [CK [GLKPX@;  pc:K=K [=K  [CK [GLK!PX@7  pc:K [=K  [CK [GL@;  pc:K=K [=K  [CK [GLYYYY@<;DB;J3273#"&54632326'2>54&#"$%8%EB+,W/6]5?A$?Y3V^ 5H;Xh,-;@[ 9@ 0 "JKPX@6  p  ca  [  BK;K[CLKPX@2  p  ca  [  BK[;LKPX@6  p  ca  [  BK;K[CLK!PX@2  p  ca  [  BK[;LK'PX@6  p  ca  [  BK;K[CL@:  p  ca :K  [ BK;K[CLYYYYY@# 4321.,&$!  9 9   +"&54632"326?#73##7#"&54>3273#>54&%$ADeB &<(QfNAP' b;qw1YPA^&%80V%%tR|A%A0Zf33U+1kXN20\  ?A  2Be@   -JKPX@8p [3273#"&54632326'2>54&#"Q##&/6]5?A$?Y3V^ 5H;Xh,-;@-B@$ 2 JKPX@4  pa _ [BK;K[CLKPX@0  pa _ [BK[;LKPX@4  pa _ [BK;K[CLK!PX@0  pa _ [BK[;LK'PX@4  pa _ [BK;K[CL@8  pa _:K [BK;K[CLYYYYY@<:64('&%"  -- +"326?#73##7#"&54>3273#>54&7>7#"&54632DeB &<(QfNAP' b;qw1YPA^&%80V(2 !%9R|A%A0Zf33U+1kXN20\  ?Ae&,!$2) ;KN@$ 6JKPX@5pc=K [=K [CK[GLKPX@1pc [=K [CK[GLKPX@5pc=K [=K [CK[GLK!PX@1pc [=K [CK[GL@5pc=K [=K [CK[GLYYYY@=32#"&54>7#"&54>3273#"&54632326'2>54&#"(2 !%9E/6]5?A$?Y3V^ 5H;Xh,-;Cm"N@KJr  aY:K  Y ; L"!  +''733#73#!7#73#3#73!3#^6XW WB`BW WW WMMW QQrG0000111"S:@ JKPX@1rpY:K[=K;K[CLKPX@-rpY:K[=K[;L@1rpY:K[=K;K[CLYY@ #+%' +''737>54&#"##73>32326?3#"&546p^6S&  #J?0 &IZd/6>"37 -   $ 8*(#QQrka2>Xc%y/!A2-*3s<!% <3)GC#'V@S  aa Y:K  Y ; L'&%$#"!  +'3#737#73#!7#73#3#3#73!3#!7!XpS R!W W d W W!\ [pW WMKU  d1+z00zz00z+^111S";ε JKPX@6 paY:K[=K;K [ C LKPX@2 paY:K[=K [ ;L@6 paY:K[=K;K [ C LYY@7521.,%& +%7>54&#"##737#733#>32326?3#"&546s&  #K@0 %H_ ]Zu t;/7@"37 -   $ 8*(#a2>Xc% %I.w%"A3-*3s<!% <3)Gf+L@I cc Y:K  Y ; L+*)('&%$#"!   +"#7>32326?3#"&/.3#73#3# '6$   ' +%# XW XX 23,  ",+ G001>_9K-PX@2  pc [BKY=K [ C L@9p  pc [BKY=K [ C LY@42/.+)#"!   +"#7>32326?3#"&/.#73326?3#"&5467# (! # %$ [Y  $ 8*(# ~*()  +&-  +C $% <3&"BB-@*aY:KY;L +!!3#73#3#XW XX B2!G001>Db2@/paY=K[CL#& +3##73326?3#"&5467WY[Y  $ 8*(# b/+C $% <3&"Bd6@3rcY:K Y ; L"# +332673#"&5463#73#3#)!&*A)PE66XW XX d "!')E<0+G001>k-:@7pc:KY=K[CL#&"% +332673#"&546#73326?3#"&5467v$%8%EB+,/[Y  $ 8*(#  &1IA(* +C $% <3&"BbJK)PX@"Y:KY;K[?L@_Y:KY;LY@ %% +467#73#73#3#3267#"&41g XW XX `32& *,6+R$1G001!K# 1 ( 88JK)PX@/pn[G001> (@%pY=K[CL#& +#73326?3#"&5467[Y  $ 8*(# +C $% <3&"B' *A@> a cY:K [ C L)'$# +3#73#3##7!##".54632+3264XJW XJX bf  Xc%w2H-%#  A;Qs\0011~00z$,+0'e>C 1MB JK PX@?p  h[7#7"!#"[Y  $ 8*(# ΐOH0;#m 2%(%(+C $% <3&"B^[+-$ )5+@m#:@7JrcY:K[CL#$# +''73#7!##"&54632+326@^6sh  XssX9?'" &6JQQrU00Kkb6(*0IUM"@ JK PX@"h:KY=K\GLKPX@#p:KY=K\GL@#rpY=K\GLYY@""'$$ +''73#"&5463232>7#7MT9OH0;#m #ki^[+-$ )5+1X@U !Ja_ Y :K Y ;L+)%# +37#73#3#73#3#73#737>7#"&546321@dU NB [bOV XW (2 !%9x0011"11G00l&,!$2) 9Nc@`> Jpc _ Y:K[=K;K[CLHFB@987653.,)(%#$%! +3326?>32#"&5467326?3#"&?6&+##7>7#"&54632zl,6,4* $# % 1%.)31BH[(2 !%9p#3%0$ ,", = C9=+(3,6+>yk&,!$2)i >@;JrpY:KY;L  % +'7>3273!73#7!#  ?(5 XW  [2T 1G00)kK %4@1JrpY:K[CL#&% +'7>323326?3#"&5467#G  ⢔  $ 7*)$[&F ]; % <3)I "C@@Jp_Y:K Y;L  +%73!73#7!# 7>7#"&54632?(5 XW  [(2 !%911G00&,!$2).7@4Jp_Y:K[CL$'#& +3326?3#"&5467#7>7#"&54632x  $ 7*)$[p(2 !%9; % <3)Ik&,!$2) D@AJpY:K[BK Y;L  $& +7>7#"&5463273!73#7!# #9;?(5 XW  [!%".K/1G00),JKPX@'pY:K[BK[CLKPX@)p[BK[BK[CLKPX@'pY:K[BK[CLK!PX@)p[BK[BK[CL@'pY:K[BK[CLYYYY@ #&$& +7>7#"&54632'3326?3#"&5467#& #9ꢔ  $ 7*)$[!%".K; % <3)I C@@p cY:K Y;L  +%73!73#7!#%"&54632>(4 XW  [%%$11G00%%)]%9@6pcY:K[CL!%%#& +3326?3#"&5467#"&54636x  $ 7*)$[!"; % <3)I$&;@8JpY:KY;L +%!73?#7!#7!75 WHklEW  \> P ?1 13200<3=ԓ!0@-!JpY:K[CL#* +?#737326?3#"&546? OR[VW Z0  $ 7*)$#/$/,2,; % <3)Iv:i ;@8Jr Y:KY;L% +'7>323#73## 3#73#]  )V W@W XW2T z 00B11G*% ?KPX@ JKPX@ JKPX@ JK!PX@ J@ JYYYYKPX@4pBK[=KY=K ;K[CLKPX@*pBK[=K ;K[CLKPX@4pBK[=KY=K ;K[CLKPX@*pBK[=K ;K[CLK!PX@*rp[=K ;K[CL@4rp[=KY=K ;K[CLYYYYY@ ? ?+#+%% +'7>32#73>32326?3#"&546?>54&#"yY  R~[8.7@$1; *   $ 5*(# ( &F:, 3vg +"B4!**6#j5!% <4+Fc27P[$:(?@<  J _Y:KY;L"  +3#73## 3#73#7>7#"&54632V W@W XWL(2 !%9 00B11Gl&,!$2)*%3HC@ 8 JKPX@6p  _[=KY=K ;K[CLKPX@,p  _[=K ;K[CLKPX@6p  _[=KY=K ;K[CLK!PX@,p  _[=K ;K[CL@6p  _[=KY=K ;K[CLYYYY@B@<:33+#+% +3#73>32326?3#"&546?>54&#"7>7#"&54632*~[8.7@$1; *   $ 5*(# ( &F:, 3 (2 !%9+"B4!**6#j5!% <4+Fc27P[$&,!$2):m>@; JHr Y:KY;L +77#3#73## 3#73#u^6ӗV W@W XWWQQr< 00B11G*4:9@ JHKPX@4rp[=KY=K ;K[CLKPX@*rp[=K ;K[CLKPX@4rp[=KY=K ;K[CLK!PX@*rp[=K ;K[CL@4rp[=KY=K ;K[CLYYYY@::+#+% +77##73>32326?3#"&546?>54&#"T9~[8.7@$1; *   $ 5*(# ( &F:, 3ki+"B4!**6#j5!% <4+Fc27P[$*%FP@ JKPX@9p[BK[=KY=K  ;K[CLKPX@/p[BK[=K  ;K[CLKPX@9p[BK[=KY=K  ;K[CLK!PX@/p[BK[=K  ;K[CL@9p[BK[=KY=K  ;K[CLYYYY@FF+#+%$& +7>7#"&54632#73>32326?3#"&546?>54&#"d #9v~[8.7@$1; *   $ 5*(# ( &F:, 3!%".K+"B4!**6#j5!% <4+Fc27P[$(:*V@S J c  _Y:KY;L%$  ** +267 3#73#73#73##"&54632#*'a5EW XW V W^X9=("!&RTD11G000km6()1*5H@ "JK PX@-h[=KY=K;K\GLKPX@.p[=KY=K;K\GLKPX@$p[=K;K\GLKPX@.p[=KY=K;K\GLK!PX@$p[=K;K\GL@.p[=KY=K;K\GLYYYYY@ *'$(% +7##73>32#"&5463232>7>54&#"3J~[8.7@$1; kLH/<! j&F:,+"B4!**5$^[*,& )6j17P[GB#2@/a[BK[CL   +!!.54>32'32>54&#"U v{4]Mt2\LTCfE#JTBgF$B2sW}KwKTXfU};TcQy2b)2@/a[=K[CL#!  +3#"&54>32'3267>54&#" QS!?]?6D!9;;Gd!1:@7rc[BK[CL.,&$!!"# +332673#"&546.54>32'32>54&#"e)!&*A)PE66,v{4]Mt2\LTCfE#JTBgF$d "!')E<0+sW}KwKTXfU};TcQy2#9:@7c:K[=K[CL31(&##"% +332673#"&546"&54>32'3267>54&#"$%8%EB+,QS!?]?6D!9;;G '7<@9 Jrr[BK[CL42,*!''*% +'7>32'7>32.54>32'32>54&#"     v{4]Mt2\LTCfE#JTBgF$Uj  L'@sW}KwKTXfU};TcQy2 '=@  JK PX@#p32'7>32"&54>32'3267>54&#"DmN    QS!?]?6D!9;;@!xK PX@4  hfpaY:K Y;LKPX@5  hnpaY:K Y;LKPX@0ppa Y:K Y;LKPX@5  hnpaY:K Y;LK!PX@0ppa Y:K Y;L@5  hnpaY:K Y;LYYYYY@!!!$ +74>3!#7#3#!73!"&3#"@3dc3(D K>(3K}*ZRvI"oWwH0獾N@Kr>Yb2)5IF@C/Jp [=K[CL+*BA*5+5))-$&$" +%#"&'#"&54>32>323267"7>54&67>56&'&\E8M`6QS!?]<3N"`3BI3L0p-3/F1 9- cMF%</ !54" $JG5/-7cN6oY8.301=1%0  9E8-+!7K*71#s5989R(s.8R\i 3>Z@W( Jr   p  a Y:KY;K[CL ><64 3 3+!%(% +'7>32#"&574&+3#73#732326?%32>54&+  A 6+4$2bDV XW bdnX)   \)I6;32#73>32#"&5467&"#"#yY  Z-,`6"!;7- -Ivg +Qa& 1M_.\'2G_@\ 7 J p  a _ Y:KY;K[CLA?;920*(''+!%# +%#"&574&+3#73#732326?%32>54&+7>7#"&54632W 6+4$2bDV XW bdnX)   \)I6;32#"&5467&"#"#7>7#"&54632Z-,`6"!;7- -IS(2 !%9+Qa& 1M_.&,!$2)\m.9]@Z# JHr   p  a Y:KY;K[CL971/..+!%$ +77##"&574&+3#73#732326?%32>54&+^6 6+4$2bDV XW bdnX)   \)I6;32#"&5467&"#"#T9cZ-,`6"!;7- -Ikig+Qa& 1M_.$i ;N@K:"Jpa[ BK;K[CL ; ;)%)%% +'7>32#>54&#"#"&'#7332654.546327  ;+0HB:?UfUw_<]&)/W:COTeTlP>T2T u  1<>06>322654.54632#"&5467.#"#".54632iyY  *FCQC`D!<, ="(54&#"#"&'#7332654.546327^6z+0HB:?UfUw_<]&)/W:COTeTlP>TQQr  1<>06>@ <JKPX@*pn:K[=K[CL@*rpn[=K[CLY@75/-$">> +''732654.54632#"&5467.#"#".54632T9*FCQC`D!<, ="(54&#"#"&'732654&'7.'#7332654.546327$+0HB:?UfUr\$*):52 ,"-51K&)/W:COTeTlP>T  1<>06>54&#"#"&'#7332654.546327^6+0HB:?UfUw_<]&)/W:COTeTlP>TWQQr7  1<>06>R@O <JHrpn[=K[CL75/-$">> +77#2654.54632#"&5467.#"#".54632T99*FCQC`D!<, ="(7#"&54632{ bG(6@6( a (2 !%91GȘ1&,!$2)]O4z$ JK PX@,fp  _Y=K[CL@+rp  _Y=K[CLY@.,'#% +7326?3#"&546?#73733#7>7#"&54632   $ 5*)% GSR$G$jh(2 !%98 % <3* C+xx+8&,!$2)emA@>HrpY:KY ;L +77#73##7!#7#3P^6 bG(6@6( a WQQr1GȘ1?2JK PX@0hp[BK Y=K[CL@1pp[BK Y=K[CLY@21#*$& +7>7#"&54632326?3#"&546?#73733#. #9   $ 5*)% GSR$G$jh!%".K8 % <3* C+xx+eD@Ap aY:K  Y  ; L +373#73##7!#7#3#3| bL DG(6@6( D~ ~La 1,Ș,1"]O'}K PX@/fp  a Y=K[CL@.rp  a Y=K[CLY@'&%$#"#% +7326?3#"&546?#737#73733#3#  # 5*(# M L%SR$D#lk%n l8 % <3* CK%}+xx+}%f3f9R@Occ Y :K [ C L98530/.-,+(&#"!   +"#7>32326?3#"&/.3#3267#73##"&7# '6$   ' +%#  VY!5cek]V O](Y(ZN23,  ",+ 0zoY00QC&RD JK-PX@6  pc[BK Y =K [  C L@=p  pc[BK Y =K [  C LY@'  R RQPJH?=:964.-(&  +"#7>32326?3#"&/.32>?3326?3#"&5467#"&546?#7%# (! # %$ 4[ B<0 2Ha  $ 3)&08?!13 PR ~*()  +&-  1:T^$& !% ;4$:<$I:%+(5+f3B2@/a Y:K[CL## +!!3#3267#73##"&7# VY!5cek]V O](Y(ZNB2h0zoY00QC&b6D@A(JpaY =K[CL66)#&' +3#32>?3326?3#"&5467#"&546?#7[ B<0 2Ha  $ 3)&08?!13 PR b/\1:T^$& !% ;4$:<$I:%+(5+f3d+<@9rc Y:K [ C L+*'%"!#"# +332673#"&5463#3267#73##"&7#)!&*A)PE66 VY!5cek]V O](Y(ZNd "!')E<0+0zoY00QC&FN@K8 J  pc:K Y =K[ CLFFED><#&+"% +332673#"&54632>?3326?3#"&5467#"&546?#7$%8%EB+,[ B<0 2Ha  $ 3)&08?!13 PR  &1IA(* 1:T^$& !% ;4$:<$I:%+(5+f3 1>@;cc Y:K [ C L10-+('#$$$" +4632#"&732654&#"3#3267#73##"&7#C,.@B,,C)''& ' VY!5cek]V O](Y(ZN?1;;13;;3"''"!&%0zoY00QC& JP@M< J  pcc Y =K[ CLJJIHB@#&($$$" +4632#"&732654&#"32>?3326?3#"&5467#"&546?#7=(*;=((=)   *[ B<0 2Ha  $ 3)&08?!13 PR s-55-.66.!!! 1:T^$& !% ;4$:<$I:%+(5+f3 1<@9 Jrr Y:K[CL10##*% +'7>32'7>323#3267#73##"&7#       VY!5cek]V O](Y(ZNUj  L'@m0zoY00QC& J*@  <JK PX@.pp32'7>3232>?3326?3#"&5467#"&546?#7jmN    [ B<0 2Ha  $ 3)&08?!13 PR cLa  "6T  u1:T^$& !% ;4$:<$I:%+(5+f3,f, JK)PX@#Y:K[CK [?L@ _Y:K[CLY@*(#" +#"&5467.7#73#3267#73#3267k *,6@=W(ZN VY!5cek]V O]$zf9D&  %".K%Q00zoY00 #D" C&Ey@ EJK)PX@)pY=K[CK[?L@&p_Y=K[CLY@ )&&/" +#"&5467.5467#"&546?#7332>?3326?33267 *,6E< 07? 13 PR [ B<0 2Ha  $ $:L&  %"-N%7>$H:$+(5+1:T^$& !% +3 %F# pimA@> Jr Y :K;L +''733##73####73##^6 W)W I69$J X.\QQr000y006GKPX@ :JKPX@:JKPX@ :JK!PX@:J@ :JYYYYKPX@':KY=K [ =K[CLKPX@*:KY =KY =K[CLKPX@':KY=K [ =K[CLKPX@*:KY =KY =K[CLK!PX@*rY =KY =K[CL@' rY=K [ =K[CLYYYYY@DB)%&&% +''73#"&7#"&546?#7332>?332>54&'#"&54632\T9#Ca=N,(.46: ?\M 90' ADB $&F5 #ki3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3emC@@ JrY :KY;L +''73##73#3!737#7O^6 XNS K7e f7^J QQr0C0011y0:@,%JKPX@.p:KY =K[CK[GL@.rpY =K[CK[GLY@::''$#' +''7332>?3#"&54632326?#"&546?#7T9U ! A7* 1IhnBS 6GP5*2>$/A JQ #ki02IV$n;3$h\ =/002+eX ,Z@W)J c Y :K  Y ; L ,,+*('&%$#!      +"&546323"&54632##73#3!737#7b#!#" XNS K7e f7^J %%&$N0C0011y0i B@?JrpnY:KY;L  % +'7>327!!73!7!  _3 K?'3 =2T ɽ01G K@1JKPX@1  p  n[=K[BK[ CL@/  p  nc[=K[ CLY@ IHFD86-+)(&$ K K% +'7>32".'#"&5467"&/.#"#>32.54632632673qyY  b886##  :1#% ,8531 $  E2!% ,vg y   /  (*HM  / (+IL[ L@I pncY:KY;L      +"&546327!!73!7!%$3 K?'3 =%%01G Kg@d1 Jp  n  n [32.54632632673## 886##  :1#% ,8531 $  E2!% ,.()   /  (*HM  / (+ILmC@@HrpnY:KY;L +77#7!!73!7!/^63 K?'3 =WQQr01GFa@^, JHrp  n  n[=K[ CLDCA?31(&$#!FF +77#".'#"&5467"&/.#"#>32.54632632673T9886##  :1#% ,8531 $  E2!% ,ki   /  (*HM  / (+IL9W -D@AJpb:K[BK[CL!!!-!-'#%$ +#"&5467!>54&#"#73>323267>7W.WQce CU@7. 16% !h9nl= B;?_ QReZ-U&7Tb(A/N'0BHFJ9D" m#.a@^Hr  pn Y:K Y;L$$$.$-'%##"!&" +77#732#!737!!73!7!%32>54&#^6 5jm X23 K?'3 =WZR'UfWQQrl0nIS1G01GMt>Uik `H@F &JHKPX@N  p p  n nY:K [  =KY;K[CLKPX@Q  p p  n nY:K [  =KY;K[CL@N  p p  n nY:K [  =KY;K[CLYY@+"!^][YMKB@>=;943-+!`"` &" +77#%732#!73332>54&#".'#"&5467"&/.#"#>32.54632632673PT9 5jm XOWZR'Uf0886##  :1#% ,8531 $  E2!% ,kie0nIS1GMt>Ui   /  (*HM  / (+IL-.n~@T  4JHK-PX@`p p  n nY:K[ =K [ =K[ CK[ CL@fp p  n n nY:K[ =K [ =K[ CK[ CLY@)po0/xvo~p~lkig[YPNLKIGBA;9/n0n&&'# +77##"&5467#"&54>32#73326?3".'#"&5467"&/.#"#>32.54632632673%2>54&#"T95*'!'e2?A%AY48FOL  $886##  :1#% ,8531 $  E2!% ,H"H;&12&A/kiT<3&'=QQH;w_7#7?(5 XW  [H#"OH0;#m 11G00%([^[+-$ )5+)9%A6 JK PX@D  p hY:K [7#7x  $ 7*)$[#"OH0;#m ; % <3)IG%([^[+-$ )5+0V@S   J  c Y :KY;K [ C L/-*)%# +3#73## 3#73##7!##"&54632+326V W@W XW>sh  XssX9?'" &6J 00B11GJ00Kkb6(*0I;@  0 JK PX@A  hY:K [ 7#7V W@W XWP#"OH0;#m  00B11GF%([^[+-$ )5+*s ?[4@ P JK PX@Op  h[32326?3#"&546?>54&#"#"&5463232>7#74#"~[8.7@$1; *   $ 5*(# ( &F:, 3OH0;#m 2%(+"B4!**6#j5!% <4+Fc27P[$^[+-$ )5+f3m 4@1HrY:K[CL## +77#3#3267#73##"&7#^6 VY!5cek]V O](Y(ZNWQQr<0zoY00QC&9G@D+JHrpY =K[CL99)#&' +77#32>?3326?3#"&5467#"&546?#7T9F[ B<0 2Ha  $ 3)&08?!13 PR ki<1:T^$& !% ;4$:<$I:%+(5+B""JK PX@Bh  pa  a aY:K Y ;L@Cp  pa  a aY:K Y ;LY@ !  +!!#73#7!#7#3#!73!737#73[ Su 3(A K>(3 W3ެRB2!11G00獾11)b?ITIKPX@ ) JKPX@ ) J@ ) JYYKPX@Ip  pa   c [=K[CK [CLKPX@>p pa   c [=K [CL@Ip  pa   c [=K[CK [CLYY@-KJA@PNJTKTEC@IAI=<:831-+'% ?? +3#"&'#"&546;76&#"#"&54>32>3232673"7>54&26?#"pFT "gA27iE -7%73B"6F "Z2AJ[or/3/F0\@^cND$-3_9Hdb/MCJF8(ZH1FB  0!.&(,=1CP"9E8-JGiSD1#xTH9< m#.a@^Hr  pn Y:K Y;L$$$.$-'%##"!&" +77#732#!737!!73!7!%32>54&#^6 5jm X/3 K?'3 =WZR'UfWQQrl0nIS1G01GMt>UiJY"@ ? JKPX@F  p  n  nY:K [  =KY;K [CLKPX@I  p  n nY:K [  =K Y;K [CL@F  p  n  nY:K [  =KY;K [CLYY@*WVTRFD;97642-,&$YY&! +732#!73332>54&#".'#"&5467"&/.#"#>32.54632632673 5jm XOWZR'Uf-886##  :1#% ,8531 $  E2!% ,x0nIS1GMt>Ui   /  (*HM  / (+IL-'gw@M  -JK-PX@X p  n nY:K[ =K [ =K[CK[CL@^ p  n n nY:K[ =K [ =K[CK[CLY@(ih)(qohwiwedb`TRIGEDB@;:42(g)g&&'" +%#"&5467#"&54>32#73326?3".'#"&5467"&/.#"#>32.54632632673%2>54&#"5*'!'e2?A%AY48FOL  $-886##  :1#% ,8531 $  E2!% ,7"H;&12&A/g<3&'=QQH;w_32#73#7!#7#3#!73!737#73s  K Su 3(A K>(3 W3ެR2T 11G00獾11) GQ\KPX@1  JKPX@1  J@1  JYYKPX@Fp   p  cBK [=K [CK [CLKPX@;p   p  cBK [=K  [CLKPX@Fp   p  cBK [=K [CK [CL@Frp   p  c [=K [CK [CLYYY@,SRIH XVR\S\MKHQIQEDB@;953/-'% G G% +'7>32"&'#"&546;76&#"#"&54>32>3232673"7>54&26?#"%yY  0FT "gA27iE -7%73B"6F "Z2AJ[or/3/F0\@^cND$-3_9Hdvg yMCJF8(ZH1FB  0!.&(,=1CP"9E8-JGiSD1#xTH9<Fi '3;@8,+ Jr[BK[CL 0.$"  % +'7>32.54>32'.#"%4&'32>#  u|5]Ms2\z;)BgE% ?+CgE#2T sW}KwKT3Qy5/U}2 *9d@/. JKPX@BK[=K[CL@r[=K[CLY@ 31$"  % +'7>322#"&54>.#"%4&'3267>yY  qUQ!?_?$/DW@T.4 Jpn  _[ BK;K[CL><86//)%)% +#>54&#"#"&'#7332654.5463277>7#"&54632$+0HB:?UfUw_<]&)/W:COTeTlP>T(2 !%9  1<>06>0.(& 77 +72654.54632#"&5467.#"#".546327>7#"&54632*FCQC`D!<, ="(7#"&54632{ bG(6@6( a (2 !%91GȘ1&,!$2)]O4z$ JK PX@,fp  _Y=K[CL@+rp  _Y=K[CLY@.,'#% +7326?3#"&546?#73733#7>7#"&54632   $ 5*)% GSR$G$jh(2 !%98 % <3* C+xx+8&,!$2)eBA@>Ja Y :KY;L +!!##73#3!737#7T XNS K7e f7^J B2h0C0011y0b7P@M)"JpaY =K[CK[GL77''$#' +3#32>?3#"&54632326?#"&546?#7U ! A7* 1IhnBS 6GP5*2>$/A JQ b/\02IV$n;3$h\ =/002+U]JK PX@hY=K\GL@pY=K\GLY@ '$# +#"&5463232>7#7OH0;#m ^[+-$ )5+('/@,$ Jp[=K[CL$"+$ +#"&546?6454&#"#>3232>7&D]60DU 9E9,JGe(#:N+ FdD@Gi +D''73T9#kidD@Hi +D77#T9ki(dD@rW[O"% +D332673#"&546$%8%EB+, &1IA(* . 'dD@W[O   +D"&54632##.()` *dD@cW[O$$$" +D4632#"&732654&#"=(*;=((=)   s-55-.66.!!! ,dD@! JrW[O%% +D;3267#"&546h3:M& *,7K%G# 1 %"/Q.fdDK-PX@cW[O@"pcW[OY@  +D"#7>32326?3#"&/.# (! # %$ ~*()  +&-    dD@ Gri*% +D'7>32'7>32mN    cLa  "6T  t dD@ Gi% +D'7>32yY  vg "0+!7 !mX<<l0 0+#7!!73!7704(uM6(39z2#45-10+##7332>?3326?3#"&5467#"&'-JR \ A<0 2Ha  $ 3*&08? ) w+1:T^$& !% ;4$7>$H:$ 60+3##7!#3267#"&7#UIbCc (  Ac,,9*0KJ!qq  JK PX@4rh  p  aY(K Y)L@5rp  p  aY(K Y)LY@  % +.5463273!73#7!#7#3#K  =(2 XW 2( D K$ XF1G00qX +K PX@;   h  pc  a Y(K Y)L@<   p  pc  a Y(K Y)LY@+ ++*)('&%$#"!     +"&546323"&5463273!73#7!#7#3#:#!#"|=(2 XW 2( D K%%&$;1G00eD+N@KJG pcY(KY)L++*)('&%$# # +7!#7#>32'>54.#"3!73#e6@5( EP1%B1.Ka3,N:!-,QI_ bFƖ %A3MkT# R_p>)2  11G_i 8@5JrpY(KY)L%+'7>32!73#7!#7#3   XW 5( ݜ^2T 1G0ȘF,@ # JK'PX@4  ppa [/K)K[0L@8  ppa(K [/K)K[0LY@'&%$! ,, +"!!32673#7#"&54>3273#>54&1O>-  IVQn4@%f9n{1[Q@^'%84S-I^104UfdQN'0wQP31^  ?A$/H@E.Jpn[/K)K[0L//)%)% +#>54&#"#"&'#7332654.546327$+0HB:?UfUw_<]&)/W:COTeTlP>T  1<>06>7>?#7!#>32#!7;2>5.#"A'-- Q4! ! 2,)&e  X?=Qi,OpD WNk3N3E99x35|q'32#'32>54&#" WNOW XW W@VAW Y@=Qj+NpE[k3N3E:91$11G0000CO6\B&1%:H#5-e+M@JJ pc Y(K Y )L++*)('&%&#+7!#7#>323#737>54&#"3!73#e6@5( EQ1$B1 &W V& A8-QI` bFƖ ,!=11 2+ 11Gi S@-8 JK-PX@Dr  p  aY(K[/K  Y )K  [ 0 L@Ar  p  aY(K[/K  Y )K [ 0 LY@ S SRQPNIGDC@>$)!%+'7>3273#7!#3267>7>32#"&5467326?3#"&?6&+3Y  v XW  ]Dc(4")"#  ($   - 3B6  ,7cLV 2T 1G00>>: )  4<;:987$'$&$%+3267"&54632#"&54632 #"&54632>7##73##73 *!(B 0B$BM.3:$"*# .H)QO MH O e-11*3"B2 * XC00z00U46@3s Y (KY)L +%3!#7!73#73#!#73#3m=+ XW VOW X111G00G00c8@5Jb(K Y)L +7#7333#73'#73 JF,J W p111w119w#<@9JpcY(KY)L6"2$ +%#!73#7!#7#>3232>54&#" $EhC XW 5' CB[]ux.G/4:C&3\F)1G0Ɩ?!7J))0`*E@B J aY(KY)L  * )#! +3!73#7!232>54&+ 32>54&# XW aQY]==,MnUt0D*5=pQKp3O4>B1G0M8Bn B30T<#x1<*-4F',-_ ,@)pY(KY)L+3!73#7!#7#3 XW 5( ݜ^1G0ȘU#5@2sY(K Y)L## +'3267>?#7!#3#7!#%#;3*J"'! c  Wn;/F0 "'/1S<)aaY"R00ܫG=;20,*#%!+!#73#"#"&?3326?>7.'&4>'.'#"&54632;7#73#3267>7>32#"&5467326?3#"&?6&+3. XKR;F @;C - #"C2 ,(") *'XDX XD](8 '%%  (%   - .A6" +7gLX1*?^JGO6..'(./c6B 2/*#-13400@C> )   8?>EHW+%('.'7U?BXG7?;W@09JKPX@4pc [ /KY(K)K[0LKPX@6pc[ (K[ (K)K[0LKPX@4pc [ /KY(K)K[0LK!PX@6pc[ (K[ (K)K[0L@4pc [ /KY(K)K[0LYYYY@42&%&%$ +%#"&'#7332>54&#"732>54&#"#73>32+H`39V%03O4%B1@?&)0E-:8B]30% [1Re\X8<8Y< -+N  =41F)397-= .1JJH('M@Ii ?G8@5JY(K Y )L + 3#73#73#7#73#3#73u.W XW W| W XX W^211G002,0011G;W@T.Jc d  Y  (KY)L;:9876543210-,+*$&$%+3267"&54632#"&546323#73#73#7#73#3#73 *!(B 0B$BM.W XW W| W XX We-11*^211G002,0011G@ !, JK-PX@? p  aY(K[/K  Y  )K  [ 0 L@< p  aY(K[/K  Y  )K [ 0 LY@GGFEDB=;8742$)!+#73#7!#3267>7>32#"&5467326?3#"&?6&+3 XW  ]Dc(4")"#  ($   - 3B6  ,7cLV 1G00>>: )  47>7?e  XX W'-- Q4! ! 2,)&x0011G35|q'@;  aY(K  Y  ) L+'3#73#!7#73#3#73!3#XW WB`BW WW WMMW 1G0000111GIK PX@[/K[0L@[/K[+LY@ +.54>32'32>54&#"8v{4]Mt2\LTCfE#JTBgF$sW}KwKTXfU};TcQy6,@)Y(K Y)L +!3#73#7!#3#73X XW  WW Wx11G0011b:@7a Y(KY)L$! +%!73#732+32>54&# XW jiY:US:V6:E111G0QItG!9M,1;@&@ JK'PX@+pn[/K)K[0L@/pn(K[/K)K[0LY@!  && +"32673#7#"&54>3273#>54&DfB!IVQn4@%f9n{1[Q@^'%84SU|;UfdQN'0wQP31^  ?A`4@1pY(KY)L +373##7!#7#3v bG(6@6( a 1GȘ11"xJKPX@(pf Y(K\0L@)pn Y(K\0LY@""$% + #"&54632>7##73##73.3:$"*# .H)QO MH O x3"B2 * XC00z00M6#-7' JK-PX@+  c  c Y(KY+L@) a  c  cY+LY@3210)(##+#3#737.5467>37#73"%4&'267>832'32>54&#" WG'5 X?=Qk+Ppk4N4E;91G0CN6_E(1'32'32>54&#" XX XX XW Y?=Qj+Ppj4N4E;91G0011G00CN6_E(1'32'32>54&#" XW Y?=Qj+Ppj4N4E;91G00CN6_E(1'7!7!>54&#"#73>32D\%%54&24Q<(  ?U?h45% _7rb+Sz 81_ %6#3Sh41(Z\M]J(+lQR!1wK PX@3  a [/KY(KY)K [0LKPX@3  a [/KY(KY)K [+LKPX@.  a [/K Y(K [)LKPX@3  a [/KY(KY)K [+LK!PX@9  a [/K Y(K Y)K [+L@3  a [/KY(KY)K [+LYYYYY@.,&$! &$ +73#73#73#3>32#.5467#32>54&#"X XW XE?Vl>t2\Qv{LTCfE#JTBgF$111G00AsU1wKTs+^XfU};TcQy)4 JK PX@2h   a Y(KY)K \0L@3p   a Y(KY)K \0LY@!+*.,*4+4&%" )) +726?>7.54>3!#3#737#"#"&?33#"<8:+5<+Jd9' WW WCe,@97.?, YpLy1F.>'"y)1 F58T7011--z11B=47&%41@#1;-%5 JKPX@%p*K[1K[+LKPX@!p[1K[+LKPX@%p*K[1K[+LK!PX@!p[1K[+L@%p*K[1K[+LYYYY@'&/-&5'5&&'" +%#"&5467#"&54>3273326?32>54&#"6$"% 0\1?9%?X39@;.\ $"H;&.,'A-g<4"$/MOSG9w_>I8zH#&dAY\4I;73#">32#"&"3267>54&@%Q]U"!'nHeB' )4?#QU!>[:Qf&953+@.H[2t.Nj< ;,ZD=uZ8lL( 'j63K7))a*8A)%43@0a[1K[0L20*( %%$+74>3223#"&"7>54&32>54&))Gb8?C:5 (-tWNN4+" 7T` (3/%8@X;u\:6+,=*(MbTk/@":0 /7#2+0 '1@.%$J[1K[+L"  ''+"&546?>54&#"'>32326732>54.#"'>32'2>54.#"TQ">Y6=F -!"@!T.3C&!EkD+B-%.B)/ dK8oW7N9%K <. '&$Ye&';Wc(893'5@2! Jp[1K[+L''"+$+74>3232673#"&"7>54&3&D]61CP 9E8-JGeW#:N+ E/(q[  JK PX@K  p h  n  cb*K [1K)K \+LKPX@L  p  p  n  cb*K [1K)K \+LKPX@H  p  p  n  cb [1K)K \+LKPX@L  p  p  n  cb*K [1K)K \+LK!PX@H  p  p  n  cb [1K)K \+L@L  p  p  n  cb*K [1K)K \+LYYYYY@ ZXTSRQPOJHFECA;97620$"&'"+7463232>54&#"#>323733>32#"&5463.#"32673#"&5467##7##"& (;'"2'P067a6B6a '2>#13$8'#"/'D7<5c9C:_ %3C(14Q'Hdm%#123NBA90.O:!0(%>^p1$332HHN72.T@&27W@T2Jpcc [ 1K[ +L-+)(&$  77 +".54632+32654&#"732654&#"#>326*9!5B%7  " ?8-+)83]9IL;;$+j *$D/(*)<(&&%@8<0,D 1%B\C&2g$JK PX@!pY*K[0L@!pY*K[+LY@22)#&& +32>?3326?3#"&5467#"&546?#7[ B<0 2Ha  $ 3)&08?!13 PR 1:T^$& !% ;4$:<$I:%+(5+C&QյC JK PX@5  pc[(K Y *K [  0 LK'PX@5  pc[(K Y *K [  + L@3  pcc Y *K [  + LYY@QQPOIG><98&($$$""+'3267#"&54632#"&5463232>?3326?3#"&5467#"&546?#79 16XH0M =[ B<0 2Ha  $ 3)&08?!13 PR y7:*.%1:T^$& !% ;4$:<$I:%+(5+09]@ #*JKPX@5  p cY*K[1K)K[ +LKPX@7  p c[*K[*K)K[ +LKPX@5  p cY*K[1K)K[ +LK!PX@7  p c[*K[*K)K[ +L@5  p cY*K[1K)K[ +LYYYY@6520 99 +"&?4&+##73326?>32#"&5467326?.!30DG|[ :*5*2'  &'$ 5 2..+;+";$/$ 2"/6%?59.)2>@;JpY*K[0K[0L#&$"+7#"&54632>7>7#7!326?3#"&546?#.  'I"YX]  $ 8)+!J,I+)  .+;%!<2*I7\@Y2/ JpY*K[ 0K)K[ 0L10)'$# 77 +"&54632>7>7#733326?3#"&546?#+  %L"X^b  % 7*+M)N". )  -+g;%!<2(Ka++ !@@=paY *K)K[+L!!#& +373326?3#"&546?###732'3267>54&#"QS!?]?6D!9;;*%3JKPX@/p[1KY*K)K[+LKPX@%p[*K)K[+LKPX@/p[1KY*K)K[+LK!PX@%p[*K)K[+L@/p[1KY*K)K[+LYYYY@33+#+% +3#73>32326?3#"&546?>54&#"*~[8.7@$1; *   $ 5*(# ( &F:, 3+"B4!**6#j5!% <4+Fc27P[$(E JKPX@-[1KY*K[+K Y,LKPX@#[*K[+K Y,LKPX@-[1KY*K[+K Y,LK!PX@#[*K[+K Y,LK-PX@-[1KY*K[+K Y,L@+[1KY*K[+K Y,LYYYYY@%#&# +#73#73>32#"&'4&#"32> H[(4]3??&@Y32A Mt-#H;%12&A0,,z+RHPK:w_<7+.;=V^ 4I;Wg-%6@3Jpn[1K[+L&'$&"+%3#"&54>32#"&5467.#"326X/RBRY 5#;T_$32>32326?3#"&546?>54&#"#>54&#"##77/6=!1- +2;"/6 .   $ 5*(# '  %B7) .JY $C9+ /J~[ױ#C3.$ / <.-'2w7 !% <3'"Be4?3#"&54632326?#"&546?#7U ! A7* 1IhnBS 6GP5*2>$/A JQ 02IV$n;3$h\ =/002+0'7GX@U' JY(K  [1K  [+KY,L98)(A?8G9G1/(7)7&#&#+#73>32#"&'3#73#"&54>327"32>54&2>54&#"c VI5><9T647SN NRF*BC"+$%"+$# +>32#"&546732673#"&/#"&54632>7'.#"#>32/Q5"C1( %,)%( 9U6L2 $0.($RS^'ZY%?3326?3+73267> '08> 13 PR\ A<0 3G`  $ 80$  $7>$H:$+(5+1:T^$& !%=>I#"6!()0/l JK PX@&pcY*K[0L@&pcY*K[+LY@ &&("+%#"&546?#"&546?#73326?3326?38*(" >"/E R" !#+A :Hc  $f<2)J#185+b7!+>%=5Ll!JK PX@#pY *K [0L@#pY *K [+LY@LKFD&)*#% +%326?3#"&546?#"&5467#"&546?#7332>?332>?3  $ 3*$ .4;2)-4>"/0 VR a $D:, 0JZ $C8+ 1H& !% ;4$0"@12* (=.-'4 +69Ta(4:Ta'=H5[~  JK PX@*  p _Y*K [0L@*  p _Y*K [+LY@WUTRLKHF&&)*" +%#"&546?#"&5467#"&546?#7332>?332>?3326?3+73267>  $  .5;2)-5="/0 VR a $D:, 0JZ $C8+ 1Hc  $ 70$  $)#@12* ) =/-'4 +69Ta(4:Ta'& !%A7##7!>32#"&732>54&#"r ]5+ #2(E4 3B%=O*4@/&&2''!2@X.3g-Mx, L(>4'K;$'L *!4@!"A>-?(JK PX@)pcY *K [0LK-PX@)pcY *K [+L@3pcY *K[+K [+LYY@<:20,*'&%$#& +326?3#"&5467#"&'&6?#73>324&#"32>`  $ 7*(# ]";O.3= HQ I<%3CI'"4  &2'8 % <3)E#L=(#b++;,!"?&!4@>'/@,JcY*K[+L($#$+%#"&'&6?#73>324&#"32>";O.3= HQ I<%3CI'"4  &2'#L=(#b++;,!"?&!4@-J@Gpac[1K[ 0L'%#"  -- +"&54632+3267>7#73>54&#"#>32@R 2"(=  .3.@2d=VL<[ :4&-%9' 6A33LEdK7pY9%1KPX@-a[1KY*K)K[ 0LKPX@%a[*K)K[ 0LKPX@-a[1KY*K)K[ 0LK!PX@%a[*K)K[ 0L@-a[1KY*K)K[ 0LYYYY@+)   +"&5467###733>32'3267>54&#"QT\EG~[ 8\ *;M.TR!@^+60 (6"5 dN+)L:"dK4o[;6D<>?6D!9;;5>JK PX@(h c Y*K\0LK-PX@)p c Y*K\0L@3p c Y*K[0K\0LYY@76:86>7>&#&+#" +7#"&?3326?>7.546;326?3#"&546?#"737#"*-/ $ /"(8uZ]  $ >)) A%)iE?b3232673#"&"7>54&  P&D]61CP 9E8-JGeW#:N+ E/(3 3?9$JKPX@,p  [(K [1K[+L@*p  c [1K[+LY@!54 4?5?20.-+)    +"&546323"&546324>3232673#"&"7>54& "!!&D]61CP 9E8-JGeW#:N+ E/(p)=@:J)GaY(K[1K)L%' +>54&#"##737#733#>32;^@"#J?0 &J\ Z[{ y>06< 4/-PoBo"u2"->Xc%&C/r&"C5 <:Cs  3d@10JKPX@/K[1K[+L@r[1K[+LY@ .,! 3 3%+'7>32"&546?>54&#"'>323267SyY  Jppa[1K[+L%'$&"+%3#"&54>32#"&5467.#"3#326X/RBRY 5#1? ' 7#7#"OH0;#m 2%([^[+-$ )5+.@C@@JcY*K[0K[0L&(&#$% +##"&54632>7>7#7!>32#"&'&6732>54&#".H"/  &I"XWH<%3>!9P/2= +&2&#!3 +)  ,+82%M?)!Y8&!4@!"?+-B@? J  caY*K)K[+L)'$#$ +%#"&'&67###73373>3232>54&#"!9P/2= AI}[ 2&""4%M?)!W6+8!4@!1O";  JK PX@6 paY(K[1K)K [ 0 LKPX@6 paY(K[1K)K [ + LKPX@2 paY(K[1K [ )L@6 paY(K[1K)K [ + LYYY@7521.,%& +%7>54&#"##737#733#>32326?3#"&546r&  #J?0 &I] ZZ| y</6>"37 -   $ 8*(#a2>Xc%&C/r&!A2-*3s<!% <3)G0 E!KPX@/6JKPX@/6JKPX@/6JK!PX@/6J@/6JYYYYKPX@:   p c/KY*K[1K)K [ +LKPX@<   p c/K[*K[*K)K [ +LKPX@:   p c/KY*K[1K)K [ +LKPX@<   p c/K[*K[*K)K [ +LK!PX@<r   p c[*K[*K)K [ +L@:r   p cY*K[1K)K [ +LYYYYY@ BA><*($" E E% +'7>32"&?4&+##73326?>32#"&5467326?yY  :.!30DG|[ :*5*2'  &'$ 5vg y2..+;+";$/$ 2"/6%?59.)C& >@ 0JK PX@&p/KY *K[0LKPX@&p/KY *K[+L@&rpY *K[+LYY@ > >)#&+% +.5463232>?3326?3#"&5467#"&546?#7  Ps[ B<0 2Ha  $ 3)&08?!13 PR n   71:T^$& !% ;4$:<$I:%+(5+R@ D = JK PX@= pc[(K Y *K [ 0K [3LK'PX@= pc[(K Y *K [ +K [3L@; pcc Y *K [ +K [3LYY@RRQPJHA?86#($$$""+'3267#"&54632#"&5463232>?3#"&54632326?#"&546?#71 16XH0M ?U ! A7* 1IhnBS 6GP5*2>$/A JQ y7:*.%02IV$n;3$h\ =/002+CI%2N@$3 B4 A JK PX@0p  c _Y *K[0L@0p  c _Y *K[+LY@MKFD?=8622)#&& +32>?3326?3#"&5467#"&546?#7.#"#"&'7326?>32\ A<0 3G`  $ 3*'08?!13 PR  %"   # 1:T^$& !% ;4$;=%I;%+(5+ % #5 - JK PX@8  hn   a  cY(K Y)L@9  pn   a  cY(K Y)LY@,)#! &2+>32#!73##737#73#!#732>54&#"-=Pk%JnH XF(5X Y/'k3K1E;9 8O0S>#1ܗA//A$1A#5%*/A@ %JKPX@.c[1KY*K)K[0LKPX@$c[*K)K[0LKPX@.c[1KY*K)K[0LK!PX@$c[*K)K[0L@.c[1KY*K)K[0LYYYY@ &'%+&# +>32#"&'&6?>54&#"##73>3232>54&#"9%3> :P01?  &F:, 3J~[8.7@$1; @&2&#!3 83%M?)!Y6B27P[$+"B4!**6&!4@!!@E'cK PX@a[/K[0L@a[/K[+LY@%$  +.54>32"!>54&32>7!6v{5]Ms2\"1Q@/KKT2T@/ hsW}KwKT-Ja2*TciXf2Of4/2)4@1a[1K[+L'&! +"&54>323>54&#"3267>7#QS!?] 6D!6CK'#a1@.JY(K[/K)L$"+>32#"&5467##73#.Y<"'$ #?-57J X,Wa!+  PQ(y00 @  JKPX@Y*K[1K)LKPX@[*K[*K)LKPX@Y*K[1K)LK!PX@[*K[*K)L@Y*K[1K)LYYYY@ $$+##73#7>32#"&5467H7 ; Cp-O6:++Qf! St? /@,rY(KY)L +7!73#7!73! XW mG'/111G0 +t@ )(JKPX@#p*K[1K[+L@#rp[1K[+LY@&$ +++"&546?>54&#"#73>32326732326?3#"&546?>54&#""&54632*~[8.7@$1; *   $ 5*(# ( &F:, 3c$$+"B4!**6#j5!% <4+Fc27P[$'(N$/;X@U.Jpn  _[ BK;K[CL10750;1;//)%)% +#>54&#"#"&'#7332654.546327"&54632$+0HB:?UfUw_<]&)/W:COTeTlP>T$$  1<>06>?332>54&'#"&54632  P#Ca=N,(.46: ?\M 90' ADB $&F5 n   3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3pii $>@;"Jr Y :K;L$#! % +'7>323##73####73##   W)W I69$J X.\2T z000y006 LKPX@ ?JKPX@?JKPX@ ?JK!PX@?J@ ?JYYYYKPX@'BKY=K [ =K[CLKPX@*BKY =KY =K[CLKPX@'BKY=K [ =K[CLKPX@*BKY =KY =K[CLK!PX@*rY =KY =K[CL@' rY=K [ =K[CLYYYYY@IG)%&&)% +'7>32#"&7#"&546?#7332>?332>54&'#"&54632yY  #Ca=N,(.46: ?\M 90' ADB $&F5 vg 3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3piX 0X@U.% Jc Y :K  ; L 0/-,+*)('&$#"!      +"&546323"&546323##73####73####!#" W)W I69$J X.\%%&$N000y006 XN@ K   JKPX@0 [?332>54&'#"&54632w "!!#Ca=N,(.46: ?\M 90' ADB $&F5 .')%'3{hG[B9,45"^#+%W!.DR#"K>(:Wi. &3qf3K PX@B hpc c  a  Y :KY;L@C ppc c  a  Y :KY;LY@+  3 3210/.-,+*)('&%$#"!  +"#7>32326?3#"&/.73!73#7!#7#3#e '6$   ' +%# "=(2 XW 2( D K23,  ",+ 1G003;GA, JK-PX@3  pc [BK  [=K [ C L@:p  pc [BK  [=K [ C LY@!=<32326?3#"&/.4>3232673#"&"7>54&# (! # %$ &D]61CP 9E8-JGeW#:N+ E/(eq @@= JrY :KY;L % +.54632##73#3!737#7A   XNS K7e f7^J $ XC0C0011y0 ?@ 1*JKPX@.pBKY =K[CK[GL@.rpY =K[CK[GLY@ ? ?''$#+% +.5463232>?3#"&54632326?#"&546?#7  P|U ! A7* 1IhnBS 6GP5*2>$/A JQ n   702IV$n;3$h\ =/002+Eg!@UYM +%!7!V4dN#@UYM +%!7!>&6@@JW[O$& +>32#"&54>@(3 "*>/7! :-2@J[BL$& +7>7#"&54632(4 "*>/8! :/tW@J[CL$& +7>7#"&54632(3 #*>/7!!:.)$@!JW[O$-$& +>32#"&54>7>32#"&54>@(2 "*>(2 #)>/7! :-/7! :-)@J[BL$-$& +7>7#"&546327>7#"&54632(3 ")>(2 ")>/7! :./7! :.tVW)@J[CL$-$& +7>7#"&546327>7#"&54632(4 "*>(3 #*>/7!!:./7!!:.] +U@ JK-PX@cBK?L@rc?LY@ %)$ +7>327>32#"&/#7#"&54632 6  *k=  : Qs@?QC8*JK-PX@ ccBK?L@r cc?LY@ML)'))'$ +%7>32#"&/#"&546?#"&546327#"&546327>327>32#"&/!X~ 4w |"Ow  t7z     3x @W[O   +7"&54632~!*."!)-("%+("%+Db %@"[CL      +"&54632#"&54632$$$$ '('(b #0@-[CL ##    +"&54632#"&54632#"&54632$$$$$$ '('('(6! +9IUj@gpc    d c;K  [CLKJ-,QOJUKUFD><31,9-9*("    +%"&546323#72654&#"4632#"&"&54632%32>54&#"2654&#"KTgPMS.Er;[;?9009A3kUCP1J/?QJTgPLT.F.+2!0+1!@8/0:A4VKNiVC&F4ET9+9L92:]uK<'L;$HHVLNiWB&F5(-.:(--;pT9+9M91:0!0+'7 G%kǻ0+7'7'7 G%kǻ@:K;L +3#,-Fg,!-@*[^K[_L!!  +"&54>32'267>54&#";90C*<:1D&-"-,D?/\I.E:0^J.*0%"P"!%1(!I"#'S1 '@$ JbZK[L +##7#?33#37h,: FI,}:UU%R'&>@;!JccYZK[_L#$"$" +#"&54632#326'4&#"'73#>32XTH/;  #1/(7! !18AY)% C, /o+g-'5C@@"Jpc[^K[_L)(1/(5)5$'$)$ +#"&54>7>32#"&5467.#">322>54&#"r%7%9> ='-;   15./:  /."8+;6=;7&$  EE,!+F*"1"@pYZK[L +#>7##73>$5D$" %3)1$VWT Ew$%HOS\+'7)@&5 J[^K[_L,*" *" +#"&'467.54632'>54&#"326'4&/.'oSD6F+" E>1A!L&!#)g'%(7% ?G1.,: "7<,'#3 %B-! !%) 4]-'3C@@Jpc[^K[_L)(/-(3)3&$'$" +#"&546323267"&54>32"32654&E8*.A &.3%/D%6#<<93H+F)!&R|!-@*[RK[SL!!  +"&54>32'267>54&#";90C*<:1D&-"- D?/\I.E:0^J.*0%"P"!%1(!I"#'  v%@"aNKZOL! +#73267>733#73_ ,  )XV ^+& (( 6{"6@3 Jpn[NKYOL$'' +!#?>54&#"#"&54632373 q38$ J646O<^(_+F+  -9+'9M-IB=|>J@G6Jpcc[RK[SL=;42.,+)%#! " +4632#"&5&632#32654&+732654&#"#"&RK/3>%  VA29   +0!' 2' #  +1,*"4  :D+% 6'8"  Ox '@$ JbNKOL +%##7#?33#37',: FI,}:UUU%E{&>@;!JccYNK[SL#$"$" +%#"&54632#326'4&#"'73#>32TH/;  #1/(7! !18AY)% C, /o+%J{'5C@@"Jpc[NK[SL)(1/(5)5$'$)$ +%#"&54>7>32#"&5467.#">322>54&#"0%7%9> ='-;   15./:  /."8+;6=;7&$  EE,!+F*"Hew"@pYNKOL +3#>7##73>$5D$" %3)$VWT Ew$%HOSD'75 JK PX@[RK[SLK PX@[NK[SLK PX@[RK[SLK PX@[NK[SL@[RK[SLYYYY@ ,*" *" +%#"&'467.54632'>54&#"326'4&/.'.SD6F+" E>1A!L&!#)g'%(7% }?G1.,: "7<,'#3 %B-! !%) 4C{'3C@@Jpc[NK[SL)(/-(3)3&$'$" +%#"&546323267"&54>32"32654&8*.A &.3%/D%6#<<93H+F)!(,m@ ! JK PX@/ h a  cY:KY ;LKPX@0  p a  cY:KY ;LKPX@/p U   cY:KY ;LKPX@0  p a  cY:KY ;LK!PX@/p U   cY:KY ;L@0  p a  cY:KY ;LYYYYY@(' +#3!73#7!#7#!>32#"&5467#40Io XW 2)F:$'J24.' D2>11G0HH$ /GY,J440T@Q pca  a[K Y  L0/+*)('&#"! ""$#+737#735>32#"&5467.#"3#3#!73!7>7#eFH @ hY@N -6@ } y &).&%v1'L:#Zf:1"KE#:$+=d8 D.&Q8@ 0 JK!PX@;p pa  a[K [  LK"PX@?p pa  a[K K [ LK#PX@;p pa  a[K [  LK.PX@?p pa  a[K K [ L@Cp pa  aK[K K [ LYYYY@8742/.-,*(#"! %"+73>7#73>3273#>5.#"3#3#32673#7#"&'5#2BD F!~U3I!+1>2;R   6@=Q13L.WcJ#$Ke#!?-.P6$#$7!7!>54&#"#73>323#3!32673#7#"&5467#9~(] 4%131Za _54&#"706?)FFP=/3ZQ$#97 $u@>VNR@'Bzb/1HQ~8C"0&DG6Dp-=OS @ QPF>5.0+!#"&54632>7#73>32#"&54677"&54>32'267>54&#"7!*+4% (:*H .-3"!(;-.<)9 76):!" ! ~ }]%)*gz_( ) $^/3%D450&C2"= @,,8(@JGKPX@'h  ] Y:L@(p  ] Y:LY@"(('&%$#"!  +#53##5!#'#373#3#53#3#53#55OIO4`_22-}v,228'!LssLH'''6''!'V! 0+".54>32!32673"!4&{PqE)LpG\w[c5hcle 2[LO\4OPih~d ""@JHUYM +%'%!!rI =y@H;L +'#' = IId # @HGUYM +'7!5!'7 IIV = x@G:L +737 =II  0+%'35'537375}jg&VV%gjUVWqghuabi 0+%'#'7373'#3'uכqgh:abigj}jg&VV%UVWd;  0+5##57'533537'#;qghuabiLjg&VV%gjUVW 0+%#575#7##='7FV%gj}jg&UVW^huכq9abi"0+!7 !mX<<ld5d@UYM +!7! Z 5/R#/ )$ 0+#"&'#"&54632>323267.#"%"32654&J=3K""O38LI>4O""M2@B2*&@A(&2%@ >%*//ICJ>((>GC;OB((BN<0/6%&=11:%&96,+1>;/*0+"#>3232673#"."#>3232673#".*+P(-(*$+ +?3"1)&R)+M*.)*$* ,@3"0('!9:"#E2!9:"#E2Xk*, 0+%##7#737#73733#3N/N{ e T/T} eii//qq/g:<   0+%%7%!7!  o0+7t/h:   0+7-7!7!w> KF oL7tv0/S'82JKPX@*a [ BK[=K[CL@(aa [ BK[CLY@876543,*)(''  +2#".54>"32>54.#53267>533#53N^55^NN\44\NHyV00WxHH{W12WzWK ,GK1ZOO]33]OOZ1.TyKH{X12XzHJyU.' ''S'J@ ? 5JKPX@6  pf  cb [ BK[CL@7  pn  cb [ BK[CLY@#)(FD=;43210/(J)J''  +2#".54>"32>54.2373#57>54&#"#"&546N^55^NN\44\NHyV00WxHH{W12WzG5A?2H ^&+#% F1ZOO]33]OOZ1.TyKH{X12XzHJyU.1/0F(:@p.P A& -1S'`x@uI [4J  pp ccc [ BK\CL)(VTPNGEA?><86/-(`)`''  +2#".54>"32>54."&5463232654&+532654&#"#"&54632N^55^NN\44\NHyV00WxHH{W12WzR1B '!/%(! %$$ ' I.5H#+,'S1ZOO]33]OOZ1.TyKH{X12XzHJyU.&*  !'#$(  +++/!0*%<4S':^@[65,Jpp b [ BK[CL:987430/+*)(''  +2#".54>"32>54.#5#5>733573#N^55^NN\44\NHyV00WxHH{W12Wz802> >.8**1ZOO]33]OOZ1.TyKH{X12XzHJyU. H)3mUZk.Nc+S'No@l721 L J  pa c   c [ BK\CL)(GEA?;96543/-(N)N''  +2#".54>"32>54.2654&#"'73#>32#"&54632N^55^NN\44\NHyV00WxHH{W12WzS%'*#( ӱ$;EK?-E '1ZOO]33]OOZ1.TyKH{X12XzHJyU.%()#$  5`27:A'+  S'JVo@lH+ Jp c  c  c [ BK[CLLK)(RPKVLVCA=;75/-(J)J''  +2#".54>"32>54.">32#"&54632#"&5467.2654&#"N^55^NN\44\NHyV00WxHH{W12Wz:.)/3G%/HANH+= !!"&%"'%%1ZOO]33]OOZ1.TyKH{X12XzHJyU.@K3<.X[nW#(  /##))"%.S'9@ 6*(JKPX@&ha[BK[CL@'pa[BK[CLY@543210''  +2#".54>"32>54.#54>7##53N^55^NN\44\NHyV00WxHH{W12Wz4>!, )41ZOO]33]OOZ1.TyKH{X12XzHJyU.#PNJ:q":S'?L\M@JA=1Jcc [BK[CLQOHF86,*''  +2#".54>"32>54.#"&5467.54632'>54&#"32654&/.'N^55^NN\44\NHyV00WxHH{W12WzFO99O H66AB (&(()%.D 1ZOO]33]OOZ1.TyKH{X12XzHJyU.v7939- *01/+* 0[""$  'S'HTo@l+ FJp  c  c c [ BK\CLJI)(PNITJTA?;953/-(H)H''  +2#".54>"32>54.267#"&54632#"&54632"32654&N^55^NN\44\NHyV00WxHH{W12WzU2&)5EP3I=GO,C %""#""'" 1ZOO]33]OOZ1.TyKH{X12XzHJyU./>H5"32>54."&54632#53267>533#532654&#"N^55^NN\44\NHyV00WxHH{W12Wz"ACCBE>A7+18..-1ZOO]33]OOZ1.TyKH{X12XzHJyU.^]_^^_Za)' ''MFIMMIENS'3? @ 94-( 0+2#".54>"32>54."&54632'2654&#"N^55^NN\44\NHyV00WxHH{W12WzGAHHBEFIB..-1ZOO]33]OOZ1.TyKH{X12XzHJyU.]]_^^_Z`'NEHNNHDOS+ %  0+2#".54>2654&#"7"&54632N^55^NN\44\OCIFEBHHB.-.1ZOO]33]OOZ1`Z_^^_]]'ODHNNHENx30+3!xDx &0+7!%!!xX QFP3=0+7!FPFP2=0+7!%!!F}Pi<A^? 0+%".54>32'2654&#"N8eJ++Je88dI++Id89KK99LLA%B_9:_B$$B_:9_B%{F>?EE?>F<A9? 0+%".54>32<:_C$$C_:8^B%%B^A%D_97]C&&C\69`D&dD 0+".54>32'2654&#"Oa77aOOb88bMZml[Zoo2\QOX00XNQ\2t[WkoWXsD0+)!!Kmq h;0+#%!!#73!=# u*K6 xUlX;  0+)!!''7'77KkuG l2 <LX RMD=<,0+%'"&/#''.'.5.'>7&'&5467>7>7646;76#"37265'4&2#"&546Y  4  ( 5 ]@ =*I"#(b< "X  k    !    6          2 <LX RME=0+7&574632>7>''&'.'&'##'7"326574&#2#"&546P  X" 7&'&5467>7>7646;76326?>32326?>32326?>32;2654&/.&727>32'.#"#"37265'4&2#"&546"#"&#"32654&Y  4  ( 5 ]@ =*I"#(b< "X  D.(   )& 2" "Cq?9%3   L      u!    6     gW ] T F? ."0       /d<@ v:!0+?'46?5.7.'.7>7>3>7&67&6322#"&'&#"&/&&#"&/&326?>'&6'.#"&7>54&4&54654&#"32654&#"3726'#"&54632j!    6     gW ] T F? ."0       Y  4  ( 5 ]@ =*I"#(b< "X  .(   )& 2" "Cq?9%3   v      2o <@ o\0+7&574632>7>''&'.'&'##'%.#"&7>322767>54&'&'&;2632326/.54676&32326/.5467>32326'%"326574&#2#"&546"32654&#"#"&P  X" 7"&='&637237265'4&#"4632#"&654&/.5467>32654&/.547>32654&/.546=4&#"3267>'64'.54676732654&#"!    6         gW ] T F? ."0   Y  4  ( 5 ]@ =*I"#(b< "X  k    .(   )& 2" "Cq?9%3   v  Oyb0+#u=#6 xUS$KPX@)h[BKY =K[CLK)PX@'h a[BK[CL@(p a[BK[CLYY@$$#!  +2#".54>#35##+N^55^NN\44\@KG,1ZOO]33]OOZ1''? 'S6S@P*4Jpn[BK[=K\CL65.,%#  +2#".54>##7>54&#"32654&'>32!N^55^NN\44\ G2@A62G %"+&^1ZOO]33]OOZ1a?9(G0/00-!%B O.SL@)>JK#PX@0c c[ BK[=K [CL@.cc c[ BK [CLY@KIEC<:6431-+$"  +2#".54>4&'>54&#"32654&'>32+32#"&'>54&#"326N^55^NN\44\'++"I5-I ( %$% !(%/!& A1:T1ZOO]33]OOZ1Z%)0!/+++  (" #'! *'5S&@ "JKPX@&pf[BK\CL@'pn[BK\CLY@&%$#  +2#".54>35#5#>7#33N^55^NN\44\))9.= >1091ZOO]33]OOZ1>+cN.kZTn3)HS:@ ,JK1PX@0pc[ BKY=K[CL@.pcc[ BK[CLY@9731*($"  +2#".54>4&#"735#>32#"&'>54&#"326N^55^NN\44\E;$'#*'%& E.?J1ZOO]33]OOZ1d72_5  $#)(  +'AS6B@ JKPX@1p c[ BK[=K\CL@/pc c[ BK\CLY@87><7B8B31-+'%  +2#".54>4&#">3232654&#"32>"&54632N^55^NN\44\G3/*.  =,HMAH/%&&%("$%1ZOO]33]OOZ1i<2K@  (#Wo[W.7.%")*"#/S%?@<%#Jpn[BKCL  +2#".54>46?5#3733N^55^NN\44\b4) ,">1ZOO]33]OOZ1Q:"q:JMP$S+8Hj@ <8#JKPX@ [BK[=K[CL@c[BK[CLY@GE31*(  +2#".54>4&'>54&#"326'.54632467#"&N^55^NN\44\A66G P99N&)  D-%*(1ZOO]33]OOZ1a/*+/2/* -949"j'  $S4@Y@V &Jp cc[ BK[CL65<:5@6@31-+$"  +2#".54>4&#"3267#"&'>54&#"326'2#"&546N^55^NN\44\=J3OE4(&3$ A,PG(!"(""#1ZOO]33]OOZ1SU8C<5 2654&#"#35##+"&54632N^55^NN\44\CA>EBCC81+R...1ZOO]33]OOZ1aZ_^^_]^)''? 'NEIMMIFMd 0+".54>32M[33[MN[22[4]LK\44\KL]420+!  Y a`20+%%' a 20+ '7Y T TR20+ 7% TRY 20+)kG20+ N80+TkGt0+7F0+ #;l$A`0+3Mk;7.   0+!#3'3#6}TQ())[  0+7!!733#3~5~džUQ(T)[E/fJK PX@ h[BKZ;L@!p[BKZ;LY@//)* +%!7>54.#"#733.54>32371,O;#'B/@bA"%(%' 3ZK?_>o:6Uet<'G5 ?hH7#"&54632(2 !%9&,!$2)0+'3267#"&54632#"&546324 16XH0M y7:*.%RR%/;cks{[A,|xtpljd_K82*&" 0+#"&54632.#"32674632#"&'#5353'4&#"32632654&/.54632.#"#"&'#'##73!3##5#%3##5#%32#'##7''2654&+4632#"&'3#3##%3#"&=33265'#5353732+%4&#"3262654&+32#'##7'373#'2654&+N! %&!*(!!''!!(RTj "! D;88978_:&#'q'p( "&&" (iVSSQT'9$$%%7%:&#'<0/<z'A)$%)" )$**$$))'~~K!!!!   '**<99;JJ :$))$%((p4?[[[;~~'$$'K !!t+<999]II[;K  :,'4@1%$Jc[CL''  +"&54>32'.#"2>54&'[n+Li>ak'Jl95#3R8/P8 6 oVBuX3nW6s]< .I`1L^- aZi #BR@O Jr a  c Y :K [ C LA?<;75/-*)('*% +'7>32'7>323#73#3##7!##".54632+326  p  %XJW XJX bf  Xc%w2H-%#  A;Qs2T 2T :0011~00z$,+0'e> %@@=p[c 1M@  B JK PX@7p hBK Y =K[CK \GLKPX@8p  pBK Y =K[CK \GL@8rp  p Y =K[CK \GLYY@222M2MLKFD$)#&*% +'7>32'7>32#73326?3#"&5467#"&5463232>7#7'yY  yY  P[Y  $ 8*(# ΐOH0;#m vg g +C $% <3&"B^[+-$ )5+ +;@8d[BK=K[CL*("    +2#"&5>>?33267"&74632#"&a&${c7"_d26%F#8H%NU&'cvnoI*6""(=)L@~*$0+#7>54&#"32#"&54632"&54632~qT7\M*+$7  YKCN$$Qc?eO<%& :E<2'(] *'0+2#"&54646?33267#"&54632#"&0$$qT7\M*+$7  YKCN'(gQc?eO<%& :E<1- +@(p[BKCL    +2#"&5>3#"&7>7>%$$% A&'WI*G@*D- 0+7#>7>7>32"&54632$  )F$$+G,F%7Kd'(  0+2#"&5>3#"&74>%$$ !+'(+G,F%7Kd\Fj@UYM +#73YF9]Fz@UYM +!7!nF4sF]|@UYM +!7!M&F61y:FVNGC90+#"&7467#"&54>327332>54&#"3267#".54>322>54&#":;W87'&K'55 6J+.6+3F $>.Wi;.QpAN76YT]2Bwc5<1'% 4%By\74%9=H=2eP3<.d.(1Qk;K}[KwS,3<=?3^ScSG6IM-:1HU$(00+3#330+3#2/10+3#,,GS0+3#k4n3SBoS0+3#o12SBI` 0+.54>7? _w7f^1B{%LЏXl#*JBq_Q]v 0+7'>54. _w7f^1B%LЏXl#*JBq_Qk"@aUYM +#3#3}ִ)kN"@aUYM +3#73#4}ִm[)T1b01@.$ JcW[O0/! +#";#"&54>54&'7>54&54>3 #N; >8"#!"+5 7H@$*$*(54&+732#3 #N; >8"#!"+5 7H@$*$*(7.54>7!_s7e[iW ^v4]QLvO*1C$N؆Wl%)KD$NԊWl%)%f|MBr`Q;# 0+7'>54&?'>54.!_s7e[iW ^v4]QLvO*1C$N؆Wl%)KD$NԊWl%)%f|MBr`QJa# 0+.54>7.54>7!_s7e[iW ^v4]QLvO*1C{$N؆Wl%)KD$NԊWl%)%f|MBr`QaP# 0+7'>54&?'>54.!_s7e[iW ^v4]QLvO*1C$N؆Wl%)KD$NԊWl%)%f|MBr`Q^  0+ # ;l $Ax 0+35k;{7.3`# 0+26?#"&54>;##"&54632+08QR(E^6 @{KL30zKALJN;Z= +T]T+"% "be0+737#73733733#3##7##7#737#1l?8-78/8np>9/88/8i?ٶ33331AQUt@q-  J  c  cY:K[BK Y ;K[CLRRCB32RURUTSKIBQCQ;92A3A$%$% +!##"&54632>7#73>32#"&5467"&54>32'2>54&#"7!/>%77A0"" "+-2!Z %77@.#" "-/51>,=#8:,>#)'>7 0  Iך0ɧ߄6 1  W26)K8":4(I7 &!3=""4@//8%5GS@Pd  c:K[BK;K [ CL'&FD=;/-&5'5$"  +"&54>323#>54&#"326"&54>327>54&#"326>E!6H(=J6J667f! #/$+O>F!6I(323#>54&#"326"&54>32!"&54>32%>54&#"326%>54&#"326>E!6H(=J6J667f! #/$+>D!8I(F!6I(53. +373#>54&'+#7.'#73.54>327.#"4&'>' - &,/*$54)}b '-F%(0G1=9.4G'  A,29G5%:CQN &Q  #3 $-:%`lFK1S  4J #,9'+B,+89p+7N<@ 4 JK'PX@?p pa  a[BK ;K [CL@Cp pa  a:K[BK ;K [CLY@<;863210.,'&%$%$ +3>7#73>3273#>54&#"3#3#32673#7#"&=#)JS T8IX2:G#"409;%@4)  9MHW1;"T3ceR+(+7cH+5.]  9C$;O++(+TdcPI%-w`"S@P J  a  aY:K Y;L"!  +3'#73'#73##73#3#3#3!737#k x2H XLS Hv ? 5e f5%U,00E00,U,11)I@F a a Y:K  Y ; L)(" &! +737#73#732+3#3!737#32>54&#Bfk jPW je*OqGH !m W!e,PC6S69EH,,0IH6[A%H,{11{!6J(12+i1X@UJp pa  a[BK Y ; L1/+*)('&#"'$# +37#737>32#"&5467.#"3#3#!73!7>75#uUME z`BK ?Q ;2,2&(J8? \!M+;kr20#gT,+M+B]mD_C+i*F@CJpp a[BKY;L*)'$# +37>32#"&5467.#"3#!73!7>?#qiz`BK @P;3,2&(J8? prbkr20#gTS,LC`mD_CQXq-@ JK PX@3fpngdW[O@1rpnsdW[OY@ &'& +%3+#7.54>;73#"&5467.#"3260dB*BQ >\;*2B 7%/C*B61JKFZ^ ^K9mU4ae ;+#:QYCL8T'I@ = /JK#PX@4  W   aU c[BK[CLK-PX@2c  W   aU c[CL@8c  W   aa cW[OYY@)(ECA@?>;931.-,+(I)I((($ +4>32#".732>54.#"2653#'#"&54>3273#.#"6`NN_77`MN`7(1WvECvU22VuDDwV1K+6-?%Oc/@"'> -8*;01VS]22]SS^32^TLzT--TzLLzS--Sz-10sd2M511+RQPXl* 0+>32#"&54>(0 ")=/0 4+c/ 0+7>7#"&54632c(/ "(=/0/! 5*l*)! 0+>32#"&54>7>32#"&'4>'/ ")='/ #(=0/! 5*0/! 5*c0)! 0+7>7#"&546327>7#"&54632c'/ #(='/ ")=00/! 5*0/! 5*=\.0+'7 G%kǻ\0+7'7'7( G%k\ǻ;\  0+'?'7 /#V!>%b˼ʽ \  0+7'7'7'7'7) /#V!>%b\˼ʽrR{G90+#"&/#"&546?#"&546?'.54632'.546327>32{ON A   A QQ ?  A .   9X   X9     9W  W8 <Z@ N JK PX@Ih  p  ha[BK  Y=K[CK \ G LKPX@Jh  p   pa[BK  Y=K[CK \ G L@Kp  p   pa[BK  Y=K[CK \ G LYY@ZYXWRPIGCA>=#&'$#% +4&54632%>32#"&5467&"#"!326?3#"&546?##"&5463232>7#73V>%* (1 X  $ 6*)  G~JU1;$~M K ^V$$ E=,C $% <3&"CPi,*$(4+<fKW@ ? JK PX@Fp  h[BK [32#"&5467.#"!326?3#"&546?##"&5463232>7#73%"&54632W@(: (4 X  $ 6*(! G~JU1;$~N K!!^V($"H=,B $% <3&"APi,*$(4+W%'g-@* J:KY;L +7#7333#73 JE-J W$111w11"ri B@? Jr  b:K Y;L   % +'7>32#7333#73'#73N  V JF,J W p2T 11w119qi JK PX@4rh  p  aY:K Y;L@5rp  p  aY:K Y;LY@  % +'7>3273!73#7!#7#3#  =(2 XW 2( D K2T 1G00Gi 'C@@Jr Y:K Y ;L'&%$#"! % +'7>323#73#73#7#73#3#73~  .W XW W| W XX W2T ^211G002,0011Gi +4@1Jr[BK[CL (&   % +'7>32.54>32'32>54&#"F  v{4]Mt2\LTCfE#JTBgF$2T sW}KwKTXfU};TcQy1i .@ )JKPX@-rpf Y :K\CL@.rpn Y :K\CLY@ . .-,$*% +'7>32#"&54632>7##73##73H  8.3:$"*# .H)QO MH O 2T 3"B2 * XC00z00i ,9V@S" Jr  c Y :K Y;L85/-&#! ,,% +'7>323#73#3#)73#73#>32'32>54&#"  XX XX XW Y?=Qj+Ppj4N4E;92T G0011G00CN6_E(1'32"&'#7332>7!7!>54&#"#73>321  D\%%54&24Q<(  ?U?h45% _7rb+Sz2T 81_ %6#3Sh41(Z\M]J(+lQRi -=]JKPX@8r  a [BKY:KY;K [ C LKPX@3r  a [BK Y:K [ ;LKPX@8r  a [BKY:KY;K [ C LK!PX@>r  a [BK Y:K Y;K  [ C L@8r  a [BKY:KY;K [ C LYYYY@:820-,'%$% +'7>323#73#73#3>32#.5467#32>54&#"  qX XW XE?Vl>t2\Qv{LTCfE#JTBgF$2T 11G00AsU1wKTs+^XfU};TcQyi 5@@  JK PX@7r  h   a Y:KY;K \CL@8r  p   a Y:KY;K \CLY@"76 :86@7@21.,'%$#"!  5 5% +'7>3226?>7.54>3!#3#737#"#"&?33#"  8:+5<+Jd9' WW WCe,@97.?, YpLy1F.>2T "y)1 F58T7011--z11B=47&%41@#1;.!1:@7Jc[BK[CL.,&$  +"&?>327>54&#"32>54&#"]I<"MHH 5C#=J"BbGDhe'(;YVC&B/36 =obs<1+H5"=6(\N3`j@$'cHa)?M$*2 &6 @ !JKPX@-p=K[=K[CK[GLKPX@)p[=K[CK[GLKPX@-p=K[=K[CK[GLK!PX@)p[=K[CK[GL@-p=K[=K[CK[GLYYYY@('0.'6(6'$#&# +7#"&54>3273#"&54632326'2>54&#"F/6]5?A$?Y3V^ 5H;Xh,-; j[̵  JK PX@K  p h  n  ca:K [=K;K \CL@L  p  p  n  ca:K [=K;K \CLY@ ZXTSRQPOJHFECA;97620$"&'" +7463232>54&#"#>32333>32#"&5463.#"32673#"&5467##7##"& (<&"3(P067[kCkZ '3>#12$8'##.(E7<5\9C9Y %3B(24Q'Hdm%#123NBA90^.O:!0(%>^p1$332HHN72.T@&26K@H4Jppc[=K[GL"&#$'$" +#"&5463232654&#"732>54&#"#>32Zk:  " (>+-0+F 3f?LRbM0?k;3%k]9J01B$-61.L@P;Vk K 9e@b#*  J  p cY:K[=K;K[ CL6520 99 +"&?6&+##73326?>32#"&5467326?r.)31BG[m+6+5) '% $ 1 3-2,?y/o#6%.$ .",>C;>+'1I@FaY:K[=K;K[ CL+)   +"&5467###733>32'3267>54&#"QT]EG[ r\ *;M.TR!@^+60 (6"4 cN}+e)L:"dK4oZ;6C<>?6D!9;;  $5,@)1JrY7'.546;73#"32>54&/!?\:,?'8M.-C?#!%!$R"310%B/*'$=+1fR4/="4aO:6(0432#"&54675$: C.G7"8<**S_! S!'9@6a[K[ L%$  +"&'4>32"!>5.32>7!_e)Jh=]i(Ih$=0# 19:?&>0# bWAx[7_Y9v`=!4E$32+73##73733#732>54&#"e&/ATm Ci8$*K'#P':&5--43273#"&54632326'2>54&#"F/6]5?A$?Y3V^ 5H;Xh,-;JYb0+3##73326?3#"&5467b W[Y  $ 8*(# b'+C $% <3&"BD@b6D@A(JpaY =K[CL66)#&' +!!32>?3326?3#"&5467#"&546?#7 F\ A<0 2Ha  $ 3*&08? 12 PRb'd1:T^$& !% ;4$7>$H:$+(5+=RbPI@F%JpaY =K [CLPOJHBA<:)*#& +!!326?3#"&546?#"&5467#"&546?#7332>?332>?3 /K  % 3*$  .4;3) -4>".1 URb %D:, 1IY #C8+ 1Hb'L& !% ;4$*#@12* ) =/-'4 +69Ta(4:Ta'- 1AB@ #JKPX@*pBK=K[=K [CLKPX@&pBK[=K [CLKPX@*pBK=K[=K [CLKPX@&pBK[=K [CLK!PX@&rp[=K [CL@*rp=K[=K [CLYYYYY@32;92A3A&&''% +'7>32#"&5467#"&54>3273326?32>54&#"yY  D6$"% 0\1?9%?X39@;.\ $"H;&.,'A-vg <4"$/MOSG9w_>I8zH#&dAY\4I324>3232673#"&"7>54&yY  &D]61CP 9E8-JGeW#:N+ E/(C& >x@ 0JKPX@&pBKY =K[CL@&rpY =K[CLY@ > >)#&+% +'7>3232>?3326?3#"&5467#"&546?#7yY  [ B<0 2Ha  $ 3)&08?!13 PR vg 1:T^$& !% ;4$:<$I:%+(5+2 1\JKPX@BK[=K[CL@r[=K[CLY@ +)   % +'7>32"&54>32'3267>54&#"yY  QS!?]?6D!9;; ?@1*JKPX@.pBKY =K[CK[GL@.rpY =K[CK[GLY@ ? ?''$#+% +'7>3232>?3#"&54632326?#"&546?#7yY  U ! A7* 1IhnBS 6GP5*2>$/A JQ vg 02IV$n;3$h\ =/002+> #9K@ 4 JKPX@.  p  cBKY =K [CLK-PX@.r  p  cY =K [CL@8r  p  cY =K[CK [CLYY@ HF><863210*( # ##+% +'7>32326?3#"&5467#"&'&6?#73>324&#"32>yY  `  $ 7*(# ]";O.3= HQ I<%3CI'"4  &2'vg 8 % <3)E#L=(#b++;,!"?&!4@% '=KPXJKPXJKPXJK!PXJJYYYYKPX@2aBK [=KY=K;K[ CLKPX@*aBK [=K;K[ CLKPX@2aBK [=KY=K;K[ CLKPX@*aBK [=K;K[ CLK!PX@*ra [=K;K[ CL@2ra [=KY=K;K[ CLYYYYY@ 75,*! ' '% +'7>32"&5467###733>32'3267>54&#"yY  wQT\EG~[ 8\ *;M.TR!@^+60 (6"5 vg xdN+)L:"dK4o[;6D<>?6D!9;; 9 JKPX@3pacBK [ =K[ CL@3 rpac [ =K[ CLY@ 31/.,*%$#" 9 9% +'7>32"&54632+3267>7#73>54&#"#>32kyY  @R 2"(=  .3.@2d=VL<[vg x:4&-%9' 6A33LEdK7pY9 AJ@  JK PX@-h   cBK Y=K\CLKPX@.p   cBK Y=K\CLK-PX@.rp   c Y=K\CL@8rp   c Y=K[CK\CLYYY@CBFDBJCJ&#&+#'% +'7>32#"&?3326?>7.546;326?3#"&546?#"737#"yY  *-/ $ /"(8uZ]  $ >)) A%)iE?b7#"&54632 #9!%".Ki @ Gi% +'7>32  2T d @rW[O"# +332673#"&546)!&*A)PE66d "!')E<0+ Em@Hi +77# ^6WQQrm@Gi +''73^6QQrX +@(W[O      +"&546323"&54632#!#"%%&$"[ @W[O   +"&54632%$%%1 @ Gri*% +'7>32'7>32n     Uj  L'@q @ Gi% +.54632  $ XB@UYM +!!B2f1@.cW[O  +"#7>32326?3#"&/. '6$   ' +%# 23,  ",+ *@'JcW\P$&$% +3267"&54632#"&54632> *!(B 0B$BMe-11* 0+4632#"&732654&#"C,.@B,,C)''& '@1;;13;;3"''"!&%NT 0+"&54632$$'(F 0+"&54636r!"$&8@5JbK YL +7#7333#73'#73' 6,E): C Rk+++5++$E@B J aYKYL$# +3#73#73232654&+326'4&# FuF QL=H1/\K4+0N=8YPR14+*4/5K /(L\G+ !L:!!%&@ JK!PX@'pn[K[LK"PX@+pn[KK[ LK#PX@'pn[K[LK.PX@+pn[KK[ L@/pnK[KK[ LYYYY@!  && +"32673#7#"&'&>3273#>5.>4M26@=R12 M,Xb&HgA3I!,0=?\i*54&#b hm)TW DtKuADb>@M*]S;u\:+_4Qe23273#>54&;4L0:<@;  aYK  Y   L+'3#73#!7#73#3#737!3#DsD C0 1C CtC D79D +****_+++@ #@ YKYL+'3#73#3#ErD CuD +**_++@(cYK[ L"$#+7#73##"&54632#326VP CWVE64#8;**RI0"' 1^I@F Ja Y K Y L+37#73#3#73'#3#73#731MB ;s4 EeL9A DsD ̰**++++** 2@/pYKYL +%73!73#73#E3$*p CuC Gv+k+**_ <@9 J Y KYL +3#3#73# 3#73#7= BtC BoFpB CtD {*_++Gj++*0@- JYKYL +3#73## 3#73#ogA C;hB DsDgo**4++&(@%[K[ L +"&'4>32'32>5.#"^e)Jg>]h'Ii9>3N38?2M4bWAx[7_Y9v`==G?\j*;F=Zi:@7c YKYL$! +7#73#732+326'4&# EvD WYzF,xA?ZS,6++++<9Wk[?#)&#=JX@U1!JAIpc_[K[  LIG:8.,'& ## +"&'4>32326?3#".47'.54632>5.#">?6&#"^e)Jg>]h.B)$ # ),  591/1% ! 9?3N5i  ' bWAx[7_Y,\SD%3$-2#- >BA0'0 JK&PX@5 p  a YKYK[ L@2 p  a YKYK[ LY@0.*(''+!%# +%#"&5'.+3#73#732326?%32654&+ /%,%K3B EvD WUOJ   IES14Bx(3%1(B''+++17BU ,%Q)GD!3H@E2Jpn[KK[ L33+%+% +#>54&#"#"&'#7332654&/.546327%):0,6# +E_P3I !!+B/4<2!#4UE/F$0)%&=7C[$#?.5=+&*71AE$<JH_K PX@ hYKYL@!pYKYLY@ +373##7!#7#3a Kv8%++#vK +nn^+Ez'@$YK[ L##+3#326?#73##"&?#u BD%LNQDA @@=J Y KYL +7#73#3#73'3#737'#73MA 8e6 DRC 8`7 ̣**++++**FL6@3JY KYL +#7#73#3#737#7 DJB :*N N*X9 ***))* 6@3pnYKYL +7!373!7#F*y r3#)z 2f*_e+f C@@ Jr  bK YL   % +'7>32#7333#73'#73'yY   6,E): C Rkg ++5++#&L@I& Jrc  bK YL%$##"! "%+332673#"&546#7333#73'#73'$%8%EB+,w 6,E): C Rk &1IA(* ++5++E@B Jr  bK YL +''73#7333#73'#73'T9 6,E): C Rk/kie++5++ '*[@X* J c  bK YL )(''&%$#"!     +"&546323"&54632#7333#73'#73' "!! 6,E): C Rk:')%'++5++ C@@  Jr  bK YL   % +.54632#7333#73'#73'  P 6,E): C Rkz   ++5++nB@? Ja  bK YL +3##7333#73'#73'Z 6,E): C Rkn/++5++#&C@@&  J  b _KYL%$"  +467#73'#3#7333#3267#"&3'KAX C RB 6,E): <:M& *,7'/Q'+++5+%G# 1 %&)?@<)  J  c  bKYL('%#&" +46323#73'#3#73.732654&#"3'>)+:%&: C RB 6*  !n4.55-%1 V++++ -""! /22JK.PX@0cc  bK Y L@7pcc  bK Y LY@) 10 / /.-,+*)('&%$#"! +"#7>32326?3#"&/.#7333#73'#73''# (! # %$  6,E): C Rk*()  +&-  ++5++% 2*@)JK!PX@(pa [K[LK"PX@,pa [KK[ LK#PX@(pa [K[LK.PX@,pa [KK[ L@0paK [KK[ LYYYY@ -,+*'% 2 2% +'7>32"32673#7#"&'&>3273#>5.yY  w4M26@=R12 M,Xb&HgA3I!,0=g ?\i*3273#>5.T9 4M26@=R12 M,Xb&HgA3I!,0=kiK?\i*3273#>5.>4M26@=R12 B&&*):52 ,"-6NW&HgA3I!,0=?\i*3273#>5.T9R4M26@=R12 M,Xb&HgA3I!,0=/ki?\i*3273#>5.U##24M26@=R12 M,Xb&HgA3I!,0=:()f?\i*54 41D hm)TW D91 ~9DDb>@M%*]S;u\:+հ%4Qe254 41D hm)TW D91 ~9DDb>@M%*]S;u\:+հ%4Qe254&#T9 hm)TW DtKuADb>@MkiS*]S;u\:+_4Qe23273!73#7!#7#3#yY  j0#(v CvD '% 3 8g e+*f)'K PX@=r   h  pc  a YK YL@>r   p  pc  a YK YLY@''&%$#"! "%+332673#"&54673!73#7!#7#3#$%8%EB+,`0#(v CvD '% 3 8 &1IA(* e+*f)HK PX@4rh  p  aYK YL@5rp  p  aYK YLY@ +77#73!73#7!#7#3#T90#(v CvD '% 3 8ki e+*f)@ JK PX@4rh  p  aYK YL@5rp  p  aYK YLY@ +''7373!73#7!#7#3#T9G0#(v CvD '% 3 8&kine+*f) +K PX@;   h  pc  a YK YL@<   p  pc  a YK YLY@+ ++*)('&%$#"!     +"&546323"&5463273!73#7!#7#3# "!!0#(v CvD '% 3 8:')%'e+*f) K PX@8 h  p c  aYK YL@9  p  p c  aYK YLY@#      +"&5463273!73#7!#7#3#N##(0#(v CvD '% 3 8:()e+*f)  JK PX@4rh  p  aYK YL@5rp  p  aYK YLY@  % +.5463273!73#7!#7#3#  P-0#(v CvD '% 3 8z   e+*f)nK PX@7 h  pa  aYK YL@8  p  pa  aYK YLY@ +3#73!73#7!#7#3#q0#(v CvD '% 3 8n/e+*f)&  JK PX@5h  p a _YKYL@6p  p a _YKYLY@%# +467!73#7!#7#3#3733267#"&MA CvD '% 3 80#(9P& *,6/Q'+*f)e%G# 1 %3K PX@B hpc c  a  Y KYLK.PX@C ppc c  a  Y KYL@Jp ppc c  a  Y KYLYY@+  3 3210/.-,+*)('&%$#"! +"#7>32326?3#"&/.73!73#7!#7#3## (! # %$ %0#(v CvD '% 3 8*()  +&-  e+*f)% >@ 5 'JK&PX@2 c  ab [  K [   LK.PX@6 c  ab [  K K [ L@: c  ab K [ K K [ LYY@987631+)&%$#"! >>"%+332673#"&546"3267#73##7#"&54>3273#>54&$%8%EB+,D4L0:<3273#>54&T9M4L0:<3273#>54&W##74L0:<3273#>54&7>7#"&54632;4L0:<323#73#3#?yY  ErD CuD g **_+6@3rcYK Y  L"% +332673#"&5463#73#3#$%8%EB+,ErD CuD  &1IA(* **_+l2@/JrYKYL+''733#73#3#lT9ErD CuD /kie**_+w #E@B  cYK Y  L #"!     +"&546323"&546323#73#3# "!!ErD CuD :')%'**_+@ 0@- JrYKYL%+.546323#73#3#  PErD CuD z   **_+cn-@*aYKYL+3#3#73#3#vxErD CuD n/**_+@4@1J_YKYL%% +467#73#73#3#3267#"&211N ErD CuD N1/& *-6(U$+**_+!K# 1 ({+K.PX@* cc YK  Y  L@1p cc YK  Y  LY@+*)('&%$#"!   +"#7>32326?3#"&/.3#73#3## (! # %$ ErD CuD *()  +&-  **_+@ :@7cYKYL   +"&546323#73#3###ErD CuD :()**_+@  0+'3#73#3#ErD CuD +**_+":@7JrcYK[ L"$#+''73#73##"&54632#326T9VP CWVE64#8Aki;**RI0"' 1^1X@U !Ja_ Y K Y L+)%#+37#73#3#73'#3#73#737>7#"&546321MB ;s4 EeL9A DsD (2 !%9̰**++++**&,!$2) "C@@Jp_YK YL  +%73!73#73# 7>7#"&54632E3$*p CuC Gv(2 !%9+k+**_&,!$2) C@@p cYK YL  +%73!73#73#%"&54632E2$)p CuC Gv""+i+**_$% ?@<JrpYKYL  % +'7>3273!73#73#:yY  3$*p CuC Gvg k+**_ D@AJpYK[K YL  $& +7>7#"&5463273!73#73#E #9<3$*p CuC GvM!%".Kk+**_4@1 JpYKYL+?#73#7373!737 O7C G/e g93$*p C0.%**312k+ <@9Jr YKYL% +'7>323#73## 3#73#yY  gA C;hB DsDg go**4++>@; JHr YKYL +77#3#73## 3#73# T9偱gA C;hB DsDki)go**4++(?@<  J _YKYL"  +3#73## 3#73#7>7#"&54632ogA C;hB DsD3(2 !%9go**4++&,!$2)3+" JK.PX@-cc YK  Y   L@4pcc YK  Y   LY@%3210/.-,*)('&%$#!  +"#7>32326?3#"&/.3#73## 3#73#S# (! # %$ gA C;hB DsD*()  +&-  go**4++S@@= J  _YKYL +3#73## 3#73#"&54632ogA C;hB DsDy$$go**4++'(e(N@K#JIc_ Y KYL(('&%$"$# +#"&54632#326? 3#73#73#738DE104hB DsD fA #FD/"' )2++*fp**& +5@2Jr[K[ L (&   %+'7>32"&'4>32'32>5.#"yY  ^e)Jg>]h'Ii9>3N38?2M4g obWAx[7_Y9v`==G?\j*;F=Zi&#3:@7rc[K[ L0.(&##"% +332673#"&546"&'4>32'32>5.#"$%8%EB+,^e)Jg>]h'Ii9>3N38?2M4 &1IA(* YbWAx[7_Y9v`==G?\j*;F=Zi&&7@4Jr[K[ L#!+''73"&'4>32'32>5.#"T9^e)Jg>]h'Ii9>3N38?2M4/ki4bWAx[7_Y9v`==G?\j*;F=Zi& '7D@A c[K[  L 42,*!''    +"&546323"&54632"&'4>32'32>5.#" "!!^e)Jg>]h'Ii9>3N38?2M4:')%'bWAx[7_Y9v`==G?\j*;F=Zi& +5@2 Jr[K[ L (&   %+.54632"&'4>32'32>5.#"  P^e)Jg>]h'Ii9>3N38?2M4z   bWAx[7_Y9v`==G?\j*;F=Zi&/?K.PX@) cc [K[  L@0p cc [K[  LY@! <:42)' /!/  +"#7>32326?3#"&/."&'4>32'32>5.#" # (! # %$ A^e)Jg>]h'Ii9>3N38?2M4*()  +&-  pbWAx[7_Y9v`==G?\j*;F=Zi& '7=@: Jrr[K[ L42,*!''*%+'7>32'7>32"&'4>32'32>5.#"ZmN    ^e)Jg>]h'Ii9>3N38?2M4oLa  "6T  bWAx[7_Y9v`==G?\j*;F=Zi&n#2@/a[K[ L  +3#"&'4>32'32>5.#"^e)Jg>]h'Ii9>3N38?2M4n/bWAx[7_Y9v`==G?\j*;F=Zi%'1@. J[K[ L$" +"&'4>32'.#"%4&'32>^e)Jg>]h'Ii!0"3N5I*3N4cW@x\7_Y9w_>&O=Zi ?\j% '3<@9,+ Jr[K[ L 0.$"  %+'7>32"&'4>32'.#"%4&'32>yY  ^e)Jg>]h'Ii!0"3N5I*3N4g gcW@x\7_Y9w_>&O=Zi ?\jD@A  a  cY KYL$! +#32+3#73#7#32654&FDAO]yEU EvD J=>ZR3+F132#"&5'.+3#73#732326?%32654&+yY  T /%,%K3B EvD WUOJ   IES14Bg (3%1(B''+++17BU ,%Q)GD!.7@ # JHK&PX@:r   p  a YKYK[ L@7r   p  a YKYK[ LY@751/..+!%$ +77##"&5'.+3#73#732326?%32654&+T9 /%,%K3B EvD WUOJ   IES14BkiY(3%1(B''+++17BU ,%Q)GD!'0E@  5 JK&PX@< p  a _ YKYK[ L@9 p  a _ YKYK[ LY@?=970.*(''+!%#+%#"&5'.+3#73#732326?%32654&+7>7#"&54632 /%,%K3B EvD WUOJ   IES14Bt(2 !%9x(3%1(B''+++17BU ,%Q)GD!&,!$2) ?O@L>$Jpa[ KK[ L ? ?+%+%% +'7>32#>54&#"#"&'#7332654&/.546327wyY  ?%):0,6# +E_P3I !!+B/4<2!#4UE/Fg $0)%&=7C[$#?.5=+&*71AE$<:U@R9JHrpn[ KK[ L::+%+% +77##>54&#"#"&'#7332654&/.546327T9%):0,6# +E_P3I !!+B/4<2!#4UE/Fki%$0)%&=7C[$#?.5=+&*71AE$<H@G-* JK PX@9pnh_ [  KK[ L@:pnp_ [  KK[ LY@HHEC%%&% +#>54&#"##"&'732654&'7.'#7332654&/.546327%):0,6# +E^K%*):52 ,"-6&7 !!+B/4<2!#4UE/F$0)%&=7C[N!!)3 ) r#?.5=+&*71AE$<:U@R9Jrpn[ KK[ L::+%+% +''73#>54&#"#"&'#7332654&/.546327T9Q%):0,6# +E_P3I !!+B/4<2!#4UE/F&kiÖ$0)%&=7C[$#?.5=+&*71AE$<3HW@T28 Jpn  _[ KK[ LB@<:33+%+% +#>54&#"#"&'#7332654&/.5463277>7#"&54632%):0,6# +E_P3I !!+B/4<2!#4UE/F(2 !%9$0)%&=7C[$#?.5=+&*71AE$<&,!$2)N3?X@U2Jpn  _[ KK[ L54;94?5?33+%+% +#>54&#"#"&'#7332654&/.546327"&54632%):0,6# +E_P3I !!+B/4<2!#4UE/F$$$0)%&=7C[$#?.5=+&*71AE$7#"&54632a Kv8%++#vK (2 !%9+nn^+&,!$2)JH$x JK PX@'h  _YKY L@(p  _YKY LY@ +373##7!#7#37>7#"&54632a Kv8%++#vK (2 !%9+nn^+&,!$2)JHrHK PX@%rhYKY L@&rpYKY LY@ +77#73##7!#7#3T9 Kv8%++#vK ki+nn^+JHyK PX@*h aYK  Y   L@+p aYK  Y   LY@ +3737#737##7!#7#3#3a J7b `58%++#4e d6K +%nn%+Ez %4@1JrYK[ L##% +'7>323#326?#73##"&?#yY  y BD%LNQDA 32'7>323#326?#73##"&?#mN    I BD%LNQDA @;cc YK [ L10-+('#$$$" +4632#"&732654&#"3#326?#73##"&?#&=(*;=((=)   BD%LNQDA 32326?3#"&/.3#326?#73##"&?#V# (! # %$  BD%LNQDA 323##73## ##73##LyY   CC 946: CGyg *g**3|**kFqA@> Jr Y KL +''733##73## ##73##~T9 CC 946: CG&ki*g**3|**kFq 0X@U.% Jc Y K   L 0/-,+*)('&$#"!     +"&546323"&546323##73## ##73## "!! CC 946: CG1')%';*g**3|**kFq $?@< "Jr Y KL$#! % +.546323##73## ##73##  Pp CC 946: CGq   *g**3|**kFLeA@>Ja Y KYL +3##7#73#3#737#72 DJB :*N N*X9 e/@***))*FL A@>JrY KYL % +'7>32#7#73#3#737#7yY   DJB :*N N*X9 yg ***))*FLC@@ JrY KYL +''73#7#73#3#737#7T9 DJB :*N N*X9 &ki***))*FL ,Z@W)J c Y K  Y  L ,,+*('&%$#!     +"&546323"&54632#7#73#3#737#7 "!! DJB :*N N*X9 1')%';***))*FL A@> JrY KYL % +.54632#7#73#3#737#7  PT DJB :*N N*X9 q   ***))* C@@JrpnYKYL  %+'7>327!373!7#yY  *y r3#)z 2yg *_e+fC@@HrpnYKYL+77#7!373!7#T9*y r3#)z 2ki*_e+f L@I pncYKYL      +"&546327!373!7#3##*y r3#)z 21()ː*_e+f '*@ *JK PX@?rh  pa  aYK Y L@@rp  pa  aYK Y LY@ )( ' '&%$#"! %+'7>327!#7#3#373!737#3#7337yY   (% 6 <0$(h D*B :šHg +e)e*++JK PX@:h  pa  a YK Y L@;p  pa  a YK Y LY@+7!#7#3#373!737#3#7337f (% 6 <0$(h D*B :šH+e)e*++w""JK PX@Bh  paa  aYK  Y   L@Cp  paa  aYK  Y   LY@ ! +3#7!#7#3#373!737#3#7337h (% 6 <0$(h D*B :šHw/}+e)e*++E!yK PX@.hpa YKYL@/ppa YKYLY@$!$ +74>3!#7#3#373!"&7;#"E-PqD(% 4 70#(|Q\K<@.v3;Y;AuX5f)ebJ>C9Ve*K@HJpbK[K[ L('#!  +"&5467!>5.#"#73>32'32>7!TQ H2@1V,* O/XQ$Df26&=-  IK M"31$:J%7 )[@X  pa  c YKYK [ L(&$# +%73!73#7!#%#73##"&54632#326?(5 XW  [=VP CWVE64#811G00`;**RI0"' 1{ )K!PX@9  p  c YK YK  [ LK"PX@5  p  c YKYK [ LK#PX@9  p  c YK YK  [ L@5  p  c YKYK [ LYYY@(&$# +%73!73#73#%#73##"&54632#326E3$*p CuC GvVP CWVE64#8+k+**_f;**RI0"' 1,/\@Y   J a  c  Y KYK [ L.,*)%#+3#73## 3#73##73##"&54632#326V W@W XWVP CWVE64#8 00B11G;**RI0"' 1/@   JK!PX@2  c Y KYK [ LK"PX@/  c Y KYK [ LK#PX@2  c Y KYK [ L@/  c Y KYK [ LYYY@.,*)%#+3#73## 3#73##73##"&54632#326ogA C;hB DsDyVP CWVE64#8go**4++;**RI0"' 1g'K&PX@3  p n  a YKY L@=  p n  a YKY KY LY@$''&%#"! &!+732#!73332>54&#7!373!7# 5jm XOWZR'Uf>*y r3#)z 2x0nIS1GMt>Ui*_e+fg .@JHK&PX@;p p  n a YKY L@Ep p  n a YKY KY LY@%!!!.!.-,*)('&%#" &"+77#%732#!73332>54&#7!373!7#?T9 5jm XOWZR'Uf>*y r3#)z 2kib0nIS1GMt>Ui*_e+f#.a@^Hr  pn YK YL$$$.$-'%##"!&"+77#732+737!373!7#%32>54&#T9I hm)TW Dt*y r3#)z 2vuADb>@MkiJ*]S;u\:+f*_e+ff_4Qe254&#b hm)TW Dt*y r3#)z 2vuADb>@M*]S;u\:+f*_e+ff_4Qe2<:953/-*)('*%+'7>32'7>323#73#3#%#73##"&54632#326>yY  yY  ErD CuD VP CWVE64#8g g **_+;**RI0"' 1&@@=Jc YK YL&%$#$& +7>7#"&546323#73## 3#73#w #9DgA C;hB DsD!%".K!go**4++[3gg@df2LJp n [K K [  L444g4gdbWUPONMJH=;6533+%+%+#>54&#"#"&'#7332654&/.546327!#>54&#"#"&'#7332654&/.546327%):0,6# +E_P3I !!+B/4<2!#4UE/F%):0,6# +E_P3I !!+B/4<2!#4UE/F$0)%&=7C[$#?.5=+&*71AE$<$0)%&=7C[$#?.5=+&*71AE$<8@5JbK YL +7#7333#73'#73' 6,E): C Rk+++5++!nJK PX@&hcYKYL@'pcYKYLY@ 4"#$ +%+73#7!#7#>3232654&#";Y; CtC )#34CPQQK',5&E3+*k-S< $E@B J aYKYL$# +3#73#73232654&+326'4&# FuF QL=H1/\K4+0N=8YPR14+*4/5K /(L\G+ !L:!! UK PX@hYKYL@pYKYLY@ +3#73#7!#7#3 DtC q*$wJ+*n_qT5@2sYK YL +'3267>?#7!#3#7!#%#/%#H+ M  DuX4)rA+v -(+U=7y3,**_"?2-DK PX@/hpaYK YL@0ppaYK YLY@ +%73!73#7!#7#3#A0#(v CvD '% 3 8+e+*f);m@O$ L U JKPX@Eh   c  Y K[KZK\ LK.PX@Fp   c  Y K[KZK\ L@Bp   c  Y K[KYK\ LYY@"mkfda`][JHDB><;:987653$/#%!+%3#737#"#"&?3326?>7.76&'#"&5&632;7#73#3267>32#"&5467326?3#"&?6&+C E9<.5$/17 #  +5( #"-,G1D D0?045.+"#   $ /(0!,B***%%U+2@*$e)*@/#%%9@19**43?=! (-0=-*T&&6+11M("7@,5JK.PX@6pc[ K[ KK[ L@4pc [ KYKK[ LY@0.$34%$ +%#"&'#73326'4&#"732654&#"#73>32"8K)/H"&1:*;N,1   I>/*1G0&I$AWBC+))A-!$=(-I<$(/G.!$0:/563O/8@5JYK Y L + 3#73#73#7#73#3#73 D CsC CZ`C CtC Dn++**&**_++:V@S- Jc c  Y  KYL:9876543210/,+*)('$$$""+'3267#"&54632#"&546323#73#73#7#73#3#73d 16XH0M  D CsC CZ`C CtC D7:*.%++**&**_++&=@ & JK&PX@? p   cYK[K YK  [ L@< p   cYK[KYK [ LY@=<7521.,$$!+73#73#73#3267>32#"&5467326?3#"&?6&#7>7T  DsC Du  E;+**^**$MOM@N# 4'NOK <@9 J Y KYL +3#3#73# 3#73#7= BtC BoFpB CtD {*_++Gj++*>@;  aYK  Y   L+'3#73#!7#73#3#737!3#DsD C0 1C CtC D79D +****_+++&(@%[K[ L +"&'4>32'32>5.#"^e)Jg>]h'Ii9>3N38?2M4bWAx[7_Y9v`==G?\j*;F=Zi,@)YK YL +!3#73#7!#3#73uD CtD  DtD C_++**_++:@7c YKYL$! +7#73#732+326'4&# EvD WYzF,xA?ZS,6++++<9Wk[?#)%&@ JK!PX@'pn[K[LK"PX@+pn[KK[ LK#PX@'pn[K[LK.PX@+pn[KK[ L@/pnK[KK[ LYYYY@!  && +"32673#7#"&'&>3273#>5.>4M26@=R12 M,Xb&HgA3I!,0=?\i*7##73##73#f ";!E> ;;< 2'*0 ?0;****1%+)3# JK!PX@+  c  c YKYL@) a  c  cYLY@/.-,%$+#3#737.'467>37#73"%4&'267> `x53(oB C B ^r73(j= B ~HEV3R!!IKU2Q%%&EH6]&))(O@=[%)).>/K%25Q>@@=J Y KYL +7#73#3#73'3#737'#73MA 8e6 DRC 8`7 ̣**++++**qeK PX@"g YK YL@!s YK YLY@ +%#7!73#73#!#73##3) DvD CwvC Cv++**_**_Xf'@@=JcYK  Y  L''&%&# +%7#".546?#73#326?#73#3#7Y1D)4(C B0+ D8A CrD + !/[**Z&  **_++y8@5 Y K  Y  L+73#73#3#73#3!73#73#|tA AttB CuE CsC B+**_**_++**q?@<s Y K YL+)73#73#3#73#3#73#3# CuD BvvB AvtB DuX3)+**_**_**_J7!K.PX@*p   cYKY L@0p  c  cYKY LY@!   +!#73##7!#>32'32>54&#"E Ct6$+Q D.0ASO(;'5,*+m*39Qn++5%! +K.PX@(   c Y K YL@.  c  c Y K YLY@! +*)'!  +%3#73#3+73#73#>32'32>54&#"CuC DuC CsC D//ATP';'4-++**_++**39Rm++5%!sK.PX@" cYKY L@( c  cYKY LY@  +3#73#73#>32'32>54&#" CsC D//ATP';'4-++**39Rm++5%!,]@Z"Jpa [ KYKK[  L&$!  ,, +"&'#7332>7#73>5.#"#73>324G )2B)&=. 1@1Q0* M/XQ#Dd+%H43$9J%*"32#"&'467#732>5.#" EqC C4` 2EW2]i'IiA_ed48?3M37?2N3+++**1V?%_Y9v`=bW  }=G?\j*;F=Zi?+4͵ JKPX@4h   a YKZK\ LK.PX@5p   a YKZK\ L@2p   a YKYK\ LYY@-,0.,4-4!-#" +7#".6?3326?>7.'4>;#3#737#"737#",/ #  &1"*2";Q. CvC C0Q"+aX:`JD.O'0&"M%7()>)*_++!fK3#-  JK PX@4rh  p  aYK YL@5rp  p  aYK YLY@  % +.5463273!73#7!#7#3#  P-0#(v CvD '% 3 8z   e+*f) +K PX@;   h  pc  a YK YL@<   p  pc  a YK YLY@+ ++*)('&%$#"!     +"&546323"&5463273!73#7!#7#3# "!!0#(v CvD '% 3 8:')%'e+*f)Jz+~ JK PX@*h  cYK Y L@+p  cYK Y LY@+*'%# +!#73##7!#7#>323#737>54&#"3A Kr8%+*#2C*5(C A0+ D7G+mk !.X++W'   hJK PX@#rhYKYL@$rpYKYLY@ %+'7>32#73#7!#7#3yY   DtC q*$wJg v+*n_%,G@ JK!PX@0  pp   a[K[LK"PX@4  pp   a[KK[ LK#PX@0  pp   a[K[LK.PX@4  pp   a[KK[ L@8  pp   aK[KK[ LYYYY@,,%&#% +#32673#7#"&'&>3273#>5.#"J 8@=R12 M,Xb&HgA3I!,0=2%<.! '&54&#"#"&'#7332654&/.546327%):0,6# +E_P3I !!+B/4<2!#4UE/F$0)%&=7C[$#?.5=+&*71AE$<@ #@ YKYL+'3#73#3#ErD CuD +**_+w #E@B  cYK Y  L #"!     +"&546323"&546323#73#3# "!!ErD CuD :')%'**_++@(cYK[ L"$#+7#73##"&54632#326VP CWVE64#8;**RI0"' 11>W@TJ    cYK Y K[ L>=<:42-+*)('&%$# 11+!#73##"&54632>7>?#7!#>32'32>54&#" Du  I1. S  C.(ATC';'5-"*$"NON"8I# 4'ILM#%**39Rm++5%!"/IK.PX@.W c Y KY L@5pW a Y KY LY@ /.-+%#"!+!737!3#73#73#!7#73#>32#'32>54&#"8 C89D DsD C0 0C E00AUnCP';&6-++++****-9Rm++5%JqN'x@ " JGK PX@' h  cYKYL@(  p  cYKYLY@&$- +%'>54&#"3#73##7!#7#>32N6O1:--6>8K Kt7%++#27EW'TPI?FK#91 ++mm <& I@,) 2 JK&PX@Dr  p  cYK [K YK  [ L@Ar  p  cYK [KYK [ LY@ I HCA>=:8'%$!%+'7>323#73#73#3267>32#"&5467326?3#"&?6&#yY  7##73##73#< 16XH0M  ";!E> ;;< 2'*07:*.%J ?0;****1%qiK PX@#g Y K YL@"s Y K YLY@ +%##7!73#73#!#73#" 6) DvD CwvC Cv+++**_**_e /@,rYKYL +7#73#7!73# DtC 24$%w+++*o_ JK PX@rY;LKPX@=KY;LKPX@rY;LKPX@=KY;L@rY;LYYYY@ +7#7333#73 | 6,E): C +++5++} @  JK PX@"r r  b Y;LKPX@"r  b=K Y;LKPX@"r r  b Y;LKPX@"r  b=K Y;L@"r r  b Y;LYYYY@   % +'7>32#7333#73'#73'yY   6,E): C Rkg ++5++ '@ JK PX@ r b Y ;LKPX@"r Y=K Y ;LKPX@ r b Y ;LKPX@"r Y=K Y ;L@ r b Y ;LYYYY@'&%$#"! % +'7>323#73#73#7#73#3#73yY   D CsC CZ`C CtC Dg ++**&**_++ JK PX@2rh  pb  a Y;LK PX@4rh  p  aY=K Y;LKPX@5rp  p  aY=K Y;LKPX@3rp  pb  a Y;LKPX@5rp  p  aY=K Y;L@3rp  pb  a Y;LYYYYY@  % +'7>3273!73#7!#7#3#yY  m0#(v CvD '% 3 8g e+*f)& +3@0Jrc[CL (&   % +'7>32"&'4>32'32>5.#"yY  ^e)Jg>]h'Ii9>3N38?2M4g ^bWAx[7_Y9v`==G?\j*;F=Zi)C ..@ #JK PX@+rpf  b\ CLKPX@-rpf Y =K\ CLKPX@+rpf  b\ CLKPX@-rpf Y =K\ CL@,rpn  b\ CLYYYY@ )('&%$"!  . .% +'7>32"&54632>7##73##73#yY   ";!E> ;;< 2'*0g \ ?0;****1% *7hJK PX@+r   b   cY;LKPX@-r   c Y =KY;LKPX@+r   b   cY;LKPX@-r   c Y =KY;LK-PX@+r   b   cY;L@1r   b  c  cY;LYYYYY@"7653-+&$#"! **% +'7>323#73#3+73#73#>32'32>54&#"#yY  ~CuC DuC CsC D//ATP';'4-+g **_++**39Rm++5%! 8KPX@ .JKPX@ .J@ .JYYK PX@6 rp  c  aa;K[ CLKPX@8 rp  ca Y =K;K[ CLKPX@1 rp W   aa[ CLKPX@8 rp  ca Y =K;K[ CL@6 rp  c  aa;K[ CLYYYY@ 20-,+*(&!  8 8% +'7>32"&'#7332>7#73>5.#"#73>32yY  4G )2B)&=. 1@1Q0* M/XQ#Ddg Y+%H43$9J%*"32#73#73#3>32#"&'467#732>5.#":yY  ~ EqC C4` 2EW2]i'IiA_ed48?3M37?2N3g ++**1V?%_Y9v`=bW  }=G?\j*;F=Zi? 7@@ ! JK PX@7r h  a   aZ;K\CLK PX@9r h   a Y=KZ;K\CLKPX@:r  p   a Y=KZ;K\CLKPX@-r  p  a   a\CLKPX@:r  p   a Y=KZ;K\CLK-PX@8r  p  a   aZ;K\CL@5r  p  a   aY;K\CLYYYYYY@98<:8@9@53-#'% +'7>32#".6?3326?>7.'4>;#3#737#"737#"yY  ,/ #  &1"*2";Q. CvC C0Q"+aX:`JD.g '0&"M%7()>)*_++!fK3#-4'4@1%$Jc[CL''  +"&54>32'.#"2>54&'[n+Lj>`l(Jl73"3Q8/P8 8 oVBuX3nW6s]< .I`1L^-#4-@*[K[ L +"&54>32'2>54&#"[n+Lj>`l(Jl>/P8 FB3Q8M oVBuX3nW6s]<91L^-AK.I`1>N+ #@ YKYL+#7!#3!734r66v66(D@Apnn[KZL ((+"2#"&54>32!73!?>54&G$T$%).=J@G;Jpnd_ [ K[ L64$$!&#&" +%#".54632+32>54&+732654&#"2#"&54632ˋt"@/ G(&C2LF" +g]@1/O{`Ke[Q05[`v,"0!+>(2*+Y=/+  ETD1/o55-J@G#Jc_YK[ L'%"!  -- +".54632+32>54&#"'!!>32!>/ ?--H1?=$KZZ;@S^&Da|+#/#%9I#11%? A@;aE'I&s&4A@>!Jpcc[ L('0.'4(4&'$&$+%#"&54>32#"&5467.#">322>54&#"$B_9Y^(NuMH]2$&J>. !]1Kf'A-=6PiG4^F)f[KR;3%%Dc<")G$:M(42oW5>XA!@pqYL+#7!#>7!+,GvV9 W Db}E9?;??6.s+='@$; Jc[ L0.&$,$+%#"&5467.54>32'>54&#"32>54&/.'&B[5_iD<!8M,Qi64 * ,*G==R93QD#>.?*; 331P9\BE_5"+D.GB0W;aL*-2A6)1 3E'7",-  Q#$4?@<Jc_[K[ L&%.,%4&4&$"$$ +#"&54632#3267#"&54>32'"32>54&EsUHe E,Ud#P6Sg&AV/Vm"=->3(@.DCCY;9"0',TK9]?"\/6J,632'.#"%4&'3267> db.RqBbd,PrE .$)C% _ 2*)C$ zrVOuvLW +%!UZ\%M !-&"X[\F?%(@%[BK[CL  +"&54>32'3267>54&#" db.RqBbd,Pr4E)C# 1D)C% zrVOuvLWV[-&"X\[&TW+%!UZ\b%@"a:KY;L! +#73267>733!73{ "3 3d ]>.  11%>@;pc[BKY;L %% +"32#"&54632!73!?>54&W-Nv]Y`%A[5&4(3Y]n7%.!ObKE.OJL+z;PH*6("FH@E  pccc [ BK[CLA@97$"&!$#$$ +%#"&54632+32654&+732>54&#"32#"&54>32'Ea8Vc""J4PeEL- @/C*;<.K#9L)Wf>9!  &)5U:LA&0#*eQ92/.733?3V$O N#tG0D\;2O@;&! JccY:K[CL#&#$$ +#"&54632+32>54&#"'!!>32$Ee?Qg#"L10I/>9%KZh:9"We8cI+HE&0$)%=O+94IC QYK(8K@HJcc[BK [CL*)20)8*8 (( +2#"&546;.#">32#"&54>7>2>54&#"Pf"K-]m ^#2 )2WO3bK/f_,ih_"6Aw*BT)1;%=N(5HhC"@pY:K;L +7#7>7!#7!TLf{?@'6A6_N; C93B7?:-=)@&; J[BK[CL20(&.$ +%#".5467.54>32'>54&#"32654&/.'&D^7.O:"O?";Q/dd87!+ **GDGMB/VBKh53: <-5U; +>(Qk8'0J1UE;^&;fY.6:G553A@TH)6"i80(8@@=Jcc[BK[CL*)20)8*8&$#$" +%#"&54632+3267&54>32"32>54&(_KNl#"R3Xd "L7Tq>_@\r ),?(C<.C)CY11EF&0"*%$WR2bK.cc%ork)?P&9>&=O(:AQJ-0@-#"J[BK[CL'%  +"&54>32'.#"%4&'3267>db/QqBbd,PrA - (D% ^ 4.(C$ zrUPtwKX  +%!UZ\*M%'-&"X\[QJ%(@%[BK[CL  +"&54>32'3267>54&#"db/QqBbd,Pr3F(C$ 2D(D% zrUPtwKXV[-&"X\[&TW+%!UZ\D%@"a:KY;L! +#73267>733!73w ."> 1 >.  11!2%>@;pc[BKY;L %% +"32#"&54632!73!?>54&o-Nx]X`$AZ5%4'2Z]n7%.!ObKE.OJL+z;PH*633FH@E  pccc [ BK[CLA@97$"&!$#$$ +%#"&54632+32654&+732>54&#"32#"&54>32(Ea8Vc""K3QdEL- ?/E,<;.K#:L)WfD9!  &*5U:LA&0#*eQ92/.73!?3V$O W#t@;&! JccY:K[CL#&#$$ +#"&54632+32>54&#"'!!>32 %Ee?Qf""L10H/>9%KYg9:"We8cI+HE&0$)%=O+94IC QPB(8K@HJcc[BK [CL*)20)8*8 (( +2#"&546;.#">32#"&54>7>2>54&#"Pf"K-]m ^#2 )2WO3bK/f_,ih_"6Aw*BT)1;%=N(5H~"@pY:K;L +7#7>7!#7!UNh~?@&6@6bP= C93B7C>-=)@&; J[BK[CL20(&.$ +%#".5467.54>32'>54&#"32654&/.'&C^7.P:!O?!;Q/Wr97!++*Q(Qk9'0J1UE;^&;fY.6:G553A@TH)6"i:2(8@@=Jcc[BK[CL*)20)8*8&$#$" +%#"&54632+3267&54>32"32>54&(`JNl#"Q4Xd "M7Tp>_?]r ),?(C<.C)CY11EF&0"*%$WR2bK.cc%ork)?P&9>&=O(:A>J #b93>6  R      F $ r 0m | >u ( < :q  Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo RobertCoFo RobertItalicItalic1.001;COFO;CoFoRobert-RegularItalic1.001;COFO;CoFoRobert-RegularItalicCoFo Robert ItalicCoFo Robert ItalicVersion 1.001;PS 1.1;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.1;hotconv 16.6.54;makeotf.lib2.5.65590CoFoRobert-RegularItalicCoFoRobert-RegularItalicCoFo Robert is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Robert is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Elizaveta RasskazovaElizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.lizarasskazova.comhttp://www.lizarasskazova.comRegular ItalicRegular Italic  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni00A0AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecombuni0394Sigmauni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Atwodotenleader zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferiorliraEurouni20B4rubeluni2113uni2116 estimateduni2190arrowupuni2192 arrowdownuni21E6uni21E7uni21E8uni21E9uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni25A0uni25A1uni25AAuni25ABuni25CBuni25CFuni25EFuni2610uni2611uni2612uni261Auni261Buni261Cuni261Duni261Euni261Funi2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi2981uni2B9Cuni2B9Duni2B9Euni2B9Funi2BC5uni2BC6uni2BC7uni2BC8uni3008uni3009uni301Auni301B commaaccentcyrbreveCR zero.zero Iacute_Jacutei.TRK iacute_jacutequestiondown.cap question.smcpquestiondown.smcpexclamdown.cap exclam.smcpexclamdown.smcp hyphen.cap endash.cap emdash.capat.lnum slash.cap backslash.capbar.cap slash.smcpbackslash.smcp parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.cap uni301A.cap uni301B.cap dblparenleft dblparenrightdblparenleft.capdblparenright.cap uni3008.cap uni3009.capparagraph.smcpnumbersign.lnum uni2116.lnum percent.lnumperthousand.lnum dollar.lnum Euro.lnumyen.lnum rubel.lnum lira.lnum sterling.lnum cent.lnumcopyright.pnum_lnumquoteleft.smcpquoteright.smcpquotedblleft.smcpquotedblright.smcpguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap asterisk.smcpf_igrave f_idieresis uni041B.bgr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni0432.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni043A.BUL uni044E.BUL uni0431.SRB uni0475.smcp uni0473.smcp uni0463.smcp uni0434.SRB uni0433.SRB uni043F.SRB uni0442.SRB uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044E0301 uni044D0301 uni044F0301 caron.alt acute.cap breve.cap caron.capcircumflex.cap dieresis.cap dotaccent.caphungarumlaut.cap grave.cap macron.cap tilde.capCyrbrevering.cap dotbelowcmbperiodcentered.smcpa.smcpb.smcpc.smcpd.smcpe.smcpf.smcpg.smcph.smcpi.smcpj.smcpk.smcpl.smcpm.smcpn.smcpo.smcpp.smcpq.smcpr.smcps.smcpt.smcpu.smcpv.smcpw.smcpx.smcpy.smcpz.smcp aacute.smcp abreve.smcpacircumflex.smcpadieresis.smcp agrave.smcp amacron.smcp aogonek.smcp aring.smcp atilde.smcp cacute.smcp ccaron.smcp ccedilla.smcpccircumflex.smcpcdotaccent.smcpeth.smcp dcroat.smcp dcaron.smcp eacute.smcp ebreve.smcp ecaron.smcpecircumflex.smcpedieresis.smcpedotaccent.smcp egrave.smcp emacron.smcp eogonek.smcp uni1EBD.smcp gbreve.smcpgcircumflex.smcpgdotaccent.smcpgcommaaccent.smcphcircumflex.smcp hbar.smcp iacute.smcp ibreve.smcpicircumflex.smcpidieresis.smcp igrave.smcp imacron.smcp iogonek.smcp itilde.smcpidotaccent.smcp i.TRK.smcpjcircumflex.smcpkcommaaccent.smcplcommaaccent.smcp ldot.smcp lacute.smcp lcaron.smcp lslash.smcp nacute.smcp ncaron.smcpncommaaccent.smcp ntilde.smcp uni1E47.smcpeng.smcp oacute.smcp obreve.smcpocircumflex.smcpodieresis.smcp ograve.smcp otilde.smcpohungarumlaut.smcp omacron.smcp oslash.smcposlashacute.smcp thorn.smcp racute.smcp rcaron.smcprcommaaccent.smcp sacute.smcp scaron.smcp scedilla.smcpscircumflex.smcpscommaaccent.smcp uni1E63.smcptcommaaccent.smcp uni021B.smcp tcaron.smcp tbar.smcp uacute.smcp ubreve.smcpucircumflex.smcpudieresis.smcp ugrave.smcpuhungarumlaut.smcp umacron.smcp uogonek.smcp uring.smcp utilde.smcp uni01D4.smcp wacute.smcpwcircumflex.smcpwdieresis.smcp wgrave.smcp uni0233.smcp yacute.smcpycircumflex.smcpydieresis.smcp ygrave.smcp zacute.smcp zcaron.smcpzdotaccent.smcp aeacute.smcpae.smcp uni01E3.smcpoe.smcp uni0259.smcp uni01C8.smcp uni01C9.smcp uni01CB.smcp uni01CC.smcp uni01F2.smcp uni01C5.smcp uni01C6.smcp uni01F3.smcpij.smcpiacute_jacute.smcpnapostrophe.smcpgermandbls.smcp uni0430.smcp uni0431.smcp uni0432.smcp uni0433.smcp uni0434.smcp uni0435.smcp uni0436.smcp uni0437.smcp uni0438.smcp uni0439.smcp uni043A.smcp uni043B.smcp uni043C.smcp uni043D.smcp uni043E.smcp uni043F.smcp uni0440.smcp uni0441.smcp uni0442.smcp uni0443.smcp uni0444.smcp uni0445.smcp uni0446.smcp uni0447.smcp uni0448.smcp uni0449.smcp uni044A.smcp uni044B.smcp uni044C.smcp uni044D.smcp uni044E.smcp uni044F.smcp uni0450.smcp uni0451.smcp uni045B.smcp uni0453.smcp uni0454.smcp uni0455.smcp uni0456.smcp uni0457.smcp uni0458.smcp uni0459.smcp uni045A.smcp uni0452.smcp uni045C.smcp uni045D.smcp uni045E.smcp uni045F.smcp uni0491.smcpuni043B_BUL.smcpuni04300301.smcpuni04380301.smcpuni04350301.smcpuni043E0301.smcpuni04430301.smcpuni044B0301.smcpuni044D0301.smcpuni044E0301.smcpuni044F0301.smcpzero.tnum_onum_zerozero.tnum_onum one.tnum_onum two.tnum_onumthree.tnum_onumfour.tnum_onumfive.tnum_onum six.tnum_onumseven.tnum_onumeight.tnum_onumnine.tnum_onumzero.pnum_lnum_zerozero.pnum_lnum one.pnum_lnum two.pnum_lnumthree.pnum_lnumfour.pnum_lnumfive.pnum_lnum six.pnum_lnumseven.pnum_lnumeight.pnum_lnumnine.pnum_lnumzero.tnum_lnum_zerozero.tnum_lnum one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum jkklnoop      $%89ABUVVWWXXY DFLTcyrlZt $ 0 $ b  p B 0.Hz&2xj j`T3~45{yhijklm\}YO@ ,(*+8:L    NB!SU&'1.)0-/49<>=IJDEFG2AHK?"%7CPSUXY[\]^`acdefghijklmopq{stuvwxyzr|}~#635;`az|~xnoMrsged"% >@CDEFGHIJKMNOPQRSTUVWXYZ[\]^`cdegjkmpu{   !$&(*,.02469;=@ACDFGIKMNPRTVXZ[\]^ab NORUWXpq{|}~ $[6r|"(.4:@FLRX`flrx~_UW gedf T$VQRTVWZ_bnLL ff  """, gedffSTUV"%!" $STUV"%!" $6",-MV-XM,L L[ (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $""4"styy 6L"styystyy"8Nd"styystyystyy$:Pf|"styystyystyystyy&<Rh~"styystyystyystyystyy(>Tj"styystyystyystyystyystyy *@Vl"styystyystyystyystyystyystyy" ,BXn"styystyystyystyystyystyystyystyy$ .DZp"styystyystyystyystyystyystyystyystyy#O@ ,(*+8:L    NB! $&'1.)0-/49<>=IJDEFG2AHK?"%7CPQRSTUVWXYZ[\]^_`abcdefghijklmnopq{stuvwxyzr|}~#635;MgedDEFGHIJKLMNOPQRSTUVWXYZ[\]   "$&(*,.02469;=@ACDFGIKMNPRTVXZX{|}~W>{yhi_jklm\}Y`az|~xnors> >@C^`cdegjkmpu{[\]^ab NORUpqU<ged{={yhi_jklm\}Y`az|~xnors= >@C^`cdegjkmpu{[\]^ab NORpq. . n4ystystystystyst UUn4st yy  UU Ir$(2  702:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz$ $i$ $i$ $i$ $i$ $i$ $i$$ $$i$A $Ai# #i# #i# #i# #i# #i# #i## ##i#@ #@i" "i" "i" "i" "i" "i" "i"" ""i"? "?i! !i! !i! !i! !i! !i! !i!! !!i!> !>i   i   i   i   i   i   i    i =  =i i i i i i i i< <i i i i it ti i i; ;i i i i is si i i: :i i i i iy yi i i9 9io5 o5ioU oUik& k&ikF kFi !A "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrzA@AkA@AkA@AkA@AkA@AkA@AkA$@A$kAA@AAk@@@k@@@k@@@k@@@k@@@k@@@k@#@@#k@@@@@k?@?k?@?k?@?k?@?k?@?k?@?k?"@?"k??@??k>@>k>@>k>@>k>@>k>@>k>@>k>!@>!k>>@>>k=@=k=@=k=@=k=@=k=@=k=@=k= @= k==@==k<@<k<@<k<@<k<@<k<@<k<@<k<@<k<<@<<k;@;k;@;k;@;k;@;k;t@;tk;@;k;@;k;;@;;k:@:k:@:k:@:k:@:k:s@:sk:@:k:@:k::@::k9@9k9@9k9@9k9@9k9y@9yk9@9k9@9k99@99k2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz$ $i$ $i$ $i$ $i$ $i$ $i$$ $$i$A $Ai# #i# #i# #i# #i# #i# #i## ##i#@ #@i" "i" "i" "i" "i" "i" "i"" ""i"? "?i! !i! !i! !i! !i! !i! !i!! !!i!> !>i   i   i   i   i   i   i    i =  =i i i i i i i i< <i i i i it ti i i; ;i i i i is si i i: :i i i i iy yi i i9 9io5 o5ioU oUik& k&ikF kFi"*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrzA@AkA@AkA@AkA@AkA@AkA@AkA$@A$kAA@AAk@@@k@@@k@@@k@@@k@@@k@@@k@#@@#k@@@@@k?@?k?@?k?@?k?@?k?@?k?@?k?"@?"k??@??k>@>k>@>k>@>k>@>k>@>k>@>k>!@>!k>>@>>k=@=k=@=k=@=k=@=k=@=k=@=k= @= k==@==k<@<k<@<k<@<k<@<k<@<k<@<k<@<k<<@<<k;@;k;@;k;@;k;@;k;t@;tk;@;k;@;k;;@;;k:@:k:@:k:@:k:@:k:s@:sk:@:k:@:k::@::k9@9k9@9k9@9k9@9k9y@9yk9@9k9@9k99@99k >AhjJ<FPZdnx",6@cccccccccccccccccccccccccccx}PUX^ckmno yst xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernfZbz     !#%')+-/13578:<>?BEHJLOQSUWhijklmnopqrstuvwxyz{|}~V|~D~F&*06<j&*****      < j  p  v   j   j      p 8       4 j t z      p   2 < B H f  * x  "T L: ;$>em'p'rB|000&$SE[p|$ ?dek d?dfo eg ?dfgkog ?[defeg?defg|g ?def|g#?[def| Tdeg ?def| g ?dfeg; ;?[w cdi ";B5[kbci ";?B[cdi );?uES[lz>mp|*wC"uf %0  d P-"#;I?G@R`]ko^::M';DV1; ]I    C-B ?[k  ?S[   ; ;?cd??;M)) Y) 79:!#%3UIM Y+ILXYZ\  (*,.0246IXWX ?|didgipTdgux ?|doidgx!< "?|iTdegx/ "?Bmp~|cdiTdgx "?BBmp|cdiTgux ddg ? ???ii%;cn>m|Y~dfmggb||| ??   Bj ]f;Bw-]f g TdegB|fTegxy fTegxdgydgxxydgx ?|Tdeg;?eg;?f{e ;?g;?f{eg ;?{#;ES[f|{Tdeg;?f{g;?E{Te #%)39:=>?BEGHIORSTUYZ[^defgw 348:<?KLPRZhijkmnopstuvwy{|}~ bcdfghltxQ`derx{NEGZcMAmp|brr6 .@[uffqUe\Xp]n 9===H@ZR]e,6G N~  $ u$$  !s000090E-0'000000BB00000'0pnyY4  # $ 1 86/-##))33>>?? BB:IITT&[[W^^ ccddggYww%(jj<mm=pp>ss?yy@ABCGKMOQUYY)ZZ'[[*\\^^bbcc2dd ff3gg +,FHDVT "X5CC;QQE``IddJeeLrrSuuPxxR{{N!970.,M++      6S5ZHHH/SSSS(!TTT#   SSSSHSSSSSS        S S S S SGS5 Z Z Z Z Z H H HH H H H H     0 / / S S S S S S SS(((  Z H S   /S599J999IJ99;919999KE999I993993J;999J99E97CCbC?QQ=LL=C=C=QCQQQQQ?=ACCbCQQL==QQQJ3C9b H  S S S S,, "TTTTTTT..........MGSS&'6612::4<:F:8C?]PCQQQDDRDRR>@B%%%%%%%%%%%%)*%%%%%%%%%%%%%%%%%%%%%%%\%%%%%%%%%%%%%%%%%)))))))))))*** % % %%%%%U[[[[Y_[[[a[[][[]PN[[[P[[_[W[$P[][[$P$$N$[UV\\^O\`\X--Z #%)3>?BIT[^cdgwjmpsyYZ[\^bcdfgCQ`derux{  )M? :$i:z-&H-B$0B22CCC$888K--E 66U-''66U-- 9 f\iA@vj{s st yy      UU _a 2'3~/=KgKKKgKK?KKKKgKgKR@SAABT OOOOzO{WOOE{{{ {X164======>gKKKKKKKKKKggggggSSSSBKOOOOOOOOOOOO{{{{OOOOOOO{{{{{{=O=O=OgOgOgOgOKOKOKOKOKOKOKOgOgOgOhOKKK{K{K{K{K{y{?WKKKKKKKKKKgOgOgOgOKKKRRRR@F@E@ES{S{S{S{S{S{A{B{BTXTXTX KKOKKKKS{>OKKO>OgOR@EB{WGGCGfGGL(CGG9G;GGGGDcGGGLGGkGGkC9!GGGCGGcG7w w"ws#iiwwiw%iii iisUwww0iiiiiCkw )GKRA{A{A{KOB{~~5y{{zz;<HHl:HdH8ws+*qawiiixxjxjjtV]n|nnn|nn_nnnn|n|nM}PPQ`]]]]]]]]]|||||nnnnnnnnnnnnn||||nnnnnnnnnnpn_nnnnnnnnnnnn||||||||||nnnnNMMM}}}}}}}}}}}PPPPQQQQQ```^^^|KnKnKKnnnnn[oooobYoooooqooqaI$o&ooaooYouomaoq,oo-.mammImo[\pprJpZpvee#styU_`a(b #6"{}Myxfa?/1 '' Rn mgg u'&*Br!! $x  no k00ihikkllqrttvvxxzz{{||}}~~  !!                 PPRRSSTTUUVVWWXY ZZ[] ^^__ aabbcc ffgh iijjkk llmnoo pqssttvw yz||}} ~~    HeH,j+/.)(*u""$$z??@@'BB0``&mmnstlyyl{{tzzzzhiojjMkkomm7noopp1qqfssMtuovvBwwoxxqy{o||!}}o~~g<ofoYoYMB o oMo<o:R"Ri8RNW[T[R[$R[WRWW%WN[PRviR2W9T[v[WMYRoieJKIJKIHmslwUUj_a>cc-ddff gg5ii6aUbVqrpZCp=p;#RNv_?RWSXSX\OQxyx^yPPDQS]TT UU]VVhWW@XZ][[L\]]^^__`]aa_bb?ccFddee ff]gghi]jj?kl]mm@nn]oocpp]rr?ss]tt_uu3vw]xxyy4{{?~~F]DE^`G^A^dk hiklnoqrtxz ,<HJLSVXY[]^PPbR_cacqfqtstvwyz|4$&,.k$MbyfaAVwZvtm-[JxT=tTc}  nY s$$,                                 ,,     !&-"#$%&&'()**+, !!!!!&&&----------""""#$%%%%%#&&&&&&&&&&'''(((((()))))))))))****+++++,,,----####,,,,#(% <;<d)+( 2DD3gMgggMgg5ggggMgMgY>?667@ &````Z`[\][^__``_IJ\\\#\h$RfffH3333334MggggggggggMMMMMM????7g'````````````\\\\`_``````\\\\\*\3`3`3`M`M`M`M`g`g`g`g`g`g`g`M`M`M`N`g[g[g\g\g\g\g\\5]g[g^g^g^g^g^g_g_g__g_M`M`M`M`g_g_g_YIYIYIYI>K>J>J?\?\?\?\?\?\6\7\7@h@h@hgg`gg^gg_?\4`gg`4`M`YI>J7\]L"g_YI6\6\6\g`7\;;EF=EF=<QGfffffffjjjjjjjjjjd\\/.ccc -01UOVP,ZZ8TaTTTaTT:TTTTaTaTAWbBB Ci888888888aaaaaTTTTTTTTTTTTTaaaaTTTTTTTTTTT:TTTTTTTTTTTTaaaaaaaaaaTTTTAAAAAAXWWWbbbbbbbbbbbBBBBCCCCCiii999agTgTggTTTTTASSSSSee!$$&(*24= DHJSUZ&\],.EK[a!#ZVX")T#l%BuDO! ( )$}Myxfa?/1 '' Rn -mm{{""       $$$%\k\2154/' .0HVVVVVVJVVVVVVKLLM-6nnnnnnnP!,HHHHHHIVVVVVVVVVVMVnnnnnnnnnnnnnnnnnnnHnHnHnnnnnVnVnVnVnVnVnVnnnnnVVVVVVVJVVVVVVVVVVnnnnVVVKQKPKPLMMVVnVVVVInVVnInnKPMRRNRRR7WNRRDRFRRRRO@RRRWRRuRRuND R RRNRR@R>e(eeasswggwew*ewsesss+ssawceee8ssgwwsssNue RVLLLVnMkk^_]^_]\;BBB3" <&=}q~rFGSSvESAS?)ea{CesssfftfttxbdhjloophhhhhhhhhzjmllloooopppppiiiVVVVZyyyyXyyy`yy{yy{CTyyyCyyXyyCy{9yy :CTyZ[zz|UzYz# mm{{"""$$#$դ'ZZPKwL\#  Llimit-login-attempts-reloaded/assets/css/fonts/CoFoRobert-RegularItalic.woffnu[wOFF FFTMGDEF<58-GPOS@HL=vGSUB9\#OS/2 [`crcmap (a4Rcvt h5 fpgm  ?gasp4glyfhvXPThead16ohhea!$hmtxh)nvlocad :$maxp %vname69vpost8$3prepP xc`dOzY6__78~Cm=f5c^@b2 xc`d``^1 61Er*:w4xc`aa7fbc0b2121 PȠ Ӆ/0*00L1^gZxHxڕW tU~~(1C96m|Ɔlq(>3┲0?DD:':*mi(3?"d :q<#7bCe ²HarY{CI%Q,[9`LcP  |Z#{eW .3}nig3}yBMbD0y,Jc}z^_?]}0G] !/х'`[un֝o1v$rOh}|w&I~!SWk Q~=7-F w6;ȧz>L ^Grwֿ|Ly<wiWKIn^sʜ(VyF^Sgio{ZОH1Hn!$ ܞdܛ^PKeIo8wקn|xY~z ӟX yq֜Z눽Z5/^a>IQ4,3/DY=U"JobR"QԡڙN潦q]2A"0P@bd){×vSq~!zy6>xh w .m 27x/ ڶ5SkSfNcf Bx 3_K&lViBmז@?^8}(=A~n)ļ;ʳtgMuEa;RLJ*tբ;WoW׾]m|[cCl~<. ~Fy/0-Cދt^9xpi]D1r6#5A[:d2?FU[#g!>(ԜԈhn} {Gmy^F̳pn-+ C@G:ĝ&ҩ+e2Cd]/mshu:@)E{3G ztx͔}Le?繿PR4njj eX)(Z+҅QjKj+spa^\Kܟ,ejckb۳=9g;gg{wb^T$[TClQBV~9,a9-JQUPz=B*VۓRe֖@m:]fM7]D`;һ%l_oNڼ4׿ɿտ"=!=5#1c%3b)uM{@dO+9&'FE)?WmPbXU$ĮSQX0PfG)וϡVן쟞l( tnmqrw\sg]OuOI`5R̍^. O ǺNsst:-r*N:SCݡBoCO2CBV;vv47o\  oGrPΡ1yWWNĨ3Fz?j`q>%89 ~g $2A fI %I5F~`8#L.2Fr9`Õ\EWX1kD:rILf 7q3S[۹;\q7p/әAdRDjgy l2x趖7mPV1m`;>H;f1f3y3 ȣ<)5xU aJV)wxмo!)h fBU`TGNgIk1{䔊_dO ڻ0_HgU9^<74WE%~A22-uok˦kCl Z5>s[Qr⡶ksJUPQ %QU4Iz\C5JU.1Bm]&oA~\n奴9}PŏO ]EW!5qM|qDq9RSǜ @g뉦h0.s1>sn|_2>s{ap9 bi|0A!sl02A9 ] mn}[X|ƈ/ bO bϊ#/H&%Q" >VO's/BCʮt )?cZxcp"(b##c_Ɲ  ؝10ʳ2h8<,>,jP8 &'6}Vyf>1a>l @1A} pcfp٨#b#sF5oG#CGrHHI$8DXqhKh`ߺw#f6>+xc` 7yͿnjbBmm eFWô\w,δ oE?xm}XnFCIy~H!$EcbkgSF,t&4bp,i89,;EFgڄw?]/P.ɉlOz [ATTr @TDBZg@L\95=8^rs K RDɝ\CRˠ>rgKhi iHNC=9N#UHYK^RS4%4+<_ *q OA1>C\K?7KjEkyo[Cjh:O=ʤ @CzeJ} ޏ?g2 LQ' {SR} BA(Z85y yNw)}$Y-$XV=d|Zl =w-p㾭T|"mD&87GoNme> }t ~'nz|~owS98Abs~GГɌr1b='ΑNiz9(%%>m*.s.~ Wu/D < -wrPw|엢>{uw[]]yxyȘJ)^ S%QjL0E25 djq^M-D {72.`G̟iyC82-:Zϕi%)3߮o;өX3^<}2BCd@'?A2k; a0pFȌ%qJfXb1Bf|:l=L ~|{&2[fb$&$jOޫq(Lre^| ySR74|o$3\f&$wc6AS׳hsɦޗK1PJR=K=Cg)s Meg=`Q/p>B˯A_o9ۊk R@F= c/XN[rRmhOoHNBݮӕ޺{$@G 'E?7y7C}K >/Q??r`C)'PS?0FL^32_(Fhb3>1r&P/'1(LFkEF@/e:ܱԘA3+g60˷O[w_ {!}-do!,E_|Sc1s\8_ߒ8RbroOdyq9szV٬d}MU2ZÚB\ );>TQo=V y$ 69󷉳>&fm=w]ƻO@2Ox?^Cr;{O3;Σs7{NwOO?+ 4>fsx/p?|\$[s |=^F/^*sL: ~ܤ-863LJK gxTJoỏ?<`! QA_|L=AYE7Y'UֲbYͲ/x/&ɺV.5y-[+ TNnueseȾ ϳ+ %k^CMdSIlSfQ Mp'E/d[wɶ]+w-Be{L)X)wlo m@@RS!'BtƆp5<ʎ@rّԊ o}Ɏ {x̽ |\Wu0~{o6f{*hfI3ҌݶlX^N , % %S-KMA[$@<{ߛEdY?˒5wιg?hp0o#12=i)hMAq.ӆ>77/?w KoAXLY t 3Ņjy qAp!Bq *b=yD[jrt"K͏Q-PmR^bB[@9wE퉽ێpzq_4Z,nkK{)b51<=LX_4s&?w nw%|ֻ7;Ddm2ݾ˝Ϟ`jqv`>d͛x~n$YQE@"Cz:u#Ňx~(T=i )7Lz$w> Gn+za>͍Ktk{o f|dj_ãh[KXn13 knCj_÷:0j!H3#F?&BF0p@L&+O d[*#mzۦ-oH( bؽhDč!%=Q$j%~ŠC e!ɝ~yz^Q5VF#9I+5AƠZF =ßjeBfw#hF^ JaM` ?w(-7?R>U,?)})x~dc(x+8,[s!Y8S;XAHBoYm4 V[Xӣǃm]_GO04fEp ߿?[0HÑKPV^!|]5;8-H;|@h;* J}=[/UX5>ua (lݵ.f'C jv8`SZJu"zDO!sGoXLv޺pnxPe 7{d.3s]nxG蟯 µF։SGfnKA.L`ӻpҋ_?W,6_,bYϓ8b( ;a6cae,c ZAC8]b9kx`F&h4m}s enΡT_Ϣ D~=%nX*={Ƒ/UB4óB0WX6 EpqdYaXXANB W*@"H0DBؓMCl-faдM|+7[l'Yd@>} ֛s'Wve{W{~ꑍgO'rt ͒k'W~ŷծKIKܣv@Z/j k|G.F7HeZs=`VTAT2{./N6/fJ؝}{FtCiA| d8 @*5u䷹: A4@^9:-$L ZY9&u\rAi>4} 2S9gr㟇=UߎC{p)m~o87,ef_!e ɱbԆnAa (f`Vð5x'=xoyX眈gTCٖC\n!G;o>Ŕf+]`nԳZR\<3lrb/#cPbB7r0ы#|<#ߌ5Qf22Cz #''x<_#WO?7V}h݈nC ^Z!C:Hd"]XM*!c bWE:VJߑ=ؿеxHݣ2]/.3jlpk v Nq}x15ڳ19Ώ9W x)-,b jb ;hyٚkTH,zc%80VM IWt.oI_lu;aϮӱ}=nLh5\H2q86н9^;>g`i.W8a;u$!%:(n@6]1,2rUCzܴ{w5yvkY#MCf=TnFK? AʂE~'(-E9 +SIJ?w4ɣj~EEK:b}jkRFpC||GwcE0V~=xaIiJQc!]Ufh=;W?| 5di(P4NHK4P2w"愅'QrR%bsFm(‰ ?R ;s )l:d[o2W*ɩ{'Ǣb(d6]Vkb(iquL@U-=@&>SX*R,#ӕo4/hYCCC] nOY/Ν/u権s&qгsoncjOSX;^UGrHPÆa4+,^4-5zAܛ]w59e hEf |,S6% 1씫&3e1qXb'F3zkQV^^CݹזNXܶvr)Zꈢ>8AOӰ4r PHpJ"e8o0`pf#ToyK`A.4*j'/yeF·dw|u{fsښKXKgq\a ;lhh֜x(pQ0 Ή΍ Y%(#kE#Z"aH% p'_\\bk=*1jS&Lച]F0@Q}. \)vWƬW.緸^ӵRVt8NTcEh_OHO$5~|LX1߿ }7<^#P6n %#:*bxVxq8K]$+.P/0^S}J|O.A.IK6V$E;΀5z%5"@8Е+#IJqUw;KVd^25齃h v< pV ydx DfO!`ű#5 {R txo) b,ak霖nWm9Բ`*{0?6BN۟ @(Jz7>y09S+G_uSLALrGqҙnY0]@mPSD@FsXeXnk4ʹB2 ɨIF_RP$څH ]"GKn;R9dĒYν'޸kxO}b2Skob0cP:0`wbQ{$~尣PX}g}[QR0 ^n*R/=Dڏ>tTB|mV yN TbmteddїG M6_?;~}ғCzꑞƟҗW~H~uz *e(@2wv?_V+rs/~JJ3YKXSzAYb_ )1X&6Fuvla<?0,}=EoKY ㅙe^"`/zi8_S7Նl24rt8}b4b]"n@<+ak\DH`swNH?\SOfGsK^lድFPYOaۼ;@ ,AÚi\K'Só&g}G4!4#hQCQʅ '!##PjU%^Yk8W-5n3p>4V9r(D=M2PhBɈG;~[?$>\wKw?^; /޳RMhQ<!|h v+ŎX;'Ǖ I X_JTϺw*Gwx"&]ՄS|vraluS6gyHe(,5K$E~} AjFzktV(edI0&DH9}xO#ёzo$s^ױfQ/{\FnJ!MCe-M=`#6ÁlyAkh?۾Z>(%d_E]8D,{=72#,R}N kifO q CnBvR\ع\pzrpnl؁٩p9<#m'҃oǩ 9ބBY;Ӓ%6;+?4u?Q%#}RM&SkTKEz]-,ќ5Hz㑰Ɋ1JqmS#D[=foȉ;- K2&24#ݜh_M;llD; wJ"6Es3O%"Yֻ13ԅ$1P) WdpF"SOz`q%2ESEz^iZSnbN1l`.&8-꫎DBe_%*d?xcxz u|s แ7\DfYN>0poLr#}UyL,h. XlA<0$WǸ%+dmRQQNƀ)F:a^;<[b3<`x s8*D]`J)C?;?{ԙ9G_O xip$NY M/@^}CkV+sM H_A]vA/锪<*ϭ-dJj<{uά^ZMҍo;l>B |>R?ZBE`;0h g:~ Bg I|^kN]\E>dPP֡l\}O==Ľαst[,wa<ʥ>FzK69i^Ly/q/p#?Tx}lH{!noqF0j/ d"DH-;ҤjC̔d%NFpL7v vco2ok+guh&0~ H;\Έ$X8i uP`6҉BW1=+lCD"TxM6mƒrD{T2b^abePqOgV F:H0_U4Gw8AG$ֵP[rԪ*&nVqN\2Ӵ*=)PX̃Yk̚F.Ysk5 3]F\Yš`[L|9-,Jˠl}Hqtq"]RRH벳pxDtYgtǭymޒM2+0rO:{e|4 z ޣdh  [v&*\8Pm084ͭv.k/6^3WmߞlmxҊ]#A><$Faj~wd*r]6겥1SoO1mUq6rYX9 o E|H=$$r"1l9L!6(qAVhGY-TF]Dr+fj0W vKۍvdspȟ6$M[ V"3tOe5$ioUMX%6r7] )FVC͟\j[[ߍH" ҶD$#Ey Bg3-Y > er9߉gfHk,V+ /<35=~OZ[q \!5ue+ T ZCf>%WD1͟_lWsGBr]$LXDhcdk6ѡ]1R ĥQD#p/ Y 65p/ނQ@/tmw73;'CsÉc@b8uԚ>o$jǍ\oH g P1G6M+_\X:Ԟt],kR;5/KϫVz(C?d䕩G*dUx)=۸Dip⮼Ė1|`g†Wgbp4^_Q;G;bBsMbl޷p*]Acf{s _I9?`yXu@&08gE${%NX+qȶݟlF)m0|Yڻ\Z r~ُ |?zrv@,J766 ΍N*MBϏրG.[.Eed3.IZθrQL@q9 Pf!ǁV䁨ţ@ð% K1qƗ adbl:|p8zkOo-_ x%@  a] f] ڠHNm?4H÷yX~\*C}L;%, B7iXVwACA-N8P,sb0!rmܤ6zZ]Z|7Aގ1?=M֐fh$qql׊5EӜANc_}uB" /DvW9\SG쩟Ebh)%FG(7jCf1s\nO%-|5b4.s9b>Ȇ'{iF?7P:M1?,% `G)n~ScYFꁣTY$0Q4R+|N?U,vSs;فl? \PHyn(Q*k}l O,Ͱ)+ ,>r ̓vJ}{>L!|8x"voɂAL:SyB!u@9} 9g !砊8.({D2uNߧp:c8F'6>H(ZDRa5R8 D#J)qNxSPF_;?{E>7J\o6>'쟩j̝l zСslPBvi(L3@1Vgo DI!8!b@50B̷k) EK!/AZ:A `<&A7@߁fru7lJD|&ZPl7$: BzkץgOgts!_Nۥh'0o`Z}SU #rp<Y[Ċy XI;/6C(Z8SDx&@XBr ]{ni07^/6]W! Q"6d,] eDlMvau2ΖaS4V"OoƕˌǍР7-b]Q<";w,NOMNԪ8S8fhk=/[*g \l;Ӣ|s/oIClp<0i^{~7/N8F iCyayҫy=:έx{8/O%=7m00*r&7ӣ{ /]Z.hFS={7/6yHl8&W 29윍) *F.?lyk @~c[\_x`*0AB, XHy8@U O@t^w1JZA~', dY^I%dx DƇ(c aTdr|sɧ㜱qD&jZc: k%mN."-W+-$꺝b NI|)R۟:) 1DtQC1xtu8p>,p*̈́jgH8?\o]|,gjhg6=Q5<1TބG @OL:ZI!OE@QsJOģ*8!r[+66;#M!qx;;g ypßJxЗzBr5_zTʇBd(74D"D&g}]p R ;J,,wuN/2JLTx(49+T#:sR(_P[%[HØ N.iP e4}_<sdOf}+#<Ԓ_2/d9԰YgS͖!$rC[s8e3ف"BA+}*ià ox@x]h^l8k 58lqIH'dr3ʰ,m437sM7:\ ߸dh_Ou~5ew?ENzS{.=-@|(95iEJc5ױ?5N됶55-; Bn"/p$_dx&gU8;p-Ul;i\@- ( d2s?9:J2Ƈ}ׅNH7`"s< ώ"H9s j5Cܜ"A9".Zh6ł&TixRf{8r=:_W|…. =0OVzOpVO(-wYĢI/P8^$ՊuŲ8A!SSq*&o85|"W^6 /xR)csj;!*ܒ;߆&kppgڲ͆u*iAq 6pw+N*'}`Wr 1P<F=gmV|b*~EfP7Ϋq^%Psiw(EAh%˥*d< f j Wb7m! 7nWJǨthJ`64@4~6',qQiwkߛĎ8ni+d핒 WBKQvG8u,^rvُ>}6qO79}ql͑SrLo qHaHI;Tz$(`Rҭ/C^|I?yx\Nb;=^7f[¯÷˃PVdс J4JB6t֨.Xl:>V]Ncϯk{ /6Josx*ϻ9mwǕź.;jMV\UExWSqH%JGq͌!+QN+Xq WG֋w|s.H)soiIfy2=ږ!+B9D )^nNʹ\^PmSP .nr67^sp[~pB?L92ͤ9l !2z~')F0wO,KJ"$) B1#yݯ1M\B}x2z*V&SQ0FsTo,Lk;w.$#=#p)R,&\0m. n[ Lw.[vZ{2p˶v?K7(KӏVj(fV^OfX(~5"$' :Jvx;pw~~wz~}Z7\=֊OMBsarijib|:WNGB] #L6t-h9^5lXOqnC㴥IdҚHՒrCszz],ū82?1x-O/QV4AVl(82^.K8F=pl53io[.;>fOI_\OLFtq{t5?5xmOUZ7; r ,DHɽbHt I.EK&sh8)GfWnaVP}P1itȚ>aalv?q`:79jP#`{L,5Ű|WWO09Oqi@ t@lݐ@ fx,,q?G 3;q 1 XX &,ј%|fM;wVy dֵٹvZ[Nr qPInQց# 2MI8̞qaʥ_U铉D!Y(Y?nލbzg-7iD줅2-VxVhhHpA7!HțpJH8dEV" % k|b+JA[S!4fl<hy(j!6Y߭]FV*k^RU=tꮌؓ\Ɲ[Qrw-#C1UT$C6z *R]T a9fF\ƶR&Cnk)эDZ+xx!eW|$:7F XtV6Cd?N=oɪG6lF6FK7*9ޠdws#O&W77^bJc'[W^Av7cp޽!E;ӟK={/@׾" ?[g?\(5HLW7kf=86gxǀ 7. ѢIp{ T=ؗ vp‰sE-X>g&',w&KJ OR^>@9$o(fX9DV`Ea㤑8D~$!2Ѳ~_ږ@/l5IM8lC1bq>mbb@yW:UȥJ_nS$0~o2<N8mnE0 LL!c//rcucp4ʄsL25F|WOc[ҳkX޵Bxrғ}kp&/IÏug5%箦&-:nky5=L)"9S'!s(]Pzmyjh3Mw1P'S0q>G,73HIK߸zVzLA7 bකZ V9@-2*yz%"y_WJxdx9 Y "V`!-*/427r=ateK'g݃ ^9&bUwwgX!ѩ*jr6 G3SFkixfgxB"PE!4<[ۯW #d ^~b /J+ඟ&\9UU]]/ZRZ-u%vubM[X3xAmVY C&`BB?$ $CQ?KUuu[8??ԩ|[҇xBq:zhpROcH=m.zMOij5uO (qOXlQ/VWZ6쎧GH˷=豨jey1R~Y! bQI,kf afy]D4t[Ij/Gghdad<؆nk܃,xPK$TN9El{P-& 2}B=| |u*$ ?*9w-]bK"_ 0LdQtU2d` /oz wNL(5@V3jCH.+v5 W$FY0CA\rx;U(@]dz هؘ\h! n&dYTObi{Z3EEO,Uii%'gBN4fMߠ!zrSfn2SE/q4 ߸v5YS>Hi(2x DcD|e8v@ fq'IkR֚F -)A'0CܗV')5?uq=~t9,Ǡ w4 o4mfg-:Nj`[iׂb#h9*.]~wKnNoE,vMi0dwBp;D'gyԬqy_1(ARѾA g*ӻ/oR4ҽ*3.^ʐ @`uE1F / 6uO12 :TЮ;*e=RFzo2.0iņgu@ f,$Hi1m8#\6`ZPFa,\!?6'ɇ{(1=#ӓË#; 3a[ߋtGw#u!t77x:aC~̚-%H0CpGBՓt]&|62/>*,C/"rzWPt^Y낼w d1Ѿ u,1u;ZIut^a<%,b,ݝInD-Vj^BJwj%]֣7fd' X,7U`P]hF$:O@bDi\aZb7:8s]\B]0Ob'QZBs"A$ M gy r$ahi32 eYoZHڟ}^썱V $tFՀd5g%yq|r'᤭r8Zw9[cs_u=Bj _\wSRD,݅}C{V[>Qb^β֓!( :S\#ǹYalEVz\(Y,E\{ RG[}ު6TZ [:ܝŏv֣ zm7 >E*BvȏQh T Ąi/QBOha4$f"0MH_R]YY-_ sت&lP6God`9s[[Cv"rO RHֱ4 `.w au ڽD$Qk#0u=/|%<B.ᑠ@0i5 8 1^$51Zҭ}\#m"'CHj喀pm%tqKo8>qޝ-`{FND[B37~7^w'wV )$fť"|fF0 o "U^MϧWVQC?PS 㳴{reTi]žd 1#o['SD7?|j')$qLRķҏnjwׁ/ېYB4ո3U)h5I9sÇ~n: 5VvѠ`*AAkhpɄ wSo7߿UNډ}j*%e$Kua`D,TAv`<sSX/ b[єpAzN.Z\ruMJu݇=xA5ER05Fuv;"vlM<-eNA*^D8R8,Tta>s\Lh DGz.NǴ~~uP8HL쭀OuHv^V,1Y(Mɐ$$QTSP 9Uox(Al8qه,=z 0;N%"Vu>ų\R7ze 4ď*?|'{[ !%K%S&"aq"8{J(V:_cn_c aS%Gvg䡟1 03 -iF{ko ^k);r6>ORWsGf?huh]Np s±֦tw~ <`,w$Gԍ,jv\nZO | L,.g# VmPpcZagj{@ǵ lҗho"ਲTs w[ 3l-_ z^ Z'!\Ի> 0uzGѮɫI[U^|4`H.~ '7 0@jk-?+J}h WѶP=GeP BAHQw&&-ilA.$iW IdBXȍ5+z-Ffi_̥/3v f;<(QH^VS7('%a\\uYÆ˖t5}Ճ&!IX%8Bp1kTN.vXhgT]+֠'c[+8H' aZ qzDyӲ`{zfw_M\Vzwy%9o(Apf(]s֑CF 8f̂Bkq5*`7R(U&&ڛ"WfB)C!5Iʜ/ifx}C;~ ~n&3Tƨ`EQ kVw5W8k;kFODz1:A/|a uQzgb%gI%H{[^d[7LL:k?:٣q.цVG{Q0fer]h5Fʿa_jRnK- RJiVnU gz %gH-L(c$VX%%3d1Sr9?6jx+S`Ir]>KzY\_,_߸x 22q||&^^\d/>u29)ycȯ"9/?9 -jmlHWIdfJpN8-E:'`,EIeϑ#KӣØfۄ]Zs,MJPpnw4 7<G#0l/7ב%ؼk/s;Y9V~QO{ RCƪ X=(`+|)Ab(绯ȹ8swgǓ?du~SD/#*_ch~]U"l4ӛDFd\i1NEUȖ "d,f5<mPc$CNV x.iEQ$!Fp~vR(:өx4;bSVȪZLv_arCwv\n^p4Kn[,E -^Wp]|+q\k!?9[kSf Z$kuF:yi44pG3Bgfߙݾs&)Dj]2 lx,HM2 jmҢn_\-4X!7+( kUTF]4Y%¹L7MAurI1>LݴDJvG9݂,U[H\h%[-蝛A0Nki}4 `1?ku$cՁj4YGLsb>\ {-J% `MU)͌rGNaN0?^]q3\ p"TOj:!|j5bDy퀭Tȶ5:ZɤX5qv}ߚD%?c Rsiz0V4}tGl3޳d[%}Kmk7WvϲqToU#?RcK9tw8T&+L3R}h [8ٝf~4LvoWW)mߌ1w7%o4>Gz2&gࢀ1HaBCz0)ٰY`Ib_:n⯑G"r2E7YX=qê܎IBgw zpݧy3octуM䈜5.P0j۩1ƥ=ZbU9WΝvq_Zbh쫼UFFVfr::ṃ_P0'Ak]WWk+-In07*cR39qOk9(s%vQlx5 WY3$- xp*9qsxΉ)\gakDI`f XxJ 6讳/u_?w$ۤkMi& `N)ZF0@ii)Y4_I6,*H.swMcx؇:i!4s*L d z qk~\~}=AKdhi[UivzJiK=m7zZ2SͫzԶ AE" +T3B!yȮ{9=K(!*.JLYcQgV<~,7|^#irgݳ!1E蠩3Tnvn;@z[8"gnF9$CN\81x"@G/PNCKzxY  k;lHYMv몢g,x.YWg "ަpP$>v3MXn++_џJqHv_B~yEG oYMW|ZYHe$q}{#f::pЛSґpfBJuha(vN-fvPa +?v~ӗ-$6m-y*="~7JZ_%Rąڛ|s|ޜj O W{Ñ{^s[>5uLt;sG^}5KCo8gn9w =O.wL{њwG{4g=g\>z9y 0V@YN53%Mu0?  -5u/W:xGt r⡺߉-^O!J%nYvlmO"@d #^E[ϙ84mx,5)1 +cٍEEOv06縞C> 4M0?0š-#IE1JG/(l*MKKy7lxߍ'[?d(,c.}2aL qo]8T\h-,6a&Cِpl<ڍ%1`7L쭋s}%"]\~4υ|REZLsqk784xcMN`~癳$[cFeB W@wYDWH%fݢA$0\3ֱ^kZȐurM׭^omlռt\$zhxBtgz`ⴞxƙtBI$s g uc樒Uzt,KC=-XہLW)${NAdv: ϱZ,RkGqa%qx5UL_X!^ wu8W/ ~:+_j:wr+ ޯ=$"*."m?0cZY9PՄ+m-aq 0Bׇ)7f,:?́ V"XE"TfV`Z.H쮞^"O3KÃ=mRAQRozlf Jm`Cbx_"=z`VuA[A+ps^Ej \%U@޳#f- kw2H.ĝ"w\KdP')gv w!rc A,滅.KW6!Xa )ˁD]l!511A]ݗǫhյfU3Wq杖/5V4|2fg1ø[1C"@bH43B$kx:lNǝt|g>үV"oI/$:mTtfCnuQ&9 B?%%ڇب?Qe y hT?,yl]~~F{{>㪠nF9^Г14I߂3Y,?A OE7# t.)$eGX?Udǿ_m29t!Νn]Zͤx}]X,BW %T;٥LvvN`2 &?h|axI&#D}]#ߵ+GFWȭp͛')tݷFSãh:u`epQڿO]{TPJ ~~v(}WA5Zy&Tk_=֟a"@}=PY0La9 MϟLGܲJTVt鮇zw|/:-OvBj>jFv!tܕ1!_hp1ncHQ#]`청{Wxz턖H}xCc28݊h8|{JJ69:!<ɼIobCQ 4fiR?NX24>v͕Oךqo uI$X3"QM 213#$8R%} -39űPLb)HY؈ܭ$cy,^ jAv7Xq $혡C rҮ7* Sp=ҿai0]^mU;Bm?-g`Y5'2 r01€~:PE"f֎ԝqlUh4"\D+fQ@`4"i\\;qj&6zoCSƶtD+Iq_Mt$VS(+v9Kc-:>zSpz_?"`.)OLOJN6KMgveVD^uunm}/r>̷p[_~/4Z9bnMK|MˈI>1,t1 kLej Egct_>s,^?o)_+Roz>5`ԯ/1vG/Nǡ]MJ70bX[ai\(?l\O! #>jHs['}ކDz(bUAr8<0"k7hfE)hQCx#1 DqX㈒"[gt* b|Ē|DIj?BFQK?T)Z :Rb``ehZ-0*z!_5ŭ}|ǹd6BCf=޶шxPv88N4ٜ^-,8>1vE9}?E~Re]6ֈl,+ "xV nCwᨰAa2鼉dɯUQyj>M _4.##2rE9M2"Ŝ l^2D$nX ZeŸ̬VĦ歷3׷AKD]iYn}4(|_xgQZOt$G:΂u|'V Zkys"g7ЖjԀq+驉q\UrkdaB cXj2\E)09 l2Ľ1¦FM5<a3.,2]_tn3SJKǭ᫃wGirxB"¯|'.ߘ=h+6JMth2d`~vqm:0oI&QЅ(64+'a8 *J&Bc` QJ|eq_)|_ ^g"ubAm k?ԑl6WG<mzx/p=EkzW$znJZW& TG +lεl]7&mN[Xk2ZG VQ/ Ec_ixWV j3<}gÍ_7EF& |ZҤ26:<[f7En|f}ݕeW-sA_Xx]j=NV1M*eun@d lv%b*$cڅ^y,ky% f9EB+i,VaEo\M&!9`T~63x xM[v>a:6C80󠒒޼3}wvw~땵K sà wN$^(Q kjM%H^/S*M ޾dX0%/O'Jc˶wwI6RpkPS#D']Yl?w M=}>TX>s3;D8$]~Ty '쇢YiHP,W+VQQ$0ޕgΗ3۰aSR@Kb"1 3iymWD>"|s^pqnDŽ;-\,PF)E$:6ldA~7%V> kj hӝHc4:m;Vc~`Y+/tosA0 ,PD_lleUVNWxPƌvhtȲ,ژs$qUkfOI+=7:#x鶷7;Hgbqλ Ɯ)nX9[6 ܎i@x,M!7 ;q$B8xI)4=(1c|:]/cw_ l[*"#&+,0#5#ٕld6Y;$i%~]UE ?&(WrӏAEtyo!ox:~N'&[)r(g ]`j@zg :#ZKv~L()[S7:073= @`#TƨށËVlAH{*t@U)0 *dF̸b fLJ:_ q9lVb Kz/\p~nS֤uX {ZڇcITl+,|jlKdIU~祚)4 L˙p,%yӊĚ/TT53\c쌊)~qoÆ!-~7EBF$sn7;OXgn8q#K+ +D]  w;s\ܵ+UL\G^ʈ#^+sPCƖOmFᚉ" ek+9kgOT&*nW{Ñ93C䕙8(qgD 7A ^5_ʃoyӯy 7d.7+6gi"x$L?`Rj}91jSzZRo8jPaDccTDc;u1y%!!L0O,H̲?$[.w[4)&,b6|U.馬*K­ r &ELĂXdiC-&HBI@)f~tnJ5@*hX1A8P8~{?׊usx"X~ipE ƴ``چ1V!ujgf\ ,}Tԫ^>9 j''|rWU-&q&\gH%hBJFY#C<&SANZT=EBJXZZU8~TUsiȘ)C?0 lݚVBBcИ2գ-rEKm^Pgr9C}k6:= rmW'eB0,4v,d6_PRdCh xh# ݍ Hm?Gn3fe8,Gj!,JBk 21Tej"q|?>?x;a5f:0>rXn[Ź CG3NiJ ~˧;*7z!:?Ńi ?@#*`GfIj|xªSe]7EƷiU YU pM/ ߭jtkjo~FpIV9)`<.,:ȣ RE[~Ûzr`YHcFUu;QLJemx? :SÒ+ z2q+s+6nL#Wy\սnf ~p0܂E'7+T(:j&! ƱPu\XIqCPM Ӿ;q?Ј# Z"3%pN:xkG}ggP֭$rw6bw7'1t ;rw[?@A I3&nt0'_a R7oa>掭w3MX^戝F0 bحr"Mto~"!/w_^ڿr"GQUtU2O?ki*#4U=m]Sj5ӁٺL?z/?z/'ޫUAZ?v#%MN14_ Dgg;XE{}%COZHgtVS^PdE\k"*ɩTDh!da+);V324\ Uw\ry=k9FS=fivOJl8^I8Ӷ5KjFȷ: ]@,xpVh ̸źM\s Y#%NmҘqlfxIɨKLG:ex$zin\Twj^]wv.m WMPڞf'oj! E$ƀ>`KrZσT/pv_jǔ)sSƭ:4*a!Yt1@,2 Rg|[zPўm\iY ?}'' GT{4tX' z8^}\P> ' ^"wԃ[4F.Si.%` R2eOڗ~p\cwR(d$iW t hќVf%¨ssOc`r8a3hGIcc9 Rl]&:a#Z,TUqy74f E& +^%noepU7(@/Üd^]8zoy&s߿NJjc^"̎kqXWZkpX i+|`Æ~y/ *!Z0kH7dsVn$]g䲊̫9tϯ.yt_ #bJ}o0RERe?MFЌ7S>nxzFkZ4 ,\JrK9v9N-bSC52~}-zP0&%30H /]B 0 Ky 3py|יq:c)lQ 5,4A{494'2m'Yoh7 ]Ih; 3[as G 834 uP vd5֖Z!fq!KzрU4 A{ R/} (05{.W4U9Ѵcfu{4"]5M]xM_7Q]ɫ abU.%m3kx[fa{&XD>>4"A!eQnpt +\TN̳ld~hOOwl’o38>A:GhJ>PwCB&iji F[ޚϿ)kOW' hZLYi| 5",zˎ'MՌKdC;5M@9 \8m`.|2dlXhvW )Lu|nRjnӾH5ymv6ح@*f-fIZh:ow `ؐbC.ooLl"JO/ O}=Gl$; 2|ɉLxQRgZJSbu4u5ƺ]۟ED(ེ)w { mUOt3"|<`ߎIqEb?٦}e"/q2[8L0t 7mV 'RIDDt9lƊq%5 M&'K1W܁gJ ;_,`d`;}>#V-7<@P, VK|:rL<%]r{ͭ>d26("=`,s94KS]aLKӽő.a;SxTI1x '>`~D}]ЌCfdʘR¥JLiyѕT̄"ĂHdߓf;ɫm_{H|_p]39c9gH;:x%SE!a_ћGzh6χa\5 5?L(6suM6ח~:l^;W!T\8;s^cb:C#]7wҁ>#v"9aUFM\o[7(3y1~~qXWW2}R4M=. m>W4|&->25=f(ʛgW3qjOA3Z`4/Ak-+d "G[Sf]!|[Wxx|79a댥,Z9qO_ǓPJ5t%≸í:hkv!ga;lgo* sO[qgH;r3Y9W!O\>{f`H(9GOmϦ ,[dh+Tp2'ңlA`q9Rߌcԩ%KL6ISw]ؚw1q{w5lS]sVN*WS؞"U֧O"ʊPja|"&g_o'vf:;{tfY#wv՝HIt>́O*RP",% &on!y%*KH?AΉ$N; kKJ ɶLO{{@&2/xhoo;FHg=׵ǚ3r,^"pvP0U4fEƱ-*\޻ [v+alMѹUM4j> PK uG.^[GC_B/*L=3Ulqw8}2o)mML}9ssuL3cی4D_e#ffuJ}ǰEo4I~9tC`h&O^eeិ=3WJxHg~ ҍ5K_P6g % U@V= zL-j qj5z#JlՂ<;kӷLw~ۇw܄ǕQ"T "N1N-Zau?HcLy\9녜[$QJLCe6\xيbkb޵W܇y` l?gEIh$4(Yt XT3VxI$|#0 u-)M`+%Bύ:xI<,V$J" Jt kaM8Иͳɉ›o z>tq.53󶣶rq̽tpysxym^(,6j/vu rmۛˏY|5vGD+ʨnLp ,G|T4LyXS@%? 6j<~/$+ C7U)y|u3Oo3 =0'+Z緶fm:/( 퓻ԒV꠱`]Pݝޭ=Uċ&4HẃK':UVtIhFA$rd\)Wq]I6MW򱉞6$e0ҼH^}$ChӲ˽5Tpg2kZ_=k5?1,ޒ GjI] WO|?zA~ ϟGχ^լgLj]ONm`6` ([Л[ ,%dy&7l"c 3vB}#+ zu,{ w !^g2ѝM% \.~{M{u-Bl~|0>~0]gn-GqyWgr"|e7st;97xDޅҕ,]GWiWErGCEڛTterڈ.lP m;݊$7V/rh)\ME/cbi~dǙwgz#dPeBT*NMW=E=XK=p;=PŞ>?R΃.k 9fpATB> R]*TV @$k!Э.&Jp4D#r3 b8ԍm)yNL3WDo:ELr4T?J$Zwc̤/#Iߒ^qEp8ƽHEoE0H=&\PU>@j6J,3 gwQYQKa$#<;zo_nj"C"%,'V&ܪ9Ҫ9O*79'64ˍ.7 ;=9ӭ5'̪WYQʭ]wx@bL6t .j@C*Y.^MgCn9ѹ'pͤ!du8 l:.7_AlOm봏jKf<;b}%TA\V3uۣe I%:mcowf#:Jɗ/i\T!fyW|fv E,lχ}A4Lo|Exm2ɦ\%v ̪-E& +Zz[c1&s5 Q#Vm!zr&x$h)E+Gv~6l7Z]$Xc15q5kidфBæ=3Nw@Dih(Q[,=@glOƅttP/˼iޛOW3پ']}G.Ew 'J& f" `n-+48P(IK <ٿ?=2؝n>%w %|G/9\,bNᣜ#=]B{|)m'uf?XT5:cS3LEHQ~ձLDi)*#%E*%HMҲ#VUUU"Noޘ5ؐBy#Ք!;(dlƍ9O?T́STRŞ.?rZ~F]HO9x:vZ xyM/CZ@,-NZRYDQ7[ʹmlvT{qQE(>^KQh1^Rt"9W9yꯟ8zI*wT NDs%e !Y$ C3@4p-ijjGw i6ڠ-4F" ]c{]fi_i)=6{n_lNbqegGJN=*e&8W VmKl2T$7s?s#J񦋯8<17+N zH}0:g=< )Mf"r"l;I榁X(h蟳V`Uo]B /oz`vJ(zDН\^I'4h}{#t,Z$ݸ rળ>r^ C u-`h$@-vYI%kz]@qRɿc[!OF_p`5.~Tܹى18ɠH; ׼Ao"@.E]}bJl]Fy~:3 SqWe bZL:Cj]dT.7]ɇvYN+3:E`nCO @O=`4"6"g5qRh ُ:nvj¡޻tTlx9#}K Nʖ-l i_\V.?%!& Gֳ>zA*67Bf|=N&: %!`AFw.-%Z hBi RddNuٌcq\Áv9t k"Ǣ Ip3 < :aF˝=Ҭwkrdm%ZW&좝-ek碁s%}o'a.w+&X./Y$l ~.@IK`s3ϒ #ᙘrZܘ$vyBdOD@Ia*9>j+ٲ? E}I|GqcoOH[U3_@%[| .5=PȂF g%D T)"#C_F$B`:sMD:Z ^vc,j>׀fMVz+EHeiդV\6%o跏ӝ9hyfq=R.ؓ'&LV=3,]?+Rt% _IN'-j+wM ş+F˄oH8SC@AeD*[3[fqϚY5Jom? d*!-'%'#u; Wk^GċPW#!ⴈZ6v!xz#cVBuSA>') g.$ azfx"[i02`Z܅+u lg&"ڎ5K%Gċ_գHVWJeţ_c{:Pں)':n@SAH'"prsVP.4lGjVoP$Ѿ-39ns$.Ԛ-ihP Cw ى$Ʃ"4oIlG$uKbIMBv4+~pu->w[fpGk!c;bXډ (4ClPQ nx2 CaU0ڿ(jυHBӥ5,q-xZ,총®'Yw0Hz#D/ΪV'pUԪh|#Fm(*pv b}p`ˁP eYW+귻"ǗL.6n,~֚ޛ?u8Hݴn#.Tdp m C"-L!yMg1xڍE `XdcK9 ` K{m"ܯhB$gz ^)Cg$^40e؂-k@:Uj÷PSs_DhXN~\a5m9:Vgm{QS?A軐<5\.P$PLCDgZˉ*u$\"Y}qY^@C5{F)b~٩qH'qQ+<2uH\q@4 %/E%}ࡧ7Dqt/:EyP* .vE4ltHuPl#!dk:-cCGsIkh +ޒhQ3Z,.$O5^FQ 1Di3&:+Tկ~Q{40CN^wf{IEm: =<CC,p6Ofҥ$gZ. y+A`u-\~BkNǬ \ߖ FKUS0)ϧN{NU$QdLKIKD>#rD>"*HHA2lR\ ]HћbY}`/@4B GreU \#ZVڠq^f-WX‰)Zx a)ſq^яӷ} Q#Ãd<h$"یl,\o߇vw؈z x_` yTGNή$=$=O‘;M[^0AqZKV3mH.E_M3F_(3qu Ao鷍}F" %!z̺Epu;35<]`at"z Lt̃kN(A0Ea31 2fz)al&)`@w%{@<'T3 t~j*.gYVψFQ ȋ&ec>Y}t_ .Hy̲;2NK@&|~|sR]g!=_fhe8W k2PO"fkVQv Kʩ hC׀V"Q$E؎hE JZuK\Ut{g¥|DX7.Z-0,\X~ rqG=, 2M'/90 %$MB# 8f,0Fkh-Tv弞v8ƄRG&m8ݵQH] Lۤ% e(ܻ7_2g-uf]kEKHKr$owI&BXokzRm#5@q[;Ù* 5vIcYK#$Q9:է_ jsZk.QVWr& C6{x1h}3δtp~K tsŪ1~\_뼱 Şno;n n.EUZeuȤtY2gQf_Z<#wV 62: W%0U\TVK}rࣚҠt š7^Hћ.tFfAK{qA DhE׆p8(qewux7:m9wMӓ)Ǵ&RfCZ8溘VUyGh*ʚ$H{6FOwd+PCM]!_'c#z+'&!gzt:6K^64v'c|iٱ`YKXdxr%Jkƽ/޴U- ~u{ge7]womёv7 yoM Ho(k7kvqhި=-D3H'Pf5$ұGENק6poHgwcUuݭWlC>-se#zԘp. CC7͛($я ".`0. 8 [@G63q<9Gֲh4ha >\ {F\#_g>Ir󆀐l L%H,OF`Љ:e3 &Nm-Hpi&N466Z͔GRg^* i;V Z`{Ռ8!B0d#JBP3kQRU[A-;hvթ7(KF mEIR`[no##EXݿ>HLG?:A "% y! H ͤY# vldTGـhvk~'&{+R!_Gqpw VNAɈ˧3V$\L'qoPgMnzL'SNj]LӅ>ZmCZr15{ `XE(\'0n嵨Q4ݻ֌IQF1l k؝aA4 Щ<n*OG? >+TXXzrF\r|W}P %(@ȧLkAYpUh:zf?g:U=ڬ&!㐚A6m]TS~n.]E#xFk-jw`B9RPW~al?_~Fvs*`0`ǐi'j0  [8-֬y5A9) 8~XDԜHvjr769uyl]_BDoMvѼ:JҴ≄\ އvܺfTmj>Yc^hAu|6g?`S";g'Rsz xѹªul)&= C`'vv]_5#K6 L^X&Ӻ7+7~{cj4|gɴ9\NrzdFvB^#-4`qj@C.9KbMgTy3fQouO OǤjk,;_#Bjkymv =4|`UIgT$r%w׼k8.$\p/t5*sF܆jj54kL?jϋ|%.%)%cCwk}_66X/BE8mt#{48]B"du !c@`i)_Hfg:;$f/:z:{hjL"uܡ(֎|Hy]Q}e t8=%W)r;Nl&TP!b֝w}G]!8dzz8uROL`|v7X謥,l{;p܁mX#3hk%cGXiX=PdxoL6{LGc XZ\$ ,$AwZBoj gf uRTuxz=2<71z὇>* ~E|K\#*ǚ=HbV{<?[wሤhi[kKуS>]4ZE&.` (%MR+"bD*tO/d ZfhGg>3|:S69#C|? MP(e嵓ÊGcǩd!,q% ڶօIAj5B/u\{ 6>tIhPYO] Q@wWU% $A8>nvDE~5:?C&xb h֎%aa HR ҤBBɌԁd[P]'K,99.`zfY\(UK:}ܵۑQƀnHZU%]k>BKRAg5X5Xefq|0 X]sH?܉H,\*dIɡB"F%V7N \#rщX:JFG,#A PH_&z;mlC'&BD >Sptj-g8Ng%( \™-Y,77f+a5 A&dg@4l<6e6lו {J=&Rzo~th :І7DڒE~o, `Ij0n'p#X8=/cZՒjIhO;l!#oSGם3F}ɤG ΞNM W7ϓ*첀+ yh$5hpQ ~W¹pvB*5C aX[`[% vG=.Qz F6t& Hܚc?GYiԶ;8{gI?#?oܚ:3h;?kF4v;?1AB?.7?MGΔ7 icyc 3+ .}jh~i.r>lI3fJư,S7Ff.kOU͗)L޸2S |^]YEt" 淯{p r3(+ޠ7q'ĽO 0ζC b;!E >q.SWسl" yz/RXfObcIfl6:%] Tj{ o'Rdr&[A.-x.683΋mˢK[Ӌ`XϽХ^| [^c7^2Auh.&uLKd 6c'0l^U>t`MJQdhTji" 'gwhE͵r8B q"rҴ% }ݏgu;BX J!5= gg/E%XJÛ?FN-ο&'jGV @,7C@Wu2ׄƨi;{3VGb!1[\EpgRܞ<vɅRbWO̷G庹e@z !tIɘ9R;I&>7M&=IWΖtV/*ىZK<9 W`6a] F^׼&KH`n.ȁx8Z@[IPm%5q{TGv%懍os48> uT-ǿv?u?G!(:xH&@\]*|`v4Vށ\>S獽t7)# s﻽{4OL!1%}WBشX;1XX&mڛ#hNw7⊊fVf3rM٬UtҗT2Vſœ<,@k =a] y|wvt~7nC~FF3&3?JїEg@aEѸD90&6CkQŒ4"(f V+V[.Y\8bJZ;}}-/xp:YSu&qoTԿ(0PVQ0z+?/ tKB-#H#Huܙ{_OyiQsU/[xoo]{ekշJHEHmUV:=V#μ V_4N$ ^,Ns6sdbYyErQGEC{%k)t&7%ՋT#Rh*0ǣF^/E{q8j6GZ0 p^0 ZV)xMo/#-ZBga R*+FA;\2?w۝W\8|XCᇟK/N_*|~'x=%P^PbPYm^2^xߣ.Bk%!W*s}ͬbpoԽmxW^}WX9Vu.Gl* 'D4$^l꿣QwA^8+pa(!IM#4<MO?pzlU+oarËwq~LEE:h,FQPZ[R|oO2@g2gP)ZH%S=@6O'PuFcEp< T:i)#Gcj\|nV _7]o\~yչkͽ^@/OGg̳:$b5ךq "?o̼zC;9s,a ,Rل_pv,T~`yڃhxu7l:AxY-:AJlCXqXtIkCk*–RR]BP : AɀĴ1bH:PAJk[R='#u[G^:5uBˎuL~yzp w(Nܽcg-S-ljCP1O+ h<^AP<Ӵ?:7ƭY#"؂$XT{ZeWtb-Jb(N u(LjN fFp3!o Pqb`d" eN4,6B.?쭝 'a MfG,lॵ^.azq<dz.Štˈb,ʙ.1" *U>w~r|xhL^@dC"fu0 #d6HXNEeΖb@]䶘 ("J,O}HfÒdrM8 N֖*e: SgOq#@^YgBW TcE+;+إ2bضst?/N dJ^rؕyrf# 5JAFeX\<ŚýLN+u;ZhHZ7m]HAcTq3k:h́`Omfx@ 0X7Ў[t[YՂI*chxSBOBmOU*GKC Hz}c X;7U{J=Nє '-K%j z\^x86HCD84;; #zN#^<[QƙiN>8s2S]3e*_julCmJy{K dFƢQ% sSfsЁNVb@fh*+Gp^`gƇ:5oEGGG{+tf;=pĩ'O; S TZ31gF5??5@r؃No޺ԲM[]Ah{NNPN0(U[ ]g8FdX_J}zze /" 瑮1hF^J}pQʾؔ *Qkkg{ZH~f \6;}9v~0L̄^XmT;g2/d/陛GNGNo{!o|=5>9"#'S=Jc ߋV@QY_\«NW_ /|՞c/j5װ[h>}/#W^s9~O=e',uv%ԵcᕷRC?6!mCs,]0F<:kocO¿5mJ՟*KoWL]\9e_ ICVxZu.ޮno>?K13?:\vưw!B/ F.N&sܢb켥lyg>.`_$F,ؚI`٬|M AZuqUgQar99"{ѣo/P*s'XujfaV S霚@[$6ךbJ#|9~֦gLn@58K.3t;jR4PQo4~ >:XX $!:pՆ|"gFce@*( !.M% c2D(pEcͺ,! /Kqau *^a/or4#X] Gk5;xhaF.1¢N8! "@jd&!U/T8Ydբ.g{ Hw6UZ#A'j4S*]|NV9;_Tm;*E=Ǔ A^n.$2?}cS_뱎OIY2RR5v'-v'R4:AS4OnHFgXx,עFaVsr#T4T';xNZ|^Qo@\*@mo\iEţQW"UhX r,Q/[BIMzYZ{9"^;&JqRZlfݡh&q)ڛ^~z'9vb2C-G ;Rf\c!/Z <-,cACG P[04; @,ktNVJL<oB&0l$^dib1uIGXHRE< A/MVi{ \)^GrLⰘ&J4}d4S"&4LV*jp.37&KޜJgaAo,=S;x7Y2[3(brIؑkXBjVXn#>`FBp,$`Mutix5R cz7ھ9c8D taW} 6S2L+j /N1)1)n긓ߎ'ͳUZWf tZti6}AgRޞ=D(ҙ6"y;t L'+k:vO9p)HkJAyTZ&\W~O!TO6t_V'a!qR_=jh?k6vv{Z*3RtuιٻDY<#bOuES?2,R3>'SeXYRϣ?Fr3R۸.DW,A`"<6KL=_6zDs3ԇ➢ YN/zAbL[CИn`~Cgm *ol+Ș3}ژ?n>`RKYu'Ⱦ>tPx7= zO!]x%^Ow_ի,GSz)9X>^8K)I1[";~v$_xo*U~e.cj\%,w{&_8^R R?%N <%=$N1Շ&#HTHl@ΕZiNC8! ҳT8-.eRk*(fXٔ\hH6$eAK:5z5~coW&1VݶdtJ,nCpGǧ3Tm " _~SaSSE~w1MX$f߮cڢTNh~įqep% ^ o?π 0+?__>ww7ׁׂ׀{K \.,1EFzXZy:-o*إ*Jk[[aa*|L!đ"rLnW Qp;bUWBl&3<-`澚9>rz'x|4mL!_Ns;d$(H:K'O ]I2^3du-f,v箿ݶn~5Y"}f2ٔ3p4w\~ > B gs)=,WA>?>lfMi'S7mG}x*~w?nA$rdzlKC fh4 9B!p9t+_i=N雙E ^\N&XlC,Ғf~wJz僧Tf;=r;0ֿ Uth#ON_NkXå^ }Ǚ#`mA 4RdoDQ\5I=j&5 >jSelg$ƪ$Q&j&gW3GߊGg_ţo.Nu:vs}׷,gПX(ex3wI[xCZm`SV-X=͵鬭Y`2{k?&B @hXm 8N ZO Ժ 8IQȼu:'x~ u~bY,Nq7>`9pPi0޶UoB?94ٲw5 H@X7.y\V&pPhZ v^R.SAXN3=%rIK)+|{kܠ҇@1_M "sK} EQiUbn:'W hq/ j^oY[>Qtzq]?\AP,,jy.ݥ&7l`^{o\i<~i (v"ր %} 9SaI g7ΐ/hBuC`@ًEwFބ;aI|ZhoʓGN'=I:j鱿"{\3U.u;ZCEt=pjB3 9$Guh9rsFrZP_ /"LT-8o 'Bg$W?nvN+̩C.^=j-S8A_mդf0B_'͡pBp'0#8O;֒j1U]WC> $mbkIu *Jd.S` f/;3-z,檼6|\vGc/)Sx:NCAgv@BCFBSxG|+255 _:L>ѲwRZ2&?qV߬@K9q<0v[wN}L=wV?{&U [Uݕ;09L<=IFm%dɲeYG&1  >ڰ6`1&]]cz{G#[Fu=s9*e}[i$ I%/z^Cg df퉵7~33,Uƹc \ ch箺+WC;p Ȯ"Cxg'5c?d}.r7tW\?p]wds3eIt.UgۿoGN|kMt*k(PwcrVHA_o`qmy vaesߵly.Gngd6dd-ɆOo4>O㑃ZSKW]}>{@ܒs/t. EG p2сR{ ^5{C0 ؊3Hp>ˀI@4|4REQ J`j0 pKXQF|elv8ahp0⺿db.RO/ ՅJx o0eᎉ-Bzl14±` _L Oo7De"_@O$܄8<=p0 l${|^l: VE+PeA؂[*eA`e Ê̲S'޿wxa8׌yb^OuO'.̇&f#CRj}p4t*^ *^ :ݑd{ݚ v?:~H7̃ 2hƆN#5k,``Q0q+HɂLDI:95MY?>Y.l[&vIkgSjpg;X |Y^~7C-߆!~ECɮ^3@DkֽL 57> lM)m{y0]KI.5W~gw$.}Ζ%!ڃ[,JNe< |Kv+gEOvČg4*IVFR A.mt#Uo)cC\Ӆ쮄7a9ր?G|]8u.2GZ8?1h4iQN`U6΍F-m{OYgڙ-쑆g;{O.$oA|KF\!}k#QؠeU0ӈ5O"V2e hf'OHZkbWC^z`W{ԯo^yO'Wy}k_grxbD\ _,.de~Bڃ$'$$1lBv/Qk 5Wpb#%wHwv Vc%9J: r<43KOmm +aYj9 b!p.Zm,8Z.:s3Sɉ|KL/t.鸊Wsph(ݱTC/o-\o?Z,^z۶/έ\?7sϛa.e }2x{o)Pf/y/߳eGG^w{o^^yOwνmvo];XI4fj\yIpȶwpw5uܞeWao1]kG`ĭ i!T/gVUza,@7p k=W>x?ce]ˎ;R|q#04[ثkd#x!؃~9arv/'M=T뗃k@Ey{R]缑7O$qG-v;DW4~ ;^q ؅-k/ijZ^]]~[ߵkj4YoqZwl-hTȨU:DY[w`&3*)+*ӣPɮv>`RMfTӁabU)aXdjZLye87Vb>,+ICE/A|ŋfy˂ȸ&2ES :of !tot&/dżD_7 iѶKVv\:351s&) v;QrG=ss>8].;ʗ'6͢rf.u+O ΰ]F~|6o<_MYb^e^ - co2PuL< },I)zɊwcl <[V`%$  :V̢tb_W[& ~Zw=HۖZ^ٶ0?352PG w1`f~w`)=@$@$ i)%+Gʑ'pZg6"LZ,WjrXphg%wi)a Pv$g,`텣s\jl)6؃q@IƒQB ["Hz0ęXu*\(D'"nGi_`;ۉvr8A}eTEаH5 Rȷh6HA!["18o?0k,-ʟS>Z<{,fPw(='ж_]Lgo{ήwt7k_{ M7TGrHGK|e b،w׍Wio u8n :%V|'46q uwqIu;4jvhab Ә{-$Df =w] ˽-t(9_n_*RU=Y:eqO 7DA /MD<;<鑀ѿS*%~U9hb\NS}=BTޱ{a䆣cK/Np4Lx.qx#Gqе߳W" ܃"*\dHĊg*D?N$ZɊRE;(@Rkѭl9ݲmVK^W./9w];w,o.uGTws)6[kWUm -N鱤 -iξB^5s%J*?9A!+8qsűAwhxf,']6eW'аaO_rgH/ݑpX|vđ3x>??o{ɞd?ͷ ޅ^,@ք"+fwA׺8B{\Wnˈu1;<("-8%_5vIt;B%`ըz[Լc&=Wf˫/2xw!׳\9*DzQc1ț3BG rC"G^ sx^GC!' PN }~ڎVpf a6$!5=c &|IWQp$<ɱ\0]-dmm46eIAD춺yGܡ|w27V LJvDh{FD6EOY(y\5]掛ߊܳ؋'ΛA$:sMī6Jn 3GKX]{YT>{HɌnٻ;R:B{Ӆvd+':G- \s; 3>glbW=ãh^a40$#[ԙ2rY|.i>K6bDi8M/ 3L5U/r#C#])ghh[| I|3wGӽL{*>AW`xt`uLj: 龁W3t6c?][c`OLJ *{VG#!r؍fޟ'I|E=[6Cp(|&S9ik9Y#:RıUjpm{&, <17RڱYҠR#'`W)w|/&ZoG&菕sԍG_:BƷFNܧm ~nzK;? Dĉq N"1hA|ۮ@9^51p6(30G4F|8` <@eZ74L L~_u.;Wm6)4|±V*+ܙI:6WCn`leYxoʋ|?1klga9v>E~]8 mY4x3+2^۴ Hw `4&0'nr tJ [DRyoq\+xp;e!G: 9zmƊGʖ j WͲ:mJ\3 ean erNod*{FFHGٴoGr?מewyo.4QgxNTyH dVp 驱3k;m6YE_DMCKʹ^fȼچy30w&GD''v[|LT}H[(;*yĚʲqwr vg'}mxjʓ[bj.kFra#u90K nbn,# x- ;J\gb%CF9iAIhUiDH݃ugҙLRCYtNULjשׂ&dPnr81y ?\2݂١ʽdOW )Oq[wێ=[o8:0ts{yK_6U>X+_A @~!""ti`0c@#Ǎs5 dS$=rҙԣlg1XTwWGBDߝ=\[I Ϙ?ڕt9(ʄ2AlQ=!z~ʟ@ 8ݨl򝡤(H./;wk@F #e12z=D5f]M뮭o Z[.TzDMFFO=U.|wמ}"GDSLN7ύm/\S®wf "Bwd%AgjM ͜i ڨ 23LzRȶٌ̬7rjOV} 1Щ{4[ں30hO{iqW, /?Rq~h= ?q:><_f)g'|aLWT<4ƙ@^ʼ`-!iabDZ:MFa̐uC[ qFFu(:|2뙴Sb1g6Xc}diu*I--'L:Kd "6ѓWU:K}B`,YHEp2П֭տ<Ggly< e??y? ^wΊqb! ϣ OO'"Qje3`VRXתp TgmdFb<[[]A'谍G]_U]HZCPRj*!7ә@Q W%]{TjRjJqx /]jR &3mDt$_6or {\Wo^WY@4\&7m:1[@iW|*j5*!kaUUN>Vu\nV쏦]1/wcȀ/鰹ڽm p0e |~y0`~$"d4-B5- eS2;I"Q%!N{ alvTM6bz䍚 ؎$\*%ř$1gj]1o,VYqܷdZ5Tq+9l썦w':;vJt<65k\O  _H/iLл5$;O|r?:H_1ͯ1Lv ?E2v3,|OI?+"$=2`1_x-WX:botg$tw {:λa)f*Y1V]mOE`s䭮 g.Y2mq<:Qǀ3oH.Nf1r\f98hb8 h{U/ſ17g ;{Θ2mHحAq3Q,JAӲB0w;w@@6|Nw"tř9֑ss&E-p>)F$$1wV}H^bw&I.U-:JXG/Rّ?s]6ů>$qe%@; kCi17PçAOAϞf_8 B8VA q}q$h]=".ULX8qTvu4r YHBCvJ.#)ٖMc*9~wٖ.jGNElo1?bk]R%~\qC'Ѭʡ55HzZ:o:>bO8p`nUe}AE}ܜ_љtWLg*J%á[ʍh*$'k޵G;4a}5[XS - _DDG1<欫-sEšن=O߁+lCApP0#w1"o l^ =nrJ%>PKrhS(59|Z?:,|2z{sз@Ҵ}EG>z%3V eR``,@`F!lP卑fVUF_+[E\K_|hi ۷}|s7 d2KЛ^>}[7?< '֞exXI*I@!6x$WMf)2;? \ƺ곶9l$'=x Vۑ|,SWν/Y2ܥMe}ޡ$)N-=iD˳SYS@|f]E$։ fK vo&֧up/\\?;eO܉Γ|Lr:$>) #lw?1" M&"}'%E'&{j)N0|7o,W~>Q{}*?DzR>>̀JRbwF O=c8?(@'I'@V#@a2.mm|he lLNMvmVmd`Fw6X2o,q)ɷ{ɥɭbi-o$h(zh =ۅZDi92UIR>rW$EN\Hg[]B Z”1䣥D^7~YRnF2\l_óWf/f<K.JaCV> ~g c_^KFvYI2Wud#av9¥vlګQ;*3+si:876:8 }@aI\G A|+8ROxe a$: J)z*x5o-7mVYuʧSU"sߟ|'g?K6VF[*G z,RB僯偪R1g*gj(_W^ښX_ҰU8xQ$,1Xk f~\HCkhd+'ʛj1i$mWg˙iAu湳*|r ~r%aF :"2QL(ciA @K•qf.eJ8"s5hF5>p>GG^0et&p$%ҥihM>AfI'uI'zU MlrS0pŇ'~84ٿm_arCWfF_rE,? #"8h掋ܺej/1e(`wot3]Zïv:rx"Op{dTS]C{f]ĺ8-5)Mx pD^?~/ B(B`+"W%xO ߓ0nп8VL::]̾Lb'b &0Of ]^vcQMtyI,姕/y|eߎŰOeb噅=D.=J=D)Wާ ]]Vڭ> xğ#yʃ\?H+ϸ33&}td"7daSP@~< H_W!g/HMxw`? b?}`gc gQMŃcUjħ;JCalȜ·zU [g `,8(i*be"-,]D~53%% 97ɒ?07#| US;z~tKɉ_M@=J}#SN$ƞ<=K,o囝Rޯ͆Ϟ:543~̵g5֘?@ Vf!Y3|;kX?ݏ3_N(W>3>SEj<?oג3-_"h/ʒsM<ۼ$wa'C-ʌ3pm,FDMS[1/'DZ`9i!\J֑_ZyI3NEMڧ$6w"^v(<),9'Qji1(OģOwӝ$ .."%'S4u5]sld[{T%9*⸷wW ѩQ%S𭆵#;q61pTxqC,c14JĒںGX :/Ƀ1DgvI:k`& C`4b@`w"'Ug$PChG0D_1#ow>-qJVIȰPxBcC:y3:fdM,41&5m<\ !{ý⑝^blǤA)J: 2o8&sLqz3Y}Uɤ;=*oAo ֟' fH#G^6OVmNqahs-]>ăH:l \8 {1;G/i*jV۩ 7Ho-Sd3!uu} ?nX*h<%vGLWD FqXyVc~碾Z <ާ0ޥNn7^Y'GnfQJ uS 26\L7(M%rfAtA .3Ӳ"|&Aw MkA.l<":~h8qW.z0#!cJ)kO/e)+|k*t2 TG.l_fwpHg*uJtkMG/>5@r{mS{M37@A7Mm6jvͦٷ$uB `mrpSJ%ջ'5^VE fƑ'y1oZ # % :5tCҩ7ܾojGNuDpyn ̴*L mz\q"ŗ:h7+/bx'=6k҃@nx7=܋'/?oϡt `4RG`YnLP=aOݼ۞EM?rOҍX~\_+yط!z=ޜoom \[ø`oyxUʦu"c>Nǵ@˼x pY8#pH '+ĵDXTl֣}҄q|B_P.].WU TP䮴Iل'?l@]ڜ1!(#sg"~$UcB6xt iMBt_4chk>s%*J݌uyK"vh:e"hD缵4wnά6g˂TG䟅X[O"lc!˥, e faAaf uC\jl*'":ʱ!D 0'1Y; Uvߨb t P-b zj͠!'PY]3*-[@mm6qnn>ucq ^O\l^/R/CD`C%q^NoU-|L1>K/m>Ym8$'0 0rcfShC^8w<4˒|Ԑ*ZEyd:/h`H:pEC[;|߶ʻ)ĄA{R@"OIB¢VCH#گŇ uJ_~(ո-0ҿQyI[oÙ% Uӗs-4)Ф(>ŧ$^_n6R5Rɼfm0N 80N`3opZH$ bv)m$M_ 6CS #TY#Pg[YW J ʧߤa4YWD Bg{6C%Ŗ/zl>JwҀł/V`SeJwI1C9gr}>d9cWxjsؖ^dm6wW j5d8Z?RY}a_Zw԰6e^Z;i]NkrRy&Hpt cI';jE|{TlFis9IP, 4XMWDcf=m7\oQUh׼h4z")"2Z8 []m)ixy ;m-jyO- _rlLS.T]@du 'T;x|t#aF;SHo9l(c#sMmĶVN<2nbxiX|Jihs3HkbIgM%:tT_e۪bq-ZpEݳfe{(օtj&.Qeir`M`?>{ud57IXO6:!6^HiK $SbćF,}QH8k&>7_)xSzщ$pӍ}5 W>ZTG HW`@W6B)iCVI_O<d Ɍܼ四#?hg@ Bg0e8Cu{qQ֪DcZxxpEbuM84'.ٝ[rc/%p͕t},ᏉCHyFzM!8 :XdIAn*ljW(DԳopm*,<26RPJ^CH'y.MEo/~u~ӧoك4;Jj *I|q0=WnՐy 5<3&8|Vb́w$ S2eE1r(@V䣛C,V%>&LJ%/izGy@6G89hӤ'DLe & dlbj&3ɛ3C'jC"l5x, yOO< {1@(7Tw&!Q { G|7GaĂbS aol f23&鍸?Bpcn~G2o}3("? |2f41așpvYF#x4 βl&)rأF4!=4fcqyK.V`~n&aw@NoQ÷y#KbdQ,Xq3AHt1R|ڈkHs+ݴ#a/^}ihvQ8JgV@Lӥ|`Lf*n?kvdƧI|JL`tx`rp("eD4AM^#1+OiVqp.|kJ*[iJ1U>id#& #Ӣ>4bi:+ q^+6 M-aܘޫ鴾8A71qegu$'wwu1B0+-PִgBh=wi>l qMsky͸&^Xƿ!B2 KmZ&wg\1s1@pٮn=\c{5xLyd^5V#݁ukNm-,S2,MXᛑss}ՙum5.&QE鿪Eb䄶J{Pv+ d{~i_Do^ܚ`Uvứ.(b&fW LRe:Q  P͎CDI >؎SˉhDqk\ 5Y8 LK-#Glb'әtznz )z#`$|W+]džD2q, *Y~S*ҌvcO7h9\A0<4%\
? Qo7&Z?ЛRj3{= +ҳݢʂل53&zCoo93Slrg}e-[5L)ִc\r6ar$MO 4%D~Q:8 O󫠔ff|l@ѭхkELڭ jОW:\&@@5ab\4iZc7%ӸQi3sc6iSZ[ݡ ݝlJ1j4=.)tq'&\* >pʕ^&a>t}ᒑ@veـ/Md36_ty!u$v!ӄnV݀{Rl{ Ph"> 8Hl PfehQ%-Sjq[:hýe려 B]UF#>]UMшŻLcIF>Neѓ~#Q:Mo%|[.-7sf +j  CjYS=zƳOd>~ar7A@ZRhIP1,)Kf7 3JJ6 ,=(U2q_Q.u(JgZI)2*<1Ҁ!a ~])pNα')y6˦#𝏽mސ'0k3/0u&#]v@=o#3f$bFdKXXnXhV_RuZd˲^r)@{Pǯ و!2>UYQQr:7˙8d^3cK{l&*Yɫv+:aQ$.fK7.-R"a.ՕVO}.}Y />7 ~#(J tAԖ܌\Օ-5ޚljDd48EE0O֎B''y,|)k]J=GˣzށA |h~k¯ )sAݫA\$wࠠoSH?7!<.FCXoQ#]V#_wuefߎ'W!9+$aa)-Z&G D;bWyϲ` TЉqeAUCȊxR+ZH#7!ڻZ(6a{2=Xq޲B| 3ޢ-O昭}}>riz64[HT'Q4uanj6_*5[R]dMa: Tdʌ$ &e)FI2fޞEA8+:\{?G!5^V)ikC9w<^>}|Օ oYݩ}'z+ƾ^x >m}ľ+*2ԜƣG4ɒc@-7r=kX"""^X*fD,$5l MQa`Z\JD"&6VŢ6Mw&6NvzJL+uj߳@ 1F™V,dzrte3@{ݩ'AbDM¶f7!{^*+/k_CЅs*.b U6das'}h-B&-kfEKyYP86LdtӴӞjO;A+'|'gtZT3_$x)3{1゙vCi VЅz),ֺa4VkaLb>ua_ݕG#['FT #b<ʔРw\D|2 %ܘr|Sr2z$&Gd35%`F.E?162<ڎ.;6ZlhMT ߞ lf QPǟ8_".I|b8Ǔz}~gY_$9}KGnrHHhbM8OM.T$Z40_vle۷-Ώ )~Lfh_*[CA.3HNޙ2NZnBot{>Iن~^nwZvE=/UŕMU_7~\R1 x3N7nGˣ?Ug;:ccv-%!r檇X=caq~Bz @Zǽ8 ǯh4``<&dtoW5Vʯ-ۢ|{|/>4>>T޹0KЛ^>}[7?<hXA}t :g!ZuOKo铱G fwݰ)׮eLEΒtBy!&w!' isLBqD4`4M惾lGVNe;_rt{@vx|V÷E'o j|z/^`byt 'F3ݽ0O3Lޗ@q733]b{X`AIQDQ$E>:TV['Nꤒmi^,[lV\N8mm˩e73M_DA|3g\0y~%~#@^qcMrHwb:Yb0UIw,(az8:>SJ]&N JeϡOȔA\4z4GqJkFgQDRo-̒JTeRFX8~.d%6.5'm[-c(*F9w[.}k3\>}p$ Dm/tDtL؇W;AJ0P yH0huI1I:dFD~nk/{ѷ(}(r՛Sn) LîsSN|.٪aM=fs<I/z1G8חN~2Y8=Zm"+sHi&TT>{`S84k*i[۵>W ‹$dq6#í^W3? tq :W읩z=i)up'R)oaq EF\wI_ڰIu/glE6Vy yp_l~ٹ"֫𙠟4߃"T~9ollP5_/ O f:`x<Y.ߤ5T dViWh(К+Bh~Cÿtjqg hXHwr p1|9/D'ٝ.[}a֣gSBhs^`)1@J3J{AܞRo4cgvWܱd2Y:dVn\].O#Z`/Ɯ&T9*R+¶De !.Э8,|b0ճԅ/C;5G/?d*NӯJ.QbC8xZ p[;xC;A|/oTȣ&ՠ_:\J0 U~BWq9<&ÃR>|9I%SJRkF;Ʃx Wܶ,wL ఫr~{:+' $Y):#r516r,7vy𖑽veR|Er J~D0ձ=b~ ԋ۱c2=ZVoϑxZQaڀ۵]$ɵ=oElSɫ]w.%;''J NCcEi HdʀԹG-28=hĔm:t}\38^IE;lp$xN\qasA{I%q:gͻ'oA衧ոm cK`w/[PZҶN쿣 .@#@ArmP;znPzx~G vͨ>e+*& ׶aMzSPkGB`!znfukAQbу GiX*22M74Ƌ_)ϊ}}"b\hj%{.^ OѥWkʥ\4e $ˏa}Af p .QN>=ILl9F! `Pco㋵6ǵW<\& :bv1*qwnC{|J(,߆ɓgA=S~chDtuDTRN/ nש׿ 2ܽ4U^y!א0GHGzX^jP=# :&%;ǂxqgq86V$M>|.SΖ'vdT QekURމew-Y 636 TK7:MBiSs(1kopQn0O tR8bvo%nIIlsA<9<5U)lŒH0n4F:=p-h$4&ظ$̩0pSOyonY%,6s7.ß_Zt<.-Z.yCj%zc+5^nխ+Rt8gѣȕti"ڦAĦS۔aEqazjv Ry[[n曹&n09~+fLHYfI0d…_b Ph.h@=f 70&5~$l^i 6+C l #cuµ>U?vFeƍ/eH4#I,8cp6my'05a_CVǯI2uꈒ Ғ<5D9l&=T0MCrHw~7x|}ߞEon<}J, K1d>Ž=nʇg~!M~1*MA 0SO|j'(ҙ3b%J#KV,"-( "e2K)bLG0`oϺA *~u>;6pHI!83yk5y=pjfVɚA|eI_ɶ6ɋo' ;ٻj|{঱zVH&O2!?|tfTt-Dpq% p'_Y,#Yobw5 4<<+:3˿?o􆯤 J\t{?@8Ʋ$ҳE$r쎞"y8vt5U)9raC++Zkڻ5vc#CvnEoMoMUMҎ׭8o$QtziWC0H6+^/*rj~V!񖂲렇I;Q~jVޠxxF}Ѡ'Ekuܹk&Q`p+x mt rmr͓_'[zr+Ki]m}ZXbk[줭m%kkηc*8e~߽OHTѸ 7l v ak z]U;.U_ KqښT=U"P-YZ iqS/ NAH ?GZ&8 1^ZLm.CdPXc οcw= }PO$Y1H{DNUu\e D)Z~~ir~.3i4A%bx=PЧE$A{LkFkW,^Uժ##Audw7NS+t<- ̢i(3 0F"!g?d1_d[Udٶ;ϖt{0>$ ([Ǚ0s֫zÃ++U(ʀE 8u5\3^׭¥0Z SZuuQrXx<26$w~}fW0b׾L0q0$m`-6]mY[p'$K=>O!hGWkDTpRH+i)=կucF;ˣZc^`"L|Zy/H~N2n JZ!Qzw 1CA8"Qxo\iߩˡDYptvtI2z w=1w4,B!#WC;M}tarK&V{nϩ/OdmacI_h9@eqM_Q9` S6LU4zxZ :5'3ـib&V|*fg}?fE߶61JyRw:X_Bډ=XW?( \QaR0vh5J褪\Z a_{Llb8BrL~hQTHfS/E檱 jo&mj11S-:w_Tv{n`<_l8NjR3rcvU"BRX#X I8t,vhYN#WB5LAD^ [ v3^=g.jexJVX6s`zt1#?iyD:R{X)bn%5%%$ ~\k_oX\^b+hTU%`hD/`魄 64O 1Wҳ.|s4ur(&^NLq: Q(SdrYBv?8|^q[ }Іlvwgb,#浪DlzfptxOP(:AUWg|"F_bTrFF`rLRZоIU6]sGujuZ^ %gGFRN$z2S .V@wQJ^fᴘY-eb.< HgW 4_DMTЇ&&~T$[R-IcTzxF |.DX%]+#*V7"сM:\mr_A fRccK/,MsމTKo M͜B{v*TW:th-rn+;;35)[u40ӰjO.6mK~wH`~2w}ppߛ lD_OOb,霟^uhtֲrnf'@nwu"-9 -ЈF3è6in}騒0$4O"pEϊW(ܗ?uWn.$Mz tubuV l頮 DfN,9<7{ц{6:3Z>Ck{һg=$cbE{KW` qp jr]I=9-I8z'5$PjgNYLik@u2k 23?z|9 x=~GO߉уSFn7\ѻkb4Uamdqytd'CɷIMHѱR<,NjJiw)g?ⴰz7\cB y{&o{ɽUAG륩{G`O{JbUtD,a r1m[]i#7M-'934L?TjvzvaCSkq4 zP:0O2{RB4.&91qc]̊;ǧzG|D̅șre GT6;{m'OE&Gbi[8^T'Ppn4JKgcaKmO9i8sm81oqJ4qopK+-=WC}GgIp~8N QBi1p׷n663]'ߊ{8?y{'j V9o+8 b/_?cө] ry\L,%qjKe .O[8'JxڥTMkA~6~"THc@nmBHBJ OMd7[w7 )sA7gG'}vvTJiyޏygf ucK2~jüqG<MM6>h<3q/^/QKXx͆+x`~xhKު)6p5aŘ8'_4 4^gs o/㹹 vW"ƈ]$B&l8&:>s"H*Fπ6}cv:7aڇ!r9| Q ƑwMDU-tHƉ~;B歅EKPkb 6&|7UnF4葔q8HqvVNB4SZ.w4 gαl۩Tz%|pO&.)f$3!(bF'HH HxB=YzӢM~48vȌ7/8nP8el*aұ|ircwTOI>Y q[y'| /R)n ;W6*n(W^;'kzu U#1HFBF$}\D<73?.68FjXuH'h4ZZc'H;Dot˨SlsytL.oI/x}Xu|Hزc')3s]K3-[6iiRHe"_,K ]ffff{effffK+70, qP 5ZP 0&$X`EX VU`UX V5`MX ֆu`]Xև `C6M`S 6F a64C Bl [ְ l QNAL)0t;L;N0\膝aa ,=!p 'p( G9p\ Gkpp [- W5(< B$xG1x') < A%x^>#`14X Ka>e0ð{pp|_8bp a5`koX 8'$\pE\ WUpU~pu\ĵpm\p}7čpc7e 7F0a66c b㖸nමnvd 8t;L;N8~?\Ɲqq.=1=^tp&Dc?#0%汀Kq0^7~?Ax0ax8:o;*GQx4g1x, x"')x*x&g9x.x!^%x)^x%^W5x-^ x#ބ7-x+ކ»~|ća|q|ħi|y|_ėe|_u|ķm|}?ďc?sįk{ğgwĿoB"bCc)7Mp+p <}pUU]4TKu4ꩁ&DDH+ϴ2Bj:GӚMкOІp9| 'ep F1mBf95D! S,ZhKڊmh[ڎvRuRh2M4 ځf,ڑv4R7LhO hW8vixҞJP/9G.-~J)C<h) 2ڋ}h_ڏ@:CP:#H:cX:D:NST:N3L:Φs\:Χ B.KR.+JkZFn[Vnt'Ew=t/C=H=J=IO =KH/ JIoK}H }J}I_ }KH? JI L/| !|(Ƈ|$G1|, |"')|*Ƨ|&g9|.|!_%|)_Ɨ|%_W5|-_ |#7-UT>Od3骸@{OY 3L鯊k v$l0(, &JrMGo&O$t&QoWCg? #1M( 9E*&n81mQl84\,(IC N11Sz1}_`jM:WATĕHH\ⳫN#wqp$N77xw)3vv:')cfxIyZiOgit|0g3}IvɪYoF❥(WH'@*^eL-0[>6}Ț>>d5ѽr s5Mks\(vQ,Q얨 U`lwM' V-]2vȐpI,б(YP#U/PkKlllll vhXXPʻBRj)/YT<קLIcLPp]P{#:VyzTI;Mĕf55 ÂAKlllll vv HX! HC?$! ŒX! HC?,a X?,a X8Z2VD#~_+"D#G~K-᷄~K-᷄~K-᷄~K-᷄~[m᷅~[m᷅~[m᷅~[m᷅YEQ][MmSb:h<%qo/0OQC NɹQIvv p^ eIxq\aɺlL![RܥΨ̹F府e&Ni7]lEڂaeχQ.ߗu5ʃyPyP<(jʃb'߃QeL ٌ?jzBzE%ųPaPp{3Ci]kllԉCa%h 6  X.5v{`H]0c}LcF= 1AmEr,"*&. jmگh[``LP͂-?4mu|F'r\b8N 1ڟ_TNS0m;{z+hXRgL&OD|n17PV헌w%RAzkjV{FŪx1. TCb'ZwR]t/5պxv㕖x~'?Z zA_{+Xlrԗk{{REֺQEuk0ʪKZ m 꽬8ٜL ֊)cOe xW{37XPҸaG[Qۆ%N6YuyDfpX> K ަ"T*U^GKFɂy|LM,SL*) aw+-tշ# _{Y6VCpĐif 7Fglr!r{IbFyqh|UD Y+E:C*V(7111´XFZ,"KZ]㩼>X.%ZEn;zpQ/^rԺ6oVʈjЗ4Uo4Cq5MDϞ*2CI{U>q =ѰHCR^Wb zR{e aP Y 9 z jҰLð= :Z)冸ZƋmuԴwQmUq=AV 4GSpzWg!QB}Hd'SU@r^1xRpAԦ ) )' :Fc^+U%i5YTHwRiˮkAAfD- Y[f:'hd+C,ߑ4Kʈ!e ^ 6R JtZdVY2geJ9 fJ,˞4qH<_G)C,g]+kĘG9eX>哫\ZR4QDT/NJHf2dJɜXg ,;JʇoC%**wdX T+ #ÕFˍ ScH)g# 6nlNUq3*ce-:ZM&j*6klSi6 Gn:;laNv;Zr1#d*!S y4Xb`"ͦb*f*5S4tecXf<ecXf<ecXf<ecXf<mcئiی6xl3ی61gefm3ی6xB^蝊un5 Z+ ʂXE>˚ʂʂ*LRWg: -?dի>L2Uw7.3'%CWJFgYjO;b5t;Tii;7MiQ5r9M4UTENS9M4UTENS9MW W"x=aOeWBM(uWe\FBf~`"IfQOu4wZje~ci*RRE===blO=>r\+w ;x~Ux \U\8^cΈ !Z"*U3#4/|!"" )affSMVL5Lߡ鬳 h6ߏk:G@8()"gggB 3 pS8u \@B\ - Rr4812y@W_W&_+]]HNtÒC /%8S !ҡuϦ_+r„\K3IO ӳgòISo)ҡTN33aI_6&kML_ɿe9SgLc9ӳdέY9+1t!#G_+>8ICeeԡgWIcLh I=&uL`&mcҶe2ƚ4a$ښ s Clݰ> 1cЋ;&ɘ1q|;6l{ h^.Tޥ[OL[APA&݂CC B!tb莦1Mn smSfxuU:GuVwW}j-fY̰~FFZmcƫPqInU~?g?Qkh >h6LSʠi+zNz]LUCޤLNcNʣi /1zu<ޡ>M`>O/7;}I_q:ArSp܂ wC)pKo{G}FJ #t1IS@ppPa܌[qs܆/Xnq$T]܍=DWW sp?n^ _Afzi+-WBljMp?<C0lG` < [1x?xx^WUx ހ7-xޅ?3|SA8 G 8_)Dd` 0  Q-v$/8l;M]X{ao.+p «j0!6'Għi|㳸Ý
\<R#+?W/#(Z<qx/ -x׾Ov B$BdV@(ŶTpA3,bh.i-D`A$Vb%V QܶB+rroJ t1^|#eO(UyYmegy}b G3`KR^ٴ!w@3p s%{6دE#tLLI5ЗM~ dzT};[2ȹ`ܬgoݺ㌭KZCD3V{'vd]|e-|oZ3ڽ/;[?{Ϻ:~z'GUhހ>uY\m{Ès\wz[{p-p)Z!޼Ez}Esr=~x?{$Ye|1cf?ƒW5DJ$gs1ZW0ss#k7^9]ͽm;N:}g}8wڊ$2E[l=Y(9Cs^#/ș.(73s0^N]_A-ța#V8B#')XKr;;~G_xG#9Sy64F@oƅFx= xVZiN"^K2yGx_yD߱ދ"%ZKL+G*M,h јVr!"^\kx-rr\U|R4Zvi>$ӍC FψW7IEM?^:rq3" 8zW򽼂יP _ԑ>2wq 41r5^u3UZo0QE0slkwzG*2=zA`#x_ҚǶn|_TRS?xOxO%IkZ=W@>Ol|ҲZUG%l2/̋7(oZ?2~i,V{+L6jZʫW)+kcOX/Ԫrrpԋ6jXʅʅkZe|ʲXzתr_}wZZU^ZB²XתI哖һV(mkղXתrr Z?WZZ,޵[pUb]ʫW)+kcYkղXzתrrp/c]V +lb])2*REӌ7xro<7O_Nytx:΃̯á$B2q؄˻J ;!|`F=5E@nr%\?ԟ[-Vs+ ҟ6s\?w?ɟ{tsŸǟ?7_smpގyx7ދKq9Xh?F#[Za8Niwy_]UZ~/#]x}|]T>|" IS:Q@ "bC:XCfAH!@"$ٽ&${gg3gΜ9C P_GӀJRХUn [ *BFZqQqqw5y\#l{ݧt]= M=Pv/uC|B_PY%oXK PO z4қ 6wh$K=ze>1q4&DDi)-~6fE{(@tRStFȬ!(-bDAQXEIQZ5^T7-6qC%ŃaQUT5Em#ψh,^E'Yt]E7]/DOK/>'bxE*^bxC Cś-1L o1R+FH1b,~KF#]Er[G3w*23Uc soyn3(%歒y{"_'Mz7jN|ҨԨS{0_|C|JC9* ϱp(|;{(: ["j>R;Ϳ ':tFwo46_B=&OL;c:3(M-h1>O̬91ccbŜI5bcf>[=vlر{ )xkgL+TPB 5(n] Sxp*r?TIb Ip12P9C!JH8MެC'H\LYQ2݈[l()-7!T/f^r68/vylAE2%WKbX˭CDta>,ߒ!_퐊4REWkQmb[xR@MBm"_P|LDiIJ īyT[$jPjTrSkQNg z8>Rѻb (gޮCP #3bF&mFG + }xNG͉9I& ds -AzQuybݯZhM"DvAlۯ(zmێBl[1ĶyLFi"Sqb<#Èb܋SI030̂~#A!v-hgկ^B!v5zzHUM5yG_˱̛A؈!ɯD9WL[ėT;B|++"}5>yAG6AݶG>Dݞ缾8kw0סm"tP4<ڢC)6UWP݆ZLzR-z%Π+9QOukBD:#ԈR_t0b97Qs<Ś(9ϓ(ڜL5)t UG~ Y7uJDeG$ e>rZ.NRQj܃ZJA-of#D4Z/wa[Z/6!b'BB48IKNJC-u @ih4\QܒQ&7{5~ ykJF7^zTU z}U/u_[TۢoQ+ ݃O~NrwnGBp%K8Ix r%ŭp Wpw </ EF!g,A_Q52?[_G&j+Ѐ#}AeR~|-NCtl>R)5J^ػ#x|/!tz=DD/)d4sҙ VG1&$#t<O C2bTg2b]X9ы|o%ӾgI@9^E|_ 3i*rzF̔u9aqilDGY:$#-(TAm#Hu;R]T!UHu'RߢD\x5CFT)e (b+ʰF܍PʡFE)1oGNGgP͠GCw zA4JueH:΂Z4GQHu<'UGTcW>c =w\)q~ϙ.D?(#U Ni܍r-+g#ϟ1ݚi$_cP[Q[i\(]:c& P򈳠<ŜPo#9o0ުNh%'I JuEF2ԇn×R}ɥu BўY܃j:P"T*گUϧQ 2ۡ;\Qb(zv]6^@2E:ଜ9;4ЇJY+bڅCLSbJALS*bh208!-4rT87W4(o?*Stu;wm A?+!i쯸VKSÈj ryv!9 (db!`O+ _Tg+9\v :f"W'&[nƗͪL_+ʕ2.]*)g1R"U3jK|u_AU~-)nԪ̓ӑvNCt!3H[-*\)\^G:V9>51-X_seMe}1LCB &pltAa¨\*]"b}b_Avy܏DjQm#OO ! >>dBSKF_t߂3Cs{&L[h+m~st($XQHD QJ\%wjMU#8ԑr#qKgl_2#Ɖb/%'^l6];.[*!#(`6mFkngo|h|d1cn>c4̗ۚ̾s9oN0'S{̧ZQsmd)N9[C[\ _)H|f?]+@ٯ 9lYWӺtrr=O~%ߖw6rɷN~2,&7iyP=wLFlWU+\ J?0W:¥ɳKZV"Go/q7 =,'n+BSkqY 8*' Fw_r& r|M?&i6/ ?/IIeMs"KpLs;R=XtE~ڄMl&!g̥ZXxOG-4sb7vpr)8r 6d) \QDzRo.GV}6Oqslǫj+P#䇙Ycez=hpDyO H 2fx{O\D)ҳi)Gv )uS4 ?9fj(C+J1֜5fӣc ,9FO=Oct`9_W~(Y7+I]9D=/LB3OqMPS(Վ*~̭Vwg]󉜼ʅοr~%?߹d \9w(Sgx #i9?zI=^6N."{Jfu3sM"3Dו{ȓ8i'b3tn^N9-< ojaZPOn[or,c>֋#nC^&)%qhSU\Da"#u=䟒> #$*WZ)- $#9QxuQ.䛑y%ZzrHijZ=W='ϣ|$?H字?Fe2?o6K7a_q,L_nwQPsKMT+El |o C󳝃ݗc9_|0QxT. n5差:8t>:c ~fq%E.k3Hc'`͊_Xc ֲH)nM]NΞ~kmTuBnʁxRBp&mnK³+2t}O6b\™ǕlGiD-t?C:gL^vK31SZ) lE:`2LjWϨN~"rCQj?۹#a~RwlOV1C)8A9XL FHv>Kvr=JW\ߺO__|UYR3Wt3<;<B?`mY.\yV,EYp0 5IExo\zӕ Db$^*JUlSGTp";= (DUx~zPnf Єn7dISB$:уJ=,zTU1L jU#H!&TK3I1_̧bXDOb)=#֋hb4[FShf4[Fs*i5>c E+t@vz,kf z||j-͖lKOvT||꛽Tk8s92ǚczs93Ǜs96'9ɜDUd9ŜBOO<ڪ9mYnB[p_9e){ {b+N\½)XjG͙]Ϫg =җosJ1 "!"*E|lga;~]W .?z48_heUb bR0Wh7n7{mO'RQO L,>pTS{wi>{Հ_ j?xCj;u jWoZ]! "䠆NSu-6-5a_WwR{U WUq}5u#ƫ@Tnclヸ?wՂjGq0=-U #YI_Roq0#J:pCH'P_ N)e]<<Bi W9p+$S+J5d~B4׊-kj<P!QakxplTUL Z)m~ ^+DYm-s4<2P#-)l{|elezZ8GY{k\﹟*UԑOI^ VZ9CDUIT]ӽ' _R娥t9JꙦo`0r9TŃ8{yd-3C@o1穉_5kWj7C +k$rkgߧmgV,Vj~Aj[j˞3VК3~R4pb[Inͯ x쮇aznA}oז_r;~?/CO6D=˶c5KZԿ_m|K(t;kcl^* ǒŜ'xPP$W$DI" ?_sHOHOH|8FB'9*h44Rъa02͏1gl]7 W@#g|vz'ܓoU\=B1^UCjY48 ƮwC@ȿrߩ0o'C.x):8@pļ:\4Xy\op):'8w؏UE}„v=0'qh{ɮ>R Ugfv; {:C9~מsYC7O-s~ER;{ Xjq{p ;"2{O75C}uudPxM NWӵXi zzݐu(sz!7A^Rmj w/oOgVzZjN:m/jIʞ@n_!T^zBzO$t BˁA₧Ϻ`PO3dxa c7t>Qwp7/{+z*a3Uӊ*loE̾?٧+qH9DOc&v]g Ѐb|TqtF1(|RqV%a$~hi22lZI[XnP,8v%H5}H,媌[\99jFKY9S0wX#Χ\OOZErH=][=-(yi#e;uA NQr .SGqu RMd%3}T ] w<'eSfg;'D+*<f7P|Ԯ:C^IUoP$?#r)zUDfJzNEa#G8ݵ/ Ds.8YEr=ܦk]DrP^/u0SɝZ-z#tYf6v9M'LcQN~:/UTF:}ɋ֐߲zq(s?]wLrc=#. ׎7N7c*)wx~F\ڜ/PA$Ӯ\(}[PXI|jȏ/lEf߽*F?l d˱qN#n=erB#96S\g؎ݾ`#}y(ްWT@R$L@d\'u', fo r]MvaUqc̛shT?_GD-Ljg'brT u5q2oFq[開p%Mn4Hp,i1mG;F:`@l*>{=ߤN|1b=f\C0.`Be[õyfQ2IsqG/W*xqg.Rv7isڤ:n*x>+~V0N}HE.ym@Wc|| ^7CXR)Nx赥)tZ4-zmĵBxn9ULFrn~[W z>h8ξ:S, d&QZ.UZ͹אruvofV j?!&DMtcъ[f!K6 +^CZۺQ]t}0}% $[Y?1%矲tPcU|3#r#!b mrY,aY&[b-5qw͸>vCfYWq?7Ё}>Al5.и mlSc5)Z~ܲɓҾ|_QJpS'o^#~²P7OlzieYdx߬nV:AN}Tu5 挓Y&E7(\u` PϘ$o~ oz*pi1Ɵ{*':ljJp f<>*YylAKeJ]v%>㖥\=b + i88ʮj;g*WJ`NIuɁJ%{d|%+sq[fΖwfXjQUwqL]ntաs^POW|ЯS«Bj"&ך[m1IR6{5dnS2uA{I_#,PԀ:ZS3YX PLn)t(q;yڢ+Y4;V>bì+A RrIb?H^M>#wQ :R,:SEtED/**^/S^W?yH}X, br\!V b%rJjika֊(:qnQ&xxqdTΘhLkI$6>1>! o?7PFY qf4l@e͆fCf#]e66f1Ml07s+2[C Śv4;⹓ىʘbvsWbnvOEzf3#@s }|>"ר9𯛯S!x[eސBQk:hYB\j;?Xp;~( | .϶C>vȭӛ*l50=Iנtndݢn ԅvZ/DCR@ZO+s?j=ge;_=[ QE ^QgՁ1A1]!@xX1a3/cccc3Jq36Ʊݔ''gsN6f89s\=pd=82cfG8ol>`2j9pˌ̀k'jCg8Ykkm?ZO㬵km?ZۏvmZ=Yk8oԇu;l6RDFG`rb-pc866ަFL/^4F%=}a|`|@M|F!cc<1l-"S82OҠ5e2ϳ嘪Lk46_P}KKz֘fLWt<0fPsc16fck5eN}Ma zEf=j>jՂU,SL^`jUS43Q9U VUfK<+j sKvOW(h +y^e< ^Iw OɹT k䯬8B.պe24 DzU:~yJ/4޳tծnںN_cDK62(=$JKo` eͅ2@ {ֳ ?ghK7yYYױ#523PI%Y̡cfL=c=WN ߪ!|UïTC!pg e#iPy^ h {.I$ ߮R[R>2 Xnj} l+ÎLx%_[2tpgo~8^kֻHbvן6>*U#8|y>! 9IE]mnd#|ңpGu#]mi"@7s|}w'A.u0nQ;6HiD"uGcr= ʗ*u;h]d'3{imJ{|aUm_,K]k=gHhB-C:+W>㞵nE^FӮja?*uFOh.^ajGe Avظ׻*-#$EӃ.䳖U0. rz̟Zg5z^ I'99IuSbKJ6 Y 9ʑs%:Go)*Z3N<\q0Ҫ2"nj(ݧ]q0n-Վ̵|1aL?\A5VrmBR-).(t*OnRжhTgU3EcϺS36X=wlKqfoAڈ B/|ZG >QCDF[wem`KP3VֱN95+vcn0qx./5zO@xb^a˜jq,핊RXL (Y{+(Շ h `RVqZVeOeCi&3]NsM?`c-G8k+ЃUlU5&E _3/8 B;W/ުPS"G~Zx{=Nj@5 I^]fο:qiSʭiٜ9h;yO3d vK{eu|r *g[#YCy׍"$8~wo=8aVJ2xqƙA1$6ܫ2|YAN9"I+A%0> =}g[rvgc[LsM 6Ar΃>F{ oyM1y<ÜBIRK75|]"evw;߼pmK[K;R,1Xz-MV+q:hSq%mBNmw ^mlso\綼3~[G@f"#Qn{tGl8[)tK~{Ͱ=W rDd!o2PَS^\\\Adm͖/k_R9xiqNҕ1R%28K(gJX'>0秢~;$JRY*NW k넞2eL|N kxwqAJ`,WPCv6rPT%Pl?/KQys-⒎ˋݮʯ\wHr%\>ԥrQш-RHTj1}ŢN:.Q0R 抠͊";k缕wZhQO*V:&QʥD^ՠTvucpi. wsՇY˻*R%i"7M|-|򚲤[p[Arҵ U 7Wn*3#>sVAe 9iZd*'/5~ 0j@7vuu/wP[w9jׄSg!*qKoS8e <%%~'\}szU/cm]#SOwN^:թ{&@h%rijT[:ƹ=~ʹk.ԧ yYB4A;$"`n{=vqs|CߩZJJ ED_'רJKJ[ܦ-&@MzwzԉtA ཊ]S[ǪԷuBk}vQŔl_E ijD@rP+}{s"m+QcjuT'SA+p!ȓn/[I E>s^Au 5l[g ~@ԫ@-c6KY^/.?fe_c_9މ15ފ1(CCHSt>FQ72Lc߱4  u6i(ZY& (bc5QXj,zQhl&[L,#̊yY]65qujY2ctruw\!#%<Vn;kB.Y~i_'H.ˤ..d|@^L2%PF^QueVᴂH%։yA@[cuw~]c@dr!={ [;:ʓSg^Gzu5'isY2w- 뼌>'u^SU֞c}:Gs~EٹaaRgcMOa5Y9Ys:Qcn kҴw7S7gnh_-LOp^a=#;eqG7uƃ:|gtx16a8 :|u}>#hvOݚ~gj 7~X*=YJduD꤄;ۣ\V2?8r$Z~N5u*cS;pﴐʖ9Yr<npOЈ<.Q:I!N sß}ǿb<29ws:o#Q#F֌L`96Sei7yimif~e1$*K,aKzϵ <[[oqf8GkTc!mLL4\:@oS8. 9EW~˹|FrE:s8'I8Aފ1+]vkO;3u|DvF=='!rfr<7pyՁvܧ8ij ZR.LGuZ-9NyrqU7/rrG\6rtUײLe@QATl$0lð[/ogGza [/6Fy1__P,,ζ __Q^c1>3QBf%EEb!a|._!s9>"_!!n"VM;.v`q,*I6݈}B+>=I# /եwW]թuӿ{iwC6{PgΛ.x)H uMsylc;s¸ҩ0ay<0n$=WH@t*,궳jX~IoSb jQ)=M[ߟBHAx.avt3]E=}x|Э|{YM~sJ|ߎe_/G7 Oo?ة:pMuDgwj4ޤa oAtnMA[1+WEz^>Q-^j^ *^-f_@5cҐŮ֬wz!S(ꂻ:Z^5].`Ww =.K<4'lƩ~:=}A 0sw58>G]JRh:O!M(@y*MPqppJ/"{O<  M`8 >x]ߦJoXxc```dK9@ P?N/ IcIY1ǐ9)S]d{'+ѶBK)_ιOWe$rLG~iLS˚-FL5Bƾ>Ztf&$$HgMC2miwK:4vZPz00C7+;4]Ne壒AoEMQ^?x]78"**À'2d\ż5̫ 6b%/ D|x>>"n穲@DQ̞ݳ17+6Wf-uf2T((@L$mDiυHc ]8YndS.+ZRx"d#_ls -ElX2_I/\Qݳw?$0Hh<.X ҟQ6cȈ'c&  f u&!Mz(ZoJ%BTNTm9Tk:DM:LB(T@pkzzWU%?I)wu%݇+9"%ٖF.}jÆj.jϖm4rveVi_Ngk*AM߿ׯgf:sɅ`{z/ em8T;+R$j")nBsޭW(UIII@%]*H (5|KmY!ʤdNaB;'䰟YdOᅴ՜lCZz3ߴ̹tP]qQ( 5y@w[t)*$<į~7TZFnGCVm*Cj؀ͼ]~m hzBzbz0H9o-%"~C٣TG)M}^2"PMg6[;@_4m+.&Eeh׫=\ٲLkb̬C kͷF.DTک.JIߤLQ(ӹ )Zv0dFl#~CABacNF;LJTSRXE]lr:TnyWPaҊ*du*jjZj:ꬫz꭯:jF{p#^k@TzzL?~co10yۋ&&36|'x屟T_gj+elZXmhv)wOmyh yg<>kk34f[N-<3h.)2O͡}UkT`JXt@erBx| KŚM_ ??K . A wLkᏐ :r2錬EF~P(*5COl$' y|al|tCxeRa2rP\PD<~9$\9 a2 M tYCܫBj` #8zq1uI 0eѤbd  *uqzzO/?\Qvaä9᠎b HJI O"Ҫ&]=@e!j?jPH;x\uu,Qe hCdgMJ x 1Sx̜d b4dz}Q.Ӎ¨$ Kڭm%1E28,Npg$[[E'_65.A_1+8Bi C8R7*bV U V#f ̓׬.r7Mi3jYSu[t2UrW("('h>g bвgUڪή(sӣVly)sY9~{:tk}@;<hF,4if4wH!E*:7ܜnï` /Vz&:]:gssъH"ʶފ%f^Kvz^"_w3*HQRVh1$y0 -:`Wtd&4BYoy8F@h S@<?vcR @ -񵥻fuF؉sP6珕gg>Y3XdgN0oGggm69p CL$q68EX[5/?DOWX03`62{CO*RѳU1Br ҆mMۗ]} 6R+BOV@tg|w#mlULpaLU!]@~6> 1;aSdqlA/QIlBh< cGP UWwBk%A-!$C>H 'iUZ$>ej^Ƴqu3o]r/z@Ym͹<y}ȷ4!YliCgUM#&O-{ F:5 Lmvr+Q+&MIi<ցSC8LY^2w;$ iԠcOnZE?H‰D|%Q*.N7E6̷Ji@Ug#BNirHn)*Py :/r"G(qbuf T2K|Jbh6韡L9._Dt̕鲟ߢsye:GS,(JRgoD`$J4%pt " $ Ls_̵iQ<ڥJ4Osw,:csBb`#VDBҩZe\dFU=8f'59) 'rrd` =*;%b3p;*F/> ynhԛ`'TKK(C7kש[ѱɩMX"W(5:p{P8dsqԛ1kɊU k6rgsUۆ6z䧷v$H BJTI@waE&(^imԏz1GV|.?غ ֓qQﳬ Gtq{O ']lW_$d;K):)kt.קm1w~^)[WQf ȥpOw CPq2TOO}0`4Z!=5nˑQVQ]1:ޥ18WVG弤O_ ɺB~s6eD m朐%j w+L_/\^*Q|vM>gֶѸfO D'+\*WE.q;fy2w.g%4 X?*KC1wD}k-Vw9Ie.J/i`+WL.M+&C#~m2*R| C=O8gVupL jm^D/UVՆT!nf`Y{ Ÿ_Ar {9 ƵH~ز#XZsoNly-5&ޠ lFeeЦC#N agi$З.2a@ 0 S߶0_}4)nL uR ͅә&*䋫w`[켫oS @=`6!.L}'>QjY ޿UB `֢ۖ2>oA_|١yݨ[S~Oǡ%x^RTxҬV õ(4YVtY֘l,-`*T*r=ڣGrB"zhEq\aw () )ՠnsG|GYj\o75돵f\O-$x =5Avy:9|,%>o &'ЗC.#Myͦ>\oNzv?j-dB #v7wNppLr@{[R[&d-EЯV zt:-~Rimnzn#_G/lP6mv<#f$Fw^/%'}i`7v&wr"N<HW!SKu8ZgwcZWZ 1'=$}DQ}'HlT~ic|ƎkHVw(kp8Հk`1+d{&EJ*.CUWVؤJ!ZBBǫ*kY,~3[>N4RJr\.-ySX&EYc7+ȢyrM"j˨nk Ks>TVmB-}_3}6;@G&L.J3=E.RO#.3p } `Դ+"*r°7+~fh]Ae쾠d@rs nG-~=mj5-}6 u (|d<ά窷j(Sϕi% sb dUlrs&fx tԢ[=Vzj54Y ǧ'&&SN78r6#pk.$ƽE n$S?qm[sTMx4ϚցO=֋_Svж )Q9Pf%V]¾lHb^um ^5#kDYSq~/ BIJ^@jpnM)6f,O胨łjmXBpGDLOi4pzs9 ^~ Zt60mICc@L(*&C@ d4bX 5 \E{υJDKrGC`hV< [SU6$Ȃ2  **Cp`o!q's_GL6Zț~/E;(%[n`R@jR$ .z0m̞yǬ`$hGC3_){aKkh3]pomn}6GV<S%$|}!K^s v&\<]-LU+õT.J,ɕj9/ŵ7]enO'C(:+k@atB|W1lg_-#BG̻*ߦr#4]ђDn{4=V‘'_Z淫s_k7( I ]H 0z8Qw1OF/ ?CcX#vSiwY42jg5aUEJɬtHeKSR\vnj&yfWgrm#Gf/^2ՈK*p|;Ҩ޶E>hfgi)`-~Et?riDH%Զz_X4i +t_U6C^g٦hVﵴ7*%_S”t,Ќ -ؙ*S@zǖ2\sU~9(_-դ1Q5DTki.׻F .UjJ=>⧌}3XTJZ:Y6])JɐU{r~4o@;<?_?0Oֆ$O{\]l%'gdAh?8pֹ 6+'pxZuޭ= hdo;rL;@g8<Я=u(2u+%/+VD}@{.e!Uz ;rZ."LpZUlmAs(ʠm^Zh /dJCW!X7| r:e I "%Ԧ_eȔZnņGMx3*wKQ_.no(*ٸܕY] di6fOcVT$Jxq SAjSt2k%ƌQ178ֶqqLjK FܕYU[B}Fd|c忔N%"3߯>{"FBlSQS!:$W8h+S !pPm* *EueK5j/%z?uozL=izދ^{ɗr~2&ec%U5QsG|lFuAfJXѷ(X]%A!ikn5Ov'L>BBrѲ3Vr+Lq`o3,o,q#,>v{8.<t$OLj)iSTf lZ2ƊxceApV;j0czPG:PIg:Nd |(u!`* cWq<qYSr;+ Il]FizCj3k I g"3mHS$hF6l4u,vjJ?aҗ܊: 2ZH3 kuֆZMvf2#s M(t%!1nq=ib;^Cܥ 2sYI%bAξ Ԫel?z˵u !t-0T2w! jInK:┭3p&4i߽ӖyJϘHm2ejR5`mVwdRx~WRx^Wqjüv92g_aX1qˬsXrҗ2w;#\Hyԑ޽ 0Ř řc{< /> @\6֫}@/v zsd9\)4Gh{1ćZ%DXĈgٛpBHf æ͞N$CJáK췮i0N93և:A΅.RC;5\ﲍs2} ˘>< @7 BiA߁XȋlP&@mѨ/'DcM8/&%C\*tHZrlZEsy?ٺ`I1m+bWԨ:H hI)](' 3sLVA,Z2dMղA}CPTf`OU-U=WVL2T)U>֒iZȕgn3t4z(u$u )/R؛ElX&Jӻ]YLʙ2k* )HlK*.Hۋ8KբU"^%6Dڠ#FC&riAa!r 1hAB#" I"vt DtY;iECȮ5%^.AM9J"M ܝMM`,f,0cJw ʱmr%cd^8NjIZ]/Bx׏YɥjE E E ܝbdD0wԛțfԲVdĭ?hma&& US/9dAZ4 QABBք%["ϭDdrZ6r8 6n\V[j_hPt.O/j@Xm,uY*E+rߎMjLA n|E7qjw4'Ap+M\^KF%)jA5()N iyBzZƷo§z0{ͷJ6!XI 1PGwvo΂|^b# 9LKp>^ Ѧٸ" tdQ ܂<tV} vlZjV,n RzZ=:oxDHN'W@"xaxSRTjkdf2iu`OZ}fáfT;hH(NS]Q \QcUӄɋ49 \.˔je G2h7Q~tz_QewΰQ,:qXTA,>`Mek„ZK v1,@U|湭qlO1 Z Av$_\~Nح q)PVG:m!i#P܆'ifryGw J2 dmKrc9[,4ڴ7 |ch'eaNF₡P~zq."U]k_ޭ^*҂3bR5>R!MB;J5{ӄ^}k>js0sǾr{0~{ɐ Tl,tT)Ǜ^.t>1[gaN 9i]68 zU¼槐9+s޶^*ܘnyLH&TBMl0_]]l?0Aam%$.8!kRpP> qp `DT n%kMByݡXolZݝa/{kJN6s: 7ri^ ly) ;Y ȊPybez/=G%EoБ,#R٢ tD()#-]TZLt"`mȨz)M| |@g}bmX, ݅mzYI'|8$QP:O7F=Pf/l WK(0F;rNРUD yRu$GmUԻSTPKTѡG"WZadC-1 ް,pY \i%86(D֩Z#ÀnE@`@MR3|65iNj7Ztr<̈!/7RO>e*(⡓'ZRV-Ť_LLW8$@_']H3!?'CVVj!/)fni%y-kaoGn"}WhMpxۗgu!࠾ƦK &c6r'3}'35)(Zy< RjjyICt]= lY;!%E%z*[i=i{^MѱU_WJ -@oZ5k*Tp[ *U:ΛҰ3 #4m7s;.^`e#O1{3Yؠ2l,k;^:"c@(Dzb@04߬E>"ž"er` H{]|)ǻ [[Px(Wrc+m2ZKnUW9 tAz:E$(Q$$g8ed1' `,6r1maXCIŘx5"MH]A( lӊJ(nEܺdȤlEVFA iU@jtd^t6_.Egg1+ jH52eQb6v0C]2MX0#&,c=%f߉9Ν0nD^){[@w5>yu t" "mQy[fD2(NI5` Jj,R){ýٔ{rFQn~6h Q)'W S;h< .D4H$a+c;!I$G@Ż?Dh{vRFnA='|~Jb=˟|lA IF ga+ݫݧL +;[~&Gc٦kώVx`ΏSԙĜu遖JMkmGHBD<)MT`_9f0&{3|cM4Lhꫨ½U Y+^fG]gO&&Km_T[x&$2X2n 夅*oz%]%B "5l1 4sΤ-o*ݶ` W5 N^p<> F"p#e;!d[[6E d(9z$$;#"!߬ :2NH)Pfy<6=AqثbЛC|r#1U# 71SϘ~`3Ü7ӟ\Ppް6ˣ)d=as'[VQSpYIK([.N,ʮ"XZQzI޾9]+15%61?Q_ K1f;lmو;YM+js1|_5KF\N8"DKd^0,9(vQxd1;;yNCXUܳrJKa8hٙ^.zL!JOC nxa| b-ؖSk$ȸ!4@ip% ^jBI 7BFKQ=k\`G~oeD  2`<|GW$E6'z RkiFBAn\_s!ξ?VaKʹ@;jo Csxܝ1- ;izts<${&t|GPd7Cjb_明!Y-ϔ6tB}tB~b;pxх}XRijD&G6v0ܳVs%@~^I@.>:W&tNB܏K$q~E Ԫsu8%ៅ42J9?dͪ B7n |Jmɇ<'M-OL =A7Er1?b X)܅rsy.R [Z|jPSn6nCN~%>8_K?_:6 +kժ4\RdIꑷ}Z>@)?:vO1'@cb_ [.)P)ǡ9k\<| KHJI"@F jѤUoPJ?k$ZB1Щa`s.oTS"ut)TguO}_Jɚ[HSzEA,$:Öq8QNu]\}\b'^8ɒԥ/cZrvh[ &]ъWV+_*Wլvuo.yke4ϱK)먾ꪨ0i[DWR) ;2,wzB*/\~!B)꼵DħPSN'~s)PV7Knμc,Z|"ߺ 'l:y6?-\vU\4xf۷SϽko7탏zynPU uSƄ )r1cǍ0qT!W`$L\| %&)jnɦ7WCW^jZx;$s! ѕ)ttk]UFς#!_D%⪫kq,AN`>7Z]2oņ3(3n3 8HE60'`WXK)xRW4B6;nt!`n1*j=-ލMӷqӿ 3IsdSff{OS'B6a! 2pvT(h j17=D$`ZMϯ4 "YnifViSc#iV&F,t@Ck*NVRn&Pw͢'CTme1_O׳a{[cr@pE苹.(˂{zgxWu% vh;?S-|0݉'qovhhX) v]X$[Jq|7 (4By)TPLiDP&= $& q2*cht&,;礂AO$P\z^$g"FzbNI 0& awj{=F>c.30tf؆XxYCӚQ{`F*sˁ=T!уڅ҇;# 4M i *NSkCq_ٱKՂGnΆQ~.$3 a[oiHAfՒC- K iLh3Qrzҙ҉vaea d0c ɘ >&e`"VńM}rb"^6SN/lS`>1zE >q!$=GwG۾/ż'|"q2UI+mq7ޑw 7 A12/ ܭHr6^oe౜.^+=Ϳco-VS5$ʼnm%ozQ LV k"y6QTILDUʛ m%ی}o1ocv%UaMKsUC5̴VrϋVK+b1[0P)& %sz#)=:=^Le8f&2vX({nk a.ӍOc~Be|m H qb= (/a~!0?~<@9J6`hͧT[HcMO9! pLr˽뺣7qSu7p#7v>ݛP0b8AR4r"L(IBKBVTM7Lv\OHuޠI)u۾ 0(IEYMۅr,~yNɕ_~p"G^^K(8p ĘeVdݐFpph-7( 3쥴|@ذ厊14+{%{! `!^ rGĘb彜\KPo-7 $,gbL_ Xz\LbqlIĉ{/C\BqK.ەp[:\cű]VZ#N\!=&"Q7:2@ C: 'r]k%vz'|^41̢5}CF j 3^5}6:34+JM !xkjS,_5fگ1Z3$KRٻjGxL0[hSNZ'ᾌZFBqK.J'n\fkc8VR+3oeZhaH{1_q9 &vW1b+ބ7y!I?5 6bԒe+V)9n=hҢY6:t͵몶np{XchNwhǾPKy}BGvv?Bxf5ԅ)&$va$U"X2:@yvRL$nImf<6DB 77\<|B"bR2r J*jZt |Ƞ["]Zt$ls-8fѲU+uJrK6ڟʻ[YRy#2glFO_3U.F+Sfé;{s%e|ׇ̹Mmaaul[g1hpфIRy $KRԺN6/0x9U8 $S?$։)}7_7;Brp߶t_=[R@Cͧ㧴Fy!}s'B|@@АЯ,_Q-8a1P_DsW?a^fPw%c3- Q^7SKVd@23GǕYC y jzYnY`Ye5p02{OQaHo,&tc'd 4A0IG5>aj14wvi jL:pQN, ]' ۰d:;G No:·$)X'gMT i 3tIғc}GfT'ڥnkPB<9$zOŪ~v:ݷHvO^ 8ڊ Tded ̆-fLxg>UPQVM꡼[5ڈHPcJ3!SOA`hOx@j]d:h; |C0pa⥆.o)k h*ji:kih&ijֶ>eק%ߴ#n8hX-6bmi鐹 % Ddzdb2s.'#5=a\6Mf,jSgUW.%wWmqK7%g`1Cu ӽ:Kņ 10qԸ>Z Wpq"5Ut3h!qy10ΪhaZ%#6UtiU&9ʢ_j?w7W8OQk\).btP&ŷgJK쇅:mYRy)M~g#14I& ؾEP>!g&ѷr,t&f9.o^\r7!I[ޒ JөpB}V-cZ,ԂtTJ4^Ƽ#G*Z7:b1OF$rJ5f1Ҋdj^%:J.uBx6PWet/g9fD,`mb1,Pdb2Q6{B*B KTKHtGaaBDfMrӹO,e >x0>s93u 5o)UYR $-ضΣ;A%7< TQȒO|x4ges#fok=9=QW lUc75Xby~4**z),u吇-FΟ5u*f΍+/pĕ|}DڱB]Le/Cݽ撟L~zO$T+NSnj WWE=?bw5<)1,AL5 VJjXCl Fjs֏ -ٲ7~4Z$׺e H>N cN$+m>(+|8pPvr%}݆yTTMw+7G' v[Br(-Me) ǿ%u!B4Uڮi[cžv9 3=y`a U@qÀSޟ.&@F7Y(CؿrvXKsDbLKҭ|M0'@Fmƚ U&)BnCZ?8`ė8I%f`U@639+]hPuwg=0}Ù劔_nBHqjbasvU Q# F NE~~{+;%82'Gmbhl9It(*cz 5%#t|Ntfg4'Xl}!nRݯ6 ILcֹ ^ΈK27+EfEޝ-y{\E0swmvy>6^-B1H_S@WOB[kyE.{{1HKXӽ '$Z7m?Sh$猵l#dF&5GeIae ?;hdPqafUȯQy޽Ly{SNc%9SaRP$ 8E !DZuz rcl2(: W.ta;f\<@df0@Jkq.ĭOQi#nw!. q~؋5(+$ckuy ta;@ut~r47=U?`ym_6;80wX5J{Lsr ^x}.=%?c->w|߄7Om#.#W6a:_leߝ %6GUyQR(ba6_Ebbm{%P2ػpN~lt~Zˢ~crmh$k]xAGwKx{5p arOQJBh$Boean"+U!100hi>쪂*\_:.–po) ._Lx m0~v Wȡi0kac7i)8,U+,ʗ*ĔI݂ }XGZ4JG\E6Е f}*:iЖЕ~DK,\善](QYwch&z),=j /I]AZٮMjM@VhE\ôfi?#|o 40o9o4 `dw: s%(븦tDS&z^Լ|;gqg5עŸMA1:Moq)Uݙm[tѯN=mx>bjPsZ/^˹fN6oD"i6Z>.2Y%=Uͳl4tq}yZD[k'kq"0Rȵ;ܵVbZ(,(JeR d3KT\׬ZԪˤjMeDSί;I}Dsܩ ±fq[#Q:rl-n%FgL!'K˙ʡ.Gtxj#QKͶuXwB" uպ'!yo^Gv5XonVl3QMVn/)K[<5ra5 \67`Ug"i|,Lt8 3pؙ;L@CU=Q\~ ;/ӣEeOӪTͨU*:8Wa'38my}ZD֨YYUcHD<iqzt1[r 8m 4)?9X$OQwz8pT.[|-5Í4P<)a]3 ~Tr>H-/=8t?mבk 9m%%yr=\ Sz6d8_B/}7}F T^5$v.|Vj\7{R2F[vLzk.=%sG91=TSx/u=+&k^X>O3K:LO콆9H)g;*T":Dz?<¤1JRk%00 XhR×p@:?'N\Xm})#'AWڏw{=&;xv؏?kվmuv&4q&`ǔQ1=c$=\eVjk7; C-Yq7G?/IfކN8{ns~CŪegSR |{@_h9/7D|y.at^?CmE4 j,93#<& [twbZ`:1G! /e Qbs|`$cuwL=To-φ{d_Fzes9n ͯ LDniPbڕ~2z?گFT?PN쯖RK޹oۈm.IG.Y0~ H unMAUr׃ Х UX09E|+iG$*oh7{Y09;kWP/1{)q~k`rc#ovws#%`DX׊\n_#mPUYe2x˒ْT%!WpTkC.ᆕyס$A(F:îI-du5^5{;sָ1C]Lu0A!pnrm(b^9θ9fWWe:댨jf\zqM2:u!"SGw2bp]xsiL^{)׹K3"c}Y-Bj%>?kr7߹e1Xvk"R1I/\1kΔV"^>Ceuzco||3'k.惟l'y6P^eېZK5FOCrQZ\\c*v`CgnŷfĽ֒uk9Ny* "Y1VHf,]c79tq*~mn"!r?;MGY߳v.^Tkc 7\~@Gwaǫؐ>f$49.ڇ=&?b>M^d*U&b E`ёE֣"M=/+?m2W )8>S^ϏSg᫝SSx֕PG#y֊ p!&9i{nׯ{Xs—8'd*m `,1x0,f47+fc3dDa%Jdf˶ܰ8ޱTF~v+W*ќLСapnf>TQǠ(:(Q̹*J8<qoS[TP/yݭ~aDx>sڜ_oXr K^x|Ô0Mzvrע(5솮MeydrJAVxN:+1k~ }{U޺#9 mš3qȺG>B0=n Ѕ;.${r@/qzpѸÛHhQ.6]5tl-/ƻDꎎ ܔd*hkrDj~tb#OdӁ%hRi업jFgUkާCtơY23σȳ3QBҔGI%s*&uOڥ@ѕ44A:OtA&YTNx .Ү"3kCժgiR9qqtUO/\LiN2VEo%71iW5xS RvM}kr8QG}Óhɺ&ߎ&9m/A\ώIV휛.׃ Uݪ}=bTϜչJ o(K3ҜKwۦ3"4b[x|‡,WdOS?o}Ědw5rRm }bv g`8&&N[ kڈBio6nAǶco% Ϡ\),MŢųm$eM{*N@˒/f/w?ע{Pe̠~e^s:jQHJ2[#Sh5Ӷڊc45~J]W2;厽 9$;3ݲ[^ NM.YNJ\yC;}٠Ǥd2i3 eXN%jsT{Lv"8 Bӟq4a*O@+p$*¯Rsg& h4Fnh5inHpc 5ycZSFŖz%\fo%~:i4y}}Ȝ1D) |F[KE̶ƐhxmgWB5p]f~n~pf[wmN{Ka5!>Yy0[03?5(Xaa 7kddn%3/:Byo#GVb w]m b}L,BG-:ji %kJa7ۦw;iz]jp=j POzjExisCY 5+tn7*9YFLMjC.f]Hl̖AS>M4>Ȩɦ?jA"m:[¬ej<<[,Gea2f# [0.B`~=fWBEv*1OS)!~Mj喰:?:ƒ!ᇒ_` MUS<HEOwFX̶f9m*/b/~=^)^;qΩ88LCѮ[pC3=)630.DzU_7GTlNߐK^V՗t;/0.d35!}[+*&P. /ur)jlSBdpT!C 1U=NWsN oLM V+>uů"* }\V 9K6IK9iF3F%4 ~ViHK0>P9ܷOb ^aq P7VG۝('(* |V@-AjRi@ eRDZZ%;a V܀xn0~`g_$&^H/tKK|\]s,I BC@ ;|Ϻ+`9,Zޮ% sK26?̾- e2\[{i?wP7;pC%qն}~ يYi4'vZg<_:*%?\h3oP o -XbVBHE=B q!fm2Fq3{a_03%T|mX%d.x|q%Ӄ,vX#S)armYP!%U;[rw1y2ח9ḋtF@7:ȗ3!st?"G,J>8Q ;ab.wAjs-E5E5EYA$u4ƒ΄%%b=O(Y܎@E$^Yr⪭0}uѥT"c4S-ӗ0}UbF̼69C`65W2|AN^Ĉ<4{ѵZ`@98fYtZN܋Uuq:]qG=m: WmxXQ+7)Jb[=Ӝ\:/[^'=zVn\&\7mI5!͕;j)[U[Hw#Ϋ)TY%{w6//fJ>?A3MY`(ʗK0 ^6KfFJΖ+*FL)K3,-{xs/y$(`-1nUw6?DRU+ # ᖩdeXw)F-zn3RyviG~ӳmAa}j}]%ܠ*4CTV/ uU Xo禶52Z*Bݠ% ]ԅ/_u=8qSmi~Q{1.znGŽKP,T4g~x4!GC뙻I4OsY>[/ԢsDZKoz~Z/gW ;g[mӼR{,շD@)|4dyXA\&Ym$j&kؑƺnL'xX}lOV[닡nk̭Խ^{{H0P0wUB e {\|iޙ XyZskn!}f:Dn03%HHֻ\ħg|7LCc0}Xj |${@eQ.J0e(ןDa%X?`C~u}jl*WdXI }AleNIm9g.+τcDsՖxئe,he `II>im[-zE:Ҏg$Gʓ35 .ܠOcfw%h3j-`xǜ xڦ^TY( ]kԻX؞ .JV~҉:I8V8ȆS2= h `ZJtǑڱKtܴ~vz8(` flC-F@~42S?=3>_B/iZ{#4W5'>øpZ1Q5Ii68Oa8|Μ{.71T/??r  u "uKNjπ(390.ÚXx'+ :Zىu?Qcη'vV=8joحg\V{`|a?D.a]_K##Md:| Źw&GnKms3&E(Z.;]NT| ÍPuW tblia7VU,c EMp7sBj˩HxC$%Mc}gy*x$Oy~dLf+0V)9ғs~]j,z;[mcep2LFcIs5hpD5< ?W9S%\W|_eHIMqWeFfZhаaAtU+#+Z3t:v6St׹Q^=Yݗ7Ά';C+(pkWMcL83X[`D̀ѴtL/Tl7ʘ hqp^eb Y֟mhhQH_fϿL?0gr#r[\q4H ꠄO(;ok^~k' H(U>rtT;L&&`-/zj)u6e$![NΉ_HG 'TWT5j$JNrMzճCk#ڈe0_qVELuke.s(wmnN~eP..$a<\V_y)aUVr{Rn J3k;|FYR5`81ٰh-e cޏM.uN'eUO;IK;Grg4Oj@@&MKvr`S[d_fa I\(j"awQG[Tn3d`q^,Іu5ʰ؁NIV+W̬:2<7o-wszp#K7#7og,)1mynwI65we].FmG#cpYWQ\72?,A=iqܨq_/ɬN67sˍpkSPN>@Zu? Pl]`v|ޤ]AՇ~υ˅:ns#GNNhѤ/Gh@͹ tqT>%/LT:wO'+CvCW+􎘺'숼 4taFQ5`7hq2 n͛Cw 4̎_.Jg* 5MoLpUXQzM>/zBc;uRp.-M&86S"&#J@F܏BcDK302V`::H3 CC0iJ݇7.wu0cf4$Pm=` Ǧ'j7!@нp-qaVTtC%n _Cd|%ɜNE[mʏ=g/A~:%.4OY'C%)qu%E:o}ۂƼUf)q|GcI7:u5gC>zq (ebwD @-H'6`S叭bhF<ʬ['wV&2̮8_4{N!npp|z!3[,D,5׍ ɆSXW,%S,;N&.~ H%?*"=<}H)}Q{IKv׆e Q=suPf {(Pd Q@6߱&iifJ&anqxA$.|AZjIH{퍢 LI @bx#9'ڨޢ`&at(LnX0(Q@'6S'MSWδN p&ixH4JsQXѐxyDꙉɥNf&'Lz,Zǭ8zl`8`Pn>|)Q_";9Ǚ =q}<1hXeZdMjZcXcJ(xuGA{ћt_!f}3?TCL#MkM?Bacƺ9UFDd΃<)/fD60. F>kh5VG Sj?Kj2YR` e{-TJ-?3q27X7RR)OAu c1OaRWϹq^EO䉁ތkt-着j~Vr@$"VbqJl..h.,o 6ʦ`Xkeo‹V`GQt$Yn"85Eî hORg)8"?tƼBcoaWR/βHx[;><}\֜VX98.Z8 ,@ Vʥ% s"\3 ]\BG6`~_sh(6[k6gR@SD>e2 @_$A毆eyBukPl.ПCH^ubCmD7p;Q|9EJu@Q'F0bz2"A58y ߗ&/B:bż-o˘:dL`g#Lo7ؘ'-һxÀ!λk]S;X#jTdyA;dREȧbgܑͬN=0}s0>(FUwW#ĩ喕#f%":`|n 5Rpkj.8~x03Q„Gm 0\`l (PXn)"/;+_9+m>(h8`ܽU57qT Ʀ"3џ;_hulpI=O=ŻST͎t'B7_ZґUiÖ7;`N:SZ*_53kT!h9P鞣 kT5vVf7ae%lv@K9zAUlǏ;ZfnX38RDo{Â^[t8)&dzB&oo2V tߴ~7hf,;o=u\GK6z#Mn^eRmIoNy&ۺ1LuKunK`E;C'#UH`$ן/ɷ;o 7pLp"pEWћBMl\1fs)s0bakMW¶`^yAkr`RDbucP\f5wB8i; slbaxB**kJ,7lB xW;Z*rB VBF|;xӇC_(I'-3y L9ė8K<6F azynq<'DuYzf{u5*hOmp$#[yKѩK#[7[[9nHi2@Tߞ+ C>ZE4h'&@|Tr~˚-T~ K%*Iנd0-4>Ois:+]L5'JfA.[@BxUVFhVznCuXDƠ6UklcQC>]B߬r0ޒI_K+vM&y3g~ѧ@kyЇhn2+G˗1{*ֲja-[M +.=0RWf"b87*{|&y7W:pJr*S{voFLG(C`IvÛ-k[g8,=k)Nz!6u1Yx`ʲYDR[TE,ů9ְ,|HEIa18G _(CTRns;\ <R|~ӖknMZٹgoF]WIIש;=ՅkrCb**9ZƩ=)iiqnJ47C>a-8L۾hb?¼ʞv̌Rq(x_*SIdtMZK;(vpzkZ#pЗ|IB +YAEWu&ʬf/̚6|ؾ,eg%Enb_SϧN=~!uokq=K plPd\M2K=J .(f.+:KLvQw\9=tLR?꫙QS#|aӉI:)ƚVB$Ci5':ӘY]ܟˁbtPYOͼ7椄A;Q]܎z@&_^hqэ1qk[D!o%gMMP8P DG'5uoM bǪ KG]m5wGAjvZCQS`9Xk)|{ \2@ld.#h ~$\wM:EBki*"l#~{ gcn`Ғ׹?Y:ipwLIȉ|+~|dS9b[9:kޢb;\SݫN*rG ΚǩOi\G9SGKR'Y\Knn6jaVTB ;|BX됣q_X;&?&Fy&F{<50'͓S5ze4-ǫGOs 3%g}L0vĒ~$R=(r8yXRcFvb)~La >a{bQκbz' ia^e\5lqL[VJoD6Zq59:ԣr6ۇ |-2K~*%x7Ngvmה^d5(7%G7onu},*&%Q.b &Y@|d*Ƃ߶ U /WoM {kZP"ֹ״?y1!֗@)ȟ׻"@=싫\5ܝM_AZ 7RwQ_S@d<.[ |[S]Ğ0dv /{$rgGVV҇uVGd<K\(19"inz%D&az.]UpO/™έ;F9ZB_|Hh$HMy)%nE)[\qOk[X4?93L\UnꈪoՁ0(gJIU,940ݵ13 \D[ZCT/DHL9>SZp#dhgt):mAh_Vs,^`i=nN~KG=>2C7H\&\mUpL^.AcY?-.pPcUΜ# Q7x ;d)~"(YǛ( Wk|>#zIIj.פ uDAtµy-Y 4 4*.dm:o={y]MQ$,ejZd@USx""7>/A> ֏=x:>&ӵ{|B# AwP0!#֋AE"Wu22!}Hd*g^/ OQ={c>d&> VFTƉ`uMM /7fְ8TTYH|Uoi!M׻FrO.h0Z52o4͓,~hcv7a*eCvp`T q(vn@4%8zWX%"imWT6Hm<$ni4, L'x"y|x q 5k#}ǐJV¸ժX`ɚF)W.8̽Upzᾼ"+7l|` 5rv9=;:'g}?`4[S6rMZKQxMoh/ ^[SGJQԜSRc5-GA#ѩ*<1hCu3T`GXǵ@dUi#+}hP㹀 gP-ES0lg&$܆^W-n4 P}36f 3)jYt!40x3陵$%ff3iePϤ1Or~R~o\ JUn8J 5(.=GYysdaw,!,%FRɖ<ĖSly:cDmV p'N2a "ItEIUIUpJG UH_Gsq/ F_Ύ{h]z* m,\5jCj jʼiȜM*!s + YEEX{Xmc҇8|IYԻ}ts^ t7b3@Q?EhfR%F9IZH<J}Gl{RBz4ER^(d'{Bp!UFLz =dܜG@>h&#*%Ydɭ`$`VV{EEҏ TDi853=;~B%&nDeWznlѠ#v]SN ^$ HiFlvK>?4٧&Ђ+M|Dp x xC,oY e75\Fز4Sz8"'/q+8q5wEd:4" ׳Y~8Y.bv  z̲0Wgq_D޴eۄ ?h8F=z]gzˬ5ɣYhw|ҩsyQ׷aH7]hNG*se'vQyv!l-oZ/i<[лm/5nG~I.Uy̶!j䓳ĭZs dH kq *23^3]#ldD}(8}H$KjM4 c&Ĩ_r@szT*M ^f];\jVU,ckXB5GF u Ψ8Vnzo9]ʹ9kUdjq鮨Əw,]Y$ivEVr臕8&'#5<޸?(HVP\PksL+7%Rҁ`+yef-^RM2wP8X8V|pZQJZ#h%萠Tθ71tCdOVSFtER˵>d3͜"boѷG/G/ydAH./z)! Th&_bl?ieuSҒ5ߨfFUHmg w-=_$ÆL^ N4G oB4yݬ@oRD&< bCEN# (5DٮJ QQ|`yP~hL3ag!yE7s GT,`:9j,s08$J*[#ͻT4Sc<핡<.ĬM<9pL!mA1"r=,>l>.HKDhCdG[֚$7TlT-geASIɅ<#Z|J#{ yhܙ%S YE̺, 9r"]dڑa..t0X b+=vY Ke#:d2j*ٜ_q<{/Sr>q%Mfaѳ;ɂM5aS< ->1Лҗfp(iB[YɥBߕ"TkVOTlՓ5\$]qE+FW,Xlt2h1D-K`FaP=;fyhB[Nu}ՑDܦpq=_Óarw5ڃ0G9-l& K9g@;VμhɢHUZ"3y4O!eon uQD$6ha,jO#amнto,0TRT|•@TJfWpF뀇#.ĵīA38ց1ʶ_:uSٱɥl 8Q6K r-&ӱQD2?bPN65&;cdv3IJ6Bu9%g!R);7!C3/z_a^ OJ aZxr *v k家Dn~DڕTWrqRϊq.ҳ,6 % 2Y1[fv`v3m}#ːx\a`6Ñ_c՝COs7~q:p*Q,ن݉*drܺcmd0\ $S\ާcJi$\?K ~Z`^0ãd<;Bzѯ˰˞庵+{#_@L7ySɋ.b˸ aӧDc AUq*DpYl/ѧ-NN é*c ~{_x)$<ڍgɣlv.ApM rȷ0]- ea?\$"P5 $`JIhD?K(L2*QTY 16g9:@DZGO[[XЈniQHmD}so P\kk/<&G ؿrI6` H2ZTFqj"T5o@=GytIP W#Rˮ_@s;>Kl%AKf3 tqgsB.YTD 9ֿĻ-~ JvK:,4\O@ 1#]$cGYP)YzM=X8e+ %lFl/蝗4HܱX%HY+bát{]toʽ,`FXN)O@)/PJ_i:p盡m1X,޹i5O xUg`ZԭWxR$`mb3cu{[͜oդ,>-&IT 36Nl& 6NDK^ݛݤΞOAHX1PK14<>?k桑@<с2eഓeKk=y )8ZjU`|y7z-b I[vO@ݧ.h?i21V43_Gn!-uo4NTk4ՔDa[2P,']_Cy½&'}CāDG1 s.%uÔmkjJ|bWxm G4aⱵ*ZIf^1?Oh~< PxS #6 V9[i0 "lo&б9O^Kykp5T?1;1}2xP.4N|&Z MM{o3qtfJ4j뗓-xB^y#{sCAUrVX4:à L5 IV5hLCDWAcd@m kM,Uú|@H)؜g <j/h Z쬌*9DZs0/iޞewLNy CsaB.Hy~\xq9mPvL>qMʼo5}:;И |!8K@dzы`dd!~ ;!U(N Z[d2T]F#W+o{yjM$^f)M }Si)Ny\,zxzLde/r DMP$ !2üYiOŜk8zvFl%BDX E@S6nzn FCvV]%V$4wEґIH¹qS &Đ(7JDdiR`wSbghsuc?(YJ<~dw(o4ℭIU>_jϛQ]41suv]F˦?m81}AZ{Li5R`\{W5K;&v4-{C/++lI/=T{CI2/UZT7Tnoː_ sۚ_3pW ɫs!u: $$W QmfçH(6ȟI/LS.57]~07c,Ui6 ]ո~ە9o-٫ ._o^ZH5mBBW- j7Z#b$tr"WMK%dɤxd]n`L4)t8ƈ1a%Fy[)tnq+ɶ2P YvA+mD180Z` ((*;A[@!ߵEA1TMAjI΁hO/dCLmH#gchxZDt>ay sf=gqzk_rDc).gsHp xԵj PדXKH&8 Ho9˄aDLŖB8 Q(##fPLeGI--3$K&*:CST>q - V_9s3QWnMXMDy^^gq<>α:<1[kivtc-.RPFvJ YCQ*)ZEVrYuzEr[:5C#RQMfJJA)5hjef4QrhNF+Eqyo0R>"6MOT}AEoe4gQIqk<6)^2rdhwgJnhix&/4Շ쇷Ggo= yyND6_?{>ύx,eݖl;5:n) i9Uj%J \J|= h2Iy˸̆Š=(,$5 :SKCaf)oiW~@*d3ܑ_=X NwCnf-=6} %Ea=li39xmpdNyV \v_!riԡ #egZ*Nݘj,%iT'Xc)֧rpd4p 9w] o54لSR+$M5˂Lm(x DfִIiu&dn$u!H{adJ"%)QyVEg*)+YQ#0Tڥ\vd(yY5dkJY2rNva4@B`ۥL i\ U yA d&0aJ ;ʤ)i h L0S~=Ȫfr`67:=^FTgnGEkBg]{T^c55Ey 4!Zҽs{05MDd!^S4Xj61%$`Z||mh4(OQFPF:z˹ GFn}?;]>}zînK{kHy#6 msgb ?)ڟz7716o!`sOA*H˺:,ɍ%*h$S?щ)(P.R~sƉê[~߿)Xx%ޕHIN:!~kª!#'Pi6`; KzkxgM$?iAgOtTuL4TJTPdF9Cu.Nꧦ wo~ZC}?|5c6ҍHT%*Wt_s5&J$L'@&=l,!e W7h&ߢk#.OaZRğh XjXb ++3@{9E% ɔ(O߱)"='0}28Qd:Q>qi^RR*q{Jz$^Z>.q&vK==T_cz~iOBkyEϕ?t"r;;GPyOkDӣ֋~+. {*?&y?0#9`5^*ӚWAZuDxz>"F]j#Q`}B雿R 96ZPK6$sq{?BAZfY=2)ӬW\X v%ȳw`YU8' S=Zik 7立,nW&p]:&uL˃+[~$'cc6Zɸ Sd(Ft1]° H-o) KE/xH.vuFQ# \[dݶobrhG8PKkBۦiFK-r&\u3>q\3$0Ha(F{;^+I5kjYTHev415BT&~gtŔ(*MmeJp-rS cC&c\tbqX9'q.NQl&Dw`J]a=@xsÀȡ~l o9O'_F lF6Zh{@iqZ֜mv@xMHk ";fs4ѷ%Ǝ>už,YBnD薜r9CW2QIDt冇D9fH/*ŠU2,pbBdEPhM~M>GTv_/)b!b, TpH8"G*\pXd)F9eQ2 KO,&ƻEaw㚕.tEA6FoH_̞7*3Wr]y ?3P gGg9gobP|)b65HyoͪJ῰.H8=ST91Xm>J]!mި_y1^G  eU+ nb|Qqa|o@W;{aW #9U34S}ʘeL-, 1Nh5T o݂5uT\"!v? r]x㤥Q] ኆ{['rLFHK CkWX!&u9ܛ@mQUm5 &a cV 2:ljPF5>'O|SDeZ>&mD*h}d{~$8^;j$G3vUg ]EnVK18:N"SD IݖaV31#Zߔ1 (G*5Ϫw5"n1r&9nVmwm͠zlMZUvlndxl4w$PNȷ\i9*K!*!&3,ŢaSz]49(DG)*p6~>qF*c^ݵz'D+<:%ߨ%kNID7ś8˞y@ !$p:MparJ ۰y,##r ϊ3.*AŰLGPVK?GRBQ/$}2{[wH%D\۱Q %Zۇ*N(WGk ![jFs\"$z]$av:K$+Q^}Oxö, po߱%bfm&1hC=% T֒n>J4HɖuI6[=< ;-1٩~ׁ=n~R&n 4_͚iĘ-2M_Yz v#"\RFTu辂:nڜx [+a^NW+T~\y[1$ɩdD$"N+?ALi+/9c_饰w/lU6OP@uٳgL=QnC)* 3&w(h`DM$;[TY VkOԩRZa:yjg^_\$pgT;zYe(5b؂ cLߢqGы(8?q^Ǘu"jU\-uk%aʮՆb:5MǣFX[Niisr W1BEeN+Kx<0V zRˀE[%/_̏ }0`*إ84.Z4s^^~L2pqΗ=}uPuF C`elqd^ZA7:Eu8̔ bP/Y0G%:Pd |;iƣ˯_WyX{j:.Qo #6īэ,\/h%M'zyfkM&DԴ2$TK9+Wg| D2{-*bQzʆ g-tZ{`@h'qE 8`-KZi j\^:A*/zpI&7LnfŇL[74/kb / X97XYȹ?9KXi(0c[DV^+e%r)Nnb@zCGyf(#Js2㘻z4{祔nUo|ZJQ1b.qTKsCl۟|{nUh\mև}UƻfL{{_w?WmU>hf$4=.THn_ ۳nX_ۯe]HG?I%vY+½f ~zD[tE1J'ֲut0wBJ_ojڹ7r_p4QځQ8[g/Kk^Ddkf9VߋỴҶy썟_C|ý"~mWRڴgqf6mjH7||(87/H |ߤRDSr|^,Bƨ!Ëj="J{,-W&I?K{gwA‹χ4`me8`d B"3m / O=S]]-!7sgVDQwqEDOKd! 2ߤZyrx^{A~ƿ`T ZU.qY̢ uaŋI;=d[^DZR/n%7lWuͣz[yQ*s|9 }P4̬9޽- Mb:p2boms woǓq)EJ-'"B=>K7>43v+V* `p${@jNΫ@É9*"Ny>4)xPHrFD-i *"e G=h#} 2f&H~YD/-SN'~wq#I_ئcv9i/$qthкZ?oe5KФE֬ kkw`T$Yu묿#-T.oF`i\0[kZ%gf;Z'PLb(qSۖډ9qF5Q.BDg4ڿ?#Tz!3.Tg#vHݬ(sHbI8DOh,摕bZ͈퉌虙2NX2w @K溅1XX/ cu=CW,$ WƳZG~TØ\Fq#C IoqZFM-r#'Ξ מɪxGY66p6B2_C3˼V}I˷QAC.DVo: x1>k"Pܸ&1pLn1ܮQKtzk 4J''5y8Zw܀:TfǩbOvʒ1dnHiy۵^Ɂ%"_no/Xl1x(I!'bԕa.F`R[|yO-[ZiM=tR;j=l.k@/ HM ɜ\6 H-h vkF=8 0 uUV}6kq$}f$;RVyrdokp@/Ne/ ؛oPƐ8$e1E{kXf0jm"=F G7 ?0$B^~vs8m)#;|!Q"j*$bO 8sE&q-lB.ˊB.J'81FvgGv5Vþ+\pчVKx@Qt ՜eޠ3Hc1k%Ӭ]|sHؾkd^sYع)o+gp4ŒTG`uoQlV7;Dx^W=/~`u&# |COVJ -MYW bBC@LVG>G -*?9r& uAC -MwH0 9;9umҪtMFC0X:+WpKDf+<#X-F/񜼍 &pkf{dMAD&g*ZQ x/:+ dc}`#X3 γγZz{̰{D` "ꂼ'S'  l>@IJ ^sXG NZcH)KV(ag IM>Uyse/-oxTR,[fggt6#LUm?-q'Ak#d/gL͌8'zK8Y&z YH_$Wb;g8DQ˰qcObp#{0=G/6Q;X37t;>\s=Յ^eq԰:.S;tyLA h.u ʆ|RʍXM@xoTAG wy+ j k~ *竫ՖsAzZY 38FD%C˷RBx2}͓7!iD$MnP/h:AT}/̠B?TGEvNp5/,vM&3>?!՛aJ^Iֹ27bgkRU,IQ,|RN*WPRUMY`lI徙`駫LZ6cMb37Pkts[4'~AE=g)L3{q3#*Ύ$D|%x~SQ2(X~ N{8'^5Pܷ9҆C$($0DSOA aIղ ;B\P˧>Cih,muv̝OklOYN=ۄjMDҁ}zsR{Seپ6n@<8(ߠ%"E }7D$X VC*-S2Q/T.tŒ3i|qV㿖Mx:@F eZY·e K+;hN Yuk1ʣOO?d"@yLu!5S/$po.]8%hZ&ү}_N_ca !`VN)=o@W$,:" ⠣Ww;: D8+ g@wf ;Vd/E2vPR "e~- EvJR'JDZ+.HhqTiQ K+:wiЁ]nρA!LF@|_`o$Fjj 4"%CZZWbNz#4';.q}7$ S+y uU`@X(q&S6*`r&YܛU ӕuBm*Ecb}rE 'ع}YÕPzF>d(3PP+)vivj[F;ѽ]ta(+3x_oRj%0ʕKE@1` n!j9^ ffr.Y{ V=S;J~\@iE/P m Y(EI#){KǞF:0euepzӻa%+KveAKB)auK.A>Cޫ:~K ,x %ʳO5s0k^dI@WQ p# Tcr!Mwˎ#n"ʣzt'ܬst9E,KجJ)Xe桟qmJr:` K_DY {o^Cn]+;8IY\hכu[ O.ԩ@7[sl9#!:$X>J.=` Lt¬>Ga;ɍ! fj2R 7]E/;R()x,//R1녯z+4,߅Q7N\<¿@)M̞_Tn)u W@)+VЖ,ލjǥgnzs,hC͟YJ[aVET+8;t{q2`#&+P l tH)LhFaR1] v˾"YƎ%s#` GejAn0Pɟ(fGb5nImK~:VP8Fro"C¸qUP7Zv`vvU#/5᱀0sA*t.r+]_7-4A!ILfoj8NtPۭt^ZrI( d֡,\jPoyY.8dL9tz-\-4əx4薛;`=&zoiǟ9[0Sy @&F6~a%l>uEwD~8XAZ q)Ӛ=pAixBX|L/ˌPdct 0k"d.奼ҕ%3؍H'!P7fwۮ/ᴜB攊:/M@ՉO00)wa*,tKhvY||:TJܓS|,*P=W"Oizã=ic[:yAe7p^|A7]/Օ L3cOhJ r;sh;B#ys[d# U9c__2=z l}t#!m-lWS0wz<$׸SVӀ C΁Ljft9gW IODN^o !ADmQ.Sj>ԶՊay&4P]`e.1"vB;ea7liȠ䥢f́EѻrsV CN +mcPPڪAj"ͦ^S%gId6렴Τՠ <`Mhy1J(%N頻GtR$ _ٱy*_!#t!9=bR,dRs6Qxgc@s c`aB3k,0K殤#(Zf`lH¬X6n6/&THn 1*_ B¤r؝U!B CHg[ A%%MgU5>u5kxjȶ r ]ʅ|D)yv]hA(+'C{gB f+HW|9^Y;#SEpưǎ 6K 7\kAO/)d jXY|z&gWJxm=k`{fa@!ދj0)>D Z? ĭckɝrZp[B)l5{ 1w]T ",z/0W:`AA@W=S3M-R tHpy%IHZ/ ;Zdkl y!-4B8<ȒYQ,i{ȼ8~z&xaEbd˞43A\ iq7)E`1z-9{a9qj'kn@Wٻ/*JhO6aWf87UZ4~%>axY6 0$*eO3RX% D} —dKߍb I >͍>~lAYf/* wgKs淡ɱ6,|eyCւ~{,۳!-'Ěf{c6pDi ).BXa[}rA$^FԩvcJ;|rOdYZԆ@Aj^[8+ݘz Y:-Q*_]i mύ*Ш*ҥ~N#[u`Ot>yoz >&jj ESXHQRˏ"KAK_.U2K$p& ){5㎽r'~a`;_J=#E_ܜ ;gkeI!w h#p< SfPUnp|GFf20s z 䟁- q@Ժomk,aA]2/0{bAvٹgB`/paz]1[NT٫>ۃ5,Mn 9NCr)F,Na' s5y2\G5Z6W}oZS=Z{~8˰B!x+RA3f]<\ bBeHjĖ4ojT])y{ڥIy#/P`BXN7ڙiŧeBG${95#J3u I݈[&R ښ;#ע@MTs-,F~ff= drÀ/21 .gvp~.%↰[QH8ey~KDGZ*ä{>iE[g } } p-:~%HYвPY{,MEjBuxKG*͍KvnePc' X dg007vTlTa9X(/5FӐ8u!Ѫf>z+Jfz np;|+>. 5gTZh{PJ^VrK1f!\[ T ^As Z?g<=lË]c*I+GytGh;ig>R/lFQ8kn;2?9(} >״~7^XeT,xֵ+1~湏^hYಠXE+A|h`v%mTGcK%:~bB[Yai$Μ8^`ީD,)v*bxNl:藓? x0xH1eԺʗwk&t$l"E",,561 \*uJd.ă9ퟨ@{!t8yۚy.qjxc[3S8'Q <fl!sn(bܢxt9-*PSx ٥n>(My;vY:^שrzF/5[uɺs N88dURζ x033'܊wїHPQ~(͎c29%O19F^/c.~8S*M+Jn<5̓'Nd#mq3[|i]2\'m }A];!([)ݧq1*$~m`a0c8$_zSbSFOJƪbmN-䮄D1N7G=)\~7s:) ]xUgCQ,=$Va ЁHeɞ#@.$\{]gsbt~jUы(|jGFZ!Yu[(Ml3*>\^0ǹna4 l #u)yf[;zibn.ǡotJ߭!LlhpST}-_-0YQl]b*]wߖ=B.]l-[&N!{تnGD2mE+a<hA^Z?IT &{ 9*Gp`p,ȶ}/`"YNrN/9T'r._Vu^vэ-ǎd! bqτr!|+,Zz~mk_q\İ?JQ-]Mn ?x3!مp;:Ed͏.ӯXѬQD-M$4{K&N[2t@iXT1gGe.9 (qHnt4QԊB1OTaOM}B-H ʳ9!8/E@FS>݊@E?8ztV&[7۵%=v~3.tN.'r, `\ҋB쫠hI>eG| )[U[c-A}bLbE0TR[&y8;w3ݑ ? !(i6Qb;G9l9.ޅL^W36C[㮧eA%lBm6;SWa&XhaDy`Nޖ p&q=",=̺8ĐjV΃?N6yfΆNwSčg 6EQ$m|+dae^t-TBhnXfg<7뛨dD 8L#}CAț@?=(TENa7^jׅSS! }-~,y`fFǗH0haCמ%;@Aא+f囒)KWdRd5kl//i[Xxv 6ch׮̨!Ƚ+_C[S@"gAZh*&N3 +hҳ)Figj%= ~mTl ;0-7$(R IҾ JE z̃T[hޅ5#5^|O*jǥob`2ܽ;sfwʎ&eo-#,^ QjUUI=oi=68Hy>c?c[W%f A_%}<.b< tO^fK iSVbU*a+q+A >io>ZOpJUaZ${Cɼ0TxyޮO/bԔ0d*ܓ$ҜmdIv5ðL2u$%UT&s d .}puT 5,h!y|8~H+雎\!^.>>2ZuPBSfD*ADf{#P\|x })t?{z JlRH^6Zy'&=I)&’DZCX2xu> Ibrjs{{1mF.m[zT y0’NPnxM(HG#Y9>O7͂8  i3(q 1Lqـo[^HYj0q2VoAɨĈ µoTb[\o0M䓍9i%Y %& 22A~O.䕯+HL8wXuo֢愍f(K2=q{zp;r>HADݟ[!wpڮLC`(4:M`Y_'߀4(V &s#PޗEЏn~b<PHI[D{\1Å#"#*`Ji}{n,6 Eq.;>ޗ0U xDRn4~wIPҵ#x~Z,v@ub5*jL/frU l $%CE"Љm 4KrC@GMJ%,ZO?^γPsR:/&]}.KthO_""F*[ˁTXBJ!i]\}1(<4@0=P{~-q?Cnp,>" s-]DD/{Σ/*Gpm8) Y߈?RRg0eA\&KY.G ̸ Ahk[j-G $w;׀ޞ՚a"B wqr"P [|%A؜ H'> ]x0:=;T[)q6\<լ&`7K;J*^GqSzv" )9ZΡ.FHE `nRt^tV ek({Jͣ#fȈ}#e&;`厶h#Q^3oQ#8= ٠-%W:]\(@/dsʻQҕb 褂 ,Աo PUrig2.)ӂAtM焿Qhca@i +p%@sŖH`?왵֬̂IFJ*]յ*b5jʋ`^%^֙ t1 F{ GX89dNu͘3]qP26!0%BW},GS-UOL"V bq0O' \JMGm?q)QsPi? sUU+t;nݗo{lXӏaWP 7p[ Q 5~lϻ<¤ T%:7{5!.K{mM! ŃFE޳$,ڤI.Iu}Ai-;[ IObW{֖)w׫_O`<-zM[#Nۥo0V^]jx݁,*SYtQ‘J%=]Gju/Z{SsBУ<!kD;|lCV}޾6v~$ގ(J8!H-hFO3ܤs.Jtẗ́ =k~o@wD%.pLb0] @'A +5.4H=O~ˣQQeuF-X888.0I{W` btD$Xy=IR`,]ap$ߝQ{w~yYgiTY䉌v#pHH0t]:*+]$@µM)b]1z{(i06 2c+,@ھ߬KBq{%JJe}u' /-9 ✱G𪾹Fq'HKmzd!^X#6#J[4$C|$^z(̸};N#Qk1:ׂ>#<=O,9 ϣe$KgOTS-" 6UP:踟R +YB?;j;0X.8tg:wWR7rgt0sq:.#/.=GD2/B`n0m1j$մ@^[4l!KJ;Pp긩+^ E `BBM+Zj`J &GbBFR՝uS/ ŗtV =.fGU&H dj[YUe=*$Jװr -;6_1s[$ nEC2r;j on!,$)-B|<vEW֠`,*cz+(xsRj痾M{E|ewvf \Ԥcu/|a c*%E5 z@EɛMV \x#Cfٿ}! Pe)Py]N*r:U"ϙbdžH{6և%T?v qQV|Cv}'aPKQR-SgО׼iḮ11>+ɋEϱwj@Ǧ y;fpcԚu>ֹ--Zn,ڪ\wadZs ALעcLH )ҷƖq:J>Zl{)}tWЗ"Gtܖ$LtgK%!]N<%;`x1QS.#Ǜbf^=J<|zPpX~?߯*enqw8hʁkE 98kb }CNC`:~eb)IP|G H-&`?%lag!|v7I\GO:UQ !b@&L!2%۰)UWo{/H.eCe SyaP{[B‰G_Ox# 0#DQpbX4 Cuo@\B!-> [2}Ս*GzWߛ09M5§ltJ=KFHhx0A[Z;+(P >R1X3lDB @6 %)sp>H:ljxʧ%^ gyAcuh`.1t4bS pgZbuNW̄dS&'>_',P!+GY7R}D~1y O {S٩  *~ t\c79퀙-/ sB?|f%a.J/܆C "+IvƝgM fJ']C]bS0ʱ֒yGPI)/9I蕜FK7dDѓ/ Wk!!mq9w \/@UNəeØFP3(G)TbԯYs4 *9wNCI{dE%| T^p[T@=C7=+R 朏,QQ֕pH0Nڝͬ2"|0~7W J, q{oS:WOD* }֐umi(6*~#Yv wEw7YhnP ڍLokE 8bf:_<~ŮA|9Wh_1 rC>D . `#ߒ̻bXo7ȼb+.F*)ZP"ly ?1 'xJ<v_";/:&Prc Kռ˔FJ4CWG1r6H5@ᣄ3~&޸cPK{b!X}qKY30Wl S)'.[ykrW!uxGըeQ/4。TkgB{Q++< en M 9, &it)4_#Q Z")d)GzQAe(WQK_tf.E5 D9Ea; F`h{w jiےןH4Z}zË]bkwurDl]WNh ot[ϚZ4>2Q)3׮ Yqrߩ QK6}/"" kk.YH =MU6X n%5B0MQ6_Ǩl-^%*JmKh/ Zo"JdM7`B_"\" H;ްѠLl&An8[-:vܻYS1Hf ]# e*M-&yw@ t[ev̏*0E NI DrZ?^ `6^ %v#CuVOƶ6ubTm] }_s`}P?kE\˭L^0褡gXw8ISš,{ܢzVN%&wp}Vjdp2Luޖ}I1E"wpluQ GP9*K6'ZD Yt\6X93C"gB6hk٨5!J a]x"WhBBHGE%|P"v՘~C'l 'X^/4WjQtGq6}!arfmۦ9RqqDcIRA7ĠI3$옎iz\i7D;8=d*iCb5oLc Eq7 N*C>4N:)I{yh8 z%UIy`&OqSW_h8 c88D@>N̉*rA.3xF 5DɌ'S] ,x4>%1K]UUg:^yͦG'gC9xHʺN3e&]Ȫd*z/X][i܎6=6IY4!hQZ2GJDdL ,gW`LA%#d捋Kg -N-p0C#1yx=zt]WZqwVYJ@~6 LzRP=ȓ3 rjn$ k̔]"5EcD5֑dqGC 94v?$1&f\8Y<>GHOjA ܯn$we]f}d4/BǽxC7LQx&ހ{$6)[9O0nc3 /b8NR5c^2a>e0z~EQT jmCsݝ?PWL9⸧nL"BG(fuɠ+ o6r;P3Q|f4p3Ռ z(tD^a5 g$Yj[T@4:gR֨3B4ZS%ڛLsoL,9A.eMC({*: ^(n(ЈX[Vxmӹh1&c xZkVj9 'ȼG3s$1j ;qV֌wL0_Y 7*}M*V8 sgTؾNE92,E c1Z~Dx4*:!~H+i5- +(@INq|+{ƾ_OR;zʽp3x(gDͲ腘 oZ;իLX[;uCpkk#Y'o`MB{8+7j.rzs+aM_s e ` kNԌT gW걡 #sj=&IҀRq02G(8Mf-<1z?.85 42\g2,2ck>FD{T)HB7LGh9C 0ϋDx,6A8ֵ`)ƱWFnh|cc=&04CL L892i%',4svIDyV7_Yi\yQz0j#,;|L*,,[ffe^~\jtᰊqf=j$4tEZPó؞]Q7ɓe[2,zf/w0ȄI۲}*rt9@jyoWC`N!i낎{>v)v@\jY@Ș%(*}p?5\(>aP2iUfرзaPñ`ǻX]Rg,kT= H 6U,.F2'ksU(N~B)¹ f\0t#<i ʞMw'dl$p4>Ӈ6 ` GUl@6?]S_Ͼ `W]Rb F+sk!x߁D˯\ nD5pgrO@q`byj㽽R,#2 %U4WV0o-D( 'Vv @W{W /v:G]$z'%~f#VKu?XHj /|r=E9j6O|1z߿~BYŜ*o^!$=Vm"l J|Djo\szq )t ،pM)%c?ÌD-Y8@M7:(8σa>O.<^&7%v2.@@"˰EWgSu0,JZZ nvIwkW#&,>ph粑h9j'sj ($L~̥:rZeqc#ԩ't(sUMMږe_IfD)}&(K)Ǖ9p*;3|KXn{RM~UR|ޥqXJg@RImͤ+qkJ 5-%] e*r-(QRnfjGQJi_e?IZ|X~< WtisĎe8ʵ?uӏ >;~~|dxٗE@cRU)T}ڪkTsQGY1)[jheBWJ9;%/7=/~*L:;";Ǒ%Xl> 0on?C{ ve¹ 'Q妾^Rwྦ_<gߎ!nt\2mQb4u5Ɇ ywDЉgĩV$d;G< /$G7`FXf$,YHJ? }]'sD} >V@7@jù;hNT&sm4`KE0H ~=|xUz=%k; gw tpT~j \1IV:>(ISvZjy@"~΍74k&\~ tqs5Y[(5B네tZfm^Gt|ZÀj[K?n9@itAulί@dnkԑ 5Arg2{,[}C } -(]& .b!u?,JBu)9?.ٟpa_d6:aw Jo/ $2ԍC<{6jqU#022RGW ~"G*£uwc>^ pFO_%_nLJf|DרVВy9d,XfӐG_#g9bL|E9Y㏮ع>=OU+ |RHLdu `h@jX1^28&uV@aS4L"QIvYs>ܢR =ȇ.Zrpib~]K OL7?zyk/٫6z!r Fd$eQK~?vQg>j%23¼7#Bc;_62b٘_fss;j=o ;m_LmAh\'aoD FIy7kqI1 Vi,x:l-^)s|R 56}`PpJvZ72xgo W]uwB c]"O[f}TWJqƚrҝcb{5je8 %NVg9,S) K'Z!63$svO2v$ikXV2U0 !5LDbDAr̴"dƾMG #ɂfIĜJFg$#׫BU+q!n~Fu*b)FJAg-?RrzcEF,b?McBJZ_lT$|fP 5,sYDPj$򒇚3{HSh1XF^=: -d {BG fZ ɢnFuX'~}E`=$5"O9qA-L= ؉xSI4}wڕ VZy3)7`NWf^Mb˶{+'1ۧYJg87Z M5q!TEUiܘ𱠈Ni+0výpH@Ӱ1ùiҘou0ZgtA.IYu94w0<͟d^Jvꍯ_p@MO,N(4%@HZף㩭38D?I0'fX ]GN +9~'Ol+Qx*}}VO I(4%@H]G_vݶY]M؆Xx}}*s;e[62N LMۆM0aGm@3ri +Y-NJEsR24]yJ^JwUQͲ]Nd; )dR(޷\CO!h!9P8U"ΪHGcuURvc1w}<5o5V~:ř;fHUcdᭈ9c*U`7a> (@z5Zt;2<C6B%$_^\ *,G߲fq~yB 73<D#&J!b#@#ͤc!'-&`Q'|Jp:YvrG[D59݂sc  {aDy)& ,lE2"  k' /m˸Dd]`L? L6+~;ڿ_~<#Ԉ6uZ{Ld'uvYUJ3<-ky5|v\ pǍ3lgkn 28f3Ӣ[v:Lz$?~8 qcƴFu}zC y]773 @a1U}яtvΑ)bf$s译.Mm[g{c%x˙R<-q%#v3~:ڮs( *{%ˀك0mw@F߿98[3!?VQwA?![PaBN@^wy4h@lo,x\g;KCJ GKzs lG%OTd3O@^VђbLݸ&0td EV$?͈YNt*}O*maT8tF(9Q>O606Q>q&DsN m30Vpɱ o"pA~n D.ZрƝ({,:3~B<&|0Z =)z8ӳ(܌^sGBs,s3VQH \R[Y$ro4ۓB&np٫iV IqpB]`l]Ծ.}3íQA(vY?r|'r(O$2 8q7~ /("c s3@]<>L TJ- 0ހQ\O NWFԨHur?<8WRE?-m?ϬaBA*f% b63]LA܎1t#ְ.;N+O"ZTU`ͧ$NT%* &$j@kXg-3#d V袆(âFQRwlm%0.a-T:x@%~/DR.B™KloK; VbgU;o~_]/KL$ <U*4  /}z5~_OBll$U=_&]m@}S ~Pr)?x@S@o۰&n+9ԧhRM'_6voxކБs$Dΐl~_}'y]ǯFأ#z9l=QF AhUQSݽ0N.`Ptv0YgwE3q%a 1qX$KP]\ *[œn+[:J|*glm| 'xĄVcV4 Ou$@ WyեIVi--SN&'xq7Ab<,C<"B!- 5h@- l|}{ķ[^P𣑃=yA/n^ ]|~!˘4"V0*dqH%i98OUf 5)I_9m&CzCR# }Kx?KW_!Exо0UM%UG* T0+G)->Fr^7U;[lj[1uHKA`-54*֕q oĜgc}5VJrK漂 t.⡋ɍ7#%`+BpvGyB " sBKHB = 2WhOwǡX{N_ND^v,ְKB/-^Y4gϱ[ gWj<|@0DMj.8u m$]&PCC7s)\Ԣ >jU/KDPSS;Φa♓"QgOkFrPF鯲Q:uǃfod }h-tx5)c+-:m+o_!{ּ.v $.| `z]U`Cq鹫LS"uzi %K:y>zݲ@(6h|-/ OVuHbs]/R4 yX&=NZ4jvNo$k7]ũU40ŒΫ/U~S _|Z [ '?]\9TO{| Xy,D-kV.F)LKNzjYvci*JiދqrYx7iv37:+P;޾o3>s7G^<,:>=OɌt)kLUszYQ= hM3oFcmBs)Cbi_:/>?2L{so'YG$m͋>^&.x 7JLp@"-b^'s{UC+?+s64u~;!pFt6=sS\,&+>[c7W] QE٭?j*6>NL@ݽrRxS܂&S[E\-\Tf-P ppw $hpM \Ԁx푹_Nk\JCҒU*yxVos8僝.‚ua$hfim,{f~3K()g|Prea1&һwY'gVFg4MmJ {( \2ض|!ѶyFvW"=DBm _zKJz{1v-{NP=!Oy&~6Tهۇrm;hX^%\9X} bŚC?w.wy õ>Xo!{Y_V3=l ہAY+7Y_aXsC`?PkְбB*ijg_ OEncQnyH e{JI.W+}}A?f}5|R:P+i0ŦujLD &-uTb؎pl\{?^B0q)W]n1 yw s}Ʈ^}R#"#' 9mU=)-1Ų-zjeW&DdTfȐRJvJkc\jiAYc"?f3u/-DxE2֫rIUuw-7׾/z|^)|9+Y~E-Ǽ+^s`9sU:f"dR Q}4ݻuBr:gpO {) 5:^:M~ xA%qHnDղe.vUKQ騆&ڥ  3ol+XKZ#iȍ\R !,}8[e>ћO`>?oI]v7-%1ȹ>JfP~X *i F6QsK< :Upxp͏Etb`Q]Pi V_(Q ծ Zma@?N6f~6V&nn uÅ{$ӛyZ Uf]f}X}1לX;d xmJT2y/q=:}%-pZªO|-;h|D({Z=C8ts;O }7@w*`{tIT2D!GWub3='8k۔̳5 ]>FC*NSq{aija2\/VW30]dp$p5Bđ`X 1M rx "p4ďIsjP̨uqT:C1b-0lQUN:mZurۃ=1oBݷ6x\ b`, /-ƩbtblUQ -}c<̒oG]uoHHِ޲MdP(M }ޡ°@"er,j,Z\Xaܾ2}/ݖ&&ӽۦ^Z$N)kՃ @YS{eA`UwOg5x+7ŖBog`&SSN5U}!H1O'j0yje> 4A81^|P1y Ԁ?(fPI+T!,4\[KSR3cRNb{{n.!y˔47HgytR>8xx@~$PACtxcg Z_B] hI:|F%֭EYۅ2g\qS*;qp*_<'^x h8fRWgzYnVtJA;'>3/;Jn@ra`tˠ!oذێ#>s]2m\)T"%J9ܟjUTV ԫӠfCA4@,T8^xHDHH4X!C^>BHD=FXx\O0Q$I%O2G^&mg'/ ^tB -EYToK$KM8`NXr)VzeUv9. o^3=*'`ԤPvR74e-M ijXS#FԘ~{ܓ縬Wzn̬_`7F|y9b膕SknGmr80-q=P@i~L_p@,2Z NF|gEbT&W(Ujpy@\f [@i( lXmv<4iܩKӇ:ja؈QM {JμcDlB*X 9?aIvYwE[. @9$hE%e JܥxTIgZ:dZ@zPb@ haZ#khjiuރGO u MPhS3s 'Id Fg0Ylbdbf O(cKhԄ46!Nva iލ{ksֺ6SN;; j]2׫ۡd?dJkJGQr/ʸC)85xQ /B '/^idZ:sqEdubi!\ ,Ү&q!-e;:& „2.lG$DPƅdʸaBRcR"L(BZvtL& -F?`@÷Ss 5[IKq= .Vk?zWX a|Qq;pH~VIєnԦFMHsRzE((DPP-Lo`Be_\YNQ;W\m)_nuv~v˨.%aBKgtfvL!@d)ttBZvts62pr;:&W]k\߾u8]}1f,2/<~Jbm\^}9y6ծzP"j ENi*rd:_VߋYLl0B#rYZd!MVpD Qs/eA^.HL44_n1zisa.}=g8B9&/9cF6W ~],% neBkn6JONڔĀ3&$M%SY淭5;5[K)ϜGckW)ݘ|Dqf['ib.>4ۘ.5 ;e%On>D!z'ntEg:ҹK^&}/r .8N4R7/(pQF!0k&k~3Fr` g0x cƂ[.YbTR1 IRtJSd_Qp_aG0z+ G@F@UްZЃLq3 >Bt 'JUe˽2GGnU4ʉ8s;u-(/wp4(TW>]Hj ȗ[׋Ƅ3a4h/&5i&Zg]~Mjd]hI{TtSt'G;(eLlgCYI=D#2$X A0mG1VH4 e7;7g;I*8Զ򯍀 w\ &O2_%< ɢ: N,͡sHɂ:'&\ӻ>M\z5j~HDШu$mpRb-j_1d;]¹ȭ3r'rOVԭ,B!: pp!Г,,,,,̅K&33M~ ̂J\1yXA }>d&OR*0LT-2\d+Eo6_hoGLzC2IZC PKwL\ 7@limit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Bold.eotnu[ LP  CoFo SansBoldvVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590CoFo Sans Bold0BASE/;HPFFTM\GDEF$&+dGPOS$I ULGSUB,v+*OS/2bt!`cmap Hcvt Xdfpgm( gasp+\glyf^?$Xhead"x<6hheamt$hmtxlu 0locaE@ maxp  name&z 'postmAJHprep}woA _<ח%ח,]a,S(8wKkXKX^& COFO   (dM1L<F &<@:H +0 4+*y  *1W7/.UWUz1 K0KpK]K0K,KK>KKK /K /K,D  6B 44])D3(J= J w H"J= ;#= ==J=.J=J t=! H9 #  % .Pj221LC7! Pjm5)/8r&_"I-.v.$H4-D (8V)-#_'#7      0pKpKpKpK,,K,,K / / / / /R /DDDDKP=((((((H(   =  .J=.....H0H9H9H9H9% I=%  ( ( (0 0 0 0 KJ J pKpKpKpKpK0H"0H"0H"0H"KJI, , , ,  ,K =K;K#=>J =>K 8>K =>K=V"5 KJ=KJ=KJ=J=KJ= /. /. /.<rKt=Kt8Kt#,!,!,!,!   DH9DH9DH9DH9DH9DH9 # % 6.6.6./]KKH KeK =K KN=DH9H(]KKH H( /0,! % $+),(&&43}$( :L=vpKpK$.K0,,K,, 8K0KKK KK.K pK)KKK KK /KK0+  K2K3KKK)#K((<, ==T M=M="=? =G=.B=J= %  P="(9=O=p===)!7=! ; B J=J"=M=% @= p /.) 7K>. K,= K\=( ( KJ=/$ /.KJ=,! #  #  # pK% @ P^%++ 7/ /7//&&Y/0j"j'x"&5+0(("-4-&5+0((0>08$ iK6215+58A V B " B p S U p!X8<WUU>$>$>$>$>$>$>$>$>$>$>$>$]]3>$>$>$>$>$>$>$>$>$>$*$B5T`?(d2/,K, ;=  :6(H" H9H9#= J==]8,(88s7)$1L j"j'_"_'+%++@6@:B52@6*$B5PjPjz1/8+#*'$-&%"-4-&5+0(("-4-&5+0(( pKK /K)#K((M=.% ==)!&3h4  +{$?%}.*~7~37Y#_cuGc      " & 0 : D p y !!!"!.!T!^!!""""H"`"e$i$$&''0 0 927Y#brFb      & 0 9 D p t !!!"!.!S![!!""""H"`"d$`$$&''v00{uh[S;%"bAigY?93)!e/sleb^ (UA10F6Z V   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivokuj20r34ghlzcn1.m{b7wU[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-), .]-*, .q-+, .r-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpB-*B *B**B@ * B@@ *D$QX@XdD&QX@cTXDYYYY" *DdDvv>>vv>>2222\fb<d*vX  rL|  J x 8 R x f  R  F r $H`t$r8nv^J|Hx Tb8^*B~$p*6BN` R ^ j v !! !!$!0!&J&V&b&&&&&''r(((&(2(>(J(V(b(n(z(()))()4)@)L)X)*R*^*j*v******+|+++,",.,:,F,R,^,j,- --2->-J-V-b-t-------..*.Z......../,///////01J1V1b1t111111123Z3f3r33334 4N4Z4f4r4~4444445.5555555556666n6z666666666667 77"7.7:7F7R7^7p7|777778.8Z88899F9999:: :F:h:t:::;(;0;8;H;P;< >6>B>J>~>>>>>>>?????@"@T@@A AVABBBtBBC&C.ClCCDD.DdDDDDDDEEEEEFF2FfFFGGdGHHHHtHHHHI IIIJJJ(J:JxJKK\KKLL  0+!%!! '7d`222j:F%!L,@)Y"KY#L+7353_0ؕ<vDK1PX@Y"L@UYMY@+333J^v<<FK1PX@&  sb   a"L@/r  sb U Y MY@+7#537#53733733#3##7#37#\e r|   Zd qz Fyyyy5 ` !(/.@+-,&%  J]+L +?5.546753.'#5.54&'> 2(wsh[kp)&zr~n[m%0(-$3,+",a]]iYY eS)`[_f YXc %" #f '3K PX@%  d[*K [ #LKPX@+   c  d[*K [ #L@3   c  d"K[*K#K [ +LYY@')(/-(3)3#!''   +"&54632#32654&#""&54632'2654&#"NiiNQddVU"##""&&NiiNQddQ"##""&&-_dc^_b]f00.00.00g_db__b]fc/0.10/0/&,6~KPX@43# J@43# JYKPX@[*K[+L@[*K#K[+LY@1/+)*#+!'#"&5467.54632>77>54&#"3267'&/%_?|W9tg`lSEn!y :"~5,3+%$.TG<4#+/ geK\>#SicQKXpJ'=i%+ .#"')+5 +<v5K1PX@ Y"L@UYMY@ +3Jv<@-y 0+4>7.@#?W3MKcYTMhNxe'YBypHZN:-s0+'>54&'7s#?V3N%@.XTNg Lyg'Z!Wdp9uHZN]uJ@ JK1PX@ Y"L@UYMY@ +7'7'7'37' U2aa2U d T2``2T ]i?V**W?ii?W**V>hHAB; ,@)UaYM +%5#53533#|Axx ^ @GY#L +353'>=0NK *'HQ M% +VR@UYM+%!5!V+}0@Y#L+35304>@r'L+34!g+ -@*[*K[+L     +"&54632'2654&#"bJOOJIPP dqrccrqd  #@ J"KZ#L+73'733!9MĮ[s߇N*@'J[*KY#L%"+4&#"'>32!!5%>:84G bQ<E='2::a{xdTg6X.@ jK@HJpnY"K\+L +"&'732654&#"'7!5!32B EAEDGB/( -P;# g]-.1)/)l,F2kv | (@% Jb"K#L+!#5!533#%3(+TT팝f,*e6@3JcY"K[+L$%$#+!>32#"&'732654&#"'!6 M(w D=G9@D%;!jql}cW(+6.-3(g1r$;@8 Jc[*K[+L $$$%$"+%#"&54632.#">32"32654&rn @6KOX?w?@?B@>>k{X_%+[c%f//.10..18%@"JY"K#L+3!5!b:7}#/>@; Jc[*K[+L%$+)$/%/##*"+%#"&5467.54632%2654&#""32654&}:34-557=D==EECAFGEDGHBAcpja54&#"'>3253 '%""-,/7 sur<(#C'1" %*&YilVEHؕ1aQANK'PX@& AJ@& AJYK'PX@+c  c dW[OK-PX@2  pc  c dW[O@7  pc  c  WdW[OYY@MKGE(&#&$&(" +#".54>32#"&'#"&54>325332654.#"3267'54&#"326 x@Yh9=n\Vd7aQ5< B.Mb/@# 5u$)Ig>ErP-+NmA-`a*"-,#*e!4d_]h82\Q|* )l`1L4$OJ?cB#-QsEIoJ&+)4/15,  ,@) Jb"K#L +#'!#376ZX{K~ C@@Jc["K[#L   ! +3!2##32654&#32654&K32.#"zHL J{V02XzHKEPca|C6ow-WVYV+yl3DphgqK'@$["K[#L !+3!2#'32654&+Kfgl`alfffjbK8 /@,aY"KY#L +3!!!!!KHSK8 )@&aY"K#L +3!!!!KD0"l@ JKPX@a[*K[#L@#a[*K#K[+LY@""$%(#+#5#".54>32.#"3267#5{%gBFvT/3[~K} IAYddXH\_G&+-XVYV*kl,=pgho@*wK '@$a"K#L +33!3#!K% XK@"K#L+33KXX @"K\#L !#++53265XimkF402ok+1K -@*Ja"K#L +3333##KQQ K(@"KZ#L+%!3(#KN .@+ Jp"K#L +%#33#ζʓ?'LXaK @J"K#L+!##33ȓ;C>/-@*[*K[+L +".54>32'2654&#"K~Z33Z~KK~Z33Z~KZbbZZbb +WYWW,,WWYW+teerreetKu +@(c["K#L $!+3!2+32654&+K2qv<44<lvsng/03-/)r@JGK PX@h[*K\+L@p[*K\+LY@%#)) +".54>32'':7'3>54&#"K~Z33Z~KK~Z3?6>hJ8 e;bZZbb +WYWW,,WWa+QNdPV6errehuK 3@0Ja["K#L !+3!2#'#32654&+K0qB;}<44<lvNdh//3-,v''@$J[*K[+L+%+#+?32654&/.54632.#"#"&, N<>C%3xYs?D:>/6T[.0& ! Vc_liZ"8' ]Tck`x!@Y"K#L+5!##dD@"K\+L##+3#"&53326EQN@khHKK!@J"K#L+!33X  '@$ J"K#L +3# #3jɪɚX  &@# J"K#L +3373#' 踔^J#@ J"K#L+!533󱪩(B6w /@,JY"KY#L +35!5!!6t7oB>\#@ aY'L+!#3B|_|4>@r'L+#3؄4>O@aY'L+3#5!!4F|g)97!@Js"L+#'#vuo>@Y'L+!5!3~3#$-K)PX@ Y"L@UYMY+#3˘t}(+KPX@ J@ JYKPX@c[-K[+L@#c[-K#K[+LY@)'#%#5#+!5#"&54676254&#"'>32'&"3265\J-F`cT!=($ ) l]-N9!2(%+47 !LFME#!"CZ)F3(!=*!yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@(#+33>32#"&'732654&#"=H'+L8!!;Q/(D8/0770.9 ?^>@aA!+*6GA?G7.'@$J[-K[+L$'&#+%#"&54>32.#"326oq`n$@Z54N6 *+0851++Qa|>`@".?"/GBCH,  !yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@ (#+!5#".54>3253'54&#"326F1,N9!";R/(B4.3971243 !?_=@a@!XD.6G@?H;7@4Ja[-K[+L&'"+%!3267#"&54>32'"3.8.,+!6M3r&AX2ps$6 098)6)w?`@ q).+, n/@,["KY%K#L!#+3#53546;#"3#_RR_ZV=# wwm}]Bu!}"4 "/@" JKPX@ [%K[#K['LK1PX@$%K[-K[#K['L@!_%K[-K[#LYY@ $&(%%%+3#"&'7326=#".54>3254&#"326$A\6^z 5"1=I1,N9!!;R/-F8-1981-9(^? #9.3E>32#4&#"=J6La-+%9&XT(+')';,@)Y"K%K#L+533;-~~>3@0Y"K%K\'L +53+53265EWbF#($-~~C `Xz!%= 1@.Ja"K%K#L +33373#'#=8nx7=@"K#L+33=X=J"V JKPX@[%K#L@%K[-K#LY@""##$# +33>32>32#4&#"#4&#"=K6:IZ6K_,)#7,($7>)0%+*YT)(*,%)'*+%=LJKPX@[%K#L@%K[-K#LY@ ##+33>32#4&#"=N6Kb/)$:@ *XT(+')' -@*[-K[+L     +"&54632'2654&#"rrtt1::10;; wwwwvFDDDCEDF=>*!f@ JKPX@[%K[+K'L@ %K[-K[+K'LY@(#+3>32#"&'32654&#"=L1,K7 "@aA!*6GA?G8. >!yKPX@ J@ JYKPX@[-K[+K'L@ %K[-K[+K'LY@ (#+5#".54>325354&#"326~B2,N:!";Q/1D5-396134!?^=@aA!#3TD.6FA?H;=n '@$J[%K#L !#+33>;#"=E!%.1C<%~&'!''@$J[-K[+L+%+#+?32654&/.54632.#"#"&!-(*%+CHMu\Ur }))%%"?JWoi]r C?MQLD" BAHYO kb)@&rY%K\#L# +!#"&=#53533#;kUd\JJ!!CVh}xx}'9 ZKPXJJYKPX@%K\+L@%K#K\+LY@ ##+!5#"&5332653Q3L^-*(58&XTH*)."* !@J%K#L+333sqd  !@ J%K#L+333# # QXZRZ[OPL  &@# J%K#L +!'#'373pc[\U鎎 >"@ J%K\'L!"++5326?33i$[[C3"( ̠xhgH}L. /@,JY%KY#L +35%#5!!.|}{}>$3@0Jcc['L$#!,!%!+75326=46;#";#"&=4&#*2^NU6("*((*"(6UN^2*->ocQ|#.q-j>@Y'L+3j|g2>$-@*Jcc['L%!,!% +%#"+5326=467.=4&+532;)2^NU6("*((*"(6UN^2)->meO|"3k-2X,@)Wc\P#"#"+#".#"#>323267XTO740!zTP73/!Vq#Vq#LE@Y%KY'L+3#3#QtC0CH!C@  JK1PX@ "K#L@ Y#LY@ +!5.546753.'>7dwxcW_d)"$' h_)%$*] om ]\_H-,Ia\[3C  B7N%9@6JIa[*KY#L%%D+%#!!5>5<1#53.54632.#"3֛G1-tUqnv ,.-2 $@E)_E+_mbQ./'&?"!'#/B@? #J HGcW[O.,(&!-+7'7.5467'7>327'#"&'732654&#"xWp nWq32tWs rWr346..22..6'Wp44oWr sWs23qWq 034//44 }>@; Jb  a"K  # L +35#535#53333#3#f±h]_1_\ _1_]j>*@'aY'L+33j|||Ktt5>;3G-@*>1! J[*K['L%#%"+#"&'732654&/.5467.54632.#"'>54&/"&#}kmu 4(%2,4FQ[2*{gmr ,*%-0+NMV0)/0A !)- VaZP%* PQ3M<(T\[N"+ PK4L< )#(  * & )-x$@!Y"L+53353)G-}}}}8'C@ A@43JKPX@' c _["K[-L@,cc c W [OY@)(><861/(C)C''  +".54>32'2>54.#"7"&54>32.#"3267J^66^JJ^77^J32'&""3265 /$6@LW  "$2+.. *4<@y "8 U@ JKPX@ %K#LK#PX@ Y#L@UYMYY+3#'%3#'IA>K PX@gUYM@sUYMY+!#5!I}.-6( JKPX@1 p  c  _[*K [ %L@/ p  c  a  _[*LY@'/. 20.6/6 - -,+*)#! +%".54>32'2654&#"'532#'#7#32654&1U?$$>V11U?$$?U1MfeNNefz226V-"""$>V11V>$$>V11V>$2iNNiiNNiE&($PHH/ .=H@Y"L+!5!H=c$X *@'_[*L     +"&54632'2654&#"JccJKeeK**((XaLLaaLLae*))*H B ^K%PX@ aY%KY#L@aaY#LY@  +%5#53533#!!|£xx=|4z(@%JcY%L%"+4&#"'>323!57> #` VHHN1.>¢:<=8.5(VQl-|@ J IK PX@!hfa[%LKPX@#pna[%L@)pnaW\PYY@ +2654&#"'7#5!2#"&'7!!  p0d1@ZNFT a#?FPX>003!###1O66O1XxZ 8K*+K7 ~""8 3+)&2@ JK PX@hc\'LK PX@pc\'LKPX@!pcW\PKPX@pc\'L@!pcW\PYYYY@ +"&'732654&573<@U!$*Q#16I'( 3/'(+-3-{ )@&JrY%L +535'733SdX2n\U8GWU#d qKPX@[*K[%LK!PX@c[%L@cW[OYY@     +"&54632'2654&#"FZYGHYYH" !"""TNLRRLMUT*$%''%$*'= g@ JKPX@%K#LK#PX@Y#L@UYMYY@  +?'337'3'b#&' 3+t3+y&'t3+t3+7& ' 3+t3+:!=@:JpY%K\'L!!+#53267#"&7>?>=V'%""-+06 tur<'#ꕕC'1!%+&XjkVEH l&$u l&$ l&$ k&$ g&$ p&$ 3+B@?JaaY"KY #L +3!!!!!!'#3'\Z ~#0$4@,+JK PX@*hf`[*K[+LK PX@+pf`[*K[+L@,pn`[*K[+LYY@0.)' 44 +%267#"&'732654&57.54>32.#"zHL q16I=<@U!$#DoN+2XzHKEPca|C6eu (+-3'( 3'1WRYV+yl3DphgqK8l&(gK8l&(K8l&(bK8g&(bl&,KLl&,2Zl&,÷>g&,ȳ 7@4a["K[#L ! +3#53!2#'32654&+3#KCCghl`algvffjbvKk&1/l&2/l&2/l&2/k&2/g&2RK81  0+?'77'RVVVVVV/'6@3%$J[*K[+L'' +".54>32.#"2654&'K~Z33Z~KK~Z33Z~ 3ZeZd . +WYWW,,WWYW+_%@A uwe": Dl&8Dl&8Dl&8Dg&8l&<K 4@1cc"K#L   $!+3332+#32654&Kqu<44llqwl|,03*=2&=@:!Jc[*K[#L &&+!#532654&+532654&#"#4632QA<.37.9*%*-*14~ths)*9By{.(/(y+"%)61+lpdW-GPFai(&DC@(&Du(&D[2(&DaQ(&Dj;(&D_(+.5BKKPX@ .JKPX@ . JK-PX@  . J@  .  JYYYKPX@$  c [-K [+LKPX@) U   c [-K [+LK-PX@*  a  c [-K [+L@4  a  c [-K[+K [+LYYY@0/@>:632/505"$%#5$" +%#"&'#"&5467>54&#"'>32>32!3267'"3.&3265(jbBbeBKacT!='""+ l]32.#"3267<@U!$"`q$@Z54N6 *+0851++ WI16I'( 3' r>`@".?"/GBCH,"F\ !(+-3&HC2&Hu&H[-3+&Hj9&C=6&u%7&[+&j$0@!J$  HK PX@[%K[+LKPX@c[+LKPX@[%K[+L@c[+LYYY@&%,*%0&0+'7.'77#".54>32.'2654&#"? .%Ba@BB=\=4[A&"=T13(65465:8@^"/A?c;cH) =Z96X=! /RG89EE98G=&Qai&RC?&Ru&R[:&RaU&RjFH#BY ;@8aaUYM  +53!!53ȑK~ܐ 6@3J[-K[+L  +"&546327.#"2654&'qrt 2?q3?  wwww"GJE" 9 &XCK9 &Xu9 &X[E9 &XjQ >&\u=H(j@ JK1PX@ "K[-K[+K'L@ [-K[+KY"LY@&#+3>32#"&'32654&#"=K0Xt";'0;83&<`$|?`?!}&0DABG., >&\jC Y&$3+(&DpP k&$(&D]? 3o@J IK-PX@b"K#K['L@b_"K#LY@ +"&5467'!#332673y?W%66'0 /zZ45 4X %\(40=@$.JK1PX@(c[-K[+K['L@%c_[-K[+LY@;951+) 00 +"&54675#"&54676254&#"'>323267&"32656O%J-F`cT!=($ ) l]-N9!*  *c2(%+453"33 !LFME#!"CZ)F3 $\(!0l&&&Fu0l&&&F[.0e&&&F^0l&&&F\1Kl&'o &G A)KPX@  J@  JYKPX@&a"K[-K [ +L@*a"K[-K #K [+LY@(&" (# +!5#".54>325#53533#'54&#"326F1,N9!";R/)Crr447/0871244!!?_=@`@ _W11WD-7G@?H;K8V&(&HpOK8k&(&H]=K8e&(&H^K3Hx@ J IK-PX@(aY"KY#K['L@%a_Y"KY#LY@%& +3!!!!!3267#"&5467KHS!, .?W&  %\23 84,3@  ,JK1PX@(a[-K[+K['L@%a_[-K[+LY@.-10-3.3+"&'" +#"&5467#"&54>32!32673267"3. *6Or&AX2ot8.-+| $6 053/w?`@ q#98)4.).*-K8l&(j&H\,0l&*"4 &J[@0k&*"4 &J]Q0e&* "4 &J^0&*S 3+"4  -:@-JHKPX@) a[%K[#K['LK1PX@- a%K[-K[#K['L@* a_%K[-K[#LYY@9731+)!  +#54673#"&'7326=#".54>3254&#"326^^? #9.3E>32#4&#"=55ppM6La-+%9 W11Ws(XT(+')'8k&,$&a0V&,&p9k&,%&] 3G@ JK-PX@"K\'L@`"LY@ +"&546733267?V#!) .45 2X %\4^@ JK1PX@Y"K%K\'L@`Y"K%LY@ +5333267#"&546;+ )6N"-~~ #\53"/Ke&,'=@%K#L+33=Ks&,-;>&LMl&-%>8&Y[K&.S 3+=&NSJ(l&/0=1f&Ou 3+K(&/S 3+8&OSK(&/=&OK( 0@-a"KZ#L  +%!3753(#啍=*@'a"K#L+33753=GX}}"? ,@) J"KZ#L +%!5737?$AA #y#%LyL , &@# J"K#L +355737TKKKK,o+t,p,Kl&1 =&QuK&1S 3+=&QSKl&1=&Q\O=&Q3+KHO JK1PX@"K#K\'L@`"K#LY@ !#++53267#3jiG/($ʞ,okd!&Ei=>X JKPX@[%K#K['L@%K[-K#K['LY@ !%##+%4&#"#3>32+5326/)%9N6KbYW:"$!+')'@ *XT`Y{#/V&2&Rp\/k&2&R]F/l&2&RbT<' KPX"JKPX"J" JYYKPX@!a [*K[#LKPX@5a [*K Y"KY#K[+LKPX@3a [*KY"KY#K[+L@1a [*KY"KY#K[+LYYY@&$C(" +)#".54>32!!!!!%3267.#"fB$K\44\K#?!,*bZ,,Zb*WZXW+~eroR")5K!PX@"J@"JYKPX@#a [-K [+LK!PX@-a [-K [-K [+L@7a [-K [-K [+K[+LYY@+*$#1/*5+5'&#)$)"$$$$ +%#"&'#"&54632>32!3267'"3.2654&#"O!5M3:VY:rr@;0/JK PX@)hf`[*K[+LK PX@*pf`[*K[+L@+pn`[*K[+LYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57., N<>C%3xYs?D:>/6T[yp16I=<@U!$"r.0& ! Vc_liZ"8' ]TXj (+-3'( 3'a!&>@<;0/JK PX@$hc[-K\'LK PX@%pc[-K\'LKPX@"pc`[-LKPX@%pc[-K\'L@"pc`[-LYYYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.!-(*%+CHMu\Ur }))%%"?JWVQ16I=<@U!$!N` C?MQLD" BA?U (+-3'( 3%M,vl&6!&V\ x&7S 3+ kb&WS[xl&7l 6@3paY%K\#L#! +3##"&=#53533#;%|=]dUd\JJ!!CȳVh}xx}'x/@,aY"K#L +5!#3##5#535d瀀vv kb9@6r  aY%K \#L +!#"&=#535#53533#3#;kUd\HHJJii""CVhTG{xx{GT(Dk&89 &XafDV&89 &XpeDk&89 &X]WD&89 &X_Dl&89,&XbaD0%\@ #JK#PX@p"K\'L@p`"LY@  %%+"&5467.533265333267?V!}~EQN@Z`!, .441 hHKKHks (\94%h@"#JK1PX@%K\+K['L@_%K\+LY@  %%+"&54675#"&533265332676O"Q3L^-*(5*  *53"34&XTH*)."* $] l&:0 &Z[l&< >&\[<g&<}6wl&=.&]u6we&=.&]^6wl&=.&]\3/7@4 Ja[*K[+L&%"+467!.#"'>32#"&267!/ YJAQz2WxFCEX ZJ$ PS?1myVW-0LKNIK,l&'<K&'=  &G=;K&/-JK>)&/MQ=>&OMKI&1-K>&1M=>$&QMLDl&89 &X\EV&(+&pK,&'=K&']  &G];l&(+&uJ/l&&u,v&6S 3+!&VSux&7S 3+ kb&WS[V&< >&\pZ> @%K\'L !#++53265WbF#($ `Xz!%$!@@=Ja[-K[+L!! +#"&5467!.#"'>267#us%@V0tuH5+(0 }$8O."3 1v?_@ p ;6%7)q(.+++#7JK)PX@ Y"L@UYMY+3#'#jz78zRR)#@JK)PX@ Y"L@UYMY@ +'373l}76|k#OO,m !@`"L   +"&'332673RKjjLP??P(-@Y"L+53(-~~&  1@.cW[O     +"&54632'2654&#"1<<10==0 <./==/.32#27:D#BOL#{m"+,(]vvZKm&|3+0 4@1Ja[K[L(%"#+.#"3#3267#".54>32 JHB]^CFIHzX20WzJ.CMJKLB.dz*UZXW+v,v6K,>p&,ȳ  3+X- %iKPX@ cYK[L@*cYK[K[LY@!%%!%$! +7>45!32#!#+5326%#32654&vqjl:",2m||<44(hsy8jyqlIHa(*20,K>@; caK\ L$! +33!332#!!#32654&Kvp$||<44 jyql<*20,7@4JcYKL##+5!#>32#54&#"#OO(v?B@ l|F9Kl&.Kl&o&{Kr MK PX@gKZL@sKZLY@ +##5#3!#X $Kt 6@3cYK[L   !+3!!32##32654&Kt~~q723Zqqd$++"K~%K@YKL+3!!K r3@0QYKYL +3>746<5!3#5!!# E )b1qB ^od厎9_' 籱CD뺰?\L  )z(D@A Jc[K[L$"!((+"'>32#"&'732654&+532654&YAE 89=D LEBE7=hj6-<,91ctd`6K JA]qoj19)*'#}%$%(K $@!JKL +!#33ƚ822XKo&K. !@YK[L!%+7>45!##+5326jl:",2(hsy8XIHa(KN0K+/2K!@YKL+3!#!KUXKu30&x7"@ JK\L!$+%+5326733)5H1O;",,>& m+a'2KPX@-f g d W [O@+r s d W [OY@(((2(2*)''! +5".54>35332+#2>54."{H{Z34Y|GH{X22X{H&D22C&D33DR$HoJJmF"NN#GlIJoH$R(?+,=%D&<,+?( ;Kr )@&RKZL +3#5!3!bޗ#2h)@& JdKL#"+32673#5#"&=3AM >O+vF:*X qK %@"KZL +333333KڗڗXKr%-@*RKZL +3333333#5Kڗڗa 6@3cYK[L   $!+5!32#!2654&+Mvq<44<jyqli*20,K[ 4@1cK\L   $! +332#)3%2654&+Kvqy <44<jyqlX*20,Ku *@'cK\L   $!+332#!%2654&+Kvp <44<jyql*20,)4@1Ja[K[L&%"#+?3267#53.#"'>32#"&) RHDV SE@XtGvT/2?MLMI<4no)UXoK&sKPX@!a[K [L@)aK[KK [LY@" &&  +".'##33>32'2654&#"BsW: oo :WsBJ~Y33Y~JYaaYZ`` "EjGEjE#,WWYW+seeqqees(p 2@/Ja[KL&+!#5##7.5463!";5p~@Hp><44<gUql+10,(D,(R@ JHKPX@[K[L@c[LY@#!(("+%#"&=4>7>7>322654&#"~pz'JnE1V" $Y/SSU1Xr0641.>:r?XzN(  GK"&rD<>B4*HA= C@@Jc[K[L   ! +332##32654&#32654&=W`(+'X]ST!aa#?B; 9+BK\a=@YKL+3!#=V}zJ+@(QYKYL+73>7>7!3#5!#35#4HԌ};()|Sr$7"IH6@3JaK L +!5##'3353373#'#?*oj++ko+巷(D@A&%Jc[K[L#! ((+%2654&+532654&#"'>32#"&'7./")NK%!((03 zbho(&(1{lku 3d_*%NWME#5 31IQ\R%,= @ JKL+3#33#ʍ,/=&TR 3+= -@*JaKL +33373#'#=9qv9궶 !@YK[L!'+7>45!##+5326lB\@%JMJm32/`R}"= '@$ JKL +333##=vs͇J^]=  '@$aKL +33353#5#=걱R=!@YKL+3!##=ȏm=>*SF!@YKL+5!##™m}}m >\> -:Q@N%J K [K [KL1.!!62.:1:!-!-)' !# +23*##5#.54>75"&#263>54&:3*#:bG''Gc;;bG'(Fc;8@A6CA<]??_>  >^??^<CDCBBCDC [=zF )@&RKZL +3#5!33Hm(/@,JdKL##+!5#"&=3326753V:$]_*+% UX+ = %@"KZL +!3333@mm=zE-@*RKZL +3#5!3333HmmQ 0@-cYK[L  $!+!32+##32654&oUa^Z^DD.$'UWY[l~|%"=<@9 cK\L  +!3!332#'#32654&iUa^Y#ED.$&UWY[|%"= 0@-cK\L    !+3332#'#32654&=oV`]Z)ED.$&UWY[|%"4@1Ja[K[L$%"#+?3267#53.#"'>32#"&6++23((5 }x^l|qeu$,0.f,.)(N[|x\=nKPX@!a[K [L@)aK[KK [LY@$" +333>32#"&'#%2654&#"=I}cssbI91::11:;\ewwh]lFDDDCEDF! 2@/ Ja[KL"+463!#5##7.735#")d]A`n15\\%#%CNYLn&HC3z#K@H!J a_K[ KL  ## +2+532654&#"##53533#>`*A-_r+2%'2%6IINBpUu_ziM,' W11Wp%=&uw4@1Ja[K[L$%"#+.#"3#3267#"&546323,*4 4(*2 ~takofsD".0.f+/)'M]{z_!V;L+ 7@4YKKL   +533533A-}}}}>M #'iKPX@ cYK[L@*cYK[K[LY@ #!' '!'$! +7>45!32+#+5326%#32654&lmUa^ZC[@$BB.$'JMJUWY[m32/`R}"O|%"=+>@; caK\ L$! +3335332+5#%#32654&=mVa^Z~CC.$'걱UWY[|%";@8 JaK[K L## +3#53533#>32#4&#"=IIM6La-+%9 W11Ws(XT(+')'=&u=&CY >&\TF 3+=z MK PX@gKZL@sKZLY@ +##5#33m >@;ra c\ L! +3#5353!!32##32654& t~q3/0PPg^plb#)*$N:@7 cKYK\L$! +3533#32+##32654&lZca]r\\%!"꾾sCDUTGw_/!>@;a[K[L!!  +".54>32"!.267!K~Z33Z~KK~Z33Z~KKb s aKL` a +WYWW,,WWYW+8RKKRLTLLT >@;a[K[L     +"&54632"3.267#rrtt*8 8*+8 9 wwww.00.0110!@J[KL!"+>;#"#3GO9"! #J;#& $!@J[KL!&+#37>;#"puL  0%0B-}K#/GK PX@fYKL@rYKLY@ +3!53!KH>eGK PX@fYKL@rYKLY@ +3353#>܎{ -@*aYKL +35#53!!3#KCCǢv;v  -@*aYKL +35#535!#3#=33Vnni}giKr6@3Ja]KL +33333#5##KQl-Q =z$6@3Ja]KL +333733#5#'#=9qRTv9궶Kr0@-a]KL +33!33#5#!K%bh =zR0@-a]KL +333533#5#5#=HK걱< >"#@ JKL+#53"˞vl7/@,JbKL+!5#53333#v߰svk(v >"+@( JKZKL+!##5#53333{~RvlPl~=K)@& JcKL#"+%4&#"#3>32#AN =N+vE; r=K/>$Z/KO&1d 3+=U&Qd,Ov&6d 3+!U&Vd l&:& &ZC l&: &Zu/ g&:- &ZjK8k&(~&HaFl&< >&\C@^-@UYM+!5!-1}+Q@UYM+%!5!1z+bQ@UYM+%!5!b7z7{ $@!HUYM +#5467˔NK +'IP M% /q @GY"L +53'>=?NK *'HQ M% /^ @GY#L +353'>=?NK *'HQ M% 7{ 3@0HUYM   +#5467##5467NK *'NK +'IP M% IP M% /q +@(GY"L   +53'>=353'>=?NK *'OK *'HQ M% HQ M% /^ +@(GY#L   +353'>=353'>=?NK *'OK *'HQ M% HQ M% & MK1PX@a"K#L@UaYMY@ +#53533# {{T&eK1PX@ a a"K  # L@% Ua a Y   MY@ +5#535#53533#3# |{{|/* @[-L  +7"&546323JJ34JJJ44JJ44J0&' '3?KK PX@+   d[*K  [#LKPX@1 c    d[*K  [#L@9 c    d"K[*K#K  [+LYY@7A@54)(GE@KAK;94?5?/-(3)3#!''   +"&54632#32654&#""&54632!"&54632%2654&#"!2654&#"NiiNQddVU"##""&&NiiNQddNiiNQddK"##""&&"##""&&-_dc^_b]f00.00.00g_db__b]f_db__b]fc/0.10/0//0.10/0/"C5JK!PX@ %K#L@UYMY+3#''HRJKPX@ %K#LK#PX@ Y#L@UYMYY@ +?'3'x[@"K#L++36RQ" QK)PX@c[%L@cW[OY@     +"&54632'2654&#"R__RS^^S && '']]]__]]]W*99,,99*& Z JKPX@rgUZN@rsUZNY@ +#5#5733#'35_eԣ((qGYNN5m@ JKPX@ac[%L@!acW[OY@ +"&'732654&#"'7!#>32GTa$ ! a+32'"32654&V[\QEOb#* -#GLTP$#! Vac].1/+7;:B0m*@'JsUYM+#5!P=Zc(#/ JK PX@cc[%LKPX@"ccW[OKPX@cc[%L@"ccW[OYYY@%$+)$/%/##*"+#"&5467.54632'2654&#""32654&\QWVPUVO#$$" ""$$""$$3<95) *1::1% +WI({$q@ JKPX@cc[%L@"ccW[OY@ $$ +"&'73267#"&54632'2654&#"DPa"%& -#DPVNR][R!!"!/0.,8:9CU_e^"  3+-{y 3+4z s 3+-|t 3+& 3+5 3++}  3+0m  3+(   3+({   3+0hJKPX@cY"K#LK!PX@!WaY"K#L@"caY"K#LYY@!# +3!!!>;#"##0A$'.?; "-'>U.J@GJI  a a[*KY#L.-*)('%% +%#!!5>7#53.'#53.54632.#"3#3ݡG#, nj R-qnv -.-2۲ ' )_  ^  _mbQ./' ^ ]1Q@N+*J Ia b[*K [ + L11/-"%%" +753<5<7#53>32.#"3#3#3267#"&';7>7#5!>54&#"'>323#3!3267D xq5Y?$7  j+++4 khz3~   4+,3Ld+C/ Z Y  !'%!S[_S Y  Z  %#'8R +@(aY"K#L  +!5!5!##R–I_턄k$gJ@G  ca  ["K#L  +#3##5#535#53!232654&#tqؑNNNNrl:1282eiie2v2enli23+-1 %"0+%#"&='>7546323>54&#"_[X#/gKKOrW""D+%||Sk  ^  ]YRH\/;&"T&%K  !% @ $" 0+"&54632##332654&#"!5!DUUEESSߪ%%kQQNRRNOSH>&#"%$##&hh 0+5!##5373#5#'2gdHF^EKFNZZ@å2$  0+%#".54>32!3267"!5."nI^74[JExX3%}OWLy%#t]m2]SN~X0.RsD7:BNE=6191&'u3+s3+5&'x3+s3++&' }3+s3+5&' n3+s3+8&'r3+s3+Ax&'H3+s3+V 0+!!VVXxVXB 0+!'3'LVmXVX" 0+!'7'7!"VXVmXB 0+!737YVXVXp[ 0+!!#_~z[y^S[  0+7!5!#SNz~byNcUo 0+73!5!U_yNb_dNxpo 0+7'3!Ny_}N_x!0+!5!kKR}}+X3}0+!!X%}~8y!-9 3.*$0+#"&'#".54>32>323267.#"%"32654&+A,;Q "*4,A**B/3T$P40B*'1 0"!-0% '>2!A##!2>A4!:(*8"4@ "-&''!(#)<gM/# 0+232673#".#"#>232673#".#"#>50,|PM31.|SQ50,{NN31.|SNhNiPgNiW4[ 0+?#537#5!733#3!|5Z<6y6S<5hywzkkzwyhU5{  0+%5%!!5  &h}U5{  0+%5%!!U J &h}$'2V@S-,+Jp c bW[O(((2(210/.*)''  +2#".54>"32>54.535'733Rd99dRRd99dRAoO,,OoAAoO,,Oop]0mc9dRRe99eRRd9J.QpBApQ//QpABpQ.X9GZX$'@S@P/.=J ccaW[O<;:931,*''  +2#".54>"32>54.4&#"'>323!57>Rd99dRRd99dRAoO,,OoAAoO,,Oo *` YNKT.4W%#9dRRe99eRRd9J.QpBApQ//QpABpQ."=9731,*''  +2#".54>"32>54.#"&'732654&#"'7#5!6Rd99dRRd99dRAoO,,OoAAoO,,Oou_WPZ a'+"''%! FwFC9dRRe99eRRd9J.QpBApQ//QpABpQ.}EPD:J\V_U@$'255,JKPX@3ph  c bW[O@4pp  c bW[OY@43210/.-+*)(''  +2#".54>"32>54.#5#5733#'35Rd99dRRd99dRAoO,,OoAAoO,,OoBk..9dRRe99eRRd9J.QpBApQ//QpABpQ.Y]UU$'Hf@c>9 8,+J  c a  c cW[O)(B@=<;:640.(H)H''  +2#".54>"32>54."&'732654&#"'7!#>32Rd99dRRd99dRAoO,,OoAAoO,,Oo?T\ c,$#%("# b,-9*\9dRRe99eRRd9J.QpBApQ//QpABpQ.D5 ZN !5&GR$'BNi@f218J  cc  c  cW[ODC)(JHCNDN<:64/-(B)B'' +2#".54>"32>54."&54632.#">32'"32654&Rd99dRRd99dRAoO,,OoAAoO,,Oo<]gf]ST e$&*06( <-_W#)'%!'$9dRRe99eRRd9J.QpBApQ//QpABpQ.lmtw?38; 2"BU$'.Q@N-J pcaW[O(((.(.,+*)''  +2#".54>"32>54.#5!Rd99dRRd99dRAoO,,OoAAoO,,OoU9dRRe99eRRd9J.QpBApQ//QpABpQ.Hcg$'?KWj@g:.J  c  c c  cW[OMLA@)(SQLWMWGE@KAK53(?)?'' +2#".54>"32>54.2#"&5467.546"32654&"32654&Rd99dRRd99dRAoO,,OoAAoO,,OoA\\!"%b]]d$#!_['+,&&**&)/,,++.9dRRe99eRRd9J.QpBApQ//QpABpQ.MD<#- 5";KJ<"5 /"9GU$'BNi@f821J  c   c ccW[ODC)(JHCNDN<:64/-(B)B'' +2#".54>"32>54.2#"&'73265#".5462654&#"Rd99dRRd99dRAoO,,OoAAoO,,OoE^ff\TT e%&*07'!<,^W"*'%!'$9dRRe99eRRd9J.QpBApQ//QpABpQ.Mlmtw?38; 2"BU$'3:NK!PX@ 8 76 J@ 8 76 JYK!PX@.  c   c cW[O@4  c   ca cW[OY@'<;)(FD;N"32>54.2#"&546#'732>54.#"Rd99dRRd99dQAnO,,OoAAoO,-Oo>GG>>GGnW$'OS      9dRRe99eRRd9J.QpBApQ//QpABpQ.Pg{|dd|{gEW:< 7..8 8..7 $'3?R@O cc  cW[O54)(;94?5?/-(3)3''  +2#".54>"32>54."&54632'2654&#"Rd99dRRd99dRAoO,,OoAAoO,,OoAVeeVWddW$,,$"..9dRRe99eRRd9J.QpBApQ//QpABpQ.pqottoqpX;NN==NN;$+jK1PX@c_[%L@$ccW[OY@! '% +!+  +2#".54>2654&#"7"&54632Rd99dRRd99dRWddWVeeV".."$,,9dRRe99eRRd9pqottoqpX;NN==NN;]$0+!%!!]fm%,]@ 0+7#!!3!!pqN@m-96 4r8}30+7#3pqNq6 4r$ 0+2#".54>!5##7#Rd99dRRd99d@8cm/^q9dRRe99eRRd9W]ZH:$," 0+2#".54>!5#7>54&#">32Rd99dRRd99d#%MW3-TKNY `* 9dRRe99eRRd9*vVW@'F2:KK<"$0- 0+2#".54>4&75!3>32#"&'326Rd99dRRd99d DFx҇ !&((#*)a [OWa9dRRe99eRRd933>W_VaG;EP$!  0+2#".54>535##3'7Rd99dRRd99d..9dRRe99eRRd9YU]Y$4" 0+2#".54>2654.#"735!>32#"&'Rd99dRRd99dTW\*9-b #"(%#$,c \9dRRe99eRRd9RG&5! NZ 5D$.: 4/( 0+2#".54>2654.#"46327.#"72#"&546Rd99dRRd99dWX_-< (60*&$e TS]fg^$%(!%(*9dRRe99eRRd9UB"2 ;83?wtml$ 0+2#".54>35!3Rd99dRRd99d't9dRRe99eRRd9Dgc$+7C @ =81, 0+2#".54>"32654&'>54&2#"&546"&54632Rd99dRRd99dR]]!##c]]a$"!Z^&,,&&-,',-0)(/,9dRRe99eRRd9G:!1 4#;KK;#4 /""3267#"&'32654&"&54632Rd99dRRd99dNX^,"32654&#7%".54632Rd99dRRd99d?GG??HHTI'   9dRRe99eRRd9g{|dd|{gE5HP 6+W44W+6 *>s0+#s‡34$>m0+3$‡43B>  0+!#3%3#BooEEk=kk5>  0+!53#5#3wooFFgkkk=`#*@'J[*KY#L&'+!53.'4>323!5>54&#"PE҂;H3[LM~X0K?GNaZTlfHwt#SIyW0.TwHYz*txHZkl? #@ GUYM +53'>7F?  @  0+3#%3#3+53265t}_t} U]Q$((aYz%* 0+533533_'^$ 0+# #X$6* ("0+74>32#"&32654&#"32654&+6$A\6fw779Akv{Y4:1*.><..9@6[6U8gS1NLDenqg6,%%08632.3.('0+%#"&546?>54&#"'>323267 ``qNTC'# '2 |t[_hWO@%*"-4NMNK=J EKSC@E " "4 J 0+!5##'333373#'#?*oj++ko+u4(%0+732654&+532654&#"'>32#"& 9).951[W.61))9 }^es666>od{*%1,+2t/((.*(TWhW6PK?am\9 X9 &XTO3+=N 0+# #nrpe=Q=JP8zS0+!5#"&53326533#5Q4K_-))4H8&XTH*)."*(0+#5#"&=3326=H*Q]#+%6]X!)(%8F"0+#5#"&'#"&53326533265FL6:IX6K`,)#7,($7>)0$**YTG'*,%*()+%*8z&0+3#5#5#"&'#"&53326533265FHGL6:IX6K`,)#7,($7>)0$**YTG'*,%*()+%*T 0+%#"&=#5!>3232654&#"TydkpB&#A10"),,("1\tr\~-DB'+00(,'%7 0+73>32#"&732654&#"7B&#A1xdkq0")--("1'-D.\trJ'+00(,'%$ *$0+%#".5467'.546;#"2654&#" n6[A$`I"#QH_9L3243358o ?>=X '%!"-+/7 sur;(#C'1" %*&YilVEH"nC:__3+'nH:``3+"n8:m``3+'n=:{``3++ VKK3++"KK3++"bKK3+@5n%!0+4>7.74>7.@#>W2H"?/aKHf#>W2H"?/aKI3U>"Nwd'UQctA{BUNNwd'UQctA{EU)gy65e'#0+'>54.'7'>54.'7e#>W2IJd/?#H3V=##>W2IJd/?#H3V=#Lxf'UAzAtcSU'exNLwf)UBzAtcSU'ex@y 0+4>7.@#?W3MKcYTMhONo\(ZBypHZO:t 0+'>54&'7t#?W3NKcYTN3W>#LOn]'ZBzoG[(_qB\0+!#3B`c||5O0+73#5!!5k|$0+5326=46;#";#"&=4&#*2^NU6("*((*"(6UN^2*->TcQ|$.V,2$0+#"+5326=467.=4&+532;)2^NU6("*((*"(6UN^2),>ReO|"2Q-@n%!0+4>7.74>7.@#>W2H"?/aKHf#>W2H"?/aKI3U>"TOn]'TKZmAzBVOOn]'TKZmAzDV)`p6e'#0+'>54.'7'>54.'7e#>W2IJd/?#H3V=##>W2IJd/?#H3V=#RLp_'V@zAmZLT'^oNLo_)VBzAmZLT'^o*s0+#s‡NO$m0+3$‡`NOB  0+!#3%3#BooEE`ckskk5  0+!53#5#3wooFFkkks0+3`c0+#3`cj0+3j|`cj0+33j|||rq1Q#ee3+8k3++  0+"&54632.#"2654&'b IXJW ! ^%<Jhjq'?q  0+"&54632'2654&#"EGFFGFGG dqrccrqdq  0+"&54632.#"2654&'E $FQGP  ^&?Hijq 6#s  0+73'733!I۵L֊sp*Z gs  0+!#5!533#%3$#OO댝f/'b$e-Y0+3!5!oMq,&f#/ )$0+%#"&5467.54632%2654&#""32654&f:34-556=D;;EE?=FGBAGH@?cpja=&u 3+&u=&u$3+!&u&-K1PX@ Y"L@UYMY+3#IG]l@UYM+3#zxl44l@UYM+#'`xll@UYM+3#%3#}|8l l @JUYM+3#'#x66lFFl'@$JUYM+'373v54wEE ek LKPX@fW\P@rW\PY@   +"&'332673QMhhJMAAM+nkX@ JGKPX@hc[O@pc[OY####+54632326=3#".#"+2+   Z,,#  6B   6C   $XV@UYM+!5!X4b?g*@'UYM+53353?Hyyyy%e@UYM+53%~~.O 1@.cW[O     +"&54632'2654&#"SS>  M??MM??MP####o AKPX@fW\P@rW\PY""+332673#"&{ &&}_cd`o#$#$TRR&J  @w; V<[ C      0 Y v : xd > { <G < Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo SansCoFo SansBoldBold1.001;COFO;CoFoSans-Bold1.001;COFO;CoFoSans-BoldCoFo Sans BoldCoFo Sans BoldVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590CoFoSans-BoldCoFoSans-BoldCoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Designer: Maria Doreuli. Team: Irina Smirnova, Elizaveta RasskazovaDesigner: Maria Doreuli. Team: Irina Smirnova, Elizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.com  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni0000uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecomb dotbelowcmbuni0394Sigmauni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni0492uni0493uni049Auni049Buni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04BAuni04BBuni04D8uni04D9uni04E8uni04E9uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Auni200Buni2012uni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089liraEurouni20B4uni20B8uni20BDuni2113uni2116 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdownuni2196uni2197uni2198uni2199uni2206uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni2610uni2611uni2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi3008uni3009uni301Auni301BuniA7B6uniF6C3uniF6D4uniF8FFCRI.altuni00CD00A40301 uni0407.alti.TRKuni00ED006A0301 uni0457.alt uni041B.BUL uni0432.BUL uni0433.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni0438.BUL uni0439.BUL uni043A.BUL uni043B.BUL uni043F.BUL uni0442.BUL uni0446.BUL uni0447.BUL uni0448.BUL uni0449.BUL uni044A.BUL uni044C.BUL uni0431.SRBexclamdown.capquestiondown.capguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap hyphen.cap endash.cap emdash.cap dblparenleft dblparenright parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.capdblparenleft.capdblparenright.cap uni3008.cap uni3009.cap uni301A.cap uni301B.cap slash.cap backslash.capbar.cap brokenbar.capat.capcopyright.pnum_lnum zero.zerozero.tnum_lnumzero.tnum_lnum_zero one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044D0301 uni044E0301 uni044F0301 caron.alt acute.cap grave.caphungarumlaut.capcircumflex.cap caron.cap breve.cap tilde.cap macron.cap dieresis.cap dotaccent.capring.capCyrbreve jkklnoop%&)*45=>CDLMWXXYZ[[\ bTDFLTcyrl6latn BGR .SRB N    .AZE .CRT .DEU .MOL LNLD lROM tTRK       aaltncaltvcase|ccmpcrcydligfraclnumloclloclloclloclloclloclsinfss01supstnum  BJRZbjrz "*2:BJhpx>@D$<<$V  L  D v     V  2  n0  P# $$$$%%"%@%^%|%%%%%%V{|W}~ZptuqSTUVY]o^_`abcdefghijklmn\wxrsV #,>?@CL^_`chjkmpu{!"[\]^abpNOPQTyz, /v gedff  gedffSTUV!"STUV!"6",-MX-[M,LL*]^_`abcdefghijklmn (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $4styy  6Lstyy styy "8Ndstyy styy styy $:Pf|styy styy styy styy &<Rh~styy styy styy styy styy (>Tjstyy styy styy styy styy styy  *@Vlstyy styy styy styy styy styy styy " ,BXnstyy styy styy styy styy styy styy styy $ .DZpstyy styy styy styy styy styy styy styy styy  T'{|v}~ptuqwxrs' #>?@C^_`chjkmpu{[\]^abNOPQTyz  F yst   yst   yst     F         st yy  $   70t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF| (!'A&l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~)t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF|l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~ >A{}*4>HR\fpzccccccccccccccccccy~,O,O\\pppppYpY+, yst      WY\,, pp   xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernv~     !#%')+-/13578:<>?BEHJLOQSUWijklmnopqrstuvwxyz{|}~X]  @(.DZ Bd(NtH^d^"0:Dfx2HHHHH  ( 6 P V \ P P  >   B H b l v  P B   T j p z V B B  6 V 99;Y[Y`   }CJI" 9;|~ 9?Y|d||~ "9?| |~9|~ "9d} 9|~ 9;|~ |9;[ 9;?|~ [| " ;[|~(/D4$.& =& #[w#0F1/1  | -(:0"+  #9IYw% | !9?MY ("++C2(+/  " #I  #?Y99;9IY9Y[EKNOD/2/2YIIMYP$Q$S$U$WOYBZB$$$$$ $$$$4B=8G$$BBBIOMYP$Q$S$U$WO$7$$$$ $$$$ N=GG$$HFGHJRTX(/D4$.&  (*,.02=AINR "q}|~q| q}|~|~ "mm?f|~lllm " q}_fo|~ q}|~n^_`jo|m bf #?^_`jo"   C"6?"@` /2m}ppp,p"8"L$$$$$$$$$$/[$9Y,IY\bf^bf^`j99q}{  9}x9; "#%)379:;<=>?IY[\^cdegw!#%35678:<?LUWXklnqrstuyz|}W\]^_fghoq{Z|`u   552`, $$  v  x z w !        9  C,E {2 }    %gcg#@&"!bb ABHCDKKEFGKKHHIJLMNOP QRS^TUVWXY^ZZ[R\]_>`?a eAAAAAACBCCCCKKKKHKHHHHHHMMMMOQQQQQQTSTTTTWWWWZ[[[[[[aRaAQAQAQBSBSBSBSH^H^CTCTCTCTCTDUDUDUDUKVKVKWKWKWKWKEXEXFYG^G^G^G^KZKZKZVKZH[H[H[CTI\I\I\J]J]J]J]L_L_L_MMMMMMN`OaOPPPHPEXXEXXMCTPCTH[J]L_OaX[ll'mk(rr)*+nrsrj,umqlnurrnrrror-kms./qrrqprpoorv0~yzz{{x{6~~||{{yy7x8||wz9:o{;m<mnzq~tt=wo{o{KZJ]N`N`N`CTOacchihi geErWXj23z4z5ww~~}}1ffddd$ jlrosroorvy{{{QP*G*:5DKTWVH9>=RJ<O34%7L  F r&   @ASMsI rrrr          rrrr r&               %%%     & 'h\ (ZX-'' (]Y[ -/+mttU"0,ttt!tt"tt"#$"jt`tt#tt,t1""t"fqgp!ttt$tck'"d.tttt).).e'"   s?Nr^n_0o22ltt2a22#bi;CBE86'(-/+"t"$t,t1;   "?DS2UWBY^EccKmmLstMwwOyyP{{QRjq'))++--//113HJZ irt'TUV]_bhmns W[]beiloqx{{}}ideoromnDFLTlatn$ ` `դ'ח%חPKwL\2@limit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Bold.ttfnu[0BASE/;HPFFTM\GDEF$&+dGPOS$I ULGSUB,v+*OS/2bt!`cmap Hcvt Xdfpgm( gasp+\glyf^?$Xhead"x<6hheamt$hmtxlu 0locaE@ maxp  name&z 'postmAJHprep}woA _<ח%ח,]a,S(8wKkXKX^& COFO   (dM1L<F &<@:H +0 4+*y  *1W7/.UWUz1 K0KpK]K0K,KK>KKK /K /K,D  6B 44])D3(J= J w H"J= ;#= ==J=.J=J t=! H9 #  % .Pj221LC7! Pjm5)/8r&_"I-.v.$H4-D (8V)-#_'#7      0pKpKpKpK,,K,,K / / / / /R /DDDDKP=((((((H(   =  .J=.....H0H9H9H9H9% I=%  ( ( (0 0 0 0 KJ J pKpKpKpKpK0H"0H"0H"0H"KJI, , , ,  ,K =K;K#=>J =>K 8>K =>K=V"5 KJ=KJ=KJ=J=KJ= /. /. /.<rKt=Kt8Kt#,!,!,!,!   DH9DH9DH9DH9DH9DH9 # % 6.6.6./]KKH KeK =K KN=DH9H(]KKH H( /0,! % $+),(&&43}$( :L=vpKpK$.K0,,K,, 8K0KKK KK.K pK)KKK KK /KK0+  K2K3KKK)#K((<, ==T M=M="=? =G=.B=J= %  P="(9=O=p===)!7=! ; B J=J"=M=% @= p /.) 7K>. K,= K\=( ( KJ=/$ /.KJ=,! #  #  # pK% @ P^%++ 7/ /7//&&Y/0j"j'x"&5+0(("-4-&5+0((0>08$ iK6215+58A V B " B p S U p!X8<WUU>$>$>$>$>$>$>$>$>$>$>$>$]]3>$>$>$>$>$>$>$>$>$>$*$B5T`?(d2/,K, ;=  :6(H" H9H9#= J==]8,(88s7)$1L j"j'_"_'+%++@6@:B52@6*$B5PjPjz1/8+#*'$-&%"-4-&5+0(("-4-&5+0(( pKK /K)#K((M=.% ==)!&3h4  +{$?%}.*~7~37Y#_cuGc      " & 0 : D p y !!!"!.!T!^!!""""H"`"e$i$$&''0 0 927Y#brFb      & 0 9 D p t !!!"!.!S![!!""""H"`"d$`$$&''v00{uh[S;%"bAigY?93)!e/sleb^ (UA10F6Z V   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivokuj20r34ghlzcn1.m{b7wU[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-), .]-*, .q-+, .r-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpB-*B *B**B@ * B@@ *D$QX@XdD&QX@cTXDYYYY" *DdDvv>>vv>>2222\fb<d*vX  rL|  J x 8 R x f  R  F r $H`t$r8nv^J|Hx Tb8^*B~$p*6BN` R ^ j v !! !!$!0!&J&V&b&&&&&''r(((&(2(>(J(V(b(n(z(()))()4)@)L)X)*R*^*j*v******+|+++,",.,:,F,R,^,j,- --2->-J-V-b-t-------..*.Z......../,///////01J1V1b1t111111123Z3f3r33334 4N4Z4f4r4~4444445.5555555556666n6z666666666667 77"7.7:7F7R7^7p7|777778.8Z88899F9999:: :F:h:t:::;(;0;8;H;P;< >6>B>J>~>>>>>>>?????@"@T@@A AVABBBtBBC&C.ClCCDD.DdDDDDDDEEEEEFF2FfFFGGdGHHHHtHHHHI IIIJJJ(J:JxJKK\KKLL  0+!%!! '7d`222j:F%!L,@)Y"KY#L+7353_0ؕ<vDK1PX@Y"L@UYMY@+333J^v<<FK1PX@&  sb   a"L@/r  sb U Y MY@+7#537#53733733#3##7#37#\e r|   Zd qz Fyyyy5 ` !(/.@+-,&%  J]+L +?5.546753.'#5.54&'> 2(wsh[kp)&zr~n[m%0(-$3,+",a]]iYY eS)`[_f YXc %" #f '3K PX@%  d[*K [ #LKPX@+   c  d[*K [ #L@3   c  d"K[*K#K [ +LYY@')(/-(3)3#!''   +"&54632#32654&#""&54632'2654&#"NiiNQddVU"##""&&NiiNQddQ"##""&&-_dc^_b]f00.00.00g_db__b]fc/0.10/0/&,6~KPX@43# J@43# JYKPX@[*K[+L@[*K#K[+LY@1/+)*#+!'#"&5467.54632>77>54&#"3267'&/%_?|W9tg`lSEn!y :"~5,3+%$.TG<4#+/ geK\>#SicQKXpJ'=i%+ .#"')+5 +<v5K1PX@ Y"L@UYMY@ +3Jv<@-y 0+4>7.@#?W3MKcYTMhNxe'YBypHZN:-s0+'>54&'7s#?V3N%@.XTNg Lyg'Z!Wdp9uHZN]uJ@ JK1PX@ Y"L@UYMY@ +7'7'7'37' U2aa2U d T2``2T ]i?V**W?ii?W**V>hHAB; ,@)UaYM +%5#53533#|Axx ^ @GY#L +353'>=0NK *'HQ M% +VR@UYM+%!5!V+}0@Y#L+35304>@r'L+34!g+ -@*[*K[+L     +"&54632'2654&#"bJOOJIPP dqrccrqd  #@ J"KZ#L+73'733!9MĮ[s߇N*@'J[*KY#L%"+4&#"'>32!!5%>:84G bQ<E='2::a{xdTg6X.@ jK@HJpnY"K\+L +"&'732654&#"'7!5!32B EAEDGB/( -P;# g]-.1)/)l,F2kv | (@% Jb"K#L+!#5!533#%3(+TT팝f,*e6@3JcY"K[+L$%$#+!>32#"&'732654&#"'!6 M(w D=G9@D%;!jql}cW(+6.-3(g1r$;@8 Jc[*K[+L $$$%$"+%#"&54632.#">32"32654&rn @6KOX?w?@?B@>>k{X_%+[c%f//.10..18%@"JY"K#L+3!5!b:7}#/>@; Jc[*K[+L%$+)$/%/##*"+%#"&5467.54632%2654&#""32654&}:34-557=D==EECAFGEDGHBAcpja54&#"'>3253 '%""-,/7 sur<(#C'1" %*&YilVEHؕ1aQANK'PX@& AJ@& AJYK'PX@+c  c dW[OK-PX@2  pc  c dW[O@7  pc  c  WdW[OYY@MKGE(&#&$&(" +#".54>32#"&'#"&54>325332654.#"3267'54&#"326 x@Yh9=n\Vd7aQ5< B.Mb/@# 5u$)Ig>ErP-+NmA-`a*"-,#*e!4d_]h82\Q|* )l`1L4$OJ?cB#-QsEIoJ&+)4/15,  ,@) Jb"K#L +#'!#376ZX{K~ C@@Jc["K[#L   ! +3!2##32654&#32654&K32.#"zHL J{V02XzHKEPca|C6ow-WVYV+yl3DphgqK'@$["K[#L !+3!2#'32654&+Kfgl`alfffjbK8 /@,aY"KY#L +3!!!!!KHSK8 )@&aY"K#L +3!!!!KD0"l@ JKPX@a[*K[#L@#a[*K#K[+LY@""$%(#+#5#".54>32.#"3267#5{%gBFvT/3[~K} IAYddXH\_G&+-XVYV*kl,=pgho@*wK '@$a"K#L +33!3#!K% XK@"K#L+33KXX @"K\#L !#++53265XimkF402ok+1K -@*Ja"K#L +3333##KQQ K(@"KZ#L+%!3(#KN .@+ Jp"K#L +%#33#ζʓ?'LXaK @J"K#L+!##33ȓ;C>/-@*[*K[+L +".54>32'2654&#"K~Z33Z~KK~Z33Z~KZbbZZbb +WYWW,,WWYW+teerreetKu +@(c["K#L $!+3!2+32654&+K2qv<44<lvsng/03-/)r@JGK PX@h[*K\+L@p[*K\+LY@%#)) +".54>32'':7'3>54&#"K~Z33Z~KK~Z3?6>hJ8 e;bZZbb +WYWW,,WWa+QNdPV6errehuK 3@0Ja["K#L !+3!2#'#32654&+K0qB;}<44<lvNdh//3-,v''@$J[*K[+L+%+#+?32654&/.54632.#"#"&, N<>C%3xYs?D:>/6T[.0& ! Vc_liZ"8' ]Tck`x!@Y"K#L+5!##dD@"K\+L##+3#"&53326EQN@khHKK!@J"K#L+!33X  '@$ J"K#L +3# #3jɪɚX  &@# J"K#L +3373#' 踔^J#@ J"K#L+!533󱪩(B6w /@,JY"KY#L +35!5!!6t7oB>\#@ aY'L+!#3B|_|4>@r'L+#3؄4>O@aY'L+3#5!!4F|g)97!@Js"L+#'#vuo>@Y'L+!5!3~3#$-K)PX@ Y"L@UYMY+#3˘t}(+KPX@ J@ JYKPX@c[-K[+L@#c[-K#K[+LY@)'#%#5#+!5#"&54676254&#"'>32'&"3265\J-F`cT!=($ ) l]-N9!2(%+47 !LFME#!"CZ)F3(!=*!yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@(#+33>32#"&'732654&#"=H'+L8!!;Q/(D8/0770.9 ?^>@aA!+*6GA?G7.'@$J[-K[+L$'&#+%#"&54>32.#"326oq`n$@Z54N6 *+0851++Qa|>`@".?"/GBCH,  !yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@ (#+!5#".54>3253'54&#"326F1,N9!";R/(B4.3971243 !?_=@a@!XD.6G@?H;7@4Ja[-K[+L&'"+%!3267#"&54>32'"3.8.,+!6M3r&AX2ps$6 098)6)w?`@ q).+, n/@,["KY%K#L!#+3#53546;#"3#_RR_ZV=# wwm}]Bu!}"4 "/@" JKPX@ [%K[#K['LK1PX@$%K[-K[#K['L@!_%K[-K[#LYY@ $&(%%%+3#"&'7326=#".54>3254&#"326$A\6^z 5"1=I1,N9!!;R/-F8-1981-9(^? #9.3E>32#4&#"=J6La-+%9&XT(+')';,@)Y"K%K#L+533;-~~>3@0Y"K%K\'L +53+53265EWbF#($-~~C `Xz!%= 1@.Ja"K%K#L +33373#'#=8nx7=@"K#L+33=X=J"V JKPX@[%K#L@%K[-K#LY@""##$# +33>32>32#4&#"#4&#"=K6:IZ6K_,)#7,($7>)0%+*YT)(*,%)'*+%=LJKPX@[%K#L@%K[-K#LY@ ##+33>32#4&#"=N6Kb/)$:@ *XT(+')' -@*[-K[+L     +"&54632'2654&#"rrtt1::10;; wwwwvFDDDCEDF=>*!f@ JKPX@[%K[+K'L@ %K[-K[+K'LY@(#+3>32#"&'32654&#"=L1,K7 "@aA!*6GA?G8. >!yKPX@ J@ JYKPX@[-K[+K'L@ %K[-K[+K'LY@ (#+5#".54>325354&#"326~B2,N:!";Q/1D5-396134!?^=@aA!#3TD.6FA?H;=n '@$J[%K#L !#+33>;#"=E!%.1C<%~&'!''@$J[-K[+L+%+#+?32654&/.54632.#"#"&!-(*%+CHMu\Ur }))%%"?JWoi]r C?MQLD" BAHYO kb)@&rY%K\#L# +!#"&=#53533#;kUd\JJ!!CVh}xx}'9 ZKPXJJYKPX@%K\+L@%K#K\+LY@ ##+!5#"&5332653Q3L^-*(58&XTH*)."* !@J%K#L+333sqd  !@ J%K#L+333# # QXZRZ[OPL  &@# J%K#L +!'#'373pc[\U鎎 >"@ J%K\'L!"++5326?33i$[[C3"( ̠xhgH}L. /@,JY%KY#L +35%#5!!.|}{}>$3@0Jcc['L$#!,!%!+75326=46;#";#"&=4&#*2^NU6("*((*"(6UN^2*->ocQ|#.q-j>@Y'L+3j|g2>$-@*Jcc['L%!,!% +%#"+5326=467.=4&+532;)2^NU6("*((*"(6UN^2)->meO|"3k-2X,@)Wc\P#"#"+#".#"#>323267XTO740!zTP73/!Vq#Vq#LE@Y%KY'L+3#3#QtC0CH!C@  JK1PX@ "K#L@ Y#LY@ +!5.546753.'>7dwxcW_d)"$' h_)%$*] om ]\_H-,Ia\[3C  B7N%9@6JIa[*KY#L%%D+%#!!5>5<1#53.54632.#"3֛G1-tUqnv ,.-2 $@E)_E+_mbQ./'&?"!'#/B@? #J HGcW[O.,(&!-+7'7.5467'7>327'#"&'732654&#"xWp nWq32tWs rWr346..22..6'Wp44oWr sWs23qWq 034//44 }>@; Jb  a"K  # L +35#535#53333#3#f±h]_1_\ _1_]j>*@'aY'L+33j|||Ktt5>;3G-@*>1! J[*K['L%#%"+#"&'732654&/.5467.54632.#"'>54&/"&#}kmu 4(%2,4FQ[2*{gmr ,*%-0+NMV0)/0A !)- VaZP%* PQ3M<(T\[N"+ PK4L< )#(  * & )-x$@!Y"L+53353)G-}}}}8'C@ A@43JKPX@' c _["K[-L@,cc c W [OY@)(><861/(C)C''  +".54>32'2>54.#"7"&54>32.#"3267J^66^JJ^77^J32'&""3265 /$6@LW  "$2+.. *4<@y "8 U@ JKPX@ %K#LK#PX@ Y#L@UYMYY+3#'%3#'IA>K PX@gUYM@sUYMY+!#5!I}.-6( JKPX@1 p  c  _[*K [ %L@/ p  c  a  _[*LY@'/. 20.6/6 - -,+*)#! +%".54>32'2654&#"'532#'#7#32654&1U?$$>V11U?$$?U1MfeNNefz226V-"""$>V11V>$$>V11V>$2iNNiiNNiE&($PHH/ .=H@Y"L+!5!H=c$X *@'_[*L     +"&54632'2654&#"JccJKeeK**((XaLLaaLLae*))*H B ^K%PX@ aY%KY#L@aaY#LY@  +%5#53533#!!|£xx=|4z(@%JcY%L%"+4&#"'>323!57> #` VHHN1.>¢:<=8.5(VQl-|@ J IK PX@!hfa[%LKPX@#pna[%L@)pnaW\PYY@ +2654&#"'7#5!2#"&'7!!  p0d1@ZNFT a#?FPX>003!###1O66O1XxZ 8K*+K7 ~""8 3+)&2@ JK PX@hc\'LK PX@pc\'LKPX@!pcW\PKPX@pc\'L@!pcW\PYYYY@ +"&'732654&573<@U!$*Q#16I'( 3/'(+-3-{ )@&JrY%L +535'733SdX2n\U8GWU#d qKPX@[*K[%LK!PX@c[%L@cW[OYY@     +"&54632'2654&#"FZYGHYYH" !"""TNLRRLMUT*$%''%$*'= g@ JKPX@%K#LK#PX@Y#L@UYMYY@  +?'337'3'b#&' 3+t3+y&'t3+t3+7& ' 3+t3+:!=@:JpY%K\'L!!+#53267#"&7>?>=V'%""-+06 tur<'#ꕕC'1!%+&XjkVEH l&$u l&$ l&$ k&$ g&$ p&$ 3+B@?JaaY"KY #L +3!!!!!!'#3'\Z ~#0$4@,+JK PX@*hf`[*K[+LK PX@+pf`[*K[+L@,pn`[*K[+LYY@0.)' 44 +%267#"&'732654&57.54>32.#"zHL q16I=<@U!$#DoN+2XzHKEPca|C6eu (+-3'( 3'1WRYV+yl3DphgqK8l&(gK8l&(K8l&(bK8g&(bl&,KLl&,2Zl&,÷>g&,ȳ 7@4a["K[#L ! +3#53!2#'32654&+3#KCCghl`algvffjbvKk&1/l&2/l&2/l&2/k&2/g&2RK81  0+?'77'RVVVVVV/'6@3%$J[*K[+L'' +".54>32.#"2654&'K~Z33Z~KK~Z33Z~ 3ZeZd . +WYWW,,WWYW+_%@A uwe": Dl&8Dl&8Dl&8Dg&8l&<K 4@1cc"K#L   $!+3332+#32654&Kqu<44llqwl|,03*=2&=@:!Jc[*K[#L &&+!#532654&+532654&#"#4632QA<.37.9*%*-*14~ths)*9By{.(/(y+"%)61+lpdW-GPFai(&DC@(&Du(&D[2(&DaQ(&Dj;(&D_(+.5BKKPX@ .JKPX@ . JK-PX@  . J@  .  JYYYKPX@$  c [-K [+LKPX@) U   c [-K [+LK-PX@*  a  c [-K [+L@4  a  c [-K[+K [+LYYY@0/@>:632/505"$%#5$" +%#"&'#"&5467>54&#"'>32>32!3267'"3.&3265(jbBbeBKacT!='""+ l]32.#"3267<@U!$"`q$@Z54N6 *+0851++ WI16I'( 3' r>`@".?"/GBCH,"F\ !(+-3&HC2&Hu&H[-3+&Hj9&C=6&u%7&[+&j$0@!J$  HK PX@[%K[+LKPX@c[+LKPX@[%K[+L@c[+LYYY@&%,*%0&0+'7.'77#".54>32.'2654&#"? .%Ba@BB=\=4[A&"=T13(65465:8@^"/A?c;cH) =Z96X=! /RG89EE98G=&Qai&RC?&Ru&R[:&RaU&RjFH#BY ;@8aaUYM  +53!!53ȑK~ܐ 6@3J[-K[+L  +"&546327.#"2654&'qrt 2?q3?  wwww"GJE" 9 &XCK9 &Xu9 &X[E9 &XjQ >&\u=H(j@ JK1PX@ "K[-K[+K'L@ [-K[+KY"LY@&#+3>32#"&'32654&#"=K0Xt";'0;83&<`$|?`?!}&0DABG., >&\jC Y&$3+(&DpP k&$(&D]? 3o@J IK-PX@b"K#K['L@b_"K#LY@ +"&5467'!#332673y?W%66'0 /zZ45 4X %\(40=@$.JK1PX@(c[-K[+K['L@%c_[-K[+LY@;951+) 00 +"&54675#"&54676254&#"'>323267&"32656O%J-F`cT!=($ ) l]-N9!*  *c2(%+453"33 !LFME#!"CZ)F3 $\(!0l&&&Fu0l&&&F[.0e&&&F^0l&&&F\1Kl&'o &G A)KPX@  J@  JYKPX@&a"K[-K [ +L@*a"K[-K #K [+LY@(&" (# +!5#".54>325#53533#'54&#"326F1,N9!";R/)Crr447/0871244!!?_=@`@ _W11WD-7G@?H;K8V&(&HpOK8k&(&H]=K8e&(&H^K3Hx@ J IK-PX@(aY"KY#K['L@%a_Y"KY#LY@%& +3!!!!!3267#"&5467KHS!, .?W&  %\23 84,3@  ,JK1PX@(a[-K[+K['L@%a_[-K[+LY@.-10-3.3+"&'" +#"&5467#"&54>32!32673267"3. *6Or&AX2ot8.-+| $6 053/w?`@ q#98)4.).*-K8l&(j&H\,0l&*"4 &J[@0k&*"4 &J]Q0e&* "4 &J^0&*S 3+"4  -:@-JHKPX@) a[%K[#K['LK1PX@- a%K[-K[#K['L@* a_%K[-K[#LYY@9731+)!  +#54673#"&'7326=#".54>3254&#"326^^? #9.3E>32#4&#"=55ppM6La-+%9 W11Ws(XT(+')'8k&,$&a0V&,&p9k&,%&] 3G@ JK-PX@"K\'L@`"LY@ +"&546733267?V#!) .45 2X %\4^@ JK1PX@Y"K%K\'L@`Y"K%LY@ +5333267#"&546;+ )6N"-~~ #\53"/Ke&,'=@%K#L+33=Ks&,-;>&LMl&-%>8&Y[K&.S 3+=&NSJ(l&/0=1f&Ou 3+K(&/S 3+8&OSK(&/=&OK( 0@-a"KZ#L  +%!3753(#啍=*@'a"K#L+33753=GX}}"? ,@) J"KZ#L +%!5737?$AA #y#%LyL , &@# J"K#L +355737TKKKK,o+t,p,Kl&1 =&QuK&1S 3+=&QSKl&1=&Q\O=&Q3+KHO JK1PX@"K#K\'L@`"K#LY@ !#++53267#3jiG/($ʞ,okd!&Ei=>X JKPX@[%K#K['L@%K[-K#K['LY@ !%##+%4&#"#3>32+5326/)%9N6KbYW:"$!+')'@ *XT`Y{#/V&2&Rp\/k&2&R]F/l&2&RbT<' KPX"JKPX"J" JYYKPX@!a [*K[#LKPX@5a [*K Y"KY#K[+LKPX@3a [*KY"KY#K[+L@1a [*KY"KY#K[+LYYY@&$C(" +)#".54>32!!!!!%3267.#"fB$K\44\K#?!,*bZ,,Zb*WZXW+~eroR")5K!PX@"J@"JYKPX@#a [-K [+LK!PX@-a [-K [-K [+L@7a [-K [-K [+K[+LYY@+*$#1/*5+5'&#)$)"$$$$ +%#"&'#"&54632>32!3267'"3.2654&#"O!5M3:VY:rr@;0/JK PX@)hf`[*K[+LK PX@*pf`[*K[+L@+pn`[*K[+LYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57., N<>C%3xYs?D:>/6T[yp16I=<@U!$"r.0& ! Vc_liZ"8' ]TXj (+-3'( 3'a!&>@<;0/JK PX@$hc[-K\'LK PX@%pc[-K\'LKPX@"pc`[-LKPX@%pc[-K\'L@"pc`[-LYYYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.!-(*%+CHMu\Ur }))%%"?JWVQ16I=<@U!$!N` C?MQLD" BA?U (+-3'( 3%M,vl&6!&V\ x&7S 3+ kb&WS[xl&7l 6@3paY%K\#L#! +3##"&=#53533#;%|=]dUd\JJ!!CȳVh}xx}'x/@,aY"K#L +5!#3##5#535d瀀vv kb9@6r  aY%K \#L +!#"&=#535#53533#3#;kUd\HHJJii""CVhTG{xx{GT(Dk&89 &XafDV&89 &XpeDk&89 &X]WD&89 &X_Dl&89,&XbaD0%\@ #JK#PX@p"K\'L@p`"LY@  %%+"&5467.533265333267?V!}~EQN@Z`!, .441 hHKKHks (\94%h@"#JK1PX@%K\+K['L@_%K\+LY@  %%+"&54675#"&533265332676O"Q3L^-*(5*  *53"34&XTH*)."* $] l&:0 &Z[l&< >&\[<g&<}6wl&=.&]u6we&=.&]^6wl&=.&]\3/7@4 Ja[*K[+L&%"+467!.#"'>32#"&267!/ YJAQz2WxFCEX ZJ$ PS?1myVW-0LKNIK,l&'<K&'=  &G=;K&/-JK>)&/MQ=>&OMKI&1-K>&1M=>$&QMLDl&89 &X\EV&(+&pK,&'=K&']  &G];l&(+&uJ/l&&u,v&6S 3+!&VSux&7S 3+ kb&WS[V&< >&\pZ> @%K\'L !#++53265WbF#($ `Xz!%$!@@=Ja[-K[+L!! +#"&5467!.#"'>267#us%@V0tuH5+(0 }$8O."3 1v?_@ p ;6%7)q(.+++#7JK)PX@ Y"L@UYMY+3#'#jz78zRR)#@JK)PX@ Y"L@UYMY@ +'373l}76|k#OO,m !@`"L   +"&'332673RKjjLP??P(-@Y"L+53(-~~&  1@.cW[O     +"&54632'2654&#"1<<10==0 <./==/.32#27:D#BOL#{m"+,(]vvZKm&|3+0 4@1Ja[K[L(%"#+.#"3#3267#".54>32 JHB]^CFIHzX20WzJ.CMJKLB.dz*UZXW+v,v6K,>p&,ȳ  3+X- %iKPX@ cYK[L@*cYK[K[LY@!%%!%$! +7>45!32#!#+5326%#32654&vqjl:",2m||<44(hsy8jyqlIHa(*20,K>@; caK\ L$! +33!332#!!#32654&Kvp$||<44 jyql<*20,7@4JcYKL##+5!#>32#54&#"#OO(v?B@ l|F9Kl&.Kl&o&{Kr MK PX@gKZL@sKZLY@ +##5#3!#X $Kt 6@3cYK[L   !+3!!32##32654&Kt~~q723Zqqd$++"K~%K@YKL+3!!K r3@0QYKYL +3>746<5!3#5!!# E )b1qB ^od厎9_' 籱CD뺰?\L  )z(D@A Jc[K[L$"!((+"'>32#"&'732654&+532654&YAE 89=D LEBE7=hj6-<,91ctd`6K JA]qoj19)*'#}%$%(K $@!JKL +!#33ƚ822XKo&K. !@YK[L!%+7>45!##+5326jl:",2(hsy8XIHa(KN0K+/2K!@YKL+3!#!KUXKu30&x7"@ JK\L!$+%+5326733)5H1O;",,>& m+a'2KPX@-f g d W [O@+r s d W [OY@(((2(2*)''! +5".54>35332+#2>54."{H{Z34Y|GH{X22X{H&D22C&D33DR$HoJJmF"NN#GlIJoH$R(?+,=%D&<,+?( ;Kr )@&RKZL +3#5!3!bޗ#2h)@& JdKL#"+32673#5#"&=3AM >O+vF:*X qK %@"KZL +333333KڗڗXKr%-@*RKZL +3333333#5Kڗڗa 6@3cYK[L   $!+5!32#!2654&+Mvq<44<jyqli*20,K[ 4@1cK\L   $! +332#)3%2654&+Kvqy <44<jyqlX*20,Ku *@'cK\L   $!+332#!%2654&+Kvp <44<jyql*20,)4@1Ja[K[L&%"#+?3267#53.#"'>32#"&) RHDV SE@XtGvT/2?MLMI<4no)UXoK&sKPX@!a[K [L@)aK[KK [LY@" &&  +".'##33>32'2654&#"BsW: oo :WsBJ~Y33Y~JYaaYZ`` "EjGEjE#,WWYW+seeqqees(p 2@/Ja[KL&+!#5##7.5463!";5p~@Hp><44<gUql+10,(D,(R@ JHKPX@[K[L@c[LY@#!(("+%#"&=4>7>7>322654&#"~pz'JnE1V" $Y/SSU1Xr0641.>:r?XzN(  GK"&rD<>B4*HA= C@@Jc[K[L   ! +332##32654&#32654&=W`(+'X]ST!aa#?B; 9+BK\a=@YKL+3!#=V}zJ+@(QYKYL+73>7>7!3#5!#35#4HԌ};()|Sr$7"IH6@3JaK L +!5##'3353373#'#?*oj++ko+巷(D@A&%Jc[K[L#! ((+%2654&+532654&#"'>32#"&'7./")NK%!((03 zbho(&(1{lku 3d_*%NWME#5 31IQ\R%,= @ JKL+3#33#ʍ,/=&TR 3+= -@*JaKL +33373#'#=9qv9궶 !@YK[L!'+7>45!##+5326lB\@%JMJm32/`R}"= '@$ JKL +333##=vs͇J^]=  '@$aKL +33353#5#=걱R=!@YKL+3!##=ȏm=>*SF!@YKL+5!##™m}}m >\> -:Q@N%J K [K [KL1.!!62.:1:!-!-)' !# +23*##5#.54>75"&#263>54&:3*#:bG''Gc;;bG'(Fc;8@A6CA<]??_>  >^??^<CDCBBCDC [=zF )@&RKZL +3#5!33Hm(/@,JdKL##+!5#"&=3326753V:$]_*+% UX+ = %@"KZL +!3333@mm=zE-@*RKZL +3#5!3333HmmQ 0@-cYK[L  $!+!32+##32654&oUa^Z^DD.$'UWY[l~|%"=<@9 cK\L  +!3!332#'#32654&iUa^Y#ED.$&UWY[|%"= 0@-cK\L    !+3332#'#32654&=oV`]Z)ED.$&UWY[|%"4@1Ja[K[L$%"#+?3267#53.#"'>32#"&6++23((5 }x^l|qeu$,0.f,.)(N[|x\=nKPX@!a[K [L@)aK[KK [LY@$" +333>32#"&'#%2654&#"=I}cssbI91::11:;\ewwh]lFDDDCEDF! 2@/ Ja[KL"+463!#5##7.735#")d]A`n15\\%#%CNYLn&HC3z#K@H!J a_K[ KL  ## +2+532654&#"##53533#>`*A-_r+2%'2%6IINBpUu_ziM,' W11Wp%=&uw4@1Ja[K[L$%"#+.#"3#3267#"&546323,*4 4(*2 ~takofsD".0.f+/)'M]{z_!V;L+ 7@4YKKL   +533533A-}}}}>M #'iKPX@ cYK[L@*cYK[K[LY@ #!' '!'$! +7>45!32+#+5326%#32654&lmUa^ZC[@$BB.$'JMJUWY[m32/`R}"O|%"=+>@; caK\ L$! +3335332+5#%#32654&=mVa^Z~CC.$'걱UWY[|%";@8 JaK[K L## +3#53533#>32#4&#"=IIM6La-+%9 W11Ws(XT(+')'=&u=&CY >&\TF 3+=z MK PX@gKZL@sKZLY@ +##5#33m >@;ra c\ L! +3#5353!!32##32654& t~q3/0PPg^plb#)*$N:@7 cKYK\L$! +3533#32+##32654&lZca]r\\%!"꾾sCDUTGw_/!>@;a[K[L!!  +".54>32"!.267!K~Z33Z~KK~Z33Z~KKb s aKL` a +WYWW,,WWYW+8RKKRLTLLT >@;a[K[L     +"&54632"3.267#rrtt*8 8*+8 9 wwww.00.0110!@J[KL!"+>;#"#3GO9"! #J;#& $!@J[KL!&+#37>;#"puL  0%0B-}K#/GK PX@fYKL@rYKLY@ +3!53!KH>eGK PX@fYKL@rYKLY@ +3353#>܎{ -@*aYKL +35#53!!3#KCCǢv;v  -@*aYKL +35#535!#3#=33Vnni}giKr6@3Ja]KL +33333#5##KQl-Q =z$6@3Ja]KL +333733#5#'#=9qRTv9궶Kr0@-a]KL +33!33#5#!K%bh =zR0@-a]KL +333533#5#5#=HK걱< >"#@ JKL+#53"˞vl7/@,JbKL+!5#53333#v߰svk(v >"+@( JKZKL+!##5#53333{~RvlPl~=K)@& JcKL#"+%4&#"#3>32#AN =N+vE; r=K/>$Z/KO&1d 3+=U&Qd,Ov&6d 3+!U&Vd l&:& &ZC l&: &Zu/ g&:- &ZjK8k&(~&HaFl&< >&\C@^-@UYM+!5!-1}+Q@UYM+%!5!1z+bQ@UYM+%!5!b7z7{ $@!HUYM +#5467˔NK +'IP M% /q @GY"L +53'>=?NK *'HQ M% /^ @GY#L +353'>=?NK *'HQ M% 7{ 3@0HUYM   +#5467##5467NK *'NK +'IP M% IP M% /q +@(GY"L   +53'>=353'>=?NK *'OK *'HQ M% HQ M% /^ +@(GY#L   +353'>=353'>=?NK *'OK *'HQ M% HQ M% & MK1PX@a"K#L@UaYMY@ +#53533# {{T&eK1PX@ a a"K  # L@% Ua a Y   MY@ +5#535#53533#3# |{{|/* @[-L  +7"&546323JJ34JJJ44JJ44J0&' '3?KK PX@+   d[*K  [#LKPX@1 c    d[*K  [#L@9 c    d"K[*K#K  [+LYY@7A@54)(GE@KAK;94?5?/-(3)3#!''   +"&54632#32654&#""&54632!"&54632%2654&#"!2654&#"NiiNQddVU"##""&&NiiNQddNiiNQddK"##""&&"##""&&-_dc^_b]f00.00.00g_db__b]f_db__b]fc/0.10/0//0.10/0/"C5JK!PX@ %K#L@UYMY+3#''HRJKPX@ %K#LK#PX@ Y#L@UYMYY@ +?'3'x[@"K#L++36RQ" QK)PX@c[%L@cW[OY@     +"&54632'2654&#"R__RS^^S && '']]]__]]]W*99,,99*& Z JKPX@rgUZN@rsUZNY@ +#5#5733#'35_eԣ((qGYNN5m@ JKPX@ac[%L@!acW[OY@ +"&'732654&#"'7!#>32GTa$ ! a+32'"32654&V[\QEOb#* -#GLTP$#! Vac].1/+7;:B0m*@'JsUYM+#5!P=Zc(#/ JK PX@cc[%LKPX@"ccW[OKPX@cc[%L@"ccW[OYYY@%$+)$/%/##*"+#"&5467.54632'2654&#""32654&\QWVPUVO#$$" ""$$""$$3<95) *1::1% +WI({$q@ JKPX@cc[%L@"ccW[OY@ $$ +"&'73267#"&54632'2654&#"DPa"%& -#DPVNR][R!!"!/0.,8:9CU_e^"  3+-{y 3+4z s 3+-|t 3+& 3+5 3++}  3+0m  3+(   3+({   3+0hJKPX@cY"K#LK!PX@!WaY"K#L@"caY"K#LYY@!# +3!!!>;#"##0A$'.?; "-'>U.J@GJI  a a[*KY#L.-*)('%% +%#!!5>7#53.'#53.54632.#"3#3ݡG#, nj R-qnv -.-2۲ ' )_  ^  _mbQ./' ^ ]1Q@N+*J Ia b[*K [ + L11/-"%%" +753<5<7#53>32.#"3#3#3267#"&';7>7#5!>54&#"'>323#3!3267D xq5Y?$7  j+++4 khz3~   4+,3Ld+C/ Z Y  !'%!S[_S Y  Z  %#'8R +@(aY"K#L  +!5!5!##R–I_턄k$gJ@G  ca  ["K#L  +#3##5#535#53!232654&#tqؑNNNNrl:1282eiie2v2enli23+-1 %"0+%#"&='>7546323>54&#"_[X#/gKKOrW""D+%||Sk  ^  ]YRH\/;&"T&%K  !% @ $" 0+"&54632##332654&#"!5!DUUEESSߪ%%kQQNRRNOSH>&#"%$##&hh 0+5!##5373#5#'2gdHF^EKFNZZ@å2$  0+%#".54>32!3267"!5."nI^74[JExX3%}OWLy%#t]m2]SN~X0.RsD7:BNE=6191&'u3+s3+5&'x3+s3++&' }3+s3+5&' n3+s3+8&'r3+s3+Ax&'H3+s3+V 0+!!VVXxVXB 0+!'3'LVmXVX" 0+!'7'7!"VXVmXB 0+!737YVXVXp[ 0+!!#_~z[y^S[  0+7!5!#SNz~byNcUo 0+73!5!U_yNb_dNxpo 0+7'3!Ny_}N_x!0+!5!kKR}}+X3}0+!!X%}~8y!-9 3.*$0+#"&'#".54>32>323267.#"%"32654&+A,;Q "*4,A**B/3T$P40B*'1 0"!-0% '>2!A##!2>A4!:(*8"4@ "-&''!(#)<gM/# 0+232673#".#"#>232673#".#"#>50,|PM31.|SQ50,{NN31.|SNhNiPgNiW4[ 0+?#537#5!733#3!|5Z<6y6S<5hywzkkzwyhU5{  0+%5%!!5  &h}U5{  0+%5%!!U J &h}$'2V@S-,+Jp c bW[O(((2(210/.*)''  +2#".54>"32>54.535'733Rd99dRRd99dRAoO,,OoAAoO,,Oop]0mc9dRRe99eRRd9J.QpBApQ//QpABpQ.X9GZX$'@S@P/.=J ccaW[O<;:931,*''  +2#".54>"32>54.4&#"'>323!57>Rd99dRRd99dRAoO,,OoAAoO,,Oo *` YNKT.4W%#9dRRe99eRRd9J.QpBApQ//QpABpQ."=9731,*''  +2#".54>"32>54.#"&'732654&#"'7#5!6Rd99dRRd99dRAoO,,OoAAoO,,Oou_WPZ a'+"''%! FwFC9dRRe99eRRd9J.QpBApQ//QpABpQ.}EPD:J\V_U@$'255,JKPX@3ph  c bW[O@4pp  c bW[OY@43210/.-+*)(''  +2#".54>"32>54.#5#5733#'35Rd99dRRd99dRAoO,,OoAAoO,,OoBk..9dRRe99eRRd9J.QpBApQ//QpABpQ.Y]UU$'Hf@c>9 8,+J  c a  c cW[O)(B@=<;:640.(H)H''  +2#".54>"32>54."&'732654&#"'7!#>32Rd99dRRd99dRAoO,,OoAAoO,,Oo?T\ c,$#%("# b,-9*\9dRRe99eRRd9J.QpBApQ//QpABpQ.D5 ZN !5&GR$'BNi@f218J  cc  c  cW[ODC)(JHCNDN<:64/-(B)B'' +2#".54>"32>54."&54632.#">32'"32654&Rd99dRRd99dRAoO,,OoAAoO,,Oo<]gf]ST e$&*06( <-_W#)'%!'$9dRRe99eRRd9J.QpBApQ//QpABpQ.lmtw?38; 2"BU$'.Q@N-J pcaW[O(((.(.,+*)''  +2#".54>"32>54.#5!Rd99dRRd99dRAoO,,OoAAoO,,OoU9dRRe99eRRd9J.QpBApQ//QpABpQ.Hcg$'?KWj@g:.J  c  c c  cW[OMLA@)(SQLWMWGE@KAK53(?)?'' +2#".54>"32>54.2#"&5467.546"32654&"32654&Rd99dRRd99dRAoO,,OoAAoO,,OoA\\!"%b]]d$#!_['+,&&**&)/,,++.9dRRe99eRRd9J.QpBApQ//QpABpQ.MD<#- 5";KJ<"5 /"9GU$'BNi@f821J  c   c ccW[ODC)(JHCNDN<:64/-(B)B'' +2#".54>"32>54.2#"&'73265#".5462654&#"Rd99dRRd99dRAoO,,OoAAoO,,OoE^ff\TT e%&*07'!<,^W"*'%!'$9dRRe99eRRd9J.QpBApQ//QpABpQ.Mlmtw?38; 2"BU$'3:NK!PX@ 8 76 J@ 8 76 JYK!PX@.  c   c cW[O@4  c   ca cW[OY@'<;)(FD;N"32>54.2#"&546#'732>54.#"Rd99dRRd99dQAnO,,OoAAoO,-Oo>GG>>GGnW$'OS      9dRRe99eRRd9J.QpBApQ//QpABpQ.Pg{|dd|{gEW:< 7..8 8..7 $'3?R@O cc  cW[O54)(;94?5?/-(3)3''  +2#".54>"32>54."&54632'2654&#"Rd99dRRd99dRAoO,,OoAAoO,,OoAVeeVWddW$,,$"..9dRRe99eRRd9J.QpBApQ//QpABpQ.pqottoqpX;NN==NN;$+jK1PX@c_[%L@$ccW[OY@! '% +!+  +2#".54>2654&#"7"&54632Rd99dRRd99dRWddWVeeV".."$,,9dRRe99eRRd9pqottoqpX;NN==NN;]$0+!%!!]fm%,]@ 0+7#!!3!!pqN@m-96 4r8}30+7#3pqNq6 4r$ 0+2#".54>!5##7#Rd99dRRd99d@8cm/^q9dRRe99eRRd9W]ZH:$," 0+2#".54>!5#7>54&#">32Rd99dRRd99d#%MW3-TKNY `* 9dRRe99eRRd9*vVW@'F2:KK<"$0- 0+2#".54>4&75!3>32#"&'326Rd99dRRd99d DFx҇ !&((#*)a [OWa9dRRe99eRRd933>W_VaG;EP$!  0+2#".54>535##3'7Rd99dRRd99d..9dRRe99eRRd9YU]Y$4" 0+2#".54>2654.#"735!>32#"&'Rd99dRRd99dTW\*9-b #"(%#$,c \9dRRe99eRRd9RG&5! NZ 5D$.: 4/( 0+2#".54>2654.#"46327.#"72#"&546Rd99dRRd99dWX_-< (60*&$e TS]fg^$%(!%(*9dRRe99eRRd9UB"2 ;83?wtml$ 0+2#".54>35!3Rd99dRRd99d't9dRRe99eRRd9Dgc$+7C @ =81, 0+2#".54>"32654&'>54&2#"&546"&54632Rd99dRRd99dR]]!##c]]a$"!Z^&,,&&-,',-0)(/,9dRRe99eRRd9G:!1 4#;KK;#4 /""3267#"&'32654&"&54632Rd99dRRd99dNX^,"32654&#7%".54632Rd99dRRd99d?GG??HHTI'   9dRRe99eRRd9g{|dd|{gE5HP 6+W44W+6 *>s0+#s‡34$>m0+3$‡43B>  0+!#3%3#BooEEk=kk5>  0+!53#5#3wooFFgkkk=`#*@'J[*KY#L&'+!53.'4>323!5>54&#"PE҂;H3[LM~X0K?GNaZTlfHwt#SIyW0.TwHYz*txHZkl? #@ GUYM +53'>7F?  @  0+3#%3#3+53265t}_t} U]Q$((aYz%* 0+533533_'^$ 0+# #X$6* ("0+74>32#"&32654&#"32654&+6$A\6fw779Akv{Y4:1*.><..9@6[6U8gS1NLDenqg6,%%08632.3.('0+%#"&546?>54&#"'>323267 ``qNTC'# '2 |t[_hWO@%*"-4NMNK=J EKSC@E " "4 J 0+!5##'333373#'#?*oj++ko+u4(%0+732654&+532654&#"'>32#"& 9).951[W.61))9 }^es666>od{*%1,+2t/((.*(TWhW6PK?am\9 X9 &XTO3+=N 0+# #nrpe=Q=JP8zS0+!5#"&53326533#5Q4K_-))4H8&XTH*)."*(0+#5#"&=3326=H*Q]#+%6]X!)(%8F"0+#5#"&'#"&53326533265FL6:IX6K`,)#7,($7>)0$**YTG'*,%*()+%*8z&0+3#5#5#"&'#"&53326533265FHGL6:IX6K`,)#7,($7>)0$**YTG'*,%*()+%*T 0+%#"&=#5!>3232654&#"TydkpB&#A10"),,("1\tr\~-DB'+00(,'%7 0+73>32#"&732654&#"7B&#A1xdkq0")--("1'-D.\trJ'+00(,'%$ *$0+%#".5467'.546;#"2654&#" n6[A$`I"#QH_9L3243358o ?>=X '%!"-+/7 sur;(#C'1" %*&YilVEH"nC:__3+'nH:``3+"n8:m``3+'n=:{``3++ VKK3++"KK3++"bKK3+@5n%!0+4>7.74>7.@#>W2H"?/aKHf#>W2H"?/aKI3U>"Nwd'UQctA{BUNNwd'UQctA{EU)gy65e'#0+'>54.'7'>54.'7e#>W2IJd/?#H3V=##>W2IJd/?#H3V=#Lxf'UAzAtcSU'exNLwf)UBzAtcSU'ex@y 0+4>7.@#?W3MKcYTMhONo\(ZBypHZO:t 0+'>54&'7t#?W3NKcYTN3W>#LOn]'ZBzoG[(_qB\0+!#3B`c||5O0+73#5!!5k|$0+5326=46;#";#"&=4&#*2^NU6("*((*"(6UN^2*->TcQ|$.V,2$0+#"+5326=467.=4&+532;)2^NU6("*((*"(6UN^2),>ReO|"2Q-@n%!0+4>7.74>7.@#>W2H"?/aKHf#>W2H"?/aKI3U>"TOn]'TKZmAzBVOOn]'TKZmAzDV)`p6e'#0+'>54.'7'>54.'7e#>W2IJd/?#H3V=##>W2IJd/?#H3V=#RLp_'V@zAmZLT'^oNLo_)VBzAmZLT'^o*s0+#s‡NO$m0+3$‡`NOB  0+!#3%3#BooEE`ckskk5  0+!53#5#3wooFFkkks0+3`c0+#3`cj0+3j|`cj0+33j|||rq1Q#ee3+8k3++  0+"&54632.#"2654&'b IXJW ! ^%<Jhjq'?q  0+"&54632'2654&#"EGFFGFGG dqrccrqdq  0+"&54632.#"2654&'E $FQGP  ^&?Hijq 6#s  0+73'733!I۵L֊sp*Z gs  0+!#5!533#%3$#OO댝f/'b$e-Y0+3!5!oMq,&f#/ )$0+%#"&5467.54632%2654&#""32654&f:34-556=D;;EE?=FGBAGH@?cpja=&u 3+&u=&u$3+!&u&-K1PX@ Y"L@UYMY+3#IG]l@UYM+3#zxl44l@UYM+#'`xll@UYM+3#%3#}|8l l @JUYM+3#'#x66lFFl'@$JUYM+'373v54wEE ek LKPX@fW\P@rW\PY@   +"&'332673QMhhJMAAM+nkX@ JGKPX@hc[O@pc[OY####+54632326=3#".#"+2+   Z,,#  6B   6C   $XV@UYM+!5!X4b?g*@'UYM+53353?Hyyyy%e@UYM+53%~~.O 1@.cW[O     +"&54632'2654&#"SS>  M??MM??MP####o AKPX@fW\P@rW\PY""+332673#"&{ &&}_cd`o#$#$TRR&J  @w; V<[ C      0 Y v : xd > { <G < Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo SansCoFo SansBoldBold1.001;COFO;CoFoSans-Bold1.001;COFO;CoFoSans-BoldCoFo Sans BoldCoFo Sans BoldVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590CoFoSans-BoldCoFoSans-BoldCoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Designer: Maria Doreuli. Team: Irina Smirnova, Elizaveta RasskazovaDesigner: Maria Doreuli. Team: Irina Smirnova, Elizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.com  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni0000uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecomb dotbelowcmbuni0394Sigmauni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni0492uni0493uni049Auni049Buni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04BAuni04BBuni04D8uni04D9uni04E8uni04E9uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Auni200Buni2012uni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089liraEurouni20B4uni20B8uni20BDuni2113uni2116 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdownuni2196uni2197uni2198uni2199uni2206uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni2610uni2611uni2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi3008uni3009uni301Auni301BuniA7B6uniF6C3uniF6D4uniF8FFCRI.altuni00CD00A40301 uni0407.alti.TRKuni00ED006A0301 uni0457.alt uni041B.BUL uni0432.BUL uni0433.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni0438.BUL uni0439.BUL uni043A.BUL uni043B.BUL uni043F.BUL uni0442.BUL uni0446.BUL uni0447.BUL uni0448.BUL uni0449.BUL uni044A.BUL uni044C.BUL uni0431.SRBexclamdown.capquestiondown.capguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap hyphen.cap endash.cap emdash.cap dblparenleft dblparenright parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.capdblparenleft.capdblparenright.cap uni3008.cap uni3009.cap uni301A.cap uni301B.cap slash.cap backslash.capbar.cap brokenbar.capat.capcopyright.pnum_lnum zero.zerozero.tnum_lnumzero.tnum_lnum_zero one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044D0301 uni044E0301 uni044F0301 caron.alt acute.cap grave.caphungarumlaut.capcircumflex.cap caron.cap breve.cap tilde.cap macron.cap dieresis.cap dotaccent.capring.capCyrbreve jkklnoop%&)*45=>CDLMWXXYZ[[\ bTDFLTcyrl6latn BGR .SRB N    .AZE .CRT .DEU .MOL LNLD lROM tTRK       aaltncaltvcase|ccmpcrcydligfraclnumloclloclloclloclloclloclsinfss01supstnum  BJRZbjrz "*2:BJhpx>@D$<<$V  L  D v     V  2  n0  P# $$$$%%"%@%^%|%%%%%%V{|W}~ZptuqSTUVY]o^_`abcdefghijklmn\wxrsV #,>?@CL^_`chjkmpu{!"[\]^abpNOPQTyz, /v gedff  gedffSTUV!"STUV!"6",-MX-[M,LL*]^_`abcdefghijklmn (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $4styy  6Lstyy styy "8Ndstyy styy styy $:Pf|styy styy styy styy &<Rh~styy styy styy styy styy (>Tjstyy styy styy styy styy styy  *@Vlstyy styy styy styy styy styy styy " ,BXnstyy styy styy styy styy styy styy styy $ .DZpstyy styy styy styy styy styy styy styy styy  T'{|v}~ptuqwxrs' #>?@C^_`chjkmpu{[\]^abNOPQTyz  F yst   yst   yst     F         st yy  $   70t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF| (!'A&l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~)t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF|l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~ >A{}*4>HR\fpzccccccccccccccccccy~,O,O\\pppppYpY+, yst      WY\,, pp   xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernv~     !#%')+-/13578:<>?BEHJLOQSUWijklmnopqrstuvwxyz{|}~X]  @(.DZ Bd(NtH^d^"0:Dfx2HHHHH  ( 6 P V \ P P  >   B H b l v  P B   T j p z V B B  6 V 99;Y[Y`   }CJI" 9;|~ 9?Y|d||~ "9?| |~9|~ "9d} 9|~ 9;|~ |9;[ 9;?|~ [| " ;[|~(/D4$.& =& #[w#0F1/1  | -(:0"+  #9IYw% | !9?MY ("++C2(+/  " #I  #?Y99;9IY9Y[EKNOD/2/2YIIMYP$Q$S$U$WOYBZB$$$$$ $$$$4B=8G$$BBBIOMYP$Q$S$U$WO$7$$$$ $$$$ N=GG$$HFGHJRTX(/D4$.&  (*,.02=AINR "q}|~q| q}|~|~ "mm?f|~lllm " q}_fo|~ q}|~n^_`jo|m bf #?^_`jo"   C"6?"@` /2m}ppp,p"8"L$$$$$$$$$$/[$9Y,IY\bf^bf^`j99q}{  9}x9; "#%)379:;<=>?IY[\^cdegw!#%35678:<?LUWXklnqrstuyz|}W\]^_fghoq{Z|`u   552`, $$  v  x z w !        9  C,E {2 }    %gcg#@&"!bb ABHCDKKEFGKKHHIJLMNOP QRS^TUVWXY^ZZ[R\]_>`?a eAAAAAACBCCCCKKKKHKHHHHHHMMMMOQQQQQQTSTTTTWWWWZ[[[[[[aRaAQAQAQBSBSBSBSH^H^CTCTCTCTCTDUDUDUDUKVKVKWKWKWKWKEXEXFYG^G^G^G^KZKZKZVKZH[H[H[CTI\I\I\J]J]J]J]L_L_L_MMMMMMN`OaOPPPHPEXXEXXMCTPCTH[J]L_OaX[ll'mk(rr)*+nrsrj,umqlnurrnrrror-kms./qrrqprpoorv0~yzz{{x{6~~||{{yy7x8||wz9:o{;m<mnzq~tt=wo{o{KZJ]N`N`N`CTOacchihi geErWXj23z4z5ww~~}}1ffddd$ jlrosroorvy{{{QP*G*:5DKTWVH9>=RJ<O34%7L  F r&   @ASMsI rrrr          rrrr r&               %%%     & 'h\ (ZX-'' (]Y[ -/+mttU"0,ttt!tt"tt"#$"jt`tt#tt,t1""t"fqgp!ttt$tck'"d.tttt).).e'"   s?Nr^n_0o22ltt2a22#bi;CBE86'(-/+"t"$t,t1;   "?DS2UWBY^EccKmmLstMwwOyyP{{QRjq'))++--//113HJZ irt'TUV]_bhmns W[]beiloqx{{}}ideoromnDFLTlatn$ ` `դ'ח%חPKwL\Alimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Bold.woffnu[wOFFBASE˸>P/;FFTM\GDEFXt$&GPOSL$I GSUB E*,vOS/2$W`bt!cmapd cvt 4dfpgm ` gaspPglyf<~(^?head66"xhhea!$mhmtx| 0lulocaqE@ maxp  named'&zpost0 mAJprep}woA _<ח%ח,xc`d``>k)Yu"Ȁ S(8wKxc`af X ( d͟q=b``>(0$iR`5 xڕYlU9oG Җ[ZJ R+R6ʠ(IP""*Ox1C !A1ȃ6XsƽgG5$\/>i;&wXc9Dl4}pf;ش4_u3Cp3&ey_6r_`y3&>1F#kyAx*\ṙfS>%v'_l&iڏ-JE 8 2`ӊkl15?fb:U)9M;&2}k[<&;'>GʝP=u{ҏqjvTTtuZװX; "5B+H^4'R*H11=/i-*9a~xi;XN5{ c˧$ϓK<)1 {43~fDgTO1N>%nqb!gBށ^ `G]qLws?(7-95Ry~A1#?Zۿ3=O6bduĀGuGu`m4<9 Ձ*/qzM w=ny} 5j˨A2؉f'swO\_l)ݎmv~ߵj1!EvLDr%ی*DkKkfaqJx2YflY(nM|UTUIWϚcY!V:Z1:I[گSu@O׳ ިw꽺ECv=<خ~?_/OH%KKKH[ $j82us@&ʹN~1(ef y_Zj6C5:iYAj~xia͉>tv]c7Ǻ$4:ڰ $*yJoW{3CCC\{v+ܥn;qɮ<n u~uNt;'cΗNSlq69O8˝r';1Nth0:t4 M t|}wAwO?N|ә9mؚتó?YQr9'Z C1L4#a\\¥&xer$jcq??Ha"1FCWs גdISids=9Lg7p#71e0[cs۹;{gESB) T"yv]vm}fZ|Aڅ, ᱊7xE%L^u`QTӶe,Ycߡh2GXm4sԋ8/~OqVg;,2*6S[z^b/Wxl:YVEX HAQ*$,,xڭVisV$NBuyij?B0`B,.JPZ)v}~͕ig7~Z}M I;Ôa|ϻ:zw JgVvt٢0:2Q0:o6! "!S(M{Us; ہM%ʨ"IIqV5f>oNbA FIF#+ "vpe=b ^;tiLp?$3r($$ ~_D~%zODw'k" o ts'#Xv(h+L1+bƔ?$/94;9u}7f2%k' ?>ex[GɞP/'2,Gɘ 3eXMzI٢멉S^eeX/B;OMflUԍ(3]~@!Mii5s:%.xEf4Tk7HrzLCoVI ֟U1Gfl&gg?d.b;H8yldK6V_A&D$M߄RR0%呱7MSj^wi M9)o`9Ә1\%gl]@|١E,gTeJr,RIyT2mX (Q!C% :TC*˯{]-#K>YJr>,G+*|dVsEC}"O㣸*29h82J^c@+96*DKI\!ã9WgǍ`N4zcO7d5d."ˈ/;:tEUZ/*UX*h"wzlbuELi..~[f B^WBzڋǢA9 }s+xYa=ͬdχ.lyR{(]/Jzq3^lG^}'KX̲JXh .m`D.Gh[q#GTNෝnPM~eYCjnh50|}"綢jK]E=f9(K*zfK+:vkb>vKMb|9- 1 s8_˘ŏO5 ]EW!Z5y |ʆyDq;R SǞ dZК-aaǜ_0a0Asgs_37a1A`9 :aeEGi>m}-t?ᰉn?AԈ?iԟF_j4bCE7GG|5b1z: xrT8rEvMfxcp"(b##c_Ɲ  ؜6J21hX[8ؙ8 l-6qV0i7&N i7y .U;#68tDldNq٨h``dqH)JL,esck3"#vy@^^&'MZ!mH)yq"E|K), ¯(1ŴbYQUTyUxhǪ%U +ʀW)'rWE՚jKVNUW[1 .1h hڃAO^MQjPUOquB^Sk@W|TӫM3[m5i6=Thj53ZtnYn^^_ /VT=7-!>ڜXTNMn%e@2 Cp^/+#;Mxin(n6$L$S)`7|6L31S}q#8Ҙ-ĢD-M#+ɪYkجm55/59p%p<o>lcx6Mc3MڒS;nڷw-C>ǸcqF&Ђ8i!g9\qn9ߝW{uoޞvC=>O3yY^ zǼsMuu5O_ov{=v:*::;>wtVvv~@ ڀ= Lw~wۺt_ tF\H !cHl!=WDO>H -A cDp)x Z{D~2C~*L3‚6l“delTP @u4fèb:̊aư)l[Ŷ Nĩ8 p70}8çe|_1}d"H09xڤ `Ǖ0\==94f44cq!6ⴍcG`;:$N8\f$|&&fl8^Uw I5U^""Y;&!.<Ɯ>_/Uu"-PvS bg:?e]vx*8Sl!ߒyYM|6 K`&杲^ @EaMQy&)N4j'Q*ajK;L&%-ܥgne gs1ɾ2rW9(Ӆw˿5|m~n~W^y6#E#(!թDUeEa:/}K8G`NXMaF໣@OEJ*"6Z~>z7 l)ػ [o FJV&^*,C+Vl4]WXuOG=R8岀$DO?%fR$zv*,kБD'4Χ0' n0S n El| {LȣSXcPRSMƒA'Rq:,n ?O 䢄=PPM Hb&i}ScCE0 9igw{6nYv-]F]@+͋ԆUkWZ'2f2W] ۇkjjkjk`G*"΀T&r } 5$^wddO't/owwtT) ! tg?SOS$bn_<( q06,5Q8Y 5U(ݵ~f7d=d"^2SD|ntc+Rܺ1|~Tp` fR/!'̗vv>f=cΚ軙 _U ?mZ.V[q氣rN=} $ Ua H j҄?op*DOddIyޚi%E`T#: L Aa EaEp(E%+ ` MGo<6zwϚgΝO(xX-o?&v{uv0 )yn;f0/D4a&**)u{]/ ڄٴ8#isv̉STSzkXT[6tߪpb`QS̶{4`(p*g*숈I jIRD N\ ޻|ֽ!m#pd%QAe ,S.;r$bp$ T']/ g.dC=766feVk3g̙ x1MC-i[Qwvڭg`4Fģxe4pK 5iaa#a5:" :qX];lY zթg 9y3'{\Lt7u1nOfhm߹jWEKfU& P~㳔^K'ا סO \jH%}ڇ ӬMưC/4f/2t;ǿ}Q^rXhdz' =+vCO4#v uL}qd}cx)v7sg 2wh-*"Hq$"C(ra}%t;|of^d x K-fw-%>d!>ᤠu%TfPh7kgy@CQyXeta$a-1b%", 'zQ72҅ׯ߲zhy0VxԤ*2DF#I2P2Ozġ>;RW ~6TIvT+sV;G`dK\d$নs'S Sm)_w*8Y {4`xC GVJI`UvrQpKx}ǜ=Kjv>?oFڵ}#s+U}l㛷T߰-Qӧ.smҒ^`R8WOXpL͗%-Wf z +%=?\|)>LQ ")Aͬosja6ߝ_Wy+~q<~Kړ6Lnמ/e^<ƖǏz&\D%%D3a{S dr`ṕ pDu0>C"iX'7y^z[Ϸ3e7}!e@f 0$ARkRhӟOӯffxmuM)$֫돎"Jܮ"dN\QHdr}5˔={?ܛc׺u;v[KM^c'T /:ڑܮrݚonMI*}JP5K=̱c[}6Yn')$. dnɋ nPq<-!TTy( #WџrPyJb1:+'FHҩPWmCkGΗ?Uz%D% C ˖5!d7Im>)&TVX:aH&Osq8#ɷe`wt#\0ncO'BNto~C7 ) -Tas4582x ;Nq _QCU5%K}@E僦M;nrim5Mǖ wk+~˶lxՖKS">_c]dxjN671Yş,ǽ4.v҂pǏ_z_p`VNpJgiS=he \c^ԓzflfCg$ _K87鑔>A1LlS:Έ0Kt.F`.O?$c4 =Γg<΃w@-cfE³W&uXl̤]L:(Gds/_:w?]I{/\N&S08 `1(4RuPGO>3yF3|M0ލ~|"I35qtT# JL؄w4]Bsnzꞻ3acwAǀ10WliEĉ"6%tlu}V8SF=z;!xH뿀,UJ %{d,"jjKosG}zT9gxBDwIEBiB< RR);vT,$vI8өSF@mW-^j`7ҭ}+:v;\?7!cFEl *a9!H`2Ba=zqUHjEt8Bp8 pv'@GPN7| pЌ{ʍ֢y 9UsSNJ/f-K\{ld20me{ym-$+ @Ԡ̮ͅza/P:8 %]MCU0z+MDb̏(a OMwN_=ޘt aM?}jT:p`y ؘ(c"?c|B]a(eeh9GK}=33y?"Q,;Pl[异 8Ƀ6 kVHf`l{@tVLA=ˑ4QT,]9Oޝyhz1C`ѡYf]ݏ*_uIGO\'ϝ'N|p0n! |FTm2|AYr>Nd js g;y$ߙSQxƿʙߡ;}&}g'BTj̆a^$z3, !W~͍L ̍ߊY`6oQ~eҦh Ѧ=+ߺm}-3-Y-} mmbʯqAJeqA1AZckd0*z[}ד4(ǰ2u'jSg |91Geߪjۺn@rs,efE2pNWB}%x{C0`YxAБI-@*-jA΃P% \ 6G.YXڜS˶۝KLlk;&Gr>wk!E9;g\4:Z ٙZc& )NUWAc.V}U::Fh;u)N9M#< ۋO}ޝ&ٴwP,4UWWW7EzGކm;Lggc{vdjmA~͋1^njn.Ada@*)BH4.& -'B_Q oį{׿]w=qŪUt0j|~\2FՁ6CH=&ӞG̮K٘@ߧN%\.mur,tSO'׃z e`$|Uy,gCjh"ȃe67D s K<ߺ|BWW&z//$[S;^U -_XeHkϻ^"@Azhӊ]ڳW4*7l_U5wW߶~AgtgwJue^<VTAҴ~ 7F%=~18(E'YmBJhĊ7β pAyWK \[F~p.~/bb{x.xjBM-2Tgז;xOTWRQh7v3EE )'/f4e408_PdUj#WS 9" dE0?{Gmg83J4rWA?hb !mȐ0ߍQyy{Etѩ1u\wbD5tS|ۤ|(ՠ.O a\.:ð g-g8@0IS+E}3RS]^2tL _ÝiL8_Հ$[ -cۗͿ~]OϺ{ΦeUE@ZP gY[H^Iz6uE2,B <.c S8pTAoNb:,_he|fXt2S'aJ)!/5 ¯dO){G{K#sa:pXP`bVZQIۀga_[mmK{ns8~!HI9xO$:-|ٹq CseR3mD1OYl7(n 5lNzy,AQ݂&iA}/˧tsKPL'Shy>?(esWzoc4 WyEQRy>7Fҧ#}ݽjOJBG Gn t8IND̕" icsKO:$Z,|*$k"4Jgz ڨXh;]YLd-Rb?Juk0HY씹.EzdۯHC$ y8̀量16Eaʭ&B's @]ӽxqKp$ % U ֧" LݬTP傫dQPn2KfɁMbiSNb̓9q̉5Ǐ>1Z_s)p>i KٿKDxXe ?'Y*\x3">Wu3T{Y{㦉9<{fi#zOZS6Lay Af P *\~h^%6:+N.A.;yM]wP ųgzNTX6mBam,[b !B,ݜLl`擵i߬Ii_M紏vǿTK.Q-xl!o.0A0Vm0f# 5DY-^%~p{\J'qeݦrFOsIlDW{ a,fSzțK7_cYJ>;zо</66>oy.g1xyą21XRُG"\GdzLM~FӯZh!'k^r.5]zuI_œ<ӾYk|)}6y$-L[HEZļ3?LHπx29Md8TԉB4P}^J_Szc 4"9|*%=׽|m)s^}E82]Nyy3޸.0$M;ܦ(p#F6i7=9ɝ8-8jq1sTz)JC|Lw80 bR k,v?pH Olٲ-/U&㪯9㰻4AMSe-S,lA l?ب"{cel!f.Rlǫu vmOhMD k$菶k,3n̒)~'dr..Os?-mR_UB.&4械RT$RULȤ}T1+[ͺ.BF4BH tW*m Ɉ$HKHhӵbkv&Z41Pw֤ڦr46p1GOk6:RTeJvbpӚ5.Ǻ\F lYb/YReg悾6W&TeF#eƳsj+uszH x@Q@PusUU$ K]H-Yb9*NĽe:B%=gStl :Ril %ycI/ly^)5ъ@& '31N#9P9W>I|{~߀Ifl/Ma:Aqis/|-#x}TN~8+s>eKnb YLI+M>fvr\%X\=_Ӄ"?dKdj&O䌑dRs9'XlK=T/JS;1 3ځXjPAOjWZ&IϹ: #3ViѤi]ZdCgd 51}T"ǒAps{osHϙoj m"(܎{87@=RB$RZD/*hEkJ>j3x-4k k]Цgk M <.++)[@J䑻~qBM ¾$}x%v]Ň4&I{*I PtN>=g:ER?s8G9N$WPkNJAt0}m0h\6ΫXLѡ@OI䤖1OiCJ|)" } d$!v4ը"BPC/ xxyܩaF>GlfFkj`NGCtNW^fU5fLER4YidAe`NtEknuZw&8p?Ϗj ݔ2;#JV z=S<#ryW=ҪɞuL̪P|y E.3QΩ;Ye}Aui{oERvq U,bt 4 g*IJOЉFJu93:J0mY2PIb*[&@ XVHMR)kuU]mU:+"\K t# 3|墒^~ݴ-2ٶeT%}zoqf ^nLzj|N9KeNƪU42KW-$С3]ro)EiߡI#r^[-և_GuȟyD4TQ27;(,AɉLH3x0 XviUCL{@i\uRlOu⪫=ƌ%LmNJKybw<[%Uw |ĝWX/[&-8$~M?4tPSj-l=fMDCb[~wҶk+2'2B'ۘM^cU\xq# h=A-a:'JZ=SF8hD8%`ӥSGyf4G $S?Yj>3o f}4[[96sodL&y=Sp2uy/f Z"rE"̳,+{^S໑v+_2R4a!zJqbGq?TU=A K-f1R`TK@,DI XL /.55,y22חvҷ 64 ޖ裙Si%EJ5:){xyߡބ,b(w ꜨFU\c[QIPFn42eݐ$ʅ[Q656pU]M4ۓi҇RpkC*'D<7&#X(O$VpAs][|^\`7ON[O>aLP`U]M栒|7g!4#G!,XM*k5GY'yiT|Ɲ,5YFh0c.>}[y;:ߎeEY-*q+7wFGi1U_˞]#9nϢ\s#?5VXݫ6|tSIR#"dqt=3^zBm,yXBV#,J#TbBg (f¡p"_(gFZn"(5um4hCW|6QiV]! a=I aKrӹPIy"Փ $#XaBܰk~/[|= ޾b+O'=G|}чf>| Y-fa a@ykw5sE<" `v'zMC2U3 + OX[-F`g4).>Izx_늵9_՚s<Ev4fbݝ;&/e qD%@^d&"aWienz>&Ƙq9u3k_صd8u8?2·8b/Rڻ'+o(~)x #./1b#Rnl >uܲ+& n>=[F]+-"t2[5Y:*(_`q/L;o)~~i#d5~j('3ɭ_mϩ c^^) &8YHR pV?SO^gRU=nJ|^[ 2)G@.F4c(ڱ|RԲ]A5&rhʂ@~@i_*?6b,2Lo Jʚc%ڥN/4Wˠ (nzѦ$&X*覽S /Z;MqeUv ^v#]֏=Q*Ҝݲif!xjW)xV)sOHU*%fA҉$yT$e`]mnS$v .վĨPE}\8R49dyaukvON׵նڊmvCoimnXJJ,'Wo;ZWXvEo+.J d s%^0Z:KT"EBPIƺ 1ݱOCJ:y Y) Pc +wDZ`I>FM7) F̨ig``Zi)3BLW۽bs~a(q ~V^a`_o~ʤAC ONRP ׉C7#Gvv:t$sF>UKW)PJh|>N9'éGz h"kIg{Xs1xŖH##7ޠ{.џ̣_'na)msZVLHgh"mJtXO,ifJ^xPF qWTaJ.veY}Yұ >uo9zp뭁DeTe5;$Ê={s-Eݧؘ^hcRxJ9fu Y-' A@yi56D $&rmcZHGiUxf,cEG9g^X}::vz%kƗYw7Ǵ'KȓU?"ɑ~E+Hqey{z>]`y; az|Za*j VIGM(AE}eao#MhTvo Ιj L{ݹ=/M[*녭44|ݰ)t-{ޓTy: Yuc"eV@2 tFI鬺";!N] T*`Y*U/oZG2?^[9X@A2+<D^:h0φ8;Uô`:,ꗁ"DC{ζwRzӖ}/?4g*? n?oA;/b;MɟzLA=\垑§p>/\b,c+a.v8;'kH.t& §~qc4'У*[!wKB[vJMq@𜐅ɩĜ);s3:g4''޶|P"Pv%ݭSs?2dO"WZd8ή'5EE>,iXAŴLFVk(admnhj@;VA5.-ˬ9Jݴ]P"OPg{y嶵Kg?qd=alՒlQF ,m xc +zE2$p`I2d++fD%`6b.&n}۞{ٙc?v jz!YlS)E 4:Jffу;YF0dEnXR/prjw! O~Ud3hT@Z-!_i2hy:xbY>?f1uærjkxMik~׌۷mrM#P8ɋ쎃P/QAh$8"',n ̛G|~/Swަo+lQFn&RNL*-,O6;&tW_wK'Y޲/WJzYšm]][zzsZ,g^Gak:ZRhڹ"= 'X(b]ˉJ>' ~YkN]9gHnԶ$OccMR3Rku7[Ayg6ؘwAԞ1iz=_oqw7:©/լ(7=gξ4^ 3_VX##ce=al\dT!T?XO"[n&įd$f2ԋ7D2Q.([ o dԄ " (:X "\`.J*!fN @y,s8"<d:[aV2].1/>lyX$\wV4y&~+\/ Y`[Le F*iU(wWhKlf>sZϊ/,KyNY|O횻gI3c?Òݷ͟PröC}ϝߦ=8SAvA/:B%Phq`I)R(XBx)X';QJg)Aqύ@Sa$I2D0LеMКpcg4㶱mi;;'^m 47hMjр;׭۾}ݺ Q٪OHp25]^aI+jaOŅVEƶƠTjb}i02v?se-?w:s5'~4owG*(Y2BơkYlViY e- s(7 R^][@ 0Śȝ{#]7̮[\w]Һmjn;=޷tiΨ7M*v|4!cG.ҋߧ-{ߧ}J,q>e.&"}+<-{Ρ^lNOMt"CNWSas󠵕.{^G"Y qwprDsD܊UbI4HT<y1X$I ť@(=yO{.Ңomӣ}eNg.qj.C`Su6tU9vm9ML Pom}pSxbz[7ϯ3& .{ce%LEȗ1-ϕhQdՕLY+jP\EruM ֓ڤ½k6lVDnٲy6}r\t{ᒞdݼEJ"ѨdoN=Ɏ^Io|_:}7yVfiMN@~Z,(V YIôu։ps}ܞK/;Eۙ+/&+x ː9y;~:Sea?ywa[A^?M jwXM==XĮPn ݣ@Wf+2c治P'@2 iB<3: 쳙~Uedz_kxri+{=`99xO;wҚ}zGIEc$ۄo*g9KR=xFR +FA y6-Y(|KEBw]OHS}i*U,cJPGq}+"]xF{4$+,N}@_$aښNN_s?uoJj{4Ci ቗kY޾\W+[|…̏((Y3;26~r_6t' @ku=4(l'TEYUP-F(I(Ԣ]G*TQ"@_68Sۖ^<1m΋z>FGpރrS"QoxAC2m4ܴr˭%TY[}}eu,Z3ppMw *w^@cA ( jA|+Pj)L7P0_9қb4ؽE^4iB+Bs ,w9sͭT 6^|ypVذ+[ f̽lזVxha͂:d" Gl * tfOܹ-!7|wY@5`q&)[޹*2#ﰃY*BJT,J Fjȫ6J39[ʥ*=<{U?l]W }0(ǤS[NV@cYje8ɧ遙33yY6~U#x>&7kp^C r{~cJssP@:џ[1:ǜ㣬Cdr$9}sOYA|G@tCpn?94@;a~:J$^z,-ܮ[l>dM \#[PX<)dwp?T3a:=tia%tvJv-JoeЊ;׾s欥Kv 51ʓ~HVˑ;U~JHǍ7ȲgQCie"TqWTLӝCk:>}@-C ,ۀ16ĎW#βfNI[;v6:i~iFM4]I{憗{y_ ׏{<h*?jv0i&F97NmxwM WѬxe㓏E*=e.fqf)}2~K-i+#jfsȵYUZhw0?NdL BQV4YjWׅۀCQq? <~*Z{n* l( /ʀ]{[ g=tG c?˱D<^UV^3Fe0_ZA,9+Q C,@?;؋05{d#r)~ ҄]7l'QN/ݎlݺN5u !Vg|S؞{ yY\;gGF6\\a/#6Wlɺ35 iأ|[+aoiB񮱄p]%;->j΄-,Z0cMցSS(޳p7,dqb7i7I3k+~o(KXVΨ-'/77Y<.uXEsų`|ߚG2ytW?OrOw%O111Ncq |"7q{+ 4?%۝.<`R-:23)? a;` qg +0pnsv-&˼p2˿xs2aEbۧH2vEq#|hsMɏ_HPHq97G 8Ά9㱅e7R ؼnJuxc*&qMy# &ǕG9.&d x%@9NCNC#p6M.#*0Ld67YBuߞlP.b-X shRM4Sl~kO\bα/Zw?I қZ+.l~~M콐́q2|r#6w `pZp_=rǏd:gUQ%u 3"go@!&r"O`º¾P(JIJ3KY-^윝f sEMMh*BiC{ 8.Fc wHϑi3>E=Nݧ F{|'f<4!x۬JS D!3L(Ȁt *N:Ҕ2- O5PQdT!h44U`Na3MnZnP0#k9>!`B-=M[߯a& b,vnΦ3Xx3|G`~oVRrpd ~8/?Pʀ Y#"P .ek_ &6810aζZnxp}xKKssKKK$"_J)W*JV7ջ .PO 9Ȟͩw%;%TtL/-Jul*]ݢh{vf4m`^J f(KJu T23QcZPRD‡H}Q4)`; |<^4}?e(|sp 8 (|gplA?"S!$S”> Dp*1<ſ/N>>"/ӉN.M[޲ xg}]\Vv.SmI pwu՗Xf|qLeshm¡ȇBivo:=V~UcݓМ8" f%q|b(@>OBHC3^ #߇s7v*EB%.였) {&suQo?$aԴ#W~ O&lS[dw! y_A1ʲdtp69+EiYl?Q D>/$|{ecUpy HD}b,y~¥P:B-+`䋥Й9 d,Xԭ*׎M }a٧C铫7ּ+ މ-G^M(eGWo P|RM҄G*#(8o/KªW^$P(vRT1b6GaRd6r('(dmq'gNmA-dr3c%_,5@f!萜AD;>w-Z-Z֜S񂃻?=4P#ÈC3v4wT՝QM{իG kW};Oq]XgaT>3'.(Z+OpIoEiV67n|.9MNvI2рL#޸l3;b.c!i7hi|% jGntͣ;']^B?:Q th{{9:FNG1G_WaxLdma:BZF8P8BB[m+G>:8@}|*x1Zș33~[*DūĞN՘Fa{&:)fPO\`@hMzS?wjkj/8&_W@ezTeh)r0xL$7%snf}CH(]$MexpyR\U7O2Q2NϮ92t"=UH9W)A2w4+lL FdU)'ӘZS u Gc*wÍVCFy܆=q\/Ԓq5<B7 -O uP{~x<}8}P 2Ǟ6n?>Pa-}HҘ?$շx9]_c1{d;grH O`܇ߋ`v/{Ga$]@G6y# +B$57LJ> 366}: 3 N-j"qvL]>wٳE]$>"DA݅ 5$mK}3l:=]o ]T;B 7)T C?'+~ ۋ;x4d^}뎱[bǦ. Q;њUe!P |b aCW1ﺪEdNfzO:zsvG:>GBH6mѢ/x(yx!ùаw;fA~^c1en~T711s###GclhmP[ Sw&66llkXS-н6,f;'YJ4UfdRH Cs3YQ^V,&fRrqɀeh I͝K\0+ݬhn.+to1yʼTPbay^#kP a\%hѢmFIeyJ1@i7` uvG 55M= >ʰ {_Οw#5eW2d |^.!#MO($b0EdUZn IΒ7ވX_Ă-\$C/mav7T^Ϥc^|$03]]ARk+"U@\:>qJ%"P4EcϦAu079TW\44&_v#7\]ZsdXt6'fCW@oPv#<"[5:#Yo8!JnbcXYYDB 2(pH거&V=`(ΩNxƍ oЉ[/SYj.Y#N6zsrs} na]/M$-^Хu^o JPWڟ 8'FM"!+i[}E+?p]sX=n{a"0ch[uYͩAP}ybJD7!}!0c`a5caӢdӢ4EOYpɤ닸+B_W/[(Xb [)\6 jfʔ+2ڀ:49ɐi k:T6ohc0cv J_kşSҢMT.J82u>^#gNs w6G$˄^њiKwO=BgsO0o LRn6̒2=7G8g(E‚*3= ,^S^hV{1-C,.~,Єݨׄ#4I,\.3dg^8aHJmO_aNcsy)o]B\Q^TN[{لֳ&45k,dWUV%%=qy)u+1>FeIA)șF(MZ0,kv61?[lsПxRt'lIQ$+۲t,4a~m4 /S$Fcbk$3k$>;`ȭø|]|;X1Ȗ/9'^Y|>Yײ=L ;xuCCuucG n((Z)z_œPy|\)*%d;]7Soe,7 1h n|ԛL)/NwkvW/×KLq Ԣw_DboW(6橱c+p6l`~[_T, !Ks qGr,uh?zHj IgPA|@S,;gQy,ZBYM\zkgQ=F\e#̫ ѡŝkƭ&7w,ޓط;qf[Ⱶ8MGӯ +axϹl̻1g&rx>ǥ{ںQipȥpo@ZN1 n&% 7SҞz<(@B4``/ C14)x |`IM.M]6OKs3p\gwa5p/ !p+v`Dۋڃ8>r=sg$Z1[] L`<};sZ=oBu 15anw3@8`6puӕ@~,>,a^%f-OIk,Nzl6f@uJש䰴P7e=u CLAx̊38">2 :^c7j|+`77T"6L`1&_5.90e硾o"(/yʎ2nt8\Yr0/8\Oc P+{j89ݼlxs찺 %%zZ#./]mlH*ŔU1/R!Z;mFx ^D !9gcab155]Jp]zg$Ѹt&crZ6g2Wf|-b&}dzA"bd)}[Q;aw;`ӗVJ?:ks\8/-x\.]ǝ>zamKqy9gk60o.7=9>H_vl9?l2̬vW9{ONlZj5]ۗu'\U2|QcD-C\F! ~?,t %V^iQ^@t{F%/q.[`;\S5XX J~aL [KnK*iuuuuե~Bz)Ԗu)|_hCS{MعO;c'_*;T[{v~_^Xxd6AXq5]ʔV7[޷zmw}F%YH_yTU1NU7 k$a4e0$G0 fUIv&vxoy&?(Tar0dtZO(}D60f6c4 JGU=0Rc_<Ì:w]#T!Uګ acxkP5gz ]=]сB/WuM:ym* zeb;p +  V@hXuN5VN XedpgG_Zw;Itq'YqFymoٿqfK{`-і}sk'<#fd4DV81xglߊy >Juh yҨQf",7mp>~K^L>#<&=s;s*t_Ŝ[33(MOM9 6̟0ApM#8/3q~ټgK^p淝lX$>+3Jf]"jqkygҁ2` ΋l?]ӳ-r/͛7>2) !H%M9ognw[[: Yo c4o9O7at1 wN}ڐwyp\ȌSзRG dWOdӤK<1ٕuW:jő;O- o;vPyr~CmMCck*-u+JU{|.x=>o'Ŧ )n'<7pg8ߪM3c(;ZlݚH=;8{N1l3y O|&8 gýX%P.mgQH#<(A$Ҕa <@}q6tqS+N4 ۝e5{n6'aNlAu !$L$CaH:EIr(uDN$patbXI$(Zf;OnKɣ ^p\,ZW p)΅Fag( 4Jg\w=1 7'9bs+'PJyo ؄O`0g\8#G1qIy ض$\pRSINI7D6WMs^@} =)HAMS8mēEJ=EHX"Ɣ5qQڲ[!#gB"B`dKjĮIXr8#XCKt1޻).>b?}qį)^SлޱpV#=pC#V C9( @pK T"CD0ݜHƵ`m`h4yM ktff!}G 7""[ ,Fn #8ЭL CyS=pP S_Om5ŹQ'IQ*ke2eX^tp`/,>^K5!xz_>pQN,)Is]P'PܳbKUUTj[X].r4TjXh-kCZ`wz)!)mwѮLmBN5;BGNb!(xڵNAƿm˟+F -5H %$ƫMdwZ'0>773{vYO`!j85 Togq'ubx[O8pLe^$a+콮]|6b[K3xh4#Fж9S*ֺ#[,I;{;aEЕsmqAE셮/Ek~0+bsȉ8QԗB"qv{o8>cmM&*jx}e`ﹱefk,,r$MZ;nRYJdqm+۝&~;;s%eD`bC5TK XzjFjq4&DDiZViZVi Z֢iZ֣iڐ6iڔ6i ڒi+jYdCajE)F[6-mG#)AmNI)4:iMͤY3B]Mv9ͥy;A{^4ХtN%A'бt>]M16Jt<Et L?/t ]OOӓtRN>z\zh=GW^%2#Lӫ7M )Khr@ D*bi -aڗ. :1uGo/01a"&a2"VXb55&u.b#lM)6[[ZhEQİ5؎>O=v#6#LTtbcD7c',]ЅnFv?/>솹ݱ^B/胋ȠY,"^ sʨ`1X}8`Cq8Ghcq7#zޥCz> 8'dBTqY8\q.ER\qUZ\qnMV܆q]^܇CxQ<SxY,sx/E ^kxoM{xC| >g_K| w?G ~/w?wp r<븞x <'d^Wxe^Wxu^;1nzk zxm^x}ހ7xcބ7xsނfފ~6;V:#oo;q;'~SJ:Ny ONy3y̻pwl]ysy{9Ž>vygq8}%.s/a^~?A|0‡a|8GQ|4q|<'I|2§i|:gY|6y|>_E|1_—e|9_WU|5_u|=7M|3·m|;w]|7}|??C0?c8?OS4?2~E~_WU~_7M~w]~/Xg[ָhEc@*],)xo]RJBwSZb2 .iHW}}[_J|>=j锟OK?U& 0d5;jI醫5]% SNeNMʌ)@J4L5W}T t>7U씑de$z$Y=uVم ªonjfҕ)ia-WOINI o59/0S3yL>4,`;&όq,oA;KiV%I+TT0@CQCCCQKnURm\FZv`n\0_v=z*zzd,KKEImO1VU1`qEn9F ?UGTI~]Zj\mhXU4"EmZmQɗKJyGHT;`i!%usn-eKuC#N炧큹jѧјh\4UVKETYUTD/*!QE%_TE%_TE%_4VS5JK2!5j_X!}xZI%avEW|aAvo,y¼ub0sUb_a(ZE#QQ=%>x-E4$jڢhXt]D4*:ItNڐV>=#21Y,YD,"KEmIQű[Ö-dS>I(^GkU?v;UٜʕǫvoyϫPmK%F[u`: }Rou7|[zW|j@)+*2>7fh3T=i**o ᣆOVe>avÛ;6X mu cN}ǛPV=`~aj־Suʩ?u3>}3K^~4Tmx=E;'JҨH)GCIm+@+a ,j,ܜ^^$mr'Gyw>K7%eG_c=SfzB/YZFowbx{P9.b3ӎ5ƘX&ҙt2Nq:×%1> p}:T FiyRm͐VSpB 0I Ă  s)(o[V ָ(vme\#5,KV\<@k/A{mMߒ/Qv﹣ކvh Zrg!Z+7ope68ݼ= J䠒B[Z6p(4qhGk>i ;U4%d^uqB 7ҕt(dJNV%3>(*zh&hNpa.0\+p# YyX%XwiqzEk#V]*[ffLq`lql#WwI΀*uts 6Dk]'t;` ٟ9Y99{rrM(:M{9Ct^#tzzi/i>V:@ ivзQŕXG}Hu@6&L[R3mZCߡ]F!.ѳgzj e2)ijq\OZlFMSoi|[Dd2ZN+[TKI/le{j|_쿃2`Mt@h2LبV]>",W9Zi8|1 _Y엵>_SrjU#gv^׭L ʃrˣum/nԾUV+9fAC9Z`LJlϲv兗@ SU[-ѫ Չ #5/۰Ion&q?Y}Ҙ5$F~˚V{[kSTֻ#=b7c`B*uQ +>˙Q"py#ţ/Sf2yf]=wL=Wv G׽|C[>DlY+kyG=->ޱryI)8sdc6/Vs?i~%z 9z= ~z>k}o^v fN`#G#ݳf;u{0ݾ=G;ߙ#܄LDZV{sHݎ՛cޜ|=H8r~f\*Ojwv((BÖgnsû\JjK[G!C{9!xU#b2)r)~c~ :Cxf Etu 52,#3ʨ1Fh3:.cǍ1h aqŸj\2feyfYbV5fh6mfE S̚{ɭppppBs1;YitT3-.apppppp5.7YitD3^NappUUE\df5+y}h {/aΨn5aͼ5; W W2rL/k59V8V8I8IPPBMgVZ3h晭bo{ ˅˙95ߔL/i8!Ğ ||22yϚoJkC9j{;Gx2i}:D/Xp5qvO8X?Q8vWkF^k.q)wO@]c7Em{7빇ytk1,z?ӓzfzJso =K<;/K2BUz^7(V[(~LE{E?~ʦ\rA*b:D:LTEGh8Nvܞ;rg>rwɽ>o'_yKrW|~#< O<<GyOY8?'/94~yw?/_ͼ6;8wn8pq1ƸŢ1[!݅| Q,&qdk 622?F?ʨ)QoD^}$fxؘbފɌv%ؔScώ}$ة_v@f z|w$ Qol۶0ΈwFUq7?n1[63/_7\08ax%w}ⳉ%~'&~1vڝwYh5HrGK9V9O7H6݄k *q|)Tb&GɠuWɠn I%?H5Poe3R'iKT)Iɤ.xCP%R`Lb16f:[ʍ9x@d-u]W\o|OHj1z|YhNx{.%)1}y6o]ݍ<"ntsRx{FlVVmvV"A (Gl(TH!]i t!Ys2΢I1([55K-ȳDS.  T@lPN1QGE5P"J1H_H_-㏤LBl bˀiB.V.պ8aG^ {М0ResQVV6yf%PM}G]@KJ@i(-?rAic-| XXv i~+ NC q"CE-\x4fP$X@'(l䞏܋۩-C.r(NaN/rH H0v4B rk-^/F.ˀW,_r X,ˏi2d 0[:A֠N+5 Л?/PVoҀڣ)|~d#Pm-L=~ |u Y^uS< t@'Q8hrA/)>#px@r*.GɕsЧs)- :FqWtE F]]!T[@__vFL)b vF2,@P b 4+p|˨;pA ]^p5Zu(L7"Q@@<  ;Y| ]xPȰ7љ5p,].Kt1z%qT5J().S2,ǀO>,CRd-ޭlllF[[q ؉:@=e%dJpJ 8 p T@$_#p%zJJ'g@ и3g2݃ޒ4zw$>pErϩ'4mOg{ mR 4!ʫiyQ)ǬuF\h~]0ǃ9^ ]gP³y"XlGv@oj^QG ĩ܋c8,.F) CJH2nEVMa=D.;\ґvOQuF=w_P, 3r&Y` Dv/rNazR2@,ɬS'BbvxxGGG$R{ʎ;H@i=(W V9ҊPGvH,ޗ %_TPC&@oDv!m:uUt ^1=JZws3JlgXx*E1p^!6ֶUѺm\$Riln-ڶ|2l 3x(@wExuEu|tl{eA%.ݠzG=9Nf x#74nڇ]Hh}I7y˼*hrÛT~"g{|/*_Eϯ>^ʟJSy 7#w#3yﱼ|>e\ϐF/cqq1ָոǸ1͘m1ˌ/d̾Qyo{<>R*ڵRռ9Rb)A@&[o Z<~k,\\W}&ϵ\eRx$XIe߄1s%Cr2bZ (R5"w i%K5%[%Ov#oyFka F z_›J'.E)_)?7 ̧[5@ujIsSv7r3t x_:,rDS-s-tn9m8ȮFʩ$ZP} lA8Cڷ9WgǟuLPk{jVq󮰦o#?7/T/-FlNV~mF j#,m*<_uS6 fn4qn@}v-޾OzR߻^|'\\q'EѯPmj| < [}VHD)G[JZ2IjVv =u[ߜ\+1h,k.]WQ~xs4!U-=Y2Wk̇6߁RIWQ#Nob%C Ԭ\)D9iR 9( g|ʫT)!Kkl_s>Ov=ʹZ˭QhՆ *,}G@}E>P3fFTWJM"e5HuӴ\œUFtM,dEVwvꗶ \]1#٫sO٣dJ^67Ԧjml.ko FIқ~6]پ|ZWVJH*,R-]㠷rm }Bmy޺%egU;n?ȣFY{f}(B>ۃdkK2J< Jg!Ri1`E0,wY|{n!xǷZKY]LJ/h 7dPKz7=[aY 1aF f? H٨~ ^@Nm{D/wAlTkn5ӥ9?L]>}m-V_NȯPОD~~Lw7̑RP;0k|z5omuLoQ.UH&njxՖP^ -SY=-٫Gάч22o=>rqeڟ(89QP<4ڧa֚h79"Ӻȿmhjq,BSkrlA?M9iteitk$WBThͲ*^x~?צyZ S֨&vB_q#!hC;Z-yClZֲI ߡu[-yk#Hـ]Ld,H]\|㼑>=N7b;MS/ݾ__X|m]nWmE'_v+XU~z\y8 cnqVmnN=z| ?"m]#|VyqbEO}:PQeM$;e}7⨛w%Dw,3/A^kCNR[ccdg=7µH.A_SslM^l") 9wzd-Y>L}9X^ixcy~Yz}TXt+m̝lN3gꠑY5\ +ME9?Zy6۰ݫ rt<UPY7+}Yp͂Fܚ:Ƙ 띛5SlJiB- x6K*λ%KL0SyK"nRR+i֥C",!.hy_Wc {=cK͹j~F_9ݭmGـi;ӭ֎"f@H-|>[9pD6mNOY[ղ~5wrj\po`ϥ{o p.ZT ]cQ~6[\ߞ%׫&~!ש}n[r;sΣkysN~U_V }m}/+v}/5 6ޱ2ʹ0~mZ%S6;9N_}$O^LX#+R)`[뎘jEuPQf4M׆8#3,Ԡ'{4CO=A=\_J 8j>Yo ] I~ uN}ЋS@>ҞRyz/dt;!]dĝMlEc5rr{S&[}js\+<VS!:i8:G=mx:ZKZ㕽OR>/9I܋܏F"\B?O򭼌Wyo d.̔<&7Ē<6`d`a`҅U] դ'ח%חPKwL\ ]Blimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Bold.woff2nu[wOF2P?FFTML`^d  HV 6$0 ' [\ˑՎv*1?Y#vPWUm*;CWM21Jmvۄb.NBHF6mR\<܂IR h󲎗EusUvh`7٧8zs x:R*L-gtwI65g')i.uttEěʆC8;<3bOrPY=N=aXrWIJR۬_<Tgog$^x?BY MY[ Y]MmuH$pHmؤS C7d*+ hV] 16)T/n]J}ѾĴPcbwKwfY2bo&Tg\M @50)S+eS`i{{;oSDHkkMH"`8@ kIOϕV: Jw@oӣ|+wL٢w ҁ8C2q+A egIo1_&ʌi%矤>LZN,nR>{+߈?=?%[D2uUVIa,Z羟ϦޭZi)iio030/yd̝r2OZ@, +]yj+378ev Nf.&~VIU-- &H Xj`i0qC]1Yl1n9}:o|[npO$ ݓ+%'35X{B F͉Z qx<+NS5S(]wF=66Oo(8B{  E*  ACN|_aDy*0@9cm55˨XE &:8 ucpwB 3v~zܹ2B#T 6m(_k :7Kk-!|~lY¬Յ9뭙Ykґlr ^W T'%Bo(IҤː)K+> qPb%J)WaGwigweW]wmwcO=ko_kzC.jNfqxd F\DbB>nGX /JmRFl>jzTLToCE&7( !Y3%f1D<!Y703ʂ˺gFt$F*jI֑mvN-r=.;gk#3 da,um9e7$!.m^p؆)Nmv ]aL+l~eU]?0f*JDh2]B~Wxmx}ےxo>\|3W2R2~}+k`QgoNvDY~%p[+_8j gO_@pɱܯB0hgq<6ԟؒ>`_Yu. ; sⓠ30;[^?V Z1k-6'13d:@!<0J֕.2Kg`"61_C&ޝt-! Oz I "iuZ !=[yd (}Kpz cq$ ~I!O?;)mae;&*%dP̄0W5tc9&E9lrLW_3)^\6r1쬫Ja6 @|׍]@Rc L UB9i76wݨu^w=. iV JeM=nͤqC {c:SuaY,܆K3f2xUjqT)PGܳ&Ecas5msw>A$lP#<܈%u2^ l9'ޫ0'XnRŶ(M[8ؓbu}in@=r鍱]|Ep̊(08$_l\~!+VhL,IAô ^v0Vx,hjtg|H F6ÁhIl%I;x`8MِJQ$H|@91 "[ Dfrrqxx a\/npC*0j&KN-d!I"AWD4&[ZVQIK[Dޞ2׫Nw0B?F7n]?)VM>8JQu(~k aZ|xNfW"% lRt_a`XOEtQjYۋ ,!ETǾ4,RSW @*6zW^;j4$ G#ח1Gc? 'psV*fW - 3}o6TϹN%B GD걎]DX(?xkt#CO jgxG#uH8z"J'xMux꿾l:78Jf<^yͻ+μ's56yzeVy"e[02{.zoy:7ӈS0-V{)[ ׂ2q'9"}^Kuon-ǡ&t:j19\e8 jv{K-W4)lw %хha⽈q B*M4jS'! +s`uX{`bh'0P_#rQUCS5i!Pl0(Fڣ `\ (i9a$RFa dcՉ#RFb:H*tQn sl>\B#;p¼No_A=h;$LSPmT}(Ȱ7{Ԅ$ m4h( a7IVQ1%!{{L8AQo\R <."tN[m>Yir2 ԁn"֯%rHXcʃIĖ9.ODddxe0 3`X 0=Pa|,hyz"62D.l`0 n%^*G )cQ2FA`Ud &k2:;<%v'wz2Z@LqTϖ!>ھMO[!NI.} S'C8/6~| pVܳL'Pmzǿ))Í[0oA UNIf-Iڐh<ALojZhd\l& 0pO#,IÍ3CIWb[P )?MYJ=SA 8e<~˔C9|]E :mzDf;TtNw҇ڋSyMVJUz }֓=5Uk[f(X3t:lS>CINd%eqjE:d#^V=l;vkr̦īz qlT \هp&o5f4c1ܰUAW8&-VI=dJ4F  Jd85'gzö?%/l"{phBc:uDآ!Y3?OTF$L7D?Fdr&4L>O/v*ghI+@}N4(<,X9& lK/cw]"ݏehJxE|M"ƌZtL$:^ZEum9{D|E J.֜/鲤m6\^E&WL{jV0Ii)dcq+K! 랻ϹF˴,N\6(DCũ^$ Ƌ, 9dѢl;I@ 4:m.8+:5'O6 @Oi ʾgcK?l|F2 ZVzdASe8 &jL/R_{,T*lE 4]Λ-1qz#N/Ħ rRgamdr b㳫\E >|E͕'eܠb2CUH|t=Sj#֪ ˕SmA Ccw*(OW]~<@x9mr ղf)2Ot,_G0bନtHʹRlڴ$~"ʼnl: B-Rg8o\lx"{W⢒ҾQڀ%naB综ψjΫ4uoZ8 V;]UO@Ȉ@嫮BZYȠE(Ovb|Jv}PpoO_Gba+E-0 yK rCaLڣXC (pYIӨ@g& ꅯu& u?2>x=^V`3ƭpG^Ũͣ\3khA(cF1 Hع4AC˨] -{kp!f!Bm!6Ql# T7>A 4,KJtnonPekBld}./jDm_ւ;[R訶g'YYx e/k /6[9jf@ØFLT1j_:0TՑN,&u!8j9i[fG2e;Rl+0#2R[leRne|r̯D۳yxg$I>'̎6;[]-HZy>,$Ot' 7!H~Y?̏mg!t<Əvj oH <Սvfy x{=S:~}G?K9]PDQ1d hXN^7/', kQk7+=Ei=OՓb<|̛2'xeS|x 9I|"gFF]G=EE#Yh#ڎC@ah|MZٹ3n L~miСڠչz&bJ\v W]aP,O>FֹTr*5jRVSѷ1 Y]@jV̞Gļy}6P ;NlJ_2V^WuTZYUTj.Y͵QgMvc^>Wd''Ӝ8S'$-pL̵fLH-|P!e"Nlh׃ЈjxIl 776bzQܬ<.J,:=!jiEEwUDbʪ5W"%˅Uf2B f`Q[Yr+\b(pgSC(b I636!ApoY{{W/id7{}c~~,B -/bqpH.ׯKI[Ce^Pw ᇐn"3]T_=C)댮Xek\ s! c}u'&ÖAW0 ̦w3z" \]:VDbDUx'qdaY-Qg>XaBx}JVQ7Q\< f_R?KGFY \?zh0/`J!M;A.'lJg58z4(9!/głc,3eof,Țo?.O=M @D"ME@0$n;FD7042~ݹLSjAuwؾ'#w*:MoCygocD$$G30,'HT AdХ JORQМ5{Τƺ^`DFBU [a"3 U,\j TЪ  GuyzZ@^{5(yEj%IiӈЋ"=AXB8<|ET8.lޢHWqP(L&  OQ8шܺ!E:[1,ygoKgH3DT}9Zlݫ_ʵ:´_ 䂗~ǖ2\~ \r\{\3ύwO|<{8?Wct[v"`0>ץ.#:2F..ft#(Y܍;q?譞6׸ҥ_}l&,*UL#٠BL sγ\0lTDl`Z4̚_w,)֤TrGu=KqmwuRYq0M}! _iLZ}u 9Ga\Uѿ]'&.!)%-#߀A9y6Vל~2c[iO愧? 9<ɐeBIըS!d4kբMNݺkȠa#+7^T (gwʌm ԧ"hbMp9˟L :yGq"ˑG'bБBE# e$ *Bf#BOR>vԒZ"ԸFs Ŕ,hG=N&Z }" ݨ0Q?C Txv!1n2BGi"Ix1Sa)yTŚVNn;w^J}X.%C{fZ5wټ ;k85o |KRRdC Jpa54 m%g27\f%ju {OIïCrРKN\]+&6 չZсG0uU=\:Z&[o u:M;h &/80^B9D HSZ"E!,+"W`CdMq\/B"7M"!rWq!$,(8mi pN~)nn“u.}|Qtm6AMNު^?SޙҹcNT}J}iۚ@Y{})3'cWV#r sZ'r"u{2D,fq mNTQ.Ƅ++GfޥRP!v-ʰ^vWb*놔25l"eG[jM|a P^FXOC OՋxXc `lg%`@T޽V6qE\|r̫E}֤gz_5 |JB\)5?h) X<3 d`HJ3a:0 (Bԍlq+Mn@kYRץ)7} 1k@hbe϶&B ,@N [uQ0`#h&ge&":GIUM%-ׄjɘj=h)fVm*9yB#B:Z4*X|ڽih!OiU d9%}L5E4]P>4+w~kJ)~u7dYu2dADM6#g,r~ks>WZD0-.ĚUopX;KِZ[4JTS6vaPPJmj~isK3heِcڂ.$Ei"~ڛX ʱ: I]%/K Pk4l o(o/)D.۠Cry`dͯJo iSJǫ]^4bA)@g'Oƻ RAvP\s\]Z0HB`}>",Er "*%# qQzo+(f6ak0[Ru9#~1ش7nRtvS+G>&j~M>U.qֽ1  UKN7;t#G<w]?\gI[u!7SygC5=N!>Rx쵽f󢩫>/gK%6;S ;/`[УΓ{a|w-]=\MhÝ1wn+|S0YӺz-,uuPɆ=9#IWp>uM{MXs* AprJW8 V},5j/mA4t|_<,1'~#(ͫl};?<҅Dljq'['%ry_3GDzj [YDwh͗xm-8Bh ԜA_4V{Z/@_^{S3Z5nW1]EX%6lI%z`V{E4 H#[5bYku4{Q„T&2NYFYJ9v.5rbG\иLSQRښYSK(!o`D߂_"_>qٚr1J4>!@GvV*#Cm ͹؎$7"P0#Y3u70QOv+,4SE BQ5w}5aIH Xjb syB7H t_y"ZOldX^so 2ų֫02 %G!`ɘ٫iKzLZwź6G1m6D &ʴ8*N<0݂Ը42gh&V5|=_#aEL#I]{ WՌ)@Ў@ Ř); _p1^0+j !zY>ce3аCsx,*~xud -4UvpjN 5t@K<! 56I IHVs;3 4Ba|H#_h@}i*T̊a@R !r}20O|)}Bwv+:yU/@_FTj¢{)]?#O R&}u!&; N 4VglW!3U1I}7|v5j:BJG4^N&T|YvY|N3ixyT+GQ)4!qXt,s@Y[?|߰Ԙ5OP%cZ9ͫ|E-l ز*b 3ڦ<>dgpc}.W)$h KhyJ u?a~e 9dj!Y[@a j}q-+xDΏk)=d12 c PpÑxHJC9- ,=U`aTL@o6P^%GnW](g*6qez49@7UKXtc{wy͒QuZg 4 [.Uecm0z4Q`i/']}oMxKof]O/'B}N^Gf᫑41> w8%7ԫq:TtWrMc¬ߛT'pTuABl} P,뀐[Нs:OLmHX~`tr6죥`ml=4Xg\HB`MC~Y7vJh,ҹ$Oʌ %|^݂Aub1G1ʼnVС PK; 8|[) HIegǍd7Ix Os,^Ty2$?WZϿʿkΎ%H5f1,]%J~'3D` k%|~ FP.nP;!m7Iz;f" &,38Eu₷JNX fݽAv,Uv.z(hrʀc)3 lؗw\ښnUx* ˯z%WGzU2*T$'KƲ\f.ä<99ݨ]u3npOssSS~OaM#k{kM{WϠ%s3~L =7 im1 % XU;گkt&GaF.OFdq_EcF }N ,%b7X ]~.OBqXD3X/)'AJLѿLxQP#e%fkTbUT EMSJ7 ?I",IE6mn3$fIʂhZ@Ͽ\Di]jD&EQX$ZU)[)XS`ZU" +1OV("s(M1(d^@@s0JqMN)ˁnk88}=ۗ-9mT@bH[{gD+Գg0 ]S~摖}򼢜͉p"с΢@tffrЧ ^ ݮ=vu^nǵ=w[:#`#^=E~R[w0?P9ĥsד;1T7֑[>\۳rP6E*h;UBpPXFc铴H #+~2R5>=ZGK)!0T>:]II24a&yfDYz.+gpyt< ݲpYaHVp$X?De}ps:Bpbu㛃^CÚm#W ~]>yτD.bK ~@ugImrK#àƦhSaY bK@(M+d%;'cI<  ?FE %Ll>^`96W)旣DSyPĥX$t,lnHܼ{a"ڤ5Y~I4CM: z~&%2LW4 Z elRCV)q&u:3_URl& ~ MEe"pn7!뎽=(X,ϘFS+]cp 2[*1Bl-TX*<]fʦrkf10Ej㪒 '_2}:_s~R"fpq80s㣇8҉IgN,nM]8:pe|FߥQ:/C]* 'Xͫ-,̳i ^v^kCmEO8 6rgeks|Ko#\е15{tl}?2$tˇYI?-#BSgű Ɋi S(, kG`fchϬ/?4V/L t̘0pg)dqfj霙vNlRIv~wݖ7 ҅g&/x!hnpelg Gsr3Fx."fU$uvz8ies8<n>cG>X tQсB"WnwnX; ꓪ0"$YuHx 6 dX58Ʀd ^ś?mQ$xW诿s0x! fȂSr`X&xvWG38R/DoN\i@k b᝴=r >.`&p=.J9J&a#0cz|@ GG>gIdNV&KOm DX,h SL)+S}D/duB FVY| ht4VĮ_gQtaTc[P%ASh(2A9Ӧe X"R ʠ%Ğ>*2Q,*ݏS mmcUk97_JU>CJ5bm^$}LvEpPFKMŮ= j9w,{2iEI,*KBY7i jD!{k{Ͳ'Y&9.fé!L@+,9-˴ 8fυtH@y=Qe1Hv*6d0c4+%K+$IaEFR~&/Jh4"h"A GHUYiZt0 < ~Ds ¡èPCx8 OJT<7 TkFcRA&?w/1d&Edgз["i\6=A ͢5)T F_u&pS(,jb +%938KoۿGK {{kzz{|_Kӷ,;GAtіǎQiͣ$d˞ 7˅Q>sDĥ2$%,̣vc.'o0\{POP5uϟEU@A0PgDX`;a^;2r680U INP%F>cbTXaQG ^c^L%Sozp4dG1e~NZjlH0EKks} x'+vz0m'0T>fIA툫ߘL ep`; Nw7*N u@`\tNZ]kұށ|@4ϥSy/W*I4j5,W4¸Rơw޲~z&?]([RZJm Fī&PŽҭUStkG >F;–!y}P:LIU R#Sii*̡{*TB߆"O!-Sm=~jClnø8TsZ{nL@5;m` " ^u6t%!<9+h{KAH3eL%!ezm]=oj@é_ݻ@PqUykKH|?J pA+d<+_hj9plAIV* }Gl[%/V"\ ({4r祲6C˩MP3^5yxt*M$M"c$Qb/˺ dg@*e$a6c7xObϐnǒn2@ߟC>t=A@E40[~yj}Ɠ$7#:/'~DƱHAg=}_wnOvL8/\Zh;]S;FqѻX! 7:G@AǑC:<.WC{d|0B3egUOBwdk]S;|vLp:dj5Ǩ:[l &<4'򬯡g .wrJBhyV ! F#ӪpQv[ǧ6q1/'f I1 ?]ᴘIL>0R=7W]:!Lf3XX&?QFBgA?N38qҝ͋(Ņ7L\(z`!Ҝl?9{( q-\^ RÍ(jv++ T/ W-Hޚ\5hf`#oŇr]}z!U5PV~ aĀ*Y EJC#JU,-[G=iD>lҊϢ㡎MEsD,7c7jm[a.r|?R{Yymžzd0XeH,j6i릊=~ koTpao\V8R8cTG[JEh? d'y^5_="F b L禢 ,.l'Y:Z[j kIqoW&7ĐC$ ;'{唓{JFz2*wYY_X_p`DZXx[]ܑg[en +^ck cx8hۧ7Tx$a[P;?7RaI-eFO-8`|{?"'sqW-<^WяZ+u… :m+Wf]g ;^)ŕD{@M :=Knވ)SI/GǍB Rx8gF/eK=JE_n͜j]}zy5 1WIiRRt05%Tj*5+ۜڇ\Y=s #28d]disϹ0E0ZN-]ʮWUYtz)[B|2Fn߹ i2zJp 6$o[t\?]THN>;qS&g(2q{?C! !A"?}Mzl C>^FRS I^n*D vWxfʂ1_1s~{cc:1Ti*(5h/SwƸH*NqwZg}2pP}8>-/6T?SZRZ3\+e.x -Du*맥%iׯx䋟5e<#<>al/Sk-i6pFѴM^Pϓy6n \׾YexP/iĻմTw|O>SOOtM:Uן EjP"mkv,:?PHGʒH%r)+dvCY܉Z§H]K>bmig2^b?pJ~;٠I(-Vn$5M|;=[!d=%j7aђQ4(K}J~xI  R-G֠!m vxzhI,Y-A]FCgej[;ԼY,ҔyG&c'@ ёY0BZN(Bl\ eMaY)I qt4 ˋE/a_E@АמO³> 7] bl'!ahkVI΋R.ǹ" Aѣ52X&hﯛ Ew6u ,bA=%* ;w;a+/ B!hx8$3>+ESJY"ICz f!OC$k9Z9f1 |<:z}(r_,e&|g!~<n-ae$j y38Ev%-S*Ur$MJI seDRn~vByUZR;-UDr׹Um(Ԫ&hSPP!Elo\f_]qđ7S?Bw;r<չ-NOn kHya Ĉfbef4*%j&S@xdo'zަ0. \rG7BHp92gxyvO!)Hoxq'ۍ2J'FO@#E^# u)?xRvR6wðwip)􂠋 jXFBv8:'+,+צ zN*eD  I4 ː}2 |2:8d4p ~]CNmO 8)4)ϰ]ug3O>!3dE:"%Drݳ=x%8VW||{V,;w<<;`Te*c_b{b8M^v+hkͅO7i"64:N5iV+=[>⤉{ {Jٱt(Ĭ$B@,<8 P%pxSP wD/D@.K+Ao2(8( |$> {{5`x+ y}T/օa1)mSI'OY_Nj!p~_#a & P*4@ e@:oPC ϥ8C;NGO(T/8D샠pb,iXM5 Q~ Ĥ=>}K~(cg=٫c`^+O6H[P:>*r45DF'1ry)>$~U5Tq3K*쮰6TQ5 h?D"u(Su?yDfsX.|^E00LV?V32,#A"[cw!utNE2b>11YXXS&fyU-:Gʇ+S]+* 4˜=&&  M7 'ՋX f!S)hXJN aO1qTX= NaR( ̔$j b~WL1ޠp9ZzΕ7oxr( >Q/B 7* Cxr~V =KʣFbeHo[n#S"AtgT*uF@?\>Nt}h # aK#bWd Xg5jDu ")/ˠIgv@2r1[c5(I 2eو >+4(t=oz߲^0y ܔ^(]UJcOϴi4BW0*=5Uҙ^4bSu-Z>7@~k耵щ۟v7Ȕn-m7d[sh^fyxxyK5fnWo 6̖w׉,2҆ ~v_֟gBힾ}xߚyMEM23sEȎ +9d׉9POs}vsHYC+8Ea\mq _J1UyU1h=LFY~I-J]3 g^G^qK'֞xIsfp䀂2.#:*(@vjBU#h,9j)0b z)~3/0+j!=yޚ]h䩡LHigbK?s]sNA/:ld]tt] 59sIX-yfoi{A@C t&$m '9z5#u%j8\eW4ۥ#8)e}*cOd>$]^^ >vxUzHm&dnf+u(v) 3[i3nڴnCuĘq3vưpc_uzj='=^;ujQ-;f{sfpHd^8鉐ԓebHE: MׁQ^߿9#{>zdnbD2lkWԀd)^>?J/8mZgqشr4#0]DsAf9ZǧD:ZDr"Ѭ|!s4y:J K!:ll!]GO]aV9Rrp-1*X^ZEgK2Ňw[碨G{/?T=?Y@fx H{> a=/wmo{_ j#gS@&r\w3heEIJ|i>̹֜E@o'[PMvV;5k+l{29zMfPbk`:3q@^#rK/ݗ)Z%pK<鯋YB8ݝeЛ5RmC't|I얁=cr3#ъ{h17f}T.2u\h]7v.w;90us\",ZzvV5e1ED&Ő,6?X%v 굈'Wt( Қ܌rZ#IG18[eisU~V~a5E?fM>C)t!}QN&p2@㉪q$z09rNsa{80l)b{#+ˮݙƚo^/Tg ^1v1؊8~2Q(:%@OUYz1f5Zi=۷4жRT$C/Ed^rfq>DxDd-"5>-Thހ:Q *p)5Ip:F߀.:_nRFedqK>ATȠ&@ՂMAbꙖ,1ʗw%RIh{6 "g:qn3kpmwoտzNNIT !qd)`͛?̍BX1Y [p 9 )惥6h|mG!nBCts_m,L,!~"lQrmCe7J9^mh59C:ZCg#QA[21 .5ݼ-4!fB2=amfPP$@J_/AI^/j`$,±`}l@f3o8?)Łp>ژ\7OciU@LA9A(V%IO ]T`MsHIL&UPx )J0] _M-gy:D ?4q4^;:;9cUetTN r۵ycXr.3XxBlIĉ4H@Y Єy vĩ'n ؿوCcFYKLZ#6_`fP"Sj) 7yS#k\ݭaI!M3bd 8C K:FvAbA^8*finX҉&ZD}^gҙz"P ra.kWpH[:V֡LyOܦ]%d%ſ߆{`?dlkQд6v̊VV6{ݛ&`lHG]=s>5}!]ƃ~:";soqTɫ$Us@9 PטO۱,<5IVMGZX|Ip/}g9Ky7+Ý#*#?&CLb]֔0_㣞Ϡ.X-K1Oapھ96Gv<79l 8n0/ vLKY ߶]!p͖1f&961J@j4__0h$$&.3&v_]"p!dhouN1 jNl;dnV `=vܶ)elB$&eozʼn, f/!WAlh8;NwJm<)Uj5;~pER Hmݏ7oEdϱLVT'ea-\INc_i6 G犮@qm2+`0L|lJ&j tf۹vKlLFYg[rJwljƴM'禱i#vf*]Gtz;ֱyʦxFAӌMF(㰱DžiZm(W;  g B%ba W) MĂZ-AQq<ɈD#a"9n{?'pq+f6pI],lZg@ܦDM} a0lo8ˣ$jROoM|4f拉iSjJW1WnF]'J`x~29(_aRWy7C KH'F3Q)EWҸ19006Z Z`PUd|·3>k]num>{w H^ߎhW9] - Ҧ RL=ul~8zVXaW: Z+FS֌< Sh@~r$ܪG(>qn CEN19'G Q]PO԰߃c<sDܯIFߪ\噑$A{,Z Jlw >)DV 8~L1`3h5RS37rӹ4Y ,CeOl7I$q'pItHn})Hd\_Oʜ$VGXeQ%hu= 0dlXmUC\\\$uf|F]PrLnoaFdIWGvc5NKL}ULk GoʑM2/56~"/-SON+?>$fam0:JT8&!Q J`L9xQeu0O#AXd2F0c\Ǽb2С &PvqLDyޣeBۡ<AT3~^Ơ3xw)"R Jm:xǫ6Sawu B аb2p٦ qi Ye!Oݝi_]7Iv (DEj|ewэ;R /ZpwDDY^s b:!&eW)ۣGOKiBy^fJ}EW 9c)BQ-pQ⍨i+j/JrY{1FuWSGdS9Nh|Ȉ-*v兩 F3A<$"L& >HZyi9` J[5gYW=W~}D$DŽGgZ\kןummY"{s)GVDЁ)M]2Hua9>trNb)9}\{;y KĤ0f6ú<4Ƃ >:܆sf6&K Ͳqvc~L` 3`}F2"bQ|*\Cmu{S$Jo'"[D$&xWaYf>j)g.ӈngaѕ8p )Ւ_6@U@ }/;n.%ßfa*C $h`=١U&VPs a`SH;'wׁ1Y*X}t$!Mo>&aoB>,@UP,T~D@%jTz:IqG${&<6e9`acUׅS )p~~|vq:Cl^kF[)mRE(1Z%%W6If:l!Ú;Y+5<z8)JG {Qn)[9N٤m>/S͖05^1Qְf7!ȋ:Y aVTza"sڜug,ɠˆӎ*(E +`Fw2Cd  8#!*Fz1(2uNw{n[j QS}NZC^b8{f s, ˄ژXV|b&+jS6ΔTh%Uɤ(7PpuxHJ) j#籎(-/9W@'38vĒSBEXd9Q-EInn8ifYxE 6y(J dS-M/Ժ"M],v1nWb(GPXSR) K]j"ߛ2>JRAe) Eg Pn8X0H܂R޸[x#J3/t![d*?d+k8,N8/tj4{ȨRbPMmSdi[t-7o:dYk 00ۂ?"9adjD$8#R0+Z3BF\UrZf!Xv"EB@s,r(9oP[_A4rȝ:/o 8>Uة nn{06jNˣq64-] *#c5"L & #{s.iՑcGa49Y)0d92;4gdBP&'/r@3y?|-b' ͻmH=ibD5hma=0V3{!/h RzZ}aizgCi5Hry* 2 ./¢7lFeir -n4j7H  #{8?3HԚiax(KKFA\92g̬+٠?FxB[q 7 ;|Ir@=sP$6')1.]Cz )Ih#<֝x* wz+^mb7FZ=APpWdɢo=$i;0EvWTZ#x^s:,vjebi?HP 8|Sl[0l+>:PYr93qwTlu}#=_.F$"`K@ltCb`9%L:#ZČ3>4?ځekyKh&Y+[2}(P(^j S)[1HHB 8*u.R3=WҪ I/1U.x}qL)MaĊ.{9 8vf49vEf-E\wӷ`ikN3LgzP_] N @YjVa" #hB}"&-WKf`Ԫ}!![FRAC%1E.Or9qxX{J*LӞ!>aa PC SZ՞dęgRi걻*K4(<W.Ow@_WfǒW 4@CAŕ qx$ *;\1ilVn31 8"|) Йhͯwպ9)L l+Y^?i.;<'gzX!SU (bUwjg:TW/§Q8F"ͦ/njau>٤]SlZ:G*Pwb;'G\w/~[IIVUQ1/N7oiNPf?"Aƽ9;zDIo),Fa0nSw5\EBq>-zBX<} tfP29yomSt)vٞ UciL: WJ'mѻiL x]Gh2v~D\@>c/6Y鑂CzTku^#ʥA(i[3fM@sܭq4H&S0Cj?-%$EI4hh@>sE,G*H5]=߈utN,LM!aqoC;=ÿ 0:Z ?ְ`*3[2ddEg;s&{|FXxɭ$f#vX .O??9mг(B)'ݫ_qo=ѿPȩ[\XSeɕ7 yө$%ykz*Jz!Ѣ_T%w.Fo~_ҪwBV%2 Nc mF*LgvR5# V~ 2{Nƿ=%_~mEŏ[?a&g =MAsBr^Cj~Fq3jg[(߷ UsUoWx ײ_Ջ{< Q5 j| ~mhXL]S} ,J%ߓ V|ݯtvMey8RYdfO'#}-?+o%mݶyeNBzuZzfOxf!o??}w|ױ,_7Q USD3q{r'Y{=_/v;]MsD,kǾx~ ?yW3erCqrЀ-hIPa&³ rsP`=MMz*sN|&ѪXrf*;b[]̍gue۴Tu<޼͙l˵B(-"zL>53\"ehE[{m h"hxa+;1Z4Q~yrd˔,^PW+EI֘Ton2_z1EB PR9\QX;դy9:Ka|L0T{!a?ˀ5I$>eFVo~:RuwYʾ3!Os` +0`fx"29[Ε8 ck0͹AM-R^nwjP?2з;#fQOτs# d #va{7%t`u7[[v`sƀmBl`Kt(7C^[ODu0DD}/ +,"bb vy2g{$V[L0)4}RGO`s=7(YuVD#_5B!s$̉ F֙ noH'|}]OCfi g"j$l0It G4qOCc#щ⸮!2$@P7=Fe+BJ'@ ש`{u VEf X`\k渙C D2QFԴRβlU'YbQ 1t$ ZI # 'ԗ{+MMgBK+GIaOS=u`>%'Qe⫭VOݨ}Qm!nl9(^OVˆtKהsm5bճvMga0VERaPl^{I%fL'&ДshztUI )U ' x"C/(Yw*BTPP;)t|<ڴ?Up[2cÛLx<d<tuQ!*U ~-}*m<2Xp[DA   B*yVaw '5Be]#u(#=74:cG ~"x.F:%zz]}K\ū.O1.ISwTNBUUTS]CML י҅CSC+cHbs)giKUzvi'dK-xꏊ\ juW䲏 c;O*@ƄLoPM&+KGp+i/Jk}[EL_2yPF즺YSw:feC6gBe1>j*Cg@i;9YXi5.N{1bⳍ|ԚNgP'^=0DaL#%[c.._2 C m 핦ZJocxA luѾKnKq`ȈϐWj?^ڡ)'qb/Wg9 :W]q%<|4;YyǗ?X0X6k9Ĉk@%y!dرvӑ|\nO#yL./Ē0p\T5Z]aܨ`kNgW?f!DdT onܽzUu5hTZ,+ڴ8Nj8j̦pLBXRJZFVN^AQIYEUM]CSK[ǷH&F& +f!(ɊI,@j;-o$\7y<χP0֞sjDL\dG̝:h:Ns3V@}wO D{8MV̙i0 jNdЬE0f5o~q)PN-}ɲcvW4RJ)rևa]VѬ2XotqC?NK (1WSsE:_ۀo"N?WҮWS#}3UdReABut^ tFMԢpmDg>%<0W<ƚ88V.&?h^je-7jnwN934B'ʸJ]aBRiô"L(B*mVv1@ e\H .0 aZ٥&q!6L+I *]Eʮ5#9_\b ^F?ˇ y2_3[oy7t2_pV<;s:-&NK.c.UA*B ʸ'>NuuhDk>#.;3V"Jr%.I vo3Zx&ݢ|M_;Nw+ta*-梕,aBfφЛRiô5@$ 뫒^?7`[) sY@UwxWbM2^UaOȄ ;BCʇ%/*I6l%`ϏCٌ ;'$@ɴk\#QNMa_y*^vB$9MEdʦt\=1_LI)Ƥ Gh˕}9&VU\Dꔉ u*@T/ÙFl'2u.>|x4KJtBɺ2grXMnM;{|ћ?5 'dl;oɵD5hb'Չ?;T X!16N\&AFFFAAAIe6 o͛^CϔwUF ;?Q\Dw]=ß-'V߃(;oOu>}ۗC >n+o+@c+xݍODO>'Bj]Z>}O},_W~PKwL\K-44Blimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Medium.eotnu[4  LP 5K/ CoFo Sans MediumRegularvVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590 CoFo Sans Medium0BASE/;PFFTM\ GDEF$&'GPOS~ERTLGSUB,v(T*OS/2aGq`cmap Hcvt O<Xdfpgm( gasp'glyf3$Xheadx<6hhea\t$hmtxz 0loca"N6maxp  name92: postmAJprep}woA/K5_<ח% חBkS(8w1aXKX^" COFO   (dM1YE F.h")E?D H'.8B2p'(#/5F!>54"UVUu6P3PsPbP3PPPFPPP3P3P1J   6HB8B-*..FC&E& $nD(=C@ CCtC=C(&FCF&gC)};>    0Gp2@1YPC#GpS6+;>d$1 O:4p2*H4,*$(IC'/}#1%0*=3sPsPsPsPP P33333Y3JJJJ PLC......I.& $ $ $ $C-"=C(&(&(&(&(&H-&;>;>;>;> EC ...3&3&3&3&PE& E&sP $sP $sP $sP $sP $3D(3D(3D(3D(P= < OCP@P CFPCFP:FPCFPCS P=CP=CP=C=CP=C3(&3(&3(&Ot&PgCPg:Pg-1)1)1)1)}}yJ;>J;>J;>J;>J;>J;>    6060603BPP<&P]PChPP5CJ;>I.BPP<&I.3-&1)}  (**.($#5t#&($?@C`sPsP(P31P# 2PPP PPP(P sP1PPP PP3PP3 h. P6PP PP/P(.52CC@ $#>C>CC,C>C(&8CFC& & EC ,&C9CdCC$C% $ $,C #)@(;C=C>C 4C b3(&  ,PD(  PCPRC    P=C3(3(&P=C1)   sP $  @ P^*.. B7 7B7700\88"M M%y$(4.2,+$/4,(4.2,+9G=:$IP'"27C0=>Q X K  K x U [ x$W:FVUU>%>%>%>%>%>%>%>%>%>%>%>%``4>%>%>%>%>%>%>%>%>%>%'*H8Te;(d2*P@C4;.D(:>:> C =CsCN>,s>>m= (1YM M%1 1%.*..>B>DH82>B'*H8&&GpGpu6;>2$$25&)1.45/$/4,(4.2,+$/4,(4.2,+sPP3 P/P(. $>C(& C$C%$M5(r"*z*3!^**~7~37Y#_cuGc      " & 0 : D p y !!!"!.!T!^!!""""H"`"e$i$$&''0 0 927Y#brFb      & 0 9 D p t !!!"!.!S![!!""""H"`"d$`$$&''v00{uh[S;%"bAigY?93)!e/sleb^ (UA10F6Z V   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivokuj20r34ghlzcn1.m{b7wU[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-), .]-*, .q-+, .r-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpB-*B *B**B@ * B@@ *D$QX@XdD&QX@cTXDYYYY" *DdDrraa>>rraa>>2222\fPz*R`FdP  L v & L | : p & v  H p 4J6x2h.X6|84`NNpj2&"n@VZ,F.   * 6 B N Z f r !!t!!!!!!"@"L"X"d"p"|"#^$$$$($4$@$L$X$d$$$%% %%$%\%%%%%%&4&@&R&^&j&v&'N'Z'f'r'~'''''''(P(\(h(t(((()`)l)x)))))))****+,+8+D+P+\+h+t++,,,(,4,@,L,^,j,v,,,,,,--D-n-z------..Z.f.r.~.../D///00 00$000<0H0T1>11222 2,2223333*363B3N3Z3f3r3424>4J4V4b4n4z444445 55"5.5:5F5R5^5j5v555555555556 66*666B6N6t667747N778(8H8R8n8v888889>9P99999:4:::::;$;,;j;r;;;<(<<<<<== ==6=>=F=N=|>>>F>|>>??Z??@H@@@AJAhAAABLBpBBBCCNdNNOOBO~OOPPPQ(Q>QQR8RRS6SSSSSSTTT&T6TFTUUpUVVpVVWWTWnWWWWWX X(XDX`X|XXXXXYPYYYYZpZ[\$\]\]^x__`h``aa aVaab$brbbc^cddd2dNdlddeffffffg g*gBggggh2h:hJhRhjhrhzhhhi:iniiij(j6jDjRj`jnj|jjkk4kZknkkkl2ltllllllmm&m4mBm~mmmnnn.n6n>nTnnnnnnnooo(o8oHoVodoroooooooooooppp"p.p:pBpJpVp^pfpxppppppqq8qZqqr r2rNrrd>  0+!%!! '7d`222j:F%!Y,@)Y"KY#L+7353hp#˄ExDK2PX@Y"L@UYMY@+333P v \ v ))FK2PX@&  sb   a"L@/r  sb U Y MY@+7#537#53733733#3##7#37#jqffhpfFbbbb).R#*1*@'/.('  J]#L+?5.54>753.'#5.54&'>.x =1pq";S1Pgn u 21qs{iPe}y2718%1;66,3[\.G2VVcQ $2Y\]cVU`&' /() -"F '3KPX@+   c  d[*K [ #L@3   c  d"K[*K#K [ +LY@')(/-(3)3#!''   +"&54632#32654&#""&54632'2654&#"KddKN^^ QQ.%))%%,,LccLM__M%))%%--9^`]^^][c45243354h^`]^^][cU45243354),6~KPX@43# J@43# JYKPX@[*K[+L@[*K#K[+LY@1/+)*#+!'#"&5467.54632>77>54&#"3267'&/&aAwX>n`\h[H!d 6!t? 192*+3\RE%@+81!icL\B&Ng`NL[Y)Bm&x2 5+'-03> 4E5K2PX@ Y"L@UYMY@ +3P x )?/l0+4>7.?$@X3>'E2dU>3X>#Ovc&K TdvA}GK&fzD/q0+'>54&'7q%?X3>&E2bV>3X># Mwd&K Vdu@HK&ez ieJ@ JK2PX@ Y"L@UYMY@ +7'7'7'37' Z)bb)Z Q Z)aa)Z il=F//G=lm>G//F>mHAB; ,@)UaYM +%5#53533#dAbb'g @GY#L +353'>=9I@ ''CFB# .YD@UYM+%!5!Y+h8@Y#L+3538B>@r'L+3B"kj2 -@*[*K[+L     +"&54632'2654&#"YVSSVUTT nwyzvvzyw  #@ J"KZ#L+73'733!D;Ȏ:nb^n'B'@$J[*KY#L%"+4&#"'>32!!57>B??R v|w2F*_GL.>FA`|w_-F;6irv1N(\D@AJcY"K[+L +"&'732654&#"'7!5!:32Aux SDLPWD."b~ ^c85>39-Zn[`hu#m (@% Jb"K#L+!#5!533#%!s@\\XjjI/T6@3JcY"K[+L$%$#+!>32#"&'732654&#"'!+ Q)w|w QBMGMH(Eq"8nlh~aW12@97>!b5^(;@8Jc[*K[+L$"(($%&"+%#".54632.#">32%"32654&^}QnBiu HAL^_?6]C&ENOEGLLhz0W|LĩXY&8dy"&5S;<99>=99=!%%@"JY"K#L+3!5!gFt8p>m#/>@; Jc[*K[+L%$+)$/%/##*"+%#"&5467.54632%2654&#""32654&m=423656>IJIKKMJMKTRMKQNaoi_>KM2]ieW;KL3/+12,/1a21267/245^(;@8Jc[*K[+L$"(($%&"+4632#"&'73267#".2654&#"5~QnBiu HAL^_?6]C&ENOEGLLhz0W|LĩXY&8dy"&5S;<99>=99=4&` `3+"g'` `3+U55I0+%%5%5 sɀsV4@]Y%L+!!!!V""ghU55I0+55%U psɀs!<@9Jp[*KY#L!! %*+7546?>54&#"'>3253'-!#639? s {opn>$)uE%/(#&/5+RhjSEK$̄6eG|ANK&PX@& AJ@& AJYK&PX@+c  c dW[O@2  pc  c dW[OY@MKGE(&#&$&(" +#".54>32#"&'#"&54>325332654.#"326754&#"326t>Vg9FuR.-PpB.^Y2#(22($1c3c^[g91[Py( (l\1K2&VN?eE%/TvEKsM'30<47<5 ,@) Jb"K#L + #'!#3?=iXr!Pg C@@Jc["K[#L   ! +3!2##32654&#32654&P#hz,9A6q B7432.#"xQW xJxU.0VxHxTP`klcK>nt.YTVX-vk;MqoP'@$["K[#L !+3!2#'32654&+PqlmqowntqP5 /@,aY"KY#L +3!!!!!P]hlilP5 )@&aY"K#L +3!!!!P[mj3#l@ JKPX@a[*K[#L@#a[*K#K[+LY@##"$%(#+#5#".54>32.#"326=#5g$h?JyT.2X|JzyUKcqpeQgQC#*/YSWX,mk6HqpN5bP '@$a"K#L +33!3#!PzKzzXP@"K#L+33PzXE @"K\#L !#++53265EeeaI44#jap-5P -@*Ja"K#L +3333##PzfeP,@"KZ#L+%!3,$zrrP6 .@+ Jp"K#L +%#33#rĬw>)X*P @J"K#L+!##33wWv3-@*[*K[+L +".54>32'2654&#"J{X11X{JK|W11W|Kennedoo -XVTX..XTVX-mnoonPa +@(c["K#L $!+3!2+32654&+P"pwB<;Cmmlp]:6;53)s@JGK PX@h[*K\+L@p[*K\+LY@%#)) +".54>32''267'3>54&#"J{X11X{JK|W1C9AUH> p~L""nedoo -XVTX..XTb+U?b kf d?oopP| 3@0Ja["K#L !+3!2#'#32654&+PpE?C;;CmmNe^96;51b''@$J[*K[+L+%+#+?32654&/.54632.#"#"&1y XDEO.6w]ix|y GIDI5=V[w66/)%* X[]jgW*=3(%) ZSag^o!@Y"K#L+5!##[z6rr6J@"K[+L##+3#"&53326zzUTRQgf\NN !@J"K#L+!33ƀX '@$ J"K#L +3# #3^yч}X  &@# J"K#L +3373#  铧[M #@ J"K#L+!533񏾽:P6e ,@)JY"KY#L +35!5!!6n+hrpq9pH>K#@ aY'L+!#3He4eB>@r'L+#3lk8>;@aY'L+3#5!!8]ej-B!@Js"L+# #aw~|xf>@Y'L+!5!3h. @Y"L+#3ph.)KPX@ J@ JYKPX@c[-K[+L@#c[-K#K[+LY@'%!%#D#+!5#"&5467654&#"'>32'&3265gK0I^cT">2((. j hWVrp:'-*#3B7"LDKE&*&("AUO` !1(CyKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@&#+33>32#"&'732654&#"CsQ(+L9!}a-GH57A@92J% >]={14>RHFRA<&'@$J[-K[+L$'&#+%#"&54>32.#"326}jl]h$>V22K3g239@>:32J]|>_? ,< !4QJHS2&!yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@ (#+!5#".54>3253'54&#"326K3.P:!":!#!?_<=_@!X8;@QHETI$7@4Ja[-K[+L&%"+%!3267#"&54>32'"3.B524gi^m}%?U1hr,A 5BE.32#4&#"CsP1Oas23.C &XT+.160@,@)Y"K%K#L+533@zws2pp>3@0Y"K%K\'L +53+53265IzR\<&+&2ppN \Td&*C 1@.Ja"K%K#L +33373#'#Cs=>C@"K#L+33CsXC6"V JKPX@[%K#L@%K[-K#LY@""##$# +33>32>32#4&#"#4&#"CoO1:M[3M`s01,@s01,@?"'1%++YT,+38.+,38.CLJKPX@[%K#L@%K[-K#LY@ ##+33>32#4&#"CpQ2Obs23-D@"(XT+.160& -@*[-K[+L     +"&54632'2654&#"klmm<@@<:CD wwwvaQKKOOKKQC>f@ JKPX@[%K[+K'L@ %K[-K[+K'LY@&#+3>32#"&'32654&#"CrR1+M7!~b+FH57BA92J="% >]<|4?SHFSD<&>!yKPX@ J@ JYKPX@[-K[+K'L@ %K[-K[+K'LY@ (#+5#".54>325354&#"326G3.P;!";S10HntD3;C@;<> !?]<>_A!$8Z8;#"CoK"')1N@&h'*)''@$J[-K[+L+%+#+?32654&/.54632.#"#"&)i 6./.#.AEMoWVj f0/*.&&>LOheXo%$ @?FPO=( C>CTK__)@&rY%K\#L# +!#"&=#53533#;_PbPNNs%%ES`f{{f,#>ZKPXJJYKPX@%K\+L@%K#K\+LY@ ##+!5#"&5332653S2O^s120@s>!'XTB-28.$ !@J%K#L+333yvw   !@ J%K#L+333# # vcfgenjkbfo  &@# J%K#L +!'#7'373ssmif鞞 >"@ J%K\'L!"++5326?33? SK9*!- xx+W@f!a0 ,@)JY%KY#L +35!5!!0ifgf>$3@0Jcc['L$#!,!%!+75326=46;#";#"&=4&#+8XSF5+'****'+5FSX8+h/>xcPe%3}/p>@Y'L+3pgj2>$-@*Jcc['L%!,!% +%#"+5326=467.=4&+532;+8XSF5+'*++*'+5FSX8+/>vdOe$6y/@J,@)Wc\P#"#"+#".#"#>323267JNK64/ fMK72. Of*Ng*Y>@Y%KY'L+3#3#YaG#P:!*@'  J"K#L+!5.546753.'>7"_sv\MVeg 0*+. h dY2.+5] ok ][ZG#20E[[X;O * MCE(9@6J Ic[*KY#L%%&+%#!!5>54&'#53.54632.#"3Ȝ"U14sVkiq v365<  *Cjj H- R!H-_mcQ(79.)F%#-s}#/E@B #J HGcW[O.,(&!-+7'7.5467'7>327'#"&/32654&#"lIr  oIq76tIs pIq67<337733<-Jq8 8oIq sIs76pIp 4::45;:y>@; Jb  a"K  # L +!5#535#53333#3# lΏnkR;R^)R;Rkp>*@'aY'L+33pgggFrr69!3E-@*>1! J[*K['L%#%"+#"&'732654&/.5467.54632.#"'>54&/#wedr s;,/943LKU8,!ua`p r2..43)WKQ6+ $+12K&.-+P_WO +-("%" LL6N?,L\XN (.'"" MI6L<| 3 '-  4#$* +2^$@!Y"L+53353+pRq2oooo>'C@ A@43JK"PX@%c c _[-L@,cc c W [OY@)(><861/(C)C''  +".54>32'2>54.#"7"&54>32.#"3267J^66^JJ^66^J32'."3265 0#3=D;+M G<=IN##%%2+.. (5<<|$   ?@ JK*PX@ %K#L@UYMY+3#'%3#'zyo||O;@sUYM+!#5!Og{4-6( JK$PX@1 p  c  _[*K [ %L@/ p  c  a  _[*LY@'/. 20.6/6 - -,+*)#! +%".54>32'2654&#"'532#'#7#32654&1U?$$?U11U?$$?U1NgfNNggu107P.%%%$>V11V>$$>V11V>$1jNNjjNNjF'&#RJJ1 2A>-KPX@ Y"L@UYMY+!5!> AU*b} *@'_[*L     +"&54632'2654&#"FbbFHccH"00"!..b^KI^^IK^W/##--##/HBs aKPX@aaY#L@#aaUYMY@  +%5#53533#!!dbb323!57>'R SECL/.Mϟ7=>6-52KIk,o@  JK PX@!hfa[%LKPX@#pna[%L@)pnaW\PYY@ +2654&#"'7#5!2#"&'7#&'#  {$m5CWJBRT'9QGOF013!###1O77O1TiZ 8K*+K7 jI 3+'+!@ JK PX@hc\'LKPX@pc\'L@!pcW\PYY@ +"&'732654&5737?I"%*J%13B%( 01*&**3/p MJK&PX@rY%L@rUZNY@ +535'733Qh`*^_K;>UK#^ qKPX@[*K[%LKPX@c[%L@cW[OYY@     +"&54632'2654&#"GWWGFWVH%$$%"''TNLRRLMUJ/)),,))/%  O@ JK*PX@%K#L@UYMY@  +?'337'3&|hy 0&'3+t3+*r&'{3+t3+=&'3+t3+6!=@:JpY%K\'L!!+#53267#"&5>?>=I{'-""548? s zpoo=%(䄄F%.&#&-5+RhhSEI$l&$l&$ l&$j&$a&$d&$ 3+B@?JaaY"KY #L +3!!!!!!'#3 . )di oio3&21@*)JK PX@-hf[*K[#K\'LK PX@*hf`[*K[#LK PX@+pf`[*K[#LKPX@/pn[*K[#K\'L@,pn`[*K[#LYYYY@.,'% 22 +%267#"&'732654&57.54>32.#"xQW xl 13B;7?I"%$0VxHxTP`klcK>cs $&**3%( 0*VX-vk;MqoP5l&(zP5l&(P5l&(jP5a&(l&,P4l&,6El&,õ'a&,  7@4a["K[#L ! +3#53!2#'32654&+3#PDDqlmq&b owntqbPj&13l&23l&23l&23j&23a&2YR1*  0+?'77'YFEFFFF3'6@3%$J[*K[+L'' +".54>32.#"2654&'J{X11X{JK|W11W|)=%dqep8 -XVTX..XTVX-^.Nkn*H Jl&8Jl&8Jl&8Ja&8 l&<Pd 4@1cc"K#L   $!+3332+#32654&PpwC:9rlkno86;3C'&=@:!Jc[*K[#L &&+!#532654&+532654&#"#4632E><7AD97/+3817=t{mdp++;C{f529.c5(-/@6&hobU/JOHce.&DCN.&Du.&D[7.&DaO.&Dj@.&D_.%.5BKPX@ .JKPX@  .J@  . JYYKPX@$  a [-K [+LKPX@)  U a [-K [+L@*  a  a [-K [+LYY@0/@>9632/505"$%#D$" +%#"&'#"&5467>54&#"'>32>32!3267'"3."3265"i\Adg@K_cT"?0()0 j hW=SY0fqC603 o-A 7<(,,#1BES6,.4JEMD"*'("AV,#%~n)@G.93/= !.-&)4@+*JK PX@%hc[-K\'LKPX@&pc[-K\'L@#pc`[-LYY@0/(&"  44+"&'732654&57.54>32.#"32677?I"%"]q$>V22K3g239@>:32j SG13B%( 0't>_? ,< !4QJHS2"?Y #&**3$&HCD$&Hu$&H[6$&HjD&CC"&u&&&[&j"$0[@!J$  HKPX@[%K[+L@c[+LY@&%,*%0&0+'7.'77#".54>32.'2654&#"K"&"=bGCG;Z;3X@%"e;cG( =Z86X=!$;3RABMOB@QC&Qai&&RCP&&Ru&&R[B&&RaX&&RjPH.BL ;@8aaUYM  +53!!53~~̀Zh& 6@3J[-K[+L  +"&54632'7.#"2654&'kml #&XCY>&Xu>&X[J>&XjW >&\uCD=@:J"K[-K[+K'L&#+3>32#"&'32654&#"CsQ1,L7 ~c)EI17EC:.Kd"% ?^=z2;QHHR>; >&\jDV&$3+.&DpNk&$.&D]A5G@DJ Ib"K#K['L +"&5467'!#332673t7R'>=%2   'oi13"4X *N!.5.;S@P",Jc[-K[+K['L973/)' .. +"&54675#"&5467654&#"'>323267&32653I' K0I^cT">2((. j hWVr,  %P:'-*#3B23"52"LDKE&*&("AUO` )O !1(3l&& &&Fu3l&&&&F[93a&&&&F^3l&&&&F\9Pl&'{&&G &9)KPX@  J@  JYKPX@&a"K[-K [ +L@*a"K[-K #K [+LY@(&" (# +!5#".54>325#53533#'54&#"326K3.P:!":!#!?_<=^@!rL55L8;@PHEUIP5P&($&HpQP5k&($&H]EP5a&($&H^P5BF@CJ IaY"KY#K['L%& +3!!!!!3267#"&5467P]h!0!  &7R) lil +N/2"7$5,3O@L  ,Ja[-K[+K['L.-10-3.3+"&'" +#"&5467#"&54>32!32673267"3. %3I  m}%?U1hrB534c ,A 6231v=_?!n#BE-405308P5l&(}$&H\53l&*(4&J[G3k&*(4&J]W3a&*(4&J^3&*S 3+(4 +8@+JHKPX@) a[%K[#K['LK2PX@- a%K[-K[#K['L@* a_%K[-K[#LYY@751/)'!  +#54673#"&'7326=#".5463254&#"326Uw4? ! }l#?X4Vxn @%9GK3.P:!}c/JG39C@;9B~bH=D 5(:S3NN($6C: !32#4&#"C88qQ2Oas23.C'L55L"'XT+.160(j&,&a P&,&p%k&,&]5,@) J"K\'L+"&5467332677Q&z!+  '13"4X *N59@6JY"K%K\'L +5333267#"&546@zws+  $2J%2pp (O23"2Oa&,.C@%K#L+33CsPE&,-@>&LMl&-'>(&Y[P&.S 3+C&NSP,l&/5CZ&Ou"3+P,&/S 3+:&OSP,&/Cb&OP, 0@-a"KZ#L  +%!3753,$zwrrʱyyC}*@'a"K#L+33753CsUrXpp9 ,@) J"KZ#L +%!57379$CCyrr$f%-RgR  &@# J"K#L +355737VMMrNN1b1s1b1Pl&1C&QuP&1S 3+C&QSPl&1C&Q\UC&Q&3+PD/@, J"K#K\'L!#++53265#3a^B3,'}N]e\m,/ .C>X JKPX@[%K#K['L@%K[-K#K['LY@ !%##+4&#"#3>32+532623.CspQ2ObSV8 (& 4.160@"(XT\Ud'3P&2&&Rp\3k&2&&R]O3l&2& &Rb`O'KPX@ "!J@ " !JYKPX@!a [*K[#LKPX@5a [*K[*K[#K[#L@1a [*KY"KY#K[+LYY@&$3(" +)#".54>32!!!!!%3267.#"X;%K}Y22Y}K$>:E pe10ep,WWVX-oin&P '3@ JK.PX@#a [-K [+L@-a [-K [-K [+LY@)("!/-(3)3%$!'"'"$$$" +%#"&'#"&54632>32!3267'"3.2654&#"Mi^@;0/JK PX@,hf[*K[+K\'LK PX@)hf`[*K[+LK PX@*pf`[*K[+LKPX@.pn[*K[+K\'L@+pn`[*K[+LYYYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.1y XDEO.6w]ix|y GIDI5=V[vh 13B;7?I"%$n66/)%* X[]jgW*=3(%) ZSWe $&**3%( 0)^)+>@<;0/JK PX@$hc[-K\'LKPX@%pc[-K\'L@"pc`[-LYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.)i 6./.#.AEMoWVj f0/*.&&>LORN13B;7?I"% K_%$ @?FPO=( C>;P &**3%( 0%J1bl&6)&V\+o&7S 3+__&WScol&7vjKPX@)pY"KY%K\#L@'paY%K\#LY@ #! +3##"&=#53533#;i:LePbPNNs%%ES`f{{f,#o/@,aY"K#L +5!#3#'#535[x6rra a__9@6r  aY%K \#L +!#"&=#535#53533#3#;_PbPMMNNstt%(CS`'KZe{{eZK%."Jj&8>&XabJP&8>&XpbJk&8>&X]YJ&8>&X_Jl&8>&XbhJ2$]"JK*PX@"K[+K['L@_"K[+LY@ $$+"&5467.533265332677R#zUTRQz]`-   '033f\NN\gr +N>5%B@?"#J%K\+K['L  %%+"&54675#"&533265332673I&S2O^s120@s,  $23"5:!'XTB-28.$ )Ol&:9  &Z[ l&<~ >&\[8 a&<6el&=0&]u6ea&=0&]^6el&=0&]\83#7@4 Ja[*K[+L! ##&'"+467!.#"'>32#".267!3 dWJ]x 6Of:0UvGDsQ-5Td i@# ]iJ: 6U:UX.-T{bX]]Pl&'<P&'=&&G=;P&/-HP>&/MYC>&OMP &1-P>&1MC>&QM;Jl&8>&X\IP&.%&pP&'=P&']&&G];l&.%&uM3l&&&u1b&6S 3+)&VSo&7S 3+__&WSc P&< >&\pR> @%K\'L !#++53265R\<&+& \Td&*(@@=Ja[-K[+L +#"&5467!.#"'>267# ku#=T1ktR@2.8 frU-< :w>^?!m EC,?Td6318* z@Js"L+3#'#ylfBCeSS* y!@Js"L+'373kfAAgk PP.X !@`"L   +"&'332673KGXYFL;"";L(2@Y"L+53(z2pp$  1@.cW[O     +"&54632'2654&#",;;,-;;- 8.-99-.8<57EJK PX@f\'L@r\'LY@  +"&5467332671G,#c,  %./"7 -M#&Q^@ JGKPX@h["K["L@p["K["LY####+54632326=3#".#"#.+  L)*" &1@ /?& @Y"L+3#%3#rsauc u(`@UYM+53(zpp$.?o 0+!!5-5!!/jimjCD0+332653#5#"&'Cs020AsnP-* +38.$> ( =0+3#5!#;#"&=#dFL#9DB}gg-gDNP5l&(uP5a&({=@: JcYK[L#$! +!532654&#"##5!#>32#!=BGK(Kz9Q'zki.7906rr [vv[Pn&|3+3 4@1Ja[K[L(%"#+.#"!!3267#".54>32xUQQj  jSPTwHxV0/VxI6N_\i^`O4cz*VZWW,u1b6P,'f&,3+E- 'iKPX@ cYK[L@*cYK[K[LY@ #!' '!'$! +7>45!32#!#+5326%#32654&הwp`e4",6oD9:(kv}9jskl6)]]W#vct.3;77P>@; caK\ L$! +33!332#!!#32654&Pz7zwpBE9;jsklH3;777@4JcYKL##+5!#>36#54&#"#9 V.}uyAJ(Kz6rr ivìH@6Pl&.Pl& |i&zPq MK PX@gKZL@sKZLY@ +##5#3!uzIX6$Pa 6@3cYK[L   !+3!!32##32654&Puw{pA:;n_kkd//34.Pg%P@YKL+3!!Pr q3@0QYKYL +3>7>45!3#5!!# D +^v2rEZgf$32#"&'732654&+532654&WHQyzw88;C~ x VKJN?Cfg>6EEC9cqba7L IC_mni;B53--g/+-2P $@!JKL +!#33'yQXPi&P. !@YK[L!'+7>5!##+5326z`e4",6(kv}9X6)]]W#vct.P60P+32P!@YKL+3!#!P3532#2>54.3"yEyY44ZyDxEyX33XyE+M9!!9M":M*+M9"Q"FlKJlE!MM"ElIJmF"Q#+E12D*1F+i*E ;Pq )@&RKZL +3#5!3!^vzI66O)@& JdKL#"+32673##"&=3CP(H"zz T0uzHB2X  lzP %@"KZL +333333Pzzz66XPq -@*RKZL +3333333#5Pzzz^u66 6@3cYK[L   $!+5!32#!2654&+9woD:;C6rjskl663;77P0 4@1cK\L   $! +332#)3%2654&+Pzwofz1D:;CjsklXl3;77Pa *@'cK\L   $!+332#!%2654&+PzwoD:;Cjskll3;77/4@1Ja[K[L&%"#+?3267!5!.#"'>32#"&/x ]PTd  `SJ`wqGtS-{9Ka]j^\G<kq*VXpP"sKPX@!a[K [L@)aK[KK [LY@""  +"&'##33>32'2654&#"vzzvJ{W00W{Jcnncdkk 厗.XTVX-nnoon(\ 2@/Ja[KL&+!#5##.5463!";5\zDHp*B;:CgSkll5977.D2(R@ JHKPX@[K[L@c[LY@#!(("+%#"&=4>7>7>322654&#"|jz|'Hh@0R" $Y+V\[1\o<=>96LEpOWwK% k  Q\%(uQDEH>1QNC C@@Jc[K[L   ! +332##32654&#32654&CS[)+&RZgk%"!uv( "A@< 9+@JotC@YKL+3!#CKfz4+@(QYKYL+73>7>7!3#5!#3#4uJpqęfC)%wc솆c':1W$H6@3JaK L +!5##'3353373#'#A5zr8p8s~|5彽#(D@A&%Jc[K[L#! ((+%2654&+532654&#"'>32#"&'734'0NO*#+.39 htZ`g'%'0sdcp i8R#R",(LQM@#7 5.HOUN%0C @ JKL+3#33#uoypMOC&TX 3+C -@*JaKL +33373#'#CsD~C似!@YK[L!'+7>5!##+5326nvsBQ4$MQM~:84_Mf(C '@$ JKL +333##CmpkrpC '@$aKL +33353#5#Csss乹&RC!@YKL+3!##Cs~C>S&F!@YKL+5!##s~ff~ >\&>%2?M@J7J K [K [KL53(&;93?5?.*&2(2%%A8A +:3*##5*#.54>7:35"&#263>54&:"#6^C''D_7q7_C''E_8  ?KM>]> =]>?[;JKKI2IKKK [Cz8 )@&RKZL +3#5!33Jp{s~,/@,JdKL##+!5#"&=3326753W;#Z`t2/*s OT.$C %@"KZL +!3333`st~~Cz--@*RKZL +3#5!3333Jpst~~@ 0@-cYK[L  $!+!32+##32654&uT\YYc]\2%&RQRY}&%% C<@9 cK\L  +!3!332#'#32654&ssrT[YX]]1&'RQRY&%% C 0@-cK\L    !+3332#'#32654&CsuU\YZ]]1&'RQRY&%% $4@1Ja[K[L$%"#+?3267#53.#"'>32#"&$h :33<;218 frYh{zkap&1;9W632#"&'#%2654&#"CsU|`ll`} U?;@@;:DE`hwvmbWQKKOOKKQ% 2@/ Ja[KL"+46;#5##7.35#".bWsThu48ll)++DMSK" "$&HCD$z%K@H#J a_K[ KL"!  %% +2+532654&#"##53533#>N*B-2M5(:2/7.BsLLqRBnR_P#afqT80'M44M!&C&u#4@1Ja[K[L$%"#+.#"3#3267#"&54632g643? ?135 hn]hhbjJ"4=6W6=2%G[z{\)V@L 7@4YKKL   +533533qOps2oooo>M'iK"PX@ cYK[L@*cYK[K[LY@ #!' '!'$! +7>5!32+#+5326%#32654&nppU\YZAQ4$XX1&'MQMRQRY~:84_Mf(a&%% C>@; caK\ L$! +3335332+5#%#32654&CssqU\YZYY1&'乹RQRY&%% ;@8 JaK[K L## +3#53533#>32#4&#"CLLqQ2Oas23.C'M44M"'XT+.160C&uC&Cc >&\TF 3+Cz MK PX@gKZL@sKZLY@ +##5#33ps~ >@;ra c\ L! +3#5353!!32##32654&ɿx(ثuwxr?89iXXiy^nhc--33/::@7 cKYK\L$! +3533#32+##32654&qtU_]Ynkk+&'aUDRQGx 3!>@;a[K[L!!  +".54>32"!.267!J{X11X{JK|W11W|KXm  lYZn \ m -XVTX..XTVX-QeZZej[[j& >@;a[K[L     +"&54632"3.267#klmm3CA45A D wwwv;;:<>;;> !@J[KL!"+>;#"#3@F1 /B7r  !@J[KL!$+#3>;#"~y^2<+S62fP-GK PX@fYKL@rYKLY@ +3!53!PTtDRGK PX@fYKL@rYKLY@ +3353#Dpn  -@*aYKL +3#53!!3#PDD b=rb  -@*aYKL +35#535!#3#C99KڂWfyWPq6@3Ja]KL +33333#5##Pzf`v/eCz 6@3Ja]KL +333733#5#'#CsD~dOp C似Pq0@-a]KL +33!33#5#!PzKz^vbCzF0@-a]KL +333533#5#5#CssKqM乹 < >#@ JKL+#53s}X /@,JbKL+!5#53333#쏿~at9a >+@( JKZKL+!##5#53333}q]}yZXatPh)@& JcKL#"+%4&#"#3>32#BP)G"zz!S0tzHA lzCK3>(Z3&PS&1d 3+C`&Qd1Sb&6d 3+)`&Vdl&:3  &ZCl&:  &Zu2a&:G  &ZjP5j&($&HaJ l&< >&\CH^ ,@UYM+!5!,2 i.C@UYM+%!5!2f.iC@UYM+%!5!i;fB $@!HUYM +#5467ŃHA &'BGB$ 7 @GY"L +53'>=HHA '&$BGB$ 7g @GY#L +353'>=HHA '&CFB# B 3@0HUYM   +#5467##5467I@ '&HA &'BGB$ BGB$ 7 +@(GY"L   +53'>=353'>=HHA '&I@ ''$BGB$ BGB$ 7g +@(GY#L   +353'>=353'>=HHA '&I@ ''CFB# CFB# 0 MK2PX@a"K#L@UaYMY@ +#53533#̜o ddM0eK2PX@ a a"K  # L@% Ua a Y   MY@ +5#535#53533#3#̜o cddc8$ @[%L  +7"&546320EE01FFF11FF11F8x&'" '3?KKPX@1 c    d[*K  [#L@9 c    d"K[*K#K  [+LY@7A@54)(GE@KAK;94?5?/-(3)3#!''   +"&54632#32654&#""&54632!"&54632%2654&#"!2654&#"KddKN^^ QQ.%))%%,,}KddKN__#LccLM__B%**%%,-%))%%--9^`]^^][c45243354h^`]^^][c^`]^^][cU4524335445243354 (IJK&PX@ %K#LK.PX@ Y%L@UYMYY+3#'zy% -=JK*PX@ %K#L@UYMY@ +?'3%z yO@"K#L++3>II$x QKPX@c[%L@cW[OY@     +"&54632'2654&#"PZZPQYYQ&))&%**^][``[]^K4<<44<<4({ Z JKPX@rgUZN@rsUZNY@ +#5#5733#'35PUӪ~++ՀKQEE4qm@ JKPX@ac[%L@!acW[OY@ +"&'732654&#"'7!#>32BRT'""#&! S-32'"32654&RWYN?LS"'. 2#BLRJ)'!%%W`c\-1538:9B2c*@'JsUYM+#5!W1OY,t#/A@> JccW[O%$+)$/%/##*"+#"&5467.54632'2654&#""32654&tXLPT!ONNN#&!!&$$$$%('&%''5:86) )1982& )P?+n$q@ JKPX@cc[%L@"ccW[OY@ $$ +"&'73267#"&54632'2654&#";#"##9 F'#%/LpnA"#k+*,GI.J@GJI  a a[*KY#L.-*)('%% +%#!!5>7#53.'#53.54632.#"3#3̝!U+3tiN-kiq v365<ڸ "5jj;&RR _mcQ(79.  R Y1O@L+* Ja  a[*K [ + L11/-(&%%" +753&45<7#53>32.#"3#3#3267#"&'CCKjeyo ;86D  B9:= m {enN Nvxc`-9A@N N@D9-`ezw=W=I@F= Ja   a[*K [+L;94321%%" +%#"&5467#53>7>7#5!>54&#"'>763#3!3267; xhg:  'l423@ s}fcu8 ' >25? LcUY O   O &/,(OZ]P!O   O +*0(:P +@(aY"K#L  +!5!5!##PzVRjjH$_J@G  ca  ["K#L  +#3##5#535#533232654&#ptTTTTn|}A;XqqX>c>fihj?:459%"0+%#"&='>7546323>54&#"rMXR$ 5YCCGkP''N+*ffNe$  NQTLDS1U+"%]&&P !% @ $" 0+"&54632##332654&#"!5!g?VV@ATTy=y ""oOQNPPNOQ +)(*)))+Y"h 0+5!##5373#5#'"*jVrRNpQNBQ[MM@ָ2$  0+%#".54>32!3267"!5."nI^74[JExX3%}OWLy%#t]m2]SN~X0.RsD7:BNE=6197y&' u3+s3+C~&'{3+s3+0&'~3+t3+=&'v3+t3+>& 'x3+t3+Qm&'O3+t3+X 0+!!XFGkFlHK 0+!'3'ZFXHFG  0+!'7'7! FGuFXHK 0+!737dFlHFGx U 0+!!#MddUcdLU U  0+7!5!#U@ddVcAb/e[i 0+73!5![Mc@b/Mc0b@cxi 0+7'3!@cMb/@Mec$0+!5!pwffBW 3r0+!!W$rh:~!-9 3.*$0+#"&'#".54>32>323267.#"%"32654&*@)232673#".#"#>40-gLG41.fNK40-eOD40-fNHYH[ KWHZV4O 0+?#537#5!733#3!~"32>54.53'733Rd88dRRd88dRCqQ--QqCCqQ--Qqvg*ag8dRRd99dRRd8B/SsCBsS00SsBCsS/O=BZO%'@P@M=/.J ccaW[O<;:931,*''  +2#".54>"32>54.4&#"'>323!57>Rd88dRRd88dRCqQ--QqCCqQ--Qq% #.W XNKU26f%$8dRRd99dRRd8B/SsCBsS00SsBCsS/!'!;MK<3D'GPRz+%'De@bA ;/.J< I  c a  ccW[OCB@?>=9731,*''  +2#".54>"32>54.#"&'732654&#"'7#5!6Rd88dRRd88dRCqQ--QqCCqQ--Qqs^VL^ X/-(,,+"DHK8dRRd99dRRd8B/SsCBsS00SsBCsS/sENB< "DgNX]>%'255,JK PX@3ph  c bW[O@4pp  c bW[OY@43210/.-+*)(''  +2#".54>"32>54.#5#533#'35Rd88dRRd88dRCqQ--QqCCqQ--Qq8]ɉ778dRRd99dRRd8B/SsCBsS00SsBCsS/[VNN%'Ff@c>9 8,+J  c a  c cW[O)(B@=<;:640.(F)F''  +2#".54>"32>54."&'732654&#"'7!#>32Rd88dRRd88dRCqQ--QqCCqQ--Qq@M` Z 0%(++() Y' 2?\\8dRRd99dRRd8B/SsCBsS00SsBCsS/?; $"" R\ AKFQ%'@Li@f218J  cc  c  cW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54."&54632.#">32'"32654&Rd88dRRd88dRCqQ--QqCCqQ--Qq@]dhZKUZ(&.8:*B`_U&0-)&.*8dRRd99dRRd8B/SsCBsS00SsBCsS/lntv:6>BCDCR%'.Q@N-J pcaW[O(((.(.,+*)''  +2#".54>"32>54.#5!Rd88dRRd88dRCqQ--QqCCqQ--QqW8dRRd99dRRd8B/SsCBsS00SsBCsS/XW]%'?KWj@g:.J  c  c c  cW[OMLA@)(SQLWMWGE@KAK53(?)?'' +2#".54>"32>54.2#"&5467.546"32654&"32654&Rd88dRRd88dRCqQ--QqCCqQ--QqC[Y#"'`Z[b%#!]X+./*)-,*.21/,138dRRd99dRRd8B/SsCBsS00SsBCsS/SD:%- 2%;KJ;%3 1!9FO%'@Li@f821J  c   c ccW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54.2#"&'73265#"&5462654&#"Rd88dRRd88dRCqQ--QqCCqQ--QqD]chZKUY(&/8;)B`_T&1/(&-)8dRRd99dRRd8B/SsCBsS00SsBCsS/Tlntv:6>BCDCR%'3:NK"PX@ 8 76 J@ 8 76 JYK"PX@.  c   c cW[O@4  c   ca cW[OY@'<;)(FD;N"32>54.2#"&546#'732>54.#"Rd88dRRd88dQCpQ--QqCCqQ-.Qq=JJ="32>54."&54632'2654&#"Rd88dRRd88dRCqQ--QqCCqQ--QqCYeeYZddZ-33-+558dRRd99dRRd8B/SsCBsS00SsBCsS/rpnttnprQBOOBBOOB%+;@8c_[%L! '% +!+  +2#".54>2654&#"7"&54632Rd88dRRd88dRZddZYeeY+55+-338dRRd99dRRd8rpnttnprQBOOBBOOB`'0+!%!!`fm%,`3 0+7#!!3!!^_>=m-9/*p5} 40+7#4^_>w/*p% 0+2#".54>!5##7#Rd88dRRd88d@7ga*gv8dRRd99dRRd8PdZB>%," 0+2#".54>!5#7>54&#">32Rd88dRRd88d$%Pf61UKNX W.# %8dRRd99dRRd8+zRPG'D34&75!3>32#"&'326Rd88dRRd88d LHݑ!+--(-/ X _LV_8dRRd99dRRd827<^XMkB! 535##3'7Rd88dRRd88d778dRRd99dRRd8[N V[%2  0+2#".54>2654&#"735!>32#"&'Rd88dRRd88dUT\\?2 Y )(++(%0 Z `8dRRd99dRRd8QFKA \R ""$ ;?%,8 2-& 0+2#".54>2654&#"46327.#"72#"&546Rd88dRRd88dUT_`B*:8.&(ZUKZhd\*+/&).18dRRd99dRRd8RCDCB>6:vtnl! % 0+2#".54>35!3Rd88dRRd88d&i8dRRd99dRRd8R]W%+7C @ =81, 0+2#".54>"32654&'>54&2#"&546"&54632Rd88dRRd88dRW]!#%b[Z_&"#X[*-.)*0/+/23.*318dRRd99dRRd8F9 3 2%"3267#"&'32654&"&54632Rd88dRRd88dQT_`B);8/&(YUKZhc]**.&(/18dRRd99dRRd8RCDCB>6:vtnl %&2 @ ,'!  0+2#".54>"32654&#7%"&54632Rd88dRRd88d=JJ=>IILT 18dRRd99dRRd8baabE;>H9YY99YY9'>\0+#[p46*>_0+3+p64H>  0+!#3%3#HgppGGWWW8>  0+!53#5#3ppFFjWWWe '*@'J[*KY#L('+!53.54>323!5>54&#"*>(ڌ)oa_xd'LA0 t`%]J{V0.UyJ^*`s 2AM&hyy; #@ GUYM +53'>7Bw4? ! aH  @  0+3#%3#3+53265phRphsTWH,**`Ve,, 0+533533V-Us*0+ # #̀X;; * ("0+74>32#"&32654&#"32654&+;#?X4bs869B~hrxpj:D:14IG45CJ?j6R8fR3MMEanqmC3,+7A@;:597.'0+%'.546?>54&#"'>323267 x[ZmJN@.&*%,8 gnVYaSI?,"4'0< LLJG;D & DHQ>>A '%(4J 0+!5##'333373#'#A5zr8p8s~|54(%0+732654&+532654&#"'>32#"&l ?.6A?6\Z3<7.-Ag|Y^o567=h^v%,+930:_6-.6.+OReV5PN?_kV>X>&XTU3+CN 0+# #OyvyCQC6P>zB0+!5#"&53326533#5S1O^s110AsKp=!&XTB-28.$,0+#5#"&=3326=sI*O]t*..<ZW(20*>0"0+#5#"&'#"&533265332650oN1;L[4M_s/1,@t/1,@>!'1%++XTB+48.%+37.%>z{&0+3#5#5#"&'#"&533265332650KqIN1;L[4M_s/1,@t/1,@>!'1%++XTB+48.%+37.%I 0+%#"&=#5!>3232654&#"Iq`cmD'#A19'/45.&:ZpmWg-C>.2:3,3++= 0+73>32#"&732654&#"=pD'#B1r`cmp:'/45.&;*-C-ZpmL.2:3,3++(("0+%#"&5467'.546;#"2654&#"~jhfH "'KB f4K<;>9;@Bn|q]l 5!69b ;dMBDKLDBLYc°3+!0+#53267#"&546?>=L{'-!#639? s {opn>$)E%/(#&/5+RhjSEK$ n(:aa3+%n-:bb3+ n :mbb3+%n:{bb3+.'YKK3+.(KK3+.(iKK3+>4M'#0+4>7.74>7.>%?X2:%C3gP:3W>#%?X2:%C3gP:3W>#Ovc&GSexDEG&fyMOvc&GSexDEG'fyB4Q'#0+'>54&'7'>54&'7Q%?X2:&D2jM93X>#%?X2:&D2jM93X>#Mwd&G UewBBG&exOMwd'G UfvBBG&ex>l0+4>7.>%@X3>'E2dU>3X?#ROn[&K M[nA}GK&_qDr0+'>54&'7r%@X3>'E2dU>3X?#JOn[&K M[nA}HK&_qHK0+!#3Hcfede8;0+73#5!!8e$0+5326=46;#";#"&=4&#+8XSF5+'****'+5FSX8+h/>acOe%3e/2$0+#"+5326=467.=4&+532;+8XSF5+'*++*'+5FSX8+/>^dOe$6a/>M'#0+4>7.74>7.>%?X2:%C3gP:3W>#%?X2:%C3gP:3W>#TOn\&FL]qDEG&^qNOn\&FL]qDEG'^qBQ'#0+'>54&'7'>54&'7Q%?X2:&D2jM93X>#%?X2:&D2jM93X>#NMn]&G N]oBBF&]pOMn]'G N]oBBF&]p'\0+#[pLN*_0+3+pcNLH  0+!#3%3#HgppGGcfWHWW8  0+!53#5#3ppFFWWWH&0+3&lcf&0+#3lkcfp0+3pgcfp0+33pgggvv6G#dd3+>k""3+2  0+"&54632.#"2654&'Y *UYVY , ^.Lx z|y1N $f  0+"&54632'2654&#"ETOOTTOO nwyzvvzyw$f  0+"&54632.#"2654&'E.TUTU ) ^1Pz {|y+G 2m  0+73'733!V;px]p5P&Z)o  0+!#5!533#%!tLM2]ieW;KM3/*22,/1a31256014/X$xor r3+/plyt t3+4lqst t3+,okts s3+({lt t3+4qks s3+.qps s3+2cl t t3+,tq t t3++np s s3+$9x 3+/<py 3+4<ls 3+,7ot 3+(<{ 3+47q 3+.7q 3+2<c 3+,6t 3++7n 3+lP5lPl&3l |l&P0b&W 3+/l&Pl&(\l&.$C&u& >C&u 3+$&uC&u%&u$-K2PX@ Y"L@UYMY+3#Ek?Ml@UYM+3#ysol5l@UYM+#'^psll@UYM+3#%3#~ui pl(l@Jri+3#'#|vt@@tlKKl@Jri+'373us@?tuKK"Qk LKPX@fW\P@rW\PY@   +"&'332673MGWXGL<#" 2? *PP@UYM+!5!P&U3da*@'UYM+533533oSommmm!a@UYM+53!|qq*3 1@.cW[O     +"&54632'2654&#"8ML99KK9 !!H99GG99HE#""#i AKPX@fW\P@rW\PY""+332673#"&d#*+"eV\[Xi"''"KNNVJ$b;(< C3   E]     4,  } v d x >K  <w < 1  O Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo Sans MediumCoFo Sans MediumRegularRegular1.001;COFO;CoFoSans-Medium1.001;COFO;CoFoSans-MediumCoFo Sans MediumCoFo Sans MediumVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590CoFoSans-MediumCoFoSans-MediumCoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Designer: Maria Doreuli. Team: Irina Smirnova, Elizaveta RasskazovaDesigner: Maria Doreuli. Team: Irina Smirnova, Elizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comCoFo SansCoFo SansMediumMedium  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni0000uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecomb dotbelowcmbuni0394Sigmauni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni0492uni0493uni049Auni049Buni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04BAuni04BBuni04D8uni04D9uni04E8uni04E9uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Auni200Buni2012uni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089liraEurouni20B4uni20B8uni20BDuni2113uni2116 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdownuni2196uni2197uni2198uni2199uni2206uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni2610uni2611uni2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi3008uni3009uni301Auni301BuniA7B6uniF6C3uniF6D4uniF8FFCRI.altuni00CD00A40301 uni0407.alti.TRKuni00ED006A0301 uni0457.alt uni041B.BUL uni0432.BUL uni0433.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni0438.BUL uni0439.BUL uni043A.BUL uni043B.BUL uni043F.BUL uni0442.BUL uni0446.BUL uni0447.BUL uni0448.BUL uni0449.BUL uni044A.BUL uni044C.BUL uni0431.SRBexclamdown.capquestiondown.capguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap hyphen.cap endash.cap emdash.cap dblparenleft dblparenright parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.capdblparenleft.capdblparenright.cap uni3008.cap uni3009.cap uni301A.cap uni301B.cap slash.cap backslash.capbar.cap brokenbar.capat.capcopyright.pnum_lnum zero.zerozero.tnum_lnumzero.tnum_lnum_zero one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044D0301 uni044E0301 uni044F0301 caron.alt acute.cap grave.caphungarumlaut.capcircumflex.cap caron.cap breve.cap tilde.cap macron.cap dieresis.cap dotaccent.capring.capCyrbreve jkklnoop%&)*45=>CDLMWXXYZ[[\ bTDFLTcyrl6latn BGR .SRB N    .AZE .CRT .DEU .MOL LNLD lROM tTRK       aaltncaltvcase|ccmpcrcydligfraclnumloclloclloclloclloclloclsinfss01supstnum  BJRZbjrz "*2:BJhpx>@D$<<$V  L  D v     V  2  n0  P# $$$$%%"%@%^%|%%%%%%V{|W}~ZptuqSTUVY]o^_`abcdefghijklmn\wxrsV #,>?@CL^_`chjkmpu{!"[\]^abpNOPQTyz, /v gedff  gedffSTUV!"STUV!"6",-MX-[M,LL*]^_`abcdefghijklmn (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $4styy  6Lstyy styy "8Ndstyy styy styy $:Pf|styy styy styy styy &<Rh~styy styy styy styy styy (>Tjstyy styy styy styy styy styy  *@Vlstyy styy styy styy styy styy styy " ,BXnstyy styy styy styy styy styy styy styy $ .DZpstyy styy styy styy styy styy styy styy styy  T'{|v}~ptuqwxrs' #>?@C^_`chjkmpu{[\]^abNOPQTyz  F yst   yst   yst     F         st yy  $   70t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF| (!'A&l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~)t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF|l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~ >A{}*4>HR\fpzccccccccccccccccccy~,O,O\\pppppYpY+, yst      WY\,, pp   xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernv~     !#%')+-/13578:<>?BEHJLOQSUWijklmnopqrstuvwxyz{|}~X]  @(.DZ Bd(NtH^d^"0:Dfx2HHHHH  ( 6 P V \ P P  >   B H b l v  P B   T j p z V B B  6 V 99;Y[Y `   }@BI 9;|~ 9?Y|d||~ "9?| |~9|~ "9d} 9|~ 9;|~ |9;[ 9;?|~ [| " ;[|~),A 5+6$ =& #[w!3F/,/  | '(83'.  #9IYw "| $ 9?HY ("..@2(., " #I  #?Y99;9IY9Y[EKNOD,2,2YI6MLPQSUWBY2Z2 42=(G222IBMLPQSUWB%  4=0GHFGHJRTX),A 5+6$  (*,.02=AINR "q}|~q| q}|~|~ "mm?f|~tttm " q}_fo|~ q}|~n ^_`jo|m  bf #?^_`jo"  @"4?@ `  ,2m}vvp*v"3"L,[9Y&IY\bf^bf^`j9 9q}x 9}v9; "#%)379:;<=>?IY[\^cdegw!#%35678:<?LUWXklnqrstuyz|}W\]^_fghoq{Z|`u  882f& s  v z $        6 A&C  2 {   %gcg#@&"!bb ABHCDKKEFGKKHHIJLMNOP QRS^TUVWXY^ZZ[R\]_>`?a eAAAAAACBCCCCKKKKHKHHHHHHMMMMOQQQQQQTSTTTTWWWWZ[[[[[[aRaAQAQAQBSBSBSBSH^H^CTCTCTCTCTDUDUDUDUKVKVKWKWKWKWKEXEXFYG^G^G^G^KZKZKZVKZH[H[H[CTI\I\I\J]J]J]J]L_L_L_MMMMMMN`OaOPPPHPEXXEXXMCTPCTH[J]L_OaX[ll'mk(rr)*+nrsrj,umqlnurrnrrror-kms./qrrqprpoorv0~yzz{{x{6~~||{{yy7x8||wz9:o{;m<mnzq~tt=wo{o{KZJ]N`N`N`CTOacchihi geErWXj23z4z5ww~~}}1ffddd$ jlrosroorvy{{{QP*G*:5DKTWVH9>=RJ<O34%7L  F r&   @ASMsI rrrr          rrrr r&               %%%     & 'h\ (ZX-'' (]Y[ -/+mttU"0,ttt!tt"tt"#$"jt`tt#tt,t1""t"fqgp!ttt$tck'"d.tttt).).e'"   s?Nr^n_0o22ltt2a22#bi;CBE86'(-/+"t"$t,t1;   "?DS2UWBY^EccKmmLstMwwOyyP{{QRjq'))++--//113HJZ irt'TUV]_bhmns W[]beiloqx{{}}ideoromnDFLTlatn$ ` `դ'ח% חPKwL\V  Blimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Medium.ttfnu[0BASE/;PFFTM\ GDEF$&'GPOS~ERTLGSUB,v(T*OS/2aGq`cmap Hcvt O<Xdfpgm( gasp'glyf3$Xheadx<6hhea\t$hmtxz 0loca"N6maxp  name92: postmAJprep}woA/K5_<ח% חBkS(8w1aXKX^" COFO   (dM1YE F.h")E?D H'.8B2p'(#/5F!>54"UVUu6P3PsPbP3PPPFPPP3P3P1J   6HB8B-*..FC&E& $nD(=C@ CCtC=C(&FCF&gC)};>    0Gp2@1YPC#GpS6+;>d$1 O:4p2*H4,*$(IC'/}#1%0*=3sPsPsPsPP P33333Y3JJJJ PLC......I.& $ $ $ $C-"=C(&(&(&(&(&H-&;>;>;>;> EC ...3&3&3&3&PE& E&sP $sP $sP $sP $sP $3D(3D(3D(3D(P= < OCP@P CFPCFP:FPCFPCS P=CP=CP=C=CP=C3(&3(&3(&Ot&PgCPg:Pg-1)1)1)1)}}yJ;>J;>J;>J;>J;>J;>    6060603BPP<&P]PChPP5CJ;>I.BPP<&I.3-&1)}  (**.($#5t#&($?@C`sPsP(P31P# 2PPP PPP(P sP1PPP PP3PP3 h. P6PP PP/P(.52CC@ $#>C>CC,C>C(&8CFC& & EC ,&C9CdCC$C% $ $,C #)@(;C=C>C 4C b3(&  ,PD(  PCPRC    P=C3(3(&P=C1)   sP $  @ P^*.. B7 7B7700\88"M M%y$(4.2,+$/4,(4.2,+9G=:$IP'"27C0=>Q X K  K x U [ x$W:FVUU>%>%>%>%>%>%>%>%>%>%>%>%``4>%>%>%>%>%>%>%>%>%>%'*H8Te;(d2*P@C4;.D(:>:> C =CsCN>,s>>m= (1YM M%1 1%.*..>B>DH82>B'*H8&&GpGpu6;>2$$25&)1.45/$/4,(4.2,+$/4,(4.2,+sPP3 P/P(. $>C(& C$C%$M5(r"*z*3!^**~7~37Y#_cuGc      " & 0 : D p y !!!"!.!T!^!!""""H"`"e$i$$&''0 0 927Y#brFb      & 0 9 D p t !!!"!.!S![!!""""H"`"d$`$$&''v00{uh[S;%"bAigY?93)!e/sleb^ (UA10F6Z V   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivokuj20r34ghlzcn1.m{b7wU[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-), .]-*, .q-+, .r-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpB-*B *B**B@ * B@@ *D$QX@XdD&QX@cTXDYYYY" *DdDrraa>>rraa>>2222\fPz*R`FdP  L v & L | : p & v  H p 4J6x2h.X6|84`NNpj2&"n@VZ,F.   * 6 B N Z f r !!t!!!!!!"@"L"X"d"p"|"#^$$$$($4$@$L$X$d$$$%% %%$%\%%%%%%&4&@&R&^&j&v&'N'Z'f'r'~'''''''(P(\(h(t(((()`)l)x)))))))****+,+8+D+P+\+h+t++,,,(,4,@,L,^,j,v,,,,,,--D-n-z------..Z.f.r.~.../D///00 00$000<0H0T1>11222 2,2223333*363B3N3Z3f3r3424>4J4V4b4n4z444445 55"5.5:5F5R5^5j5v555555555556 66*666B6N6t667747N778(8H8R8n8v888889>9P99999:4:::::;$;,;j;r;;;<(<<<<<== ==6=>=F=N=|>>>F>|>>??Z??@H@@@AJAhAAABLBpBBBCCNdNNOOBO~OOPPPQ(Q>QQR8RRS6SSSSSSTTT&T6TFTUUpUVVpVVWWTWnWWWWWX X(XDX`X|XXXXXYPYYYYZpZ[\$\]\]^x__`h``aa aVaab$brbbc^cddd2dNdlddeffffffg g*gBggggh2h:hJhRhjhrhzhhhi:iniiij(j6jDjRj`jnj|jjkk4kZknkkkl2ltllllllmm&m4mBm~mmmnnn.n6n>nTnnnnnnnooo(o8oHoVodoroooooooooooppp"p.p:pBpJpVp^pfpxppppppqq8qZqqr r2rNrrd>  0+!%!! '7d`222j:F%!Y,@)Y"KY#L+7353hp#˄ExDK2PX@Y"L@UYMY@+333P v \ v ))FK2PX@&  sb   a"L@/r  sb U Y MY@+7#537#53733733#3##7#37#jqffhpfFbbbb).R#*1*@'/.('  J]#L+?5.54>753.'#5.54&'>.x =1pq";S1Pgn u 21qs{iPe}y2718%1;66,3[\.G2VVcQ $2Y\]cVU`&' /() -"F '3KPX@+   c  d[*K [ #L@3   c  d"K[*K#K [ +LY@')(/-(3)3#!''   +"&54632#32654&#""&54632'2654&#"KddKN^^ QQ.%))%%,,LccLM__M%))%%--9^`]^^][c45243354h^`]^^][cU45243354),6~KPX@43# J@43# JYKPX@[*K[+L@[*K#K[+LY@1/+)*#+!'#"&5467.54632>77>54&#"3267'&/&aAwX>n`\h[H!d 6!t? 192*+3\RE%@+81!icL\B&Ng`NL[Y)Bm&x2 5+'-03> 4E5K2PX@ Y"L@UYMY@ +3P x )?/l0+4>7.?$@X3>'E2dU>3X>#Ovc&K TdvA}GK&fzD/q0+'>54&'7q%?X3>&E2bV>3X># Mwd&K Vdu@HK&ez ieJ@ JK2PX@ Y"L@UYMY@ +7'7'7'37' Z)bb)Z Q Z)aa)Z il=F//G=lm>G//F>mHAB; ,@)UaYM +%5#53533#dAbb'g @GY#L +353'>=9I@ ''CFB# .YD@UYM+%!5!Y+h8@Y#L+3538B>@r'L+3B"kj2 -@*[*K[+L     +"&54632'2654&#"YVSSVUTT nwyzvvzyw  #@ J"KZ#L+73'733!D;Ȏ:nb^n'B'@$J[*KY#L%"+4&#"'>32!!57>B??R v|w2F*_GL.>FA`|w_-F;6irv1N(\D@AJcY"K[+L +"&'732654&#"'7!5!:32Aux SDLPWD."b~ ^c85>39-Zn[`hu#m (@% Jb"K#L+!#5!533#%!s@\\XjjI/T6@3JcY"K[+L$%$#+!>32#"&'732654&#"'!+ Q)w|w QBMGMH(Eq"8nlh~aW12@97>!b5^(;@8Jc[*K[+L$"(($%&"+%#".54632.#">32%"32654&^}QnBiu HAL^_?6]C&ENOEGLLhz0W|LĩXY&8dy"&5S;<99>=99=!%%@"JY"K#L+3!5!gFt8p>m#/>@; Jc[*K[+L%$+)$/%/##*"+%#"&5467.54632%2654&#""32654&m=423656>IJIKKMJMKTRMKQNaoi_>KM2]ieW;KL3/+12,/1a21267/245^(;@8Jc[*K[+L$"(($%&"+4632#"&'73267#".2654&#"5~QnBiu HAL^_?6]C&ENOEGLLhz0W|LĩXY&8dy"&5S;<99>=99=4&` `3+"g'` `3+U55I0+%%5%5 sɀsV4@]Y%L+!!!!V""ghU55I0+55%U psɀs!<@9Jp[*KY#L!! %*+7546?>54&#"'>3253'-!#639? s {opn>$)uE%/(#&/5+RhjSEK$̄6eG|ANK&PX@& AJ@& AJYK&PX@+c  c dW[O@2  pc  c dW[OY@MKGE(&#&$&(" +#".54>32#"&'#"&54>325332654.#"326754&#"326t>Vg9FuR.-PpB.^Y2#(22($1c3c^[g91[Py( (l\1K2&VN?eE%/TvEKsM'30<47<5 ,@) Jb"K#L + #'!#3?=iXr!Pg C@@Jc["K[#L   ! +3!2##32654&#32654&P#hz,9A6q B7432.#"xQW xJxU.0VxHxTP`klcK>nt.YTVX-vk;MqoP'@$["K[#L !+3!2#'32654&+PqlmqowntqP5 /@,aY"KY#L +3!!!!!P]hlilP5 )@&aY"K#L +3!!!!P[mj3#l@ JKPX@a[*K[#L@#a[*K#K[+LY@##"$%(#+#5#".54>32.#"326=#5g$h?JyT.2X|JzyUKcqpeQgQC#*/YSWX,mk6HqpN5bP '@$a"K#L +33!3#!PzKzzXP@"K#L+33PzXE @"K\#L !#++53265EeeaI44#jap-5P -@*Ja"K#L +3333##PzfeP,@"KZ#L+%!3,$zrrP6 .@+ Jp"K#L +%#33#rĬw>)X*P @J"K#L+!##33wWv3-@*[*K[+L +".54>32'2654&#"J{X11X{JK|W11W|Kennedoo -XVTX..XTVX-mnoonPa +@(c["K#L $!+3!2+32654&+P"pwB<;Cmmlp]:6;53)s@JGK PX@h[*K\+L@p[*K\+LY@%#)) +".54>32''267'3>54&#"J{X11X{JK|W1C9AUH> p~L""nedoo -XVTX..XTb+U?b kf d?oopP| 3@0Ja["K#L !+3!2#'#32654&+PpE?C;;CmmNe^96;51b''@$J[*K[+L+%+#+?32654&/.54632.#"#"&1y XDEO.6w]ix|y GIDI5=V[w66/)%* X[]jgW*=3(%) ZSag^o!@Y"K#L+5!##[z6rr6J@"K[+L##+3#"&53326zzUTRQgf\NN !@J"K#L+!33ƀX '@$ J"K#L +3# #3^yч}X  &@# J"K#L +3373#  铧[M #@ J"K#L+!533񏾽:P6e ,@)JY"KY#L +35!5!!6n+hrpq9pH>K#@ aY'L+!#3He4eB>@r'L+#3lk8>;@aY'L+3#5!!8]ej-B!@Js"L+# #aw~|xf>@Y'L+!5!3h. @Y"L+#3ph.)KPX@ J@ JYKPX@c[-K[+L@#c[-K#K[+LY@'%!%#D#+!5#"&5467654&#"'>32'&3265gK0I^cT">2((. j hWVrp:'-*#3B7"LDKE&*&("AUO` !1(CyKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@&#+33>32#"&'732654&#"CsQ(+L9!}a-GH57A@92J% >]={14>RHFRA<&'@$J[-K[+L$'&#+%#"&54>32.#"326}jl]h$>V22K3g239@>:32J]|>_? ,< !4QJHS2&!yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@ (#+!5#".54>3253'54&#"326K3.P:!":!#!?_<=_@!X8;@QHETI$7@4Ja[-K[+L&%"+%!3267#"&54>32'"3.B524gi^m}%?U1hr,A 5BE.32#4&#"CsP1Oas23.C &XT+.160@,@)Y"K%K#L+533@zws2pp>3@0Y"K%K\'L +53+53265IzR\<&+&2ppN \Td&*C 1@.Ja"K%K#L +33373#'#Cs=>C@"K#L+33CsXC6"V JKPX@[%K#L@%K[-K#LY@""##$# +33>32>32#4&#"#4&#"CoO1:M[3M`s01,@s01,@?"'1%++YT,+38.+,38.CLJKPX@[%K#L@%K[-K#LY@ ##+33>32#4&#"CpQ2Obs23-D@"(XT+.160& -@*[-K[+L     +"&54632'2654&#"klmm<@@<:CD wwwvaQKKOOKKQC>f@ JKPX@[%K[+K'L@ %K[-K[+K'LY@&#+3>32#"&'32654&#"CrR1+M7!~b+FH57BA92J="% >]<|4?SHFSD<&>!yKPX@ J@ JYKPX@[-K[+K'L@ %K[-K[+K'LY@ (#+5#".54>325354&#"326G3.P;!";S10HntD3;C@;<> !?]<>_A!$8Z8;#"CoK"')1N@&h'*)''@$J[-K[+L+%+#+?32654&/.54632.#"#"&)i 6./.#.AEMoWVj f0/*.&&>LOheXo%$ @?FPO=( C>CTK__)@&rY%K\#L# +!#"&=#53533#;_PbPNNs%%ES`f{{f,#>ZKPXJJYKPX@%K\+L@%K#K\+LY@ ##+!5#"&5332653S2O^s120@s>!'XTB-28.$ !@J%K#L+333yvw   !@ J%K#L+333# # vcfgenjkbfo  &@# J%K#L +!'#7'373ssmif鞞 >"@ J%K\'L!"++5326?33? SK9*!- xx+W@f!a0 ,@)JY%KY#L +35!5!!0ifgf>$3@0Jcc['L$#!,!%!+75326=46;#";#"&=4&#+8XSF5+'****'+5FSX8+h/>xcPe%3}/p>@Y'L+3pgj2>$-@*Jcc['L%!,!% +%#"+5326=467.=4&+532;+8XSF5+'*++*'+5FSX8+/>vdOe$6y/@J,@)Wc\P#"#"+#".#"#>323267JNK64/ fMK72. Of*Ng*Y>@Y%KY'L+3#3#YaG#P:!*@'  J"K#L+!5.546753.'>7"_sv\MVeg 0*+. h dY2.+5] ok ][ZG#20E[[X;O * MCE(9@6J Ic[*KY#L%%&+%#!!5>54&'#53.54632.#"3Ȝ"U14sVkiq v365<  *Cjj H- R!H-_mcQ(79.)F%#-s}#/E@B #J HGcW[O.,(&!-+7'7.5467'7>327'#"&/32654&#"lIr  oIq76tIs pIq67<337733<-Jq8 8oIq sIs76pIp 4::45;:y>@; Jb  a"K  # L +!5#535#53333#3# lΏnkR;R^)R;Rkp>*@'aY'L+33pgggFrr69!3E-@*>1! J[*K['L%#%"+#"&'732654&/.5467.54632.#"'>54&/#wedr s;,/943LKU8,!ua`p r2..43)WKQ6+ $+12K&.-+P_WO +-("%" LL6N?,L\XN (.'"" MI6L<| 3 '-  4#$* +2^$@!Y"L+53353+pRq2oooo>'C@ A@43JK"PX@%c c _[-L@,cc c W [OY@)(><861/(C)C''  +".54>32'2>54.#"7"&54>32.#"3267J^66^JJ^66^J32'."3265 0#3=D;+M G<=IN##%%2+.. (5<<|$   ?@ JK*PX@ %K#L@UYMY+3#'%3#'zyo||O;@sUYM+!#5!Og{4-6( JK$PX@1 p  c  _[*K [ %L@/ p  c  a  _[*LY@'/. 20.6/6 - -,+*)#! +%".54>32'2654&#"'532#'#7#32654&1U?$$?U11U?$$?U1NgfNNggu107P.%%%$>V11V>$$>V11V>$1jNNjjNNjF'&#RJJ1 2A>-KPX@ Y"L@UYMY+!5!> AU*b} *@'_[*L     +"&54632'2654&#"FbbFHccH"00"!..b^KI^^IK^W/##--##/HBs aKPX@aaY#L@#aaUYMY@  +%5#53533#!!dbb323!57>'R SECL/.Mϟ7=>6-52KIk,o@  JK PX@!hfa[%LKPX@#pna[%L@)pnaW\PYY@ +2654&#"'7#5!2#"&'7#&'#  {$m5CWJBRT'9QGOF013!###1O77O1TiZ 8K*+K7 jI 3+'+!@ JK PX@hc\'LKPX@pc\'L@!pcW\PYY@ +"&'732654&5737?I"%*J%13B%( 01*&**3/p MJK&PX@rY%L@rUZNY@ +535'733Qh`*^_K;>UK#^ qKPX@[*K[%LKPX@c[%L@cW[OYY@     +"&54632'2654&#"GWWGFWVH%$$%"''TNLRRLMUJ/)),,))/%  O@ JK*PX@%K#L@UYMY@  +?'337'3&|hy 0&'3+t3+*r&'{3+t3+=&'3+t3+6!=@:JpY%K\'L!!+#53267#"&5>?>=I{'-""548? s zpoo=%(䄄F%.&#&-5+RhhSEI$l&$l&$ l&$j&$a&$d&$ 3+B@?JaaY"KY #L +3!!!!!!'#3 . )di oio3&21@*)JK PX@-hf[*K[#K\'LK PX@*hf`[*K[#LK PX@+pf`[*K[#LKPX@/pn[*K[#K\'L@,pn`[*K[#LYYYY@.,'% 22 +%267#"&'732654&57.54>32.#"xQW xl 13B;7?I"%$0VxHxTP`klcK>cs $&**3%( 0*VX-vk;MqoP5l&(zP5l&(P5l&(jP5a&(l&,P4l&,6El&,õ'a&,  7@4a["K[#L ! +3#53!2#'32654&+3#PDDqlmq&b owntqbPj&13l&23l&23l&23j&23a&2YR1*  0+?'77'YFEFFFF3'6@3%$J[*K[+L'' +".54>32.#"2654&'J{X11X{JK|W11W|)=%dqep8 -XVTX..XTVX-^.Nkn*H Jl&8Jl&8Jl&8Ja&8 l&<Pd 4@1cc"K#L   $!+3332+#32654&PpwC:9rlkno86;3C'&=@:!Jc[*K[#L &&+!#532654&+532654&#"#4632E><7AD97/+3817=t{mdp++;C{f529.c5(-/@6&hobU/JOHce.&DCN.&Du.&D[7.&DaO.&Dj@.&D_.%.5BKPX@ .JKPX@  .J@  . JYYKPX@$  a [-K [+LKPX@)  U a [-K [+L@*  a  a [-K [+LYY@0/@>9632/505"$%#D$" +%#"&'#"&5467>54&#"'>32>32!3267'"3."3265"i\Adg@K_cT"?0()0 j hW=SY0fqC603 o-A 7<(,,#1BES6,.4JEMD"*'("AV,#%~n)@G.93/= !.-&)4@+*JK PX@%hc[-K\'LKPX@&pc[-K\'L@#pc`[-LYY@0/(&"  44+"&'732654&57.54>32.#"32677?I"%"]q$>V22K3g239@>:32j SG13B%( 0't>_? ,< !4QJHS2"?Y #&**3$&HCD$&Hu$&H[6$&HjD&CC"&u&&&[&j"$0[@!J$  HKPX@[%K[+L@c[+LY@&%,*%0&0+'7.'77#".54>32.'2654&#"K"&"=bGCG;Z;3X@%"e;cG( =Z86X=!$;3RABMOB@QC&Qai&&RCP&&Ru&&R[B&&RaX&&RjPH.BL ;@8aaUYM  +53!!53~~̀Zh& 6@3J[-K[+L  +"&54632'7.#"2654&'kml #&XCY>&Xu>&X[J>&XjW >&\uCD=@:J"K[-K[+K'L&#+3>32#"&'32654&#"CsQ1,L7 ~c)EI17EC:.Kd"% ?^=z2;QHHR>; >&\jDV&$3+.&DpNk&$.&D]A5G@DJ Ib"K#K['L +"&5467'!#332673t7R'>=%2   'oi13"4X *N!.5.;S@P",Jc[-K[+K['L973/)' .. +"&54675#"&5467654&#"'>323267&32653I' K0I^cT">2((. j hWVr,  %P:'-*#3B23"52"LDKE&*&("AUO` )O !1(3l&& &&Fu3l&&&&F[93a&&&&F^3l&&&&F\9Pl&'{&&G &9)KPX@  J@  JYKPX@&a"K[-K [ +L@*a"K[-K #K [+LY@(&" (# +!5#".54>325#53533#'54&#"326K3.P:!":!#!?_<=^@!rL55L8;@PHEUIP5P&($&HpQP5k&($&H]EP5a&($&H^P5BF@CJ IaY"KY#K['L%& +3!!!!!3267#"&5467P]h!0!  &7R) lil +N/2"7$5,3O@L  ,Ja[-K[+K['L.-10-3.3+"&'" +#"&5467#"&54>32!32673267"3. %3I  m}%?U1hrB534c ,A 6231v=_?!n#BE-405308P5l&(}$&H\53l&*(4&J[G3k&*(4&J]W3a&*(4&J^3&*S 3+(4 +8@+JHKPX@) a[%K[#K['LK2PX@- a%K[-K[#K['L@* a_%K[-K[#LYY@751/)'!  +#54673#"&'7326=#".5463254&#"326Uw4? ! }l#?X4Vxn @%9GK3.P:!}c/JG39C@;9B~bH=D 5(:S3NN($6C: !32#4&#"C88qQ2Oas23.C'L55L"'XT+.160(j&,&a P&,&p%k&,&]5,@) J"K\'L+"&5467332677Q&z!+  '13"4X *N59@6JY"K%K\'L +5333267#"&546@zws+  $2J%2pp (O23"2Oa&,.C@%K#L+33CsPE&,-@>&LMl&-'>(&Y[P&.S 3+C&NSP,l&/5CZ&Ou"3+P,&/S 3+:&OSP,&/Cb&OP, 0@-a"KZ#L  +%!3753,$zwrrʱyyC}*@'a"K#L+33753CsUrXpp9 ,@) J"KZ#L +%!57379$CCyrr$f%-RgR  &@# J"K#L +355737VMMrNN1b1s1b1Pl&1C&QuP&1S 3+C&QSPl&1C&Q\UC&Q&3+PD/@, J"K#K\'L!#++53265#3a^B3,'}N]e\m,/ .C>X JKPX@[%K#K['L@%K[-K#K['LY@ !%##+4&#"#3>32+532623.CspQ2ObSV8 (& 4.160@"(XT\Ud'3P&2&&Rp\3k&2&&R]O3l&2& &Rb`O'KPX@ "!J@ " !JYKPX@!a [*K[#LKPX@5a [*K[*K[#K[#L@1a [*KY"KY#K[+LYY@&$3(" +)#".54>32!!!!!%3267.#"X;%K}Y22Y}K$>:E pe10ep,WWVX-oin&P '3@ JK.PX@#a [-K [+L@-a [-K [-K [+LY@)("!/-(3)3%$!'"'"$$$" +%#"&'#"&54632>32!3267'"3.2654&#"Mi^@;0/JK PX@,hf[*K[+K\'LK PX@)hf`[*K[+LK PX@*pf`[*K[+LKPX@.pn[*K[+K\'L@+pn`[*K[+LYYYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.1y XDEO.6w]ix|y GIDI5=V[vh 13B;7?I"%$n66/)%* X[]jgW*=3(%) ZSWe $&**3%( 0)^)+>@<;0/JK PX@$hc[-K\'LKPX@%pc[-K\'L@"pc`[-LYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.)i 6./.#.AEMoWVj f0/*.&&>LORN13B;7?I"% K_%$ @?FPO=( C>;P &**3%( 0%J1bl&6)&V\+o&7S 3+__&WScol&7vjKPX@)pY"KY%K\#L@'paY%K\#LY@ #! +3##"&=#53533#;i:LePbPNNs%%ES`f{{f,#o/@,aY"K#L +5!#3#'#535[x6rra a__9@6r  aY%K \#L +!#"&=#535#53533#3#;_PbPMMNNstt%(CS`'KZe{{eZK%."Jj&8>&XabJP&8>&XpbJk&8>&X]YJ&8>&X_Jl&8>&XbhJ2$]"JK*PX@"K[+K['L@_"K[+LY@ $$+"&5467.533265332677R#zUTRQz]`-   '033f\NN\gr +N>5%B@?"#J%K\+K['L  %%+"&54675#"&533265332673I&S2O^s120@s,  $23"5:!'XTB-28.$ )Ol&:9  &Z[ l&<~ >&\[8 a&<6el&=0&]u6ea&=0&]^6el&=0&]\83#7@4 Ja[*K[+L! ##&'"+467!.#"'>32#".267!3 dWJ]x 6Of:0UvGDsQ-5Td i@# ]iJ: 6U:UX.-T{bX]]Pl&'<P&'=&&G=;P&/-HP>&/MYC>&OMP &1-P>&1MC>&QM;Jl&8>&X\IP&.%&pP&'=P&']&&G];l&.%&uM3l&&&u1b&6S 3+)&VSo&7S 3+__&WSc P&< >&\pR> @%K\'L !#++53265R\<&+& \Td&*(@@=Ja[-K[+L +#"&5467!.#"'>267# ku#=T1ktR@2.8 frU-< :w>^?!m EC,?Td6318* z@Js"L+3#'#ylfBCeSS* y!@Js"L+'373kfAAgk PP.X !@`"L   +"&'332673KGXYFL;"";L(2@Y"L+53(z2pp$  1@.cW[O     +"&54632'2654&#",;;,-;;- 8.-99-.8<57EJK PX@f\'L@r\'LY@  +"&5467332671G,#c,  %./"7 -M#&Q^@ JGKPX@h["K["L@p["K["LY####+54632326=3#".#"#.+  L)*" &1@ /?& @Y"L+3#%3#rsauc u(`@UYM+53(zpp$.?o 0+!!5-5!!/jimjCD0+332653#5#"&'Cs020AsnP-* +38.$> ( =0+3#5!#;#"&=#dFL#9DB}gg-gDNP5l&(uP5a&({=@: JcYK[L#$! +!532654&#"##5!#>32#!=BGK(Kz9Q'zki.7906rr [vv[Pn&|3+3 4@1Ja[K[L(%"#+.#"!!3267#".54>32xUQQj  jSPTwHxV0/VxI6N_\i^`O4cz*VZWW,u1b6P,'f&,3+E- 'iKPX@ cYK[L@*cYK[K[LY@ #!' '!'$! +7>45!32#!#+5326%#32654&הwp`e4",6oD9:(kv}9jskl6)]]W#vct.3;77P>@; caK\ L$! +33!332#!!#32654&Pz7zwpBE9;jsklH3;777@4JcYKL##+5!#>36#54&#"#9 V.}uyAJ(Kz6rr ivìH@6Pl&.Pl& |i&zPq MK PX@gKZL@sKZLY@ +##5#3!uzIX6$Pa 6@3cYK[L   !+3!!32##32654&Puw{pA:;n_kkd//34.Pg%P@YKL+3!!Pr q3@0QYKYL +3>7>45!3#5!!# D +^v2rEZgf$32#"&'732654&+532654&WHQyzw88;C~ x VKJN?Cfg>6EEC9cqba7L IC_mni;B53--g/+-2P $@!JKL +!#33'yQXPi&P. !@YK[L!'+7>5!##+5326z`e4",6(kv}9X6)]]W#vct.P60P+32P!@YKL+3!#!P3532#2>54.3"yEyY44ZyDxEyX33XyE+M9!!9M":M*+M9"Q"FlKJlE!MM"ElIJmF"Q#+E12D*1F+i*E ;Pq )@&RKZL +3#5!3!^vzI66O)@& JdKL#"+32673##"&=3CP(H"zz T0uzHB2X  lzP %@"KZL +333333Pzzz66XPq -@*RKZL +3333333#5Pzzz^u66 6@3cYK[L   $!+5!32#!2654&+9woD:;C6rjskl663;77P0 4@1cK\L   $! +332#)3%2654&+Pzwofz1D:;CjsklXl3;77Pa *@'cK\L   $!+332#!%2654&+PzwoD:;Cjskll3;77/4@1Ja[K[L&%"#+?3267!5!.#"'>32#"&/x ]PTd  `SJ`wqGtS-{9Ka]j^\G<kq*VXpP"sKPX@!a[K [L@)aK[KK [LY@""  +"&'##33>32'2654&#"vzzvJ{W00W{Jcnncdkk 厗.XTVX-nnoon(\ 2@/Ja[KL&+!#5##.5463!";5\zDHp*B;:CgSkll5977.D2(R@ JHKPX@[K[L@c[LY@#!(("+%#"&=4>7>7>322654&#"|jz|'Hh@0R" $Y+V\[1\o<=>96LEpOWwK% k  Q\%(uQDEH>1QNC C@@Jc[K[L   ! +332##32654&#32654&CS[)+&RZgk%"!uv( "A@< 9+@JotC@YKL+3!#CKfz4+@(QYKYL+73>7>7!3#5!#3#4uJpqęfC)%wc솆c':1W$H6@3JaK L +!5##'3353373#'#A5zr8p8s~|5彽#(D@A&%Jc[K[L#! ((+%2654&+532654&#"'>32#"&'734'0NO*#+.39 htZ`g'%'0sdcp i8R#R",(LQM@#7 5.HOUN%0C @ JKL+3#33#uoypMOC&TX 3+C -@*JaKL +33373#'#CsD~C似!@YK[L!'+7>5!##+5326nvsBQ4$MQM~:84_Mf(C '@$ JKL +333##CmpkrpC '@$aKL +33353#5#Csss乹&RC!@YKL+3!##Cs~C>S&F!@YKL+5!##s~ff~ >\&>%2?M@J7J K [K [KL53(&;93?5?.*&2(2%%A8A +:3*##5*#.54>7:35"&#263>54&:"#6^C''D_7q7_C''E_8  ?KM>]> =]>?[;JKKI2IKKK [Cz8 )@&RKZL +3#5!33Jp{s~,/@,JdKL##+!5#"&=3326753W;#Z`t2/*s OT.$C %@"KZL +!3333`st~~Cz--@*RKZL +3#5!3333Jpst~~@ 0@-cYK[L  $!+!32+##32654&uT\YYc]\2%&RQRY}&%% C<@9 cK\L  +!3!332#'#32654&ssrT[YX]]1&'RQRY&%% C 0@-cK\L    !+3332#'#32654&CsuU\YZ]]1&'RQRY&%% $4@1Ja[K[L$%"#+?3267#53.#"'>32#"&$h :33<;218 frYh{zkap&1;9W632#"&'#%2654&#"CsU|`ll`} U?;@@;:DE`hwvmbWQKKOOKKQ% 2@/ Ja[KL"+46;#5##7.35#".bWsThu48ll)++DMSK" "$&HCD$z%K@H#J a_K[ KL"!  %% +2+532654&#"##53533#>N*B-2M5(:2/7.BsLLqRBnR_P#afqT80'M44M!&C&u#4@1Ja[K[L$%"#+.#"3#3267#"&54632g643? ?135 hn]hhbjJ"4=6W6=2%G[z{\)V@L 7@4YKKL   +533533qOps2oooo>M'iK"PX@ cYK[L@*cYK[K[LY@ #!' '!'$! +7>5!32+#+5326%#32654&nppU\YZAQ4$XX1&'MQMRQRY~:84_Mf(a&%% C>@; caK\ L$! +3335332+5#%#32654&CssqU\YZYY1&'乹RQRY&%% ;@8 JaK[K L## +3#53533#>32#4&#"CLLqQ2Oas23.C'M44M"'XT+.160C&uC&Cc >&\TF 3+Cz MK PX@gKZL@sKZLY@ +##5#33ps~ >@;ra c\ L! +3#5353!!32##32654&ɿx(ثuwxr?89iXXiy^nhc--33/::@7 cKYK\L$! +3533#32+##32654&qtU_]Ynkk+&'aUDRQGx 3!>@;a[K[L!!  +".54>32"!.267!J{X11X{JK|W11W|KXm  lYZn \ m -XVTX..XTVX-QeZZej[[j& >@;a[K[L     +"&54632"3.267#klmm3CA45A D wwwv;;:<>;;> !@J[KL!"+>;#"#3@F1 /B7r  !@J[KL!$+#3>;#"~y^2<+S62fP-GK PX@fYKL@rYKLY@ +3!53!PTtDRGK PX@fYKL@rYKLY@ +3353#Dpn  -@*aYKL +3#53!!3#PDD b=rb  -@*aYKL +35#535!#3#C99KڂWfyWPq6@3Ja]KL +33333#5##Pzf`v/eCz 6@3Ja]KL +333733#5#'#CsD~dOp C似Pq0@-a]KL +33!33#5#!PzKz^vbCzF0@-a]KL +333533#5#5#CssKqM乹 < >#@ JKL+#53s}X /@,JbKL+!5#53333#쏿~at9a >+@( JKZKL+!##5#53333}q]}yZXatPh)@& JcKL#"+%4&#"#3>32#BP)G"zz!S0tzHA lzCK3>(Z3&PS&1d 3+C`&Qd1Sb&6d 3+)`&Vdl&:3  &ZCl&:  &Zu2a&:G  &ZjP5j&($&HaJ l&< >&\CH^ ,@UYM+!5!,2 i.C@UYM+%!5!2f.iC@UYM+%!5!i;fB $@!HUYM +#5467ŃHA &'BGB$ 7 @GY"L +53'>=HHA '&$BGB$ 7g @GY#L +353'>=HHA '&CFB# B 3@0HUYM   +#5467##5467I@ '&HA &'BGB$ BGB$ 7 +@(GY"L   +53'>=353'>=HHA '&I@ ''$BGB$ BGB$ 7g +@(GY#L   +353'>=353'>=HHA '&I@ ''CFB# CFB# 0 MK2PX@a"K#L@UaYMY@ +#53533#̜o ddM0eK2PX@ a a"K  # L@% Ua a Y   MY@ +5#535#53533#3#̜o cddc8$ @[%L  +7"&546320EE01FFF11FF11F8x&'" '3?KKPX@1 c    d[*K  [#L@9 c    d"K[*K#K  [+LY@7A@54)(GE@KAK;94?5?/-(3)3#!''   +"&54632#32654&#""&54632!"&54632%2654&#"!2654&#"KddKN^^ QQ.%))%%,,}KddKN__#LccLM__B%**%%,-%))%%--9^`]^^][c45243354h^`]^^][c^`]^^][cU4524335445243354 (IJK&PX@ %K#LK.PX@ Y%L@UYMYY+3#'zy% -=JK*PX@ %K#L@UYMY@ +?'3%z yO@"K#L++3>II$x QKPX@c[%L@cW[OY@     +"&54632'2654&#"PZZPQYYQ&))&%**^][``[]^K4<<44<<4({ Z JKPX@rgUZN@rsUZNY@ +#5#5733#'35PUӪ~++ՀKQEE4qm@ JKPX@ac[%L@!acW[OY@ +"&'732654&#"'7!#>32BRT'""#&! S-32'"32654&RWYN?LS"'. 2#BLRJ)'!%%W`c\-1538:9B2c*@'JsUYM+#5!W1OY,t#/A@> JccW[O%$+)$/%/##*"+#"&5467.54632'2654&#""32654&tXLPT!ONNN#&!!&$$$$%('&%''5:86) )1982& )P?+n$q@ JKPX@cc[%L@"ccW[OY@ $$ +"&'73267#"&54632'2654&#";#"##9 F'#%/LpnA"#k+*,GI.J@GJI  a a[*KY#L.-*)('%% +%#!!5>7#53.'#53.54632.#"3#3̝!U+3tiN-kiq v365<ڸ "5jj;&RR _mcQ(79.  R Y1O@L+* Ja  a[*K [ + L11/-(&%%" +753&45<7#53>32.#"3#3#3267#"&'CCKjeyo ;86D  B9:= m {enN Nvxc`-9A@N N@D9-`ezw=W=I@F= Ja   a[*K [+L;94321%%" +%#"&5467#53>7>7#5!>54&#"'>763#3!3267; xhg:  'l423@ s}fcu8 ' >25? LcUY O   O &/,(OZ]P!O   O +*0(:P +@(aY"K#L  +!5!5!##PzVRjjH$_J@G  ca  ["K#L  +#3##5#535#533232654&#ptTTTTn|}A;XqqX>c>fihj?:459%"0+%#"&='>7546323>54&#"rMXR$ 5YCCGkP''N+*ffNe$  NQTLDS1U+"%]&&P !% @ $" 0+"&54632##332654&#"!5!g?VV@ATTy=y ""oOQNPPNOQ +)(*)))+Y"h 0+5!##5373#5#'"*jVrRNpQNBQ[MM@ָ2$  0+%#".54>32!3267"!5."nI^74[JExX3%}OWLy%#t]m2]SN~X0.RsD7:BNE=6197y&' u3+s3+C~&'{3+s3+0&'~3+t3+=&'v3+t3+>& 'x3+t3+Qm&'O3+t3+X 0+!!XFGkFlHK 0+!'3'ZFXHFG  0+!'7'7! FGuFXHK 0+!737dFlHFGx U 0+!!#MddUcdLU U  0+7!5!#U@ddVcAb/e[i 0+73!5![Mc@b/Mc0b@cxi 0+7'3!@cMb/@Mec$0+!5!pwffBW 3r0+!!W$rh:~!-9 3.*$0+#"&'#".54>32>323267.#"%"32654&*@)232673#".#"#>40-gLG41.fNK40-eOD40-fNHYH[ KWHZV4O 0+?#537#5!733#3!~"32>54.53'733Rd88dRRd88dRCqQ--QqCCqQ--Qqvg*ag8dRRd99dRRd8B/SsCBsS00SsBCsS/O=BZO%'@P@M=/.J ccaW[O<;:931,*''  +2#".54>"32>54.4&#"'>323!57>Rd88dRRd88dRCqQ--QqCCqQ--Qq% #.W XNKU26f%$8dRRd99dRRd8B/SsCBsS00SsBCsS/!'!;MK<3D'GPRz+%'De@bA ;/.J< I  c a  ccW[OCB@?>=9731,*''  +2#".54>"32>54.#"&'732654&#"'7#5!6Rd88dRRd88dRCqQ--QqCCqQ--Qqs^VL^ X/-(,,+"DHK8dRRd99dRRd8B/SsCBsS00SsBCsS/sENB< "DgNX]>%'255,JK PX@3ph  c bW[O@4pp  c bW[OY@43210/.-+*)(''  +2#".54>"32>54.#5#533#'35Rd88dRRd88dRCqQ--QqCCqQ--Qq8]ɉ778dRRd99dRRd8B/SsCBsS00SsBCsS/[VNN%'Ff@c>9 8,+J  c a  c cW[O)(B@=<;:640.(F)F''  +2#".54>"32>54."&'732654&#"'7!#>32Rd88dRRd88dRCqQ--QqCCqQ--Qq@M` Z 0%(++() Y' 2?\\8dRRd99dRRd8B/SsCBsS00SsBCsS/?; $"" R\ AKFQ%'@Li@f218J  cc  c  cW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54."&54632.#">32'"32654&Rd88dRRd88dRCqQ--QqCCqQ--Qq@]dhZKUZ(&.8:*B`_U&0-)&.*8dRRd99dRRd8B/SsCBsS00SsBCsS/lntv:6>BCDCR%'.Q@N-J pcaW[O(((.(.,+*)''  +2#".54>"32>54.#5!Rd88dRRd88dRCqQ--QqCCqQ--QqW8dRRd99dRRd8B/SsCBsS00SsBCsS/XW]%'?KWj@g:.J  c  c c  cW[OMLA@)(SQLWMWGE@KAK53(?)?'' +2#".54>"32>54.2#"&5467.546"32654&"32654&Rd88dRRd88dRCqQ--QqCCqQ--QqC[Y#"'`Z[b%#!]X+./*)-,*.21/,138dRRd99dRRd8B/SsCBsS00SsBCsS/SD:%- 2%;KJ;%3 1!9FO%'@Li@f821J  c   c ccW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54.2#"&'73265#"&5462654&#"Rd88dRRd88dRCqQ--QqCCqQ--QqD]chZKUY(&/8;)B`_T&1/(&-)8dRRd99dRRd8B/SsCBsS00SsBCsS/Tlntv:6>BCDCR%'3:NK"PX@ 8 76 J@ 8 76 JYK"PX@.  c   c cW[O@4  c   ca cW[OY@'<;)(FD;N"32>54.2#"&546#'732>54.#"Rd88dRRd88dQCpQ--QqCCqQ-.Qq=JJ="32>54."&54632'2654&#"Rd88dRRd88dRCqQ--QqCCqQ--QqCYeeYZddZ-33-+558dRRd99dRRd8B/SsCBsS00SsBCsS/rpnttnprQBOOBBOOB%+;@8c_[%L! '% +!+  +2#".54>2654&#"7"&54632Rd88dRRd88dRZddZYeeY+55+-338dRRd99dRRd8rpnttnprQBOOBBOOB`'0+!%!!`fm%,`3 0+7#!!3!!^_>=m-9/*p5} 40+7#4^_>w/*p% 0+2#".54>!5##7#Rd88dRRd88d@7ga*gv8dRRd99dRRd8PdZB>%," 0+2#".54>!5#7>54&#">32Rd88dRRd88d$%Pf61UKNX W.# %8dRRd99dRRd8+zRPG'D34&75!3>32#"&'326Rd88dRRd88d LHݑ!+--(-/ X _LV_8dRRd99dRRd827<^XMkB! 535##3'7Rd88dRRd88d778dRRd99dRRd8[N V[%2  0+2#".54>2654&#"735!>32#"&'Rd88dRRd88dUT\\?2 Y )(++(%0 Z `8dRRd99dRRd8QFKA \R ""$ ;?%,8 2-& 0+2#".54>2654&#"46327.#"72#"&546Rd88dRRd88dUT_`B*:8.&(ZUKZhd\*+/&).18dRRd99dRRd8RCDCB>6:vtnl! % 0+2#".54>35!3Rd88dRRd88d&i8dRRd99dRRd8R]W%+7C @ =81, 0+2#".54>"32654&'>54&2#"&546"&54632Rd88dRRd88dRW]!#%b[Z_&"#X[*-.)*0/+/23.*318dRRd99dRRd8F9 3 2%"3267#"&'32654&"&54632Rd88dRRd88dQT_`B);8/&(YUKZhc]**.&(/18dRRd99dRRd8RCDCB>6:vtnl %&2 @ ,'!  0+2#".54>"32654&#7%"&54632Rd88dRRd88d=JJ=>IILT 18dRRd99dRRd8baabE;>H9YY99YY9'>\0+#[p46*>_0+3+p64H>  0+!#3%3#HgppGGWWW8>  0+!53#5#3ppFFjWWWe '*@'J[*KY#L('+!53.54>323!5>54&#"*>(ڌ)oa_xd'LA0 t`%]J{V0.UyJ^*`s 2AM&hyy; #@ GUYM +53'>7Bw4? ! aH  @  0+3#%3#3+53265phRphsTWH,**`Ve,, 0+533533V-Us*0+ # #̀X;; * ("0+74>32#"&32654&#"32654&+;#?X4bs869B~hrxpj:D:14IG45CJ?j6R8fR3MMEanqmC3,+7A@;:597.'0+%'.546?>54&#"'>323267 x[ZmJN@.&*%,8 gnVYaSI?,"4'0< LLJG;D & DHQ>>A '%(4J 0+!5##'333373#'#A5zr8p8s~|54(%0+732654&+532654&#"'>32#"&l ?.6A?6\Z3<7.-Ag|Y^o567=h^v%,+930:_6-.6.+OReV5PN?_kV>X>&XTU3+CN 0+# #OyvyCQC6P>zB0+!5#"&53326533#5S1O^s110AsKp=!&XTB-28.$,0+#5#"&=3326=sI*O]t*..<ZW(20*>0"0+#5#"&'#"&533265332650oN1;L[4M_s/1,@t/1,@>!'1%++XTB+48.%+37.%>z{&0+3#5#5#"&'#"&533265332650KqIN1;L[4M_s/1,@t/1,@>!'1%++XTB+48.%+37.%I 0+%#"&=#5!>3232654&#"Iq`cmD'#A19'/45.&:ZpmWg-C>.2:3,3++= 0+73>32#"&732654&#"=pD'#B1r`cmp:'/45.&;*-C-ZpmL.2:3,3++(("0+%#"&5467'.546;#"2654&#"~jhfH "'KB f4K<;>9;@Bn|q]l 5!69b ;dMBDKLDBLYc°3+!0+#53267#"&546?>=L{'-!#639? s {opn>$)E%/(#&/5+RhjSEK$ n(:aa3+%n-:bb3+ n :mbb3+%n:{bb3+.'YKK3+.(KK3+.(iKK3+>4M'#0+4>7.74>7.>%?X2:%C3gP:3W>#%?X2:%C3gP:3W>#Ovc&GSexDEG&fyMOvc&GSexDEG'fyB4Q'#0+'>54&'7'>54&'7Q%?X2:&D2jM93X>#%?X2:&D2jM93X>#Mwd&G UewBBG&exOMwd'G UfvBBG&ex>l0+4>7.>%@X3>'E2dU>3X?#ROn[&K M[nA}GK&_qDr0+'>54&'7r%@X3>'E2dU>3X?#JOn[&K M[nA}HK&_qHK0+!#3Hcfede8;0+73#5!!8e$0+5326=46;#";#"&=4&#+8XSF5+'****'+5FSX8+h/>acOe%3e/2$0+#"+5326=467.=4&+532;+8XSF5+'*++*'+5FSX8+/>^dOe$6a/>M'#0+4>7.74>7.>%?X2:%C3gP:3W>#%?X2:%C3gP:3W>#TOn\&FL]qDEG&^qNOn\&FL]qDEG'^qBQ'#0+'>54&'7'>54&'7Q%?X2:&D2jM93X>#%?X2:&D2jM93X>#NMn]&G N]oBBF&]pOMn]'G N]oBBF&]p'\0+#[pLN*_0+3+pcNLH  0+!#3%3#HgppGGcfWHWW8  0+!53#5#3ppFFWWWH&0+3&lcf&0+#3lkcfp0+3pgcfp0+33pgggvv6G#dd3+>k""3+2  0+"&54632.#"2654&'Y *UYVY , ^.Lx z|y1N $f  0+"&54632'2654&#"ETOOTTOO nwyzvvzyw$f  0+"&54632.#"2654&'E.TUTU ) ^1Pz {|y+G 2m  0+73'733!V;px]p5P&Z)o  0+!#5!533#%!tLM2]ieW;KM3/*22,/1a31256014/X$xor r3+/plyt t3+4lqst t3+,okts s3+({lt t3+4qks s3+.qps s3+2cl t t3+,tq t t3++np s s3+$9x 3+/<py 3+4<ls 3+,7ot 3+(<{ 3+47q 3+.7q 3+2<c 3+,6t 3++7n 3+lP5lPl&3l |l&P0b&W 3+/l&Pl&(\l&.$C&u& >C&u 3+$&uC&u%&u$-K2PX@ Y"L@UYMY+3#Ek?Ml@UYM+3#ysol5l@UYM+#'^psll@UYM+3#%3#~ui pl(l@Jri+3#'#|vt@@tlKKl@Jri+'373us@?tuKK"Qk LKPX@fW\P@rW\PY@   +"&'332673MGWXGL<#" 2? *PP@UYM+!5!P&U3da*@'UYM+533533oSommmm!a@UYM+53!|qq*3 1@.cW[O     +"&54632'2654&#"8ML99KK9 !!H99GG99HE#""#i AKPX@fW\P@rW\PY""+332673#"&d#*+"eV\[Xi"''"KNNVJ$b;(< C3   E]     4,  } v d x >K  <w < 1  O Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo Sans MediumCoFo Sans MediumRegularRegular1.001;COFO;CoFoSans-Medium1.001;COFO;CoFoSans-MediumCoFo Sans MediumCoFo Sans MediumVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590CoFoSans-MediumCoFoSans-MediumCoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Designer: Maria Doreuli. Team: Irina Smirnova, Elizaveta RasskazovaDesigner: Maria Doreuli. Team: Irina Smirnova, Elizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comCoFo SansCoFo SansMediumMedium  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni0000uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecomb dotbelowcmbuni0394Sigmauni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni0492uni0493uni049Auni049Buni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04BAuni04BBuni04D8uni04D9uni04E8uni04E9uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Auni200Buni2012uni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089liraEurouni20B4uni20B8uni20BDuni2113uni2116 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdownuni2196uni2197uni2198uni2199uni2206uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni2610uni2611uni2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi3008uni3009uni301Auni301BuniA7B6uniF6C3uniF6D4uniF8FFCRI.altuni00CD00A40301 uni0407.alti.TRKuni00ED006A0301 uni0457.alt uni041B.BUL uni0432.BUL uni0433.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni0438.BUL uni0439.BUL uni043A.BUL uni043B.BUL uni043F.BUL uni0442.BUL uni0446.BUL uni0447.BUL uni0448.BUL uni0449.BUL uni044A.BUL uni044C.BUL uni0431.SRBexclamdown.capquestiondown.capguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap hyphen.cap endash.cap emdash.cap dblparenleft dblparenright parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.capdblparenleft.capdblparenright.cap uni3008.cap uni3009.cap uni301A.cap uni301B.cap slash.cap backslash.capbar.cap brokenbar.capat.capcopyright.pnum_lnum zero.zerozero.tnum_lnumzero.tnum_lnum_zero one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044D0301 uni044E0301 uni044F0301 caron.alt acute.cap grave.caphungarumlaut.capcircumflex.cap caron.cap breve.cap tilde.cap macron.cap dieresis.cap dotaccent.capring.capCyrbreve jkklnoop%&)*45=>CDLMWXXYZ[[\ bTDFLTcyrl6latn BGR .SRB N    .AZE .CRT .DEU .MOL LNLD lROM tTRK       aaltncaltvcase|ccmpcrcydligfraclnumloclloclloclloclloclloclsinfss01supstnum  BJRZbjrz "*2:BJhpx>@D$<<$V  L  D v     V  2  n0  P# $$$$%%"%@%^%|%%%%%%V{|W}~ZptuqSTUVY]o^_`abcdefghijklmn\wxrsV #,>?@CL^_`chjkmpu{!"[\]^abpNOPQTyz, /v gedff  gedffSTUV!"STUV!"6",-MX-[M,LL*]^_`abcdefghijklmn (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $4styy  6Lstyy styy "8Ndstyy styy styy $:Pf|styy styy styy styy &<Rh~styy styy styy styy styy (>Tjstyy styy styy styy styy styy  *@Vlstyy styy styy styy styy styy styy " ,BXnstyy styy styy styy styy styy styy styy $ .DZpstyy styy styy styy styy styy styy styy styy  T'{|v}~ptuqwxrs' #>?@C^_`chjkmpu{[\]^abNOPQTyz  F yst   yst   yst     F         st yy  $   70t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF| (!'A&l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~)t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF|l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~ >A{}*4>HR\fpzccccccccccccccccccy~,O,O\\pppppYpY+, yst      WY\,, pp   xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernv~     !#%')+-/13578:<>?BEHJLOQSUWijklmnopqrstuvwxyz{|}~X]  @(.DZ Bd(NtH^d^"0:Dfx2HHHHH  ( 6 P V \ P P  >   B H b l v  P B   T j p z V B B  6 V 99;Y[Y `   }@BI 9;|~ 9?Y|d||~ "9?| |~9|~ "9d} 9|~ 9;|~ |9;[ 9;?|~ [| " ;[|~),A 5+6$ =& #[w!3F/,/  | '(83'.  #9IYw "| $ 9?HY ("..@2(., " #I  #?Y99;9IY9Y[EKNOD,2,2YI6MLPQSUWBY2Z2 42=(G222IBMLPQSUWB%  4=0GHFGHJRTX),A 5+6$  (*,.02=AINR "q}|~q| q}|~|~ "mm?f|~tttm " q}_fo|~ q}|~n ^_`jo|m  bf #?^_`jo"  @"4?@ `  ,2m}vvp*v"3"L,[9Y&IY\bf^bf^`j9 9q}x 9}v9; "#%)379:;<=>?IY[\^cdegw!#%35678:<?LUWXklnqrstuyz|}W\]^_fghoq{Z|`u  882f& s  v z $        6 A&C  2 {   %gcg#@&"!bb ABHCDKKEFGKKHHIJLMNOP QRS^TUVWXY^ZZ[R\]_>`?a eAAAAAACBCCCCKKKKHKHHHHHHMMMMOQQQQQQTSTTTTWWWWZ[[[[[[aRaAQAQAQBSBSBSBSH^H^CTCTCTCTCTDUDUDUDUKVKVKWKWKWKWKEXEXFYG^G^G^G^KZKZKZVKZH[H[H[CTI\I\I\J]J]J]J]L_L_L_MMMMMMN`OaOPPPHPEXXEXXMCTPCTH[J]L_OaX[ll'mk(rr)*+nrsrj,umqlnurrnrrror-kms./qrrqprpoorv0~yzz{{x{6~~||{{yy7x8||wz9:o{;m<mnzq~tt=wo{o{KZJ]N`N`N`CTOacchihi geErWXj23z4z5ww~~}}1ffddd$ jlrosroorvy{{{QP*G*:5DKTWVH9>=RJ<O34%7L  F r&   @ASMsI rrrr          rrrr r&               %%%     & 'h\ (ZX-'' (]Y[ -/+mttU"0,ttt!tt"tt"#$"jt`tt#tt,t1""t"fqgp!ttt$tck'"d.tttt).).e'"   s?Nr^n_0o22ltt2a22#bi;CBE86'(-/+"t"$t,t1;   "?DS2UWBY^EccKmmLstMwwOyyP{{QRjq'))++--//113HJZ irt'TUV]_bhmns W[]beiloqx{{}}ideoromnDFLTlatn$ ` `դ'ח% חPKwL\0DClimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Medium.woffnu[wOFFʄ BASE(>P/;FFTMh\ GDEFt$&GPOSL~EGSUBX E*,vOS/2$W`aGqcmap d cvt 4dOӿY"Ȁ S(8w1xc`aJd X ( d͟As100cS``c|´H)0? xڕ[lTU4:S@VC -PJ Rhi:7Fy$hPI DbCQFCP#![gjiIg}Y_k(swSuE>Z:.w@ BQ[qU j#?Rq~jVvUT$_ 5뜚 nrpHc5hCYTwp/x lUE_&y1=mLnO%r?S v NMw_pZQ[_jrj_yڔUuDOv&ZX}]ʸ߱K93+V3/fi VG" 2ؠic2EzTg/jrkWy8GGiw >ڭRwSjA7AtBbe2>J_"`01߽sTlDK~5'~::ۿ؄a>c;Yvv[(6mvN6MǦpW 69kfs'|P"xكx:&i z̆:m1\̇lĮ83tE!8 2-x3WXxҬNeG|r ?~+XM7Y-L߄`Yy}"6`9qJ5t_ZCd_؋@iGXD%911_i4:ly5 }RyB<~W$3q.=E{c-2'5> 1)zjH9S3yΑrXC:y>C)cOggᖠՐݏz(j9v`bx 䏺ܕp썟,X?QZW&.pjЈgu<:j!}I-Կ1Lc-O^DžM xՔkPEg.fALB+ ~A,D2JY]Q(-Kˤ8SXD8R69tf""В46~s;ef>1!EvLDr%ی*DkKkfaqJx2YflY(nM|UTUIWϚcY!V:Z1:I[گSu@O׳ ިw꽺ECv=<خ~?_/OH%KKKH[ $j82us@&ʹN~1(ef y_Zj6C5:iYAj~xia͉>tv]c7Ǻ$4:ڰ $*yJoW{3CCC\{v+ܥn;qɮ<n u~uNt;'cΗNSlq69O8˝r';1Nth0:t4 M t|}wAwO?N|ә9mؚتó?YQr9'Z C1L4#a\\¥&xer$jcq??Ha"1FCWs גdISids=9Lg7p#71e0[cs۹;{gESB) T"yv]vm}fZ|Aڅ, ᱊7xE%L^u`QTӶe,Ycߡh2GXm4sԋ8/~OqVg;,2*6S[z^b/Wxl:YVEX HAQ*$,,xڭVisV$NBuyij?B0`B,.JPZ)v}~͕ig7~Z}M I;Ôa|ϻ:zw JgVvt٢0:2Q0:o6! "!S(M{Us; ہM%ʨ"IIqV5f>oNbA FIF#+ "vpe=b ^;tiLp?$3r($$ ~_D~%zODw'k" o ts'#Xv(h+L1+bƔ?$/94;9u}7f2%k' ?>ex[GɞP/'2,Gɘ 3eXMzI٢멉S^eeX/B;OMflUԍ(3]~@!Mii5s:%.xEf4Tk7HrzLCoVI ֟U1Gfl&gg?d.b;H8yldK6V_A&D$M߄RR0%呱7MSj^wi M9)o`9Ә1\%gl]@|١E,gTeJr,RIyT2mX (Q!C% :TC*˯{]-#K>YJr>,G+*|dVsEC}"O㣸*29h82J^c@+96*DKI\!ã9WgǍ`N4zcO7d5d."ˈ/;:tEUZ/*UX*h"wzlbuELi..~[f B^WBzڋǢA9 }s+xYa=ͬdχ.lyR{(]/Jzq3^lG^}'KX̲JXh .m`D.Gh[q#GTNෝnPM~eYCjnh50|}"綢jK]E=f9(K*zfK+:vkb>vKMb|9- 1 s8_˘ŏO5 ]EW!Z5y |ʆyDq;R SǞ dZК-aaǜ_0a0Asgs_37a1A`9 :aeEGi>m}-t?ᰉn?AԈ?iԟF_j4bCE7GG|5b1z: xrT8rEvMfxcp"(b##c_Ɲ  ؜6J21hX[8ؙ8 l-6qV0i7&N i7y .U;#68tDldNq٨h``dqH)JL`߿н_\rD>4gsYiͤ3g3w23 ,[KeD:;LrwUFy˼\F.ۚwn:ΠC#Ac2 Ìb߱D))%JKh%Z֩%}/-R{_/s}-[,[)unXMw;%ʡr[x$#􄟈{zcP~#w$$ Cֹш5.6n4.+%ra.k ij"ƚ曶n=cz=SUϞ'yhv44ǚO^{X ԲEk5zjm_ۮڡHǏ~ЯWJ B`=p8t:񎃎: ڂ`( S< IBXrZCdh0 weu!].kk6v$|~u#'IfJ##M;yL^SJKY)7"05AR&N zt-66MOПYz>{ z=ޞ'H_xڤ}|\ř{mQ٢UKZJժkfY"*,"nr H8!@ @H\ʅ%$!Orixf潷bΠ6;of7|h|"wHDf{&C'0+}6Xf>my3_ۿ }]w/qځ5?`7&U' ! I=Il_ 2ռ'Csy1  kI#33-3"t0~i1wa%[+n=޴ĊC%~F#=yQ ;c# Mh5v3R(yx:h48'^7GyIFӰ  h_. ;b3efj }3;11>:xeU$TGrxrTN0X¼\UIu-nquhdUsB>`K~`sD?e"EeNA 줯%$A5-6 Hm $|5#3&kƱȶk6%,P/<6< wLuexzm5+)5pQ(_&SZH5kDOFȌQ*CsLH!JZxK$1+n? OeqLΏ-݆7b&o{pڦpn>8|p{j28Bs7`l:6CauN~3Bè[]+f6Lxg")7ڼa1jmvv}M$wn쨨Xٸ{Oʊ=t=hÙ΁8RsM2( @(Z6ڊ7Øm9t(W+'M8m̪X{M,Ng{ J rv#v< l;}? ('f]43dꚓa2߄X~߻ I vJwRZ}CG4 @$g1= #1͖nc4J#~mvV^vݓ>?#s9˳::0i|9Fc0h6-'%76M\^^#yc.(FIj̏HcfdLLL6C{~y0ܱCgCew WnρmwW^: q ާVX7bNmP89 )XjH Q<0oSFF@EHdS + obbymCmnV~ӉtS5p_TrԝvP;] -M$X~xh\G0D=8K\3.܀%wī( *k`BT sp󁭁T" ) <7 ,sa(\%3c4JhYY^ρ\6wo?19d b&N^ E`]j23- nx@曂ȘV((),q=0M ,sSg&nɿ;n>\=mho$kk_ʡc/><<|ɎomjmpaKc86#c*@Q$ ~m#qJ9wmDOxlj[q9^SM0]9پRW ۙ,sh{bw Bc>7U37T7%kUתx'f'>ɽ;64-Cq _0T^ W]@^OPx9?%=|x^ %ESIJl#r~e ("x#>x㕰Ag>7}"*O-ۢ"bg.Ͼz;(֡\WrhvFJZ@%_]xВEqɊ ǔ,;/ Z'qL %&4=NUw!0B{q ~lsd+Fkq(Ì D?$m #?78l̴l0B]K$+]kˆK?vn+]Q}j_=wDR] f6q**Ko y z`,`Έ2',aKWL p DI"̀ux`(kwh>S#׬;;?+Ծ-%p{!&X %B7UikhW@e~zSa=r{/=4}>JCC*b 1Jj{x3Yۉx;wy;;ul-*yfD~"UvrT#s4 wys;duG9> ~4" pdrרʊŜH7yof ݝi\cw΍udM 4|kˑ}3[]/:*Fά:3\g侙& N]f$55G%8\i8p9WqaM$-1%: ?G,{&ӵd1$ H4ؘ%po2 99S0V\@5. D|9̛`~wp-0qvă0UzejfҗBŕ'\s~G_M%1.2C`EFc+4$up&OK/WO0( =DOՁ\*$ I݉ɠ<ҡOࡃ OBA.h%'RdLLS}T`phWP08t,ezz{u3֜ϮYwfؿӧNh$U+|E O!lLC7NLD2}a1I3ןeqeL%cVZ5z,9٥9=K'GU& BKZbmgnSQF^̉nc)H7[ۼIn-L`;#6YQ8VdPٸIYz!;,pFnE` w4;T0͜loӷ^n-_OhcZMѾȌn甍l ,IXvxG҇ՇwzYUm"ׯC?U]]Q.Yã; %R}am>ye/WBbJqC0(j4.',n9za.xGB(/(|;N#?` joo֮iĶϝߙ: amPS&J?y'W*BKhV_@Sx;yx#pÏz{{1zSR*\^&3lö(!z;=tm'Gq7ʪćtl{r D!akN?ķq]tjo #lSӑ ˌd ]qvK5=1]g%jg]r ǹ:ɀ02_M6#/>_rj ɤm3x?4{Q73 bC_O-".`^8Y%b7k.^|8wBo?nI<#'ˡYX&4ɧ8vM";'u\71y~7}~d'励=KN[gs| ff™ޒar`⎐R PI=HШΥ=D"E~_ongSCkDLTZ@w5z=%M o+WMLq4JJۇɮ˜h-ޮ{@4X۷1¹Ņ` Y@c`LX''0I`')7*#E Y'f<4yF fSKT:[4P뮵SuF+b.yMGo(V41W6: mKQ 3>3sSuP<\$lӄµp]'5mh.-o(βW tuQyP ֈKZMa)̊Fl },6ij-.͆9%N[" 6zSz|5 e֪u MuvyCC㆘ 罫o:׬ws| *Q`fhd`,|-/V]q; jgT[-^p_'SDBUm{PE=knXw 33"f'J&vI@>i!ba8x)a[׭0oyΜ'['}[[2_.*F~t1Y on¼%MyS8w1/ jj1;!p|HLxn78?Id#? 0ngpպÙӺv.je5V_ۂJԭgf[ #GN_5w}hot@A40)j½a4Q"wN#[u6?79 Z3&u +?c{ݿ|܇;~s$laܡY.43s{q8߄^cfVෛ`x/Te"ZSUsX!&tck6{Q*҈Mg|Ca&F6:gojzˏ~G_+t٤JNoZ-ϩK ?HP#y<H)ifӨɾնx˓{1掆{6Vc~ }5or_&ӟ Wռcu[]GP$)1IZbS,CKy8>oY N"*;׵\64=Aayi z|WMCsgUʹ߀=!l[hԊĸ99q4 -K[ U۲V*Cv궊eo7g]99XsG_ ;"e63ڒIޛg\yO+,nɒ)Ilb0;1aYz7o흽f}׶=r' `4:H$nK _< (N>%," HM~Yꛘ *cMvܒ?T.[0oZD[_ș ç8id0D%5dP0ad <֛mpj箓0&P&ĭHֽ`M+8 JK{۽x[oxK?w>Yδ DXQWVLܙ4Bl xuO׿v' ŶsoPƯo?^m݉_زu[❭dBCς>"Ҁ)D jihɼaBN{m'\:WRn!a @P M y}5oh:<տ>a0t4vm| )?MH1>bv-g:]DBWS7Mn$-- yh+{|G5|>5L?h:o{a5`M1[ $""A%b;J ltXI%Tp]xnuUPUϏf׷Ֆk+F0q`OT~dVzV"~Rf >9rddgW&={*y s1#]'4)5UE4bN#ZSZR ϲڌ;6YŰMWY hoy,Eu*}|T\ EQqEڹ'Q Up*wa)DL#I GQm*-nc4b>5kIx'{/e0~nk*gڱOP WG O&T:UYeNm_Ы {L%@i#?7& 7K ,H0٤ӪPg~($.0}ȯ"^iB1,3)U3gV[[5YV]X p47Ykk5 ͮF3f_)wp+WN"!0$|cΩ#bE `*/M,!s  j/^{/?Nï .~E`"S\pҤfRrmp%wb"j9;WDA 4Zw0Y}EAZ 慃B1;Ĕ?_ջ(T:1TtNg:kfidJ.qk0zvVA7f( "IB (+Ej{~`&LO?qUfQwL/ 8V'+PMLJ+mZIx8NFB&KEE^qP"s%{yyƦj0_\[9Ž<3dGLrs ]S5 L#S?VB@c~|aVH褓t=]l/H? }"hf1H  K>' 攨u'ZOO}> ص':2Fggl<_;2.}xm`Xt$6#)'pDĜ! R\W2|OiӾdbC̐\ Fc ڌ2=`~`_ 'Xe|qM:*`~YU|EFEfѨ^0Ά{w@qPO_ ۫$BJ@c')tU̲},;aDv;IlF-Uđh_6Ԡ$.w0w`4T˰,r|P34cl'(LRBZ =;KtHg̒b/)%d`ƲW&=N87 O:oI1rČVH2s cj&)_ ʡC:.vv(--//-a׍_i'3_g#SX"VCΫab=?vvϧRZ `4w0@>{`"; =~g왿gg.z+4*\2.W1Vg6qUTp 0ȏRdWmCg&'_"5aJɣ^!s3{FwIa~:kiHyy6y !} B˵mݔҾSi6=}Ri]HiAO?㞝RĞFf"j5HDՐY Ⱥaq,k4RxHޔMb^Mo@ݬӎGL.}lǗ>8f9CcC83hd%s8?@;vcjVQ‹ L1Y!m\YYZ_X?k#'>ja( sYpC8MƄg*&Ԛ[/)n~w1T2S:%ԽL=h,6GZh/L?wir6*մ}_IqJ OKg4)> 吸c( "IFhd4M7gz;:m,aI|<BXI /b&\?I~YJgi\.}DK_`У);ooO*gA\+.$wtYgALIV#ZL |J ӸEڿA: algAU $+dK4Q@/#$d[2,$e7j$bX{6+9*?8sy睭uwM=l[>y'.EBT$rDmjy0ϵYIĵN{4UvgDFHgL@]Vk<շ "%XuƒeMk+2:hYv@..hjKJd_j};co wwQEP z'~ PyP@HUCZ}Qac^!0W{?Ǣ\>$sR-(B-tZ`҉#:~SYkTFfr?5ٸlK ԎGa1bռ-0ќ_YRZ%1#[%WVW{+EoJ˝[WW{ 8ʼ%uN@ ?',UɘWVXR XP%P5K%Yn* +کphLT.JxHgG{qGW0ڨ<" `TYQqبV4SY0)kRc|2WT\pHGFIE84vNv9YN=˴9N2N6?X'wlGYkHi?a=v<Ͽ :>@,Hƕh4f6WNlw2E*/ec#L],*Ixɞ*ȗ BJn hX6X "}c,\с[ttiKʒ5ÍvUhk (pnѻ 4mv,OߧwuSdoTjj-U8D"&hH^[D PMCtHH,N$^N_?_?yr]=C[TD䐂|Cja@9fZd+2]#ԗd]>s= lCFLK3BxNM`Dc\(L0-l'{2]S9i?&sbqm\7\?2\txjr!cƏ  ˻'JsVusļ]<8w6;M|:T?9T>i ]tuN2 _J M}v'J" `4"k>} X[>V6ٕJ95=)EF12QtkuAoAn<Pqv_7;^ UG%ie93{U~iDIz:֟ ‡D ,cJOD%vUY k+JEV3I 6JmH}~AUeSsJk#Z>!47 ^^,YwyI64cpjSǟTsS/'$Zxɹ[fڤ0G4qIh_INvIO5 3Jozg!qZ)Β!j8K<-LR4|Z4Pkvԁde&/JJz8Rq|D.o̙}l[55a"f/t_h4b3Wl/O9cf ưK:E^o_&*z+8 BtZ-[26^l8aTYy R+Xd+9zNXR|6J9*Bہv!OHBLigK?ϜSUPTmq@ ԒelM/Gʧc/hҼڿшw)_BϥG?>R*KԟӗYIMjՏ2@^z!R,ˇE5V ^@Ju2P9 XF#[+%̈́X> bjl_XY?l*~õ#X6BH؏(7lLFdbbߤì=TլsĦ6]D, 2.p"9~JdmJdcq4GW.1G1&mDU$87uIMOr)) ٿt@x"eFJF{}{ _>|<Jj›R+A%ŵNθCy$}O )K(iwaz`-%l~ooCL|ڋ)Yl(g+I[K_CK61_D|;BXfLih&CwlQ17)ASSi'+N7iJr&eْGU!"fԋR7&G([i$C-e$=cћur'J$ M$Z}ՀBn,V}<$) K:+ĿG|~ڻi{z гg6{CBwK'HE F,jM$C^z^Wӹ* 5롽 r]akyҼ_2o]"}0)uMeMOjR $ZTӂu8N)GB}Z,%!ʴ4$O9tATsēVC52aiٵdff.TM'燙UT ;.*-J16jm=r8˵Ս=miU)oJty2zt\#k\ӳGMA<.HW[|Rl'Ht_'9,y-7׋KrZ"k7 7<&&23۸hXA_ (ɴ Vi՘e/)u0C-ro7^-c{+; =w9?$4!COє&PP|nTq* ^-Bۥ%#14JžT|3a',koW1~"=6v7W|Z/WSlSJR^IbC؞d>_b+۴?_bIkگsQc$R= ڱFzuHI-&^mN;B&CGD֛SJU<'ײIT ǩ}pH, )T0@) 5-e~a][F%{$KJBcQH>Ɵ(d˵̆+CQz(=2(?%j?k%cKcK?ŗ,fR`>ۄY؞67e_e #M.\ꃾ#;Ӝϱ $׏J_ Lڭ-[Z,H|˜1dG:҉D'^X"d:m>CNL%m{\QF'2HrOr_;%.:XK4&{kddѠ"ˤ$vuoIIKw&g`D#H+; #Fōpd0McG4BVk0Ey\bR<6s|==5]wuFo|GJ ˷c)KjrJ߯yA jfA]J)QI;!b_&6z8cmT{k>DkVˢmEFW?nXԍ4cTTe6d R|A@Rϳ3:;uVX/͢J^e(lϝ*q?iIde1ɟp"nݙCBA7"R [>f۲Lz-rc +Vx0%{^v򤹨k\8:u8VLiIGp~;*a c@68dO*WOvZ($43.$wT~~?@/;e:[N'PVBI(SY\ BRyΪ{xvy>n7UmHڃ+f8f>qZ2;ҫ} kk~f$3q踪K#J{#}Y/RhJ^ϟ6 f#:Y|Í09tЧi{d;2o1mJ2Σ)=;8\ڠeƋV1Ԕ_ݔ]Ϡ nt=>qܒ vYק̻[͔yQ={wH3}U$sU-Zs Wcd89Wٹ RMk=}ֺ Y=z攊Nd[)ŜH]oAFE(kZ8h=gF(YM@`TS[d6ffhEI(T#6tb뀳qMpu 8 b@~aZMU~=4l?Ggִ$6W5@@H}Qrw-H*&r,3lszEgҺ{SWK*KwnD ꗘYIںbŶ]\?4faN@,p#3uzFP(Y&7p~1R5#.>ȫf< -l,d'kuN7|}b$8pf S4"q+? UوI_5ZP"нt?W ;iHxJCb1-~o᧸⥝;{sίR|hY+i".u2Tbv:o-3MB#RQSqV|Ԭu4HS<jxVviu93jZǷm{_?g{r d_Ȱ,=ׅL))5/2ĩtdir: P>Q.V Qk{H$]ree$?-6Q4̮hmFHhCуGf&>Fy7wHs̯j?2S1'd4pӳ-+T%֐ EI8I[!K GHGb"[{.E 6qUڍNry\-'J~z'g6XqK7V[Nɮk9k7W]:>><8u]ѨR 461TYAj^E4XMf JeTugYyYy$2 Xr +1s*r-^[n7kNiUxe#,ZWdjV` i}*F ,,j+ȂP.p]%"ZD;hg ?s3ҀS=Z~3=Iw6QZ3dm4@C8;G,7Z1B!XX';woU9x<8[ȱ]osR{rNQ~T`0]BR4Mv9v_&nCGg4_Š:6ڵWX pFV)JAZezlJc?~1~zow hM}R F!N* J=*){bјm $<܄132RoCOG/&&l pwyg߶u; [KUm Xv|7 j>K<<HLC\!eAVDNU;|ؼ _|W~n૷݋_ʼnB R hIM 8BjUjf|+VM e86宸lK^e[QI;ЂԶd%΁#YTMM}gn8q!n]u붦v2odۘuÞHVd<֊wzVYψRj~C 7ȩ#xFNuC63WQޡH|')r7'! 6 HѢ|6I΅h?fFPdY/sW*k9O%IBY7!6zC&=;fa.,\5=GzjڞyG]O8:vǻv{zWup pE=j+3?ev`Oǐ@]%B++G2I]?eL/&qvW.ES.ERhw)/z4\oݶ8XRo7k}.|nonAA+Xyt-yil7[ *x+QTQݴPT7ꝤRGbIDDb%l@0>5xr?[ͭCSӿF<孳w@qS˹rrްzzaV̝kfjfO\̱믣~u~CXOL't|owgRc= Hb"EUA![_j"KzN_\1ȹruO$NK~":d^A1Hs* 8Dnp!OX x DᓈqCaZu6`w*QU=mSs g* XEs{* 6< ~}SxS1s\QxSh} êx|UG0*3݀Ԣ7볈|8@70}n`ah=:l)UuwB@S7)fR_"Рz#2;o.TWf}Z-FDpAtA \^flXvEz{%}|x?Ov !rA 0bst\QE<Q:`yXjH:).>*3AJ&ٮ1:2`_ކBn~>~g?J,|6OuzP}(FHJ ¬Bb4F3,NQ Zgf۸ԩX}][;~J {64Lk%"cz X)z). pjɵFD']䁪w.p[DOdųbz("QNPu:FRX5`h`nW?'ΤO‚))U.f޲-;)օ*}/ w[7wNniߚĿpޞv,BsBN*d<_[N͵[xq_mTWW蚃n{goډ Ɛ۴r3cxUʿױ2vMh_T]O7":Lm&nVm$%0Te,+/]:rȝc0oKbk'wH~:Dz~:LK?Ien VSP "c0.&92ʝ'eRh'ow(?QK9Н#|u|%_*]K/)iM2rXNqIN19Ԥ洒LN+y@:7WRtGAhTj,@?~Gee|vkL$3s+oT*R. גI[^h1 hӱҖؽo%7xn ;w> )f|u(Ria*{ɦGTefahgЁdVb1{׭0>mxz.A_\68r88-sHn'26-rqlԝG@s-RC!)``l.D}xO:BӺĘ~ϒ*$rwj!L(gٵ,\k-llsr it&[k2lJ*KamwV_4+"+ku o77)Q [XJETOi"a3~}|h} `չl-dYVK%[^dYWyXKǎMH$!daIJ)%Ph%M-mXZ.J W-Bi?gF-e V9?} +T.5eABFJq[[sfu$ޣvSTyz~:5HQV29dO#}r:;6ezَweZ?wlaK#:Api$:WZsۿ]{3afTN_Į {r <0rc'&'?H!NuS#TؿC2^wU猛/`$Edr%Y"rܺ.#T\Ⱦ3y:C80!'<Ιr`yl^/9#xSaޓ@zQwlc *.@܄{^Wwg2N4%Nkmc-,J*0r2&dԏ~u-ϣ {tոv@my6˘%+ʰgDG1@z9LAM† >&z%w}Tߕl۳[txa-u12T)[[#ä쨆Ǣ!w~sjm߳GH)4>/M w qw[<|FO%}it/E%qGsE߿;깸[XQQ b RI1}_WP -3,t>D&a,XF|2l&ї|2L%y{ea6ye-[&'d%C| ܈l\dWԥ8]fI8,@S?'gټbx46?"ըr9A\KS⊒.ڗKц&ns{ (+*HZ8(q:ZK.U&'IaemotիCށzAhĥ߼,IjJRL.uWuHcӍcLҍiyU5vJ_![,`ZؾbD8]bt/qoӓ;ɶ/KWMMqZbx0H%%8W[XRrYS*;Nj!xQ 嘋a;aM?gEry{p>&S_G(OVHGG9Vg@ZEV75}T ˍAP ',) >!cj-}.u:0B-st$HW@MVLRdIr4Mn:UdR's7TNnaaF$`! KrJWu`iCg[lN0( SD _c@qaָmָ wIѱns8+uX{D[uvCP{ y֏LÌRI/e7EGE%BQ.zR4G 8/yɣ*"a1 =0(XTosРAS1x'ֲb($ULoq؞}-c7Ip8>'[sbBjxE/h"j<=/w wu u;P#cҪRrm$c.%%/;n6bT%Að~cP!yO>c | 󣮾Wj?:~UNp'+աM{6neo,ug`-Wb3{}[O)e: ߧДWgfA9 +[πfoP !CN>:@_:º[HiL0 Enh#G)t3z& Hr4ʳ]2`[08Vg8r]N˅>WbLdQhŞEDB:* *վw7b:l$3$4¶ٻgNx 峯qL^5lʦE|j)0dp<%=NI$gr8jeR{Ysy5tB`b:oOY&(`8JoE)jlT:{Ҳ{R iQVoyVj<[TU0MUSCMf-VDB]^yf(UJJb%\*56RUQ dR1+Ȱ }kLݵi>T%ո_bIi/:rzRD)Ue)ՔkeM ,N3Epw#4ڥu eB.3%+.% "k0.RlDK%x߄ BݵgZ_Cu=g:›n=pF8dδtҙuL/S"i|X빝=[258sŕE T3yTVE?ȝբ]`+9cV lbp]ŦA\C&RhG`*Gg3/r:+d%\uy7#۝#@o9h_XTk-c>;G+` n=|;ܬEl oxhܡTԜWwjxByOZl2̓neV;LE\Üa*6BE|O-՚nT豛Di"Wg`]9 T5HҢM(hk6{Y&4<;M7fT:Y2ҪY-#}xշ c=CҝAJD s>{&okʨX;qkd?4Nع>x|>JD-qY,28jikmǕ')dqa4 ǰLځcMFO wQ%T  -YbЄM ހ dH(l]^ԙ;zy yHǮEZΖq q^ L<3dyўȿ ss n|#2y`pzn}a|C|oQQ|}|ob'UBՅ^F$ HW2,@&@bF$_YR\Ϊʊ8_JERwN Yؽ`Gl9r.B.=\kt5w1zVꡑ mCRq%B([!  %E8Rm'SLC}:XԋPz3w| oJ`ÑQ_{5^%:&͐7v Qxԟv[9Wt;^gEM()MJw`'&Ct3{1bC!3V0}@+++[/^6䖋hG YG3 MiqSX׶RQƕGƗP5t"onS^S|3Ɯ߀yAק KOnf|1oJa]bT~mh1li2û=kunno|\j6KpN_qAor7AI¤ TTVVJ +-vaU7:i8ܗ>,uzUEyNbt3 ;+Ժzf~楺CصU @̊%Y6czW51^POxbJ'480_6|7@m m1[@DbniA 0iՅ6>}yOE-FcWi) #Cv͵~xdnz|0wmpe%pk'K-: z g F7ߕ }Owv)D nGE1^[G&!+be7 \Pߥ A+,WUA[,.u]&$v;Svۭh>QtPs7SʑT(%߆1SvEHH fڀcZI*6rUUrXQQr_Bt :`d 0ougga@T*$,NS%/B6?>v5ղHTxȿ > u.[Am)>-o;YqW]m08S04554<99\x[w,,ǿ+fʃ}#NqMhiZjɂ==5s )ߑtYq_cP6 -\===]ͮF_UR )$0wlcU()pCq @-7$ Uי+N o\:IyLze}MN]Vsaf+lMV bzԝ?OBNb"IBP?OxՀ$ˋ͐(O!̿NU8};ZvdžuN>8.湋 =%>ۗD?4-XUU:eB{EcQo0 z# r3}zM,Tϓn\yBס4\n7ra|OVfŜmZw3y@.E>sydq/3jV[K1곳z11ǭ&1k  /~ o991 j4rٳgR 7.]d^B?cRnlwwL4S[Y77?Xr wJ9]iv>;Қ׾R `֗ӧ`54#$9XbǖԹZ|K ;>Ƶknd]˾yxp}]웹5yvIW[]Qzǡ}[ϧԵ;7ar>Xd,?^d?jR#܍@=O~zxKU/hyl44MI#xˁ_hA#f3kQ3]kɱv+%‰ JjM]E]Kn1< SK$Fa%H#.6*2,$ uu'u u=uu uK&jZrH }Fa`w]z}4vG zr?%-S1|C%vE@qi"wăKu|" # 5hzȫX l TV2dj\ZsGFuҨ:FPSYZ-SoZMWd5V}Eog)v}u ec23hS\i۫Fհ3u ݷU5*W0'x`HP[ޣJOW:&Sg26Ѣqsr\{޺aj4Xg2 2FͤSSSVە)ZNP /#t"$D͝UjM&HJUwwع2aYdj8#a\! $Ee|ftpeus=3襙t&mJBQ 't9Kn93J00E~0+g1 %{#\*`K"h2f7`5-n7]_|*QG*W_w<?(L+])Ȏ:K% Zx^*aϑcu̍nH+f*V@EԚ9W"=Ao// ݴc얊Ɗͥ-Drt]h_5>35=:Pe?z>CB!:"cI-9ʉ^A:ݎrFLx|[Jv FE,KirZ-55u ,KrD9 Ak ;܇vHģX`X`*v(R)z`N;xNMݚZ--[; x 6/ T4ӑ *֕x˼]gTK]wI_Q

BnC߈#ߙ2EYCL.i5 {<[mu.9:TWg [@4Wb?6~}|aq~hjbClqD\9#y^0s J94`La]gH"~2mB[?&d4u]~mL[Ry<8jhg#ِ^-g|6OzG__R|@Rm"2_XlʂM0!xؗ{l:8byQdN߯ VߛVF緖7immm㋮o+xE|Ngi8{vN-.Ʈ @O+ uѝfsԮƫ_Y}}3"{e=L#^&i:KL[ڃH&M:-}SfԮc_6g; Z%ոV&j|vypf]dsعn0sq툏kEYЎZ#{Gvղt2rpz3=8k{{:Ni-6İ4}ԗgw»9 j?#7)F8ZT&;XAM5STUBT5^399VS@ZiX|L'@hDm,zrm/X~p Ś0ˢ,Oϗ} %g)D?VAV%]uw(!tܲH$L/HzF?9,|WAvcB[i#~r~pr3h&~ܡq6z^_]Z;t}eee'Z;_̦u5mju{橁ʰZ~W.)/,ˊK#>]$_P&?9]h;qϢCтhK _'ڎ.}_'>` |q'>`^>pL2A◞3 8l['!$?.aX# S\)'UYX@w'}wR.JQm'r a w9}Ӌ@s$L %ai\ 9AIR cbas$Il*V^MD]+i|?TD\Sr1X@? ,|μJʧ}"9KJ}1ENxPvD!ߖ!e߾vOICdTv( ;Cm_ҸwߥY5y{syrJbB(0ɻdYӕC(؟}sү]:]~boK`Vj T3!+' < "d(~~:'ڛl ߷U6cUY2[(C-Fy8F0MlASfDD: !{#o${0ؕS|^VNwqƚKMKm53]Nդ+3)ZC.#b.+7W᪦&qN!ײv!v !&{?+uuN,minQco}- ihK0 6^D3q:Nr.ZA 41-ڱ2`QF( ԱVK$cw{lݿvdlslᎎ/IxڵTMO@@POUEC"SA*H Nbh8 RoU/^{F?ҷE@UԬlyvf< =7ɠhlЊ8CK̸8W5'^vYzqW/zK_x Wi.ٍ\ֵDb8CSmlh#f|8O]9Z̵ :V}~xrjBkyKUZwU5)K 4\zT³Beh48EJ3g[">yX^HY 6tÚTåvtĂG1kSVLvX2پ1'b‰86bݖX%rQv."v)8=l0j+~47g[fl5v!3DsթLM'sT %6Q6>ҎQ`=ĽN闺*.bѹ#"7 X6']*a aVͬGNMϽUVU[\uɳWg.D{v#Fv|.F,?8~@:(jjZ:N1-đi>]M16Jt<Et L?/t ]OOӓtRN>z\zh=GW^%2#Lӫ7M )Khr@ D*bi -aڗ. :1uGo/01a"&a2"VXb55&u.b#lM)6[[ZhEQİ5؎>O=v#6#LTtbcD7c',]ЅnFv?/>솹ݱ^B/胋ȠY,"^ sʨ`1X}8`Cq8Ghcq7#zޥCz> 8'dBTqY8\q.ER\qUZ\qnMV܆q]^܇CxQ<SxY,sx/E ^kxoM{xC| >g_K| w?G ~/w?wp r<븞x <'d^Wxe^Wxu^;1nzk zxm^x}ހ7xcބ7xsނfފ~6;V:#oo;q;'~SJ:Ny ONy3y̻pwl]ysy{9Ž>vygq8}%.s/a^~?A|0‡a|8GQ|4q|<'I|2§i|:gY|6y|>_E|1_—e|9_WU|5_u|=7M|3·m|;w]|7}|??C0?c8?OS4?2~E~_WU~_7M~w]~/Xg[ָhEc@*],)xo]RJBwSZb2 .iHW}}[_J|>=j锟OK?U& 0d5;jI醫5]% SNeNMʌ)@J4L5W}T t>7U씑de$z$Y=uVم ªonjfҕ)ia-WOINI o59/0S3yL>4,`;&όq,oA;KiV%I+TT0@CQCCCQKnURm\FZv`n\0_v=z*zzd,KKEImO1VU1`qEn9F ?UGTI~]Zj\mhXU4"EmZmQɗKJyGHT;`i!%usn-eKuC#N炧큹jѧјh\4UVKETYUTD/*!QE%_TE%_TE%_4VS5JK2!5j_X!}xZI%avEW|aAvo,y¼ub0sUb_a(ZE#QQ=%>x-E4$jڢhXt]D4*:ItNڐV>=#21Y,YD,"KEmIQű[Ö-dS>I(^GkU?v;UٜʕǫvoyϫPmK%F[u`: }Rou7|[zW|j@)+*2>7fh3T=i**o ᣆOVe>avÛ;6X mu cN}ǛPV=`~aj־Suʩ?u3>}3K^~4Tmx=E;'JҨH)GCIm+@+a ,j,ܜ^^$mr'Gyw>K7%eG_c=SfzB/YZFowbx{P9.b3ӎ5ƘX&ҙt2Nq:×%1> p}:T FiyRm͐VSpB 0I Ă  s)(o[V ָ(vme\#5,KV\<@k/A{mMߒ/Qv﹣ކvh Zrg!Z+7ope68ݼ= J䠒B[Z6p(4qhGk>i ;U4%d^uqB 7ҕt(dJNV%3>(*zh&hNpa.0\+p# YyX%XwiqzEk#V]*[ffLq`lql#WwI΀*uts 6Dk]'t;` ٟ9Y99{rrM(:M{9Ct^#tzzi/i>V:@ ivзQŕXG}Hu@6&L[R3mZCߡ]F!.ѳgzj e2)ijq\OZlFMSoi|[Dd2ZN+[TKI/le{j|_쿃2`Mt@h2LبV]>",W9Zi8|1 _Y엵>_SrjU#gv^׭L ʃrˣum/nԾUV+9fAC9Z`LJlϲv兗@ SU[-ѫ Չ #5/۰Ion&q?Y}Ҙ5$F~˚V{[kSTֻ#=b7c`B*uQ +>˙Q"py#ţ/Sf2yf]=wL=Wv G׽|C[>DlY+kyG=->ޱryI)8sdc6/Vs?i~%z 9z= ~z>k}o^v fN`#G#ݳf;u{0ݾ=G;ߙ#܄LDZV{sHݎ՛cޜ|=H8r~f\*Ojwv((BÖgnsû\JjK[G!C{9!xU#b2)r)~c~ :Cxf Etu 52,#3ʨ1Fh3:.cǍ1h aqŸj\2feyfYbV5fh6mfE S̚{ɭppppBs1;YitT3-.apppppp5.7YitD3^NappUUE\df5+y}h {/aΨn5aͼ5; W W2rL/k59V8V8I8IPPBMgVZ3h晭bo{ ˅˙95ߔL/i8!Ğ ||22yϚoJkC9j{;Gxv$BH%!HÅ)woM%Evҳ5{|ƹ8gړƌ?<=z$5ER(Pzsw~q*Ư4:E pMW5zҟ FM3EiC37;p|flz!}Dsi-6JvG Q: :FEd\ʧB*&PU9&8#9c!7K17f܂/V|-+j[7-|wܓ{]|7~~(~Gq"xOI2“y ʯ9`l0]?CP7SBZkݵ7%va f#|I^C#8"-14idȔk#o~.rXȍ[tSsLs"ՓF+c>Jʎʏ֢Ew7z`sQi6݆_Kl"̱-Sa:ńbcy¶.fx̸w䒘cctPzIxJsb'N;#؅({؍[cw5o)z^hYZ }O7b*TU%OQ(1i(A)ŽҎ 3váZ${ҪBժ(Aj9-@L(F E\nP(A|v*z)ݲ@7roѦCD#>vuF9fAAIT4.rA93.E 3O ~/FBQ@l!bKylhKrx4(Eib!Wr%"R`P 9!>iG۽ԘXGU4_ it}E;}8RNo]I9ԉN\dsK[|+ZYCpV j۩ !"yc|<(~ڮGmwb-| X NE'ZpZЁc10ZVd|ĹgKEo"yC-Cy(]ڢkPBJA h`*ih h#N{y^DP,JMAi(){%}~0_lA/p],Uh*c-\,W6$VhzE[;"PO20HB]d]'5B;Dq`7W6(m.v6W}%y8`kG;3MPGI@נkPcWj'i ^ "'Swm0{j8@ J@s%29@$ԯxZClpn:wc44}S 8'5>{k'grYf̀(@`XB r`(ZNԗ{A  ( pʾdw 7A-"KFZCk5\k@]b u~G"_X%"^ ` kR2r `J_6vԿ{?~B~@bF2ȀeJvbpH*qF2= hq_RÔ85L#H O%Q(% TE[#xz7.ēhcƂU CHm<9S&Y`RB`R|sSz Vs C2+$Њ ʰiO(5>Df݁8 PC~[(eimy%K}WP}&s ;eZ[BY1hVg lv|IAw|\xƣj ڟ@kX_y/Oq9KR-u`5`ҷzDlՖ57"][%6(E{Q^Yi&~ 7%.%,|8 8&<@|b-!" 7A"g]w= +tCnqkYa05~.X]>)G E>st}'mpmϡzM\9Om- nS<41\chk\hQr*LIU|ˇ:-ZY0&MC#%ADNh޼5D7 n_^z$=EO3"MV>WVӷ1;9.-W9X#-ޤ#9uQ?K^K^k[^y3o᭼ ^Ï<Gq:13\ϐ$6H{X{D= Ӟ~=MԦiӵ/*m5iӆHsc#(%V~]|3E!C|j$,'[70[o\ٗ3Im`Y/s:Q8~k\7 +"ŏb?b.}dT|, `H@+bK\`_b7~Gzn{HS v)$i$ïN~T"8Đu8"V,2EAjXNN@S&zr/dmoGs<.R*R>Ft$zYC__Ķu3!էc8R[# e3vȇL:'smNk5V5 ="~U~<&Ҫ'Mƺ>+Xp:k:VIͥoho/գ\#$.yC"ӽܭ&<8hpI:is6z4k+3u[m@Uu swnUi9`9au}&E I,kmrObs^!gPTjSjW|vsH_.>75ث?toap.Y-t˫+@/)r})nqU}{+̨GxQp%𽫥E:Uj翼CEQS/AIOتk/.(w||ɤ-T,$Spr OV7R K?OaNqUn&BY3TO^=6 NYv{!"?𔸡kkK yNxXoc0bMHXVΙ-sgg|>}.z}|OK}Yhpʬ {]s'TRoֈP7b~/W*Uy(փ'֋\ԓ*9:@܉ rN/ Q[ZeyrOĻ^ڈiGL^|UU)7;O.* _v+~vvǚ},#l<rvsrÂ%)5yR{SUt}LZybbX,ܓm/VV!9PfBbQjRʢGפ[QiF΀ͺw͏To:v*nԵ@ߧin~5ϘrI)`T:oP;(Ҹ襣-2)1Jq;5lHYYc .6o"v8-NTrܝBt)P lgKQxqs|F0[ ԿR~77Cn6u~/ԯ8\_@`!!=ʟ\Z  -,,,XNx5k""bJY퀘,WB'CyB]Ck%;BRtf5İmվ\)}m{ǵJZ\Ybʭ+TVZ]8/% j.}NJR}XA/[z3jHӺ>|_;c՗>s$| ^7skj.`0p٪̦X{+k:<5E&Q" Ͻ{J 'Joӝwc]FR=iգdwE9'wo ˡ$8S{8̙1pF UÅjOk/Lin E\k xD!xj.:H7k%kJ2_A6>qҳ_YzZ.UW'kU^+6H^#^[Af"Mފl[lrb+Ւg9skZ8,VVl f`N8i`$L{Ԁx._[9&sR^i%]/ .N<^QXZ4\ z0| kMfbI͐KU8=jsTf?'9jtcq_.ŃX$jk3 Ps$+0 GUw%.RZ)Uhy;#ڼ9h7ٛ<*-EJ *)'wZ{\Zb-֑)^ߤ7awl*٪i|sPh@Ԟ9 륔6C)`Z떘rGqlX LwVb*Zi\=,T_r{7A,]5F>lӁ<2uߍ ]Կvw=VŹ w}뎎XMfl-an*jhݹsGG`>~yU*PnrcG# Łf jxCzVZAK- ۏtwVf84Ӳ}Zs=0OQ1+xH4Ϋ*i (!>=L[ru7aMw!贐̲׷^[̤|KjYӠkV7>։t֚NkfSU{J}fwm;bg9-T窢G VJHG{s%EvRRj9>jVnvJT Xet[vBmac֫aW}*ѫb[m(Ӈg߹*G,G_[b E T*yzvJJ_%Ԍ@ЏVMpNv؃ ;Nu׋.RCԏF>OP A4!!az6z4՜fOCGKuOSwہFc^ @Fևﳄ`!A @?V[p;f: BO Vp(z'3Am4a:B;MM `+&EY?`+{}zTնY5)NG1BC_p4@h4B{ bx?";g:Wy u@yRe8^ Dp' FG\;!<^I8OBL FoHD/2:Mg"݌t `27xҫ nE~G/IIc$$Ǔgq'ϭgHy#P7 \2ZB?vA tU^tepwA<<\\\7I:缤c:OTwC(n& e&1:C q݂~f\og+" hڵ@p%oĈrIHh܏l`C )6Х1mWHn:cx_wWh̑ [AJh58h#ĨAM jmHZAUHP c5 fyn+G34 /C[qNЏvMu'7e\Q -d )}C.z`0$~8FGL]?-v7.R*u?<6)}c!eLuyC| ʑA>.%rm?)&G\{mUYzH i8u@WFj1ƈ+Tre=O0ZȵN+vΑ6|iqT7ɹr{^= }ةښlR; 礨~ ޢXI }% w97iOIG@AY}4J= z6'Σei5ӛTHgi5^[=|%|5q@|_GzEp,?ˣyܖ?A"%w. yiaG !==iOkWpy^eDm"^^d^MӦ[[AR7j˵S[ryxc`d``b>̔<&7Ē<6`d`a`҅U] դ'ח% חPKwL\'~لDlimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Medium.woff2nu[wOF2 P?FFTML`^d  6$0 : [#ȑn{WH7?ܖ\oV`BfŦ;_2n!g"c?D<"QK+cNE3}x/ˡx9 >]ь"HjT7"OS}铫Ol']`z:q#:JnIn&h49D&uTsh׉/|%g/~b~ ȺGkc#džSr_pKN$ɼCD=V2qo{uϷcՖfSH՟3:vR \^dȁ4oZ@0?p5NCɋJJdeKƖ#W>ȿWga#pRFNE~1ӍF heVkZp5cٜMsژX("TI * abbJ]鶯ۿ.=jOs{hO${wA]LW~$T̒`9ˏ]G9Yߕvْ1D i(7&9$2|;8W6X 95amSS{{F$D \I C%nJllKjjIdo$,o?z㪉 @k](;8[ m2b_ M5Eh';B(:7Djל߶zo?޶c%4 ߠ""!8a@=m3#ԗk!ֽ_-- d7ddB8?òaZ,A1pc(Jb`UC޵)6@@zq#%1)IC`^@x{OdTKVZncS@V_WwWp8aܿRJ)1 aa@lSL)}kmva޸7dfݾg> Y#yIƟWZ@z]o>7q+vZ7!qpg]z 9o| A EP%ВFC +Hf4무Hcifyo."Eq..6.0 JoܟTO: B!Xڗ,RwO=)UJ {;U@X 槹BSPȲ"o3+I2OI Q6ۍoo%PdblIOľþ_C x{GhhQOԙݜfhX -Vv Y-Gz5^"MM@9uoROǐf, y 1J]`x6,\%j&/:dB}$=cuFTEs%@!CH]):[|;hb"1^#FϟY K՗$}XsxQ"N2A^~K"du[* @KN(`3%K=cA"|=cc#‿t((1@`XpAi&h܆s{uz%(qpCTg aBQU ӲҶnfl * p"*$5Լz8,_<6ѡNVh;8b`E튆{Vai a V^v}"#s"mLp8EUWbDaTc}#u8dT(0A)rK 20bD\y3 5Z_ r 9ZS '4XH}ppabJQcz 6QXU@@7#Fn':ED\:ǪKi9oǞ,kXoݾ'QZ ., LًBk1:HH'BBʲ>loȞFy;::j \(zGhZKXKXNY``O$yp+[UrqQB 'g0ee7(](Ɋt 򷙚Q`!Kxk)DkV^rxc/9ks.ݑ~[*奲,ʪOWe8"G - C2%K&oI i v=.@ AU'OJJAV3Lzj_J(*8Ws1$P FJ= |8&cI:`y#,%7B\MCIIdMx;>OB­ w^b((BB~b!6=q ""T*K*[_*v)|uoXEU%XTW142]'9i^35Y+.;GOY_ K5bq(3KIj*|TTE>J d| M{q=Ӣ?j} ж DM\o+$P%xՈ!'NЖ'e@a9L nq UQ 9']"nʇ-Vt՝ʗ߀MEM1zn-q݉"X-ӽk^!j¾uf,\|%zBnSc1m/tAW_W 0Br& F'ڪ7c4P1l[;_xLMEMK3n ¦7`ސ&h;Ӡ϶ lj-B]]z]ϊ7y[/e6_87tܹ'-Z9_g涞߶…;.E>dNʹ#K.pך3(ӎv K mϳL%!zqHDjHIGM*흴&TѴ͗p bDJW>L’Y2L0U>8u9}I'HB g`-F8lJUTFpii:uê魗X(}L")+\}h[*ʚ36PM5V{g못]5]Mݲݭ}{mzP+ mٵNϽ^e[^:ߟ]T kQG"L\s%xxhyXlc:R'Q*DtΰJQDcQT=U9\{{wj$p%"ΦSw/1H{:E2hs3/<0=~@vu6]a:_V6pGyfC75B7DŽk /g6klq<>iwT"R$c4TAө$*+^,wv^4&"* ;%b잂$ߟ p+i&|/N[E_-,BIz8*ۍT5 ~|Q1EV L3x̣ez04G.RZ(}Fjfڋ.l_kUh $ol ,1Е ./ -s,.b:ɯM>e}8&P`Y!Ry.rԆxB嚑T.e(RxfZSfaޤ5u@m*^=){N%}-2=x6ky.00A:K((ۋ_O`Kvx8ɉZn0ljyPdRfȶEUzJ)_ti"Ĝoͤ,m.G-P4ElyOP2G|"ʀcEr"ar&*y}KٔKmV'2C.HڔX ݐJ )`qNA60p2:dʑ>U ?*7]'n92PK$wa@L3Z`pfN:mh[! b&~eJ0E]00\iP(LO.drU24 7seq| !2LJ5Srp_?ei&4bFY鈩xwP4}7(<;J8;9&ԽQ|9dL,Kq T({CMT.?%2Gv-yn7=ޫތO4OM=VF poftiM۷I)ա̲/>N3.3RaN1k.k8kNgg,}?;u_M2o=id!q'C0S5Qy&;::jKYHTv}CĪĢ3s٣H) 8x"I W:=֖j{̠\0 hh0fp$z8.DIIT |I9TRXmZuDCH\7N-+tJ,L3E1Ӿ/OE*=uf| Ok5hH {$K2Swرh VtͧXsa?񺰡6ie0&݂>t$gŇj) D(FDW.F򒱎z\lfuHТeͱrvק,ǨsxN-ww:ɰ)2De*.%OwYfҙܚly6c= Sbdl f(UJ؁,MĦ9TWZbM{dNzkڿ .q0q4"NSы Y3wsS0^Aj%zO-MH\QI ۢ*(nCD;Ez A:%W W2ÑaG8wAnνg_˧ ˆQ\\؝VvWsۉ8ԤPxi'g!prÖG]-Ң`-kO5/~eٳ* $E|]0|Q]39I0W\=#B1y:zw~6`_OnGt5{bh0 OyW6ަA?J ·භS K룎G.M+ 1XAPiذiouEʼnw^Vh>C}W']5TDpGéMT` 4&2Gq3A!'EWSh-0>[6bYfs\fn岦:ǚej>޹X2qjjǛcw+8zҀ#L]c,xX0$xOcf pr`1=f0g2"r԰Ĩ~}KvT..._a-Q-1]bC̴݇A-|^36 Fr)˕FBuMb+g@`D OWW'oFׄV 7KBD#@?mUY\ c]});m !Sjkqi}c@fp~ɀ"}5U^ +M)%ʤ4&"B1܉(Go4oj#T Bp~ )fVH"%O[>y{ꆪ68zd9ƒ^.*;]}pF~g㹽]#/TP`;&1@!b1 Aa $C+8 2BtUghLS٦f~c1W\vqۣxLV{깷 $T)ҳJ<\:/"D2*U݅Ђyu tuU17XjCMLo]>栝+tVH7<ƻ[g6ӽE.yu+KnZ{}zguPXּFܸ7 `G0&W+JW}̇5Z45>Ge|Hx^7qǦpK4~9< տx)_`S=08,xI 2k^mlzgF푆m :8Un|^v8<_H 1JG{z6#'-];2#pr<\4JTp0][SH4EŔ(\ rmRs!w1O1 4##04 ōuO|C3>WwumrK*B"ho{s6YpF#xgk}m32?wrCWo8iܖ:V h4hך_ૺVW7]20UMܨILtk7:6>8@ lA|$46 #3~&e"F՚ &Zy_ D- 7XpIP¥4 P,Ag U8 w<6gFE+F,E*xL1O=wr:%99wEf(CK8Bn5e5'3K&PcNr%zX#޹Xt>ȩ٤U68NLdFA%?9W "D6')!"lqg33FQjʓ-LI?GXܽ&L+7BH[UQD"g,kRg1-C,/@,cG$ VY\[UobaY? LTcM[g+&<5پ3 <VyF"٦eo7JlhIJx-1WVyD q& 'lYǝʵc/oŶa4!sYǺ\HWsh%fkŘ&. ǀ}`ly Q;۫WMv˞͠nt;?rѳ:6" Q}?2mխqƵeH,^?7aU7meU7m/UBa@XEEͣ0%$Ӽlw8˺8˺G08kBߟ8yߥ98o?8qjZͣSQĿ8T EIF&Ƣ8(f3IG$8(&A'8шa(,`0`nh-86zBQv$T^\̔)0k'!"b,h`?B~]2dK~9Ӈ$ߤxu~/һ#~/j5Y柉Q)AX(J411EE\F׏KtEgqøucmQQ\̴ik$"bL鞎Y3: )`A}||E~Sγ?`6 ~$5(^3,FzsMF|֬E9ڴ;3Й]pK[զퟶ؉(~V` Hhg_Hb׭;*w h帚;4=r3_<;A8&y Bcx?ܷ?TmpsBکgV>"!ۤjaLLE+%h_!_J! 5q¦Uͳ{pozKg0ˊ}?DMt8,bGyl4<>>T`YO}m[7 cc\L1^Y}88%ղ66ZvFnYlezngvŁ=`5'ifmEz_>=ͯ;?=͏3[N3?vf{?F]/ z<سq@{%uo߹;{OO{7{zPB/_X_σ;W>'?''ŖZn;٣^ 9;If-:ڜtiguHc{ɿvr9&soڡ5aKr\#TpѪ\6BKԋ,#d+̷2*mlv[=FU:eUL^%rB X@b{9+Ga|gX'8&z=} ON+qufD&P 哷$@{\Yz8}1ySS&+vـu1\))P~Ӂj= Re)-)%|5/@/C4Y )0IR>% YvAĐ=1*IT2s;uq9 Xbcn_L(4t)9 տx*GGȫ͸HSWBwy<-&'uI@AJ;^߭ɾ蛈(%#C8P)SV@I"g"޼ k6p[G~I r(H~$իh"ʞ?1IQ0b] Ú +?2e$x٬c~Rq&)Xv _ۻ]>epyM(W42l8 NΡN{Jv}Tw)&fI,~G Z%K<Xe7ä'7O63¦1o'+a\jSD%Hb^`ҕ)<xKt!o%ρ҅PX0մȽlKHCa2D[":8L2)uO!(iN8ErwWRgΣw^ZJƫ( Oo%)vHluMO=Y?pxižrP 4Fby,umT/T>^жt2ZEt1#[PƠ H22E9>VXI!LX V f^ 4R(5Ra*Z3.F.Rh5RaB𗺲lkQ̐TL&DM T@-D1h@C5Q[訽G("S /(O`1B.o@ӠR`GD? ˣp"sPje>Hǵ9%H{x@^3,s㊪+Q R*(7)MTƬH#^1/?AM L.q k =pX=Ũv]YQdż9ەJV%Z)eX;何 1R sI!ݡX1G MVxhpN;u>,H23ӎ(CÖ#^RJ`妅vs`g-M0s|d?q գϾs&2j tc'E3_̌3b>rj#\Sk@44Ek*C}Dis3!g`kRڶieV`LIr|dFⓚT`TDhx^(Up-ԀqXW?ReÕJaM-ZT gǛkg^<({ 9W"Y2(?x{/^1pF!!C\U@;(@AopbC(E8v4%,0-ix[]LQ=Tlm.z Ac;>dJD<'GU,l&j_zVh$ʺV>d'o>d.d\K G E4hQW&ukTr/ř͛0p ݜή-~/PX1Ќկw4{X4?/P$?ZtqD>4 aʟ4/|!F|AogeǠ K XjXlGzz+( n>'C!2¸ˏL JvQ)1@-CkGw`]K9E%MM$m{a-_Hj?E@KYY iV Ä,p,GFz2Oh "7ҼzG4!,2|!q#ZCjȰZp@&#KyoV'%܉֭/M{ra$IPJ0E)ƺw\!բV*X)HɹYzGڈbՔdERBm%ǁ ר,e%!~n`r>ѧTX}8$ Y5{Nާ).1^ d}IX?^j1ƇT-0a+jLk{9>prG?'ܺŀRUY&bȎ= Sp_K`:̪5SgWO ڀc ՑZ]U(:n;ؒ J?r%) rE^DdE[IRhH>*;AW jy( j('Ga|Ҭ"e*JE>k(C劘;fUDq=EݮBg{PKS+਻Ī"?p#lv%(-z !p3VnDD ὘-~JkWt! uPġxO82ҹp(?@$M).GH2qk|oxd*.l\RbbeDS!q!]]ƻͥXqoF=DNO^A{"OUi?$6ܤ*t[`FPX"pLAciF3IbEa~4q'miXsv*P{IyHcR^+Z )"eI.x߽RW~'M6c[1&:ob"P 6VpGC_6\)e2 $3CHk3MaZm@FHl 6<7-i},Ak ߳ ]7Y'Ӏ@/CxFx_W(b7Fv]"]J|Saurfi}EçpZ%q@C9D+ccl'69<8^_bM~d<<`N#< ٔټcy;7(6uGIЇ9 |,Mf +st([ɾLҬv'xb+Y@j&ѻ\oqo-L@_ׇStk:ڥMu8'D`h{$~~5%UWhMgIH8#扎>[СԬɯ1krq ! }8ʒ/#>>;Z\f) 'ϸ IY% WphY\6S ^> f e4FIPwT! WJJ~"oCf6Q/<gW}Ӭv]z[r t<3L1jY${fڿ\nnHu.18H'Ž%7Wў4.v"y )U3 \.#4YeӛqTy4FmV&ǒs]ۥ9M9HPqܴf~ NιWTu)K ʿ4Ų㾲Mx05LU5mS|VǷ c}<hX׀Ї&C>; trQhu S|;?0KzÊ3<"yZj쒰j||';.Ίw_?buA3ز!I7A3 - I0]\T66S)'x 4+ECfm)/AB-(312;B^̢~JVFV.'zJvfů5MIi0ZK#'@X@Q87Ōćxh"|Sq#u)lͧhEr_^m)С8>Nga)Z`uP;]ϩ9%xw{z9/x eg+;Wn{)Se?T7K oU> `mHϧ}$\!-`H_ N/^N+&߶|;П?޸yNge_Z* @C_k=9¸;3hP1svns+K=^ UUhE{L"7Mo2.VQ.Lm>(#NiLw+6sffs PN+߃GpIB$ִ,FZ%pi5It5_d ezN&1WNm Vy ׅ( *1tos _[١"Wewm5|{`S/PZѩ5y3,wV@C,XC#;tb뱜F8䥋ۋ GF'9_,576G9ʅJ.gA33'9=iG6iժ:{m#УpZOcLSv)ETbu}]#uL^|W][B矇bi1mNv]Wq%r:Es>3tg-pk޵<45$.~wk5?ԷL]PR~%$ yDǮ~ek K+2\8Kӷm"$f[hJ)]WSxR*,42YL:yIo&r2_UǠ`otN6". %(AX,Kz+˥b/%0zJr@yW7|rKחYO|&ȃp3(@^^Ӗ 8=F5.*[yAQо868F~ah֊5M͎يR4`)BKkML7~+u85U-D5M ~;Vt6Sƚ/|Df)Qga>d~q8vxli>an4j),jjR*NY\)ƪ7Dn*;zJxڢ bH`ЃM vWXF+/gi~im|m"t Im>ё`W> _3:]VS:0"q/Fk5ZE-u#Ehimtݼ}Hفdk ʲӜWOz<[e Pd܆#֮:v;'rPFwU]9'?5t\QGOrx\pk :hP[f]3梤򶚶_b^|ɵF995ͤjT if[W;29Y|E}3%N /#亷kOlы]EW] ݞ߽NmN"~>]?}ʞwם#=]IN[W*4b+WBd Sd rrXN"CrM޾1 s~^Nb*J%/dz5 Mf`#j(/~s$yJH@WQE3FswyU8$/?q]YF(tzdϗ#&3y ",{*-BER͈$H [GSZJ9^OQ[ TpVNI2ytkduhshV+e4 [&smt@[sM1+dQNb|rhJfp:E1”C.7WV8 -hUjgA`Eb*BuŎ%C 3ђJ[6ʶS ghcelǩݢ:U_9dIM4+^R[ ÄKYY6sbgsR^RbtKÍ&PhщCnĵþc|)d ZU@ݸp֏+a l:}5j@v*z6T:(s2~\LFQ<~\Р)uO#.Z#pGTg9 %9-P` 3F x;jbҚj@!H,W΄ͨQq#eã"y}M7 U@T_5 S7F):3b(Ir3Z y^~|ޚ朜@5(~'iA67*;K 47%做TsTiyf_JnfxxiG\/):k >-Ht]ǡ`QF,!oCKk,HrfcD(,o6M;[j)-%/yy)؎ M"Q|UaK C 4Z,E5訦'NC6GN4WnnHyE>ٮ!%h'n1V~: w>" NBq++R_F KޯsJN礞9q`ryQ#rG}݉m}>NS~5_&ios9Q,T`Qq8cltfLu = b ?<|,#`_"-Z5|Zԟ?[bǒ~Ȃ6)h% !QrK7ԤwJHNA|(5ŝb.]/H~JVYG1ͫK/LTi2VYŇ!H՚*!Q\LÚdfþi&AZ"X ÿJ*4EzNu.-`SŞGq=9f`Em͠J-yw$ODzzfV˓kgzCOYHZY\޾}@P36IA4 ]7x>=nd|"8ض;twrs냭9"upH280HM5OwuvuL?d?A$Ѫ?Ҹj17ߑE-fzVM[^@ `Et*ER`K&wgȼI==\!=e_+[kx:19ir*ɲ[0eR aTMʿsa//]Agyհ !Vp}ӻ"S_OI MK@'pxҷU*PWϭ뮓[";G3%oS9Er_ddħ(kfG|(%')ߦdž5Zg䑔h"Bv</`,217bzzJ6fEVl8H+Ϥmx,8w*%j$FokB"GNݺͭ1.jX$-#`pN'EEC0@Ey -8ļ +su(yyzY,"4ݹ\i^o-sx0X#J&rVKޓ1t$ )SWqwLγ@g /6KLAÁ@"JM/ 7BufgۻC͞bMF*g|>lI:16k=(sXэs$~W HՃLM s]ZTGu&e6Ūj~ͽ=e uf+EVW2іhu:+T#1WsNpد0;$|V&ky4 +V3=ӱޓ,{9 β_.rncZ/DJBHv.A@iIa,̑]qgЪM[ۦ|)?{ՋɂM@^rc o9M)40&j  [fa MB#R =?;b}ĒH(KwR|idI@,?-iǗWu74;ڧI%s%.-Nhoc (*:e^odm9F05<4|WSNͭW 7] aeJ"TR+ JCCJS/6?XqV5<qYkpGz>IC:Bw{}3  O eTY hl /f^}ugzC S+A.-NZL8x^߭G4"zwtݮ.k[8ृ}4#nim˝ZJii=݌m秌Bcchn?46- aR r&5:l O>- 3͏λWMX2i(Gjh"oKF.~hJZ+m YGJgD7r c3]}hq۶ȟx'r `9O|ҫF.]\tm\7|eGw*U?`~KKz\kDTG * m$m߃<AuPӯN(-KvmNOA+.H$Fc4TFiG-CB-Nmoؾ߳kSR'v[m[ُUpֲj96Lzo Nb3`sRmt'0-/j`jy!&ݙP.PCB1 Q(6Zf <@Ppv?>Ս0 1@Sw"¿o$D*UmhB5J1kU?9½|D!+Y93\=JTE\!iA_xԧ_TUj/MMwΠ<1/_|>^4^{ƃq3"!+*}!|_Ws8|1WݴY^ZInWl*LIT>OeL)3YjLVd' NО>~$b?Y?1HiS~g)K{ʏog?^9g&ZF7JD.NoXrݐ4nol~C]Sjw:|**% `LqZz>-j"JIH`dLRKb;HҝHįl+i T%vV2w6xl1S"پ]P/ T =ؾ]"ٱc9?<Ԯ>j}\_Hv=/ə ?2仞UhFB=fp3 k렰[ OkrCF}bJ4^%WeV%V%5daɴ?܊!TOm +[2elI-}\աد_5wQ%l*iͪZkIR8^Bnr[ae6،0L pЊY Sa&37zm6D&ֈhGkW(TzE&yfVbf-`'2ϡsʸ!SU=s`R퍰$7۳g]&c2$}Y Ba"ҧn3)R}AdT0cwo9lkv;;b ) ul.VU" zKhƢoәQ*SzfV98 ։5!.1M< $dLțŧY9%,dSZgJ9%b͆([@Q0 ҅!a=fs:ޔ*2'ZcP_5b_b^:1M34h6ArAjQu|^o44^Q?VTh+3vkBrFmzX;DZH+sY8y,3h&݂@R>.?UA5T#\D)ns{{j@o}}>so@0jT&oitٿ|zuN`G#_AP< V/(š{E-^|,UD%Y[]m]^O Q2SrXdKl 12*HԐHIVi C?9 I͠ m>RhKdVJ'ꌄ0X;|HzZwLФuMڎjPt|gD%* oefA6Rn2v"6`瑳BQ/-Qťk2im4so['"1?w^OEwyI/gdK2nCig޽ XK#n%w`kg7WD *bZu !U']G2.}mپdgw !,Z?\F,.9]KfL02Zu5)d-ƛrQZ~f6HRcNcD,8SsLtlB0*T0TSWOx4,zԕ:qaCS=?mw nMwX?^o3M9fd񋠀!S2ccķwAW{\7 눖No8>U# :4KzN('qOփ,\mAFۃUQ՞/޺E1=MS'O M10#M2+5c84q(;S^9JĮr@qOU*UDe,*/U@_ƌ{qYio[Ib^ݑȥЕ#. R):VWLH;djo} .R܇BOPTXR]!w*!Z?LYU/0Ӫ!"srV!"*YC ee=1d~[ZMniuwEKYK K@o _&QC?!+_'K'P{5G,.tAT"=r4) !lsQBj)gd A;:[=t1*N]qΊ> -Av`ׂ\!q5F+f`/ K}1huOAe 鹋,3XjBPHs EMsu̕`g&.q4'QW.=_%XmIŵLۃ2ꈸ*+%^4pO7FC]dU*SB 0/X"gdG. ߱K|Lɋ aI|Eh+!r=H%0Hd,]Pa!I+(_/9]K4ex]i[ЬWp.fFijj6D z?e Uol B>`߳ ZD@T I6cԞ7?{$lҙ#{#yCj=/{2lf\kk!HG@ nx7Mt1R !xjK:s2 vH'99|n2 Z)4XMKi'os̯dO Oԓy3f#,oHبqP ;pb,$J.G&Li:aZtͽ74>6cpmTDPmBzA/@J€P0A?xœ'spLS`VLIf,8\0ˇ9D66.?0>-^R :{=ti0YSRcaiKڽSKioq_lx*~[qYj ?_TS>!;u o;A{Zk҂pdAXx_ώ`7;]8֦L>GҘYLYqcػwFkwEW.\5wN@.aW9ʡP],.(:ugRwR'p+ni?TcfR]ϱC!zC̡\ɻ٩ϟ81P GBC2IBTT:ҏP L[砄`I bjys51sv5ˬ)FD;&9TI?^?;s-C Rs%G@%dA ݧcvi9#֪NUk{rslz]GHGJܚJ y$\ Q5OݩNNy-Ol>Y FmP8ֳ]aAKx"5]и_k:p8Fl૩ьA9ž{W9hɆ|zhZ<'_Z[-|deOu+ǧ㠳4.rpIbшkJLܮzrAshN*YޯzEjIzhfvm?t 6b=286@^h5ۣ~qaԻؿ4# 4ԣf(-HE|>}^bmn,i>.2>ɒRddO(a5$t4QT$1p>[g,C54f %l_t`{R@~V)Mr~=@b \--f k=o?/H,UZ\H\+YϳS. mI]$Ϋ8j49.0 4XYd`=A"à;bh5y{=XW4sLRC.h!d*~/oXԒ;\iGA)Z5!i-MKl㪀DҠENJeQݯAI~^J+߅1x-ۭNzgq{jUuunFbʪ8k͟F ۑ^i׀lՖU[h'.Vx*(ml;{i_ga!C:DKG(>jN<]"gxh*Kń8 K9zYnKw\ViY l3E0E*+Yn,r?: nK h 鱶Vp"zC͗i.=LH;IhӴj^tj^,&+1}RΡL]F>]çbӀoJ2ޒLarGe&o`3Ac F 2?bpnM4_~Hu闐rAvP*I8p+2MGW0?nkgC}%/kk"_ o-f t, ,ĎNl2`jx{ahZ`Y5:rV昀̷dƂ\'UW9%2}@j0+BX,M֣p?&."FU[ao"/HOo:bMZ Õ5C;ӹ{jMp6 OXK= -pA Fm,^Nuu^6΄]Bۚ£p,LUwNZŎN]5*+nEhY F̓(Pj{[Ykey?Ev~>i^[7mY@b.'X;x䆴St,NDԺ1I9r$cLm=ctTfLZVKim52 ) it:l"t3rNg`ehgB5m{ٖ7t )Z_rnf|w D( uCK^AvˈE~®gWQ Ã"ki LJ\\Z wݑadxm18 6eiO!gI =nf|D6ߔ){VjekmpعI"% xkrY@ϫ(][SgV4A0U8 - jp(6^,[RZDZ`.HB+QzdN}KH % ശ$د^YAw>>1Y#;^ֽvC,M|y,K#^Kپۣ懔rlT9z少4E,AF$8CJ>FQEhSV\x(ՌױC)VFT''/242>MlMH f=̱%iMKdT)jZYB>]PGw&XmefVis)D+D8X03u"N]8t׊K{^ Z)u@FRMg1\zR[Pr6JqM":&  πjoZW@-Fq&JE@FuBϵ96#@/ >mQא/ Vu LGhU T",ޢZ GN]umT!Igl@nGuIap߉` =2j}@_Ng:\b)X+PBxhiIt P7% ;:~]M~t*qO3`O@T!g08j u4Lѐg p7苧,)眫1&ٮBKȋcE4x>.jeŲrχA ׀Z"E7)ꨘdER mzjȥeRMz!Z+CaXL~l`wmH"F˛8ix/'s`EsH^R.SfU,Mp5yփfe|smloN+&=Zvj"Qђ>Vi{VoK ATtf7_YE>z NI]w"~TYM.97).|,/EV`{ x̏eYiCnc-7jk5LYocՎU|6JjsjG[lAh2;@CٳI߽b CnMԲW>珆'<u P6yY/97W}yPԵni ?<+} 6ՁI.1.U`> {@'NK?~*>dqf/[3j"{Ǫ=[8<yc~u]rQ ( LuçuyLMgEH0@* [*{\bUeuTr^вv݀>Mt41{J!c?/}JXO?BR_$Uҟ"cah5%X0,QcSC)TuVk95%Bf4犘WMϥbS\]P7q_H~iX:穩H6{UwRynfIL>ܔ8j,J6;chy` 0!DHNn)C"uu>=9xk_.%]•ލ5qԪ5ÖDz1O_ 1XD_!FRKU-b9>h;v{vP k{7K~u&GK80$a`ZyP+ԉ*""1rd32}VƏ1p!*.X`G_+5I$qI5k5tb+9ΚK%dl̙/O fk tsK#O@㊌15׊"F}cQW5~MIPhIEM¤* 7~۾G6Öf[2#+~ʳ(~.Tm 4nԿO~c qTHCz/qa'TU9CXeٌُl=[JȨA"V{8o1a҂ӽCaى;XCt󨒍hy..$aj8S+!v0i4bˇGǖ}yz0wʎI\ CH仨N"X;Nu'X)rF#)XYQsɇ 8 ~\2C-uF;INa6O5@&FJ dNgu/.񠁱7#:_UmJrØcy9 W\"yHuY&7PBlr2%O9B{&8|\Cf42feCzl.fdSu%8X<F̀+i 8r'Je|.mMr KL{L7RdM(g|g0ROvx &i(B1(h3W"Uh9,CX"ː[6+;vbeQf?Y\b!V5h5Au^GQL̟[j$ѻVH\N=$kXid *O h!RTalVXVz&ZSboV# P|bMtƋ<<kDr΂8dl܂8e( #<MgCnx)/nj9EA*'wD$ S @tz$>qꘞMਉFX.7mI v|4ƾPsgnuV;SvMv12n]yKg[c&_תo^9QJCxp` H%hBڮCv] djS5k۠F̆/NiZ ;dl PVd>V/ʃHӚ S⸭8\(eWEDCDd )P&<뵲$|Ps0a_]GSs/"H2Tƣ.y\_Lz ub+mW$uZG]ǞlHI-f<8^tyf=>o8pٰD]ť5ROB¹wjC`LyV^ A 37 ^ qNL)lk b;&ҋKA̝zQΕ//|<>qz[m/%% `w$,1%o /`7qm܄v*7ܢ+#Y ;ĵιr ŴӔ.Uk  Rm<79OtqHҶaai\84`ӥb3'krSM|c)]}x1 m|4!p30Hчo(ȸE/L.0@嫪6ũmB mv{;_ ^'.2IaSlvrvfĪr4%.:B15;2T`b=;,B54SҞ =!$1IH; pK' ~. zLmMwR{Pp0A(`H -NNEh BP"Ța$w呎(){Kd%Ke'lP"ʎHV5' "9VS-slg% sQPu{. ui{6e ,PGbXq`C&r+)AK ERci$]8DvhYCkmw/  4sFz)j ˦+OY Ba+L>r "f[!¥K`$UYQWe;G iJ.,9یF^[oj~FAuEU9 |CFCkRh  j]6-=UF:0#TQMߐǤ >Cqu7,\RH9g" f:rY۫u춨ʀ ba5sJ|M:*5u@ ԌW3 V* 17/BKXW!R(>eG9?|Q.=5jlw,qUQ 9V@/5CEf<6FJE#'Y5'?ӡ.QQP!,?z+B[b5VDz~?H87 Z%[J!6V^mƽS+0ciLmhvFϢ>ѵI/*P%\r<:`ȋ"O'PV^SQ8*Q'בDYkj ,mb{ad|j]Uq+Gs<8;,lqCc;E:cgl ~,l,'2pkc~{`I~Pb!iFj9ld̵[t4n;)\2+}Dۊ#':$,.+NSSسg )r8 CxTrG+̌Y+lAXKt+q }/ّEU޸QC}+N硖PO-u ^kŠ @ dt  ZǹqG9+˭aⓒYgr!y.غKʆSPy^ )U8wQj:9WS-ZRi2|=Ӌ W?]u^VK V[iecIcP>aԂJj|+xhUL;E}%lQ[/dEm#ӒFm`)B(8^.d̻x5{þkw$29EZ3a0 [l6m!}81dyޏdn){uDv Pc<1Vj^ ʪ. j`&i88UFc7FXĸ&g.@[Y:vJ}tk87+dטsEX\(>>{Ƽ;@RnwФB%vj6! =msRs,qMr i}W ;`_1 v(pR@zyN")P G8*` ~@PAP<] |\UBaQyO8F幎Ñ&`~pݎ)̄T0j Sڠ$k}>%vO;^! CFIx:z5 #F9Zc^$xJ:_8漞`sG(3EnE@za~v *}) aj!Au=.ꑍ'xƽNzs{GNՍǴ}jg{{DŽ1s=gcWF?=CVv+oT+OX!Rk q@yXiB#abHl\HzסC,%sCa 2 ]@1ıךVyRj0c/* #A*;fjG}d5&j84|:$lAǃ",$ko%Hޗ ZDX)0BGF]&et+DH'8N!AXvcssN"iS:״]C OFB !n楆_}1}%pE[O#@m л\ڒ fZ-qX+>{a<}\Ul%4O,*' ~rԬ6\Fd.3^f^ n--IJqc먨y0^dODŽptcٌn^UHW'bOaGwBb;-x -@] .dC0PCVBҀ5y!" w$"'-Ȓ|A0rP,_%Fye0҇i$ Iח%#r{LMB1~YT(֮"צuZu,PfPL"Sy\tzBy*^1B`mkM syN_a3 eU<=B82$p uY4qyl7~O~D\T9.?o;idhv'Xmds:d5Zĭy z&}M[}УdYssSHg5:+Ĝ{u";|1q  %bEE ۦ,xvܘVD#$B;f8UvP='C[G>3"m4V*Z߃R#@?_<=aKbz ,m;-C쪙:Siu_WpȀFCjgߖXc7WB#V[c.̟hrm ݠj5|z#Mͭ-G3 ?qHaZzB,6BX"ɋ%݆PNo0"kv8u cPKNp_v֝{{*‡_y$X~Ln,†"q4XOS<~@ "b]жDZ>Id F'*/(>  fJѩ-XdيJQN2NVJvlKL>X 3%Tf$K`qLbVFw;']d9MN8[˺ƾ J)U&׍[w=xÏK#.Tae5jZ:L̚ZkסS0y0h(jӶ7bqėǧ$+d:/+tӌObq> K!4MZM]ilIɺ{DS.bCu1xZ<,paB Si8/^BC!7̪N("A b)4cHg Ai1DH-ȻHi l{2O[Mh-2; q&b#:8mM_p-zHW'v(;ӂr||8X+%ci(}STB7)& `tI\yZqw'{LzZ~L:HV7\x) jj7#aG̈rY'ʙ}c^S5ϒJzZof27ST8^Kq!6Y݈H70vnQ{>Tp;B quP?';힃>ߧ@w%:bq!6  l'Be\He;aq!6V  l'Fe\He;u 4"L@gNntg\QD]so՞L!=٦'?Y,ɩTLQ8(ҙAq!SM(B %nwQo_ʌ^ SplD\s !IDѾKA2C~!`@:YßjK  NO8y hJvFwErS^boh4wܿ7]uu%Ek۾V*R+A.9Ջy3P  ^%C#4C+Ay4ظj5͎?!´/3ـB<ãU^FBP1F@`$(9ĢdHZHF^f3^pF`R9qR],CsK#(UYFW2v -EޘM'E峡V* o$TTZ/dqyIEƪ[)[9~\? =Pv%H12CS<f22&p6:0#H<<(UUUn<W7WwWhW7WW}zWOWpWW7qW7W7wP|6rPSr< 2 (6@K.?.,b@0-KFKKbK-K!.@K@.VK2n+E2;x2R1daQ%;x36j-JFR"WJ<h72H5, (p()_,$2y##AAE 7wWwWwWwWWW77777b7PPPPmWGK666666I6.,,,,K+*-K!.!.!.!.!.H).+E+E+E+E@K6667.7.7.7.W?.?.wW,wW,wW,wW,wW,7@07@07@07@0W-+SK\WF}zWKOWKOW<OWKOWyKOW-KW-KW-K-KW-K7!.7!.7!.fx.WVKWV<WV772727272wnwnwnP+EP+EP+EP+EP+EP+E6262627!WW-.WTWK=WWKP+E I6!WW-. I67).72wn .(*n1(!7i((((E1KFwWwW"W77W}+W zWWdWWW"W wW:WWzWpWW7WqW7wd<2|W<WWRW{W7W(6,8KK(,**K*KKK4K!.,K@K..7K2KKVKK*K*,,K*2F(K-K*K&K P7!.WK" WKWEKW-K7 .7!.W-K72wW,@ P_122PAAPAA<<_BC(**#z(+4242.(25,+4242.DQ#M<$!W(2?T7HHd Z W  W  Y c (W<RUUU>'>'>'>'>'>'>'>'>'>'>'>'dd6>'>'>'>'>'>'>'>'>'>'p#p2P<Ti6n(d2(\WFK-A5@0*E*EK-KaK<D2aDrDfE.1d**##2122s<sP<PrPr<2s<sPp#p2P<22;x;xn<JF<22DC25>:<H<(25,+4242.(25,+4242.wWW7dRW7W(6,*K!.K*K*"+7!2tZ$q*y2V#6%%*~7~37Y#_cuGc      " & 0 : D p y !!!"!.!T!^!!""""H"`"e$i$$&''0 0 927Y#brFb      & 0 9 D p t !!!"!.!S![!!""""H"`"d$`$$&''v00{uh[S;%"bAigY?93)!e/sleb^ (UA10F6Z V   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivokuj20r34ghlzcn1.m{b7wU[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-), .]-*, .q-+, .r-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpB-*B *B**B@ * B@@ *D$QX@XdD&QX@cTXDYYYY" *DdDPPGG>>PPGG>>2222\"jDl6l6LZ ( Z  H b 0 v  R  J x &Jbpf&\(t \&R^t$NL8tLl4p &@ZV $ 0 < H T ` l x !!!*!!!!!!""T"`"l"x"""#$6$B$N$Z$f$r$~$$%%%&%2%>%J%V%%%%&&& &r&~&&&&' ''''''''''(( ((((((()$)))))))))****++^+j+v+++++,<,H,b,n,z,,,,,,,,,--2-Z-------...N......./v//000"0.0:0F0R0^0j1@222*2<2H2T223 3,383D3P3\3h3t33344\4h4t444444444565B5N5Z5f5r5~55555555556666&686D6V6b6n6z667 7J7z788F888889969X9d9p99: :(:0:<:D::;*;6;B;N;;;;;r>z>>??8?x??@:@@@AZAABBBTBBBCCLCzCCCCCCDDDDDEEREEF FPFFGGGbGnGGGHHHjHHIIIIZIIJ>JJJK KTKKKLLjLLLLM(M^MfMnMvM~MMMMMMMMMMN NN"N.N:N:N:N:N:N:NTNnNNNNO>OzOOP@PdPtQ:QbQQRRJRRS SSSTTT"T2TTTTTUUvUVbVVW&WjWWWXXX6XPXjXXXXXYY*YDY`YpYZZ6ZTZrZ[l\\]4]^D^_`R`aLafaaab$bpbbcNc~cd:dddddeHepeg6g6gPg`g~ggggh2hrhzhhhhhiii&iNiriijjLjjjjjkkkk,k:k|kkl ll2lhllm"m8mNmjmmmmmmmn*nTnnnnnnnooJoRoboroooooooopppp*p8pFpTpbppp~pppppppppppqqqq"q.q:qFqjqqqqqr,rjrrrss.d>  0+!%!! '7d`222j:F%!d,@)Y"KY#L+7353t _ YknnP>DK1PX@Y"L@UYMY@+333VPZPFKPX@(  s   a"KY%LK1PX@&  sb   a"L@/r  sb U Y MYY@+7#537#53733733#3##7#37#{HHyHFFFFF@B#*1-@*/.('  !Jrs+L+?5.54>753.'#5.54&'>@S J:go!9O-B`lQ ??htycB[yRC?;GLECBF 8=VZ-E/RQ`N,?P][^QQ\31 =61 9( '3KPX@+   c  d[*K [ #L@3   c  d"K[*K#K [ +LY@')(/-(3)3#!''   +"&54632#32654&#""&54632'2654&#"H]]HIYYKKA)11)(55H]]HIYYI)11)(55H^ZW[[WZ^:;8989;:l^ZW[[WZ^B:;8989;:-,6~KPX@43# J@43# JYKPX@[*K[+L@[*K#K[+LY@1/+)*#+!'#"&5467.54632>77>54&#"3267''1%dDsYE$hWUdeN"K 0gJ&7A<03:e`O/M3J4"l`N\ G)Hd]KN] "k, Hs'm&; =5.481\0+4>7.>&AY2,)J8"qW+4X?#Ot`%9 Sf{GG9%dyP1n0+'>54&'7n&AY2,(J9"oY+4X?#Ot`%9 Sf{GG9%dy%xQJ@ JK1PX@ Y"L@UYMY@ +7'7'7'37'`cc`:`cc`xq<3553=DmB3 "&n<95" 2\3@UYM+%!5!\*NCn@Y#L+353CknnS>@r'L+3S#On<b -@*[*K[+L     +"&54632'2654&#"OeXXedYY L #@ J"KZ#L+73'733!R'hcPhCxP24'@$J[*KY#L%"+4&#"'>32!!57>LIK_Oo7X; 7K+ J^6NVH`{ 7M,0K?:P^5^2J#D@AJcY"K[+L##+"&'732654.#"'%!5!6232AfReHT_1A#- tj{'Eb SkF32#"&'732654&#"'!!V*wxnQ bGUX\N-O!R%Xsfd~]W<32%"32654&EtTi9{dQ*;''E4i>0YE)N_cJN__dz6\zCǦYQ( @; Jc[*K[+L%$+)$/%/##*"+%#"&5467.54632%2654&#""32654&Zuy@60:tz833APXUTQ[UWQfcTPb]_mg]@KM7[fcT>LL=;3??58>F>:5#".2654&#"0YE)N_cJN__dz6\zCǦYQ( KPX@]Y%L@aUYMY+!!!!U  LLU<5@0+55%U VpV!<@9Jp[*KY#L!! %*+7546?>54&#"'>3253'7!$@>CK Qqkik?!/!^kH#-"/*.;C/KegPDN *nn32#"&'#"&54>325332654.#"326754&#"326oD> ,@) Jb"K#L + #'!#3 ]IG\F}XfKWK C@@Jc["K[#L   ! +3!2##32654&#32654&Wdz)6<5kPC@IKGIWc.PP=c[[5;<17:=871@.J[*K[+L+%267#"&54>32.#"u]cQw.SvGxQa]9X:yDUG krSZ/rk CY(Ge=zW'@$["K[#L !+3!2#'32654&+Wyz{yOwW1 /@,aY"KY#L +3!!!!!W|wPNPW1 )@&aY"K#L +3!!!!W|wPN7#l@ JKPX@a[*K[#L@#a[*K#K[+LY@##$%(#+#5#".54>32.#"326=#5M"kXWW @J"K#L+!##33sSjzS8E7-@*[*K[+L +".54>32'2654&#"}JyU..UyJJyT..TyJr}}rr~~ 0YRP[11[PRY0Nz{{zWI +@(c["K#L $!+3!2+32654&+W ovuyKECMnccrQE@E>7)H@EJGp[*K\+L%#)) +".54>32''267'3>54&#"}JyU..UyJJyT.F=C=FA%){__-.}rr~~ 0YRP[11[Pd+W-` N"yJ{{zWd3@0Ja["K#LA!+3!2#*+32654&+W nwFFfLDDLncMgRE?E>7J+'@$J[*K[+L-%-#+?32654&/.54>32.#"#"&7QeLO^9:w`^%B]7o}P QPNX6#@ aY'L+3#3P昘HHS>@r'L+#3ON<>"@aY'L+3#53#@Y'L+!5!3N(&K1PX@ s"L@ riY+#3`lN6)KPX@ J@ JYKPX@c[-K[+L@#c[-K#K[+LY@'%!%#D#+!5#"&5467654&#"'>32'&"3265uM3N[cR%@ <.35 LbOQiPC"341*32#"&'732654&#"KP\(,M:!|e3K[32.#"326KeZc|#EKJE?9 @Y~z?]>Z<";_ROb;.yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@$#+!5#"&546323'54&#"326O5b}e+KPPU32'"!.P>8> KjSfy#PT4" CLs;]?!xmF97H]/@,["KY%K#L!#+3#53546;#"3#p\\]U;86/J*]EH-5"Jn04)@ JKPX@ [%K[#K['LK1PX@$%K[-K[#K['L@!_%K[-K[#LYY@ $&$%%#+3#"&'7326=#"&5463254&#"326KcLwNN(BSO3b}|h1OW;EOJHHL)r_JM 3)@K>""xut&#*NE^QL[WK,@)I"K[-K#L##+33>32#4&#"KPU,SbP7>9P#%WT/1>F;FLKPX@Y"K%K#L@a%K#LY@+533F[VP8``$>XKPX@Y"K%K\'L@a%K\'LY@ +53+53265N[LU/(1'8``\ WPJ,0K 1@.Ja"K%K#L +33373#'#KPE`aFwK@"K#L+33KPXK"[@ JIKPX@[%K#L@%K[-K#LY@""##$# +33>32>32#4&#"#4&#"KMR*#%0'+,WT/1>F;/1>F;KLJKPX@[%K#L@%K[-K#LY@ ##+33>32#4&#"KMW.SbP7>9PB%'WT/1>F;. -@*[-K[+L   +".54632'2654&#"1U<#ed||dHHHHGNP !?^;vvtG_ST\\TS_K>!f@ JKPX@[%K[+K'L@ %K[-K[+K'LY@&#+3>32#"&'32654&#"KPX1,M:!|e/M[yKPX@ J@ JYKPX@[-K[+K'L@ %K[-K[+K'LY@$#+5#"&546325354&#"326M3b~e/NNQV;EPLGHK!!ut% ;b*NJ^QLe\KM'@$J[%K#L!#+33>;#"KLP#+$2)E)M  2''@$J[-K[+L+%+#+?32654&/.54632.#"#"&2K @668+3>BLeSW^ I 77080*=NE`^Sk -+%! =>>NR6#0&" E9=NFP[)@&rY%K\#L# +!#"&=#53533#;PJ^CSSQ)*GPUJJ3)ELJKPX@%K[+L@%K#K[+LY@ ##+!5#"&5332653Y.S^P5<9PPF')WT;1>F;$!@J%K#L+333˽URx$ !@ J%K#L+333# #Syxdy{NUTy~$m &@# J%K#L +!'#7'373w^]y{\误>"@ J%K\'L!"++5326?33 H6."2XSID5J(4y2 ,@)JY%KY#L +35!5!!22;QAJNJ>w$3@0Jcc['L$#!,!%!+75326=46;#";#"&=4&#,?QY44..,,,,..44YQ?,J2>cNH':2x>@r'L+3xKn2>$-@*Jcc['L%!,!% +%#"+5326=467.=4&+532;,?QY44..,,,,..44YQ?,2>cNH':2R8,@)cW[O#"#"+#".#"#>3232678DF72. LDF60, GW 2FX 2d4;K1PX@Y%KY'L@]Y%LY+3#3#dkkI _nMa)!*@'  J"K#L+!5.546753.'>7'WorTBKcH 9236 G\Q>95B\ }nk ][QG(86#?S[UE] X ZQ:(9@6J Ia[*KY#L%%+#!!5>54&'#53.54632.#"3'c!1<qX }dbk R >>@I"  /DPP N1  B#L1_leQ 2CF7-N(%5dt#/E@B #J HGcW[O.,(&!-+7'7.5467'7>327'#"&/32654&#"^9uo8q: 9u8s p8p:!!: C::==::C59t:"#;p8q  t8t:""9p8o@; Ja  a"K  # L! +!5#535'#53333#3#reav|BFB`JBHB|x>*@'aY'L+33xKKK@pp633DL@ >1! JK,PX@[*K['L@_[*LY@ %#%"+#"&'732654&/.5467.54632.#"'>54&/p]Zl Q D29C>2SCOC0")lZQnP ;38>6(aJJ@0#'.?33W,A1+(I\RP112(.' GH:P@1D[TN023$'( JF9M=p <,+3 ?/(1 -8=DKPX@Y"L@UYMY@+53353-X`X8^^^^F'C@ A@43JK1PX@%c c _[-L@,cc c W [OY@)(><861/(C)C''  +".54>32'2>54.#"7"&54>32.#"3267K]66]KJ^66^J=jM,,Mj=>jL,+MjFOh2B%?V H)(-==-(*H Y36]JJ^66^JJ]68.Nl=>lO..Ol>=lN.cf\0J2B9+D:8B'7B"/)K&PX@J@JYKPX@c_[*LK&PX@"ccW[O@)pccW[OYY@'%!%#D#+5#"&5463254&#"'>32'.#"32651#132'2654&#"'532#'#7#32654&%0U?%$?U11U?$$?U1OigOOiip..9I0((($>V11V>$$>V11V>$/jPPjjPPjH'%"UMM5 7F1@UYM+#531FD2ox *@'_[*L     +"&54632'2654&#"B``BD``D%77%%55oYIHYYHIYF3))22))3HBc 8@5aaUYM  +%5#53533#!!!HFF323!57>#!#+? NA=I,/^ߚ"# 3>=5+8?>?l$,_H@E  JacW[O +2654&#"'7#5!2#"&'7(,-'  w;ETE3!###2O66O2VPVZ 8K*+K7 P _ 3+$2 @ JK PX@hc\'LK(PX@pc\'L@!pcW\PYY@ +"&'732654&5731< <#()B&.19"( -2-$(&22b MJKPX@rY%L@rUZNY@ +535'733OljIc>=4Q>#V pKPX@[*K[%LKPX@_[*L@cW[OYY@     +"&54632'2654&#"FTTFETRG(**)&,-SOMQQMNT>40/22/04#  I@ JK1PX@%K#L@Y%LY@  +?'337'3%^oZ A&'3+t3+Ak&'3+t3+E&'3+t3+1!eJK&PX@pY%K\'L@p`Y%LY@!!+#53267#"&546?>=9k`'7!$@>CK Qqkik?!/!nnH#-",*.8C/KedPDK *l&$l&$l&$i&$Z&$V&$ 3+ B@?JaaY"KY #L +3!!!!!!'!3  C >o {PNP77*4@*)JK PX@-hf[*K[#K\'LK PX@.pf[*K[#K\'LKPX@/pn[*K[#K\'L@,pn`[*K[#LYYY@.,'% 44 +%267#"&'732654&57.54>32.#"u]cQe".1991< <#($.SvGxQa]9X:yDUG bp ($(&2"( -,SZ/rk CY(Ge=zW1l&(W1l&(W1l&(uW1Z&(l&,Wl&,<+l&,ó Z&, 7@4a["K[#L ! +3#53!2#'32654&+3#WFFyz{y5H+OwHWi&17l&27l&2'7l&27i&27Z&2b[)!  0+?'77'b2122127)6@3'&J[*K[+L)) +".54>32.#"2>54&'}JyU..UyJJyT..TyQK.r9Z> D 0YRP[11[PRY0^9`#s(Gf=3Y"fP{l&8P{l&8 P{l&8P{Z&8l&<W? 4@1cc"K#L   $!+3332+#32654&WVnwvxLCAxnccrE@E>K&=@:!Jc[*K[#L &&+!#532654&+532654&#"#46327::DPTE671?E9BGQwd_l..>GK?=E7H@168K? dl_S1O NLe`6&DC_6&Du6&D[=6&DaM6&DjF6&D_6.5B(K PX@  .JKPX@ .JKPX@  .J@  . JYYYK PX@)  U a [-K [+LKPX@$  a [-K [+LKPX@)  U a [-K [+L@*  a  a [-K [+LYYY@0/@>9632/505"$%#D$" +%#"&'#"&5467>354&#"'>32>32!3267"!."3265jS>fh>K[bS%@ <.37 KcN@Q_._pP>8> 8L BE!332+9TCM;.18HCLA&402$?O2*'zm!NT4"G<9J'"#(69..2@)(JK PX@%hc[-K\'LKPX@&pc[-K\'L@#pc`[-LYY@.-&$  22+"&'732654&57.54>32.#"32671< <#(!Zo#EKJE?9 K NE .19"( -(|t?]>Z<";_ROb;# 7T &$(&2,&HCZ,&Hu,&H[@,&HjQ&CK&u&&[&j*$0[@!J$  HK,PX@[%K[+L@c[+LY@&%,*%0&0+'7.'77#".54>32.'2654&#"\$9eNCM9V81V>$";S14I;(HMPIBTU1, 9 11&Y76X=!$0N `KNX[MK^K&Qai.&RCe.&Ru.&R[L.&Ra\.&Rj\H;B< ;@8aaUYM  +53!!53jjjjnLjj.#6@3! J[-K[+L## +".54>32'.#"2654&'1V>$#>V2d +GTHN , !?^;;\?!vt 7 ]`S!7 E&XCjE&XuE&X[NE&Xj^>&\uK>!=@:J"K[-K[+K'L&#+3>32#"&'32654&#"KPX1,M:!|e/M[&\jER&$  3+6&DpKj&$6&D]E7D@AJIb"K#K['L +".5467'!#332673n,"*IG\l !5! _} $$5X1=K67.;S@P",Jc[-K[+K['L973/)' .. +"&54675#"&5467654&#"'>323267&"3265-C)"M3N[cR%@ <.35 LbOQi-  ;C"341*::>*LL^QLe\W1H&(,&HpSW1j&(,&H]PW1\&(,&H^W7:F@CJ IaY"KY#K['L%& +3!!!!!3267#"&5467W|w!4#  .K+!PNP2=,1$5,6,3G@D  Ja[-K[+K['L.-10-3.3+"&'" +#"&5467#"&54>32!32673267"!.-C !fy#9> F 8K  =/19s;]?!xm!PT3" 4 !4%F97HW1l&(,&H\@7l&*04&J[P7j&*04&J]_7\&*/04&J^7&*S 3+04 '4@'JHKPX@) a[%K[#K['LK1PX@- a%K[-K[#K['L@* a_%K[-K[#LYY@31-+%#  +#54673#"&'7326=#"&5463254&#"326I_+1 KcLwNN(BSO3b}|h1OW;EOJHHLmUL27+ )r_JM 3)@K>""xut&#*NE^QL[WW{l&+H&K[3+;@8  a  a"K #L +3#5353!533##!!5!WFFT|TFFT|DmmmmD /}z;@8 Ja"K[-K #L## +3#53533#>32#4&#"K<9P0>::>%&WT/1>F;i&,&a H&,&p j&,&]7,@) J"K['L+"&546733267-K*V!.  -2$6X0=7_@ JKPX@Y"K%K\'L@a%K\'LY@ +533#3267#"&546F[VP-  -C)8``$/=.1#5S\&,6K@%K#L+33KP$W &,-F>&LMl&-)>&Y[Wd&.S 3+K&NSW1l&/:KL&Ou%3+W1&/S 3+<&OSW1&/K0&OW1 0@-a"KZ#L  +%!37531&V]PPbbK[*@'a"K#L+33753KPe[X``1 ,@) J"KZ#L +%!57371&FFUPP!&O&8YOY &@# J"K#L +355737ZRROSS;R;o:R:Wl&1K&QuW&1S 3+K&QSWl&1K&Q\[K&Q3  3+W>3@0 J I"K#K['L!#++5326=#3TP<7-)pSjyG^SM10=K>X JKPX@[%K#K['L@%K[-K#K['LY@ !%##+4&#"#3>32+53267>9PPMW.SbLU5.1'K1>F;B%'WTWPH-7H&2.&Rp\7j&2.&R]Z7l&2.&Rbof+@ $ #JKPX@5a [*K[*K[#K[#L@1a [*KY"KY#K[+LY@(&5(" +)#".54>32!!!!!3267.#"I6%JyV//VyJ%<Yc >[:96:[> .XUSY/PN=fI((Hf.N")5J@G"Ja [-K [+L+*$#1/*5+5'&#)$)"$&$" +%#"&'#".54632>32!3267"!.2654&#"KjS?[\=1U<#e>]^:_pP>8> 8K  >VHHHHGNPCL3..3!?^;v2002xm!PT4"G97I_ST\\TS_Wdl&5KW&UuuWd&5S 3+<M&USWdl&5x7k&U\ 7Jl&62&Vu7Jl&6v2&V[97*J@@=21JK PX@,hf[*K[+K\'LK PX@-pf[*K[+K\'LKPX@.pn[*K[+K\'L@+pn`[*K[+LYYY@ $%$%-#+?32654&/.54>32.#"#"&'732654&57.7QeLO^9:w`^%B]7o}P QPNX@;0/JK PX@,hf[-K[+K\'LKPX@-pf[-K[+K\'LK(PX@.pn[-K[+K\'L@+pn`[-K[+LYYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.2K @668+3>BLeSW^ I 77080*=NELK.1991< <#(H\ -+%! =>>NR6#0&" E96K $(&2"( -$F7Jl&62&V\8c&7S 3+P[&WSncl&7WjK1PX@)pY"KY%K\#L@'paY%K\#LY@ #! +3##"&=#53533#;P59gJ^CSSQ)*GPUJJ3)c)@&aY"K#L+#'#535#5!3UO!!HPPP[9@6r  aY%K \#L +!#"&=#535#53533#3#;PJ^CSSSSQ*.CPU<@rIIr@;5'P{i&8E&Xa^P{H&8E&Xp^P{j&8E&X]\P{&8E&X_P{l&8E&XbqP4{&]$JK1PX@"K[+K['L@_"K[+LY@! &&+".5467.53326533267,"&VjXXeV]]!2!  $!4csSSscp3=E7%A@>#J%K[+K\'L  %%+"&54675#"&53326533267-C)"Y.S^P5<9PP-  .1#7A')WT;1>F;$0=l&:D&Z[l&<z>&\[4Z&<6Sl&=2&]u6S\&=2&]^6Sl&=2&]\?7%6@3 Ja[*K[+L! %%&'"+467!.#"'>32#".267!7pjUjO4Mb6-RuG &/McK>&OMW&1-W>&1MK>&QM%P{l&8E&X\N H&6&pW&'=W&'].&G]< l&6&uP7l&.&u7J&6S 3+2&VSc&7S 3+P[&WSnH&<>&\pH> @%K\'L !#++53265LU/(1' WPJ,0.@@=Ja[-K[+L +2#"&5467!.#"'>267!`x}`bq^M:6C IuF9H Cxwwj SR5" EKUF96I(`8JK1PX@ s"L@ riY@ +#'#7lLPPLlQQ*^0JK1PX@ s"L@ riY+#'373`jLNNLPP1= )@&rW[O   +"&'332673CAB#"C?G5&&5G(85KPX@ Y"L@UYMY@ +53([8``!  tK PX@cW[OKPX@_[*L@cW[OYY@     +"&54632'2654&#"(99((99( 4++44++4277EJK PX@f\'L@r\'LY@  +"&546733267-C2G/ .1$64=("ALKPX@`["L@Wc\PY@####+54632326=3#".#"(()! =(%" " .;.7 (~4K1PX@ Y"L@UYMY+3#73#\lJ`Lzu(n@UYM+53([``(.Eg 0+!!5%5!!' b5MQ QMK>0+332653#5#"&'KP5<9PPKY.31>F;$F') 0+3#5!#;#"&5#dFL#%><KK2L@NoW1l&(W1Z&(=@: JcYK[L#$! +!532654&#"##5!!>32#&KNWT+V VW+z$?X3N7#".54>32Qa]c{ 6zf.F2 PxGvS..TvGw?\vqLty*8 az+WYVW-t7J6W, Z&,--'4@1cYK[L #!' '!'$! +7>45!32#!!+5326%#32654&xvwnS]-#,;pNAC'n{;jkcnX.nja!jfP5>E@EW>@; caK\ L$! +33!332#!!#32654&WVdVxvwngNAC)jkcn/W>E@E=@: JcYKL +"##5!!>32#54&3U(V#[6wsVDU XPP enLIWdl&.Wl&\b&zWqy MK PX@gKZL@sKZLY@ +##5#3!yTVvXX$WI 6@3cYK[L   !+3!!32##32654&WuownNCEPgccdC;>@;WK%W@YKL+3!!WP q3@0QYKYL +53>7>5!3#5!!! A /ZT ]sJNwߏ?n,!MPOW1(6@3JaK L +!##33333##]mi`V`im]0YO((0:O(D@A Jc[K[L$"!((+"'>32#"&'732654&+532654&SOaQoj847@ts Q bTSXHKccI@PdPBdm`a9M IEaili HLD>5:K<36?W $@!JKL +!#331bTqiG?XWb&Wd.i!@YK[L!'+7>5!#!+5326VS]-#,;'n{;XX.nja!jfP5W0W{+72Ws!@YKL+3!#!WVXXWI37&c7\"@ JK\L!"+%+5326733h!SMD>,6aӿZHHO$( Q2 $/KPX@  ccK LK PX@  ccY L@%U ccY MYY@,+*)!  +5".54>7532#4.#2>%3u@uY55XuASAuX44Yu@'AX01XA&(BX/1XA'QBkKJjC LL DjJKkBQh9O/i/N89N//Nm;Wq )@&sKZL +3#5!3!yZTVvߏX</)@& JcKL#"+32673##"&=3DT1V(VV#Z6wsVLI >X enW %@"KZL +33!3!3WVVVXXXWq-@*sKZL +33!3!33#5WVVVZTXXߏ 6@3cYK[L   $!+5!32#!2654&+xvwn NACLXPjkcnX>E@EW 4@1cK\L   $! +332#)3%2654&+WVxvwnNV_NACLjkcnXO>E@EWI *@'cK\L   $!+332#!%2654&+WVxvwn NACLjkcnO>E@E74@1Ja[K[L$%"#+?3267!5!.#"'>32#"&7Qi[ht7peWjPmvBYytLstUEhrqW"sKPX@!a[K [L@)aK[KK [LY@""  +"&'##33>32'2654&#"h ~VV~ IwT--TwIq{{qqxx ԏ1[PRY0Oz{{z(B2@/Ja[KL&+!#+#.5463!";BVgJIwnKDCL iNcnOAB@E6D8)R@ JHK PX@[K[L@c[LY@$"))"+%#"&=4>7>7>322654&#"zdh'Fb9.N! #Z&Yi_3bmKEJBA]RndWsG" M  _r+,zcKNQI;\^K C@@Jc[K[L   ! +332##32654&#32654&KNU(+%MU ((&#.')B?: 9*=I!""!Ǎ$!%#K@YKL+3!#K<Jnz+@(QYKYL+73>7>5!3#5!#3#2"RMNNJK+*=V;nІO*?HEg,H6@3JaK L +!5##7'3353373#'#CAb^|HLH}]aA*(D@A&%Jc[K[L#! ((+72654&+532654&#"'>32#"&'79<.9MT.)147? KnPU]%%%1kZYi L>;,"#'A' *0+HIK;#9 6-ENMH '5K @ JKL+3#33#VMXMu$wK&T_ 3+K -@*JaKL +33373#'#KPQ]`O!@YK[L!'+7>5!##+5326rQP@E%$ QUQ$B?:_FJ.Kv '@$ JKL +333##KvrNSr${zK '@$aKL +33353#5#KPPP$.RK!@YKL+3!##KP$nK>S.F!@YKL+5!##PJJn>\.>%2?M@JJ K [K [KL53(&;73?5?.*&2(2%%8#A +23"##5"&#.54>7:75"&#263>54&23"# 1WA%&AY3 O 3YA&'B[3f  HVY  B\V8X<=\= <[=>X:TTTQWQTTU[Kz( )@&RKZL +3#5!33MNqPnІn2/@,JcKL##+!5#"&=3326753X;!Y_P=41P IN1* $K %@"KZL +!3333PP$nnKz-@*RKZL +3#5!3333MNPPnІnn, 0@-cYK[L  $!+332+##32654&|TVSYʝi|{6'&ܤOHKV1'((KV<@9 cK\L  +!3!332#7#32654&PP|SUSW|{6'&$ܤOHKV1'((K 0@-cK\L    !+3332#7#32654&KP|TVSY|{6'&ܤOHKV1'((*4@1Ja[K[L$%"#+?3267#53.#"'>32#"&*K A=?ED><> HlRcwxdZk )6JEDDM9&DQ{}yQKnKPX@!a[K [L@)aK[KK [LY@$" +333>32#"&'#%2654&#"KPd |\d||d\~ cFHHHHGNPdlvtsh=_ST\\TS_* 2@/ Ja[KL"+46;#5##7.35#"5aNPkt]854&#"##53533#>8T^3J/$"3 :=9PPPPNY}`N"H32I :>=NM>?9 KeZ1T<"$>S/]aP"Z2VFL ZKPX@YKKL@aKLY@   +533533X`XP8^^^^$>M'4@1cYK[L #!' '!'$! +7>5!32+#+5326%#32654&rHtTVSY­AD%# ts6'&QUQOHKVB?:_FJ.x1'((K>@; caK\ L$! +3335332+5#%#32654&KPPuTVSYut6'&äOHKV1'((;@8 JaK[K L## +3#53533#>32#4&#"KPPNV-SbP7>9P0@88@%&WT/1>F;K&uK&Co>&\TFKz MK PX@gKZL@sKZLY@ +##5#33ۡNP$n >@;ra c\ L! +3#5353!!32##32654&U1ϹuorsNCE LaaL_kcdC;>@;":@7 cKYK\L$! +3533#32+##32654&O}O[YSʝi}|2..JlDNMG%'($7!>@;a[K[L!!  +".54>32"!.267!}JyU..UyJJyT..TyJh~  }hk}~ 0YRP[11[PRY0pii܅mm. >@;a[K[L   +".54632"!.267!1U<#ed||d@O(JAAJQ !?^;vvtKGGKNHHN!@J[KL!"+>;#"#36;( Z[?63P!@J[KL!$+#3>;#"UUu+-$hw2/(JW *GK PX@fYKL@rYKLY@ +3!53!WcPK:GK PX@fYKL@rYKLY@ +3353#KJ^n -@*aYKL +3#53!!3#WFFHAPH  -@*aYKL +35#535!#3#KAA<@J@Wq|6@3Ja]KL +33333#5##WViPT0}(ߏ0Kz6@3Ja]KL +333733#5#'#KPQ]}GN$OІWq_K PX@!gaKZL@ saKZLY@ +33!33#5#!WVxVZT\)ߏ/Kz60@-a]KL +333533#5#5#KPPMNOnІ<>@JKL+333#URP&/@,JaKL+!5#53333#!eaHKH>+@( JKZKL+!##5#53333NkURh?xcWJ)@& JcKL#"+%4&#"#3>32#DT3T(VV#Z6wsVLI  enKK7>.Z7.WY&1d 3+Kn&Qd7YJ&6d 3+2n&Vdl&:D&ZCl&:&Zu5Z&:h&ZjW1i&(,&HaPl&<>&\CQ_0,~@UYM+!5!,30N23@UYM+%!5!3N2s3@UYM+%!5!sANP $@!HUYM +#5467mB3 "&#n<95" A @GY"L +53'>=TmB3 "&:n<95" Aqn @GY#L +353'>=TmB3 "&n<95" Pz 3@0HUYM   +#5467##5467gmB3 "&vlB3 "&#n<95" n<95" Ak +@(GY"L   +53'>=353'>=TmB3 "&vlB3 "&:n<95" n<95" Aqkn +@(GY#L   +353'>=353'>=TmB3 "&vlB3 "&n<95" n<95" < MK1PX@a"K#L@UaYMY@ +#53533#ܠL FFC<eK1PX@ a a"K  # L@% Ua a Y   MY@ +5#535#53533#3#ܠL FFFFB @[%L  +7"&54632-@@-.@@@..@@..@Cfn&'( '3?KKPX@1 c    d[*K  [#L@9 c    d"K[*K#K  [+LY@7A@54)(GE@KAK;94?5?/-(3)3#!''   +"&54632#32654&#""&54632!"&54632%2654&#"!2654&#"H]]HIYYKKA)11)(55XH]]HIYY6H]]HIYY8)11)(55)11)(55H^ZW[[WZ^:;8989;:l^ZW[[WZ^^ZW[[WZ^B:;8989;::;8989;: 0JK1PX@ %K#L@ Y%LY+3#'[Z#  8JK1PX@ %K#L@ Y%LY@ +?'3#[ z?@"K#L++3H>>(h uK PX@cW[OKPX@c[%L@cW[OYY@     +"&54632'2654&#"NRRNPPPP----,..^][``[]^=>@A==A@>+l Z JKPX@rgUZN@rsUZNY@ +#5#5733#'35=@ҳ_//ԔPG::4]D@AJacW[O +"&'732654&#"'73#>32

32'"32654&MQUK6J @ %,45#=LOB"0,$%+*Z\c],3 =<999A4V*@'JsUYM+#5!_"+AL2c#/A@> JccW[O%$+)$/%/##*"+#"&5467.54632'2654&#""32654&cSFGQ#OCFK#)&&)&))&(-,)**+7866* '1863& )I3.^$G@D JccW[O $$ +"&'73267#"&54632'2654&#"3N > ,1,1%32

;#"##15D P(+$2)Q PE% M  F>Q:4J@G$#J I  a a[*KY#L430/.-%%D +%#!!5>5<5#53.'#53.54632.#"3#3'c!1>@I/DPP N1B"B!_leQ 2CF7#B!#S1O@L+* Ja  a[*K [ + L11/-(&%" +753&45<7#53>32.#"3!!#3267#"&'#JJQh]tLGCDRREFJ H wbhB   By{\[ 4EVSB   BRZF4 Wb}zMO=I@F= Ja   a[*K [+L;94321%%" +%#"&5467#53>7>7!5!>54&#"'>763#!!32671 x]ct @2l ><=O Mua[q A 6 J7546323>54&#"^9TJ+";G9;=.?#--Z+2KKH]G:'BMF>$MICt1'ڴ(l&#(W !% @ $" 0+"&54632##332654&#"!5!?:VW;32!3267"!5."nI^74[JExX3%}OWLy%#t]m2]SN~X0.RsD7:BNE=619?m& 'u3+t3+Tl&' 3+t3+7~&'3+t3+Hv&'3+t3+Hx&'3+t3+d_&0'W3+t3+Zu 0+!!Z2@3[2J3W 0+!'3'k2>3@23u 0+!'7'7!@23a2>3W 0+!737q2J32@3M 0+!!#5BHMHB5YM  0+7!5!#Y/HBGH/`SAc&a 0+73!5!c5G/aR,5@T`/H&a 0+7'3!/G5AR&/5BH(0+!5!HH` W3d0+!!W$dL<+7 1,( 0+#"&'#".54632>3232>7.#"%"32654&)=&1.AaC-0 ">--1+$75((2R8/# 0+232673#".#"#>232673#".#"#>41. LH?50.$LJB41. JP7"6.+$LJ BFBH EC!BHU5@ 0+?#537#5!733#3!DqUJQJwUDyHHHHyU 5T  0+%%5%!!5 ^> VpVLU 5T  0+7%5%!!U > VpVL''2V@S-,+Jp c bW[O(((2(210/.*)''  +2#".54>"32>54.53'733Rc88cRRc88cREtR//RtEEtR//Rt~s$Qm8cRQd88dQRc880UvEDvU11UvDEvU0FB:ZF''@P@M=/.J ccaW[O<;:931,*''  +2#".54>"32>54.4&#"'>323!57>Rc88cRRc88cREtR//RtEEtR//Rt,&*1 K XNJU69x%&8cRQd88dQRc880UvEDvU11UvDEvU0 &.$9OK=4C&PFL,''Dd@aA < ;/.J  c a  ccW[OCB@?>=9731,*''  +2#".54>"32>54.#"&'732654&#"'7#5!6Rc88cRRc88cREtR//RtEEtR//Rtr^THcL 80.321!AIW8cRQd88dQRc880UvEDvU11UvDEvU0hDL=?"$)" ;wBNh:''255,JK PX@3ph  c bW[O@4pp  c bW[OY@43210/.-+*)(''  +2#".54>"32>54.#5#533#'35Rc88cRRc88cREtR//RtEEtR//Rt,LhBB8cRQd88dQRc880UvEDvU11UvDEvU0_K DD''Ff@c> 98,+J  c a  c cW[O)(B@=<;:640.(F)F''  +2#".54>"32>54."&'732654&#"'7!#>32Rc88cRRc88cREtR//RtEEtR//RtAEd N 6'.10-.M 8"?Z]8cRQd88dQRc880UvEDvU11UvDEvU0;A !"'%%( Fn DIEP''@Li@f218J  cc  c  cW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54."&54632.#">32'"32654&Rc88cRRc88cREtR//RtEEtR//RtF\_jWAWL -&5A@,D[^R+95.,718cRQd88dQRc880UvEDvU11UvDEvU0lnvt59FKEEDN%"$&&%"$''.Q@N-J pcaW[O(((.(.,+*)''  +2#".54>"32>54.!5!Rc88cRRc88cREtR//RtEEtR//Rt\8cRQd88dQRc880UvEDvU11UvDEvU0lHQ''?KWj@g:.J  c  c c  cW[OMLA@)(SQLWMWGE@KAK53(?)?'' +2#".54>"32>54.2#"&5467.546"32654&"32654&Rc88cRRc88cREtR//RtEEtR//RtDYT%")[XY_'""^R.44..00.3782.778cRQd88dQRc880UvEDvU11UvDEvU0[C8%. .(;LJ<(/ 4 9CF " "''@Li@f821J  c   c ccW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54.2#"&'73265#"&5462654&#"Rc88cRRc88cREtR//RtEEtR//RtB\_jWAWK .&5A@,D[^Q+:7-,608cRQd88dQRc880UvEDvU11UvDEvU0\lnvt59FKEEDN"%#'&%"$'';BN@?> JK&PX@.  c   c cW[O@4  c   ca cW[OY@'DC)(JHCNDNBA=<31(;);'' +2#".54>"32>54.2#".54>#'732654&#"Rc88cRRc88cPEsR./RtEEtR//Tt2$$22$$2D="bA##""8cRQd88dQRc880UvEDvU11UvDEvU0`2XBBX22XBBX2Fe%2BA\\AA\\A''3?R@O cc  cW[O54)(;94?5?/-(3)3''  +2#".54>"32>54."&54632'2654&#"Rc88cRRc88cREtR//RtEEtR//RtE]ee]^dd^8<<86>>8cRQd88dQRc880UvEDvU11UvDEvU0tnmuumntHJPQIIQPJ'+jK1PX@c_[-L@$ccW[OY@! '% +!+  +2#".54>2654&#"7"&54632Rc88cRRc88cR^dd^]ee]6>>68<<8cRQd88dQRc8tnmuumntHJPQIIQPJd+0+!%!!dfm%,d+ 0+7#!!3!!GH+:m-9%/n1}?60+7#6GH+%/n' 0+2#".54>!5##7#Rc88cRRc88cA7mQ$s~8cRQd88dQRc8FnZ:B'," 0+2#".54>!5#7>54&#">32Rc88cRRc88c&%Sx96UJNX K 1*&,8cRQd88dQRc8,LFP&C4=KO9$.&'0- 0+2#".54>4&75!3>32#"&'326Rc88cRRc88c WI!123.08 LcHT^8cRQd88dQRc80=:hNBw; ")$"?=L'!  0+2#".54>535##3'7Rc88cRRc88cBBh8cRQd88dQRc8_DK_'2  0+2#".54>2654&#"735!>32#"&'Rc88cRRc88cVP]Z?"8 M.-01.'6 N d8cRQd88dQRc8PEID nF (%%'"! A;',8 2-& 0+2#".54>2654&#"46327.#"72#"&546Rc88cRRc88cQQ^[D,@A5&- LWAWj_[117,.598cRQd88dQRc8NDEEKF95tvnl$"#('#"%' 0+2#".54>35!!Rc88cRRc88c$[ 8cRQd88dQRc8cQH'+7C @ =81, 0+2#".54>"32654&'>54&2#"&546"&54632Rc88cRRc88cSQ^""'_YX[)"%TX.00..44.2873.778cRQd88dQRc8C9 4 /("3267#"&'32654&"&54632Rc88cRRc88cUQ^[D,@A5&. KWAWj_\106,-7:8cRQd88dQRc8NDEEKF95tvnl$"%&'#%"''.: @ 4/)( 0+2#".54>"32>54.#7%"&54632Rc88cRRc88c2$$22$$2Ab"=""##8cRQd88dQRc82XBBX22XBBX2FB2%=A\\AA\\A#>>0+#=R592>M0+33R86P>  0+!#3'3#P>><>x  0+!53#5#3xppHHn>>>i '*@'J[*KY#L('+!53.'4>323!5>54&#"/F.5>_+1 UL27+ (F CKPX@_L@rW[OY@   +"&'332673IFB%%%"CDG9!%%!9G22%/;cky[A,~ztlhd_K82*&" 0+#"&54632.#"32674632#"&'#5353'4&#"32632654&/.54632.#"#"&'%3##5#732#'##%3##5##'##73''2654&+4632#"&'3#3##%3#"&=33265'#5353732+%4&#"3262654&+32#'##7'373#'2654&+.! %&!*(!!''!!(RTj "! K88:&#'78D;q'p( "&&" (iVSSQT'9$$%%7%:&#'<0/<z'A)$%)" )$**$$))'~~K!!!!   o<99**[JJ :$))$%((p4?[[[;~~'$$'K !!t+<999]II[;K  :(  0+73#5!#3!(fPPPPWpl&&<b 0+533533N.NVmmmm XFLK>  @  0+3#%3#3+53265`lNE`lNPTP<5-.$^SK30 0+533533J4JP2jjjj$0+ # # ]\XYA* ("0+74>32#"&32654&#"32654&+A"=T1\o:7;CweltP~CPD:>US=?NVJ} 4Q5eQ5MQE]npvS;51ALMED>B@5'0+%'.546?>54&#"'>323267 oUTgGE=6/3*2? KhNQ[OC<5)?-3I HJGB7> "&.%BDM9;= !"$.,04J 0+!5##7'333373#'#CAb^|HLH}]aAp4(%0+732654&+532654&#"'>32#"&O H4?KJ>]^8E?41LKtQVj568=z_Xp1 .3C;7CG>35?0/HLaT4QP@]hPEXE&XT]3+KN0+# #(TR$tKQKPDz-0+!5#"&53326533#5Y.S^P5<9PPONF')WT;1>F;nІ20+#5#"&=3326=PI)N\P336F$WT0<91D"0+#5#"&'#"&53326533265MR*#%0'+,WT;1>F;1>F;Dzc&0+3#5#5#"&'#"&53326533265MNLR*#%0'+,WT;1>F;1>F;< 0+%#"&=#53>3232654&#"32#"&732654&#"EPH(#B1jZZhPE-6?@5,F.,C,VmgN69D91:12.*$0+%#"&54>7'.546;#"2654&#"xdc}2B###*B<*n-JFGJBEMMn~|p1L7 4!29J!A^YLLUULLYdc̰3+!0+#53267#"&546?>=?k`'7!$@>CK Qqkik?!/!nnH#-"/*.;C/KegPDN *n:dd3+#n :dd3+n:mdd3+#n:{dd3+20\~KK3+20~KK3+20s~KK3+<4#'#0+4>7.74>7.<&AY2((I7!oU'4X?#&AY2((I7!oU'4X?#Ov`%5 Uh}GG5%cyOOv`%5 Uh}GG5%cyP47'#0+'>54&'7'>54&'77&AY2((I7!oU'4X?#&AY2((I7!oU'4X?# Ov`%5 Uh}GG5%cyOOv`%5 Uh}GG5%cy<\0+4>7.<&BZ2,)J8"qW+4X@$UOmY%9 M^uGG9%^rPp0+'>54&'7p&BZ2,)J8"qW+4X@$HOmY%9 M^uGG9%^rP60+3#3P昘fjH&H<"0+3#53#<Hw$0+5326=46;#";#"&=4&#,?QY44..,,,,..44YQ?,)J2>pcNH':x22$0+#"+5326=467.=4&+532;,?QY44..,,,,..44YQ?,)2>ncNH':v2<#'#0+4>7.74>7.<&AY2((I7!oU'4X?#&AY2((I7!oU'4X?#SOnZ%5 NawGG5%]qOOnZ%5 NawGG5%]qP7'#0+'>54&'7'>54&'77&AY2((I7!oU'4X?#&AY2((I7!oU'4X?#JOnZ%5 NawGG5%]qOOnZ%5 NawGG5%]q#>0+#=RIM2M0+33RfLJP  0+!#3'3#P>><x  0+!53#5#3xppHH>>>20+32Ofj20+#3ONfjx0+3xKfjx0+33xKKK||<:#dd3+Fk((3+<b  0+"&54632.#"2654&'O 6"d\e[9 ^9`"i=b#O2X  0+"&54632'2654&#"EeXXedYY L2X  0+"&54632.#"2654&'E <%d\e[4 ^?e#h8\"SDe  0+73'733!f'hP{DPCE2J5j  0+!#5!533#%!R[tffv8iFLLm>H:E<:0+3!5!gNXPmHF#/ )$0+%#"&5467.54632'2654&#""32654&Fuy@60:tzz843BPPMTQOIWQZWTPZU_ke]@MM7[fcT>LM=;3??58>F@:KV&u 3+*&uK&u*&u"-K1PX@ Y"L@UYMY+3#@P59l@ri+3#xclQl7l@ri+#'ZQll!l@UYM+3#%3#|bkRh~Wl2xl@Jri+#'#7sVMMVslPP]l@Jri+#'373`sVMMVPP$7j )@&rW[O   +"&'332673GBB!#" CAK5''5K*Gi,@)Wc\P####+54632326=3#".#"*-%!  <*'!  /8 .: 2GH@UYM+!5!GD#3Z*@'UYM+53353#X`X^^^^z\@UYM+53]bb% 1@.cW[O     +"&54632'2654&#"2DD23CC3 !!@33>>33@6$""$%cb @rW[O""+332673#"&%G'//(GMQQMb ++ ?II&J O ;_<g C      6 k v  = xp >'  <S < Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo SansCoFo SansRegularRegular1.001;COFO;CoFoSans-Regular1.001;COFO;CoFoSans-RegularCoFo SansCoFo SansVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590CoFoSans-RegularCoFoSans-RegularCoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Designer: Maria Doreuli. Team: Irina Smirnova, Elizaveta RasskazovaDesigner: Maria Doreuli. Team: Irina Smirnova, Elizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.com  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni0000uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecomb dotbelowcmbuni0394Sigmauni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni0492uni0493uni049Auni049Buni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04BAuni04BBuni04D8uni04D9uni04E8uni04E9uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Auni200Buni2012uni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089liraEurouni20B4uni20B8uni20BDuni2113uni2116 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdownuni2196uni2197uni2198uni2199uni2206uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni2610uni2611uni2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi3008uni3009uni301Auni301BuniA7B6uniF6C3uniF6D4uniF8FFCRI.altuni00CD00A40301 uni0407.alti.TRKuni00ED006A0301 uni0457.alt uni041B.BUL uni0432.BUL uni0433.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni0438.BUL uni0439.BUL uni043A.BUL uni043B.BUL uni043F.BUL uni0442.BUL uni0446.BUL uni0447.BUL uni0448.BUL uni0449.BUL uni044A.BUL uni044C.BUL uni0431.SRBexclamdown.capquestiondown.capguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap hyphen.cap endash.cap emdash.cap dblparenleft dblparenright parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.capdblparenleft.capdblparenright.cap uni3008.cap uni3009.cap uni301A.cap uni301B.cap slash.cap backslash.capbar.cap brokenbar.capat.capcopyright.pnum_lnum zero.zerozero.tnum_lnumzero.tnum_lnum_zero one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044D0301 uni044E0301 uni044F0301 caron.alt acute.cap grave.caphungarumlaut.capcircumflex.cap caron.cap breve.cap tilde.cap macron.cap dieresis.cap dotaccent.capring.capCyrbreve jkklnoop%&)*45=>CDLMWXXYZ[[\ bTDFLTcyrl6latn BGR .SRB N    .AZE .CRT .DEU .MOL LNLD lROM tTRK       aaltncaltvcase|ccmpcrcydligfraclnumloclloclloclloclloclloclsinfss01supstnum  BJRZbjrz "*2:BJhpx>@D$<<$V  L  D v     V  2  n0  P# $$$$%%"%@%^%|%%%%%%V{|W}~ZptuqSTUVY]o^_`abcdefghijklmn\wxrsV #,>?@CL^_`chjkmpu{!"[\]^abpNOPQTyz, /v gedff  gedffSTUV!"STUV!"6",-MX-[M,LL*]^_`abcdefghijklmn (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $4styy  6Lstyy styy "8Ndstyy styy styy $:Pf|styy styy styy styy &<Rh~styy styy styy styy styy (>Tjstyy styy styy styy styy styy  *@Vlstyy styy styy styy styy styy styy " ,BXnstyy styy styy styy styy styy styy styy $ .DZpstyy styy styy styy styy styy styy styy styy  T'{|v}~ptuqwxrs' #>?@C^_`chjkmpu{[\]^abNOPQTyz  F yst   yst   yst     F         st yy  $   70t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF| (!'A&l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~)t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF|l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~ >A{}*4>HR\fpzccccccccccccccccccy~,O,O\\pppppYpY+, yst      WY\,, pp   xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernv~     !#%')+-/13578:<>?BEHJLOQSUWijklmnopqrstuvwxyz{|}~X]  J"4Bhhn8V,N2`@z X^NN2N<n| ( Bn x   . . . 4 . . ^ h n x  . n B P  . .222 ^ l ~h    " @ . . .99;Y[Y   }<8I9;~ 9?Y|d||~ "9?| |~9|~ "9d}9|~ 9;|~ |9;[9;?|~ [| ";|~)(> 54?! =% #[w7F-(-  | (67-2  #9IYw| (9?BY ("22<2(2(- " #I  #Y99;9IY9[EKNOD(2(2YIM<PQSUW2YZ 4=GI2M<PQSUW2  =GHFGHJRTX)(> 54?!  (*,.02=AINR "q}|~q| q}|~|~ "mm?f|~~~~ "q}_fo| q}|~n^_`jo|m bf #^_`jo"  <"2? (2}~~p(~"-"22(9Y IY\bf^bf^`j9  9 q}t9}t9; "#%)379:;<=?IY[\cdegw!#%35678:<?LUWXklnqrstuyz|W\]^_fghoq{}w    <<2# n   o t   ~  (      2   = A2 y   #fbf!?$ aa @AGBCJJDEFJJGGHIKLMNO PQR]STUVWX]YYZQ[\^=_>` d@@@@@@BABBBBJJJJGJGGGGGGLLLLNPPPPPPSRSSSSVVVVYZZZZZZ`Q`@P@P@PARARARARG]G]BSBSBSBSBSCTCTCTCTJUJUJVJVJVJVJDWDWEXF]F]F]F]JYJYJYUJYGZGZGZBSH[H[H[I\I\I\I\K^K^K^LLLLLLM_N`NOOOGODWWDWWLBSOBSGZI\K^N`WZkk%lj&qq'()mqrqi*tlpkmtqqmqqqnq+jlr,-pqqpoqonnqu.~}xyyzzw~z4}}{{zzxx5~w67{{vy89nz:l;l~myp}ss<vnznzJYI\M_M_M_BSN`bbghghfdDqVWi01y2y3vv}}||/eeccc" ikqnrqnnquxzzzP[*F*;6DKSVUH:?>QJ=O45%8Lr  G r&rr   ABRMsI  r         rr &rrrrrr r               %%% r     &tt t'htt\t tt(ttttYtW.ttttt'tt' (]XtZtt tt.t0,muuT"1-uuu!uu"uu"#$"ju`uu#uu-u2""vu"gqfp!uvuu$uck'"d/tutututu)/)/tve'"   ++s@Nt^n_1o33vluu3a33#bi<CE97tt'(t.t0,"u"$u-u2;    "?DS1UWAY^DccJmmKstLwwNyyO{{PQip'))++--//113HJZ irt&STU\^agmns W[]beiloqx{{}}ideoromnDFLTlatn$ ` `դ'ח%חPKwL\8Climit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Regular.ttfnu[0BASE/;PFFTM\hGDEF$&(GPOSě?R|GSUB,v(*OS/2`q`cmap Hcvt Xdfpgm( gasp'glyfD:3$X\headx<6hheaHt$hmtxT 0loca̼maxp  name@ֲ 3postmAJprep}woAA%_<ח%ח!xS(8w(TXKX^ COFO   (dM1dPF@F(-P>Pv%H12CS<f22&p6:0#H<<(UUUn<W7WwWhW7WW}zWOWpWW7qW7W7wP|6rPSr< 2 (6@K.?.,b@0-KFKKbK-K!.@K@.VK2n+E2;x2R1daQ%;x36j-JFR"WJ<h72H5, (p()_,$2y##AAE 7wWwWwWwWWW77777b7PPPPmWGK666666I6.,,,,K+*-K!.!.!.!.!.H).+E+E+E+E@K6667.7.7.7.W?.?.wW,wW,wW,wW,wW,7@07@07@07@0W-+SK\WF}zWKOWKOW<OWKOWyKOW-KW-KW-K-KW-K7!.7!.7!.fx.WVKWV<WV772727272wnwnwnP+EP+EP+EP+EP+EP+E6262627!WW-.WTWK=WWKP+E I6!WW-. I67).72wn .(*n1(!7i((((E1KFwWwW"W77W}+W zWWdWWW"W wW:WWzWpWW7WqW7wd<2|W<WWRW{W7W(6,8KK(,**K*KKK4K!.,K@K..7K2KKVKK*K*,,K*2F(K-K*K&K P7!.WK" WKWEKW-K7 .7!.W-K72wW,@ P_122PAAPAA<<_BC(**#z(+4242.(25,+4242.DQ#M<$!W(2?T7HHd Z W  W  Y c (W<RUUU>'>'>'>'>'>'>'>'>'>'>'>'dd6>'>'>'>'>'>'>'>'>'>'p#p2P<Ti6n(d2(\WFK-A5@0*E*EK-KaK<D2aDrDfE.1d**##2122s<sP<PrPr<2s<sPp#p2P<22;x;xn<JF<22DC25>:<H<(25,+4242.(25,+4242.wWW7dRW7W(6,*K!.K*K*"+7!2tZ$q*y2V#6%%*~7~37Y#_cuGc      " & 0 : D p y !!!"!.!T!^!!""""H"`"e$i$$&''0 0 927Y#brFb      & 0 9 D p t !!!"!.!S![!!""""H"`"d$`$$&''v00{uh[S;%"bAigY?93)!e/sleb^ (UA10F6Z V   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqdeivokuj20r34ghlzcn1.m{b7wU[ap]^_xb`\, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcER[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B CEc C`Ec*! C +0%&QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`+u+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-), .]-*, .q-+, .r-, +ETX#B E #B #`B `aBB`+u+"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,%%G#G#a C+e.# <8-9,%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:, & .G#G#a#<8-;, #B F#G+#a8-<,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=, C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FRX +-g,:+?+-h,:+@+-i,;+..+-j,;+>+-k,;+?+-l,;+@+-m,<+..+-n,<+>+-o,<+?+-p,<+@+-q,=+..+-r,=+>+-s,=+?+-t,=+@+-u, EX!#!YB+e$PxEX0Y-KRXYcpB-*B *B**B@ * B@@ *D$QX@XdD&QX@cTXDYYYY" *DdDPPGG>>PPGG>>2222\"jDl6l6LZ ( Z  H b 0 v  R  J x &Jbpf&\(t \&R^t$NL8tLl4p &@ZV $ 0 < H T ` l x !!!*!!!!!!""T"`"l"x"""#$6$B$N$Z$f$r$~$$%%%&%2%>%J%V%%%%&&& &r&~&&&&' ''''''''''(( ((((((()$)))))))))****++^+j+v+++++,<,H,b,n,z,,,,,,,,,--2-Z-------...N......./v//000"0.0:0F0R0^0j1@222*2<2H2T223 3,383D3P3\3h3t33344\4h4t444444444565B5N5Z5f5r5~55555555556666&686D6V6b6n6z667 7J7z788F888889969X9d9p99: :(:0:<:D::;*;6;B;N;;;;;r>z>>??8?x??@:@@@AZAABBBTBBBCCLCzCCCCCCDDDDDEEREEF FPFFGGGbGnGGGHHHjHHIIIIZIIJ>JJJK KTKKKLLjLLLLM(M^MfMnMvM~MMMMMMMMMMN NN"N.N:N:N:N:N:N:NTNnNNNNO>OzOOP@PdPtQ:QbQQRRJRRS SSSTTT"T2TTTTTUUvUVbVVW&WjWWWXXX6XPXjXXXXXYY*YDY`YpYZZ6ZTZrZ[l\\]4]^D^_`R`aLafaaab$bpbbcNc~cd:dddddeHepeg6g6gPg`g~ggggh2hrhzhhhhhiii&iNiriijjLjjjjjkkkk,k:k|kkl ll2lhllm"m8mNmjmmmmmmmn*nTnnnnnnnooJoRoboroooooooopppp*p8pFpTpbppp~pppppppppppqqqq"q.q:qFqjqqqqqr,rjrrrss.d>  0+!%!! '7d`222j:F%!d,@)Y"KY#L+7353t _ YknnP>DK1PX@Y"L@UYMY@+333VPZPFKPX@(  s   a"KY%LK1PX@&  sb   a"L@/r  sb U Y MYY@+7#537#53733733#3##7#37#{HHyHFFFFF@B#*1-@*/.('  !Jrs+L+?5.54>753.'#5.54&'>@S J:go!9O-B`lQ ??htycB[yRC?;GLECBF 8=VZ-E/RQ`N,?P][^QQ\31 =61 9( '3KPX@+   c  d[*K [ #L@3   c  d"K[*K#K [ +LY@')(/-(3)3#!''   +"&54632#32654&#""&54632'2654&#"H]]HIYYKKA)11)(55H]]HIYYI)11)(55H^ZW[[WZ^:;8989;:l^ZW[[WZ^B:;8989;:-,6~KPX@43# J@43# JYKPX@[*K[+L@[*K#K[+LY@1/+)*#+!'#"&5467.54632>77>54&#"3267''1%dDsYE$hWUdeN"K 0gJ&7A<03:e`O/M3J4"l`N\ G)Hd]KN] "k, Hs'm&; =5.481\0+4>7.>&AY2,)J8"qW+4X?#Ot`%9 Sf{GG9%dyP1n0+'>54&'7n&AY2,(J9"oY+4X?#Ot`%9 Sf{GG9%dy%xQJ@ JK1PX@ Y"L@UYMY@ +7'7'7'37'`cc`:`cc`xq<3553=DmB3 "&n<95" 2\3@UYM+%!5!\*NCn@Y#L+353CknnS>@r'L+3S#On<b -@*[*K[+L     +"&54632'2654&#"OeXXedYY L #@ J"KZ#L+73'733!R'hcPhCxP24'@$J[*KY#L%"+4&#"'>32!!57>LIK_Oo7X; 7K+ J^6NVH`{ 7M,0K?:P^5^2J#D@AJcY"K[+L##+"&'732654.#"'%!5!6232AfReHT_1A#- tj{'Eb SkF32#"&'732654&#"'!!V*wxnQ bGUX\N-O!R%Xsfd~]W<32%"32654&EtTi9{dQ*;''E4i>0YE)N_cJN__dz6\zCǦYQ( @; Jc[*K[+L%$+)$/%/##*"+%#"&5467.54632%2654&#""32654&Zuy@60:tz833APXUTQ[UWQfcTPb]_mg]@KM7[fcT>LL=;3??58>F>:5#".2654&#"0YE)N_cJN__dz6\zCǦYQ( KPX@]Y%L@aUYMY+!!!!U  LLU<5@0+55%U VpV!<@9Jp[*KY#L!! %*+7546?>54&#"'>3253'7!$@>CK Qqkik?!/!^kH#-"/*.;C/KegPDN *nn32#"&'#"&54>325332654.#"326754&#"326oD> ,@) Jb"K#L + #'!#3 ]IG\F}XfKWK C@@Jc["K[#L   ! +3!2##32654&#32654&Wdz)6<5kPC@IKGIWc.PP=c[[5;<17:=871@.J[*K[+L+%267#"&54>32.#"u]cQw.SvGxQa]9X:yDUG krSZ/rk CY(Ge=zW'@$["K[#L !+3!2#'32654&+Wyz{yOwW1 /@,aY"KY#L +3!!!!!W|wPNPW1 )@&aY"K#L +3!!!!W|wPN7#l@ JKPX@a[*K[#L@#a[*K#K[+LY@##$%(#+#5#".54>32.#"326=#5M"kXWW @J"K#L+!##33sSjzS8E7-@*[*K[+L +".54>32'2654&#"}JyU..UyJJyT..TyJr}}rr~~ 0YRP[11[PRY0Nz{{zWI +@(c["K#L $!+3!2+32654&+W ovuyKECMnccrQE@E>7)H@EJGp[*K\+L%#)) +".54>32''267'3>54&#"}JyU..UyJJyT.F=C=FA%){__-.}rr~~ 0YRP[11[Pd+W-` N"yJ{{zWd3@0Ja["K#LA!+3!2#*+32654&+W nwFFfLDDLncMgRE?E>7J+'@$J[*K[+L-%-#+?32654&/.54>32.#"#"&7QeLO^9:w`^%B]7o}P QPNX6#@ aY'L+3#3P昘HHS>@r'L+#3ON<>"@aY'L+3#53#@Y'L+!5!3N(&K1PX@ s"L@ riY+#3`lN6)KPX@ J@ JYKPX@c[-K[+L@#c[-K#K[+LY@'%!%#D#+!5#"&5467654&#"'>32'&"3265uM3N[cR%@ <.35 LbOQiPC"341*32#"&'732654&#"KP\(,M:!|e3K[32.#"326KeZc|#EKJE?9 @Y~z?]>Z<";_ROb;.yKPX@ J@ JYKPX@"K[-K[+L@ "K[-K#K[+LY@$#+!5#"&546323'54&#"326O5b}e+KPPU32'"!.P>8> KjSfy#PT4" CLs;]?!xmF97H]/@,["KY%K#L!#+3#53546;#"3#p\\]U;86/J*]EH-5"Jn04)@ JKPX@ [%K[#K['LK1PX@$%K[-K[#K['L@!_%K[-K[#LYY@ $&$%%#+3#"&'7326=#"&5463254&#"326KcLwNN(BSO3b}|h1OW;EOJHHL)r_JM 3)@K>""xut&#*NE^QL[WK,@)I"K[-K#L##+33>32#4&#"KPU,SbP7>9P#%WT/1>F;FLKPX@Y"K%K#L@a%K#LY@+533F[VP8``$>XKPX@Y"K%K\'L@a%K\'LY@ +53+53265N[LU/(1'8``\ WPJ,0K 1@.Ja"K%K#L +33373#'#KPE`aFwK@"K#L+33KPXK"[@ JIKPX@[%K#L@%K[-K#LY@""##$# +33>32>32#4&#"#4&#"KMR*#%0'+,WT/1>F;/1>F;KLJKPX@[%K#L@%K[-K#LY@ ##+33>32#4&#"KMW.SbP7>9PB%'WT/1>F;. -@*[-K[+L   +".54632'2654&#"1U<#ed||dHHHHGNP !?^;vvtG_ST\\TS_K>!f@ JKPX@[%K[+K'L@ %K[-K[+K'LY@&#+3>32#"&'32654&#"KPX1,M:!|e/M[yKPX@ J@ JYKPX@[-K[+K'L@ %K[-K[+K'LY@$#+5#"&546325354&#"326M3b~e/NNQV;EPLGHK!!ut% ;b*NJ^QLe\KM'@$J[%K#L!#+33>;#"KLP#+$2)E)M  2''@$J[-K[+L+%+#+?32654&/.54632.#"#"&2K @668+3>BLeSW^ I 77080*=NE`^Sk -+%! =>>NR6#0&" E9=NFP[)@&rY%K\#L# +!#"&=#53533#;PJ^CSSQ)*GPUJJ3)ELJKPX@%K[+L@%K#K[+LY@ ##+!5#"&5332653Y.S^P5<9PPF')WT;1>F;$!@J%K#L+333˽URx$ !@ J%K#L+333# #Syxdy{NUTy~$m &@# J%K#L +!'#7'373w^]y{\误>"@ J%K\'L!"++5326?33 H6."2XSID5J(4y2 ,@)JY%KY#L +35!5!!22;QAJNJ>w$3@0Jcc['L$#!,!%!+75326=46;#";#"&=4&#,?QY44..,,,,..44YQ?,J2>cNH':2x>@r'L+3xKn2>$-@*Jcc['L%!,!% +%#"+5326=467.=4&+532;,?QY44..,,,,..44YQ?,2>cNH':2R8,@)cW[O#"#"+#".#"#>3232678DF72. LDF60, GW 2FX 2d4;K1PX@Y%KY'L@]Y%LY+3#3#dkkI _nMa)!*@'  J"K#L+!5.546753.'>7'WorTBKcH 9236 G\Q>95B\ }nk ][QG(86#?S[UE] X ZQ:(9@6J Ia[*KY#L%%+#!!5>54&'#53.54632.#"3'c!1<qX }dbk R >>@I"  /DPP N1  B#L1_leQ 2CF7-N(%5dt#/E@B #J HGcW[O.,(&!-+7'7.5467'7>327'#"&/32654&#"^9uo8q: 9u8s p8p:!!: C::==::C59t:"#;p8q  t8t:""9p8o@; Ja  a"K  # L! +!5#535'#53333#3#reav|BFB`JBHB|x>*@'aY'L+33xKKK@pp633DL@ >1! JK,PX@[*K['L@_[*LY@ %#%"+#"&'732654&/.5467.54632.#"'>54&/p]Zl Q D29C>2SCOC0")lZQnP ;38>6(aJJ@0#'.?33W,A1+(I\RP112(.' GH:P@1D[TN023$'( JF9M=p <,+3 ?/(1 -8=DKPX@Y"L@UYMY@+53353-X`X8^^^^F'C@ A@43JK1PX@%c c _[-L@,cc c W [OY@)(><861/(C)C''  +".54>32'2>54.#"7"&54>32.#"3267K]66]KJ^66^J=jM,,Mj=>jL,+MjFOh2B%?V H)(-==-(*H Y36]JJ^66^JJ]68.Nl=>lO..Ol>=lN.cf\0J2B9+D:8B'7B"/)K&PX@J@JYKPX@c_[*LK&PX@"ccW[O@)pccW[OYY@'%!%#D#+5#"&5463254&#"'>32'.#"32651#132'2654&#"'532#'#7#32654&%0U?%$?U11U?$$?U1OigOOiip..9I0((($>V11V>$$>V11V>$/jPPjjPPjH'%"UMM5 7F1@UYM+#531FD2ox *@'_[*L     +"&54632'2654&#"B``BD``D%77%%55oYIHYYHIYF3))22))3HBc 8@5aaUYM  +%5#53533#!!!HFF323!57>#!#+? NA=I,/^ߚ"# 3>=5+8?>?l$,_H@E  JacW[O +2654&#"'7#5!2#"&'7(,-'  w;ETE3!###2O66O2VPVZ 8K*+K7 P _ 3+$2 @ JK PX@hc\'LK(PX@pc\'L@!pcW\PYY@ +"&'732654&5731< <#()B&.19"( -2-$(&22b MJKPX@rY%L@rUZNY@ +535'733OljIc>=4Q>#V pKPX@[*K[%LKPX@_[*L@cW[OYY@     +"&54632'2654&#"FTTFETRG(**)&,-SOMQQMNT>40/22/04#  I@ JK1PX@%K#L@Y%LY@  +?'337'3%^oZ A&'3+t3+Ak&'3+t3+E&'3+t3+1!eJK&PX@pY%K\'L@p`Y%LY@!!+#53267#"&546?>=9k`'7!$@>CK Qqkik?!/!nnH#-",*.8C/KedPDK *l&$l&$l&$i&$Z&$V&$ 3+ B@?JaaY"KY #L +3!!!!!!'!3  C >o {PNP77*4@*)JK PX@-hf[*K[#K\'LK PX@.pf[*K[#K\'LKPX@/pn[*K[#K\'L@,pn`[*K[#LYYY@.,'% 44 +%267#"&'732654&57.54>32.#"u]cQe".1991< <#($.SvGxQa]9X:yDUG bp ($(&2"( -,SZ/rk CY(Ge=zW1l&(W1l&(W1l&(uW1Z&(l&,Wl&,<+l&,ó Z&, 7@4a["K[#L ! +3#53!2#'32654&+3#WFFyz{y5H+OwHWi&17l&27l&2'7l&27i&27Z&2b[)!  0+?'77'b2122127)6@3'&J[*K[+L)) +".54>32.#"2>54&'}JyU..UyJJyT..TyQK.r9Z> D 0YRP[11[PRY0^9`#s(Gf=3Y"fP{l&8P{l&8 P{l&8P{Z&8l&<W? 4@1cc"K#L   $!+3332+#32654&WVnwvxLCAxnccrE@E>K&=@:!Jc[*K[#L &&+!#532654&+532654&#"#46327::DPTE671?E9BGQwd_l..>GK?=E7H@168K? dl_S1O NLe`6&DC_6&Du6&D[=6&DaM6&DjF6&D_6.5B(K PX@  .JKPX@ .JKPX@  .J@  . JYYYK PX@)  U a [-K [+LKPX@$  a [-K [+LKPX@)  U a [-K [+L@*  a  a [-K [+LYYY@0/@>9632/505"$%#D$" +%#"&'#"&5467>354&#"'>32>32!3267"!."3265jS>fh>K[bS%@ <.37 KcN@Q_._pP>8> 8L BE!332+9TCM;.18HCLA&402$?O2*'zm!NT4"G<9J'"#(69..2@)(JK PX@%hc[-K\'LKPX@&pc[-K\'L@#pc`[-LYY@.-&$  22+"&'732654&57.54>32.#"32671< <#(!Zo#EKJE?9 K NE .19"( -(|t?]>Z<";_ROb;# 7T &$(&2,&HCZ,&Hu,&H[@,&HjQ&CK&u&&[&j*$0[@!J$  HK,PX@[%K[+L@c[+LY@&%,*%0&0+'7.'77#".54>32.'2654&#"\$9eNCM9V81V>$";S14I;(HMPIBTU1, 9 11&Y76X=!$0N `KNX[MK^K&Qai.&RCe.&Ru.&R[L.&Ra\.&Rj\H;B< ;@8aaUYM  +53!!53jjjjnLjj.#6@3! J[-K[+L## +".54>32'.#"2654&'1V>$#>V2d +GTHN , !?^;;\?!vt 7 ]`S!7 E&XCjE&XuE&X[NE&Xj^>&\uK>!=@:J"K[-K[+K'L&#+3>32#"&'32654&#"KPX1,M:!|e/M[&\jER&$  3+6&DpKj&$6&D]E7D@AJIb"K#K['L +".5467'!#332673n,"*IG\l !5! _} $$5X1=K67.;S@P",Jc[-K[+K['L973/)' .. +"&54675#"&5467654&#"'>323267&"3265-C)"M3N[cR%@ <.35 LbOQi-  ;C"341*::>*LL^QLe\W1H&(,&HpSW1j&(,&H]PW1\&(,&H^W7:F@CJ IaY"KY#K['L%& +3!!!!!3267#"&5467W|w!4#  .K+!PNP2=,1$5,6,3G@D  Ja[-K[+K['L.-10-3.3+"&'" +#"&5467#"&54>32!32673267"!.-C !fy#9> F 8K  =/19s;]?!xm!PT3" 4 !4%F97HW1l&(,&H\@7l&*04&J[P7j&*04&J]_7\&*/04&J^7&*S 3+04 '4@'JHKPX@) a[%K[#K['LK1PX@- a%K[-K[#K['L@* a_%K[-K[#LYY@31-+%#  +#54673#"&'7326=#"&5463254&#"326I_+1 KcLwNN(BSO3b}|h1OW;EOJHHLmUL27+ )r_JM 3)@K>""xut&#*NE^QL[WW{l&+H&K[3+;@8  a  a"K #L +3#5353!533##!!5!WFFT|TFFT|DmmmmD /}z;@8 Ja"K[-K #L## +3#53533#>32#4&#"K<9P0>::>%&WT/1>F;i&,&a H&,&p j&,&]7,@) J"K['L+"&546733267-K*V!.  -2$6X0=7_@ JKPX@Y"K%K\'L@a%K\'LY@ +533#3267#"&546F[VP-  -C)8``$/=.1#5S\&,6K@%K#L+33KP$W &,-F>&LMl&-)>&Y[Wd&.S 3+K&NSW1l&/:KL&Ou%3+W1&/S 3+<&OSW1&/K0&OW1 0@-a"KZ#L  +%!37531&V]PPbbK[*@'a"K#L+33753KPe[X``1 ,@) J"KZ#L +%!57371&FFUPP!&O&8YOY &@# J"K#L +355737ZRROSS;R;o:R:Wl&1K&QuW&1S 3+K&QSWl&1K&Q\[K&Q3  3+W>3@0 J I"K#K['L!#++5326=#3TP<7-)pSjyG^SM10=K>X JKPX@[%K#K['L@%K[-K#K['LY@ !%##+4&#"#3>32+53267>9PPMW.SbLU5.1'K1>F;B%'WTWPH-7H&2.&Rp\7j&2.&R]Z7l&2.&Rbof+@ $ #JKPX@5a [*K[*K[#K[#L@1a [*KY"KY#K[+LY@(&5(" +)#".54>32!!!!!3267.#"I6%JyV//VyJ%<Yc >[:96:[> .XUSY/PN=fI((Hf.N")5J@G"Ja [-K [+L+*$#1/*5+5'&#)$)"$&$" +%#"&'#".54632>32!3267"!.2654&#"KjS?[\=1U<#e>]^:_pP>8> 8K  >VHHHHGNPCL3..3!?^;v2002xm!PT4"G97I_ST\\TS_Wdl&5KW&UuuWd&5S 3+<M&USWdl&5x7k&U\ 7Jl&62&Vu7Jl&6v2&V[97*J@@=21JK PX@,hf[*K[+K\'LK PX@-pf[*K[+K\'LKPX@.pn[*K[+K\'L@+pn`[*K[+LYYY@ $%$%-#+?32654&/.54>32.#"#"&'732654&57.7QeLO^9:w`^%B]7o}P QPNX@;0/JK PX@,hf[-K[+K\'LKPX@-pf[-K[+K\'LK(PX@.pn[-K[+K\'L@+pn`[-K[+LYYY@ $%$%+#+?32654&/.54632.#"#"&'732654&57.2K @668+3>BLeSW^ I 77080*=NELK.1991< <#(H\ -+%! =>>NR6#0&" E96K $(&2"( -$F7Jl&62&V\8c&7S 3+P[&WSncl&7WjK1PX@)pY"KY%K\#L@'paY%K\#LY@ #! +3##"&=#53533#;P59gJ^CSSQ)*GPUJJ3)c)@&aY"K#L+#'#535#5!3UO!!HPPP[9@6r  aY%K \#L +!#"&=#535#53533#3#;PJ^CSSSSQ*.CPU<@rIIr@;5'P{i&8E&Xa^P{H&8E&Xp^P{j&8E&X]\P{&8E&X_P{l&8E&XbqP4{&]$JK1PX@"K[+K['L@_"K[+LY@! &&+".5467.53326533267,"&VjXXeV]]!2!  $!4csSSscp3=E7%A@>#J%K[+K\'L  %%+"&54675#"&53326533267-C)"Y.S^P5<9PP-  .1#7A')WT;1>F;$0=l&:D&Z[l&<z>&\[4Z&<6Sl&=2&]u6S\&=2&]^6Sl&=2&]\?7%6@3 Ja[*K[+L! %%&'"+467!.#"'>32#".267!7pjUjO4Mb6-RuG &/McK>&OMW&1-W>&1MK>&QM%P{l&8E&X\N H&6&pW&'=W&'].&G]< l&6&uP7l&.&u7J&6S 3+2&VSc&7S 3+P[&WSnH&<>&\pH> @%K\'L !#++53265LU/(1' WPJ,0.@@=Ja[-K[+L +2#"&5467!.#"'>267!`x}`bq^M:6C IuF9H Cxwwj SR5" EKUF96I(`8JK1PX@ s"L@ riY@ +#'#7lLPPLlQQ*^0JK1PX@ s"L@ riY+#'373`jLNNLPP1= )@&rW[O   +"&'332673CAB#"C?G5&&5G(85KPX@ Y"L@UYMY@ +53([8``!  tK PX@cW[OKPX@_[*L@cW[OYY@     +"&54632'2654&#"(99((99( 4++44++4277EJK PX@f\'L@r\'LY@  +"&546733267-C2G/ .1$64=("ALKPX@`["L@Wc\PY@####+54632326=3#".#"(()! =(%" " .;.7 (~4K1PX@ Y"L@UYMY+3#73#\lJ`Lzu(n@UYM+53([``(.Eg 0+!!5%5!!' b5MQ QMK>0+332653#5#"&'KP5<9PPKY.31>F;$F') 0+3#5!#;#"&5#dFL#%><KK2L@NoW1l&(W1Z&(=@: JcYK[L#$! +!532654&#"##5!!>32#&KNWT+V VW+z$?X3N7#".54>32Qa]c{ 6zf.F2 PxGvS..TvGw?\vqLty*8 az+WYVW-t7J6W, Z&,--'4@1cYK[L #!' '!'$! +7>45!32#!!+5326%#32654&xvwnS]-#,;pNAC'n{;jkcnX.nja!jfP5>E@EW>@; caK\ L$! +33!332#!!#32654&WVdVxvwngNAC)jkcn/W>E@E=@: JcYKL +"##5!!>32#54&3U(V#[6wsVDU XPP enLIWdl&.Wl&\b&zWqy MK PX@gKZL@sKZLY@ +##5#3!yTVvXX$WI 6@3cYK[L   !+3!!32##32654&WuownNCEPgccdC;>@;WK%W@YKL+3!!WP q3@0QYKYL +53>7>5!3#5!!! A /ZT ]sJNwߏ?n,!MPOW1(6@3JaK L +!##33333##]mi`V`im]0YO((0:O(D@A Jc[K[L$"!((+"'>32#"&'732654&+532654&SOaQoj847@ts Q bTSXHKccI@PdPBdm`a9M IEaili HLD>5:K<36?W $@!JKL +!#331bTqiG?XWb&Wd.i!@YK[L!'+7>5!#!+5326VS]-#,;'n{;XX.nja!jfP5W0W{+72Ws!@YKL+3!#!WVXXWI37&c7\"@ JK\L!"+%+5326733h!SMD>,6aӿZHHO$( Q2 $/KPX@  ccK LK PX@  ccY L@%U ccY MYY@,+*)!  +5".54>7532#4.#2>%3u@uY55XuASAuX44Yu@'AX01XA&(BX/1XA'QBkKJjC LL DjJKkBQh9O/i/N89N//Nm;Wq )@&sKZL +3#5!3!yZTVvߏX</)@& JcKL#"+32673##"&=3DT1V(VV#Z6wsVLI >X enW %@"KZL +33!3!3WVVVXXXWq-@*sKZL +33!3!33#5WVVVZTXXߏ 6@3cYK[L   $!+5!32#!2654&+xvwn NACLXPjkcnX>E@EW 4@1cK\L   $! +332#)3%2654&+WVxvwnNV_NACLjkcnXO>E@EWI *@'cK\L   $!+332#!%2654&+WVxvwn NACLjkcnO>E@E74@1Ja[K[L$%"#+?3267!5!.#"'>32#"&7Qi[ht7peWjPmvBYytLstUEhrqW"sKPX@!a[K [L@)aK[KK [LY@""  +"&'##33>32'2654&#"h ~VV~ IwT--TwIq{{qqxx ԏ1[PRY0Oz{{z(B2@/Ja[KL&+!#+#.5463!";BVgJIwnKDCL iNcnOAB@E6D8)R@ JHK PX@[K[L@c[LY@$"))"+%#"&=4>7>7>322654&#"zdh'Fb9.N! #Z&Yi_3bmKEJBA]RndWsG" M  _r+,zcKNQI;\^K C@@Jc[K[L   ! +332##32654&#32654&KNU(+%MU ((&#.')B?: 9*=I!""!Ǎ$!%#K@YKL+3!#K<Jnz+@(QYKYL+73>7>5!3#5!#3#2"RMNNJK+*=V;nІO*?HEg,H6@3JaK L +!5##7'3353373#'#CAb^|HLH}]aA*(D@A&%Jc[K[L#! ((+72654&+532654&#"'>32#"&'79<.9MT.)147? KnPU]%%%1kZYi L>;,"#'A' *0+HIK;#9 6-ENMH '5K @ JKL+3#33#VMXMu$wK&T_ 3+K -@*JaKL +33373#'#KPQ]`O!@YK[L!'+7>5!##+5326rQP@E%$ QUQ$B?:_FJ.Kv '@$ JKL +333##KvrNSr${zK '@$aKL +33353#5#KPPP$.RK!@YKL+3!##KP$nK>S.F!@YKL+5!##PJJn>\.>%2?M@JJ K [K [KL53(&;73?5?.*&2(2%%8#A +23"##5"&#.54>7:75"&#263>54&23"# 1WA%&AY3 O 3YA&'B[3f  HVY  B\V8X<=\= <[=>X:TTTQWQTTU[Kz( )@&RKZL +3#5!33MNqPnІn2/@,JcKL##+!5#"&=3326753X;!Y_P=41P IN1* $K %@"KZL +!3333PP$nnKz-@*RKZL +3#5!3333MNPPnІnn, 0@-cYK[L  $!+332+##32654&|TVSYʝi|{6'&ܤOHKV1'((KV<@9 cK\L  +!3!332#7#32654&PP|SUSW|{6'&$ܤOHKV1'((K 0@-cK\L    !+3332#7#32654&KP|TVSY|{6'&ܤOHKV1'((*4@1Ja[K[L$%"#+?3267#53.#"'>32#"&*K A=?ED><> HlRcwxdZk )6JEDDM9&DQ{}yQKnKPX@!a[K [L@)aK[KK [LY@$" +333>32#"&'#%2654&#"KPd |\d||d\~ cFHHHHGNPdlvtsh=_ST\\TS_* 2@/ Ja[KL"+46;#5##7.35#"5aNPkt]854&#"##53533#>8T^3J/$"3 :=9PPPPNY}`N"H32I :>=NM>?9 KeZ1T<"$>S/]aP"Z2VFL ZKPX@YKKL@aKLY@   +533533X`XP8^^^^$>M'4@1cYK[L #!' '!'$! +7>5!32+#+5326%#32654&rHtTVSY­AD%# ts6'&QUQOHKVB?:_FJ.x1'((K>@; caK\ L$! +3335332+5#%#32654&KPPuTVSYut6'&äOHKV1'((;@8 JaK[K L## +3#53533#>32#4&#"KPPNV-SbP7>9P0@88@%&WT/1>F;K&uK&Co>&\TFKz MK PX@gKZL@sKZLY@ +##5#33ۡNP$n >@;ra c\ L! +3#5353!!32##32654&U1ϹuorsNCE LaaL_kcdC;>@;":@7 cKYK\L$! +3533#32+##32654&O}O[YSʝi}|2..JlDNMG%'($7!>@;a[K[L!!  +".54>32"!.267!}JyU..UyJJyT..TyJh~  }hk}~ 0YRP[11[PRY0pii܅mm. >@;a[K[L   +".54632"!.267!1U<#ed||d@O(JAAJQ !?^;vvtKGGKNHHN!@J[KL!"+>;#"#36;( Z[?63P!@J[KL!$+#3>;#"UUu+-$hw2/(JW *GK PX@fYKL@rYKLY@ +3!53!WcPK:GK PX@fYKL@rYKLY@ +3353#KJ^n -@*aYKL +3#53!!3#WFFHAPH  -@*aYKL +35#535!#3#KAA<@J@Wq|6@3Ja]KL +33333#5##WViPT0}(ߏ0Kz6@3Ja]KL +333733#5#'#KPQ]}GN$OІWq_K PX@!gaKZL@ saKZLY@ +33!33#5#!WVxVZT\)ߏ/Kz60@-a]KL +333533#5#5#KPPMNOnІ<>@JKL+333#URP&/@,JaKL+!5#53333#!eaHKH>+@( JKZKL+!##5#53333NkURh?xcWJ)@& JcKL#"+%4&#"#3>32#DT3T(VV#Z6wsVLI  enKK7>.Z7.WY&1d 3+Kn&Qd7YJ&6d 3+2n&Vdl&:D&ZCl&:&Zu5Z&:h&ZjW1i&(,&HaPl&<>&\CQ_0,~@UYM+!5!,30N23@UYM+%!5!3N2s3@UYM+%!5!sANP $@!HUYM +#5467mB3 "&#n<95" A @GY"L +53'>=TmB3 "&:n<95" Aqn @GY#L +353'>=TmB3 "&n<95" Pz 3@0HUYM   +#5467##5467gmB3 "&vlB3 "&#n<95" n<95" Ak +@(GY"L   +53'>=353'>=TmB3 "&vlB3 "&:n<95" n<95" Aqkn +@(GY#L   +353'>=353'>=TmB3 "&vlB3 "&n<95" n<95" < MK1PX@a"K#L@UaYMY@ +#53533#ܠL FFC<eK1PX@ a a"K  # L@% Ua a Y   MY@ +5#535#53533#3#ܠL FFFFB @[%L  +7"&54632-@@-.@@@..@@..@Cfn&'( '3?KKPX@1 c    d[*K  [#L@9 c    d"K[*K#K  [+LY@7A@54)(GE@KAK;94?5?/-(3)3#!''   +"&54632#32654&#""&54632!"&54632%2654&#"!2654&#"H]]HIYYKKA)11)(55XH]]HIYY6H]]HIYY8)11)(55)11)(55H^ZW[[WZ^:;8989;:l^ZW[[WZ^^ZW[[WZ^B:;8989;::;8989;: 0JK1PX@ %K#L@ Y%LY+3#'[Z#  8JK1PX@ %K#L@ Y%LY@ +?'3#[ z?@"K#L++3H>>(h uK PX@cW[OKPX@c[%L@cW[OYY@     +"&54632'2654&#"NRRNPPPP----,..^][``[]^=>@A==A@>+l Z JKPX@rgUZN@rsUZNY@ +#5#5733#'35=@ҳ_//ԔPG::4]D@AJacW[O +"&'732654&#"'73#>32

32'"32654&MQUK6J @ %,45#=LOB"0,$%+*Z\c],3 =<999A4V*@'JsUYM+#5!_"+AL2c#/A@> JccW[O%$+)$/%/##*"+#"&5467.54632'2654&#""32654&cSFGQ#OCFK#)&&)&))&(-,)**+7866* '1863& )I3.^$G@D JccW[O $$ +"&'73267#"&54632'2654&#"3N > ,1,1%32

;#"##15D P(+$2)Q PE% M  F>Q:4J@G$#J I  a a[*KY#L430/.-%%D +%#!!5>5<5#53.'#53.54632.#"3#3'c!1>@I/DPP N1B"B!_leQ 2CF7#B!#S1O@L+* Ja  a[*K [ + L11/-(&%" +753&45<7#53>32.#"3!!#3267#"&'#JJQh]tLGCDRREFJ H wbhB   By{\[ 4EVSB   BRZF4 Wb}zMO=I@F= Ja   a[*K [+L;94321%%" +%#"&5467#53>7>7!5!>54&#"'>763#!!32671 x]ct @2l ><=O Mua[q A 6 J7546323>54&#"^9TJ+";G9;=.?#--Z+2KKH]G:'BMF>$MICt1'ڴ(l&#(W !% @ $" 0+"&54632##332654&#"!5!?:VW;32!3267"!5."nI^74[JExX3%}OWLy%#t]m2]SN~X0.RsD7:BNE=619?m& 'u3+t3+Tl&' 3+t3+7~&'3+t3+Hv&'3+t3+Hx&'3+t3+d_&0'W3+t3+Zu 0+!!Z2@3[2J3W 0+!'3'k2>3@23u 0+!'7'7!@23a2>3W 0+!737q2J32@3M 0+!!#5BHMHB5YM  0+7!5!#Y/HBGH/`SAc&a 0+73!5!c5G/aR,5@T`/H&a 0+7'3!/G5AR&/5BH(0+!5!HH` W3d0+!!W$dL<+7 1,( 0+#"&'#".54632>3232>7.#"%"32654&)=&1.AaC-0 ">--1+$75((2R8/# 0+232673#".#"#>232673#".#"#>41. LH?50.$LJB41. JP7"6.+$LJ BFBH EC!BHU5@ 0+?#537#5!733#3!DqUJQJwUDyHHHHyU 5T  0+%%5%!!5 ^> VpVLU 5T  0+7%5%!!U > VpVL''2V@S-,+Jp c bW[O(((2(210/.*)''  +2#".54>"32>54.53'733Rc88cRRc88cREtR//RtEEtR//Rt~s$Qm8cRQd88dQRc880UvEDvU11UvDEvU0FB:ZF''@P@M=/.J ccaW[O<;:931,*''  +2#".54>"32>54.4&#"'>323!57>Rc88cRRc88cREtR//RtEEtR//Rt,&*1 K XNJU69x%&8cRQd88dQRc880UvEDvU11UvDEvU0 &.$9OK=4C&PFL,''Dd@aA < ;/.J  c a  ccW[OCB@?>=9731,*''  +2#".54>"32>54.#"&'732654&#"'7#5!6Rc88cRRc88cREtR//RtEEtR//Rtr^THcL 80.321!AIW8cRQd88dQRc880UvEDvU11UvDEvU0hDL=?"$)" ;wBNh:''255,JK PX@3ph  c bW[O@4pp  c bW[OY@43210/.-+*)(''  +2#".54>"32>54.#5#533#'35Rc88cRRc88cREtR//RtEEtR//Rt,LhBB8cRQd88dQRc880UvEDvU11UvDEvU0_K DD''Ff@c> 98,+J  c a  c cW[O)(B@=<;:640.(F)F''  +2#".54>"32>54."&'732654&#"'7!#>32Rc88cRRc88cREtR//RtEEtR//RtAEd N 6'.10-.M 8"?Z]8cRQd88dQRc880UvEDvU11UvDEvU0;A !"'%%( Fn DIEP''@Li@f218J  cc  c  cW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54."&54632.#">32'"32654&Rc88cRRc88cREtR//RtEEtR//RtF\_jWAWL -&5A@,D[^R+95.,718cRQd88dQRc880UvEDvU11UvDEvU0lnvt59FKEEDN%"$&&%"$''.Q@N-J pcaW[O(((.(.,+*)''  +2#".54>"32>54.!5!Rc88cRRc88cREtR//RtEEtR//Rt\8cRQd88dQRc880UvEDvU11UvDEvU0lHQ''?KWj@g:.J  c  c c  cW[OMLA@)(SQLWMWGE@KAK53(?)?'' +2#".54>"32>54.2#"&5467.546"32654&"32654&Rc88cRRc88cREtR//RtEEtR//RtDYT%")[XY_'""^R.44..00.3782.778cRQd88dQRc880UvEDvU11UvDEvU0[C8%. .(;LJ<(/ 4 9CF " "''@Li@f821J  c   c ccW[OBA)(HFALBL<:64/-(@)@'' +2#".54>"32>54.2#"&'73265#"&5462654&#"Rc88cRRc88cREtR//RtEEtR//RtB\_jWAWK .&5A@,D[^Q+:7-,608cRQd88dQRc880UvEDvU11UvDEvU0\lnvt59FKEEDN"%#'&%"$'';BN@?> JK&PX@.  c   c cW[O@4  c   ca cW[OY@'DC)(JHCNDNBA=<31(;);'' +2#".54>"32>54.2#".54>#'732654&#"Rc88cRRc88cPEsR./RtEEtR//Tt2$$22$$2D="bA##""8cRQd88dQRc880UvEDvU11UvDEvU0`2XBBX22XBBX2Fe%2BA\\AA\\A''3?R@O cc  cW[O54)(;94?5?/-(3)3''  +2#".54>"32>54."&54632'2654&#"Rc88cRRc88cREtR//RtEEtR//RtE]ee]^dd^8<<86>>8cRQd88dQRc880UvEDvU11UvDEvU0tnmuumntHJPQIIQPJ'+jK1PX@c_[-L@$ccW[OY@! '% +!+  +2#".54>2654&#"7"&54632Rc88cRRc88cR^dd^]ee]6>>68<<8cRQd88dQRc8tnmuumntHJPQIIQPJd+0+!%!!dfm%,d+ 0+7#!!3!!GH+:m-9%/n1}?60+7#6GH+%/n' 0+2#".54>!5##7#Rc88cRRc88cA7mQ$s~8cRQd88dQRc8FnZ:B'," 0+2#".54>!5#7>54&#">32Rc88cRRc88c&%Sx96UJNX K 1*&,8cRQd88dQRc8,LFP&C4=KO9$.&'0- 0+2#".54>4&75!3>32#"&'326Rc88cRRc88c WI!123.08 LcHT^8cRQd88dQRc80=:hNBw; ")$"?=L'!  0+2#".54>535##3'7Rc88cRRc88cBBh8cRQd88dQRc8_DK_'2  0+2#".54>2654&#"735!>32#"&'Rc88cRRc88cVP]Z?"8 M.-01.'6 N d8cRQd88dQRc8PEID nF (%%'"! A;',8 2-& 0+2#".54>2654&#"46327.#"72#"&546Rc88cRRc88cQQ^[D,@A5&- LWAWj_[117,.598cRQd88dQRc8NDEEKF95tvnl$"#('#"%' 0+2#".54>35!!Rc88cRRc88c$[ 8cRQd88dQRc8cQH'+7C @ =81, 0+2#".54>"32654&'>54&2#"&546"&54632Rc88cRRc88cSQ^""'_YX[)"%TX.00..44.2873.778cRQd88dQRc8C9 4 /("3267#"&'32654&"&54632Rc88cRRc88cUQ^[D,@A5&. KWAWj_\106,-7:8cRQd88dQRc8NDEEKF95tvnl$"%&'#%"''.: @ 4/)( 0+2#".54>"32>54.#7%"&54632Rc88cRRc88c2$$22$$2Ab"=""##8cRQd88dQRc82XBBX22XBBX2FB2%=A\\AA\\A#>>0+#=R592>M0+33R86P>  0+!#3'3#P>><>x  0+!53#5#3xppHHn>>>i '*@'J[*KY#L('+!53.'4>323!5>54&#"/F.5>_+1 UL27+ (F CKPX@_L@rW[OY@   +"&'332673IFB%%%"CDG9!%%!9G22%/;cky[A,~ztlhd_K82*&" 0+#"&54632.#"32674632#"&'#5353'4&#"32632654&/.54632.#"#"&'%3##5#732#'##%3##5##'##73''2654&+4632#"&'3#3##%3#"&=33265'#5353732+%4&#"3262654&+32#'##7'373#'2654&+.! %&!*(!!''!!(RTj "! K88:&#'78D;q'p( "&&" (iVSSQT'9$$%%7%:&#'<0/<z'A)$%)" )$**$$))'~~K!!!!   o<99**[JJ :$))$%((p4?[[[;~~'$$'K !!t+<999]II[;K  :(  0+73#5!#3!(fPPPPWpl&&<b 0+533533N.NVmmmm XFLK>  @  0+3#%3#3+53265`lNE`lNPTP<5-.$^SK30 0+533533J4JP2jjjj$0+ # # ]\XYA* ("0+74>32#"&32654&#"32654&+A"=T1\o:7;CweltP~CPD:>US=?NVJ} 4Q5eQ5MQE]npvS;51ALMED>B@5'0+%'.546?>54&#"'>323267 oUTgGE=6/3*2? KhNQ[OC<5)?-3I HJGB7> "&.%BDM9;= !"$.,04J 0+!5##7'333373#'#CAb^|HLH}]aAp4(%0+732654&+532654&#"'>32#"&O H4?KJ>]^8E?41LKtQVj568=z_Xp1 .3C;7CG>35?0/HLaT4QP@]hPEXE&XT]3+KN0+# #(TR$tKQKPDz-0+!5#"&53326533#5Y.S^P5<9PPONF')WT;1>F;nІ20+#5#"&=3326=PI)N\P336F$WT0<91D"0+#5#"&'#"&53326533265MR*#%0'+,WT;1>F;1>F;Dzc&0+3#5#5#"&'#"&53326533265MNLR*#%0'+,WT;1>F;1>F;< 0+%#"&=#53>3232654&#"32#"&732654&#"EPH(#B1jZZhPE-6?@5,F.,C,VmgN69D91:12.*$0+%#"&54>7'.546;#"2654&#"xdc}2B###*B<*n-JFGJBEMMn~|p1L7 4!29J!A^YLLUULLYdc̰3+!0+#53267#"&546?>=?k`'7!$@>CK Qqkik?!/!nnH#-"/*.;C/KegPDN *n:dd3+#n :dd3+n:mdd3+#n:{dd3+20\~KK3+20~KK3+20s~KK3+<4#'#0+4>7.74>7.<&AY2((I7!oU'4X?#&AY2((I7!oU'4X?#Ov`%5 Uh}GG5%cyOOv`%5 Uh}GG5%cyP47'#0+'>54&'7'>54&'77&AY2((I7!oU'4X?#&AY2((I7!oU'4X?# Ov`%5 Uh}GG5%cyOOv`%5 Uh}GG5%cy<\0+4>7.<&BZ2,)J8"qW+4X@$UOmY%9 M^uGG9%^rPp0+'>54&'7p&BZ2,)J8"qW+4X@$HOmY%9 M^uGG9%^rP60+3#3P昘fjH&H<"0+3#53#<Hw$0+5326=46;#";#"&=4&#,?QY44..,,,,..44YQ?,)J2>pcNH':x22$0+#"+5326=467.=4&+532;,?QY44..,,,,..44YQ?,)2>ncNH':v2<#'#0+4>7.74>7.<&AY2((I7!oU'4X?#&AY2((I7!oU'4X?#SOnZ%5 NawGG5%]qOOnZ%5 NawGG5%]qP7'#0+'>54&'7'>54&'77&AY2((I7!oU'4X?#&AY2((I7!oU'4X?#JOnZ%5 NawGG5%]qOOnZ%5 NawGG5%]q#>0+#=RIM2M0+33RfLJP  0+!#3'3#P>><x  0+!53#5#3xppHH>>>20+32Ofj20+#3ONfjx0+3xKfjx0+33xKKK||<:#dd3+Fk((3+<b  0+"&54632.#"2654&'O 6"d\e[9 ^9`"i=b#O2X  0+"&54632'2654&#"EeXXedYY L2X  0+"&54632.#"2654&'E <%d\e[4 ^?e#h8\"SDe  0+73'733!f'hP{DPCE2J5j  0+!#5!533#%!R[tffv8iFLLm>H:E<:0+3!5!gNXPmHF#/ )$0+%#"&5467.54632'2654&#""32654&Fuy@60:tzz843BPPMTQOIWQZWTPZU_ke]@MM7[fcT>LM=;3??58>F@:KV&u 3+*&uK&u*&u"-K1PX@ Y"L@UYMY+3#@P59l@ri+3#xclQl7l@ri+#'ZQll!l@UYM+3#%3#|bkRh~Wl2xl@Jri+#'#7sVMMVslPP]l@Jri+#'373`sVMMVPP$7j )@&rW[O   +"&'332673GBB!#" CAK5''5K*Gi,@)Wc\P####+54632326=3#".#"*-%!  <*'!  /8 .: 2GH@UYM+!5!GD#3Z*@'UYM+53353#X`X^^^^z\@UYM+53]bb% 1@.cW[O     +"&54632'2654&#"2DD23CC3 !!@33>>33@6$""$%cb @rW[O""+332673#"&%G'//(GMQQMb ++ ?II&J O ;_<g C      6 k v  = xp >'  <S < Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved. Copyright (c) 2018 LLC Contrast Foundry (LLC CoFo). All rights reserved.CoFo SansCoFo SansRegularRegular1.001;COFO;CoFoSans-Regular1.001;COFO;CoFoSans-RegularCoFo SansCoFo SansVersion 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590Version 1.001;PS 1.002;hotconv 16.6.54;makeotf.lib2.5.65590CoFoSans-RegularCoFoSans-RegularCoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).CoFo Sans is a trademark of LLC Contrast Foundry (LLC CoFo).LLC Contrast Foundry (LLC CoFo)LLC Contrast Foundry (LLC CoFo)Designer: Maria Doreuli. Team: Irina Smirnova, Elizaveta RasskazovaDesigner: Maria Doreuli. Team: Irina Smirnova, Elizaveta Rasskazovahttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.comhttp://www.contrastfoundry.com  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni0000uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentuni018Funi01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01D3uni01D4uni01E2uni01E3uni01F1uni01F2uni01F3AEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni0259 acutecomb dotbelowcmbuni0394Sigmauni03BCuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0474uni0475uni0490uni0491uni0492uni0493uni049Auni049Buni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04BAuni04BBuni04D8uni04D9uni04E8uni04E9uni1E46uni1E47uni1E62uni1E63WgravewgraveWacutewacute Wdieresis wdieresisuni1EBCuni1EBDYgraveygraveuni2004uni2007uni2009uni200Auni200Buni2012uni2070uni2074uni2075uni2076uni2077uni2078uni2079uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089liraEurouni20B4uni20B8uni20BDuni2113uni2116 estimateduni2153uni2154 oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdownuni2196uni2197uni2198uni2199uni2206uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469uni24EAuni24FFuni2610uni2611uni2713uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi3008uni3009uni301Auni301BuniA7B6uniF6C3uniF6D4uniF8FFCRI.altuni00CD00A40301 uni0407.alti.TRKuni00ED006A0301 uni0457.alt uni041B.BUL uni0432.BUL uni0433.BUL uni0434.BUL uni0436.BUL uni0437.BUL uni0438.BUL uni0439.BUL uni043A.BUL uni043B.BUL uni043F.BUL uni0442.BUL uni0446.BUL uni0447.BUL uni0448.BUL uni0449.BUL uni044A.BUL uni044C.BUL uni0431.SRBexclamdown.capquestiondown.capguilsinglleft.capguilsinglright.capguillemotleft.capguillemotright.cap hyphen.cap endash.cap emdash.cap dblparenleft dblparenright parenleft.capparenright.capbracketleft.capbracketright.cap braceleft.capbraceright.capdblparenleft.capdblparenright.cap uni3008.cap uni3009.cap uni301A.cap uni301B.cap slash.cap backslash.capbar.cap brokenbar.capat.capcopyright.pnum_lnum zero.zerozero.tnum_lnumzero.tnum_lnum_zero one.tnum_lnum two.tnum_lnumthree.tnum_lnumfour.tnum_lnumfive.tnum_lnum six.tnum_lnumseven.tnum_lnumeight.tnum_lnumnine.tnum_lnum zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numr uni04100301 uni04150301 uni04180301 uni041E0301 uni04230301 uni042B0301 uni042D0301 uni042E0301 uni042F0301 uni04300301 uni04350301 uni04380301 uni043E0301 uni04430301 uni044B0301 uni044D0301 uni044E0301 uni044F0301 caron.alt acute.cap grave.caphungarumlaut.capcircumflex.cap caron.cap breve.cap tilde.cap macron.cap dieresis.cap dotaccent.capring.capCyrbreve jkklnoop%&)*45=>CDLMWXXYZ[[\ bTDFLTcyrl6latn BGR .SRB N    .AZE .CRT .DEU .MOL LNLD lROM tTRK       aaltncaltvcase|ccmpcrcydligfraclnumloclloclloclloclloclloclsinfss01supstnum  BJRZbjrz "*2:BJhpx>@D$<<$V  L  D v     V  2  n0  P# $$$$%%"%@%^%|%%%%%%V{|W}~ZptuqSTUVY]o^_`abcdefghijklmn\wxrsV #,>?@CL^_`chjkmpu{!"[\]^abpNOPQTyz, /v gedff  gedffSTUV!"STUV!"6",-MX-[M,LL*]^_`abcdefghijklmn (2<FPZdnx"" (2<FPZdnx &0:DNXblv  &0:DNXblv $.8BLV`jt $.8BLV`jt",6@JT^h",6@JT^h *4>HR\ *4>HR\(2<FP(2<FP&0:D&0:D$.8$.8",",  $4styy  6Lstyy styy "8Ndstyy styy styy $:Pf|styy styy styy styy &<Rh~styy styy styy styy styy (>Tjstyy styy styy styy styy styy  *@Vlstyy styy styy styy styy styy styy " ,BXnstyy styy styy styy styy styy styy styy $ .DZpstyy styy styy styy styy styy styy styy styy  T'{|v}~ptuqwxrs' #>?@C^_`chjkmpu{[\]^abNOPQTyz  F yst   yst   yst     F         st yy  $   70t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF| (!'A&l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~)t "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz= =|= =|= = |= =|== ==|=L =L|< <|< <|< < |< <|<< <<|<K <K|; ;|; ;|; ; |; ;|;; ;;|;J ;J|: :|: :|: :|: :|:: ::|:I :I|9 9|9 9|9 9|9 9|99 99|9H 9H|8 8|8 8|8 8|8 8|88 88|8G 8G|7 7|7 7|7t 7t|7 7|77 77|7F 7F|6 6|6 6|6s 6s|6 6|66 66|6E 6E|5 5|5 5|5y 5y|5 5 |55 55|5D 5D|o5 o5|oU oU|k& k&|kF kF|l "*2:BJRZbjrz "*2:BJRZbjrz "*2:BJRZbjrz "*2L@L~L@L~L @L ~L@L~L=@L=~LL@LL~K@K~K@K~K @K ~K@K~K<@K<~KK@KK~J@J~J@J~J @J ~J@J~J;@J;~JJ@JJ~I@I~I@I~I@I~I@I~I:@I:~II@II~H@H~H@H~H@H~H@H~H9@H9~HH@HH~G@G~G@G~G@G~G@G~G8@G8~GG@GG~F@F~F@F~Ft@Ft~F@F~F7@F7~FF@FF~E@E~E@E~Es@Es~E@E~E6@E6~EE@EE~D@D~D@D~Dy@Dy~D @D ~D5@D5~DD@DD~ >A{}*4>HR\fpzccccccccccccccccccy~,O,O\\pppppYpY+, yst      WY\,, pp   xDFLTcyrl"latn<BGR SRB (AZE (CRT (DEU (MOL (ROM (TRK (cpspkernv~     !#%')+-/13578:<>?BEHJLOQSUWijklmnopqrstuvwxyz{|}~X]  J"4Bhhn8V,N2`@z X^NN2N<n| ( Bn x   . . . 4 . . ^ h n x  . n B P  . .222 ^ l ~h    " @ . . .99;Y[Y   }<8I9;~ 9?Y|d||~ "9?| |~9|~ "9d}9|~ 9;|~ |9;[9;?|~ [| ";|~)(> 54?! =% #[w7F-(-  | (67-2  #9IYw| (9?BY ("22<2(2(- " #I  #Y99;9IY9[EKNOD(2(2YIM<PQSUW2YZ 4=GI2M<PQSUW2  =GHFGHJRTX)(> 54?!  (*,.02=AINR "q}|~q| q}|~|~ "mm?f|~~~~ "q}_fo| q}|~n^_`jo|m bf #^_`jo"  <"2? (2}~~p(~"-"22(9Y IY\bf^bf^`j9  9 q}t9}t9; "#%)379:;<=?IY[\cdegw!#%35678:<?LUWXklnqrstuyz|W\]^_fghoq{}w    <<2# n   o t   ~  (      2   = A2 y   #fbf!?$ aa @AGBCJJDEFJJGGHIKLMNO PQR]STUVWX]YYZQ[\^=_>` d@@@@@@BABBBBJJJJGJGGGGGGLLLLNPPPPPPSRSSSSVVVVYZZZZZZ`Q`@P@P@PARARARARG]G]BSBSBSBSBSCTCTCTCTJUJUJVJVJVJVJDWDWEXF]F]F]F]JYJYJYUJYGZGZGZBSH[H[H[I\I\I\I\K^K^K^LLLLLLM_N`NOOOGODWWDWWLBSOBSGZI\K^N`WZkk%lj&qq'()mqrqi*tlpkmtqqmqqqnq+jlr,-pqqpoqonnqu.~}xyyzzw~z4}}{{zzxx5~w67{{vy89nz:l;l~myp}ss<vnznzJYI\M_M_M_BSN`bbghghfdDqVWi01y2y3vv}}||/eeccc" ikqnrqnnquxzzzP[*F*;6DKSVUH:?>QJ=O45%8Lr  G r&rr   ABRMsI  r         rr &rrrrrr r               %%% r     &tt t'htt\t tt(ttttYtW.ttttt'tt' (]XtZtt tt.t0,muuT"1-uuu!uu"uu"#$"ju`uu#uu-u2""vu"gqfp!uvuu$uck'"d/tutututu)/)/tve'"   ++s@Nt^n_1o33vluu3a33#bi<CE97tt'(t.t0,"u"$u-u2;    "?DS1UWAY^DccJmmKstLwwNyyO{{PQip'))++--//113HJZ irt&STU\^agmns W[]beiloqx{{}}ideoromnDFLTlatn$ ` `դ'ח%חPKwL\WDlimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Regular.woffnu[wOFFBASEt>P/;FFTMĴ\GDEFtt$&GPOS0B|ě?GSUB E*,vOS/2$W``qcmapd cvt 4dfpgm X gasplglyf4zJ\D:3head66xhhea!$Hhmtx|u 0Tlocas̼maxp  name3@ֲpostL mAJprep}woAA%_<ח%חxc`d``>+X3ErS(8w(xc`a a X( d͟=b``>(0$xiR`< xڕmhUǿ:,6WjpS w-[ZiMs$hC4HF>TF"=^iQPo7ڃPj@*H\h>5oօs)~n>p:݋jKw1iVSzL$޵y e6&.-᧪¿YYfpTVWߪP ^Vy>0f}#O˼_x ^#j$UNiZ3q}8{~Պ~jkԪSj1ڭrZXZXsnU~QqTNBiX@KDg2NA(<vg`2&.ԝ /=@v1!EvLDr%ی*DkKkfaqJx2YflY(nM|UTUIWϚcY!V:Z1:I[گSu@O׳ ިw꽺ECv=<خ~?_/OH%KKKH[ $j82us@&ʹN~1(ef y_Zj6C5:iYAj~xia͉>tv]c7Ǻ$4:ڰ $*yJoW{3CCC\{v+ܥn;qɮ<n u~uNt;'cΗNSlq69O8˝r';1Nth0:t4 M t|}wAwO?N|ә9mؚتó?YQr9'Z C1L4#a\\¥&xer$jcq??Ha"1FCWs גdISids=9Lg7p#71e0[cs۹;{gESB) T"yv]vm}fZ|Aڅ, ᱊7xE%L^u`QTӶe,Ycߡh2GXm4sԋ8/~OqVg;,2*6S[z^b/Wxl:YVEX HAQ*$,,xڭVisV$NBuyij?B0`B,.JPZ)v}~͕ig7~Z}M I;Ôa|ϻ:zw JgVvt٢0:2Q0:o6! "!S(M{Us; ہM%ʨ"IIqV5f>oNbA FIF#+ "vpe=b ^;tiLp?$3r($$ ~_D~%zODw'k" o ts'#Xv(h+L1+bƔ?$/94;9u}7f2%k' ?>ex[GɞP/'2,Gɘ 3eXMzI٢멉S^eeX/B;OMflUԍ(3]~@!Mii5s:%.xEf4Tk7HrzLCoVI ֟U1Gfl&gg?d.b;H8yldK6V_A&D$M߄RR0%呱7MSj^wi M9)o`9Ә1\%gl]@|١E,gTeJr,RIyT2mX (Q!C% :TC*˯{]-#K>YJr>,G+*|dVsEC}"O㣸*29h82J^c@+96*DKI\!ã9WgǍ`N4zcO7d5d."ˈ/;:tEUZ/*UX*h"wzlbuELi..~[f B^WBzڋǢA9 }s+xYa=ͬdχ.lyR{(]/Jzq3^lG^}'KX̲JXh .m`D.Gh[q#GTNෝnPM~eYCjnh50|}"綢jK]E=f9(K*zfK+:vkb>vKMb|9- 1 s8_˘ŏO5 ]EW!Z5y |ʆyDq;R SǞ dZК-aaǜ_0a0Asgs_37a1A`9 :aeEGi>m}-t?ᰉn?AԈ?iԟF_j4bCE7GG|5b1z: xrT8rEvMfxcp"(b##c_Ɲ  ؜6J21hX[8ؙ8 l-6qV0i7&N i7y .U;#68tDldNq٨h``dqH)JLo%r`Pm`8. *8# Sl?Ɵ/Wo |G`)!*4 1[% [T(DjQ&jEDʃ@( A<ZYxU%k&aI%3$&Kv$RtFƤq@^Id ٦H^ o~<"/ɓp)l=pG)x^}8 _ Bp+늯=EBqSRJL\Un)wʤu**JT+Թj@-Sj\S'44MUi5Y-U۪j vQjIEL.$ ! EbHArܡTC-hA b[`qTGUuۺ=ݥG -qt%_Jуz^/[s ̀L0a6N R[i5 2ck$yqŸn<+ -uTsUEM͞mpӚtiAsԼl3O͏e-JYp{ ,\$>qKp/>}^'_/gd<0X⁓Y*H ڂΠ'Zp;x< H &yԑU$NzH"G9GF#s QB'$)CPU B[Dg_ xڼ} x[G̽fZ,˶I,y_dY^ey-Y}8I'M,5+mJ ekZ. t P}+̽W6;3̙3G[WCsi# "czA_Sn7;ى kl[E>@Ogwhҋ; bUOVз9*¥*16Wq?aiz0ZJfh9b5.`+fܖU7^UOxQ$FSS `yܜl{-jViAwOes/wЭ]iΌHku 󭷛#Y_~﫽?;^W?ur2T*eU>oj2U2Nan!m?lC9 x`{ C\Ta/eV#kf=q}@9*;vw89sdSW{Ktu~^&2>]SPm,ĵŸf_kM6&ȷ_j@R`?S!MfD);E2!Kz(9%r4.lcVk,:i 5)dOa񡒎ҁFnlhdkl=r++cI gso`y]h l55聴xÛ G0#s6@P zv_kBRY[/DPɵnG͍[SsM=2)>9h(u?Yz1z >y؍cHddAo ;Wɞ+[UdaC³{!J s8N<+*NyZ73d]Ab4sߖ&kہ`x;B顝PY4ad5ٍvFQs!5 ( "̵ pa)<M"~}3^cn.T(`ě&X|NDG9~p @(q$Eحc mꀇumzr`#'j 7C`)O:UP ΢Bx.S< cYd䝠b&hO{p+jNx]ju/Gܕٮ겪jStxf~fQAٗ %87sG>`* " dVШfI ȨT%=j`ZH%ȩECpRt*nzׇ¦h_m-). +% 7K0 ^y/‹Z7ݼybmiZ#eټ`s{#ǪGw V57U7/d-޶yMSW\^**5Q=Pk-YEE oÉR 3{ZC!va O2P=a"x &0-tjZPnS [[n_|o o_Ɲ^|)(0GHjXa-23bO`XN 좜"9nFHgfL n#|Vm=Zf׃%}1ϝXJde$ږfZZk^65R:w;='*+@2,MmnI|H1ѓRpYRưC'?]5rIsMG=ё2vM GnZAP"4V%ˬ hȸ x㏜}>rؑӟȽ rw&sT D E4*TTWձu">d?/ŇUď?OCᒳV3BL*;9YF|#.){#76dZ9(ё6\pA5bÎ{&-ՎZZ"-݁#/mt۰;tj_:ZY3~$riW^~hrøC|2Ol=ˎ1v Hp:F2-*g_n>1Á!.]w3Vrs`qrd3@p%]Ka8<,$@t3r hfƕ3c@#46Tӄ,V+h? P-o@ Nn ⹝Wax_jVEHCZH$5@K x2|pA9E8IX -I=<@dx|םyC\0;jeXyCZ- ]V2 0$N7&bexbdW^z(= GeYh+`VOtnNy#GFF }.\_3uZS5;cGhS?o<|E /6&9yj6IL2}*98I]rgt >ʝ޳OpO'sE=l%7j^EY5h&.)ر]sHbI^be ,uuxJ-+Ά֓ iƸ*ב ` ='?\ŜZP߸EYS";9vz:` ׃QBPPo臨éuw!p S { Bhdp$fXMX<՘ٙאBLxp:8%aӶC =s.H '⓭}'f= |zW[&4Mn9ݵ~cfĦHM,9%*8`jE+ha 3wA K&]-JWdmFq3Tmu(ӯ̒y{ /ONnPn##0.p'x'b:B):D?IceL?V_CSxyzSgf{vӏ tglSwJZ/$փīJ.*b![؄p_wW7sx'a1\(\8O"ZX($ f\$ik_RqQo7Bi%H*T=Raa@+0=ikO=\؅ƇWgn L\p^~-6ى: 2YcM7yQď8IН&PX7WoNQr4MяL~K@^v?9zD|17;>φvǹ{װ~ VgBarʐR TI,CTF Je!#'4fg>̝qwFdkV31Kcjf 3K<* -ehxg寯-ki::ϪƜURCi|hzzxfqIN^RVA,'ްu N̤)B 洔͌SͲjl:I4Q8lv^u3y\7 f[^.Y/dxa`o { ʔ IQY?(P@%df|"mzRwŴ~]s':tWZxstW--ߤ3_S–S`KXI.d6bfhUc Ism^nV&b7m+ =/k(ʣ9Xk`_d]|%.G+gbñm*LzىAa5sc'Ll#מ_qI9ZLwVa|F*j Gܭ#{c#hf\m F$VJ=&P @(P7-MdUlICMo=6"cr2}xR`#lTi?GHoaE3 qaaExwCꫫ!t?3M99 {bB  ™t UF^k5)jj|FzbfEDb- jUku$ΧsX`/W~*GC&8<ùpAGSPU,4̔VʥHM>3d䇔x. gf`6q7QG$ 7[fk X"gBnO"pxQYRNYxOg,OTI8tzkP\AJѝ+٬99EFlL9cc+mҭO[.K\7?2:;;:2$ Y`~"lO dFE)?Y/#vHKpJ uB@d-sAǩ wO 7to/ڼ^(> N"^S_ul:F|X ư?ܖ˯VLJ[zH:ǁzZV{3\glt:DmIR@LR.4Gc wyqv]i.>S7,| m\sW u TnuѴpCCc?62Y߯kk= Gv]k,:uP())t94x/3|R;-%m{h-" 䑙Ղqb`s%0p9z?Z/jE޷V5%$Z@"˪;>U59hmJ$zE!8_$tXZw?ӆ;Omza|=ealm''F豄1ZLjV29ȱGǮrƼb>B$0vRo'A5V۝^خ‡zß;rlǿ7l\_RQ?&43G<3gēiaX[30pCA>ү4Z 2N11Y&&Y/k/نݏa{m'MEmݲKI ]cޞVmK$t4߽mX_~yP-=N%7S H@բשP$  &$PUYX"^B,3.IEt0dθ梢&FSFƽf9Gh:`ov[6^l0h$32hhmDy?vFm?4/j1ahQM Xwc<(JN9MC#=wf+__KK;{N ~t^Jᛤ) no2SR0Uܻ"3#?FpZYdL zPE+iLqPr1I` Sl}yZ͎kn+T75U*==GеC Łp ^PUM mmmk̲EYѸ_e 6 fZ¡2Vv +qwȹyD ɅIq3wd/B7uz?<(Gz<Az֨t7/JRS#AQ}>94.,`UUygаg0ĥF72?jaU6_5ж,@S H%{ʈ:vɀ9=;0JA #ĪT5T7UUV~q 9_S Y'(GaOX}vyΝY{k |>5#㿋C㵵bgr"L"{=vlptcZ:kzq-w؉kOkˁO?y H ˭.sa{a z<h?25ՕټTuΓ

.ڢ/ E5)+٧dbKfNf2NPC~~POO?S-+ɧ& o 7Ѻdūu8 @lG7 p2H GmOՎ$,\<}d(n'X۪kU9n_VigIUm+._b2[WUrž:7|8Gp, L["qO`<=қ38 @Jڽ\%|Sa4 >Л,9%PbNP M"iڒ, Pn󕕕TTF㣡꺺zv?x`XG-*Ix (\#>D0] ڱoE!cEW+R\NJg BȬ|o! `C{\<HJy.$=sͺgL2'ss\WkD۾`p$&B$Cǩ+YYKjB#R2N*N |.'I&6v-lG'X$yEYU#$ߚ莲Hr kﶔ & 4migѵ);;SڧѧSY;eg*q㫟T@nP3(jAv cou [4d=qܐ*uj~^4%%>m!"c^3G[Fc1[JI& Td%@_ujv<}xzYT+10{."~P5O{1 }$3p =MYcTUGBq=%c3Z .-%r6T]|=yo٫Q J+_k}7k8p$ڨ)? ܳQJEti_+|9ڿ ??JWgav=C&4Cb5DA$Q#@$A+i5OD<(bى8"?z?h?@+ag"Bot~HchI}jwg);O+/p5u,W塇zGyf~P:oC-ɶ5A$0 0*(-,=w/TʹRu V\G]צPQVH^YQxsӂcϹSr- Ia(q OaÆJxڧygNφõ; ADYEt#I0mĥ_4k%מ_ SYf)d3{]rgb]$NFsmL}\.U j 7;[U**QZ<8ڳH^P .v9ɓ:= ξC[wWU#چhXuHP1۶p1z=nrnQ<;k5 iKҾ8~2rojxLmcQ N>#f^W F̔{Kt 걠4ຼjXs+0go9^d:o!:` h8y:SUS5Wj.k]2j=TjJm]v).0Ń癗GBm̖4D3aS|^9zxcL,SEA+ok1PqEfy^茏ֻpF_kAܾ&CXEcR_CVM*J=<G,PrS#ЬFQHP @=7a<"_6XheIqQA*ouN.k|# 8* X*8/:+QMTHwZpT_”@8K4n;쌭m'gCgy_a'qڔ%?~l3coY'P=r [4 v0D7z2ΔUpFSSRSo<+,M=J$S!)CYsQД-;5X4H,w,K/+2oV&cr˖^34lls;jEbB4>93ݬ7V3Z%Qmbp޶Q;7gbTgSP_Q ɵRdu/eTjj*!"ijI^A [D P}NKWe=,/:>dB7cEV5r#\ÝrLX+P+H1VI![Ar^yjUSyN]xZ-4(?/+!v$s4ٿ.<'e+˗2wc3g^ ο}K{qNqLrW&kYA/+>k=l/qA$FQuuVLT`4B)]A6lS1*AOSiѲqgUQNHm/U7XOLjBX0hNR.4f2 ("ͲcG8')Q)r 5}6 R8)| .M&OWH I,aR`R?=s9gΑ%4CciP%mfh{ BgJپ .)F_ՐпM3=F7ߒqEW$ ]b-ϨfMBǠ} r}ʺY-m]5>Ct!WQZ_<e>$D?$:T8^HqWRzu*(JH1-W9V{[0 ?PPtHjKRJmƌ&- GZ1rruUhS hmޱ},Β(ujh_0zG?oJt~Qd›ʸMFFhԂ/k,V|;>l,H6_T7Ĺg?>69ɇv.SfPJYY&R-ȟ!f548 E}5Kb9iKNp7&Zޑe|o`mM&׶,K.8ۓaBy7ddXJ )*19=n337$ 'bcZoJRHe҇Q|h/SlY7*(綬}; &676=mmEް}-5a 薰tnܽe3H|w֔SJQծyNUEs(秜ƭt0U$@2A(kR)͙˚ok ?2iS}x׋B3ͅMY 3"P5ySՂ(Xն/V"{(}X#NʹZZ90TF ZNNqe][](xKܥť.kqI+$$J uy>țmc9ͩ .KtUU~YWSSGՕz65ŻMl?Vŗ1f ?$^sJoϮ5ɹ\sYchim4h muRDH0saԂ&Rx5$55ń43T5U%%RIlZzϻ=._0Ssk3X=J7I  99sgl]#Kϊ")WJwu44D噶^T^Usչg*/{U^5g[ummd2h%A|,$@ FKHϒZt4q,nzv hޤKjAhWpS404t_ziÚD邔aᏯu]p*AraBó)rk*IJgRFQ/7"7΍)cgO 15AZާŜc=z9ڑCӾXN4) ̉Nhw?^VՕk }ᖀ7%e5Id~;ҢGb#J$9wڻyI>fO(ͦ?}=˲ ;;HURc[.MJܣ4 !c(ڤ=?ίF#+F,dLiI3ݟeg)= :uCOsn׼֬**ȶgZ2 :Y~ԥY'%=i:[F*3ݷffGݴ}^=(aC|ZJ zr5I64^SmyJxJ #yjO=7>+iL52$BJ?I+(ܒAm m 7hoMw2S:e{y:dHWtKyſ0@mK ZDޓe|gՈrV_2lߨF(u>NTHHlM)qV IjTeZu>kfLi~#V͜AyY$V YS#b,,laͪ憮~ަ^3߅_-ڑMWZOTmjrwP㣬,E:#l uE}D jjIMju;Hvs>NyG] zp?GLRSRrԣ)MKc\DZ g2\ҜLȠ *Tjx"\ h\c Ï+b N'n'zp<쯀Vyi)2+0_GoIn4÷XvSXdlب6otO%|[4X8y"qɭGMxB 4HH+K&4pg QF8u8I^5DR> $1KgG-n[#F 0}Ip-i7KZJ=~Tb>_V} ߹HV7OsćB.-HBuqW}$g7/in+$?wHU%}އ>{űGr G'35~D6<_ <W;FU~jߠ1.^%q.4f0PC؟B[uzN4Nt;$ɵIW>~C{񏄷#sng>:sQ\޵ڳ\ޞ|W|;Qjx=֨y -jzQXT:S̪X!tPH0 *"$m u\^ꇸ ؍ l}+?!˴ zQ@j.F4옚MQr]i5ڱ]+rc7)#p?ci8m{T=Jґ~5_%m7QQ.Ջ#7RMXhh471& !\asܑ7FǗkM*?hzRnĒьj^Cô]vڜ⍏Оwp/\wBpK[ţrˤ!!d)100B$p\Lk;hMR9& REJ!1!@/ˬ ar,c ;qj4WGW:/s1ǟYى=9JU˂!G69r jd>#56MQNSGlF o!ivn+﷮v -/9.|e\ʁ#r/sP-aY4۔zyG`ؕ;98X.g#'Ӣ>t ͺJZ4gzmj6nD nk3c M&c;Xw(m78r K_v $ăU3J|fRp3\e_["vZU9[u)OC#@˹9DRQxFxnmj`4r%הJo?N!Ќ2LPeIϡs$I:hHI,o%gHOyJvlyP`' &E-X.M Av`w!S|{{ON 88?Gտz+(hU5:)I/A&L.֯$#L[=@w]*BMzZ`۶nw'y]I:r XO}gRoz@ϨT3(~-`6J>TēLDIII6Vgwe$'f6R"I+3yo݄q/7CC;vŇ?~R|dۏ{8wJօ5p"USSï٤ȍZr ;t9-u?ుC{ȅEl~wt{6%g»Ma}$(5_ђW8_6 ؕ_ZPfnzmÄKF՚IDERGۻ*ԻKv:[.igcnӯ ['4jjPePKpKfH K̻hIh>݌ 5Lʔ+5/Wc_gpx>_ĉ*o)>h6k.󅛋w>`kt˹t9[ϐ+&8^=D,8UD͙gB^y"l%SPx*XmǟP~7-7{}x= Gz.P(Ed S._.Ygio]7nyÛ/"}S7u{_}LGNeqRٰњe)h9Q\di5VeY !Z48ZUZ[l7FM{csvN}Ljp޼Hd44T#i@~FK:"[M}@]Dd%gb1>nQ7iίH<9/gA0r-s3Or~ޝ*DN7<6x26;P%w }rϘWDI0+człt7G/ ܇okţ=%5Y'=fwGL$D|go}Kd?5kt;ov|R#-t̑dAG~A#yל%H9rg?' Z$>2]R; djODnlUQ0i9I7̘~h>-A{WxݙF"?<@/wOf XOs]塯zQ>.ډOIǔ_W 9WiB Ցg#s186VWqaL[h9/X5:::,~ cz_oasQG oaЦ ʼn?öm%IijW(Ii"shT֠A:18'--ΩD[}a-?uL\󟜥g{ ˬ~ɦO]>\9 [HM.?|إ-pȭ)Z/ˆ1_AE< Fs Ƒt*3AjPi])cve~KGG^XP$:O~tcn4H&ZKX AZLċ Uʨs `HlS*rBbLpBb̖'u}Az^E)KԗUcIaP}uN̬@Y \Y~qkL:s~}t_/E m=K/kC!cļ{ҡ[wH+ml*1utO;h YW-KH: "3ĒgTWPD@ߙވ g|n -.3DSѓ$D[Βtf/-^)HݤVi[{N F@70лTi9T-Qf[LYYpj\U UAb,ƿu`և_c1GOpiIIٻ^hާhlĿVR GT֒zjD. hL<=?'ʤP\!QaV+)!R-%\f@u/255%_ _Ȟ¯_v+Ӻ-vlE%Wnl )hևxq;\wwY;Uk N[\˚)mvU[ĉtW`gwP;-~: SHr:oKz$޶9@3!:="܁@(QlEl\yRF{ޏ,YmKŧk$義/(R֪aZaz%W^(+BoK/Z[_o ᓏx}hMErs ~ zQ#mkdX/,p8@smR Fpv F)κ}z3e;v] g_b+V\sHvI]֜kͲrm,ŜɮKU ZДKC tt hjS.ßE#r偎S-͒Kת ލV,ZZ|og~˵7+?N|U P hKWv6lnOqw17#Ů^FK%<Ǹǿ|L=5ge9\sEhx|ܸr~i/*bUe!&z+FddV>c:<$._"Npd;ؖsMs&RD񮻞 hDYt)70`lUskIdanvKcD\W# apf?Xo>c'՞Xؗ{"!oZmeLW^]𩲌EN2.Im1s"G[S~7oY'VxbD|H^@ MԖu㈀+Wװo8{ dL|7;l:~1|3v6\  ֜9 ~=%+NX_9. ;Y/g\XŔYo~_eܕ![mKqqbk@ Ϸ} oo\Ro } ,[ze};84<^!4ֈU$qd#MV  vʲx8EfmogT<{=a.~n(s`W-xIkm(Vx *Hc,Uj1M5҅B]!Z,ox [@aD/:<c2S._My)%oܕnC~<4<6TnR_ g=ȵ렓EH37 gvDhV^#3=Vӹ\5k\ECˌ)2(ZG@K#WxP:H1\1, xRT/R3To=mT(x_GtTƗΆ Z\R7'yi&3Kbӱ eޞ`:=jOs3MKbc3cSSc3hEl0 3o14<%UJ<)VeXV0@^~| ^!Ǒ7*:KcO#48_"5I  fZ}0= e2ܰ ͪBjh(RЗ톷LOm:5=tuD(Zx.~&9|Jaİ1B(Ġ\ N";He/ODDJ  ӂm_R_t^hi9siDFu!HZH dc&,l 1*U =C`  +/ՔU Vа-KQgN_ QqV2Q߾+S4bh\xr\Ui(*P?۶YVlxn ]ʤH Ɲ.Z̺`~dX&\ptZ*`), #˭hp$G6*@jk퓛g]>yYi[HU ;NUYŮA="݊8=@Po}F)I_Į$߀毣 j;y aAGuQ_H)E6#)<lֲjkPYj)Ԙ%?f 18U^g7ZK:{*˃v{sUK&CT0x|L\ݧ/+ЗU**++8eNWظY1wY־SV)(}_tp _ʛ^p:%ʤSt4Ƴ:w]i8=tt@IrۀQGIyug,N(}=ċ: .Zfbf.&q k@}c" hK =.xyZk|,Ne%F;6 S|nFeP" -" Dm, AYkwlJKU`niE'A?7oߟ~8/RH-zN\$|7P3ߔFfEؤ2,¤$voBmHR(Am %Pq!3CPX@I@-E[eS@&%Af]Ulf#>{#jfyLw&QFu5v%a|P}x~zI,*Zf.#E {ⅱV1*UIeYn7vngѡɞ±7$c=j:@_PE mRqԑ$|3 ,44jYAAj>G9ڵJ,>C41_p6L."waS-e .CmM]'u|\X(*k"昼8jHnݤw eE<*7k\A01dΡ Db%Z}hPM;fe5 ) &| |(Qjg8S/cӊ~ G2EhY ]r!$Sh@p tU*E1 z!S Y-dZ2%r!(gD_vݸc}TbRqfvv7L1ۣ=Jjiz9}e"J_ɼM8kk+ֶͭ wn֫VtoqyqQhOYqWO;|) 1 ?GoAL\U ?A8u|2:aeniv7Cb|J!C NĠh,84NX}sd`Zȯ~ŜC/^+PO1 )W3@lMU?4Ϲ!/Z;<h%}`ܷ恱[7O,Kx?)uh=+h~c Z3Wާ|r̍Ƽ|Hfz-D 2$s-GeDUp^'CgebHf?۩geԜ-(sȜ(ae4WC2[ ɌAs$湥nU$wuxj҉$,^"ϟ1o#{!~˲a/9)O7);p/,2y*,e_~pYC<WUSi킗y+w  yTlyGz'rB@ӘЎo/Y?Q1&2GX $w?'Gxa#a=b=ߋ3[&`>j;0me,ʼ(afk}oj|CCvp^arqwV cڒ)C6_ࣿ@Xں|"#c94NQ]/$4>N_Asb-Yi,(ordwA;x Sx9뽮nWVH̖M-Ǜm%6CijOZMeVWEĭr5Vcb&qwlkPp];^ fd#=XJ ,zF+Ė0F[g$E*[Wi$h 07k4cU`^&vwMQ>G@"A $Z0w~l刏t]w|ϰ4>w ]U7Ŏn ]GG 32e858V^uԋMuZZ@r^U(K6BU ix;c\h N':dT*K+Q@{FnQUÛU/5<{PwP}R7gop"NkyAl## @}e'ջi{eڈ#!2t)Em[jm <~+ehWkeHT|)x"Y}7m-$;-zsmP*AC @C6#P*DvKg4n pQfI{U\?3-JʚNW߆G6#f+^lVW4zc45[Ͷvl(aoQbB<5qBA0gTDJ{7"61` ]@T;?-&tj*u%/FF$sWK9̆Q 6jBu.1\b %Uj2D#mh556==72v/d +LɚnOCޭAo 鍨|kdvlNeE`z KI+A&'/&Xq@&UXUY#Mж/cHM9 ɩhzzܬ. s^ׯp|oʩug?ByB gck|6؉+ښ=.*HАgI wYF*1O 7 [ϱeb|l c~/Π'["yc^6>{ڬ#}d n44-?kyz-X+}RΞI$L: Df'~0%r:1o˚"8 +xʞ5C ,m/x?^aLڄa?Y#}OᏘfEEhO$i0)çahb—/ôȅ܁r(-~_;R\^DRa$ RH5Gb!Uj,`JCŞ[j t2 ِ0rL7惡A0XPhǗ7ݽûw֌&Z䩘]hrǽXQkbw5W ZyȀ%bs1kY۳lorЙ8ER1Pq;-PwHqQx_ l6YIuQޠf3{1KeѮa7[(,g x~ .C!p!no /{$:2x<w'8%؂vͨ`fG{cc&BTۑC(YX>SW"<ذAd>0!vp;1lGQKpRȅ_W iUPOAk,[%0UmvCIRi29&jԥêʲ2NV˵ZsiJm\1LH"P/(iDUm-ETEE*^l[vnڤJS>? Af 0D%7|}٘W>6kCꃪbK˪R\755VkuС~ 7&ә"y mJ%jF 充VQ~2B'?96+劢(CܫlT2TUUC>|ju$z2*UKZE),87՚Pr׉~28I9~ڀim_ujsk5blؽ )ZDkQ>?B6Gn?hmn&4nkS5u~g@Ϣœ^TJ"|p([Dك)SSjXKafx ];991%d~]z57_+7\-M(~Sc\)S]2? /; Kgx]W"!lն0v`9;]<07{s7jXjTQQ_v_X/K.qxWV+ CANp-[(+oa X / Ņ~|e!:{MXD%{Ρ2}ݝy>;:+E0ysZ1h!*~Ev³d♶GIʹeU8L_ЂǐTIsu{~#,vye3Bs1a⁕kAkKwBvPgh\"cQោwezgZ@}F6(JO:yqvA^*⽆v:&$yׁVR8pm#G'j(461.aegO?3p& T(>Hv 3RgǹrM-s Z7W֧w柼msۑ{YL-ٶhP(̻F^[wXi>f3G7MĖC AEBvʹvU_d`?utDz5&5J'cbs;?q-S#/ 1fRR!68s'6y|I&#J-cvla?_ ^ä |OYGbH镍ߓVQ@<n=r͍r:?<8768969eHII`jp8YoDZBh0A%Gŷ7ۮb_B%.6ki5 Gtp _ʛ~Nۖxai.+Eq$,<K(?KetF3$ oNԓ.o+`܎[IdOOҦQھ4 -Dn)'-4\yF$7M9r^+DNWn4z5͍fHZAN<^@[pˉy5"Z0Y _,NSiJ1 Es*Og '`zK)_̓qC;EQH4nKN&).c_%9Y%8 ȼe{ {]O˩BxZD ͧs2"x^@(1V#]]XzȳH*I)Sgq\@G2|DF>IǶCc8#Ď@y@yXZ@qq,*zԫPot!fCyL<"Z|ukIV/n%Ed+ αDoF&(: 0^?WKxH׹aΚ:T-,j^'Sȩ7+JMݢ,Q)Xe/B]>zӚc;eq`?Q!fh\q2NEeTRswbiIQ?JDa>:;})=|&kY\V1mԫpގ1RIРi`!=`V Kz K9띰ۍ>d*o5xڵTMoQ=QӍ&&VZv I%iCSn+ 0a>ҍ;Kοօ;zն.I#/3s~̝z +|6B? Naopdϡ ǃkf"{gQ\\“G+*la_ N~Fzhp+9C^7x~np ^Ne2\@CLE}$VF"(`耫f5$bm됛Z K\ks{J\Z8FnvN-qpP#$GA's`k.yvUI|`@. }]Zۨ2{@]u,*?#p`̣HIuNhII).9v15r{:꜖:b79bIL*PF0rFkG-ߍp,Ğ˱Hq,x B(lpM^\f~I2llL&m֝͋.x}e`ﹱefk,,r$MZ;nRYJdqm+۝&~;;s%eD`bC5TK XzjFjq4&DDiZViZVi Z֢iZ֣iڐ6iڔ6i ڒi+jYdCajE)F[6-mG#)AmNI)4:iMͤY3B]Mv9ͥy;A{^4ХtN%A'бt>]M16Jt<Et L?/t ]OOӓtRN>z\zh=GW^%2#Lӫ7M )Khr@ D*bi -aڗ. :1uGo/01a"&a2"VXb55&u.b#lM)6[[ZhEQİ5؎>O=v#6#LTtbcD7c',]ЅnFv?/>솹ݱ^B/胋ȠY,"^ sʨ`1X}8`Cq8Ghcq7#zޥCz> 8'dBTqY8\q.ER\qUZ\qnMV܆q]^܇CxQ<SxY,sx/E ^kxoM{xC| >g_K| w?G ~/w?wp r<븞x <'d^Wxe^Wxu^;1nzk zxm^x}ހ7xcބ7xsނfފ~6;V:#oo;q;'~SJ:Ny ONy3y̻pwl]ysy{9Ž>vygq8}%.s/a^~?A|0‡a|8GQ|4q|<'I|2§i|:gY|6y|>_E|1_—e|9_WU|5_u|=7M|3·m|;w]|7}|??C0?c8?OS4?2~E~_WU~_7M~w]~/Xg[ָhEc@*],)xo]RJBwSZb2 .iHW}}[_J|>=j锟OK?U& 0d5;jI醫5]% SNeNMʌ)@J4L5W}T t>7U씑de$z$Y=uVم ªonjfҕ)ia-WOINI o59/0S3yL>4,`;&όq,oA;KiV%I+TT0@CQCCCQKnURm\FZv`n\0_v=z*zzd,KKEImO1VU1`qEn9F ?UGTI~]Zj\mhXU4"EmZmQɗKJyGHT;`i!%usn-eKuC#N炧큹jѧјh\4UVKETYUTD/*!QE%_TE%_TE%_4VS5JK2!5j_X!}xZI%avEW|aAvo,y¼ub0sUb_a(ZE#QQ=%>x-E4$jڢhXt]D4*:ItNڐV>=#21Y,YD,"KEmIQű[Ö-dS>I(^GkU?v;UٜʕǫvoyϫPmK%F[u`: }Rou7|[zW|j@)+*2>7fh3T=i**o ᣆOVe>avÛ;6X mu cN}ǛPV=`~aj־Suʩ?u3>}3K^~4Tmx=E;'JҨH)GCIm+@+a ,j,ܜ^^$mr'Gyw>K7%eG_c=SfzB/YZFowbx{P9.b3ӎ5ƘX&ҙt2Nq:×%1> p}:T FiyRm͐VSpB 0I Ă  s)(o[V ָ(vme\#5,KV\<@k/A{mMߒ/Qv﹣ކvh Zrg!Z+7ope68ݼ= J䠒B[Z6p(4qhGk>i ;U4%d^uqB 7ҕt(dJNV%3>(*zh&hNpa.0\+p# YyX%XwiqzEk#V]*[ffLq`lql#WwI΀*uts 6Dk]'t;` ٟ9Y99{rrM(:M{9Ct^#tzzi/i>V:@ ivзQŕXG}Hu@6&L[R3mZCߡ]F!.ѳgzj e2)ijq\OZlFMSoi|[Dd2ZN+[TKI/le{j|_쿃2`Mt@h2LبV]>",W9Zi8|1 _Y엵>_SrjU#gv^׭L ʃrˣum/nԾUV+9fAC9Z`LJlϲv兗@ SU[-ѫ Չ #5/۰Ion&q?Y}Ҙ5$F~˚V{[kSTֻ#=b7c`B*uQ +>˙Q"py#ţ/Sf2yf]=wL=Wv G׽|C[>DlY+kyG=->ޱryI)8sdc6/Vs?i~%z 9z= ~z>k}o^v fN`#G#ݳf;u{0ݾ=G;ߙ#܄LDZV{sHݎ՛cޜ|=H8r~f\*Ojwv((BÖgnsû\JjK[G!C{9!xU#b2)r)~c~ :Cxf Etu 52,#3ʨ1Fh3:.cǍ1h aqŸj\2feyfYbV5fh6mfE S̚{ɭppppBs1;YitT3-.apppppp5.7YitD3^NappUUE\df5+y}h {/aΨn5aͼ5; W W2rL/k59V8V8I8IPPBMgVZ3h晭bo{ ˅˙95ߔL/i8!Ğ ||22yϚoJkC9j{;GxYA(nXh"AUvۏE?s޽{wI61Yv~>}Μ9wٓ/$UϦ߫1P ܘ#c܄iSAg\2~8sꅸ5~:?ש矇SՑ¸7R\3U!G}~bfe}K8/Gt;-;.)i%C?{TC_/WkZE 6OI 6C_)@[h+mhO(DݴRZh?ϙ|.".>\‡s)<#Ke_y$ãX>o|c4x<Óx2ic + o-º ~TIܷ+,ZTޛ~CuzowBVy׽;6qPfYnW?RTGZyR8R|wy ?2K}FfPgSDf]*vj3EW *"h:Piކ~/Ro12pHO:q'"!o=e#"2@5ދhR<  eA (VB W>ؤdnw"m!r 2q̜ՌB 1"DiUmz(҅DhHd]s?uݣp-WߥU^ Fƽê>%t iئA5kB6Si: \eMqEEh>h~" 3YfEH5T"sGG#C~b<:7ޟt?A]-'@}g ?u|*jUCmIՠfeh؅҂(-҂(-Hk }NDig3{ {=F#PQ&P j/#p k*Q'h9D4 9U uH/B%ݝ;0\s zB9!'r]!yTӯ8kqFlf~G~>~0iSrF2SV,%x@=!PPx4?VCM|xkQ >OrC)n*PV*4+#GAȔuHE4|Q>3LbGA;ъyJȾ"kh(3 n-f;yZ4Z 82c@3?}( @P 3p?m(dU.``:`D%{@|X<pd xv}'R*R"sߌV0(Ρw'@$Tx}ۭ? ck~-ޟ,``=y ȧ"`V3`3-@# >@Cɘޢ2gk&”E|NAZ arHy=YJ]-Mu?/~F))>0cJT+ :ʋ{躄.ClwkOiJ~^"\7pߌ:\JjVy[J2:\,sb`85j^QFKwߵјmP;hiWjЩHD*E;UJ'7jTxITHS 0Ulڎ$sppȺ\\-%}")ƕȈHj-ϵlJjE=s!Q{׃xC!U7}<֓%A 4'EU׋F>$mjeZ4>7"}b塔2EU)yKͿED=?xϏ |^omc<; %Qr#Jj%c T}&Qx< 6#EڊJbGo)-i&ey?Em6+gf}h(#Z tv$QrʁK5kBF= o9gj`X9U[,Eo!ӲѣRFI;*RXbWn?Mն>U"F~.c@hRm $W<&j9c̹!+JN;{VbDX眣kM=ۿCeX*tۆR 䫊Q9+ңj%c:M;ˬGJnKYxՏ۶U,҂jr&gG,CH{}ݽjמv mƺvO;1r4˥] U^`%М䨃wNqr0t{1SlgSCy~EP8ZU[_Mj.~*?г{-u{ sj)v")폽9%V,}Yi6{WmJ7+sprۚm֨/Y&B{[zP6űXU $NNV%Ϲ6K=-]a{~#y(9 {w؇>.؜ڼVole`;Z+9".k ם{ΡZ лg<`lGĻhc夝Cr,\X}ZVxv)F RsF#`g%`nZ"_ArjgXn@BvtONm!gmmCp)_˛Vm*HllqVu tȼv"5b명byv#9䀛 *KR X_Y$"iU6IүzۚVg/Bi {X'%μ|xޙjF<Ԝvߋ*ꦫk4Q]mo!2"wau[55VCrՉ{^*iS> 3kJnUÆ2$b]>wpJF)Igk 8Yɬ:Uzr\5-s"-l}Zʓ6⴯5G[~HQTuk?ʯ֜$uC*Lq0}Zc%)T{RCzpH2haw$9C فxrd"Ehcg(#|h1VlSݲ쌑uslvX1i7:H&}]l٧M&yaL ]hHWv&ɧo//)݃Os7❠e Nn˧؟c4L!/#]‶.Z2.ZN&]9+d}ш8Z*lMi{O :u1:>+MZo';Bg˿wEں\ F-{em>B\Wz\x;1:0{ؖŵ)#&՛eEv- ͙Bv i̔wuZکF_>i\É{s!5s~'99R}MuTwNNӎnTخs J,;حiLmEe/ɵ!zQZ(Tۆ T*vV}꒲YjGg3;hC]Q+ɫ–jV79c4HyڃX(.vH6wLku 7$e&fgD5ly6giCWmlڔ췡IM,~#cV,㢯5ڷYTLmVk:֌oP9Fpnra.Wt̑'rR!noEwwXlJk'"u,Im3ǚ1ZV;*sN.5RrzY8KqsL/Wc2KZ2gcّOUY?`5zJ\q{;VcGQ g}M8c+$ZۥiV'>>Vφ>[ZJO}8@%v2muON$ngFIks qiůUt8uTsADIÙ6)E{c-6OegNiW%J=bI]3(WI2/^\S{!=CRr?.{XW$*/߭zC51grSvEa=hZ! &%V;1jԞNkJM멵Y 86_)1U[Vz Ӟ$Ҋ9W R4WΓm؛V7KlAj6XZ9˶lH6l9q6D.tmۡ.;g$.m貧&Nn+m Qj8W'[k{YJ'Xk8K`װޫ}RqСDNAԐj_s2L;)A7QI69fey;zި\4ЧU TIa a :4k×镖nk38ٕ'OirZ9+ߚ i7un#MH}. bESr6woriZQnip?I+vj~{u[2.gpҼrK^gkځlZqݰmv9m,cç6)x1߻z ҕ/XPha%:TD~MqLwC\L: h O}.Mi҅4.t1g]0K2]:N;?!j?q`vrOwMӴHU-G  z g & _" *9ahfE @h ƃg#? O'LW s@} &p.Zł CM՗0A]W[h'Y  ~?*ͦQ4hv$| 5B7O2uGcr6b~F!:2&RZD$֬- "6O@[JKp][v,UN(:ϳ2o1jA|Gl/IIc $$+ᮣ${)W>sgK)@hoqbxPf#t?*[9N7fljr"-Jn@I7ʧSg@ s4w2i 0 av@CHpdx/Cd[χ$.L$~Nb@!7$YH~RHn!HRO '|6#w"tŶ]GR`WR{PP'PJP L^u8|KI,F G/7C[}m0y^)/C|*V92Z*a!aeL*H*H*ff@o_Rףub^MU9_eq <&rQ&'ZaC'}[rH:k!SeڛUB=WCrT #7R YB*&HIZ9AgTOYHe;eվ&_AWBx M(߇CܠmC+gTx=R2K#S+6/yp\ eCZƇ6|H3yq3 g.~ eLF_*-;_  y+-=w'DAw4#y$c (E{X>>89OKo7y:?ÿx?dz~ǛO|7y3W[o^q ?`q^eF1ø1.7njkic15yc7KqQ0V+o̔<&7Ē<6`d`a`҅U] դ'ח%חPKwL\y{ttElimit-login-attempts-reloaded/assets/css/fonts/CoFoSans-Regular.woff2nu[wOF2t P?FFTM|`^d  \4 6$0 3 [vȑlsauyq$%c[nO{I%{&&p}èCQ4h^{il`j>[`J3l۹b`D G&Y!k4,ފ{E+-SZd5eh+אgkaxMs\u&U Fѐz4/p]n 2us=Y?ϓB:^aEVLʹJL$gCD" 6"+<0ٵU|YnG"qQb6=R6],}lbpGe9BUT}ꦒ|u@&`ĪW[!"("M2D5=Alk x4OWHjt,& ii (e< h毪se˨ y@1CUMJg_խS8M$5E13ꛡ.?=~ӯ4ljKVXm*H+8*ƴ#UuT tzr$ BI8P~n΍ ,X%[ۚ6H AE0/T<2γ+PXP%p9,6qf?mm{/܇Q݂Ez85/Ua 0dM%hc>IG>>l X|h:3} Fg;7ѳ71\e 6 LJ!Cl/*i 8cr=0M'@w~ ?}KAl`YC%&ߊNW,j])9xE&RsP474I%(dA!abvܐHP֬5;9k ǽziZRy&Jimpq6fƒi)UmOLZRY' K hZ4Mtsrr+09Ln]ݔ֘ J>Ua $,@b=*K!Q!q!! tr/xxMn> "Ec $' ?Q=%M}-`+6 <̾_NIiq+Ifw>¦U!^/ߜ,,QFTDhvﮡ]ф&!Hl3mi86S[?-?xȻuTƚ$G3ɚZ:B:HzƦ/'IU\KLy㉵W ǩ,)aOt ,ސ Frd+n4gvPwX=Iu̓գ} ;!i.hH"ȡ2X Ӎ2ױ/H#M~WVn#(ZIq^so92<`bx#?U)h9$@ |2g.V.3*Mʀ4bx-L`s@Q%%DqK1Zàdsn5uMfgT:ȞAH(FƤNd95@= =p<n1:Y!p_h(GR .$EXP.beȄ:i2hExli$> Kx;?mԐ&qu*K㳽7Dcl A3IFrݨLTqI6|2bœfEʉ9DHŖh257]W\"AVAJ:oA=JJUCV9 U/r+Vjtk Jc0 LejPin?W7O{h񇲊EkHU[^Rk[>E?P ~JFn *OHZjX~S bagsD84 $̎<$}IX1! ETw=‘CPBSCŏ$˨;nkI*>StPֿ_[]ܲsCE0%]V0c'{GrpK,S'+Qx0`BBLR뷝>OeW8MIE␊:X^/Ni[}}!yPYm̫ mmz"f#`Jؼn1êY[3vVpTʊ`T7pn TFu_mUfw8`|]wW];frz_6,@AYfXEHJ4 =(OP-4gKOoa waZ !P:W⩓?MR&oZHT{иU:UVHi(6@9BL6?J1|?* ` X.0|2?VWvE _*iSM,_ۆGHE9[x/RwOLdr#f$`c^¢eeh:Yeg5'ìfr~u}iP7[^lFEѬβЄJ9TI3Vںhj~=kBtLq+xN g(ZQFs?gtZ9Z=$cWa.C~>]k;&mOoq(Cd;u> MGUf.ugň:}L)$N>rpk+۴2`V.A '>p<խ87"8ouTkޏ4](^[!,}[DyM[;>!-cY5n䫛u}pҊkx+&G p#S>“BcC֟l7{H19OTj'"8; 2a `z\ƗojOcP[2mSiGV{?+dHR/׉JfӦ++d`-H/=ʠ Cƀ%ח{MS?I+v\ H $)CF༐|::+,.aK-~m#~^xKa.jwzY`rcgoibRБ܏s@W..y'q/KF'&gsB>\@zC#=dDp &^8 QuᛮmĤ~RI HQ퇳2A]~2#F~.n77-CRzLr~oS/bەuLwB.au>8 {v]NP owHL"vxH %jx'"QRSaࡡqP_n=-7*`&. a_C»Ґx,NE G5 O<%QƩ>3NlkGػ;Җ#[7} \5rT2U1v'T2]b;) AqBl(5Q&(E8Aˤz&\t95*cFӄ2Pms?\% ˯xk.zW,3/k9x> y5 + 1a1^&Zn|&mn楱%OOM&*j ݹ'Q][NT2~Up &ԡ[pjYJP3Ϸu IJ+fմoрL_t Ȉ55z !WL$ [D[.jrN LdBr&ղ*%\NB!g,0lSFYD?>o*$\΁Z쀥Ǡ|۳T2}Ћ^?|Ɗf['&o_;;wYc܄z|ziǕ !!^>0)9}1x IHH!-#+'( BY={$K];83$QrS`&Qk@kJX54z8X~Ҙ=-䞸,1yέzWЊ#Qnj0\H$ %q) ོ>Q.aò- e-lڲ 6Dlo@b5;n$0c8ż %8U̯&0g4OlWl^d@dM{b];rZ6GO1=|&8X&|rt1aE#KCnmjݽdRzikSlcW*\I&!;9qnw57]n5nr! C{~"Xċ$2/ɽ73S#k};3 xKpJNE#at,`U'>|Nx&grD(ʌ$b\gy-gKk]!Peo_0=Q눣l+{W2n=& }9O1Vy+;1%L5C32̩CCΠEqעM* _mlEM B lXl$g8Y o\}FΟZVs Tqj5W2?G4l- 3)w`y \aʨvh`p͠2VyzW^zNz 6=!rZHtvMg^g{o~O>[ TRVFe iD6.Oc*m]Mnۻ=Cߔ 79vTۓ+kAabw[TN(SӺzZ;W]_#z/۰m~lׁ ?7ᗻ[_1@ OKቷ!nP s5(Uz qͨ`BFq̌[|,l>'!zrˢR,Wfu줻tq`|s߉u'1sɂ7KY*:"8]uMc=UGDcv~71>k-If=˰|>"fckX<ٚ-Aa"Dgab)NIJSs(S#9Ԧ1Mi~Ud"_*[%u.nL:VZW|qյL҆#c#B&Th F,25ވyX+]=^vp$q57!yE |S,}:>qE-e ÛSɢz,z}zOZGԍDfN[ttB̵a\z1'ԃYNZױ9mERϦzT gIl+Pԣ=fCY]TIq1<ξbMNԓ;PzSECZJ=i>1;<.LI>iÂ5!ږW%mxu-Ӡ6jv&tZsLśьY96 YtYX_2X7g5x~9XVjUW'A/^7˭b):-`b5lm$dB $lֽo'6Y-I<9)NEjҒ g$2y,,̭n̺շ ol㻦[TysZ܊ִ=HuO0"Kw xQkr[+`֬-+iW*^f5Fֵ57k|ܕeSϽ`ͻQ?F8N'AeA t:Dž KҖA Zݎa|%nA}Fc(WnZzt`V[–]--w0P,fʬ+ AtUR {cҡMA*ja=1kFd["le JM̿n$X$*?Dž$ޛQ0W}7xSw: Bx!>pCqZn>pl(ʕyZm"[͍@X`)sux؇+ Atm)a=1a& UjiZrt`Lz@.yjqٿ "D=)Th@, qGL>zm2Pˆpi5QMjVZզvuS]Vzէ~oّٟuTԥmJ TXrXaJɻGe.6nWul2xx[M]l0A>`S.b{!W: iX#akVQ**% ?<Jh1=Hxx-@ $~ )@UUK b|]i$; ^&kI~0092} E'L/wy{#?ZeÇMd>YL֐6K֓.O5(*K 1Pd5A|MJb 6/7ZY'z=7i*UOgz*kȢ ~/TV>4>r:H&Er$Gk uqZ$ *aky%_YL +zJRy׼|NT6PߺpWөdGТF\`$6 hsOzWx1qߝ{lsY7ս[z>j͋A>OM<y״AZ/uDHK^~F)4pl*`~OÛQT\Da{P͟}@rs((lP~$)hm\#@23Gq3%ƵYC -_EZ tQ**XUc\P%VR'Ayczj>)ĸ%-Ҍ2 q@UTنxnTsτ,Āzos E14 E% JRҒΑ64=mQc>}23qzũEc:roU 4 R ׬c>ZL1LK>YƄ`7KtOjN#ӷ]Q{S % )Uj/tR j{UV VN`rID:mL8Dl&PhO!y>#@*.c * Hw:8kyc_;e PeP*Fj&Z:Jfz憟@Kq8eEV[JVKcπ}$@&,GSVLιּװ{;r5s˂gje>īJuqKf\2(1xKI.6<&Y{+L7hTPұw*,ΠU)Rjqᮉc5̷_q Ci yi]N> -~F]lnOur*,-9O 2kH:]gPL+f^NTT >:lv /=i-Sh6P,OоQaRF{O5# #)4 Ys,^`hsLz2ɱj"ϸ-"=7WT/Dk7z*)/VzUtN~/Ne]^ [E^)]KzNfJuc{q 1kz=!頫 o3>s mgz 9x#o_󻙼/XFwQc|g{a<kDLRDI25YF$o(LE2RQkDb!و̻vqķ㩭=A4wBw=-B,eaq"HekWmӱ}FyaN7`ԀzҞ.[g2,CEcⲢ{Պ ǨH7sr_Lr`<4)Y.cHH8i= (wa)4"M'>ig+a Pv D۠`ʣ+$y^~=2(@tD[hz\i5$2#2GnG!;wr` l{QAKvp?hdϩqvVltO]f^U_PL\#Cg:) !b} 9\y>W+UmMZC~WykbiZ(-[L] FC>ݛl{(o>!<+yn}{njj<>H<ƨ8G^ͼXf=7fJtk6Xķg bD)Z l}t!XZm'Olk/(,֤9{dr"K4vķSP!h5՝#c*~)@lĀ@@pӨ:V9‰%qr|x_VmSXnnaDTT^4!3ٚUr}aMޯ]syq" ѣv]V^. ~bol0 ܧ)\~spsJMi UZ|ΝNem.+g#_p؞\,kR5?,IB,|Z2i]ofGꝞTcYL&BB&qz!70b:|\- T@Cm\!OUGt±k!:2!:5N,A;Us0Ę5)Pa&i `ݚۚDW*+#Roe\[Bh {FV9?e~տTU_>`{zhdQĿkԘa&ri 5%+Pg䬀7QQM}|eaj9?n&o'l %9C2G^&eBt@=+{@ E>!K[?\Q ךpi<BR[*tت!J8g@ $ O'qEڨp8w:d7 $,lV`jDgõ\C ܾɗBTE2dm1 o8VrJ~Hk=ޙ42 %_0\Bm޽#i2%UyתLn4rƢho) UٖRKBgÊEa2$K y c͝5d Y%bZ<}=<0XYw[iDP< :/ Z\1jD-^3eȜZ !.L/DYMβ1JW髡dTc\/4+p"Ud]E@dM-Dn* ő8>zDpC*&%۔HWz[=z2'Fkqx 4DĴm Q]!x/6ڟnV}/DUoI>zQRn!؄,ꔜ+|v+oYvۼUs K%a'9;}7ГuswA  Dis0C]/Q:!egFY$=Vs0 JAGff?tF tau/&#GZ1i>`.XLKx *=2)àClbƭnj~;Be~MQf:gy̆stoh^ER`+0/͏V@fj||KÖOQ؅ 'qҫ_]Mh:x>.7p7@u`s_3`Ǘ}Nq#F ڄGgs$b#v7^!;v6,w覗E>YnZVs֟.`ۙc)GAGT.3uS0DZ[O1i:kx$޻Ta+Crp!5@!I!lA}*VSSc~pi/`@jt9'ѐ\du׫[X?,:[CG`dp>M/wsՂVly"Pš6LL.2,2_dFIܷä;-|M%'`&3=zGAUXq O<Βq%kS톱M0_CSEC,IXhRDDѕU٢bH>jOEd(^Ntkܨ&BhL0KI3O#f,(^(I( [B81{1&R>\kGʍyUP NA6np-IP_dZ1(d) gXpdt nUA2N"$(؞e%Fzn3lT™Ibhv)?4UL܂VAhtgxGK:T?æ^̈Q^1 KكTd:D<, Be2&.Ebt$AAj4hg4ii*`M)JӮY=w FP,p|~cF/TF 飩 ̔Pzb9Z}d'}5w`2OQA Դ ˚QY$P33^.l䭨v{b>Ȉ=!H~E l(Th(BmdYM$:{؝N?-IbB~se?ZC[H"0%i~Ψ}e3(P0 vcGUbc=Jk T>э;j"kj1j$Pd+2#  j qwPޔ+ d7z5(|뺀s0[5 AE bPujJ6- r|X aTȈ0! ; W b浖?jm"ҭݬ6raw% uuՆQumXfQ&X-Gj $/ݝ[Wړf7䃁g3xqל25$ծ] vZwݶqi-##*mx܈v87 oAORH{ꮀWhov< Qx?3lwucnGa ­;aWI^Brz%ŏކMSejD=J Jv:Fs0HQij"qSAD찑d!% Act̏-*?ǼGY&hթ_LSsQl R_|ުjŀd1s1F P1n+wa`Nps_G|уKyL5isUtTѫ[%|vݦ0e. _PK U"+ ۫A%S+.!.@)'5 K8ocKc1GBgK|X9SR@[Ap6HM13UˏAusP@:/(v} gh7yC3>4BZZiGk@븙cM6"#Y&߄z'Mkfb%R85xSs$.v~tU Unc0A6{6.T 3.PLnPH"'ˠ^u}2 ()[z H#36Γ#|c:,0jmn7Q,YөuX)p #!kxrh =hQINyqx2V}h DS$̂GVNx$ q "΋${frVX&3n<.6`bPj X$Cn2f.}&whӵevI*ye!,rhDmͶ߃cecq +O_G~rÏtI}$w|hm-vdXm@kX,j@A ͘ GjRSޅ .TJNثr/e (b 8c=SD@5œVI72Anwؕ.} `ښߥnݾ`F]Ŵ3Ƃ^dq$vB~zv e 3Wwz+,"n^ڜ9e0-j+#Ir_ڤ%IZiXTqW,_q y<Ķ{~khő\sqNSE\t'f94*c*bȮx29|ٷ{?ujizU}ow]}/IF9_9ѣAce#K_ .|WKռ/M㧽5ϒi3@eBT_jr|4 ]XCjo5VE'6n_=y Έٶ<UU:"K z Sg>=={{7wf9'oxrv*FEB#K[\Ø7b+[[8U|@nr"4szrǂ3WX6.H W[/x|NfgSxlk6nh+){5ZKv?Y3z -.8ߕ4>mEv#_d:i4 JfTᇻ q1c#2ArB) X]/@K]#"^lpd v+=ReJ0E.B|mIV2: ق&;[qܣT= U h(6s/`>g$Ő#Fv&N$ZW^Iʚ]:@_a݀Z xc Y5v$bRiv<ǪO &V wVV ۝ -5P@^h<#==cT KgqqDb?TFAR<`8@dk DscF#F- +T; h2 m[.WMWds-^E9˳kw5ߘܳtz}ɡI+{ȕS og|b.Mz~󹞍=jIW#Bz ?cr! /$]sCcFI~aIh2ccv# 6O*S Su Id0NvHu9|lS)6D~듰<`?}\>hj,Aumaכ%ZgV[Tc^bD,W9&A_S1@L J%YW.TZ`kw[[2yK3nxk~^5زBٳHRRT*U*6jnY_=CC_׋0_]6 ǏYVd"q5@)DUoIcMej,5KKg9VTfR  |ϣr쩗r{a8YQ)9P,x@h{D!^/ݖ!g&Cdr.Br]b8Fj<,C2QfSHRQ=Tq]MrLG8M3IŎg߹*B KĐXeZK( (֔T:@WSTap9GU E^#6JKd&6UD PZ{[(F l8m+ Yw5 ҘTZZR$o5qi." &NQ/-oy%#.KA`heWhh{fɟg2ϳ8P^<{ r1xD }z1UAv=f? -GRcfA3qTm4#|{++\j n=#~;cAR_<~|KR>4Fe3"q_`~` WƢw'Q[3^yþ6R, @\zԱqk:?o@O~@_KR1"%ߵ=dcp(GʟH52VYRY.LO"⒖_YYhiE6US@T&j] ew0b(7 Y0 Q# ':JzNu9,͘X4^t˓'%O6CZLOAi! >bhYH뾜Ș3INq]$Xd̋IQsw{߆+a!k]}Zy#$e"1 Z&o\RM\`B-GhskH 2J."ec>G)аǎB>},J׉o+Kj3ʭ=\;ݓ­- vK,:j F8 ZU.XDkccBU4¤ ,^Wk|Zh%*Gɖ.nߵ_Հg:Řu싰4:wW_ ]XЈXDȘWm0D]t["&ˉ-yɔ0B!{_ Xl;2CZ>Zyf?Z+$Xsk_.k.Uz,:Z_Y-H/Wa1*ݺ갵MS+%oN&(01ԍfQ-%KU=~5)BN UXɡ.lF20}W'b" #SHQpF^eTx;8^ifdSr有a5`r%ʩ>=Ǒ5·ÌOtϋriQ /x2^|_lsyB->.8:&c;-~U;=K;J?:/^G5EƤM-otȉӧ'mևGN - ]#8xo[ߊ˗wo{[ʾC ^6$HC VX3/CfVWEo$D`ZyIh_x"Q:RzI\kDʲCCG\ آwcQc\?1ීs VQ8~4f'o#=ED緯څy3Շb-6|_6(&]V(L/o0\6]0AE;9vӴǧ~6,?[`EXi<@) eZ-̢C溦6>ZmZ3ʂ[氷}wܙ 8xbk)";QQBwHe B$g-^^xdgBpLR"R+_ŝ9pח#lՉp׿*#Xf5>ɏa?N8W.lL𺐄~n\oO>t1nGC}n/E{ ]NRSQ?}1Ơm;;*E?۲ :c8;*5{Gxetzh5bnNOʗF}^AA"PK$]3v+6DIr+1XQ1)gW$RցE 3]9̍2.>qDyuȹ>|r5 )").F*x7SĬ ,┞0 ܭW 1h-%?x|f]E,2蹅K~\ح4rE'X>T]o}[q~V WeJv]P':ZcŘQ-&D2\3h裢]UC(:;l{u!/?Z|TJR"Gł!gF*Uk,[|'pƻOR b>B\ CWg\|РWJj{xp*,Hr2U9!+gMLUjfP;,Z`S;LT%\X> CT` )ڔ&i4Xb1V(~(O(AÐ)^cA \A8L횒 JԱҘ"#nQΏܕSSq+ iT *;eSӃ:?0 ^\jpN> ~ x4WYSߋIF"B)i/P{ޱ(?fd;L)R)5+qgc#rz,cV!kYb$+ҿ,2Ll6%7Y¥72xR-V?I˒J^y/f0BJ7⇳=ˁg #:} Vg_%} ?[fyCIuuiVa>$fTjP]z:Zti_*> ەrSEg'99fn0vA@+(t_,7F{x!+P-sT i]_:`}Fׂ`<>AQ=U<=V~q1zLO9ķSS?&ZrejփξYh v5t8vP;"*+_h5^T_àF,gEæczDGծranf9+ Rvp7IdWerDb_]͹PLp[F;(6#`G vAޘϛ|I$J5]4;dH> UJŮlleQJR5$o#y+ë/0nJ`d33`?T ZXfL2T0џ53y-Zo}O,l"8U-eWg b8_ ]K4Q.jWlM& /"PfAācW2aYf 6!JW^$ Q\~Qz!_݄|**~;‘"hs`Tk(WQrבS?Szy`Yqct/Lf5ZFW1lbB+Xz_!su4j>8i^&3U̓?,SI, r 7/(ZDm( QIͅf5N[YF?Be94ğOzYUro/UV)n,V?T?/1ҷ^+^}u\1)}i6.!D`׋؆V}\}pmLtbfZԴvmlI':a0tNQ$$e%\KJD&DzyBi)di`0igehe dFub g9-IѬK7Z,I)g s<_JL]Olp$tMҝ]NgDISW%I^Suu2Ax{zlxa-.G,q z3Tr`kC]hI%mߞ&}G"="˪=+w b.:FI'Hqy2#cPU8cgjbhHi\¥Gybt>ASz]?z7q<5v2oawB{% PR)W>b"0?S𼈳tOiؔ@8\>sDsu9b~`ؑoin(ۇsurj׿~U۝FW:[s57̙&ZsAss֟1ӄ'~AMkI{j}}DbXA񉣻elY? azO6m 1T3σO;+ϛL;kG_zUYR5T^)w^tm0]QK>꼣]##E[1ƲYa째c߭>r)湊*YtBK1B|\PStA/Ka\xG^E%qgeჺH>4cǹk~F燞kvY 3POB p @FMu/6 :E{t;:\sq{{\h=T= j|yYoFR2RR>5P9huIZwI[ z!U=y]$mdl(CŃ]QFzp;ߣ JAA(Mkď 6uM:zZ ϐm,ud/eqa[߾P涡mh-E{px,+ 5{]&5(So\k ,@`<97AOEƈ#S;ƥzi5O|K8ٟ͢yB›-(Έul~RW9,^, ]bQ H ,5-Nř|<>I.\v쟧r]'/ά+-ձ$ڙ5j'vWjWlvvT]2ܴ3MP3ޮ)㫁 eChگ܋AhB|qE#@iQ:'ߤRz9^D b ʗ-5aX`:,OyB*ùיg6/MfUM::X! }O}576qd>sG)Yaˮ%E{rxϯ~×_7_rřÊ:7o>78kj.y:Ư^_DZU=#q+Xom7xY#Ϭ,{CnZ§eh_pXDxϊ\I; 7lu?>[#EsSaS _2ȉ H=sֽcΗ*PGoOx ~|j(Z\ y퉗X+TQ< Ђ]5-'ޓzL΅637dz"Ir'@K|Z>jtEV>?s}X>x͢,6}fN eӓRe1HOwdQ[r$\HQy2uƐF /$0kS>3H>Hi}Nx3Z;=kR)c'=LOgĝ?Uqs}VYĶOumȪzi9k-"KdwMIK- +޷|"6T>-n$L.~Sӓތi$>ˏ՟-=d;,h!UJhtpFWlvhWN;# N[#c4!x4/0I]X2 ef12$s4߷JK Z*:RLC"ZRЖs хxe,̽w=F%?up?gZI4dz,@M0aDD,db , atpҫ F0"nvY | '; | Έ+AK]~"# s غrq +g2 Pqb*6hl^k瓎]3;k,7k!5z:YeH7ŢigYVE䞚 j#I '}(NIxW7[ G2#(%ҁVq$,#F"q{ J[Xĭ ;v=]$$ #_syGS#Gʃ25wh>R?QRj0X6ɖ5=&/*?H+D @`mB|(o[zڢVqZwHKYfJ~si7Zkb~6 8E,.MmRE{"pg۾˳(ą(!Ҳ2p~%ZxCT\L+ d(E%͵͖*BҋzkUw75 4I?#utYTVl8:_2KsՕg@6 m?/q 8ݲ"dIZ .VX<8(/)W&]l*ER&Q<;#(ԀbZC'b[@6qL_Y9-̈́r$Pq֕g :4e+=\t goP[,Gd&t,xmi2)p@b$IO.`QŜ#ғP! q2Q<'7WFvIcVHOҫ$19sQPw5ެ{Il-;f3ri%Ӡdcfӡo9!Wہ"_ bp/3v5;ےs8LnÀS$~o\=R=?}I(=U|:/G޶yZxA)XGXVܪJ l Տ')E o:^`Ez6Mc[R^xC,(MNk*&od^C2Ubn/)ͽ ,nfc0H2GVR!)li5/>ůOn/e?,Ng5hxzkTMBNNz`CeU]mAK kq%jtb*nxwO vI{ fJs[|P"B+#lֲd5VאC&mlTЊ'7}遐BgU6YkPލuPzSbq:Gl)=:Lu&qeޮvTTD+Azsݹ [֏42q7=\<«تQR$qϴ šTBQ̖p }v(+ M@tI_J<7u]Q$~ RnXw N'")6E$٥> Bpg/B$h +yOR״:We̝5 dZmOPD݂$qTm 93F*3zkS16Ю,~%*$"9SQED-1pIĞ_Ly)pҟ:x9+5 l@nhHo̞a ަM3]aB 77K5v5r$y&:(z`| 6k=?:فʭӖy\\s" lCW!DfMrEʑHs )Qo - y%]T!lH{us<<0=91?kD}J34f p7>F§e3xBrl`n=ÕSSV_B#3>)r~9ôvaކ jY^$HJ0iR 1jxlW/r; ٬Wˁ(R}M:%0grNLK6 ɩ`%~2yLvFK TKK i%NՐ~rnsSH)MBB|ڈ Zgr\^&!tʌm  e^jDe;4(gEy*+~.!F ?bsmvmHrH\T\㼳ZLz_/Iuӷ޵}LSC&"tOv&&`M6QZֻL|4JJj  /(uC٤_PWd!v8SV3RW2YM 8a)*gsD"9$/)d)a ;z9p0͑Ints$xX_ٜVLz̵hǘ \GO7G{G;m7А雫Z@e"Ϗ#kOw 3R"~[yFWJ" =WI;6\Oa,6'"нFo}|[ڦI uqMH%:X(tyd;57S~]9b~U~{EOd;^'_QP%wY"OcOசSK#"yͦ7/}CfdUF.`QKJka)3$q;X$;fʼn+mm A) ,hP3X;*h-_Vsd0wg?ipխ4`k. g: G"4 oO{,s=]iT"ПڊKy.c@WuDY}.4-je"ώ~~!3136p&t }_ b?!N3@;yʁ'$-ZW r99ò$7^%~jKDڦ$7L5ܪ 6^< BDc+ 9Z+W VNWHLJV?@\=%?hWO5NЁQ&GԷHBJ6vbquHFMH,L@2V1&KUZkK[jsȨB2"(!05t x4ljՒSܑv'V9,IIeN\ur/ATɟ!ڛaI``0P4e 9v){7u  [ Vug}SN._=<"UVczFK{3N%{eχ]T+rS'vOR?ڛZ)!N4W#I/vͦ ,쫠OLS`Dc0̤! "Nr%1=SM렜]=WXD缲Uވ[c1l\n|<=nAM}緖_t~:Ք$4A$&4TdB沙-neQxf8y/13+n{FWFN`>&i/9`GVQ:gi5i&NkK(P/6x;$T)s?#S=\y쉍INIjUڍ8B1jv9Xj#i>7M׋1|ݍd@^Fػy$6Vcݮfw|'e2jj Uv&W`m_U/A:A.Fϫ>O7wLbMhM,.dQdǭÁ?xTi~7RՇ@,\hY_RͶZ`ufm-Y_Ǻ y- .*:w*RK5Y `4I~';7c$Tn'KvNLboc[A֧9UCއ.ygf:ϡmeLr܉涥Gr;lC%Yܣ6m"c`ih;b@l"MwX&jXNOQbQ6ͮAA6s/'pΗ\OG%ZsWurF9W,(S/$.xlZɉg5BTCyW>1ƪ_gjKuB㎀L 7\ʻ"Wh/C&ZGlN\%[ToYAW2l ˗zgwO>\<4Cʒp)HlI6#4G&]DqUOX,8ͳS]Fd8<Ư !NiUaxkF+]>*krnT4&keRe \OENILSynW$eao@l$`8GrVR"Dsнc<Qkے fvm :p=M;6uLrײ"۪6uIbhT#tfD{aBRI51ܼB|WvӶ00w}O?Z0 jU*J/&O9y5g^-(/BO;z B[ϐJGWs>y(|d3Fٴ?:$o:i`W93 C)0sk& y_h!D4!#lGae1Z|OL]]RVY! }KyEJ^9]Bʻ13-*(iLB'S#ժ m۽̵IJӿo2ZIC][2So<[bg=d@Gk܄#}&C<6b00Ap@RzS 0TI"pNrTiv.1򟚬: @tIY6i绰nkk9!;\dTY | S N0d&^kkhˑ0^r'$8JjsH0sO]-?~K6Iʑ.\$;lNeĐ"fJHA ZYd۴ɠH?sT :% Z괏)- xPLȆhظ-$|&5T!fpw?o/C٬HE,#!\+$BIܘseLYM=++N!{EwWkٴ;~}Kʹ,/v2/uf_60l{54TQô0j"΢u_+II$!=C7L)!c!+^4=Fl88tǬWɚWR Qr.duYū Z3+[dtQrR &{TVւg>`/SgT 2˦TZ#@-t>qL<+Nԗ4HRb Y$-%<;D1KBe3|g:B3huKF ZCNmWK.6D-o2`Amj@!kZCE@=5g &| #S$-9k p=Ll⿱y^a`W $UdR!f/ԓ5ا!؎LNO=?4OzbjZPQ%p:K3f]Kj ֊F:gKk)0ajTճr+ <.6U Z$P x||qP8 ɤxpy%u('5Lq*8$>*g/]A1+Vj[D) |f 9QT%iwz)<3zgEKydr-kMK7%\<0е[*׀OjLΡp,p7lUp̆ R\2:иOGS $$:3ᰇh$ $i055pYMͨ3rA$ +@4tG ^af';Sk } SRNr8"زq $hCf4r::dSa`J^Q&ݼ RVrS VH]=Ը ( 9(i8@bA 2V ʉ[G!djgi@,o3~vtڞr;PDvׇ9R p"@. hޗ[Oԝ-mk4Z 3z[%s$i(q^%iI%L620chmo ԠK Gi+٘fz=Jg*5a6e4ۊKGu_ECת'h׀-\pYZs;%Q%g8;X]vC@n*$by+ ZUB` 90"yEN0-UEJLJFXhUFh u&5t$EBKQ%VҖd 440oں ӴNX5l1#2V,5JG3AGl$ːL5gSneOR0Ɵ՘Pb; }je\tkK-neH4U"DZfúϸa;nLс*=cbźA^"JZ}6b8^4:Y8l"3O9:@IEMCKG`5l cbn_ 3ZS` Oe%/F: 7| 5fSw@PjjXI)jj|T:JyT@&6fXzX@$)N?zhX!H,q/|;{G'g ud=~?o(m‡Q;vR\T5P-.\mbN"SZh6mٞhm6:@>+YqE(Uܿ9GS*jԪSA&ZjӮCQz` 4 2J3,6 "D*+\WWT~7Ճ3ف8,Y~vF5br6ݦ&@ٵ!&K )A'!]f.X%%xWɲzMͰe V>wb/ΫFZ:(Zt  !0JQC|#ϦXh:˦&)= WN -9ԉgУ4w\]6XsW&\W2*j.* 1栆KJ8yWCUrm*ǿ 67䭌tKQ"δo[nNXǷ˱j.ГvXTҧJzlMȊ2.ҙZM:+_ɹPayb3Fw&|kLfIVaBRic9&q!6SaBRic9&q!6SaBRic9&q!6SFr$Z a"lTTZ@~}:24gufk;uu2pV=>tDtڸq R9ʸHVDPuI@ɪzE=yV"F3.qݻ'd9tsfS?qu?[t\#Jh3DPEu{Ϋ!FGGƅTXyŠjkO= s!ؾjnS% |QMb8?$wkou2!c`baI10f6FT_ƝG|}l0f5d0#?@=>?HAblx:4Wg{w_aXiߕ~`|m죟Xot21U~|Kj~6<^zmO} yxoم8=_X}./0i\^_tNtqy拍tmVsq{{}E^|ꊎvytl4tRNSS%GIDATx @Wh'^d05j Z5oV OQ=J Ac<μn ˷pfFQoaAc7FS%̠m69tAcy_}wx[F4-,n'qYˠM9|:Acys'"9'Z)p+|EAx2hA_PX"VPr3%q 4nZ+psM2} D&%GE%d῟bXND:B&¬X^ ҧ4, "fhX%p"%}Yd7S kF n'n׉8q k&mJn=q> mf`}0ouE}mAcͤ_" F`ωÄ䐾aFE)6ƚa(HmmEf޺Un@ ppʠfh9a$ 8o8@\AT / /~eX37MÛ2n7ml6(zøDՠ.xy74ִBe˛{&ڃ}]xM0,rYˠӷ/[iM2J x!ah[P:s5z/POAӏ*2Ʉ\&!Iي՘BJ? ,;[M44Z)w3E6!A1&dL|bXhݯ;cw@ 32^MX š{w2;AcM7z^dIf<u{^ݝ.W(Yi8+qgW yfX3Ψ8x];EI}WQVŹe2J5Ӹ3rQG('Ty+J7\; k&]B^KN\_[Xz"T/`iT[zXă k@bwbbCwb SBw4@PXP*@I k2!, i让]vOMY6t7$5A{h/ Z0qH-h4{ZJA>XWHK:TI5MDas&pe IDž;-vY|mӕ=:bPHDDjIT5&&D!mA- ղ'FuiiRciRu# S]Z jWuirTTZTƢ ݈EF~uȃfcRS{K[JKKKZK@VQcK)&ZRZR@ii)^Dv5~8U)j*jjT쳊ZZJ[Z[pKK}qkVKQQCyVVi?Z:iIU|85pjVjjjV*$Rwjkj[[SqԬYߚX'+봃A 0 9'/oxޙU,1ҬӣPamcsԔԔToNXSkԓ'!Gһ9{ ZMg.w جYS)));Hlw4iGJsl;RDw@~:`6%(R027 M-[şt쮪]{a{+ Ɣ3P[;J ˙3grA 4g=*a&Ucuo@뫽w$=6*=}oXH"OUߋt쪂dbw廒^pI,ck>-O -==joL[ US{1?bҡ 1(p1g! ڀ{#4QM4yE"8kEQib~aBZm9ðfv6ؼ؇>DBضEa9c0Mv4 !՚ϋNNނ!q[1ye*^?W~=َ Rh@'ohEM}+!Z:jZ\wiE=vd[ AұLYT)ݵ6.]wo#G.=hHBqm m Fϋ iٌTfӿt' h5$F=Ph袑z*@}r.*@d, $e4qcq@@r7-l@C-bz.gBl4e@g&tFJ=x2htq4_O4vF+A`Cqi!ڃK- -|&Ƞ=82evY:::ii6sONo^qNflR%͖3V\xC1AVqPW˓Ti Zly81hSڠ4XfLjM᧙н]=f- ;56Bϥ lc!zӬӄbB0h1Tc 7Q-x4 ,EۣZ-d 2y)Q Z즩xu3h/z5jgЂBNVYTl]mnqSlZԈEZ2h*Z Ug PںEA3h&ǽUEmZ 3hFMγ},/ͤ{30׎fC7d :$Bg999yyCMxȅZT۟ggSu'h=ڑfgjҰv݀BO<xVnTWV Nc%@Ps;fQzrOqƳ#"D䆚w0hF-(FΨe hs65Gy*_j4' AMо)GiMBk!h8 jGf !O݆&g6*#5Tq!wk̥];Ac_@ˎA[U_]KmTlȀ&Zy>zZuBm< >BVhI+$#BLΞ@h6k@SvTWW']iк hnP#͹C@;s@sEж#-G/ҴM,t֥+h i*LJژEҴM}G4uۘ$My4Ƥi|>2@5њׅ}hHݥT+ʅB4MǞVHS47H32h~[uݿOkC.&#-rTn~ deڀ :1I3l Qj Z^W2Tb:քCmȢCt>0E>,|6gqя:#%5M Fվ}%ڎvH^:`c|/&3xK W <m#5;kLJ}S)V?W?Z{V\f6{M@rh $uV i!l<-5]؂ bސCyATb^+Zi<}:c]qh@fbiFmydC:ͬ1kA-=rNѐsY?刔>-aִV3@glA* H`Z捧AL%ao9mƹ#OƳA={{{ݡi}x4{iF_ؼO`z9wٴo@崭Ay. -BZ&CZh~LɎ:-BZv@[s;)c.[Bkb$EH iҦ69iaZ)4iaZ4-yZ.Z `rgHSg&C%nsޖeUQ~0<OjGX4RP[άEG-M@8iSuyQ*=V[Ծ3X/t$ O1d7VSH3vhB!l Bj궝am譥0gf9W azTm;4$ "ҹOuip UnZƤvz G$#tISg֪f'- As54UJw,!T|d'%hZ cO5~+Av9 X 9Yj汜M t7O9c6l6j~5%}dЌJH5APQa^gl4]z&Ok%fTt通\ݟwjA Lq{X٦x7hvвwiS*bЂ\/A AԿa!-QS?x>r| ZQ۠YP\Zr@վu ZM8Ou!yջNA \3Ϳ-伃NƠ\Z>I:j3h|4 -ǯCKl`l>U\8ί@er5˘Ám kѧjg{i;%ͪ2i~ ZOT&-͏q':沍JۙǠf|4|ԏ mp M4^;hV-d5&if;iiA̠u?ͪ^'mAcM =e4-g9{^2Ơf;GhA dG Z8H>J7h9>WginZN-ʠɀnp0h9i6_v2h" 6ʋ0){mvWr6Ⱥ֕]ky[#4_'4@.+[mgA񃎨qm4 z,ё大U[MWf#ހ2h>R~*,kO?el1ge|luLm qK<k}k{u8/vmhP;zAR W?Ͱx/vk;#z#fi96"CiS{kBoHbt,׫.>ykQa{`Bջ|^2xX4="KNLB^'ĠyLLF `P豙A8wy2h~W_w˅|`4l:GVU9Voik8il*MKoruF3[͓ mP]3[@D9gWz2hAZr麡5ߋ3h luکGw2hsVٓhUOeд̒dYM]Nl 6i=vH/,w4m87"B?j=7u ZM]9JY;i ˙iuz@67g.Ҭlh@i;əfҬƏ虢@p ;4Eg\cO^}m:Oi9,z =k[ASo ;uv1hMjrt=&M344iEZA[3e@lZ_3h*5S>v[ZWl ڔ@ !i<oŠ7H伭ơ˯E4?QӶ~Eˠq5"g 67РY宲4_)qʡz-$A >Cݯh}mAs L iz&~ZfcWfcoǮL!a_'43Y_yO~!a֢4 ;&ے|fV}iόxFC<mI:-6;h_0i#kcAqs_97X~iΠO~-=hBJsў*}B@W&t0h垜x̥!-?vt m_4qz@ΠE4צգjqTO!i=M Qo/}?Sp@zrog~&HtBܹ^%hifR[Cfho ~ѐNs2ZۢăCbΩ4[N?AxL=8;P xȠ{?4y>SΑP-GF chUWl _/hmE{6 Ui4#fA@{̃8PhZm܇+W<89b|ЊU00h,7hx0Ұ+h*: Q=99`nFGWd A:F}CcSW&4:hCꭇhV@e,?hb"\i?L2&5FmF}Y8_N<ސ`4@1V5hͧ#lZf8>`po 7=NA)hASaCfeM:AskjpDT؃ӟOо"nsfg;mHݖӸt=cO&7"Ԃ450r4/iCs/Уi hMZN@Ӡ+y #(7x{'͠9/|.8AK JTNm~o4TW .7<@ap~aO1h>>Y'д{؀y~͙>.e"}[zC'І{ȝy|M:kyqo06l7yzquS rjڐ)Ͳz֭KڨV>oMi4A!;hw`[m$jðSЬn'd흭^~yç4VMDyR}l72h#>tmLgZ'Kuȩa/neДр-@᰾fdͦt6& A)ႏ6u7-۴,޾a4д=Uzà|-σAoBenڴAS:i9Z 4&oߴi;gӦ0hJ'--@3k7]+AҖ_g6mZ}ev,6]x3izz|zDϣsnʖin M5[_:6ݥ=t,o[G0o'62h-wiY Vgײe -ȁN3hζs[0&N hrD} bZ)[I0=!hO{;|ٖO93y,WD.g%I!u(uiw;7Мi=朠.ML?]8bI?dȠMKl ,gn5Mtj3/  iW.}"qyqܵF-[&_ݩD(4$jߥ]7 eDVn9#t0VpNV 瞷(ZHFQM9ku{# Q00{rt @UP)(" 9VB7,ז3V!g]oewG+صSԂܹsڈb]86h#Za$Λ=A4{A0#ځwnAH(5r%A*j85LN{31Uw=N K,DR2-6m\Apzu;ط#S;.jb*A0=v9RЬ^X`vw vX;"C#f9H8͡si h6]FӼo8zS;a𵐲;ŇX\ld4h4Nh괭ORm4=g_%pCv\򁢝](˧wxfzC\'dէY @rV^=g@ۉ\-7b>Zr :1h{(nޤPySr@._1/t2UMSg%Mt\l;s$?V֔@ʕq FÜTO4U^WFL^5xGx855+4IZoC ]e{69)u$M,[D7a}PSx/,A䐴&#R6 O<HK s\!Voi}Iә3f7@~IS &`Kƭ&5D"F[%#q@{XEWz?vT'=YxLr9 T%d(*)Yx*!W"=Tb{^EZnqѓ@h i Ĭ5S - ZX4[%a9 htHJUQuf9dryt;2Yܬl]1|YE%ݷ6h6 ޟ4m{>\}3grJړ3O@nV9`Z5Tv+*T Z`O w47*lU~r*(U3`' HF'd5bͭVa(5 j[pGLN2(!_ewA>Ѕ$L'Zʏ62,5h<\4\64Ee"3"C&VD23?G?"3"#` @?L,h tNv^ShS.<'g `H)AW:c1 Ij$32(0|HuiV #4 j*UdV+gٯR—?&hV 23cLI02UTHj:Zm'rƨfOmH}utK7ze o >ČYEV3&` Quޕ+2d(uo;;j~۽:s&[{UB̌kpJ2DAgH ,}"@[[ Z NySG6U13 ,-gr/G B./(!28B aQ%@ͮas5QsǬ\2Mcs5=";!cݯ"v`Bzv2p0FW&X$$d,ĸӤ{uf掙%[#3>.l62I@0 i5NUdS-[itgPr(h +#3ʬ{7dd)!A$+[N ybg8;?Y9(hO`g`l;e $UQ2 q~pŹM@}SH۶ +ZM]_F( B ;a)сw!2WBd"hD"8$Ptxf}XP~:4sNXq6Tqq^^6:Rڀ>PHq9HyjE:FHC s/jǿdDвKS.IRvm@+v[Y{ fHiMt x :]6N4ÈxNY=|`$]Њ = /YL %ﴂK+WD@E_ysڐ9n. VFжM8'=ȕgIr4pGgTϒ+q/4GyE#ٶ 4k@xdh@ hWz|CqqW(Ž\̠g$w\twՈ4 r<-ɵ1TkkkAO4sҮZ0A:+ & >0y'(DfFMXz$pr_#2P+H^(N'" # Wd0JVaA7x@:; fO~ʕ8(ˬr\$**=tEگaXd~EEIUjc)>.BFRBSTA1VԸr9G|]r(56?E@ JKHDaqQc)bD$@*`R] >J[JEDZEI-`)8B4i<$aQ'gm)**Bd @+BlR䩥h,IE`lZJЧSP1) :$P|!$As5W;ZZGV(jm"B;㢏E4~ 5V+"Ʉ!Z m#4As+ *7<}֬֏ҬVA^ !( [VbJRKB;p+ UJ[dH ᢬; t4W;=قZZZ1K–R`CݰPa?$xYp `a8w.0hCJYt~!aܵfQBVюBajև`X0K"'Ԋ5?lڊJ@?jdN#Asu6O _|+," wH"~c@)p,9ܟh!g<éکK ,ڵ'THv#Z@B f?=ToN_ɬ'~(?$ fae /9B4h>A-ϑrڇ#lN?) p3q Ԕ_TY ͇ɓʁQNJaݟzBjW@SE#V#59 @Cъ/ɔc%EC0A )E)g+UhtTpO܃Z@WZf )DJ ;$X;N+;Rv8R aܤb>pTdWI<&BpdZGLG 3hN׎Xۜ Ԕ>Z &cшtbь!䑊[ b;LRG؀p-:}n}]D0E_>`FM*BXcE4gp3[,c @#@~ʏp0p[gb%OTH" g0ܤ! S;C%`dp! })Mk!L|{f}v|RR)$%e/PZ޻p{b%,XK{΂4MAʹTԸ}l@Z>Y1|UԌf 0!bD[v{Ĥ#.<`A{LB1!u¢pA Z;ct,A.@v4%?rGO`Z @&0r6,H\:4 d`!XL`>达+DǼAJ/ o"F6<@=6itGm6lﭹRnvZWVO\8X;E>`E k}҇Dc__ۋ}X@aI@h‘߉AG v_@Ue 1Z@b24Q@ch'`J./ NTdMOD& QOsVt⢃A y>_:n7($#Ţ)P&'%SQrn }dDw>״X]8Mp$`ȹmA%qdp$ %KF-ǎ cx8pk Vr{-,RƏD$1ٲhٲe A('$$ϛGn³kHt䋊X[X_o9vPߗA .2I"p+rҲe AL!gDǠlnN«ĿfN:y!8y[h"0r#HnNcTo7K1bob ZA /m<79"Đ#|#TɊI)rs,"$YE#'MB f@~U-A`3)^e  J`RC Tir`?'`!6ᄤGQNfrb,|??p3-PL-A|hDd'L 27)C(pj@I\PiTb-Y$Eڟ/ǠtB̢/"~e4 K+H.?j;`ЂG_?8wC@`q$k츧Bm&ڼUE!!X6p[^h_DuAkDtZ$7GSG6T-RZލ.ֻOF낌2-k/ k HbbC#K/ K׹o@hLv=~.[{'A0hIENDB`PKwL\*`11?limit-login-attempts-reloaded/assets/css/images/anytime-min.pngnu[PNG  IHDRJ NtEXtSoftwareAdobe ImageReadyqe<PLTE*/@EIXz}7> '!(•@u5˚kskZlm٥蟫h |OKzt$/Cr {˓ o1'!I{;;;&LJڛy{;bUxW-JB$KBII|ޢ/`uqKe鸥›D7- oɹ9+zš6u&nhlu3Ay$8U\7sH$523ѧ _MFrg={`[{r4͠x`NKN&'dI?TjA D5Msiޚ|WK`d~E4`~k'v?/|_GeQF<`9S-&;.V-/xd0C$kQ?KG8fHLT (Vâ07T CIɘV 0CL{X*>DR`mHF9nz'$q1Y>יE>ǝeU`9hY>wLQpqY>b$mf,|9<˕"pa!ā8X[&FO7G;e5a, Qv _M3AsaKϦXMAֆOOT9 id 7E)R4d/{ oZ7Ų-T*i~+h|H,d@SODzS,*~r!`h I!+Low, 44v/cta#W/t)xeqUlBC;fkoty(|pKГu Zi4t+# 2y 8^zl+ nHCN[Cڛbo, |,vhOÄ*[|/O~gRjhl#t풊 &,,{,v<4ÿU04ōB\4r+F(]^4q=K5t亁Cߩ|O ^Cۛaå V7oSd&ǿDaA)<:X42n `$t61(h+fx9 3E% V264WddaVИoϗ;!=r6^Mً~%eaqNv^Nd`d =,11YCp?*DQʼnG63.QKRCYZة/EVCۇJ+` Lv,<*DK&kvpT Z*0!݉R. m&XxHL^kd1=bD9HC=cca [m$mrrtHcH}.:uiRV ͷm8tvrUCS0/8`c$g'Jy54;L peLnҀIN2khH)Z8d|Ȁ%f52F]`44 :ZafhW'ˤyD7V44 ::hjANY6 9 pA =؉R MR\C:p"(`n3(\?Z Wud|O[ 8W=ĉr<<},v OHzDƃ$"upY547gLe<4mjh[ 8ڂa(A%?s:j=5kha"c8'J547""f2(HÈ =//劚E= '/EM.&a  6 Jl%]Dꬣ蟬"e <O{p,I?ƉIB5p+iRpo 0FQYp(]d(ƒ[Icb$7)ymES"ctQ $NY^|')8TQ{'J)vۤ:a}cr8QJ!ZݎG)8ݠ`S (%pq+8Da0fߞ)8`I(`9:[AKbsb_5brh,C''JpI`{ N:C"~+M%F`NY8D"`\+6 Yr!ڱhrN;ىR KsT XeQ€8Q2P:s D{qWrޝ $`a[I=(D9 Y^w9Q*m_i%0b p`ҬzlE{w#PKV- p)@7t7UDwr/X+i!fu 2q:Q=q>;'du %tHq8u4cm 0bV`upneH'4-8O y-]?Sx'١ E-k%Æ1pIJY닓; 2'ƈ؄!\+Cy;׊fHn0k,b;b'[L(IA"*˃%$;)cNH| e:́XD7Z@ RpѓGfdv%;Jn{onCEN̛" 4D ֏_w(sZ LCkep=,mqp|P ]FIֹe` Khhy,fm# G1V!f_44elX! x``vZR&` k9-֎TZ=hX I/𮡋erRBpF;ihˀ]݃QRjpkeݭު6cTE Zj+jm(zH>vBTaI)hkU`_: E Fi]CFHͶ XX\, F!p m5Ԙ8v"#ڝ ܢb;ңih,xf2Sl2U1LAصB0Ԓ(wbd54eN (2Dj,^ͅ89j6`q .l}FJČ5Y'Y~ ɷÑK8S˥2n~QЈaK<ƭpQR٫{M( CИlK#[ҖQy56dCv~[a{}p!1R;@W]+0#Xfy"mZ٣>.wµ]<'?OY-FI  5ݫt[^b;a׋{O9QW\B+`FXȚl֐, ܒ,+y{ƖuVj~(9 #_o mָo҇ac(VWvmYF翞81q8ݑƉ\n ] wd07 mr=GU,]Xm쐻tp$D?K8_d H õC :P{>h{nOn+Ț&}ܺf@83Dv k$J@?^ 0uYC(z b[5!2·t * YEP!_N X}=zkUw\nA˗ӿҒ=/_nI_nY-\fz:/I zQ,ԝqAIeoRC_3E:q32( f2loy}櫪 nozR^۹7))=D\ ;;!o/*޲w#=zm׽hxe+p o^$^{SݛԙE/ԉ(Ux xO)s$*ZK_Kۢ$^&"=3iRGl܃-W[^(`(JV`+VU> ~5n)·hEE-CYCw*AR [=zĨNtp8Th/.X ys,{͛(w)b~oqE `ԿDǪͷs~?.''9fY9pwcιy&6.J_@ `mE~ެ9 }S?ewsfDiBpsglC6 XUZ7 $gV\ftoSBS5'ԩYw ]f2lܩ/)AԃNVƁU{.e=ow2b9g[S[_0-cZ"DsǙ)ǝ*7>D wi޼8\/ġRy,~J01fXtpkΧ҄_aaإyϛS/0%xgy1H@>3&X{?k@yy#\| 2˸5 8^2. =O` y%?ṮŗB>B.VP;pE:KT4K3T U/_S5?~~!,epXUBo"܏LQǜH>TUGWWO9Z"U)[RRDbߪP^JUz'YIxZ"|u5x}>hQ/HHDD=7A^A=WbQ8Nr))/R',qOLFsm7ȦM@.R`4DTRr,*b[l'\,^;i4Hz5BIe4|v4A&݆t 5S4 ^=:=J -*c~A7P7Pⱱ)l V m9е_sEE D/|Y|qJpy# F|^:ai)׆4Kߛ=?"ƇN0F1(˿r:#a"1ExJΡc@ 1bb@#1ܯچJoC\|;)=Pb&W'r}K /ϖҘm(HKch ¥c|* 2|1TF573_"9k.sqFEE\xTW@6\U@YXd;!]C[ܐ%XCv6x{r#+r $+ss3@\H'݅(zB]P^ToV|Z`wܴ4xAab.$p" "H!Vp2'0#JmӺ ݕەؕ .`ٕ%ҺP6KE4xyz$,kBm'(?ɉi&8EWH;.Ļ8LϻĮ.x7mc1s`rx6}@|c<8#qƙHL<3fI.gv":s&3Pw=&XJYlg"<qHq= *$b7L!Hf0pxKȀ\\&. 0GDȈȸtOg ,ㅌ32!ʽw!=E2oLZHeD :#::q/JFr('KG`*oĴ8<,3 L%ǏGX:8އb R=o?bѨ4dfpR`*6;Ps{@zzxo= }+WWV{!@n/j?+0,G>_}׫WC.~U}ŗ˪]S ]~ٲe:(ֿD Q(^ w C6Z/O(RE'N\z/XQ}i ^V_L1`CEEE_Zd}ђ닊Xի,9PJuW~U^r6fw?|+K.Irt+@[icl;?ٯ~ٳ d?|.ү. ^]rk?@_b!@P*]l( їL;`׀+DG_ ݇k}8k:Kvc4DQ(_wm R̝&c/[\;8u@̇;8r!nq7B"orݱ+Wkݕ+W+3_A+3~+W]r!l s[|r̺o?2?f>6UxAENhǾ?3y̳_r2!3FəɷCwl [@2g&'C^gq/|V'D3r09("V3ivٹs'z$ />N!ƬqƯW~.?+xCӝ\5M\VT~+z+'?اx 3a0L`& 0 3a0L`& 0 3a0L`& 0 ̄f0L`& 0 ̄f0L`& 0 ̄f0L`& 0 ̄f3L`& 0 ̄f3L`&/; IENDB`PKwL\999>limit-login-attempts-reloaded/assets/css/images/backup-min.pngnu[PNG  IHDRJ NtEXtSoftwareAdobe ImageReadyqe<PLTE*/@q|tz~vpr}s7YiyoݟiogeݖqqW؆y@csjcrtLq{qvwW6m%tRNSS%54IDATx `TUﳒ}OR} ib !1v !dcg!;$jBI4BAൃ*JTFPqmp[{^l{:Mo}V%lUun=w[s:ĥi9‹8`.‹8`‹8`.9`.‹8`.9`.‹8`.怹8`.‹8`.‹8`.‹8`.‹8`.‹8`q5~Xhy=~_w/o߲ݧ~uߝwߝoGz뭷vt;wR7Wsj["kvkXxk?V5;/Br+X_{;}B40$K}|׿c$ќ_2V3ӯm !jXm 1x%p#.?X#@dl<`eYXM|{ iӀqQ܃$HxϚ =k~GfϞ5{=,\s4):ݳk{  i4@ KitFZC_}׮_ /VV/bkRtR`zX إKFK' ^Y8`6s,zs4~m| ޟ۪9`şs(so?BJ$o9`q=x@v1 +|& x?䀕\L'lhAJ[l)8 H2?^?x>9x})~}=[)bp|}߾rw}nY~A~߻D-htzx߻B^,8d]h-B-K6VD w -ˢ[{-lw=a0+@{]Vw{w;K 7E+ }UoU{o߻w7 ܋iHR͖ܶo_ }~ NOO=VZ:Qh+_[\8M2捞X[;HؗHq,$V9VA rL@xv^+{M:"Gu-q8&(gM ^BI.8WWLMqB8|9.n(` *S\W79~JTR$w]76"&J]\]#]]&ڛ tEcc`lB/r l`bӝWR T'jcWN󧓊ū?p%wu 8e!x86f Yp+8P&*9xkq81FH(!) 3P溑% v%-\_spC\JrGoذ!*j@ sh߉nl{T;+оv!QaCr5qt6')TxGǍ;f0q'Tu#آ V,%G 7brj\ni3STD|]a R-,$qRɹT4,k??*DUU0WǬU~0Rm\yLuR*S9OlD7GEC&5f7T4$Om>uK18hWtNA|ž.Gr+h 9јfH:!τo ;q?&~vB"&h)'!!:rIFׄDU X'nulgvv||b|bvu%f'f[|||vb DD%&d)L Pp(jԠhas_OWWO7}||BKO|6 ԕ ouVO_p] IVw`8BƽU@ ^>l~>Z珪MJg7)NQ%#\lVPiAnDk{+J` 8 |w#/Ռ |tRRYLJѦZcQԁl<yHU8ͼ[:Z0rw߯_ojlFvGvD2o (Žwa`@KڜIئ__s^s[}ORpo #})oW*=/ /$rs3n$/3R8A|3_Q|̈́m[y ) o7/MeeU~E|̈́˭?ˌ[F/×-F/={An7_;9Ά [ j1 ^AT90tݚ/p L'Yߔۘ\Xؘ[XT  5^( jl.l\ .͹W :R#bqGcEnHaHHcHH\Hnl  ),l$cHJL+/p1H:[4vW RL20Sree!T^QVpp)+;\ ,>ru?$=]<|2"eUnj Y2e|ffFA"eif'~'ՋƖ򬟸״̟]MfXfZd0q~ef|Г@xI逓Dan K Y)HwR3 XY箞N( S zII:vE"0 ,yvѹ$"$b;#_QpF U90Iyx?.,)> `Pl P tZ1I \ N:۪/===='a;y(؜;D1= oR`mc[62<3ߞ}Ygm ܺՓe³h+}+³W\B3B'uY[q &gyyoX)x+W\'^3Y𰿷yo0uudE˰ 8I}XWUQ[3A=|áC!PoI,6}k0hQ b>`v#kg3']뀵fV&]뀵 u'di+K$4ۑ,krOW9k8VkxA "倵  XI4X`0Ā]-Z0oNkJ&ͦ_tqy'֖hpcQ"oMvHS18V;ln%bؾ+>'z9`q֮{^iH1m".ENNmz=4Nw8Z|L`tuƔZCÆ5 1WN*E1֕)zGgyL?t?'QX<$ s LHe&W>(\12bg)u^B׹(/vL|`G6fOBLg%5 vfѢD\֞&uOruKv+cj{V:qIZ&T'~HgkCZ!`]{5'v>fHu+e}JF;[I`"MlkSz@QVڵ+`- عؖEQLWTNW\oZY(VI.4+;?d OzMUب4" SU[:j\{0ӈJ[Io_:U< >iҼϹԮfkիpthTUFf^f\14R]\y:qЉ| pthk .1>r\6tqW1 ]S6ZYw:KQ`Vk:G skSӚX jQ"i;+$:T'eVa4WOۗ5}Z ]MҶ' j³<蔺-5R̋|gϋprXjIZufٻ;<=KGOҵb Y^9~c4s֎z1 #`IÆ6Mm-@Q[Y2Nv4i|x%s^,JkIv]O0XsqF+'qzד.\;9[0C?h5\muqZۥi.֭i#_1OaL|ߴ֊bY9'y$M֪uhn-ě!?Je|WvL*NıuF+م)V _՞Vz僖KuMcZ\ɖq``Ѓ+AwF'Ye hHӭ3/~h!4sh V${ ;k_Ύxb%sz皿d1Ja.K NR`#lz'My>~C .9)S'YxViM)iRuV=>2tL[2RV.-ncK%;ۨ)%cQgEY:~Ɏ-.y6)_nP.uLja8=b-fӶ9;ǘ0jS"RSz6FJy={gg&t³̨M. Yi[{:I/wW#ۦ!S%Sa xRz@!^;-x!y"Oy?S.y YJ;(4cEՀO8)Fa+RCY*\yͫ9Da%:KN|lp^Жe𕴯R{e%R#~EIҊL PYӒ"'x{% +%zLL$XDLK= h;&kRo12c6/Ï D.V{td5ftz'xr3K]?0|z6SI2b#q)fU8F2Ɍ; *)0±RK65,iI4fvuy'ydTFT8I' k[_5N?*S9W$o1[| v8j>5H8fmgHN80;I;WfInu^7\Mـ들~4 .jU+[12C kU*i Y9JS({֭"*0Wr0ʹ' 1f\yepC˱+=KMXŠ}W|W:`X•V܍+NN\*v4akY7X < h5Fk8`+;l4:P. aGpXg])`|j,t!\OWniX~EY| L}ZlYm] ?^(MU _!-?Ġ`F<Тj\] XAjlJ7?+RZ*`%U`"Vc`W't4ؔ^<1lWOU`~%S8F Ȣޡ 6m7L7XaPԖU?+gUm2~^OF{bժ7VͿ{e:^\nz(&`0Q:F~,4\U tlb,Y;Hp\o||"o>&[⊀gE{mix0:4֪ WqEEq"3|7/Zt~= #CSge*it_ #Eqw ) [3/OM?^ฦ1Vw> @cM r 4!΂LMMqEZ>5-ۆ_Q6*| 45LX@nȍ7x\+"o’&,Z\nq¯# :gL <ބ)|hr4#MqMT<66FMt$n/+ԘpT)F,ɕcY6&ldte؅`kkp bvySP4_UE@J61sMb\k",UwrlD#ɍ@6 2a `<.Gq_耮X MlYtMRpB @ ]jROʌ1ڸ'@9tY(p(06epѶ-3?/J l k?HJfRw``3Q见f=CoP;7#E ec|OR*|xD39*z~5Hn(Jz#x׷%i߈l > g6 !B1g(i?F,޼wGyxlh߹¶#jg(T%վ3pC;;c(0H)p23vTi!4| =0Aolo nDЀЩƝ; p ȐhOOLOHHlMdX=m։؈W) Aau; A}0 ,1bS,xC RޟTlDuxƀlI"h#+Ǽ;Obmx.fG.Be#l.B}0ߕe;Q<?<| Nk/VĎJO<>`ڧ ..w_E;#'t[~v i/#ڼz ׅ]HaX5vX%!ׅ9pg%zck? {>+I3 @ԝn.\^];a`?՚!ihi [[#X ^'жOj= ޔY _z [zAhw"[)>"zdK,; 9~wV:giV"_'4 !TĜw -:Y}BD1~]٥lY|ܡ1rwJ8jR3drw$tȎHHǘWvhlplP^r[I{oKK$0 û`D;27f-x@X3k@̑$)_2v C.aAP?aA1|MM Ē&//h׷#@!l0 xt;Z8"MUj+t#%_ "O"o2aɓt 2$/@cN2TrKL9/dyx!bhaqbΝ:w'i?N^4Ԑ^)z&8Br3CC2Mn^n^αb43#~7"%X1tC #lnndbFd{?:B^بVRZ_tC0nHQ%,i!4n,e?h㇤+EQ MFs`IJnSR7/KK0CE751VR2Zo_eLDIqfXYYe5ieD7KMZ zpʰ £딽FZj _4X]{jz2z\  Lҙf[Ys8 `2,@Հe50.JFltIsM{2zҀnMOXfZOAC"-&3;h`,`L i?BjОSH1"!ˉz_"PԄt@[q@=-a cH;B2gn= 00*C/U:_BADXIDp]xcupu. 驈]%/ET'C(X`Q vuo~)xB G [7T:ڨo,+e(btGtt .AQ vJh$MHG01b6 mc 1/^/pIZ[/7-`ә/K<!T`OTBl%%h( f*Ww7{vCR݈i`OLCjf/[7P]cIS4KuK; UW{K[%lZ/{"C!c !ӳB#/ b8!s0(;o2h߳lMxw g7"g!V117@J,<4wd')|wߟۿ/ڣm5trBZXLiϭ}L}Y̹CX }HPg;b;t(@Ϭp?gwoퟍG#d,~g۱'elڏHzҖT8VYHQy$5K8b&^}}t\l ]n+ 𧟸G}xII"?d|w>OV M@xVopoYo M3`Z"t[Bf8 ³ Eހ5< h`:<|'P#$z%+`~oH7)-xo &G<"x.Y/ G !"p;;kL|5+y Y?A%+pr&'؅%½B::rfҺ:ov8ׁ3k܀M:E]C:<`ANuyQ@Vldz0y`= 3&X/cHyXoD, ՝suY` aapb\yDyKߧa:1B}RRuug?.T2xG 4_6qr~2PI?z C! P u(v8+)2Q23&Xm4CȡanJ[cn*2LM\z;(57\hP!݆ ThH74,`6pe4i2A2%d$hwCn8,@xP4Fpp dtzmNӻ{TR?`^p7.@Xq_׀^~7@r7&a~^o"XE-n!yElm :rnv m_AO^2qJ,ƗM&lT:>9cɍCVH%^NxƗ lݸ#1̲R| ^ǂeq3Ʌp!Z6t,ER˖QrYDp|!pCve.L'p|!^pFAk!B )iFl<`2q&!f@2 "CΰS8q;wZ*Ȧf-&5Y8/S1'gkTq xQrɴb=V$)WـMl H^AD!ɖLWW`M/ry"d3G!0o=%>+ZMD b9o1$3+6mY͑ 0/ߔl"y"c3V?ӗɿN5"/\~y5j.~7mzԦM˗oG\0sq\0sq\0sq\0sq\0sq\0sq0sq\0s\0sq\0s\0sq\0sq\0sq\0sq\0sq\0sq\0sq0sq\05o!3~nIENDB`PKwL\r)>o5o5<limit-login-attempts-reloaded/assets/css/images/call-min.pngnu[PNG  IHDRJ NtEXtSoftwareAdobe ImageReadyqe<PLTE*/@7WdƉs7z7y{o7oȾ#oGꟙ꪿[nWHQ$~X,D" B`X,D" B`X,D" B`!,D" B`!,D" B`!,D" B`!X" B`!X" B`!X" m.@$IAQ(`;s+Dd3UQ~"(1N vG`M ͝@'xn`Xi~W_oN;PyTp׵M9AV7^_CۛUAؾxçTtkKt̶$cn؞ RW2㤭.&Eد8V꒜z_"o5 6|ĤubVpb2Ԏ北X}Ń݊缮bGN{-&R1m/@ľ\)=Ž͌\(:ģž\k)^/؉vȣV%yg#v`ŷ25(iDj[m9_^s=Oxm9 pҷ/ɫ̔/nzߪhb'V([ԖH;[i|J ( big.h㛡)vJyGn,p㛡)>$]-$lMqcbV% fh ƴ͍<ᱯuVwr[ NܗG6m2nKRWξQJl+-Y'$9HB=Ub:jyۙ?6WY%}Z)~D{j ]ou3l!`aK'}>/ș3d7;Z&O.:01 ]|op x몰50a5h?;w}︇l!B;ރ{0U̞眼-v&ݝ6몰T \ON! {0rM@*YܹJUʻLv-R+0{~=G͏*B9SKM{: W[VWw4|?3a Ç7νGPDqL3-foUTiؒ:{JAv뼒62%dȫ)/ 7Xb%K,\"穤q㾱c`JީvV9F2眦-:NyKlT Ƴ~h֭vZl ZZ"DM^e^[E!{ovCt Vhu@s\=zgh6X}c-# $sGCĢQu4B7F}!΄96: ++y;[x襣UG*Ul,[Gg襜}+< LknϏ~6@7^M4YXITb/Y&'#5E:6|LWxX_UY9:/W˔"I.+<!6/JR, )[9JRe&'O:kGu58zX1$ (l+ʰJY9 U3Þ[^> w;c?j55` SyyXFekaJa$̰a*5cJ|J)U~ó kµ, ^0" KFGeHrtX?h\_HC)*|BO1hC*pWhѣ.p G1 H/ GGDp.`(S_XZ #J1rHUأe:{YR}6-*dl9h$FGʐ]Bd0GQ؍?:(pX(ȳ p[:/_#t,FYTKꬷG*c?U%Pfo د7Pϱ|;kY{QFBhGb{iY4b̢%h EI/]ĉS1@OdRBO*069ME҉$4M `& A)3q)QnƵa2 &(~,]t"}D2QV§BOT>ٞٞIYOg#Spf/S,Mx@,YKiDuCB‚# @ %XphDiR9}acm X8|~֒!d%d>CReɋT ,a;]T4DV }>߸I{HWm/jC.xq a1KdEc$r$Nfِ:}z鋨h!:Mb5dv(;= 8:o^hdUs Co H 7#,G}7x4n6CY\kT˜9,{cxpUlx ۴drjU;AwXVkTt?5924 ѽ&GHdՀ//?77z5yo*I>bF87x1bĥdd#(7D`w|]Bذp<%a^|5<:ݿr ހA6ҥ0K|G}S.\S4K]:)_$yNbTÈB:#*@S^~ / rԔ[,]>Bٔ#_!ZS#_rNÚS|JӇ8rBQ yZ_`ErtA;j^vXLooa޼rx_2oކ R>W~ _@p@ +߆r`1( JoX#}:)ys|{ d +78Cr*@Awe̼1cj ²rBu6l!psj 1BVD$Cp*Ɛn!D|Eq;g; PS=zYu~}^4C Ȳ^ TJUTdYO'"&%Yn9}e jq K?'_~ &؂b ֯l )B[dVY>9ߢ;;`riד'oC3p3cB!F-*jmgPZ3A3p3f6cz8m/+2y/x}gV?ր.DǫV/m3Vnm$ dL$9Xn66d!!}'^ې_<π׶c3/W.Y9mEJH C+W+ak;Ai(q^95Mt,}+p" &ŃlH<4T io%9'hŃh8V·LlXxY6]Ϟt__كT;79pz^?t~ԩޘzcSzB (7F(axA(u`xTl{. ܁Ye'Pj_9FO3zc8pH00ΗIC|w@܋2Xj@80q@CK:"Qg~G);ߡY@T7HYXбU2cǐkI.`c XJPXQ+?KTlp7a,!>c釦X e/yCYP%h;n~*X#"\`#+EI jrc-u<`OV27뮻.KS*AC)t7`{ Kk~%`i?Oψ Z]l<. cc,:~.x'jv.5<ǒ(w]p?y"g x Kk.xA@'*fXxy K soshʊ:?eRKqHl!`#0VK+V [XPʬ`jvB lCW̞M`tY R* + XZ#=+=xl$[T`,# ,g& Q~L ?p6Gvct셻g/\8Bp!rP.DI~ Y(ݘ؍1%M#",[ƲQ _JKYxA@@f9 ##G#ڽ{9YEH#PtG` `{>YN a#DH2,9Tϑ |" vOY>g\~sΜ#o3T,[dc3-,{Dr3KO>mXzsn27Ι4&Ul0xuߓ`;ܒ$Ǣ?d-`A.B"S$^Uق׷`^[| <^@>4i'Ꭿ?JXZu} 70}L1Bk$ u[@Ů=xU|`sVQvR5W)@Tɢ^ޓ`;/ 7$Xk. DE!unе}I'`OצpOF1}9Fe%>@ XpצO/4} ^>}K/-xi^yi+ziX9`\CI/`h &K -)~;I^I)k>O v,IeF 0?}e9VW_[%^$.l /LH[Z`:lACIv`Dw׬yw Uk@Ō54 fku#F5ȱϬ̚4Y~~O֬9fq g͹v͹sְ9ɔ`?w8Cq@{dyB0ƫ?N;.>~zj"^·y*M7{A\"  C7`q%7B+b2`X`X cuZs`Mhb\Sрt wk0g[!G78pTp7P#u'ǣ^-X6jSnrپ~{q=siJ{_K|۰Dm vOΪ*JXe/Ozց/wK27]o_>ƞ` hϺꌿA/SGVD-T]'bܵ3u6xQDXQǹG|ɺYOi.u*} q_OW\32zHHwl^TcoSǴFZ`t8_)DJe'jSFm &E2XgxՈՎњ$>D eEY. W䒈g_r(F:k*%&k^l X bX(QN{-/`+ξMͳi*WJszTVky 89or[ ,oP4|k/;a>y]pUuУUvk%)<гMXSܭ뫳&|kO'Q/#o'8BG`dgڃdu%H+](i=ncY&@kH4BJÑ`Ut+]tjܶ=VI:yDyX7&|kaokti:)m僯L8vЦutϜltrD0n+?C4u%l XGGaU2Ky:>(?O*iF;nߖ:B/?vE|ew$Gl)^6<?ˤigg3`5%%np$#Nߒ01Fefq LlX K''g c}aAkސQH2uؗoF)3, 0pfA@X}I!&LYVu2v@ CpôE =J,+Wap\oJoђ7&5t# Lh+Œpvlpx.LCu-WnEgAͲ*\R?!mH,m귙 '_ [4K?UK*S'aKbn{U`CgU9.E C؟u`?zwֱVC?+ja?t? WpƩ-uf&e`2"k~i.{HzFM8X@4oNwhC 9Yi^O_+weeJF_;2|lT eu:JY:taײ,gX2u]p%vzWnsW [NKr^|p?g*uPVT; 8qP0s#\cvcn!m%`I7 G3KYzW)r8dʍۧ{}VJ%;Jw6=㽒uݨ%ԄY3`'v 4ht_3&ghd-?΍pI[t0].SvpK {>3fZe J貛ڼv ^7u=;sJS;X8Nc+r/tF/K5d z6oC|ʔ.)iWSzTyEhwp~%9kioݚ#cW%0uuR+f:J2Y4gq%gmC8-D՜d$Lf:b+,lʴDNrBF=3_D%)о4f֎qu=v%;,c.սsCleG,&\Y.fs$V;ccض&7Ŗ vX`꜖̏62yئWjV;K7Vy=]\uKG|NӝUbVIdGV]>j*$`ŝ6ll(jAWlR:1z 8YinW"X weUUwcˎZl!gz  yF=ftbKû9,dONN'szmE9 6JN:[f qyMt?:`]&'Zp9zkZhcU,}%kki{]'q5bOvxxt'u-"?,*;}bWLM1/NPo{ uj>aB 0';2@99VTs{v尲V m-.Ӌz?֔xW~{[ŸfEM+''Lu@nu<(~Jh}#M x+ݫ3_yP0;}=H{J>\r`kk'!%ev֗]8KpC[e2r Sw+2]ud+{V2q{.0_h=F쾓sE:6ӭC8i 6ñ!IՁ:@ 3r=A8'vF/w7lSQw&`egtW>/ˁ 3p9 '_N6Ů|+Wjro(a _Vy[9 ^23[j>H+J;vWN[P+xOmq6Ӎ;_GN6 Vɕ7yG3fG, :J7(s󭾧N Ag:?ű%o,t TsƛNfBMou[ޓ\ŷ&Kfl%"2(h1ӈ2EXm]r՝t }A,j} p bo{䌑>V;/H𤥿JF>2Ukە7߫jk FSſIQVMdܮ벵z]W`fq=wc"9?H+9GpשzO%r0n9:XCƈ b?y,e}1Vj?q 7)DÑp5)lp:ȟ;p:|.@9u[D{9_HDtJ0p8vJ_P7Gb?!~d@/r.AQF9x2eh</}`L@$9vX6C'' :t2ZW|, B`!X, B`!X, B`!X,DB`!X,DB`!X,DB`!X,D" B`!X,D" B`!X,D" '8XY-ScdIENDB`PKwL\H..=limit-login-attempts-reloaded/assets/css/images/cross-min.pngnu[PNG  IHDRJ NtEXtSoftwareAdobe ImageReadyqe<PLTE*/@EIX琕ϕz}q_cpv|~dpm੮ۈgotrZbwiz{`se7Br^y3"?ao[ݽ*#*\-$T˜O$ȷLv^s܀w>V]}juwuuuw7D`bnpj5Wk%|1'˱_ǚHukn:VyM5;.rDI8" D)߁&~dw%a0F'D~2 q]{mlͲ#y+ 36p۽xB:pZtLV5.NΆl4@()>Fn<+.:. A Xs6@olH%Sn`YLY'ނn1Ͽae hGyg1/4;QVw-F2; t+* (oȆ2P2J@QqwxaS2$m49RSoTP&R"nFJez輥I5z}'A/[N?HM=R|R}S}yS}}}ϧ>آIp}GJ} <^Z1MK%KpoMmsւ s55ֲkXSX2-C57۶g~sXj,P{Ʒ6&LMHe3!g`IL!!uOjμ; =:*kpk1gr~ h\ٷoĐ}ڇQ"Z!5wye} ,LU½ ljo/)]9s̭RcӾu!C1~ZuL`%8dxB8BŠ?&qN t2_zdoCNJ)WhLLqqLb1 a81C.$IX&Dt%%[:Y52G'{{nRR2v!mrhdLqi63Te܉{sdDJOvu<2#ܹsq =ns % z ۽r˥?*kUܸsY֡ߕY@qsjltȮt'm)+/+yAh:dc)gb klL(% f8_1{;qqhFs0`C'J|wFQϰmuΜC7sm߾l9Ws%m9X:7J糖IDl419U ι"BUWs\@ ^0XQE2xEzk_c !l/e@Z* toM֨% 8hd@@+pptcuGґD|ߛDWypDyȑ#G1NyQAG8::uc0Iw}f˚ӸͫzJϐoy`F&pAp6ŬGYiN{&hf_Fmm,-=`qσ`zر=/o4bYb? 4EXϟAqF 鎀܁ 0f{^p0 fY\y~ yNkrNp;`ΝB"8ؽ. FX{0+~2O֗74?#5~K2}+d6D@"C!b2-++mE;о _fgx,+tJ+ R[XŜZhI/%=@.[\A+&|*ҪH=x8A ղŋCK)}^`MdV[X PE1 &Ï( K[jIK]V!2ŀpcE͊L̅l'N:.[5#GW`K3l8] X6x>o5]e\X <=LD 8<_ r ]]ɝV^jҍ\ekw;oyl  yfy3߱Ѫ. 1}//%`BwQi[*,ͽsP>^E0`'ń QpXt&M{ i#oŽy]p7|Xdv0 ^lC\'9Z Uz߄xq` a}GXe_Xߛ<`7>f%_%W+@e_JwHn ;0J(S*@@e $9M0gh%`˓))))͍Q ɔ+)lK|̊ \il"`6/Q{+M\pcfTcsJss,klnlh퀌Fp6`v0|mX.I]),;A;:;::bF!(D+/{y",Dh;:~qDUGUUZUu PVD$:V8}**׃.=gO=Q5{3sO\Y˹GrF>{9*d侬{vc lsU>>2H@pLc vn8ls&H< ZY6pk,@1 +KEnVn N^[Ç.C3|T``o1]-`KPPaLM 1!F05%ώ&A xp,|z8mW.8 wXBRC_*>3G׍h]VMi=P!F0Ci F+maamx>i7[nl@=iO? …c~ZZEqu}$}+A~Y2_1Kt&=h#߀-/G={X̱gAU+L1_)nX^җ =KYd!n"@yϰ3`|{xplm!9$=ϒh{:ZՂ/GnZi&K-~pCFA;لhjx,AWF?iҫ .]JR.*(̗|Gfla=[ \v?NՀyN 0v|A9Kvs4:3u X'Il-X19) XT{ل\xveD04%5vm JlPX.6vuJjt96&ml``,4nj jǔ Lu=k~8$` Xh`"E&cNrdؾcE6oԶ"rc`UU2fE*YkLXFoXvEUMeߪX%<^"X ,jOкYz]nhh%Y-񀆖 ,2`eYa I c/25Ňw'졔dq.` Kki`` W[ w%KUz p~jL6`JgSAӓ%-ҭ萀;N$q|oj4vxFIqU57Y%"R/bE 0?eGܯMI%%`2z3l p r3~8%rQ~p!cNmUoh˫UZGjz'TFlNl8hgSVJ:ǀ4l21`|HmɭaWSg{Q^b@M&3;½v?WGAen=fWI1Q Tb1r+ofλvwEtL+친$|ӓώ,lh9Wk&7Qul-|tߑ`x=ӻ?]0؊avlr8eZJf{iV^&ĝ| ]M^=8gl-bft݃f.V߲RAڊdžJw3ZF€G^ʅuVl--z^;[N]V 8Qlf fq Ÿrj:[ZiSPif,cUE  +݉)Wl6MϮFW:k`ddR*Nd_)_UYt7 zCvR̓ZTփ/,eN$ޫ%R0kNNtR6nuvv42 𱛽[L5Hxz뵒0;C|El:1Oz]䢜OWg3`'޳w6q/Ѐ<:,ܭ0Ʊ|tv82`''/` _q*DR8?+78:bfl8_F0`*S:NHsWUL3=$!G RX绍%=gKT,B ؉FЌ!%0I $>H 6 vtѬ0{$|&xZjtHAg`;z]Y&30=°,3ـ6q>g ªL $ O X l;x>i("3; w`o6t;bhJGv#vWW2|?}jKCf5nxՔڰ8`윧Pf]uXN8^XUF8^X]&,_2`q^`ONXXu^U"JjXu"<=X$ܚ._o/tpXZ`|/%`qEI<|y,( KɗsJx-tF?07EZiW2%7JΗJXʕ 0Oj L|w<@w5g_,G?Տ׳"ml޼ylNҬl^5::vn,9 "Ỏ 8鱿YEx W0kŢE!~,~"iVf0CqI@F/p)4:,x";JaHEKX8GغeYg{i5zHjҫhWWc]{tw_񕌰7uꦦ_UCpWǪa nDGS7~rfI_/t)"v80"AO0[HG|x}0}\(k#ע֌v-&sf:a?a?vw@ݟݍ};Sc݂ 8[^?0nPQmOkگf0)^f7apH]ֆ Y(6Bؐ\X  (dlxv7YaJʛ yo8ސbq֏YmϭFV$^eC⹟e(o[Q`E0[B-$~5`;^/I7NЍvΤ T()5< ֭(, ٬`-kLWR2^/||?z>7|_ةEr}YT`SS"|k}s,|mS _VCy %^^S{A-k}kB\_[˂35@Y[9{3f)1{}B._rH/ׄXޚĐ,>(Ȝ5P 0`@ Đucp[CJ$2HH +B!<u14qǬK,f0Q=v$'F"/g㋋cc!bok)niD[<9Cv.g~GG0-Ŵ1;#t .+PP\Y^zI^kӹc/hLZ 聎~?Dٳ‘<`,}ѳ,)fc;%Er O42[&c<>=Z w=e4bB=fp ؉N8XoC 6OZvsh=yk=lB!(q0~ ܙ%`x:a\m\So݁-*ؽ<Q\1ZbpO5Us XJguꂳȮ 3`ǭ'@AȮ:xphK0;,˳+Pl<*.]VQa6!ʮ:’ufss}#@?eDzePJQZ$KbY*\`x}RD+(T224tBzZ .+ O; z[=<;,`~Q^,`'f7Berx.ܞ]ʬ98.z|.`(>Ō0[ op 9:cgru¼.Wc08.BcJ0I 96ghx_qH-l2,/l ,2 =}B.}a1s`́p @,̪W*+TVVUTAؗʾ+})W*RR0{J\W*R*[8v{rs\iMII{%Jecc+̎RqgBqX"U_cccccYXH0+S0 q5`V9 *QrҠƎq,&AV,f1 5o XeZܺˁ鎪//:q/ȳ ]U'~ ad0kxkg^JgqnU\sЄ1:P^έ:}ȕ|4x{ʨH7%ڑ\`F`GnxH, R##I]K:D. F_g n Πp9"XI{*,J8PȐh"@#`yVh/ ҭ7(pwmEi…CCC(b4pCC^8>Du9d̆WCXXݢv*Ga᮴‡.c>*]CȳM -*(hSZCXVXbڋi42O+d44aq' ׾Pr㑅OƢ 2#-i 6KŁoKjU/0 ! &FÆAl%ܫnz|A##{%:1} ^WU%{*. /mǫrz[L=ŸwX-.Y;]ciϦM,苷kTikZWZ]jE6eΫrj[uVJb‡nPC,zU_,'`|lI_TPcGAAΥKWjuVƽwHwqWꫦ4r{lxe]%GyޠK4.{Ǣ%XV&?E ;OUx/|ߞǺMDVIqVOVcz~pus&] \+{uZ]A_Il9< ʕEEzuԠXi~L732IDI0000&`&`&`&$L"$L"$L"$LIDIDID 0000&`&`&`&`L"$L"$L"$LIDIDID 000`G9g+IENDB`PKwL\8XEXE?limit-login-attempts-reloaded/assets/css/images/deny-ip-min.pngnu[PNG  IHDRhh1{tEXtSoftwareAdobe ImageReadyqe<PLTE*/@EIX7s"h8Ss! #Z1ep1XMCF%j+H"QbrIh Zu cበ3B9b4vE zR ΜӍ!Z"hB54Fhb5ICa4CPYE4ͤ4T0i&ACibbAGwA!%ɠ9 WrjjL); h\C:hw"hb6AGPL>'ÅTch籒e6%ҍX-lhN!hY(&V:S"h("2.:AC2'\ **0cDPDcvACZ!h@;!hACаD4t4զ -W٪l](jVw4C6A5|[-+I=kj"k&MIWAC9Mk`a2}Glt… 7=(fF, эg\~?'_gx gA,I@}Yy9sg?;D,Y~:TIK yJ 7|@E4iJc&WўsT1蓞dv?߄Y^vvڑ ;=b6s& 21PS@SlC+RS7& RvL,9?çTrUF~n&IA A!H1{fk99):DT& NW-@61W vӫ7/|9yaf5QS40jZ=M3h>0Hl9eճg*3iLro>J۰#zv$ܷ>jc$=e`"hj–7hwߞf{!Mr po?!hpkLc6D.}{@p6!Eu]{{=w $H.لUCn.<==p=;?D<"'D Zki.eJ3ZxTwޣ=9?$)G)t$r[Y@[<{--!гr4$?;if>N G(q iϛ٣@ͳ#9O(̿ uA.2ٍd?>UJKo$_X8.|C=$9[^e W^B/Byu+O^Q^U3{C,u8;E̙G6g_dC9y~(8 |R 4;BR^c8vݽ  /fA93asn߾a aW"Oݕ'+uKYr^`+!h#N w 7LBmY;{v ~l9!`v.D?0gϞ~\ھr*g0s$H:svwKI0N)}:p6R7Pm?gϾ 'p ɴޥ7N'w=YԎ2f]٬!w/Og6_mw"GN2yۗ%{/o@_i gJC\Rէr)sL,0pa!n M m#LR?{9 0/#h)\%[3+ 36!3dr%\yELelmD""Pgh~JGЬkrL漇VW+ :7dT`r#٭\IR7ƮЌ+GjXd8]MA*jm)O[ F726+۴3ȻeQsT۶m6 OYC ~(yfR/@̶ol8l$Q`4a6m*gB H6z+4(U5k76N0a۶7~[z쀦C"4$A jVHx66n& Jv-O,01gܾrN#7%A]\6 XCF̖}mvt N# }NtANȱܴӦ e/10{`McCa89Jo~x˛ `KٺuA.}w+=\[inVzmdC@ݲ-ٿ V^SV`ZE'yॆ;-B\ fذܺ'pu= $pzɒ% 2lnzziKEA+e pm,RJkO7_ @t毜JABfL.l=M_f؟O7l3Z(K@#70A]%Hͯ\ͯBo+ͯդW+o%+DLs5&4ߠ!h^O$T^z?bD0kO7nCyj e5ͫ_)&X_W#,?AajS&+=)׺yV3yH[=@D6)d!I}ܯ&PGnZMnHnF7fr,LRlدQڧy"P`3=5s$ù$ f%՟\tcok-L|dk="-O,?wܬY*tp3oZ?UF9 jraֹ3ie˟x(<ׯ?TdzxGh9I9VWOϝ9νGzl/4S̞Rٵ<@Fk!\zN՚5k~ <֓c&8έdBk{$Mp/SlU@|ڙpY>̹7禛y5s!Is U !ޚnbGEwk4V<i;1 iJ`G7slKv$M#!{r7d{&i,bJ_7C4=)twGd 'tCXvSM#hfsfʽEP;ȑ# y[9$9u#sTJo'ieĺizN:+fP%hN-,=[pGxYz~d;ߺ})Rv)el֟[ZsܾtR!m)c= D9r;KZJp-ؐ4r#TFhᄵ0Z4y6$[REjz۟H4wY9Kys*gVljU̍ xKF9l'9$,7ggɥi|Ƶ׮]KjҼԵqi /jOYjׁ+5 0rv^Ξf[g_$jΔk~sF LR7 вcٰ71j%\۹K 0jN+LU-VEA<k>y}489{a>bn%>\5gJoU-?%m^^?v \)dO7$l4TƜ̨9K1u֭D ['8f)䌝Єi>Y=oq'`C"^Wg䥟^[<XuLɜQ/Q3-KOZ_ՠeMR:~_U_3ķ֯} ZmVgez\|XPy5oKΘܹ͝˧5>AՂ*ɪcRYfobf%n'%roAi8ʻWyгCeޜU#hcUT=KUBibikɎ$EЕ,D ;q Z Y8]8;B~ Y\@uvEZ+ǡWԥ,Ui㪔cW]]:9H lS i}Zeu^gæw NE6@Z%U+];}z 8j\AzvimSJ@Sys1ٸ|0};]P 6>A3[aa%^+j{ {rZ8jl^i]]܉]/sa6ojpxv(3#5H )ۆӪA:u'RXc+4^UӾS}Zθ=̖])jJAVyu8 8SQd綅I7 VѴJ_N*W-Lڸ1`PC'oW4)PA 1#U41T>³E*k N:qA@4a">\`U!f3wᙴA@S ?fhDsFx T&^u{l.1qh,r{Pwmohtb\ߧ#U@-y'71mmZA$N)K7J zʸj; µY^[VwZwl!8플ph69jA p6xfPVwl+# ,!\k2xMk<`#b:NI4in뀍@v ޵Fu 4CMZڡ4 4ioߤYh%C1h|Cq::)&v#he.9; 4_PmÖib%"nKFͤY hQΒ3|j yޅ hNޒ3]|Jbue߾nr.up֌<1bBm?pG眦1BnC:$@ ˪8 EO)&PNދߴZk‹!hy=X0igQK) *EG|z 7gC^O mi#.U*|mΑv6{n4쩬 m*t . B{ٗwFh Β3*h ʵ*.US:]v[IhP!Wo@=VZ!38[1giJ=@㭢*V\,El9*vEZ^,[ *9NVZ,E e+YNgTАA9=Tnن,Ih _c pbKWbKgch ,UsvV̲9䂖Yc˒ !͈/ߙnlt5 ۚz;_,dEGO hbr Luy;0TW\llriX\[h(Qj⦍6&.kv 2r..Ķ_y,5`KKcccHccoKGnI`C'W%-eUo~00Euo(I7`|zc}*kΈp}|Ǣ#TZ ZҘ)x͢팰NCv|E{47_m,2F/Y׮ۆwEڂ%^Q EghNgВb7iY]v56 KH{f4Czl3` jkmmU6.Ezh/{$=>z#IvIh|{X/":: E2篅 GzH5T@40ZGXg+^v*lVh1&1s@ro )վN5i6aZ54ѿ\`Ћ/48`A7QX)&h8P^e;ĬQE*`ۋxMW 5e?H?g`[.hƬdW|'li6Mi0f>eFo/W7$&(矵 hA`ӚUhaAGTq4Aጂnh򀖶fcAs*A#h&V@{m̃A ֍q4n%4fA v.hqRu4!hmsu΀ :#;S1VFp <bBrGC;"6FuQq~C 5à^\R7!o#}IvwX%˲1 E='uJch e 9j fFVα0f \-:?k4c To@ p'ְ5筒h!$9.f$Yp\ߴ*nwS0k~)cc hU:X'fZhKYi~6HwDHc O]TCT)'Y5, .4j'yϥ(ПK)W]ҡE~ )s**RV_ST\BU5Ug [%ј{7+7 6-ǜN&kFQG5EM9/o _efrTԢL宯ѡp Z-_i-u>*̦AW[,תɒÙ60˷j:sj6*̦B`SKjTcUZn;2]( ȕ yC5Vb5|Ux G!W1@ȅtnkk q$k"7+(jѹoPv 0”Ɵ[45pqg|#6Ұ骱CHY㭕9r?g/DqV|*:ʄ$o+C-R7r]͒ihf|A QR9˒oo8 \mt(EK"mh@yY/{cҚEAszr%MGCt;cyo*[Z,UF~\;.k4b,i:NV,^Yаl-[X) LY'?)yeHs9Y(x®7TW Honz/Z';krZ+]ufQ%]|whwYhit`/hZGэHˋF] ǚMB9!R V׾ h!ؠLoDrom*XZd/S'-)Z\ O^o}]<ǶU6h}M)Zߍց"n,8 TUkw*zEW=94XHaK"EsL챪/ C_#Gv'ִ ց/:/QpȪ?h'pIhjY¤9;u;PU+nM>m)r(d;uurVmM)<]%L3-GrV7y_ pMS&3hJ<1iٰxvVhs*`gocӀךWkmm 4Ez[:/x&ޒӺU4nX3bD d,ohԥw_ԝw3p;_;h%&0dhJ;P~5䐬.!׎;[EGA˘4ҔE Cy]og^gcfc|w5Xy{׎w~r暴)nn񖤜NmP7oPP6ђ'pu޵*-%5YtQȲK(81* uֵWNpZ5@ 0 $U+9ÒA |j BƤx_`ظ3r{Q}JY4|W_:d!+fvٵ{,:Ҏ)%'}N>[Tؤ H$M7h], ՓZMB:dL^Y]}~"1Q/0/.I]҄}c.Bܠ1F>g5&ѩ]CD#_"yR, ZIU4-!_V D%m7h)K\%x&o9O0>9@P]xKN.bD2ހ i#E/k#dwʪ>'hQihLDml3)Eh3{ztXLmss /GXt踁AiJ;!vE-jN]Hߟ)3%i?N0:\],Jz?Im@Zsjo=Mƺb/]p!1oBD . -` h84a+<M0jMcVk=;IS^AR8VmpYl)zlXH3x9ߝt UOW hI+tb` o7XIuBla:>331E/ӬVI]=!TAAʭv8sX--}l2VI㭢E"44>f N9r<cg*itU4vAW!jUhmdY1 4>В&U[rҲ 5E8_= Ȕ.tGJWM4NB OIXZ?k4:/8DUW3{”BEil_EsV+Z4u"z3|Njw i;E!}P`Zr KpTИ4=[580=6!:TV+7EC;O`l{O=#}KU!hXIsv tC;D.t [jIj-,ݤN-Mgn@7}6 6v mgJϪ!9N':Mǡb . !B+)RMyQͭ:Fw Lc `X>hZ=\bQN5*iڀWjuU)ZX°' Ru)<3F)>#bP:Uf`d2@EIyGoPҭgbv̒}C+F =@ӆI8ED->KPʨ M=ZSƜ Wkn44^MK9FU OIэX+TlYs%lS 4=7r1sdXqwzia.r3bYwj]pF ,H0*fl.1:(N _~!*=7s1zc (15~֗:45GW{ϥL5/qWl/n ļ4&fHkI_oŌ2Du=]>-&_Zۚ"-]#oFIm$j%4~_,KgAxqpQUKK/9ـIq! 8kp#eA#+&9hln8zI -2/Ds5xQ%;}24jb&@,[ ܚҁ楔;>m#%>j"ht!&u^*_2m  h"BQq;:`'A22=cOǪ-C-&AYv4V[%(@Kǫ4g~x2E,#x Yaopu~wb!@ TA/j4}dP+yX`f'D"s1n=pTd9s"hR7ow (60Y;zEA3ncBefʌ8'uvPj ޚ]+j:#ghP#1((QbdAGPSZjw8[H;m^#ho3Sl*çzSC͊Oz)Kc }u V|\d%KK̜nBNg 8txܣeS -gs6F3Pκ8fD nrjJ=QC:PFlZ/>=60jsV : 9NCϏIS}f(g֜NدAlQai[xALdPI onYDKgRfHG2ccl1L{A3ǨYti,kD-fQs$YNj}B2 NOF& PU-3SCVy.'fVir1X~C2 aY= hEO+O0̩ȊּP1Z>j>`5 f72@ VNZA4;o޸ĉU5*Ru杞P]AER/ωHZϨ ͓Q40kGak#S)ߠi&-1PaKJl+czLoޤA3_ ~B0cB^$FiMvÜU2z+Z?AE)/Y3 S쉙S1jvىr?Rz4~)RzɵǢZٙBl+I lh(*fwKCЊZɨAƔxk<&wBJ6#Ę?2êhf5qAF6tzyS‘i(Lic4 Oֶj(;tgw^AʴȚ)ᮤ![V2ozG@l qcJfKY)6B!hvR!si**ZB!hu4T4@Edf M5- 'MJLs {ߴh1Ctp 7yf+LkUWpji7tKArw f/L=ndͦ2i`g&uv4)eg *"h6ߔ3jr Ai)izɉNLZv"hv ÉR)Mr4~r^a ABr(AC[KV]6dTxZA>) ~kY hU!c~fwQ+q"h:$4oL'fWEIPAC!MLI#hzapDP%6F3 HV+ydAC#M~Q^ L&e-7!MX[(;gά֣:}2d\J{zPƲc|ZG{B3ҐFPF͡7fKwʼ$VF-wZO 7"gG(o1@C"VF?| rat+"hՊZUCЪGDЪO ~OiJ5X;( ';PU x4Ǵy~SZK x-n4BP( 4 AC!h(BP 4 AC!h( BP 4B!h( BP AC4BP( P AC!h(BP( 4 AC!h(BP 4 AC!h( BP AC4B!h( P AC4BP( P AC!h(BP( U._(zxIENDB`PKwL\iZLZLAlimit-login-attempts-reloaded/assets/css/images/deny-list-min.pngnu[PNG  IHDRhh1{tEXtSoftwareAdobe ImageReadyqe<PLTE*/@|~zq}bnpvtwjߐ^{ryYR_cp9Wh4FVEIXxysㆊ]bomo7Zj~|u~t⅓W׉etgߊ;.tRNSS%GIDATx @Tg/|bQYdQ&$p-*(1/qI5qevǐI373}n7=wܭyTj8.R]Qq'_I|_Aɷ'ߙ|'u]*;n\:M &ߝ&$[޹{;wοKf ikr wRdZޙ?+WMP6OI/Q`&OkZQ(.*}6?[>E團R@Vʣ 4l8o"@|rN/Z-D^[:{w΋f 4l,B =;vl"^#A^C1z;Fm^[zw^tEw_h#wI˱c]Zu7=MTڱjTƚ^{RT" 4&jdı7;t5%vUWyMjzyt {YI r|Wծ]w]: 9E:`ꎎHD;ZWsDuu&1섶xUUǮwTB*A*C]owT6:qN"sI,[h//HǥґۗR.TAS%.ZUs*~MؚRvBΝjRɪ`C ,/ nKIERISv@ YGC%𖲒*RPVfN55(_#%e%5԰;S^h5+Wr% 5*tjhV=Vx֯_ 1T{R&Y+kVrXmֿhsEj~JPTXAX1!t~Đ]є)Sz{`UgEŊ O CєMNz 4!)pKz{(CT!J =h~] -zMb[} J~Zi3XGU*5@,w }&18f>N ;|?GyoqTRjǍǩq|n~>C&18틊8qC1%6j߾(|\}%|Qc;- 4A%#xaO^Tm7KJ)ۧ|l&1(PAPIW__ExQql]J7MK{h40$^D"P%xA*~i?I{zr@i{24,R!d|^J;!jahiMb0k|ʐkJH{(oB¡ChOPC {޽TA5O\^4ĐPploQV:ʮq@eO<۲ k Mbp'q;%.Hڲ <2>^ *ʞh,9,Hҥ )_O`V %$?-sJsrqdn:9TtT$7728ܕ(59r Jbp, M7tR!U-'\*#=UAs Ko CA@%r[s[[!Daa00*F02vhJV*$lԅ,$ԏS-@qj%50e-j,THRKjkjkn[P@ TZĠؒmq(Hp,TW.rj˽Pen >MI  Sfeaac$^j!T,P#[ejB7,1g% ,1l؀B+e;{Dz!FjdCK P AS&1to && 6#@LLK@@K@L*EUB bT5'@s$)96 mA]p4rITOE"C ("a\6PNPJQm]] žn̮.~_2}}XSPEdE,iLVOAWfvum|ƅ8 +~~\む>wVvau5zlgvd??FjKXx&.І7ӕ;18ږC ~~/8SJQB#D 3q\h"T;"ىn!J~i^ï֏TGP/6xAoD d"+^ߟwF}Ŭf#Δ%4ۃ족T <6l׏VVVFkWmZm*28j++7V}[F$y AʺF~Ctp*/4. Yvc>jmnyڈڼJ<*񀵧kkk6VR]jPWƸ>GIcT^ 4[4 -8]гL$]8;q^%eEDDEZ,QP_O-UjWQAՕW1my\sV02/8."a)6"T b+*b)_b멆2(B+JTԻz&&YI&ʡmvim^}OA(TQ^Q$ˆ2bc3ࡂrI"o 4f5hAO ͻc iISTўAJ(m2,H-4ʑƣKrů(NMh5F7nz= rybZq#oӢmD6E"ކzJGD'nh^mtU>dl߂vn8j&hTq˻y6^jzhM13iJX1l&3yE+>_^J{٥9Ξsyb&Fjy8ovfVHmtޜe˙_isf{/C;c/=iWKv'oqs|^MυfM0kCEʹ <Z?'Nv6SL:K*6$;>oв˽ڤfMPhmw6iR9#Ό g(lSl<=ZAmSŝ%jeixπmh.9&N[l26ẻ?x脖՗ۿ]}=y8=L{=TgooSNh'Y~& H΂n  ك&M2xԯK7̼iO:l*8!SxOheNl=m mpc \-t1\ {{ n]CA@{]Ξawk8¹{nnmP.xYދ#֜HacS7r[Nw 4̊Wp 2m9ƋDCfC~;@-`fOMLdj֞v.@y&9f;cOjpǕJ1}* iM vk} .6 \~77xEla\>)ܷ/`|Q>^z4| NxQi4Y\!̓ xZK ܱYM|v 4ftg xf5 ٥Ίҙ]Z@3nӛ}#hhG\L#kc~qC{uG7x{po2NXh.;^us롹Z7|<^Vh ڂ%mc6c5ן睼ޙϒq )qf;6xpeih\ ڽoN{34לPsؠ^ %'2e98n@sg6{^-%^_3NS@kp,w`4hrc4Sjs)Оwh#OiZϩ.N悋761`<~8۳9 khyz fۣ ;`^hr x1f]w/GS߰ZTyȶӴzd9ru~ieʖ>Nh=NS_Bhξ[]GHo@sB~l ZsO pd{!~d@ޢ}Mp4OϦ4[y%МrMޢ &ͤԷmP?vZ9c_@ܸO4tGAv 4rOvکКO7)Мax/{]K7}1~pyX9tnelͲAvn)q~;93^ G7g(HljLLc@H3375#f|it-8K9_^e4s:Svjv;닄9[8-Ah\_؝uS}ǭؚsVڨ3_6NN;Bn߇>hcJhvN3vK{M̊GyӌМєF/mB<3َ0q4S,xcӜJH|C9my'sJ+hNJhT[2!r'@< q6&6W9ǹufFin ̈́qL'M3GGe6imT7qz 9z%ܑL;m|KF>W@sG>zGӋ LL@Ϧ>B~@hxJ 4&@h4pؚ0z@h]͡oDFОhM 4&@hM 4cM 4& Z0z@hh @hM 46/h2@hM 4&@hMB 4&@hM 4&!@hM 4&@hM 4&@hM 4&@hM 4&@hM¹#YK@s =g%xm,h oə &МmHҔ3&МM0Ҵ35M9=ک=@s^I336цfBgm#͌"͔'$͜G ͤgTI33WoҊM+≗ l5nmC(mYb@5lձ:u[,h̷`l#ڄfo|%oъ́}!8nzzG949!FlAY 4O6|&к< ڠN&Њ=ڐ|==M)M7a046І.ȄB3IFh<H9N exU/h~rsկ 4xlk"X\6qmh>K^X摮3[}4μo3fjQʸ>C 4!&\[jƌ6 4Xy&\C 4:?c?A&C-Kg/w7>+ W{|?к@s3@hq\=ӾNH ۊ֏@hN_—{N`@hkv5N&io~so}h@ 4 pqڕMZj>=@suAv.Mi'3k۷wi@cgK X#mλ|9&(قsY&М#Vw޽sVwwV] 4;D]6G;wvV #Ww;wGu #.+?>ĝN;%F˔ЖTf1J]hm0w1,;JN:Ԁ@{5-:F:b%6˗+e߂0ߢ"z8툭@vh[{k[$k¶HEҾiۡmLjˑA%?5pZ 4]K"P[+o4]Z"!X[HtnЖk-EoҢ(KSWq% .bVEՋT#zTthdЮ\YǎV5V,VDYcaB"aӪoo3Vh mK5^oVc:&2Hu1e':@VMĪwuTw ՁFѱk?㜏 lh mQ(q9A?t Z`zmWu ʎ'nw];::vut_P ꂙ]?vU5Am'f]U 9fiQSA=`,4?9vfvV~V:XZUGsޤ 4펪4LdU!:.$(SȶY]& ZI-:.KHݥKLA&I&-) yͮ<0s%sTq*c٠mBvK;SRTd egPj8qFy'kRvSvրTaM ))tƶ# @C6Z&ᑽ)%5v =sgR2Esbsꮪv58aQhqû`@Hh[k+&0,  ly5c"#om ZY-D׶J?s1[aw5MXZW+쉕鮦a',p 44Fy p6?~7#,pl\<4I=;3 y45WVN[;#v/p@@h[S?m"J`ސ$[_^829J33qף[hԭh}3;Oi-0̭rhb%cEcУ"^"K+IWK8yDG IM[o@Yh`-O9㩾a3љ[?rhgA?3(!;E^,E/}<攏A fJgnlme:PoV-K)d ^Ԩc>O fJg#=6tE`XE\@Y.f\?s3뛜sM)S:sܮvf^O~Bz 9a6κѐfNg>Y~?)!)B~*|ɡg6JgK[b͘ߋ2~R4s%ϫ<TEPW@# ZScncݽvUB.nbGړZvoVw_y?0֋Nhi/iQSw1'nqyPWD~KM[ഋy͑O^ǧ:zcU2O N <g:t:t~wDEO#B|d}J~nд4JiK^Xxug@yCо Ru~F TF}T۴q:uab;A6{.>]%?xlOC &d{er:ɃaZ97}2nC#0C A lGUQ1چzh+mU L$) qr}5l;G8Z-?Es9%99%< fs4E&ІP6B[Ssus%~ۿ/=kh-?YWCJryjd9A!ɩ+a4%DnjKTQQU>W?89zfӤD0PNHJrYfРF&('44\Aهp4԰2&v5l('==t܉S.݉ U>ЕIzs 98@o>g~gN0sOhJFrD!W魰CsT: TWBNPCTúr[V +UN< s[UJ|?0w\hC10ƏnMU>luk+|DCpK4P# 4y@uϥ?)S&4C/|P  '5h!jhmriJ\=|?y! h5aKfim%LfUܤU^TJP֏E`8j].;Cӄbh,EcW?]p%̒2ʑjQǭabѾZV ? S?^G&q\;D$,zj*,Pq@ZQPڪڶɐ:[ [cXRUFKz, }CIO Ä_NLMM]nXL(YLtj1#Y =-Z)j Rb@T uZx0_LcP:"h5p Q:pA4N?XZZⷐhbM;k]^GбX-6;}e;Ԇjb-oA a_X6(eXm\̆ Z(&4U ZtTb66ԴpwbT;vΈe>UhhAblJ(b!5ˁgh[lǨoQZ,i1iC#C`d͘B/>ȴtɖV14hĊ2ę1Z(ɭc $7PO.R_;/"e5)4z70-jE)bPjHTC%-ƢVVg@[RLP%@M]O6icMٍ80 v! ,iA$lÖ4L~P)n.3&+jC~G_7&q~hjg+Sh>C7#[9)O"UJet֣1t;&i[؞&mgf7 Aj4V+bPg];O#@ xQqhj*דMݓnӘ d[4O=oԌgVfgi(> , $=Z`E 'FӁc$8^5Ci%`~яp/rH{Ӎ5siGنnzOl}cnv0,$888 &dȠ#{#ˆ`GmU=>\W mg1;mSl|m[Vf]G/lԯ|Di:B5FFN~E<7D5S^/9>e%C-AQ^p-ePY^xZ<~fW5nS WAY5ȋȣ)ix%5$`!\OG2T>Q;LIO2ڼZ=QI(E"udҘhEy4koט Mgnva[Tڧ{E8CDQ L.тTbJz5:\$2-)=VWB.%/QAns3OG<AG+ӵx2paz,QW{iTIjUeF@; ]Y[G>LJmSE098Lʂ5Y`6g l[[ݼBtG>ˆz[<G0ðr>:ZCb +"iEõ槦G~#C7т ̍ЬbX~+לrj*4AXJUQ߼zݼtp8צ#Ϫ 7N-ږdZ}f2s'4TTQ}l}lYeVCHz`X2vC$MNHXVA0Dϡ\HO 1pRŏ9Cm^ b oY=3S, {EI! *IXTPzH.U{ 3FTW#se=!IcyPP V?H?h zKfݳpoͼi 42S \s\E}PxɓUER=5ITy'Kb&Knx֣a~z3bٯo5<5{ x .Yd+Q-Yv¬sٳf͍Gu]Юfd$T%P=#>{FE i2X ddG140JEEFȨ`䓰U$a zzg`Sb ̠'Nzۿw-pH4/(yNhhǫ^ӌvtANFOy)$ 4Oio ϠdSBXsc+ک1IԍCk,q)C췇I)O쮞3 nf`R d17k|C:LsnޞT yXn`E%6$zVsO#uv[Ȥ_ei ^hWmRR)+"l'%ae{d(Lj,IaI+Qw($‘^ Tez$meVT|@@Y 9)WFz=~Q}™ Cl@= )P 2"zkE:e|"h"ѝ b? Ƌw4q⹐?H蹓? ^y%;{fW ]V6NЬ") L9M"#>R3J32t9֥x#055EUMDPXhj(Rh&m4=ԣ4<ҥ\agz .lCtQb1G1iFǓdVyynhW إHD6 &B!M iS{Sih5 Wc65I QZQJAeIexҏJ9*1aY?  o*eLlIpRD}d$ؠ4OI )eDCUix)9E&%%RkU?jԟ( 4KoMsDDf] :J4 jB^vʅ4Nq6:&ceSd#FQ~M9ɩjiFNpbЬӘKxt! @&]ί~њԁ *^@xcэQ[x$ljz)`)a#()y9þAHn~N9{NQ@#^&B%@DGpjvZct%'B&@47Rk4׽DFݵu:TlLth֭i$SƅDeDGTycUefc87AJ5JS٢ +a<"ۖ :;h4kƣG?8mm I\1KƇ64SۢхR DڢdKy@gǘ#` h֥ф!:@b)(A%吤Fj}TSB 2RFFXN96HH+GێB=[#׵Q04RVM}wѣDtnVF%5. DjʕYQjFX9Gۨt84-rK4k+TyF<(;fc``Dawzv%mdXHݴks+Tێ"Mu p^ &-bJi6g.> \u(BsQwwaa! jQ {v0t;JCu#v:\ o7FBU,L Ҍ|jT(d0«On.١it*n B-Md:p`; @MԎۡQ=+bofi #d*!xՑAHBHRS)?ujA 'SiBBzU ; 1bw:>у21RxfAU!lЬW? N:B`xy7*ٌ8! C=ՈTՕI*cPIМ--CЎwLg惆9_fR4MEjCxRPSj[#d#u0!rJsk8CQCdiJhJ^c"A+ń%F mdyA9X&@rXCa؂ZtRMO@=PO/B2uM YCM]:#ZRMSɺuFAAxh qpV!|ܞV!!r\ìЬ֥WH:^Tf(%% \r7Ԭ[w.-]m\RTZppx=JPqfbhyxC sd7%B v(Pu BM2+(箠A=SQv;wp014ЃjC&D! =zpFk\.TQ0+#F:C,ds`(7A<(kZcGDrgs>jp01mT&BQh"jP[ A2141QfÃ=)x ffz^jl"nTI45AA%~PPԌ [7O b48ȢV}cE,+H՟p%-ͦwA>ьEtVi=H 4{'hp7V)hT- _ަAäfGs)"AwU mnuv`;Gμā e/(M hyFg|hÛ^ g͂KSrn:OwԌdf1Wa&Qc]<(i5-J]Me3uBDfN !ХYo*3L[~:59s1sa&І9ر7@[i Hf [倆@q zXAH̙H k&WDܐua|e2hw\ -3 "^4uduzEQN_lLfA5 K/gr9X\ )eƴƤe83pDFiKemeTˁE_ϗ-T 1l[6mKEn  f/_l3g^^6gμ[ehN??MBIH4 &!!$@hMBBI4 &!!$@hMBBI4 &!$@hMBBI4 &!$@hMBI4 &!$$@hMBIH4 &!$$@h@BI4 &!$@hMBI4 &!$$@hMBIH4 &!$$@hMBIH4 &!$$@hMBIH4Wg pIENDB`PKwL\ZZ=limit-login-attempts-reloaded/assets/css/images/email-min.pngnu[PNG  IHDRИtEXtSoftwareAdobe ImageReadyqe<PLTEw}$λƯGXMZkvkw,>冋/?Ӽ[lWg~ߢ|لտkKWtRNSc5IDATxW1hTtiJ]jW}JAv1I2lG~&o"1CM3 1AofD1A b 1A bĠMyg Z*£ 1^v3Iq:;]b58!hR5%;9hG}7 #M|联KzQ"g~#lQđ3+%{2?uл9)4HD[=R"jR9[Hd%đRoY9 jjs$RQ9M 2)q*ϓfR= ܻ !RJSqH1s0 )xl59XJo(@/Bf F @j$p*țA^$<D&Q8~ ۮ;@&@焀$uVD$#(THi qHPSioɪEvR_/Dޠd.wh">zO(ZD1AOT9ؕJ#Z<*I$Z {rgU"!}Pd8_(A _VD{""(ă@a `DP'q=)T-ƒ8EhP6+‚2ςEHPR.aQ!QgHHﱈ 1X1Xd'H+(@=*ã2=+o Ll>,3 W",K@PvK2VGCЛdOgvAghtODTthvo{Eo!e1$h#_7.fkB_h ]<<_`nc+IENDB`PKwL\N9limit-login-attempts-reloaded/assets/css/images/email.pngnu[PNG  IHDRF pHYs,K,K=sRGBgAMA a6IDATxKoUn!q 6XH|XQX .Y| 腤ibĹq| N{`{f圙/YI%O3!PR(#}ŵz=B1w_}(#u{+]e>nϑ3gQq,uR:63@"s#)nD#*vR*hvf~a).D:㑁#^ hrDkkko/F'$^?$ EHWom*)jɐT'Y߇QhQ'I8?7 keRPDI(t@"ʶ d%G'8L()<:EH4 .ؗ8!!JpDz.~Dq1P}n}PBJj_@ą$8"_@8sDf"Q0dwt_&iH$edHi#(G- Q H{@"!@"ٝIB xS2HvmGd, ۑs'gEJC1)]#\'-xj6%= QsdHi(z]hxƧdh &Dӌ,--ً ^u$>-ccc=0mZ 񬯯{mv$>APَg?piEd, 0<΂l:1@<@?D&"2jKx H$| *sĬ(EǙsoϕscȈ9P\x1$:qK 2}N=$Ui (xD#PLF%,H;@Y#2VGd"mnKZWtA8 qDr,(1@~x(B4%0T0QC;F8p}bv*ʼn(@_q!oq T?\v=ø\U۞\ h+G-_Z>%\*Z^p!Ley})q'Al\~!6^Tya{zCM$kF j pz5!\ 7oذ{;ӊj~ou*S۷o?hܝ,>=iEݻw~wz:ҿUϕOS[2WgKOMO?3)y?=5eM2󳟑mؖUQi6-5U4;m۱m\jh^ h\wSeK"jcdR֞hk4mj /SksRh#x8K[.miU yEZJ=K"*-,?h'h.d7x5Q榩xDloKX%/7nu.%B}7rov,W-@FvsٹbCT&W‹srQĎ{rOsOH.'NH8'^ Tͽf.u^>G7劁N_\Mrs q`֙PwrNZpNԩ˝uĭV q`Fr:;:;;tʝuuF*p ^$Q套xMQO&# ib`b@CfȌгIg#u6lR_d_dRRdxAH*eEMʈE`D> 2KFг-4ldh(K*sW_(b(FHKh C4d~BhT(ϡ4G b~E%J694АY򉨨Q4'("J4;hMy%Fm4dKxÇ 9??jN*(xm{SAyXx~PAO<АBt4%r:Έ&$&q108!%559yW.*vEk.n*Fڮd1zciNCb[ Z11%I=| %6[yN/eM}>АɥcK7mK*%"421.&SmӦM4662[.%44\$ _'{IڪM4YҒ̖˫+*J+K]ʫ_WSCi9Z jr5&<&!dmEEf9Q)dVdr"Ϲ\^Ngfr1)ݙLً:ٲ1999ęȴ''sjkFOLh4d<71h51MsN ȼNAq5gɖ bh2kS 1עEt}MD2ʼnsO9'DGӖАYPеkCCdx8 V|ƨ=MmCCccעx=tАO‰Kxx8* JxqPx17qx״Q(8+!ᷮ<ˋ[qφߺ!ZzWoEGp="Bd3%/F 5""o-o)`[E-h]XZ/^̋.s;&YQhX6rcg^LLLpLWcc,O,> 5/Xjczdm^r36ǽ>P+i`{}6%^<ԦԶSO jRzh h{Ĉڠ6e~]2iK;y2%%甓qb0۹?F(J]kO qdnJ\JJIO\hdKNTkĀEnUʟHcR)~U\G ^DzIU8Ty Ml:Qī\yGP&j470eYig3?X̅Ƒ@djL@S1NM}ٰ f3<9@#М^㕋 JW41̴ʂ# HqeR;r\tW؆m)LA]`a0nN-pO_˛ȱ\@hޢ, s8Q4Be5Gv 8{%@{U@!=ʿ<@szԸpf2]݄3UmLiF@-_.‹a!9K俣ŕw]r\,0yn5x\=@3M@m O NqX;{D+OnwiC M]t ;45wiz94#uTS6@ zGGN#;&9Ԇj1Skh8riNpͩuЦos OM:$-@+Ϟw~GL~3ndy>]GmcӾ+ o6ixB7m /߹@84#L;^%Ӷ{;B@1hf>2+w>[4~;ٖIl92ͼМhhhhhhhh!hhhhhhhhhhhhh!hhhhhhhh!hhhhhh!hhh!hhhhh!hhhh!hhhhhhټy# ,@4E_e*W6ȺB~tuOVhIl h+l,@4,{$8Bc;5@ٙ=#?f~ 4߽4ܝu&^~nbdy {GGia3N- v~>?Wԙ{N8?U"ɗ,[(hSy<{mc῕Y2-Ge\4퉠~Zvmg.i+iDLlkk[,R̟Jѣ6řOŧv̈́-X;%[mngxIg4KTgQR%mmdn4S~ mixm]޶H֞|ryrYb,̤;jvGͭ˙qRVٺ>lOҺ5IT6lEhsl-uhiHqU$(ٜm]A6ǡ٤}C dhI@EE۷Sm;US+튞MJ3߾}C7pyY󼁔^4G ~~֡_h7WO)$Xbc멲AVIKr6+kt& QB hwv].j߽^vPYњ40[ [3j@LOOO';bIEDe1Ow‡5~BSh;J=Se}{C3]h~:] mѱm\-}[*Ũ-5uFnN=6˳z|AG "e6^6Vjk;]-:&Ɂ> MП3?4T `mRhTc >]pNT3Do;VWZS[&BBYM> mrOp4nYLÖB,y)*?䪏B@>)i*<]FӲt)at\uRAk*R/7ղ7ݧ4A[YzckҥK #ּGހ&:S{ʳ:;;d/;ʹk\ξqC-(mԸKhT#-d .2dȽ߹!-7[;wJ٫ghfm]0774{wNl$ZEo9|֙OY.@ۑMNKh" OK={ܝ@ӗpt:7gh{ M„΄s <̈́Ӣt9!̈́s o#d\Ε\9Mg-ѹ3j< Ou uvvZqreiq2mSWкtʻ4-<ԙPytֱ^CVg]!nMHq"m.;Q3>}q-Mcy,'PACAY *(JZ @=U UT]cu6j| o oaZeBM WUUUć5n4PQ#߂<};ԟ%RS.<Q"4nr@iP%q5UA0ɪ_4ۣ]!h@s爖Оhllljj";YT,^Ph͍UTl4+QU߂v<:{B_cp\:q8mO "HD5jH:w6/#/,w Q͒3\e)<7q_Rf!02r:42QWn_lΑCl}^hmmh2 Iɲ`ݡb!qOl>+NWKՉ<3k_ƅ㇏jPAՠqǃ󃎳40h88G\ Pn 鸬Sq"(J\ -Ze qpD7N.iNաG+M H+UzVVj<.[mRU^vC)C3:8ФG+]v%3]$(%s.IM"[NOm78Vr]ɻd*ĉz,u$KO mUZy8vIv/1ыn= [IMpjݔ,'˙zuEv\4*p& -Ų@&hS5Jc(jRNrokإ=BVj)h PbKٌERaɦhӦ+ C^)տ^]D&mwr9>?\ 8LuyuyiiuuuiiIM)˩E+ĐR\^ _: aʘj~W_x~-hs{vThkJ5*g\TuK%VWAxDiuRѺZlIc}?ß$4b 8m#I,FE733IXyf&W"QoX*F(\nYQ> n .Нsr0:n`j) Z&_$x# C[Kj 2srr2s˄(d~˙-[̢)'9ܐYy=iFǞ,4kTxRȹOAmaY4eNP\$:hJ˙L f3i͑^)n-`p MvHDNtNt4A3ȅ08#&awL\EOPuOE*|AjfkspZHEs-z0zh%9b9 9CV/fi8ABUHqYƨXD =cb>y4T6:>*kbƢ P+&8,Jc24Fb)ŲgX cCCW{/{_ŭ*4iNgZ@[+%i 6<|HǞ%7CApEXŶbe-_۾rQ~lߏOn_ ` fl[TyVL^Y̕a\ݿƢ+Ls{D7d=+ v*3ژR;(OFc>iSGM]h93P;@\zzxmzj0@-=19Jmaso- 11@m=4 |E9ݺf2sB۞NlzjSSj{zxAS{;7anJ;S$`b|{m "T=S7=)m/ǯ[JCB')ǝL)NɔZZS>ٟr8jlO9YO8Iq=fi=A ۑ8ɯE'&^LRs SWT8ab)_v;v<ڽ%wi)L_HgĉsȅTd/ qJ#RO"[m5|e$k_hK4f]*~W)pʟ=uJU\%TTV2~''@INe\e%1 Ƒwz.ʓ F}<\8RiK jrP4W8!׼Wm!-oZ5Jܞ'u{qNy4s*7!jj bu!oCzöMe7Fѕk/vrO<^8x&Zl:LS7Qu3pĚp5}fʚkDx/4q+?BՋ8݊݇S\yrp.\@]hZ̚\XChiZc (71`ͅgD5.\ M=oǏ!*{7d'8r[s0/ y֚g￐'f͊+ɣoh34[W[ Z V ͺ㱼y5ąfz<%H[:Q&I=L{yh[U~˯Dp8f5~ehy $r^!0) V.Vɳ$]FUxVChj|Ь IiiBiyyJQ2ќB&VTy]tHcVy/Z YiBP~ЬWlI [-"q!,ln4:,mŖ-[X Kl {o&ouWhj|~Xh֍[8aii[¶ќFn Ŵ0 a@[x#є&^a;s4oh͢/)ͺ1Ԥ ,&MIږi0ե^ ä>흹B3pwC%h,MizY[0mYϦ¶^nVZ^W?QU~HQ%h֛DeaXz%a uTVfp:DC1,Km)Yf[,nYn;YM._ hmߕ4H #~Ċ*TG~ m_T;rǠ)ם4yS& h ZK@[Z@$4ɕMv)hЖu < MZjIh倃a˴UB PR< mvi;YTܡ'afv;Ù69K4 ?h@.∳~O 4 1w|wB/v4  .BklgHѬ%Z;4ޟ̘io witwh Ϳaa.w<=|گc)wǡ\4=ݷ9[g4ﻛVinA4\Frc h^]I[ @8c.i+-P7 qCkif4j4Hsnj̍M7Ҵ{7jMG҆qgiof47M?w9F$0X< u{陿l4_ʠa=cv=f?7]|=S}MV@d5KTc靝yw@/nıWج ~XMLcJ8%8'P8 =اn-HrL/9M% YB$ ԁ((Iq8>NRm@%;,:ItAİ4yPiZc)A1 ) 1 eQ*Q5šD〸]jE<QV VX&@;WFY(ĸ,,GHJ'ʊDIɪSŪ]+F+5,V $$V H԰XmR!qYrX!?mE[%xP ԭC& kX{â6 w¢s =L, edY0"ɒX t|\K’bUvf[FQfK pѵl!G6D0HGL+QU[ Ӹ[XP,9,L&B,Jc-,UFS4%;Qn4|Q #AjeD# Z$MUf>H6"HC(ܪVIǾBq"tA] bEas4F*uZt>SEQ݆=JBrm׭DACcgD#3!(w(0jR;$l Jӷvz % 4wf].x¶bb `+WAA$ԩgp6F3\T^RKLYX$S;eΦ鯾0Fj2}e(,}&Ї{ʴemiFRз*1LpKuUwB)Cvjb%@oޡ|y5Qčړ& sϿMM_Qmw %*H;\Y*팴*fr,[Yd 8/zʩz 9TТWN( /(q ~w` /$vƧhLDˣUA˔+xAP# CvHI'S)62ya&ԓHFM__P:XKߍNV@wBKǿ.t89zחo< ~RBV$@ҖnX/yI?D).;@`R1 ~Em(/;w4}ɍCGPJ+$(Q֋nngcVdaRdFHbQV[O"K>ao@Iz@ܸ2V0msĕ#{nB B2`sHrf\޾rswMbA8nK6s%}pU9JAQRP9_S0.RRv2A^HkGInj!'I6YaS5/ҙ"ϿӀշNHq [$GҭOԥs,Gl ԕĆq+® :P$`9GmQ~I1+tYa|KuuR%dM`-#S."Q]?:zч^I$[2LF ?NSAȑqU0Ȼgɋ1 #jX$, &K@]=N%4 R^yy=6遀 Tl2$!"K %C|9$!%&2Itc>Ti%Ǿpa&(SAbreWnCg"Gy/ {$A$`n'I AzUx<y5slkpUtT"wX kY @j$\^$ :z.rW 40V#"59Uo 1%?O|>v{&& I X\4%IWBpk9W5ܜJtvZ c+,[sZ ~_SHQ$x:'J 4v:y5p !݋i {mE&Tձȡ`j.op}ʕT. xGw#H.1%[xtPȜ#RTPef<ŃB/"KsSUlWb)5.q.er(jRYyC|v2I;ǏYCs|3jI uϺH*:zH(4 ћ?,Щ 5S_ben}MhPo ]gɑN37ғ Gonf/!*Rw|+l_` :)0,:"$GЛM ?@l>q/ZԞS~lc hf@~D;?o[.Ѧ?#+;{.&*2`h Au}O_rVoo:Z0\3Wjyg4fIo7Gw+iGx,A5'*VY. ǚ9>pnFhh=Y$x\9 k'|U󼧲f"d+VQ䪖/'oS7QakqSϧE.%69&I̘N@ur0 śYՄA_QZK(TwՇ9- Za57!VKj(b.kύ-c"ǠrB}4YqfS Mk ҨTDd&eo!9UjtwBJB9O^EtIFeˆEU70Frc" :ʘ%Z#ǖ09K2ϣ/Y<'t0ޙݠB:bt-=E;CjU'p#j21UaD"Gֶ]y(*nI:2L>e fkw2'cz4{ qUSR+0K4z[qG][G2q2y.E9bNx rmV aQ CX1E^8"[8`NDn8.(s97|R \ؕAGˁ+7䌇N 6Ц\,azY5ŤC)p5gU 'Znkm,3lm;;~{T,UINOQ>*wwUzloUZُɋD'cW;pHG U%_1XM̩ F5$۰6[ƕ< xz.Z#T=d7K#ZO#٣:Ag2I5;qV Bdy#9=fNtA]r(Jr?=M8PߧVBqg%ZX*ˉȯxȁ˜&[Dou]jV GGAk!Ei#$z.09B#Q7?cCaiE+A]_6Z @lV r>z@oU(5vr gz ila r5 4H^8URc-YUnIz4{I~G{>z68˕(]_rùUQ*_u>3tY+lZO}38ut3`*t5ѻT G;Bz-\6$]ψˌ^7K~-:^e eDL !A1\<[_q @Ǘo>N'Y; f 6hYV,K OEh1== n 9]Gt-(ouTwx!eeJ=*rh,߻&]nAB b$HK ݟ""{oW3B3㋓}`"WmJ\21Vg)ɋ:'DbGGJҢ}NK]r3a4fUMݶh~/k}ake]{K廂td"&4FEDϏ 1'\&:{^&q6hkU*!F_t>84y!}enCEא!"@d#L@Ӽ`us>HϏ2vmr3^h|Z!?|r)% Z_,2,lí4cnэ\u. ~͎윒c!Ar(ǗTža!l5AH; ӹ4X{ty˧p4a Q`}F*ʩZBȚ }Y+:HrV(`aɡ3; D|YOmKefVO"`q0Pr}6'kA: FѦQls-uWJHOy]ӛW LoKtCGEz࿔ͱnȆ9AI͕s=np] .+n}GW0@W Nnhrڷy̨aS4Aij\JADҪGd'H .$URZhoGC[d(L A:h}4*v5̻ELW9>bt3o|0@qc`s)o[X%,UR7 I Vj/v#{gTfS$)+7E{`3=Kll mnUvA5\ H7:^=Z:W ();赨JRP  =hD#-4y F*B-E|}'?1moIh2C`AHV)|`7*I7IC~V}kO"#܎5_9AtNC~VI nq`WzQJ=wp< [8Hw-?UjVh5{^GYx*_+b+ ]A"}L҃+4 {=T>dt5_O 3.ZeG;H'~k乃[0V4unk:A$xoGR䅯”Kl%ڪYˀ9gS9;YH@Hʀ D%ab}ףih)9$R*kI:aF#4y lg{˔AY ȸE t$\\όz^ĥȗgRAWNfhaeU+!'Ϥ雟koȲr."3mY Jdcl4K =Lyo^ZbՂeZnkZ^7#<0Ede޸9=} ##=Y\[ϞcVNd4;$ VSpܓ%-331{'ӂ 9ט0 p"Ed4X7.6}O0FB$7$.ELۿ^f ~i,p9#,U⬬5H5 jަ4P+N4}чFb;]~G$$eEK |e#m =;wnStQa*6A9_%Iw/j9v(|86.4};??q id*Y'_yμ?=lVPvO?6ʼnu1lX=n7o*iЍ'-p奐}@Gd,61p_k4{|KL%]@m?]EII i>CH F_ٳ$߳Nh&_кƥIo:Oy>Q ?`,3SFt O] r b#p c'AGĝ12[RݚזF $Dn?E?4E^fe M0j&bvB?~^#Z_M!]tbCBjwDA="6T@ޑ"]/$ǀ &y}Bł$\n.d(N% /YHmvvBi& $ʤpS{l}=2'}hcSOt꼗IဘJq8i&soFE͞{)2 {9eV)7RU|j:< T;%ZpB[t宓cZird;Ix$P6 p3=\UKwO ҹW">ޏ]s1n]a#1^rh$`d`Z ,.XpOLGib,j gR*ICcAɈMp:9D[y -IOb[4ơ9f8# '9#7^'La>r}[jnb rGtWR.ٴ̘Mq*m)#B_vSg2 ʕws0o96 ]7a5tx F^pJR z,| FJ9cqė۔/ݹ͋yENkx\#Idgw퐈sxV йUP8}=2:?hO&x5nfݓ.S1㲊5j7=.l  m~.8*su|.n UFwd5^ԛ ަ_W5i: $qbz?WB$mM .+$,5dNf8twI N8 2_|qeI`#EA.X;MOQ(6^/<^3T|SsCU#n5F##Q}jv'H 4lzh_\) Lûb=3l$ͫۢjVtyEhZ?_t~̟QФJW/UlP$(?YeBCM}DJ+D=$*bι]*zL.*[)C5Gn3N֖ZQuznR@:jgd(U4ē8ȁ;ᔋ+|)5ɇTSJJh2h/'ogINLzӝ$) 4 1u_` ,)u:NnM D-4n! jIENDB`PKwL\}QK((Flimit-login-attempts-reloaded/assets/css/images/icon-backup-big-bw.pngnu[PNG  IHDRBBT pHYs,K,K=sRGBgAMA aIDATxsDǿ28x:SŁ60l8I&'DGN#޸ 4 =kyo6ȒV28{PxP+DtE H$Hk{XX;:ߐ5BwCI"P%>Cr @$w,qQYr692B!x(ޘ_DcgɏN;`?3+B"so')*,G] B?IPB-7 fS}㢎cP !TؓS _C~ )8Dx&oeG\3ePEfcBcOkT|Ql&ͼt,±H+7[Y@ BG#""0 -\N܂*4YR!,Y*"S 4$QEE`*%<=jLeBsCe!LeBx)SL8*gkTiиc,Q8W6%[yʄ]o$o#ɖ~9O۳J6*J5Jۈ77`T5O|Bw+V!>Ų1.t.|W ].ȄO%c^0LVqŰmYp儰m?zE6o6=,D\5 KUz WEJ ,}|BƟJYۊ^0#6#/(A{bPayd`&נ S()aP}6=cnyA O`m{z^vvW hWZjga!&ZB.IE#%BX:q%֪h@"sܭKπd#_<[ c}y M[-sIZ+GD </';,gΩc9oHYqJߍ>J4{!?J^R}gkN%ńL)74`SGldbrTj/:XY>.$&N7wMѨ!"wǣG%h>4|`|~CƛդySŵ$uRԍ[>B{]a9I ?e^Z/Hx!@3>dRŅ֑bBYzr>5๪CX0Ej#H&3e36ΉH2ȪgH. A!"j $+gqM 4wq4cb^9_~vv_BbgxA!%  \.W`+sPZf2@ 2HUN3䂺WWRta>琲 E3ސ2J2 'cOW!rͦo%? ލ2ˢ\ Bк4 ~EQMK2[mT2t\l6=bVlp/#v[>x Y?tn]bY \eӢQeUse6YlXx1 .uX-eVZ nI23xq8d4αŃlrA/r.Bq[2kMkWL֞d=0d*KIIENDB`PKwL\7i`1`1Elimit-login-attempts-reloaded/assets/css/images/icon-blocklist-bg.pngnu[PNG  IHDRX pHYs,K,K=sRGBgAMA a0IDATx} dWym3o]3I Vi$0Fa)6ŒH$B©Je1JʢcǦ*K%fqH(6KJ`ؑA  i4Boo?o뾽o;_͝ݷw?%A6 {leF6F)VqzP;xKs):E:7r so /' u=yGuC\'W%@~q7Uh! 쮞_hGWYZQqyT&@iFVlcKqnJyDUHɪ"19\/4L/0XhPôVbB5iӏDNg<0 =RM7,PvJ^=K^@׾yCi-\E'Bk;iz UEs)z'АS4;uo}oM "aY@r֚u#ٻBkĀ Uv)%)zkqO7)QvKZSfnΚiDz+"K_:Qh 卿s6H"y$í~rԨjFV|,3LT6կ%} : FJbEzgM7$H%Qy[Yh܏ 3'\VC>eD* }vȖ2:A^3 {% \P3K 9 9}#{{L2eGPf *y*r|=s+ٗ7$=EE 5*){(Zzp͋H!OnZ'MLȭҹ^uHI `Qj_+>d*W[zTB5J~fiǭst:~_w+ukՄsR !8\%#~`g.Qv\̀jMWH954a " \CFOH9H>sh=lƿ1L\g>" gg)-{!$HEH+}Ys7uE:ut\;NzgSJl AtڹVt9o=oP:4!>DY3nR$/1f19D2^T`QuɨJucsYm-QʮȍETnNv"H%RimqXG'8gfߜ!zU͓\ A|cSn?0K{oRGAIDE>{jrZł-b^Ml]~RЇd٫=3 @, 3jvBRR jR0Y,LyJ%w\q$yfz8M)Ʌ2aw=9v}y'1QP1!aٚTƾ&~)"DP-ʇA ne>ymua(iu@`QIG72;'N|/$߼{;*U#f  ƥ~Of޼> 塺Fܷ(lpDv*RMDy7pZ\'! {vnGNtm3Sp K lÔJ+:Fr+Íq P~1mT8Zt)Rĥ2T Kx2Q l.$ɭ:µ)q5}i\)nmzQk) 츀JK5!Usj+lMݟ*ֱ; RI\!2 zpX+4҂%1y^bi8j`BMb3n\=_]e)mvas*FJ9&Jb0vDmc&^/ <T33U:o|HɁ`HT#6HF4Jq<8|iZE`KcLCA2my\ O>XꂨtfQ` "G`tY||".` Pqhwi,^V%7.뿽J* TD+b1qJleDlyi</>cUPLppKU$/o?<3K/ ]C>? D$.窩~S|3Y(b bmՄ$$ǨR 2ybooUL=I die_⮋m}?TyWb$~֒D[d/cHHd܈Ab2NG5eÞn_tT||?Ƃs[/={6ӷ` feH& n SՑgzMzQOh'+;_/* f?ͱ[1ܛe!֒ydc+ x='EZ'̣`#]lx/=_)TY=T**$F3Ӂo݃>"t*taHcY̚<^ѸTu__`s^ {7.DȠq$;'|Ecg:S?oO8i#(ߧz) H $y6H\97+! G|_D =Y6A;I 6E\|c7uGI*U-E8C}V54= d#tߗtkfi+yAǞJࣛʱ)aѝXJ%UlӪ&7VyE&K\x2KU<>8ŞݗUH>$\@nI!E؁Q|g#-Nw&y3@O,H)6!ы#֟$L A̤$qS (%$>Wt/f6Ndw{ pjI> /ln'j߽ﯥ&7YZ}RŠ\ԒUiz ԓ/}p__Z}>- !3 pN- :O_SӴX W ͛`a%Z}h#A\鮡I DN,[_+ŦK!WG*`@NrĻ_ $Iv(RM~tιWȀQ lUϺ^\$tIgҾp8J}wm`}wJ P bk=s Ujw^~2;ʴ%stJ#La Ӻ"z,юW*DŽ[/^N"X\aa$Ngo0>hԭ娎| 88 ݺUBװރMo9Zb%7yoFP E#fqe̕p2F-Fi&IA7CUfŒl_G:˒%အڎ~~"H 6| 1=k;GƱQ偖ilЦt5ςܤo.\>7l$IRYHT$-ܼbi%s.BmU1daWxD>AhCGt}(e|fqjE$.*žztɔ+N΍+R FlJNXmurzD `]FHnYjs dR&.Hy 3ߋص\ڕSvQޑ\.ҕ,d^&aNLL7:( ׌.Cf͠WWhC՗+4)%Mk,q~*^#r#l>U\X($"A5K:|w{6BoeNYgҮt 0J$փn+ T5a,Nbo FAVx[y VDlޞceq;Dy69 q!rQ]%%'H}V[M$0Շ+jtxwkOD^e{QZRzz<"ZRK-)u_ c=HzX69=8S̽lZ9i-jY缓뉻wɇ6j&@dP^]7:]嫗5Q8~F{%Y;cHu~.~(Sz[_ӏ9aj).f" € "Vv{*9ٕN(Z}%(#Bû6X}G4w.E߻N?ʫP˿=^·~$ӂZ#":Q}Z^چ{$ŧENF,cdtb} IK;RA͌褽3):v$%'?AS'z x:mNv)$ =0ohi3{%5h@ʼmy;t8ȃld@Pv%t>cGhڐ.T)(/S~R2-A!N:W$H~ y .lIc,ͯ%;oU['h8aRcC [1N4jpf'N7I@ M +Lou}|vqPXeF4]{/uoKdxe)1l@GG`WLxQ^?n;cOR^P` Bl{cø &̺pgePJJJǢ5U#o0U벙 mLAC^:jCo*H.S?]aKf"[0G|_{TJ;];?*(P8Wq8=Lr?n9q -AĤ$#zQS^D 6> ݌ːP^Rƅ[T U;q7CI,x|v4NAQ- ])ziveID $U0ҩ6nvNd4moْݤHVpmL1!xBͤLU;5a"Weֹezrd"=ApaVdֆƹ܁$,saCE:*"p<]_:u? Bui9.N9$oy6W{\MTdbu? C@IШtik@jxUY.l}[0o|-qE4ZfiIwZeή6Am21~' DsFoj5;7h^uheFeqH!t`s4[]aA?k[L5;d17{ 6D -\X&H(A( Oy}ǒvۖdn=4y*?Ph|7 ڍzAH~ ^qɒG7#4ǴD-z5weAb'+̍껛t8׵!eè0ZxEx@}a6GVEgw|A<]{P5$A|]6V?PώJٕY_Do/Ȗ o%/#FV{=kmA rm9H $%~wуm+$Ie}lޗUn)ATªd$Xj&$oڀ)Z"- u45`ժ_Oӆӏұǩ8RRR_/!9Rgu nG_J3ACy/H $u,͞Pp<=b\Ylc7y>u%X>'kp l nmsRڽ ԧ-%Yl@==a8ڎ9t#ϓK;1,Y/Ue$" $| 42L)@F;uiSmH>-rē c[ʱϝO 'xiYQYoQjo4RQ56 j?||t5BI@2 &]#$hȎtH*QKQXWt#t'6ỳOVhs4.WF V]?-'sg5^9$#2{|I+*tY 뙻^O[oZuJTA]Ԥ7MIq5>zVAX#'-+@9uNK.7^$=<$0"kbo1K!ܴtWeK: R.L9OZD&Pa,X# ttAx&w $HKm#AҡW^HTL[m b~ÏYU‘T? Wxg  3o(M; BԵAt$?kOU]5s < C#Mhc_H%nYa Z]]^Z ' Y <|dC]S`W!]CH&KB $H O)mL s;uvPت(U(ikԮEvHZB=oQԜ;RABtv:܊t,l(N&*A;<ݕ|$!F,!II(HdBD+:<{ufAnQ0vP%[dR{WaۜȒ=Vh^g8HXZ@;;|箜ȶ<4\ Cxx\g^};Y\3rvĩ ˃x8X>1~oM@$&=" pbT˨D݁XpGݿ*;ymQuyWב %aʳMpȅ-Z:E0>[nk7HR PL6mVwQjcWvRmr(I| HcsZ:Hx4K+%Q}(gcOW륏-wy5@&8;x1&9>l{:}փ 4d+y8IEo! +l 3/n=~YI>IUuH.j;:Ca-: =j|z&Vjotq3Mզu MRpɻ5M-HP?Ⱦ7]=wFRVR?5a0O>%r2WY-=p5h5˕4 w^Ul1lrT?:Kn-Aم'3&O[_:)&]$HB`G$2{/EOZ,‰\j5lSt}il|ӊ7ͪaHWQ:BdxDj5)^)ʯĞwDC{ii*"-Ihrwo%;V=o R/ݘ͜$ |{Y]|4+?p 짳[L~~ǑaߛEGu$&TH&6 ?:Vϖ5QrcUڥCy&:"4OL)D>Ca >`%mAl嵋J̞K/MБ?;o)z{tkmT7Sh]v-Mp"j9ߘ1 '8z]Y97*D{ˇ ÷Nx:EFҸ2Qcj+l0IQ%AϨ(`$eVAEE+͝Mq9IHvp?U:q{^7IV@Լzh rAc4,pL lHJwb`MsؤTrٽM* oTF1 ; Qx2S 3AwNs?4)Z4EfJ;oQ@hȢdATo0)HCM:G]*IIܷze _$,s@:,NyXP{+M{MӸ3z򙈚.Ԏz,>hc @|,f~SJ`43MS%-#i8qع|qCChb晙2rv̊X3Xt@ZJzF3p'|!` !GFOƬ'om$bs Ƙܛ 6 8?'ʹ :m)^Ejn0AzN4qRꥈdzZ+MXJkbZ2):# 1B(rTY+ [󚀘IծpF+\@d쏊7f vxT +~]w W YD'ddέ]΍$JI"M -!J*랾fZ%)pn{zϚj*fm߳5-t4l-tLCkZSŇ@k# A]h?Zq^t@ZH\5ݎ -q=5ҫ_.r}t&gINvoϤ}Zzst.eEw~NL%O6/>9Mf|I7c؟xp}Ͽ(.ųy"WK6j)$O^m.3B{U{<_b2}NV"}%8Si(q?ue=Ъ@D<{wnsr?IZץT2NVVh(ס3}?/C2{C*jf@6+)(P9V^@'PMcO-*#,-ZY\8ƣ=#x^]W/1+!Tvg$f27* 6EyUdѺG]X*:<Fyi1ѳ0.Vn.Q$JH}!,5gXj>?`_ ##WD-U3(إcV@YE<`S'B>Khk9q6}7pt:USVC<`qTTBϠ~nf:v.e*H"b,Y40H4w8G 8?[:,w@~/NzcPM\hu0y*IwQq&ă`pXcp DĘ%x?3^RBoPb{d,qxR^Ľ<.\WtdF]p>`>@m .7C"98tF5˼SZihBVc D"LVw2240DŽAeP\ x̝! +xN$1R*N Dg7'CWUNd!>wZ JA#GEb?XqEOu7 pE ⶶ_s跻$GAˀ\ AVH1j=Jok8f|V-] L-[$ \#xݧqJ"X^@i4bdAFvd4*uxBEFQ2=>Cw [Y7t1AV֊Jv:"JO+9bX 9~Yp"j 'Pk5'yAEG ǣ-(cPS2|̡#`bSAn2y"j[0MB!7\ q :< L1}VGଈʳEK2 1ǡ/`܎'3:L'QPE։>IREtE=IlK\7,2@o+GP;_i*oL 8ۜv &}1Jf0m>^]NUaۘmp΄(Jq]ԥ)xXS D2-JZlWrQ) mAu@TΫ,.kN \aŻ(;tdPbP߇w@J *"7TnF*%CqհRuwi!q }?;K\׌~9@g'[/\7JRk "xKZ^,¯qL}QEhMФt`pǃ3Lq'J]8*&x(i} ^a9~^d_!H٫p*opַ)eOu,Lwx"}hQh!0e`Etbh JN͚DؘUcZ9N/ a,k@(Uw-DBJ(.%d׀=̆=rU͠ c`Lpy?B  A!$+{Se71k"Qur$ׁ#3G{xpǼ/x.Қ:TE8/>˼SYI5ݨ6 -9yK >)&0i?:Bso[m !W5cX*$*LS@xN^#e IkqE 'ó!銱M}\E"4#K[Q oӒ(y0̌f;.j nOMKoHZ2I !zAf޵I \?k"M%Ȭueub)M\_Q хzGӛy? w '/zP%◅lp9%F6 fBW SQT9QIx _)wB!a0n 87X:12Pں=H}zE40#p C2=rG^SUEѲе"L0>}HӲc>g@F s~F19SXM5@KgN2LM_&f;&K[Ms$bq=Dw, (k%;ND@֪̋( cf1"Uyּ jz}J+0&`#ע3ɁPX JG/'UJKsT61&7f4BA&<Ɉ ^&%=&ah"|<TB<Jt$ƘylpDiaS#qLh3Y-&HDtp {Jh;}&ᥖDO7G >r\-L !/8#f D#44ApBlB%]O+.b슋-(̅qe]k(fBJ* p$߃YDǒ)@$53UΥf]4[@9t(c6}pRBW u'U/|ѹZDAu Ɵ,tڀ8QpPtQw`H6Pvtd>ha+? HPs#Xl?l:5 r\W&ymYkA ʓ i&9@*20DR 1i60>%3 #\1W1!d<>&5@)mz;:wl-2 wnp>ǡCn<7Jé2ߨd هzDzn-"WB#oa>6a@Oh[FC&BEf+RB Po7wqY-qu4&hB9 \Ě(²݌'`a}:X%Ѽ洩&#QjZé,tZD.&l<kk|Pf SC _!@ws+=nA0̏d/v(ZXQ:ogbSy"ZǕߒ4QL"LH)rH"#LAeR,` Ʌ29WN<9ǘ[96֜k3[ܙ\l+k ?(K|s̻Xel;TzŌsZ&D)Lk0UNG,Fz$ ۍX2{ؿV- =ԁԥxәLaƤ qߋi/F6N R+iK_T\ȉOx%pɡE"6T R?"o>p5q^JCRRL^mYA<y|Xq`%!dѬ/&4Mi sMJhq G ^϶YLL̃cālHȑVXpْЕ{=)|TG @&ܳ>+w*QV|\,rU*u"p,x|$ft2QvN&z==YVLcqf[7a #8z!x=#Z H[j%Rѡ5߶Dw-t 65Q19Y߻DI#تN>#1M.`RkO{جEL(~ LC'r#;UmdgfGɧ02_MqKy}Tw77JD$&gL+D(M#9803( a`0?3hQgwvMzyhiioEUt4!kji9EswHR'%tM|9m0;f}i";_}X-?DQɞw#Zh(ޢ| MwM/Tᄑ{\ LYғ]z{6N&k&noovS PF2ɁR! ~̞xw \A֗;EV4g5QͼF>uڑ+L޼ymo6a;gNӸOJC!8e-Gnͽ"m0,BTphOSJ<`s 큌:MwErG=/~у m˽H|< Xf+ksn+&t0T1Iܝj; IG-]z!.}I3~iS.^w4ipsg6hjeJA`_ /e92SąmBRhL#JZsjPP~k`}-DqN^ ٝ.\M~߱~Q*4Na@\>3kƣɢ\[9)2~ fE8Z[i0=#0=9ڛt%?[&DENqhX {$JF&1;' B]*^[k&aUTfZxړr}V cRm6u}dC[?P%ER{k}n䊰?}g?imEHJ͜6,xNc)iђbKznkI+9= YlV%W1'i$lx=~zys  *aҠu f!l2~>{“^B2ِ{Әw42GSSse)r)>^w#*ݯ o)-{ISl0K6 |@t mmlɉZ`gZ|PcFÓ=ٙ!%cl0<y3< պLBͻ(d|d{ӳ9,d)^/iЁvɁ>F^܋}nO[:nj/sZgI30] ݓxxM d5V&u_f?^.&(g36m)nn5<ް<-Ǿo;0j~;=GŅݵf}m>utRqBiKpZo\k8V_doB0w`]Qm-'Y&qC4=:CVĤDr✗kĥ;ܩ_6^+53Zq;k4(_hW7'1׋-Mvt+)rSn{G~Bp{ڵ^.P!q^)p@?" Lj8tWCql,eTZ|2%̾ tu:?Dr}p>b |{_j3Dýc0+\\`?~ Z$/?ik0?(}ĊFo`\\΀{Ưӿ%Z1v3` gBtuP[ww*8,%(+*Fb3UsӠ#-wM-忣]Z}8cܓM%r*<ܞ=nb!rcGäS#0y;*|X Kx0Nc2s[$փ](r͞T2Q;p}JnɔOf#xvo/ i] X-^!q., Q}#(Zg .|~Ǜqx7?I/;3B9u{n9<7/_VCePk-8 bi^]ҢBkp(r׃"o_ĵģn"?W[a. ޗr?(arӺ.ߌuE;jHqبm*~$Hϴ9kB 6쬢Zc!a"n Gbҟ7`F%<O"! SgpŬ%VO`9qe;A9Ău Xfʫ{CGq5njH ԽTMs]WH;gwu V;F1[]TDI-_1U/|U瞭 [[)&‹+V3=buԤ.YgVLήX}QߦhzNEX"|g=.Sq;_ /귘éY1 3 \(g5*~lęPE#2˽'+G fb%1\zohqG@ѕ|è1MnN ]YJ6*v n VvOQݣ?:4ify C|Xs x4_.'o;H~5dyW2x$B($u8%faS)BD~/ zN{sQYyMQl"}Iת@I ,N}WhuQX>ۆbeرk`Ht\ey{轛Whǒҭk效Ο&'C;5{8ɝВ\a_ʋs83G,Yq}^R5=xP8K(wšV}>p89K]hMkZgG/5nXִ&ҥ| Q%ȗ^S%?Pwa?LbtSt9bG#sT[Id醷M4::}\S'DvUӱjS7Yb:k:]bλXӲ3qkDK=RFז}L<4''|Q{{Bk<<'3W qMwGۓy]D Jv״rNvq]@K*n^S@G1{Dz(7Z@0limit-login-attempts-reloaded/assets/css/images/icon-block.pngnu[PNG  IHDRiii)|tEXtSoftwareAdobe ImageReadyqe<PLTEfm*/@ѕu{f=BQc܄rx뭱^ھ:>NjpFKYeiuQUcknzIM\16F6:JaeqAET,1Asw[pvrtgnnuxolZ^k|kz{n~jܵh^and݁ոΈݜ`ۀnq}ho\z{~krms녊~|uxw~ruٍ컾ԕ|pv+0A.3Dy|̌KP^TXeXVZhNR`д/4Dǭ͎WtӋƪȷƼ㲴ҝ38Hɹ硤hkw—惉7;Kòϝ~os~nѧCGV¯j||i݊Ŀ?tRNSS%IDATx}@g)on(r+w5w'wg<{UA8rrI! C|w|/DcQ!Mhcczٝgvgvgw_>ٙ{{a8*߈BtWImmݐHU:DbEf*d}ʚĂ"cΨuU*Y_;?NbU=.gcUi3ϕiC۬uth&I瞻=x(ynW-JT:8ERvt3j;r.7Hk1eR7C]-5hthsH˨Jڢl& ]9QN|QfX8'YpleT{,wҧFuYbbWf7PY]+Kz]|Rq ia)R'vHp2cP< Pݲ p>ʖ.&i8hkCft (%o&Umդ<2t?Z13 x`3;F{m8QPM6K2­V1/Wҵ喡'ꙠSLT^? kO?jf=~"=њ(.W[ÄWA+ܚ84S9Og\%,'Ǥ[ILb)Sv)Gu2!\?8gS-sDR2\>"}; 32!NKZsb0klAqe> 9Y<#&Igl?*Ą[(8>ϑ MYTI ?IL 7*Fr0!,St) .cBZZ+;Wl q ť Ã^P1&&WJ)fHDH4RȠJi Ib1">)#V/mP"olc*(h!c)2noVYHfFh ͔gi^pUaoIqg*9/IYGҧdnVlD]~'"/H'KUZ]xFMq=:t'#uމ;c(Lz~pRLw5y#e忡 ŅM7Ρ!ɬXB= ](FqT2i#Ρ j*JQ {IcI *ܭpA)@r@Z/:A %x'E¤oғ2l?jIp?v'M[4NngStR&snxҹ((`I7PC~ICΣS{?#ْndU.EǻM+H%ؒGkJjlIGjv&tx~&F^i!Io%%5hudƛ^B("QvFZHz)e8' $ F~X{iXFȯ/,S"cm1 \PK)c]rqr_A4Dtoz c !} G9Ţ·Uz(9 PNK5cHK"S34ꡜbt/)'1Uiߝi\}m>:٩ Bdl^4.)*m7栜QGѨu]ql]>aL[嬘fzܪq)!UF;NLU'xacү¶cUap1Z3շiN6bYK#o=}zOlL'ӝ#:uE-JHEvtzj[؋mllIǪflLW2+V#2B%[ =̤TyҶc[fNj&~d%X^U4{FYܾ]*d@¾hcWL;56`2' W~l=%meʷ_I1JI z%v7+wY=[8v1=7ӗ.%_+rSΘ-!M{4+qt݅]/0Nf8F,%zyǁg5v!I0 >7slSУ,)LݭnxHCſײ;TV&{l'RL}ȑ ubv_T/7'H]"AF- 1 pb&Z5 x|f󈭻'ZS##\ן@eDH.&1liQA'onvY3`Bt/:5C3ISW\/rq /J+]5F"۵fj$H8CY;1~2@u$*"/p O>sO|WSsGf#AH ";Ai%vN4 4$w(ݖ),pN,5@ҵF< bs"䡟}KH/(ġM9Թ" bчe G-O~[.NGoG%0@vtP~ MDES4Mu95.ԖU;Z4 f$Mw?$ۂtdϊ;qq GׂB\v~#/\Ƿ1}}!|6b"k-J{|j.?kr͙1$g!M&>kOz$zUoEd|ÅOMa+I}|v?$2|2l1I+lQ%F.'FwɼFU*' D!t^rZٳ LC![](`f^R=0^0!pyP.P%LMnr~'|Z^@=VMlK'3^qʳc I7'|r #׏+jƟ Hpx IQmF;_%f] zçwzHK|TOy9J#gѬf 41gs7/ȡrcxiĻ z$Gz?JP3 T{dlAhW^1ùG_J=iTOL2¤J[^4tXXhO/jrNgRdNXvᅗ)(Oo\$KȜnw$h% ;#.!fkroKQ7qnrI&=FJ2gRyC.h|R$q7/x;ĵ>S!$oe_;GEa^ҺTvGR=!9%R3i&c-yP9Nۡ%c>Bx ϏDN཈+%J`5"%=朂uq)@1&IK9b/ F{:TOw L8gPH p\b,#͇D=/P&qnI/q|dwX邆4qʧ9osr+YN%*@H&p*N_ϟ=6*kۥtXi>))v4aG`W.9?qAkuX i&KME= )[5DRKB2]5>yg(/,.*LБ&:.}퍧zV_=#v<EJFrUۨu r.œ}꭯ꭧ~W]FV>y|8]l<7C&{K?d4$W˹a) OH~i5f>& 6) )1i0ㆀAlsB?n˹WJ6 #E$f'x} *Ka#VtؤC܎$v2p]Gx FXǐoqB$&8H3q مx,<&^$.Ȝ:&$HN!F[k&$Y7Jd?&,=MsHf|)Qx?2q"-l{?Y #ɗ\՞։=~+BɀzFhÉ֜jcH=>r8gܼY,2ZtA̴x#bF[g'=jq5&d{Yڍbu91!G+,:?Nҏ AҌ_E#>%絽[o[ - IҌ?JdAtҳ9rӷ sxGIW^|0w1%͟OT˳+`9o2L(fN>Lb &2!N1ıH·5F&I?qb8y870NWTwt@PL+a[JKOhV̤҃#Le?tXk7Nḍ5ԑt?Gcs N?f3-(G?-nrZhk ]#я{DE!vHFk>a5E!KͤL鎬 ߠʬ1XQn"IǠ0s-$}wg%[s"c0*ALXqcCʼh)Q؎j56+2m2vf X3N)՛IЏF=1E?yc]';l=6mU5IsM 5 O7ytΝ;9.?J2")"] Dmc,z/='X' fh Ҡaj'6=^ :u /;U:T .x'׻_ǨW> ɼ%e9ޕfekn^9[LdTu# }rR,DϠ_S*J K1P, \8 U)Gh5k)"ڣ& n7a{诟P>i' ΁-i|RGұ,-&*b<Is|ȫSБs" .=JH.U| PD(x9HQ >y$!H^P˷9憡P7y$@]j4 9aҚh:';6iI㈼Vδ# ()o%6in]w2@S0%iXޥ+,in/$?t7jmOwI;ztyW:xΤu;}c^Hh;ҸrFR^[/%\Cy|I:h{x+v)%^9Mgi[Gg*1 'J'*r8i`)5O5pqEmؤ ֱmvXDwzzSKzJFeiTDtuShD̀0HJ_ Opw9aA Wnq+'4ٍ=Lӧj'f?<;HsEP'/+ 7H7D4G$-lZIznI5Is=)FqZ؊vܗ3bS -AltE^г<$[js+k<%͵V[̤4i6EǤJ9Ɲp>Ν'ؼ: ԕ]'%6a:  xGijb- 'φFK\{~+APѰפZW)XG%geN|W;vPf ' ia q2;RzU ~F?IAQ w]O=,# >k_4w '+i+XaZ%&'mE]Iw?e&c٤% ``=o `vkBF7yB;DwLp)iu yw:p eKh>W;rRMԆgk8Isƽm 5s'ixoMEKynr> qsyBM7#YGx#\Q I!U>fp>#Y}J쳜p!iڬAmS˜&ܴC`ڏZAV礹uK ZLbˉ.r~ q({+\-]}5{iDM,{;$7XnZw%NUZG!\{zfϤ9du@ qZ.ٜVkL2~2d9AlfsJU12@4ǽRc3O,9-:N=9mRֈ^6;c֧lȖ"Sgt$Hsu^݄œ{wXAёHfiHa{Hˇd#/i]k7\6mgnh0KFnҏu|{#Wk(;Hs\𣬣洫/1%PE$(E`& ئ=[bUhc#Irc~e(Eʫ>`V͔C"+[e_]R<#`g7TY^5##(;=xgXUyg7h(ism6tthFYJ6+#|)m)Q/H# Aio4ʌn Ee;{_Ww㗃jE8A%>oߓJc{̐'F VX}QN͹n4F:GXsIENDB`PKwL\sh++Hlimit-login-attempts-reloaded/assets/css/images/icon-cancellation-bg.pngnu[PNG  IHDRX pHYs,K,K=sRGBgAMA a*IDATx}yys "x,,rRDIVE#.+I*]2T9\U)rD]eҥe 0%Oı{{==;==ۃ}3WhllwwC"A jmڀ E'1#YvRlv9N!_lŶW-HrLlG Ҝ KA ~V0 aA#$Žbd;Jn$ɲ!$%!AtqE "IaU(r@QB"/ve W(%U,N(!2A{bxDI(DIȪS닎]J IP H H*Yaf=L;XW " TZ'A9װFd]"},,6$<k&%ƚI&XrX5d^,e[rXltܥUaU* pgFQfK ѵl!G6D0HG{bܪd#fi)'jGłZeaa:%6$Rka WaDK(݆VfC,HZYt#-Q--UVda݈"M sZYt;Z57s%E/?V VzX5KCibYEᾕ^\FYakؽGk% b#eSAT͵Um7J+=,zuh$~myB(mQc=*A"Aqna!_?`(ha![{¢ + b+ zȨ' 뎀j@8q::9yԾwZldn zcd㡃;ؗywXspy5W""XWЉ| $$6 X~S.t|'h0)'|xscڮJ7S;p_GE~ecnw%HzBZU+3ghGK]-^hqƣ/WxoKjPDFߣ*&S=A*!I$ݥv #ؿHVBU3G9ǑhdB\x:#Ȓ$wu}B."I*WI\'8=߶'z-st{f JXjWvDnN7C 4GDjNBڞG^W$`& zUB.Vة7 U?^muQ,,$\\ p.S?Ӂ_{ 5v%|Х}îHdA`Y*)WJQ)rrǹ,/o{N3±!dI2zBK/8thc7տ0ÒЀI)l{ d>fO=\?+=PY/wcXY0нt_%tԀs"'_Qy߱H~b-$lnEebQ/?6{s, 05#s'U*sS$">r1Vyb3Lḇ/m\7l+#š1eҕfn@(DŽe8g>p)?9.cYl( WF]2QpjvVKi*В #s(ln+^͚~*_ d0PaJL=_4zЩeP9X*++:jAbQ]2 y;TVqUn$B#aUuLMN=mzlaSEV@r ~a75 $I2\\st[J,U,-0d"eF j !Oc$A.lwžyYU:]ph1W0Jڲ5jvY .;*׋ 8JՈv tgbj,ڃ\a_Z”0O&9U];\=V WINg/fNedyoU &: mU:0QfwKe)ߢmxmPUϪ2,bR buB\ A8+Wd j"1]8kXwS -(31J'V~l)5+)> eYn $݆ItV\]Zz~!vRe9G 5uiW\YV;kEKApZrN J7A+8@jUNCi7F+ۃ9E,CKT7SgUG-Fc;$y[1%3s 3 "'9rK SYwS}okϭ{5قj$DuRlmڬ!ձ+Ô3 D WUNi-:Za1fӴrYI&Cb?<;KEn"]tIc/+~!"QžT7nz/.a`jk 9ilQP ¦)|'^$f?t\y7~k.KVMlةN|vSYUiցxrC ~I;kͲA %^4 p[S7Lyk=B ̸|3#.@eRuGS>%A}n;Mx =ۚ<@!wjqńW䍷RD{g+c8_))`8\Sؖ2!)ݪXa>Jo 3FF qS^)<5w#FHJ;< '\s87NIPЌ6ăDjExlJ~'K_BU4s|}ɜp03YQ#5RdM=<,}k/euqYpCtϢW!Rw"I~jt18U򱛊 "?7s[lc7/>rZGRߘjƽEF>9]c GU2H|PgsO͞sR-TJ$'I+hrߗѧe1e i@ǖZ!Մj,!i5xLӇ!4b[4c@}v#'<MSh# ATJ' Hүnb&ɞڷJkrYhÏ1@lQ$;4$X18i k V1/wCmWzq#߲@{?5Œ&)t=g#0:;u7hy°G4ѡ:Ycmp[L:Hj>r05Wv[ZJl/@y֓ S;%, Fcm7.TvS=HwRrr=h~zHf9SɑsMu/2k i 0NuCx3ߺr7?D/"SK=ٰ:$) _%i v:m` PU]씰#{>q} IL . ,FZN$_Ѭ& 3SMoX4m@{CD3L $[7ܭzק$Q*Ȓ[HV5ܵ7kTa3SM^h=HP:#qwU}H@6$Id[AHAaSб H^_9K rjX7Z9WZe),91&I&ceB{eϡv (5 ";]~uLGc5&UY\^Vr5{ܐ!ZXMYuYc* x\&&N$ IaKEv5vHPvZX-fT0sr..oZl^fVv]Vb'kyTmٹ%Yjs*LřuX21`zA_2͟[XD֬>Z$U-E VI*6PBv@EU;,\ѯȑD=$ t='׾dY/B`fF*tiͮ.!"Αa0 uΩhqWx%|.6@E7/dY?$@b'9gzWr@|F| r H$dTV,> gK))4[D/s4SJs^92<ҥ_n>yG%Dz**r|T,6|s|sY"q;JE[rs8C]=S=.%H@Œu_3`SYmu&S՗7r]O r䁓mNy<oQi"Ȅ&,Ruf4R Dvɛ5xz48̝rhh7k"Wݴj}J:X| Fo5Wl'%]_/0U;s*>PXna0Qm5b[ uUeX3J *jX27q\7r\J\KH2!"\D&4/̙\:RޠYK[ʚs 5/Q00V$GyiFw/>6#%TOm}iAu$CddjP.}`uFW8 $ZYz@#30aC@771bg«~A03YQ]]t4fqmȪib9y{d=yڻ:bXlA1}13/s}3rj,9рE̋c6m/ktɕ"ϰI-}+B=}wUW 'q]8#Sy . " Yrط̝ғ_*URVe%09*R-=RxZ=++Ud&[W{fPP+}4|my!zK\SFRF̽MnB}Ao:|os`aXQ7}Gѓu ~hVF{Zbr 7+sadNn^W9JhýX^ ܸ@\"l0cLp7Bn unҫ16:vY͑Un_Zͽ0?ky>,CŅAÄ[?yZM~Z:ZҼK%iw+dу~D4ĵ9hj$)O0XD9"V0TiS?O|e/Lug=bw (b3=~@Gҟ|a.}m%.;(U)=$Ix8A˅#<Aq;WأÉ]hi [48VH Q$1$l$C[n.{pΣزt>zk[]l}N,gh/Ҷ #t4X8Ejk{. kx79blgԎT= Yk%Qppzn-4"eԨj. l\ ) ٳ$bzHO}+ܖXCC^ڛ*[dהQXM^;[W9D:t6ܫ9֠1_1.o㌂Evqkt z%ZtrpEa GDZ_h $sb<=qZlx+] '1 !CUҶF]tEFg~A'4=V,]3 7+5,$*$n6 P6l5, _?MM$ P_2#r,7Zu9AlwDƬ(aՕUm^]տD/ȉҎ;fhy9DHf5aD9.v9.]A$bEϝLGq#&u#ɀ[k& t=fuB㋼(b'po럧 z!^Pgsp&#\ǞpfZ9_xUV˼6(p ({+ "-pRKD)~r+l (nxH}_BȢɂ-Tʂ,E/ UE0RГPe3+%c4 O?VPV('Oyb h7&JnN)bU.peuNuQ5D9Y~,+aySx#ՍvxŸTw TjkE,hcuS #P (JEgF:g%0 nYթ$Ac3p+gl8$T"|V Al*HRI Ȏ(MӤ7+Ԓk :Cb Tay9%K>2섿I=BS{ â&=zU%>n%J=!A4M 70sy9 Z=e_J $ 6 }|5FK@ZeT[Lq^ ?Qzy^( ឹXY9*N:4]h #pxF7q|7 h07qʼxPT39xpDV)Io~=y)vA@#tFQ$YƄp4zH7jyJ4q2Y˞=Dp"L59BD@%5 9\c="5H$UZZʴH ueKR0jdOD'M5;!T-qjRQIgo rzQFxTYE?FTS؞v_Ix}5'$ T.BN{UZ Qɢ2.?:H5y,Z#-]ް+q4QQA 6'rtpzLgjw ݼԓvj4z=;&Ex-k;L]E a $) HD,,VIFcG¢DI#AEo`IA"kX.hJ Eob @u^Í/6kim^ÊӊL7˺|-z􃸦_" @S)A>f=Zݎh5z,0 ʣe vn#qF$,)b vn]ԐZDE" VH4̪Z]Cqy 񴪖E7 jVfaq  %Q4->]0o@sUX+%#B/Ana {m J xt%IGbxրui#fIbfrgO{,,<)`XF$bs4b; &L,RHrLz} P% xuH ]$bzR>i#"XWz UEGǩXb8ԈjE,$Wt %E vݶ 1NNKW@j 5Q( ~R׀juN ;Td?Ibv'B&9cCv4b(,{FK3B7hcf Ҁ$ ugj;c؛@F-bIJnIENDB`PKwL\Io_Alimit-login-attempts-reloaded/assets/css/images/icon-checkbox.pngnu[PNG  IHDR``w8 pHYs,K,K=sRGBgAMA aIDATxyPont.t&Nt@7#AZ'BrSmx;ps(@DDDDDDDDDDDDDDDDDDDDC#`Wߩ=pFX, ?^J{X6e*WŸVT Y_~Ԩ ~p+ɉ xeg#_OR9 mv lGvK 2T×i; b84s %}0"E|Fv x24+£n7lЗ;e39M/{]ѪE'(<[OAI~X/?9F^NpUٜVn@S`^BWͭ+8P&|T(EKXKXT;|^F\ºU(l/[P+yv6 |1nw{F`m#K4$lroY;r}Α$(limit-login-attempts-reloaded/assets/css/images/icon-check.pngnu[PNG  IHDRF pHYs,K,K=sRGBgAMA a-bJ) UF1(M['j ABDQ#TUA%*CS4AqB CRHlyZ~{Μ3{=qf9wd|̬3{߷#%!#ɪH:Uo.5Rb+$/iRB%)01xmEddTE"JeMN>TrabĖHK4/_:ho(8wRt18Ӭș ##Z9&DTl+sפD@jMع3AY;v MkquˆhsZk $>#k:Tw;-WIW M:yOt "k:Pׅrg7׊}@4\2rD]h roȚpaz[[ ֏UP_:VϪi uiX&.\Gi"9VD`e`eIEt~8qK]WK^፜trѽXW[īw9Fz7 ֶ}|2zeqgWN:%3켬˧=h\/xMnjwg>7ό%?wz)[Dx'(ͯ00M{%w?%wAzyT2UpGIA7@ˉfњZw.~^wnSYEX` DXqJ @X߁Z/8W}~wRh~Nx{>I8 5XHmʡMpf^%!+ԾJ\ucWh0T;H.nB!B|]o@:Xc+'}9 2wܼ[:.?EbIxhIJAq b?+%cslQop"('GO4,`)!_}/ڕe1mK|-`*&+BI}/2r^!WO['6HABQ2A6w:N2CIt7c7eu}KpL/DYg坶9ISl XV6ӂyR\@z++[#6*J#UKq,|U!Nj(ƐF*)FOcnFЗ*.$v%6D![г^}+ʾc_4io>If:`e(YOPw{_Җ%DSmR&x.Py5bOޗ%rn6 / ("ORF&A.|Pw1t\bQ\ AHAe{>boa2a3<"A#HE1< \2pqc½y w }c(,2i |_}:k^9Ff8} \'_Cj3 1uyxK_<;(>GXkVj={C@^nb0c848F 7 SܼTO,ceF,cի47<D5jd*q 8(FA@J牒âsD\2h LKRQȴ!@6R@&>!2\])sJ6'="}#'(tKσ}ܙ|xGܘ1; <}@Q61R(:2,^٪Z xNȱv )v1 Q8p^9l:~'pj,Tŷ5 Jk*Q/vTm)S!6=)b|;cHy9+'ȂPXdxdJAd#`97`#s1p:eaP^vb}I=5IXP%8 * ] ,L}A/C4m>ײ2;p?fc\k_'pҨpw!Ӎ*&IvhjʿKXo>MਇKWdBAOL4LY%Z0dUh:avzay}sΙӪU|n~<H<921@H\Ftu~fÎCH*P4X vM‘N7۰)ޥ£ivf7%57`P%wTV:ԕXNqqbfr}.}49~Dzsw_瞍N|%q{}5x[yMlwQ6]=OOr<>ߏϽNbTpYh:r^o߽]_Z1'gZ$j}Z[#A ǟ{UCa&e8vۀʠcLfX=EaEs @vtB:te<:&p ,@dscJp!(p9tM#G[ݔ'uZ TU?ڈsiWf93ʙyCk\\- è:Ĺ;sS>=txkP\nd|;uv.[/׽|hPK5G>=Dȩ}& #i;@B ֪ '6mB΋b+KᐍKl|*4a [U`*2]Ԟp0'K N ӣ8ËYJt[q c -{wB?zߓj\h7ӤVS7@wL'8Wi!m$@F˔"\럶[f"k5: n7(%&Ά?z @LdBu~b)ŮL`W9VLywKiRY\Z'Ď~I2;&gG̉ACơkL[Zɇec}4b_f}cQOr0p9_Z+BƒzsZHb G+jxy%8ë?] ?c? pLluQ]Ni݇ƷUYnYfC8suNjpp5h " /FZ+ˡJh\zz ?Qa!~>(!"UԍwcyɄJ>^Jּc\Ўsfc=@­i5IP\.x",н2+L0RX _jɘb1Uhخ`+'u?Lᆐ\#,MB85Yp{,*UR%uSˁQjd*A] jVC˰@?x0KcS/߆շI7HcV-$DiM1nyUCpf}ˀy9tPU{qsZ0z* 93Sl/܎jܫq]xǩZtuaJ{|)]E(Y:8p~fULƁVޮ*X s9COcJ6aQEx?9a 9b`a%p5IJ4D}_fqoytn;+'3J_l}|Y}">{)&<Dc8|P "N4j˴34?| KT qC>3|mx99%xu5 &cNf&,kfjT=` u=pvV1lSXHO;c 6/}N'g`pڌW'rxT vC,XΓ7.|1ZlS:Xd?b?qE݃͗ؐgZSxlsXBX(׆={g:nmn.֝Q^fvU^^Fy=i˽hyzBf|)TX}P˒C7F ʡ0bdV;/&<݈{=p׾lL,@ z`f.(_O %e޺+nO3PQg.+O&=bZQBV˼gMܟMO4xXBߧë)M(ƒ}ؽkiǰXbv hg{Tʐ# *E5<";൯tiyFfpn~8ӖqGYPp R^V<~~ &6C첻+4 O)Bi3LO7n}TV1zJqT0 a ѳZ_]$XQ.Bʃ0nX88{,ӚҪ~.ڄKZԽ;uQ*G%c^ڈ) غyrf7 DO qKQRsbTG5 ,+Q@A}׺*2ҋ#Dcdѱ8$D5O4=/O07k*i,K&xzd,Pbcȗ˞AC:P z'[I؂n(iSIUS7וlt>$m=hjL̿of&sdݐzx0c~ͿK$ W.R7Th*8 }V[~jXJ ls=ض^p}(,Vǁ!ec ǎ7 x\CK:'7c)AJ`@}1uT'IḇwZB&] %Q>' oqZSurͫNg ~` wȻ 1a!-t:&y`ራ'˪ [>T|'l1}k5sKoΞ1F'Yj Uj'򳔓 6%&?2OՁ0u7d IWc%ݐ #Ƴ u؅3cH"c#XFLQ\J}ĝTF dh@Ջ$~trZbO`Aհ'9$OLJZKs U⹞Ɠؕ+X>2VB `B>o0T2Ok#P 'ˢUƵĨ荚K2Y9ZX*62abxտGMa"2WT,DZSJ^`L/,u8 ;zN})qQG\VE*HO\Ѝq!k=%YWFl1O/B=s a !(G/[tUCK-f!?0QIVXl]IFխ q I{ #m˛ayU\܇>jeZ)?l!yJBX \ 祪K>;lu b07gء`*L:wawD7+ݕ~B?ēJN>X":rSzC%LNg:RBn[?_=L͵zbv‡Ku􌯛%v?"e/xȝ 4 ނ?Բ!vXTnh.8gAyTLuILlשZLL|{T|Ox dدw_OkP3u*Fųy'3ܫ%#_[(= $߭ A߆ V t=X`Y5H"Ybl.bg arρ-nƼc,Xy/?ե>چؚX 'Yk H볷g7_˙o5ڣh63!lj ;-xڤ-ȁ6X;^U5Rn՗6Ӥͫ"<X5閖&_9Tg ]$ {vkZ6 \d>o|vz:RCjz8b/Ad_Gn]f2;@hzvb 9)|<f\YmPb"yuoi':QOB!ni38ϦIB6juGo@gJ)+$j#bOVj9JQﱦ}8-a՛g0Ps>D/G`iֶmi7YWmA?4)({Z ٹq%Je 8"tnt[]"x-j L`};&rP96cyci*(}~eJav轆A#4.YK%m| x&i]TRV!hh \kGPEZa*}g2]^xrw#^fJucSP]N4X=3`s+vSnl(P5 *xC@9crMMef]hto5[gơE*w5cџOԩ>!6|ISn`cB\wkv!zGLg\V4u?#ǖ{l ywGy0~|unB|+S-^Trb숍:0x+eǠʤFcm@#)G$i'0<Xg_†:Q $B}Ku O(` 5*vkπMβ۲8HXz!Qڇ_YRKi`T$lV֩}p`r*>f%٣tqcUPu`Quxn8W=g:DigWIBd!pĘOI(SK.A=,k΁?(ܾqn>tDeysQ}}@%^"Qni'axJ6UW%G`dk:t$e<]ғKk vy, UQ8~ZJ!* }ot\鈉 oY9zih镨PS@L֜:9 k՗YZi)v> !/_KbxwkO,mBrKJ9dz-y鶲R-@IENDB`PKwL\ *GGGElimit-login-attempts-reloaded/assets/css/images/icon-exploitation.pngnu[PNG  IHDRX pHYs,K,K=sRGBgAMA aGdIDATx} lWY9{ߐ@ QڀS;-u9kvۉi&j ]@wKw/AI` @9gS Su[uz5s "1r$rB2T.NHFJ88&x< 2N8S))nqYR b% IO6.p':RLZsf"Ja^*NK+ ґe]O@QP`$+Dɡa YB,xeRDZ\<(N.73\&Ͳڢ8vLH!)䊭md!P$<[r:TZ/U=!P$w'Z3E#T=rKd2-Qg,:AwQ!'[sBq@f׾ H5ZPgd" %ȇOZŁ`} Hx9yjq0^2ڣEeѺ)XZ +îXlVx j5$ u/ѼG˛0 0 CqUGzaG:!^L’JׂCa Ndvjs*!!okëo2\'v8|g܆oy׉3NNMW*^!iDb^e`{>}9{kbEU/J:qt޺>2>cŏJo1om =WzQY(`/P8GIth8,T@b0hdg54青^(/,CdoC+$9:5ȭ҆v1f 3`Mƿ1Ŀ_d15Xr q5go,Ry*Q V'6ٟ&[M23#Q@*{C5͆yz*`|$2AԬeC`tLFXH0@^!bߖyC6>OUx[4G퇘$y .ZU3JGKṘ X =gː g>qWr*)sfg@63+\.nLm\kH#Q}m]| md‘4rNw HGqw*?y̘p{cm- [10hmx$F Ann_^'k{dfMh?`]CHlscBZǿtq~w &;f91o I׋OXh;j ό"ټwbp 9PaFdkG -R\'wJ`_Qyxj7?  ՞>}K`7 Of\M/w1bey :hXf̰ Iڇ1pჹg".eWq @:M3Wˡ\J1{Թ6R{w{Dc)?]{&4a c%hrX }xv69`xC;:ɠE R?X(8f9izH#r0T(H!c̦YQ$V r-/FH\51@N '04 ހ|(&L_/n"q)auLfȏC{ C{猗 B8(C .TR(4'L~ ^O겑}f5U&0(e('NL܈%2c=2Eoo}wCXq9>;3[+pb>kx@ Z,TJt+D ɊK*#^Pr?fp+&a@sPY \~`6 9 P a%+)gZP1B]p8ύj*  S1l4cCTC&ѹgY ϖgjjXji8CO1oj"Y㯮9%&=(#gmUY߄wBށ0)fQdw,렱F 7-﫭%1*:8 909C;@{5dd-KrX$ɞ@NN`{ c<1A>L>z5; n&SyNFCL<:ʤad_٨Wf/:؛E R+D͑"5(ܪTo>,$m j%F{_VM_a~pJ ˓ԠfO43bFS ~99$0Fka&|:|˥(Τm̗F d8J&U8vzPǠA6S32 aكin/05H-_7eٱa7&P^ MӪ GC ,8|0x_=\q t%]릗5CPgV8r9Lb~ͿSq auBv\|0a}A˟R_aax[cd,5݁YlD2ZR4rn wI:z1aqDLÙcFg?\_6g9Df"/,n=Y>pkC.gbH3[kx @ХdAv.TbEv3l7b uHf%V$>^r0ZЕFVak.+'cZ}M!-f@9O?nI'ʫp0rWdӾ3Aa 1`4mБx<نij}EZga}/zw4ΘRd5\4BUG(@bA3Zչޫ+ TT$b: MP"W5Z~Ӱmx[% ^*^r,v(d}3 ,&5ƲXi? 'f-7A0c.$}FbEՍ3„v woM3Kt}UIlvg*+cOM=QzTt8Օ/cRstp5\dw {L 6Zڟ]n~z8+ .uJϓ_z9UIqëp$a\U^Kʃq5¶WptZA .j~ER}ɐER7kE8.#=Rm3ۮnyR|xMux>V.STXA~.)'trq)qMG7X,\R nc-!#-e5B+\+)',Ø_HhY;Aowp:m%i3qJ1><B s$>!]S?aaqL:FA_ps]<+,V;E;u=` h;u:>d:U2,Me`B|8YLn8˯ūߑaxIHɖpt0z'oσUp3eVƣ辻X\nՄi`{jmIтalpO!"(̞ !|] ]cוN*Ł3lLWabƢl@_n:,<Ϙ\/ʁKQqfC9BG2ď^sW1 C`:5-^錘= TұdqѦ&pUBZГM^%!cQ`7a/7j?6+Y\~] k8!2R!>WJ_Ԙz!5A0sYz$e eI}VH0_ I8Y^ fE0o3:T 5#?W'Cm0$.Uj֕ЎqMp{wϰu7_@4ljqo)5jI5}r~vT*2U5HL{:ٓk<}@`|$tAw5W[fy $H1%2_N/ `OkQ)_Yf!lho#Vbj=Us mmZ) $?wV> yc4L]z,asޏ!„B:7\."}L;,g;W@4L?ᵰCL\GLt ((h/xA v%%*^Iݏ I15ͯkJDk,P̟Ya/.yj^':ZuL!5<X#:u m0^ypnƝ@l## VͥAhZeD5k}̃#8.͝ʧ+|@M,?l@; doJYL^#% 7ד[]k{a.i8KdV0?UOC݌ɽD} ?H5D` |NОj˴2~'&= 5VEdjZ>1`(-NFg![CLx^,ƚ'UZ)KvwM9/ր ZZWDY-Of1Ia^x npR%d׾m*p– `C̅f A`O@Q8j^" l}$⤭c4_g̶j2yflhg n+6I7i l'j<GKo4죐Іi2n]Coڱʝ%*AD:LA!ym]Tᰜ-S!$2IMCޅAɨ=GA'a5QgbÖ%_U|ruÝLAtڍ4Ahmj66 le%E.-|HI5}l=NϘA팳9*ruI_.-H|DFZf"Uujx󚺲\ŊZ<̖ɓg)1+MڷCؿ/51J3z0UI՚싵pdMO!u)*5"":i>C?B8fkÍ \.4~ni%}RQhe>OWI}Ul`f ^$8@ȕdI%Zrh>.B}]7f> K`ܪĞ :dߵnra;G~k)ce/ ẅCgYɖvHzOVm}y,Im |_.M';eqO>(͠AqS麩'H-c'Bs3_;cԐeXiZ -@+E\A$ۻsGQ-D ;Uq@zpf _xil#}Ab9 U1F>\S#Axn_m !a܆93fܵg!#FoX2نLT&o4ˎxƖ=JȂ4°%,{.|j#r_ _Nae,fKMl,VLBgA8I"5FX Ij$ YYuͷccj 5h.K`ȔfZcmX[T킹Eث 51Ec]:+ dlV" 'n[oJ -5ds}Fz# ײs^ 1֝x_,N;!#!&uX]_a2U1l#ux_!RGmpC 4GWԭy f{A--FR& vMe^iV pu eRDHsF{xCL<bs|` B[ v FJhqZ/ ;7u1bD0}[b(q=.>p0[#SԭEh$u;"lPx h0-LʉS3RRR@[a&v#5?5ΑAp.iͲWp[*OY@[&E\v7vTi0;SRAfԼ|X j:Z>ž|^oLlHuq%cbכ50ϵnxlٯOGdj-`p,;_Kie _{o!tm}Zvϑ&e=eQWȢ)L tU۹"JAƜ"M_gT]'>BgT#0] oXlsM0읎l{O%tWm7M[@'0g@9Z}]眳=ۮY0p)p_3tI5~yp!9NQ]%sKn(PkrOӥqt.OT"ٵ܌,(n*;( ;}Ӟg1KPHλeY&O+/2llo1; 9@Lg\/<[Mt7D?v֐ XMtiDV j۽ p `INxb =i*c62_w?l!+q^Ӧ¬@ _xEWwEC#!df x]'hb9L,2e2m>h;#$}o~$h _"J \7E]3%r{2V9c ^2ܴͤ;ڝ@Dw?CtIBف%1X9.e1]͍35(^ާL"ix[nxw{^[>/z>f_d{HQ" S+W8ubv\ <3_v>Áڏ O5 A׾S8 [`-425&cĪB.Dp[YaH7vH"kb"՟nD&lJ<\)t{T8zБLL $УK`uO3G$,AXJY/L@&`yRD[x?&Y׵$ެ JzR 0^@Hl7Hf灪$LhNf0+D\fu^%bKDyšvFGtKa11X}acYݣ\K'lrt̊OV22ϙzR]__Rd=piiSPۅߗ>MIY S_+p^2sg#އhڝHLtVN5oL׭pəο W̾*T6p^oP7cc]үYX-Ne\u ^_5ɬ Yf~ cj;-^@(iZU/ ~$s/r}&dD:|/zfDgfW!{$e Yfb^cIZI&LX8uYqԷ73/e9}{ЃP@܄%7i?uW0 w +}߁vo# QLi!0/]R>k{$K4eq5 a>i!ruFбʽ;Bx+Z\h*5ZrIQ=eƴ@3(yNat%z3ₚI*wWfR!cߟ7_-;;2|2QrF I,AV_;~KCƳაINh eN16a,Z q< @0MM\V 7Zn5׍%c丠&}y$'q.<Ǖ? gMR'a!~.v(G=NrL.%AbFdE2>Hr.G檿i8۔4Di6ȬP2 fh .x7 |$v0ޤ^N, ^5?'I\EFa:+)IrޥC}4yVipxBۤ3JsZ\2[ej2o=J8.\u ~̴H^K+OasY.23L?7\2Tz (rBB,֜?VSo6]iANܛCx"7Q_+~.]fMs8/&|8۔ڔ-pg6Zdc-g200z"OYbZsr'JPCJ5&rs:u16dT+rRXtfܬfu,rcNdM=FY 9evio+p_BtSUrBw< A w7CAif?t:rgaaiv;4j"s)$j ҁįQPx(: !†Br9fT+UsjF.2J/U gbb}+ \6 t8mR q7)<睙 E)t ?C Dr3krIÖRQ0:+xUsLB<|jxePdkg×5gxPs8]d޹eU' $]l\ k8e_e73ٖ Gʶ rN\{ 51^%L_gEdAhؘ'{{Vd pC)#i)4\ YM)I'sr!0a b9-KY6Άra`[;GqCuLEQO'qNO`ьOapڵ.v"0 8`hItz4jMr$P UJQp# ^5:륤Ag26Zf;1FgG;+#hn*Q$xInLJ |DjzFdD|yC{yH֊e{# X.e(279tEFѬ"{$(ee<&ʬd#c=oyX-Q*Daۏ'NpO4߇dǁe!;9-h٩rV9vrF)쳺O MaSi5eplݾح7jF Q(YMA6Yѷ&. #syk VTJSd88A:4aGXVsA{ Ί10yTQ+&\uaӡ NcV!(K3VQV[@DȺ]5<.mOc D4̋TlXẺ<5 /=HA>L^bh=?=x=*:ؙkmG̠aFƫYq BZ[߳F&͑Q2Gl5bmG+_ǭbq3Scfی|$Q,RXqhnv X%n\} $ljra}bPmpNd곐kˍQҦQI̕yZh?;H5Pbo`"\,wn?4Ҟَ(}:mjSMyE~`#k"X?$!qhťȅץ+}Z`k*n7]p.7!XOO2Μ#tєƴn9+լqq- IkڜU}xGuz1JaH]WԙWAط)ij)[̛1` {Qu! mgiKH>ߪ4u2.V#rڙt C/,3ț"$ZH:R+Cs_u%8{64"j WRw`\}R11Ѿ}"2YicPWqǻ#mdϹ Ѝ7p a۫ >BQ/uԕLl RNRJR݅~Y}oG>$9wn_\qNY cXY^a.)JYANd_VM@cյI~K~mj~`R7.mk6sbNz68WVY%ϗfS6?%㴏C*j[TS~okf #V/\ tR++abم; ص"WJ|wr؈ў!Y r):Y']gF'Bjv"Ib'Z0N'0H+qnL9 L,c) ؙiK^lRNg+Uګ&Yi!< =(Ju'd%\~kWŬVĦqSڄh{c-Cx*`)O2@ 8OcQ>T#Df=*敬Q{:l("zSR Ib skM'aeAvm`',p# J v--\EG&ٌ ۋEx\ӊ^VsWE8oa`þY!Q"ј-Dw܊k0'aRFQ3Cb+Y,eCժȮNƜsB!t= 㑒x̡$v#[NVYZYr |<7iI6\翅 @Ċb=)5;1;yrwcX_5Xa`k$ޭp{hnx"2z^3J=iD!F*dm%fb2ey\䨽B FQH0OȺQ՚Pp³ Hi[ޮ$֬7u\Տɔ'iY /خ{eD MRv'7J>ܞfK`:>Y~EbkiV |)${(Q/v+q:ppHkwH2Eu FsLw,m>Ӟ릃s;y,Cpj ѲGoSm-PaP `HFDn-ruЎci6p  Ɵ({c9Q9pr1⹰Sp~nG c \>ϧtn t}v+f@.&Cnps  CZѐhȒ"!Q)}M [k'!ד6\G$ϬVW=q^*a 3aVy12l=RӱTSbs't\&(&EbD:Mѱr^"R*jgck0M],A* Mk>{ 0㟀/Œ;^5*N5ײ@R7L(!*k>n7Aȶ59 &"T X>*پ_CmoғH1 $ JHCvQ o%:|&LuYjh{dHN6 gm2n!ꐷn{>>gCx􉴘JfM^Bmwhf{^,I{ WTM`cP]5F,DTIŀx$ D5U*̀Ɩd||ݭץLw3Zmo.&YX΍&mDbp"IGCFw \ ]*w~#Z#>12 E+s܂}4Z-iMF¨QП588±81n",wm9|Vxaj- r?78v2v%<+Ң*243y:ll%-Z0f͓gggv봷XP8؍񃛒uMiǑ S8=7 A[ra}Tfy/m[Tҕ G4ˠ-+QVLXV`VD&@n<KS@wsK5ГkK⼔e KOȅvhVd)K9t5u +)hk5b:XE;%׎Mu PwW쇋OFb~\Chm1 MUϏ1N!ۭV$}#9uׯ~$ α:ٖ Ȥ @hNJ(K/ƭI:jah <|Ad)/>-Q1/:N:#'EK2\l3V([#!nmи WBJ]Xg .n/[Cb_E }%1L/@y`Ww)(3ZmF?'~|\O W/?$¼MTY i7gˑ0cLRVPq0qhEyH]@5Wq:}^F>~q=҂F*+8%񜛵d>| {>:NuBK<׶mp< ?aAH_cZ/N}?ŹBwp"PrnYh//cn7{|Sgc)0iF~d$%H36O),c!ݷcq7Q E tېrgGJ|," d㚩O5_' L}L"c!r*˹B voyLIcqoǢT`r@`}cqPLn+@q\yh$ǀsD("-\N|̻,W-軅0s/hC_b7X/CR(xœp`sX|D5xKe#kb 3퀃up.dٿ\ wНAt^Ztc -BrDCf &G ~p\ gDD>y\\1LXobWhq~ٌO0K\ `6$*-0&-:*aE3-xiw g)ـRG7q1`pGciL\,iV`R%n. y7MYC M̰3]! .1(3@%;10E_A4G9HOQ>>uQB%FUDղ ,HY} S}pYr:Gtq$eU~?*uZȔ/nk7P2ldQܧeK3vR5Y7aQ|9м5@(D@sa1FqAMB:О@5߄C䜠Lkh|T4sZn7PK=3}Dp6oO ri\Lc4M 5@E7K&c-9.d=s Ydb$;v/t5&3*ԔS65%Y˥,2jNxPs.ώF>e,00coيn%UU lQ_<:xs dCwĨx>я4uXR8X5ӟ)q;/`V3D&lEj;k^"X{XPY\Uͧڇ[KAHރ,H0~ 4 @"XM]دAAc#Ѹ#^L5nhx *|K[D.28'꩗S{3&2Jb,꘼Elz> Ie:{sJt Yhy8Dȇ"-HxcQ(eyT!LK7?>@ו,t%tz%::czR<1D@G_ A3#"_~(dZ|1NKga,A~d)xrfxbͬH<.5K0dV-tQG9 b0kvaִ@ԱISǷ_ iёQde]3mo}Lo bK'Š>4[n|S#(.UĪo@t]h5@p TB~Yj@g _? 3c< iK.C2 J+#=5:?hssSiFHĸ _jw[@k`:dj΁fˡV/ ArP gG$<=x )).CkwNVid+ ՛`EJ5:O!)Ɓx)b&m1%Ph9jBkIe hAݿ%Za#h!džgԴ`Rz[M)^8!ybwXM12VVݣÃbMțŬ6@Oy>FEB*mїj @ݛ4L-W;g =b~?ejBO0FZOl<и5-AC.ʪ Ief+r%XW-E*Yw9B=¤Ftm56Y[8%A<]hnKc r8ODBl{| UUcE?֖N &kULz\//ҩh#ߔVy <4uoܬ!2 ҄Ǭ:sT,bf 1 b#Rķ`(؂4v }5Ș}͵/ְ1w2nM]j=%nx `DߤCb [_~p/;"hC+Nv_q,!q }Ȝd:U 'GĔI5OLD!@h1xq^$Т2I|ׄG3$cpjvbag߯Z}5A骦WfmX|Ie8bFmt?ՉiuZMXHs5Wj!aᘱ4u/jOab`܋L4Ƨՙ #~8=B6:Uw蠅̠0˚^j:5FK_9|e9>2iOjyT̘qF Sj%dKY[Ymݹ'ܖ}oThX||RjLB84ΊMut ͗1 t ޮK-/$ -I4+<Ec,)Z,—>9aZ zO&<X-xZ)悂 <@8LrA ;ލA'm {HBāO=TuRƚGBc!S-d D'9SL: H&zuXۡ!R|$骻S ZHn s&^)Iи`=mm3h(p^-{hs#wX`XkR4oĚeq@O o?= 튛&Gj$͸%,_MYm=,bg;p;DAN_ ;*oY(eߊ<}'댆:3xTH4|QW<誉pc9W'g>isbf5e=P= F:Ѭj62RaG8~Loa89jM|}_F9r&Pjgd>׼3h遶kB!.o\}:-aڛjC3!DlaAie8c)8?FUȡЙ@ݙ2}/#ji?(jJm@i>:bGZ=֚sCjV<.LRK#Rmacn-UA3咭gG9J,j{=qY4LԄ݄~Yäi Z?3C;郑܌kA;:݋q!KM4;yt.c%ۥf V.MC2j-ldvV->;([:hf{ ~5wq֛ ζO,C3}<␬D1oFCe>cLSIdyYf6@ve$ߥu[]k@n!ޠ_riLNG ܏_tC %L-/IxyMqFE@x}ba["ڹKLcCQ uJ bM3KhM0w, ߏjʗnQabؘXGc(N-KT|UxzyݟvkH0w#3N++`i^-quasn|!FB"9otXzk1]ոܚ' %^^ Z2ǿ1R~_3G z1=eA2_CnVcaBoҽ#ߏoCCOW#Ŏy9G8聠Aj?+a\du2.$.3߮9k@)cl(nkE"sxb9T[R1P2s`ؘ=բ:aZ: > MY>t)q:pCR qwTt4k;JpnZ@{*+utl=О:t27)\- i Jݩ _^y K>a2ULuC.>peה^c>f.N_Q>ʏ:gv\ŒrI8rB hxFsgV=tEbӥxsDg>NoiOsA =޲~&\o >iUj+T"*x =Kzخ2h 1sD-* RӔeHR;BJN8J5HTvnOv^t-DdQ;gASj%MWQܔ3 vK0:Y ڛ;מǭ%0&ߩ/DE岗C߾z^Q뚮VNlň󨝱Kf)_?(uS %p `Y0)WCȚ8kTMlK+g:HATDВn}=X?䇍-O@jhbv2z[K~a$!?ȊtABLI7-Z k0$/f$í"[j4^5Y }aN(18IZB,Ӗd]qpE41MSU sa .oUeqDACܡyc&'a~<#C++7u|i4LMAaDg(.8icEϡ׵[ @c܈]Er7 茳 }CEsTstiKfv99QCeؔtE7 CgݲX'3J.8K*SFMd_Ų},̏qjtsy\?lA;x\Uծ ^? v=\v=yXie1}VmbnQK3je? ;:=Sиڳ=iNL w|VRYgG#`@%,&&2ɕEPqõwg:Rv,}0KȀ~z/7$n{`BK=CiD<$Jmf|s&闵8iOĥȂ FXTihyԹ/x}دߍ6a%$Je9 'Z039sG~n̖? a:f-@W)MmL 7YG)Jq:S1xcF35K䫒8m_ ^&*K5CQ? Wqqh^͓H-Gۦ@flMp,$6k~aK^ ر3e<$:c3a7|/J#Lrj)x⾂GC,BNǸC1VHu!" r4䯱ޯƿobe:'H=!ޓd4>Dm,5m5X~-xBLFt.0qܳD ,c% 8urN6 qٺi8TҬ@ 4W,, wŌ>ȶ$4UۚDEGX eEMT=GMՄE0a^kwS`Xe@۰u&"9+ȬK"`# OtI /򞑫*+`}{ $#Qpg/BpAGsFO UV+&aInq FؗXL̰.t1w%"It~a,0Hr3M#TMб4_1Zsrb[Q},n-:x(݀b͋g5iC#1ZH"pX agISFuB3M’Ti~z.K6?co&/-DKA?ΐFD8ז9IR7~u]"xƓ_wF(-M.@3 jE^G|+6&XIFȗ,ک-劄׽] sin8ڒ,e/ټ4/s L;7ErB#{HdoR/46dHRSj>nɅ[蝫{@ PNzRˍ- RhͬbZo]`}{))`˼k}L!l ZԻBsl5u){uR$Qn~@- Is=RRKlHn2@"k8 s9\q"tX- [dC@ Zd)+`+⮺%ܼz _B[XUȡ+/FK6wP0c KmLa#%SWuv5i?,X][!BsUyViX>>r 4n9FB%ڷIWVƞsZg"Gމ J-|dIiث~D)׵ٳq4|<A {e{BrS 'Zl9M]#_%IENDB`PKwL\K O:O:>limit-login-attempts-reloaded/assets/css/images/icon-gears.pngnu[PNG  IHDRF pHYs,K,K=sRGBgAMA a9IDATx} %Wu޹V[{F#I$6l 668q/؉$w㄀?v1?0a@@b$V4roz=U>w=uzUN?9iȕJ+'*?\NJj+% YZHX% R$FXߖHTe\J%F*ʁ(Ъ ]IÁ+9%9,UrxT>˾LU|iiniN2V2}}QґK8"JUoe?iOhnqBEwԼF*#lwg.|I}^doV /7wWg-6ޕߺd+d.gݞVdc Wwd.g-d  㹜:+GmK«Ǘ̕,div͒!#z([VY/4[-)Pxss u $I[S*P{-sPy) ~ERI2sSo,*R._:,@I0NW^(^ 7s7q( u9͐DckdwhcEFb̅Le)92WZxGeWFPk? UaL[(e1,R+mA+cP" kl*07% w.)Jm2؆ۆl:BsYp7#P]Ay,ײZK 4Ӽ2 7:Kf-8#q:},Ag4̌>4L? %zK@x+qcSH5{&Y'u7!E!^nyuRAzpKPЃ5Ÿ L=LVAoG-zX%X~cKfMbdWf"ĹePJ;w$UIH<%;Cj/ R}A_V0BLѵ9qT;}Aynܨ_QI%2~% m괠p<ItyY`LfxsOz}AIE,AF\ Y2)boͰǰ\Pj[*,{1ʏwJɠ<' ̐C&Q ="b֍9OKD>׷P6>B7A.Us@WbnďdX5%F$F6a 2+EHEEv<ӲAtg4? SLL*@ޚHG m"Nfy&9B&cdB +t0At G8 "[w8¸TqxKZ#S2'8 bBNlp:M m SSqn\_I6-̨d3)GىojnOj{878EPߎVV݀8-<F *.6߮fpqʹ)ЉQ3]CtiCߙ|`(ԧA3)0ihX3W"~&!gtNgpNҾSeoTvtzjN'.Q)NQBjWَ`> dhWh%T@[ ο?8~):|T+v{M~gBH>7n_7E w +NoVʳH^81$^ڸm0*?T"ϴBeIkt1=|\wnŘ'J;FW -[WbODj $" ;u ՋC25`Cg-&;\Drn7v1ὸpy@h- _8A,K᧰onr=PGYD6onmmPPعBFBOn͔.}d4\މܬVuIe3`8mwY-vc++r)~n<7f1AYlŎ,̛pkҘ0'd_Q@"?(/4rz PFШ!uZ _KQ+pNw@a- $vt7DY1بXwf ){?QQ7C3Em' l\ w˰&XP'/Z²RE|كB_ b3n1@dX(ٸRnr=ux\&1 ōRXuZ+XbhM1 ^yƵX1e'b i\LS&GWqQ{Kwc;q6x(C,4δݙN2?Z$@(f}Xec??Q1iÑi,ԁbϮ(X 3ilSy*ޟAb]+ (OVI Oon8]DRZ]P$(C%M ~~<ta(ZR8dyuP`&GBy,ا l噽deޕ, w@Aޝ 91#Íڙmy'^_ Bވ֧ēQΚC<<47>E0wkǀ:;7y41=ȇ MFu;jz=*rXھ{ к6<.Υ+35 dA4 eL ʇlcm_{B/P0ayJd2JT7ΰ^E[ƾNBVoR03!2;l9~m‡ `L aQ,x}UXJM9F. fv(ݐ:lyU{c=,͐iuHs׃ VjR*GG`Ƥ ɋ Z@nGڹal_9^;;9U3J܍fe LKݱ,#BD8toLhEΪ@z .|vXL `NÛ\Tɋ1\مޘಃYb;iŵɽZSU'Ŷy휜}G Jؽid"ITTA 7&z)r'Hxx xuM gZ)%r]?C>Q2>@/& ӄ}!ytӴT||-< '6 WߴG`k[2xD<}J4~BBnT9E(4^/ZjHi&~b=͠P 8 ɾᦱ.BN߮78Մlx:Ig>URXK[{uʺڦҏ;d>wk(JibnB„8|[럴:W_Ziѹr:SAv?HB`c鰃xd ^x/x:Ӵ<`y\3SUһ@|,.cpBBBx2GM8agrͶ&ߑZ ßƙ{䀇٩3Ǡ(hÒrhDIE 2"i%{J0^TVcPaִ\Y&v ܠ/i+xL@Tl!Fa(Ȏ$\'{zTR 7sJuXT-)Hx2>S n ,1Xv*WT$1;?#[ckFPesvf! .gZ7[M{P{@|8 xDyU HT"CEA<wqK?yA3yx"d-/.ܺ@^`= cbP2X,E?emEU% /ևIu@߆zyu,X]u;Im .ɔ?rLL93.usy)gЩ䐅~Lz"@gri,+3l,lݠq_d>$5qZߔ4 .ˀ'%Cͣj Vp:g+',<޾1%㨈11t$u]{&̯ax `u7 VQ怸b6M-)8M4a:^b>= J} E֞zjz]jS_xDPiᕮYc ĩfKɫB4dh2+(ByPEj!i.> U!XT֪ /o6mymLZ!✡N.Ÿ>Rtj<-UW8f:Z,(Q! xPV\Eb> ,a!]Kg#?|s2uaLp=MiEQ R%f4֭xNzJ|k \UT.C+(SI?yиT݉hO*MTۗ;<}h4quUH_/ƴ<_e +ـU{q(CmYCH=e#CKdtEc]Bxy'>,u9:Fn9݅[ ײ q6ez`W$ [i}.ɦV 3պ2 P OHF_rA&|"l*i@&TkR2NέN yOY/;% uecn4&zs+41 :Ċu\qo!`lp^QY9יA!qp!brugtpa}Yj &l{$ Y@A%00T0"UwT!P傑U2ÓZ vyΡTVJ8c+lQܬCΏE݊tht!RZA a+˪~ 0LBytZzD~Ծ?DK>+EBKlP*Ml{+W%eIpAftݢWl uOF]xb?Zs2QoX6Q%!mSp:f&0q(]1PM&Zea"V:1cTH5S! E;^GMέ2!N%t1sځjAsn2N<,@ -.v`LoDY}r b u:43tpM.BtaƦui Kugq]R*a|'4 XsG1<(wnZb5denО{SkSaQ'ٖ-Z<*  谭O!%_)*L7 r2-=6eLB$ӍqenE~ 5j{*+1n7!.M qzu#q**]TWDW! ɥ0(MEHt֋qUֆ3$ha8\iUvE)vt'\e q=ĪwJ l2YFʭfFU[C3ƏsJظimu_pגG4i~_rmf1R^PEJ'z<sx9]lnYshRK8cGOQpG_C CnHqI;Z'Yt_$Z4GL@b(e< jIF}a ~p_Df!ctkdSV-e Jh@`8Y=Qh)׷\ì>ao сON"…5@'\?x}6:hh i=g$(:eMb6q\|m7,2oKc n,AZzyp&J*y _DKmcwS}ǪbM{=]ۄIo=gD;޾4cCx,^ńF4B@̓ܚ(u9'6٭y(NG#Yj|vxe׋'>#\cI>|'5ͺޘV ǥvf?'aߨȩ'o% "kU\wϸP@^缔#`TO K99u+*q24G;[Zȩ>uϾ=Pl`֪^HR$A6E n,g1PAc.b߭Sv$\}Vx*.oʮDkqeߌO(GȲ_3JmJ"B Nb\ _Ҩ|*Wg"ww*JlԀjH,,yAN1:n19M-K\(&`&ҩ$;^ɘQjFf*; QG98m[oy$QIOsԹ1Cx8'4Ċԃ|=o#0"UO1,ۇqo JBxN +1[F <ݚqFGj bț翄D,N>E 7KŽ)e:&|Z32Nt.TnoH/M/n\ݢP?g"} `!Y 7]#uQ},"8v=vÅI n;E\m),;֔h-eYVH*7Y7.xI,t00 [OؔrEkqR,Еm2>aAP2\Uv>Hw# ܕ'GrF t[zĞ|FS?ʉ3dKUdtڇM^k^H3b?8Fi@PW#9=.E I!S2;z#W1L@b bՒ@#iZ<8sDFZs:U-[P aNtŸbMtZ/?'L>]j /k#5fHlȝڴͺc- IZ_F!sENw2IlLaܴbk'}jz^/kWusOwEI>P6) )jꃙE3u5EFQ U|2s@1LO ;3 ,4n|J.,*L9=. oñs( rrFŢT D'{t3N.2I; RAc_PRytI@쭸!o Ğ4&9 b} #EYn Ko\y=vQ J QsH ,U|'bW (pqXaƲJ:Ʊ.[d,~3}SlKpH8spj8Lbzmi1%Kw}& IJhbE+$I }. &Bra&B rww3k s.憏yR[uPUٞAcLe+ʏ. Y_~XR,ex>VҾ2o2^W^%-dڗ:Db\7b|Dٌtlkvo>pMxx)IIFKO]#Mu |%W(K@FxtF <_Dk@⒔+&3M[AqIe˱!QAũTiK$dI@1[>c?j _;j i՞7p9?F-45+g z"p@VjqW ų!I{Ngl\R|ۘ^s+EjB>i)يc6š}-Xa CUЅ{nRlAy(Ì ʸ,Àl%pPZA^fºʝ^K)S%4 ,W؋pҾƒȍ/CրćƱe1Pu2R">ֹ!1DQ=b%0^3b0%'e}`QOZF`-7a#FTnǴyp(POkn,?ډɪ>;#Xr.@XT3)g 2JIIݿ]6n55pl9q: hn}b/cu2!u( g`Ls9>w.Ka!C78X9Ftp= םЇx4-1.d[T3+'5ș@].U},f6VØ֑,WAl%h}8/5LAtOAY;rH|ΓF Y \l"N#QoVi*W.%ӕ>PIq,:g*t{N=k(NDQLii A&?KHhjϻ=v8̸JZ|sx]eZG'>GJ\F)H1B +.6Jƌd70S ჰ_T9d7ى/c\@:ѕyN%H`S jUix2GJ.ۺ }] k͐N--ER k!sewmyqKdB /_%jkͭ7N]4ᚴʭ_s H5)8y{E! GB.wjly/Ż`Bras, c"@+=RϢ\o~hIO[~<앁)юosk,[trG9N1J2RC&L6d.fE9\Y-Ti> |qc5(b\ۣ+(^ŗJz!򰵓n[#3J$8#]XEWQD& t.fڂuYp7q]:#c/CJT7vQJTJݬaå=̵’M 佶i s$%3:o1]AՉ7(.pEmNnfwnv*zDIq6r^sfGbm: M `iaE]8gqȵ2* %JT)Xql.> @l.zov+:Xt9rw$c.%6%Xۂ[%rFF.{Y׍FDZRqbIE7JUDvhipsY.2σi $-$@u"4Z.53 z]%`rB}M+Xh>]n@G=iIrlO.*ECl(4׀x_f_Wɱ? |cfy,~*\Zh[peu(zdU(UX{ 񑩃UN$qI*<3ayﮊ 8c/î״ lw$ٲ{Z0c LFFCqdc U5΃T,(~{H$K{p]]`5(8Kqa<5Dfý{eo%^FϬ%F 24lc _ߔ-(SKL=Z#n1eY0(e uKŚzD[i<:`Q+%JN!6K ,O ]:=tP0Sr"Z E/$1r {% ևҌ;cZãJN"e\\Y6(_p=Њ 嶔!qW.Q>.wy{h uqGV㗅QK4ppi$ q~z晲z{ʗ-Tatߠve NGCm.LQ. ;:5Q6T K%6 Į*I1Vg$+%iܻۘt(Q.`YrnJ:X1/q˹!+6 e2qs%:A+GHG3X`yl4O˶ dP\@+s9{˳영8"94ߕJ%:s eV 't]sï|pȜr qv!{B׸H]ڙ xXn${څ^`ϭ=SKZ/mHX2sZd,δH# [s)93DEAZ2ҰWfV+H˽uu8^wtze)^wNWS;oDIENDB`PKwL\zE--Elimit-login-attempts-reloaded/assets/css/images/icon-grow-clients.pngnu[PNG  IHDRF pHYs,K,K=sRGBgAMA a,IDATx}yeWyw]3AHL@AF&&'`S^T)b2bS.'PvU Քc$,0[ $""K##$!4rvOtF^w|12G^( dREҩpED\I!*Yϯ0DF[$9ٕHTt\A%e&@H Ѥ/?r>(*\L2`*p򵵖̉șM!ѡZ+,+U%PqSf%jSrDqZZ|JCK]4zE;]- XAI7IKKe`rto\'IKOMЁkOtyPqrсP"ډ<)]fP9ϗW[s9S Ek'tIPZM'2>i_o:q-IBrGZi, 5-( p-+VC}LLae}Z]u@ʒZṥ}ilʁRKz XFg+ҁ@҅ЍX-tR)-)x+tKn}׿{v󘤿dst12űH$\^Ed7 Gga %MxKx ϡ׊`t{Jfh$XϮY1w}xKa*}+>s/QdK=r𐛌"%W /wN.*16[ħH_">4sIJ&,y~S͜Wm %& {-i߼d<嗃t)(D߀__LC4O|0R pړ;߯P|;(C?R[d7vl[te:`TCR} KZ|Tu2w* LQTen=#U|/8%oŴ+R GAvZBKoc "wE 62|{ Ll!X%{Tǐ<%Z=] xDx7.ZJ+3Z4?}{!7L=ϓ  X3L 2TnRy+~{ݢ_[$Ջe$%"4YF s*ޱg{@*Taa 8??i}={$S Tޯv>|BXq58y [UB/ .`e 'цu5) ` }H%Z*KF{;&'"LCi|s[C?=hѯ_٥_S5> i,-`^ndby#Sm =Ts iZa Xcαc'#=;~y:*ܔ4}]br'|´7L ዬ1s=_YM6UW bxq̆mG &gr$0ܰJ~S:>@؃a@+^T qA@b Upr7}!Kb" 0EPnq-6X\|r>l nĠSȫ$.% 47% 1xZY+ؒ"H5ho<@/qX/|Rvrp GL *Λ_Na:]p[0͸ܦz @A!\r$Nc-\%6%I+0QUAn೿2)S`r'M=˪ Krz@=7Xb6QNL$<ؑdتj  6t@F^ :2`Ȥڽȯb㭢FV>ѯ/A}~q_hCrMa.$=o^ВD@\TcKYQg~ZJoΑSA*EN1< VszVjL>v :f]aRrt{5;%Aײrp#ߓgꞠSJrJ́l2΍ SvL]TѸwwù!G4jeJ/>8x C\N9@.6P&慵N/h'x >c rbDsl+{zx ~ Ah䡆#sR\M")T{f׾YZ9A~ 4F~;9myķQ |ݞ+*~U*9O}oq *`))`Sn 'TW |rL [̡ [\E>BbhZQ$Jr݆-b|jWDnH>}CBt=EN !VR%=8('Axֺ-(Ҹq{v[Qưo/uSHU Q(3n^nv(mVhlg^HgɢҒp:v# hf9:tZuP^jO|Mj":>z3OVCdj:tOZM r p1pKINB" /RB62WJc^2=*RJ n#/W 'ʅZ#K x%/6C)KX\H(T/np®U!yT Oӑaa8w–IRsƦBl5%( f`{~c^>`!4K-.Z.gj7Cz\ظ!#cb|w0|E:\XZQ&!"߷'߇n D:8>q/ra1Ap|߮Nψz-'^{Bri$BK3oaWp7=xp8x+NʬE[݇YKX. Eu1 %M3b32/^k Į)cQh"vB._߰+H a?TU8_dgFVud6COe=`:܀5P1[^JEJ,^rB_ jCS0QZ%@A aeN>80p->J7# <3? W|] YTH+lOv-l7>P~RpAײ)0Oa@a9pE! vR.w˘m mޅagv9)= .*@ǓjQfiD.hUc,ƪt-|W_wNܫ9rr'rg 8oHlG2SBt`X=(MSRYGBj3pgpUChHm"v?TۮGM-zSGi.g E㚁¸*>eA 1 v gaHG_d w+\ּ0f5*\kfŞ ѽ5}@yjP265v RI[v!3v2lomr0xڞih5@5!H<ܪ6c)d|DJrOOfc5'Hv ƀ8Mh{>4Xr:Tr D?A{dD-I%Ź ]hy/eR3xw҉v/q6 / -YE=y Sk%{M7 {du~wd[}f3> 0 /F3iԻܓhL\3 8'⠯a]O?,5/vY35a{֔i?2ð>Fخk(MNQ Lު9i%VfLw# G\obj u$\2u*]C^ZL| GV$\WDsWt0s7m;@K&AT?4 `m&J>vތVhpTP5@:.~ނbɇ[Xmcz,1ȼvHf 8ؘF@tյgn̹bs7k?_x>&.~ba)=^gD9Cm+'jar1GZy[ǃrɋHQ!]+b0кL脴!cOCWnKr=L%f>.1-F;[1P!۠~lfmfg?f?qNK3j3fj]$RE^߁=)!O5w A$5 9K_r߰7xԻ|XC \Zo~ByW3=wBR?#>G=a)ov 1I8!+u,LWL{ً8p)0,Jkqvkw@Zu+Wcp>G1}L3+f``73DW~ܯPOm춶aO0)TZߞ$+3p rjXǴ}0  6w:}Or og~ &A)`K!x2ai@byHi36u|`Oi Af~#1ncyN[3 Ah⵩~eD޿ \X:;P@p+z*|-uf ׿ pcـ[)KOpڊ%)~3_?&a +By\UUPSVGpf!$ 3[{LQTe*ZQ`:gc{8hi"l|YZX͹ mk,q.'!ve-QYE05Tˇ!Wj%z {H_{=zc[ޢ\:/8P Y!-Qk;3."ү/^.]9Ptx{;%{Z$Z4<IXnrrYVfS3!7 !$ש%_b"1k=^\4~ .iv*P6^W6wYljX0BպR'*m;3NVpeBڋ]>b-氧La<4J04Wוs4oj٧;@Ax oXW$q7υR3(|0'pMG̝*5s@7)8gMa|]&{Pxܽ1QWj؛za%ѻ24 f:im c-E RIBf~ғWwcV*(76f(jlE ^"0 UB7I\qy!o |Y< Lbeb 5XL%"lPD*{ xhH̀C}r$ba@F"5F;+naC<5Z 9c&7JC1|(乧O/KvM (;DxׄO3!h> 웆I3..Q-pւ43w4 c4_Y _V۷ KYPpuĐIl=z>4rчHs+q9f4[|' 91Oihf"}b TZke_Mфvp p.۲ЖA4'sy0rɀS OTf85P5{t4ѡ5_6u/!) ޳]DH1@V7ѣ8AGJG15x}h92Y6um~`]&dX+lFWaU&Uõt|t.4-~Yy@fIM\`4~m z6 /$kє"U)>TF3ѓ_/4Z*Ӂ檅\cS 3KZ%t|S1m_Jp$D48ݐx4)kjHj'Tgwio$LM0z-PJxs3觿goktm~H}m?F 5frg [6-$=>g?ҩ0s:(+qUoEoޥ_a=V&e #:x 0fYqqUe9p.Gn!qj:=NS v]:`x:GyUe^c8rzMvx͙tm%%0cK ׽{zdN?7 \}]'τ* qk^+|H VAw^!d.wN R#^Ϟ7a<}|TQRX32F҃Lq5 k>վ?)>r7qqH^L$Z-._rGCͤZǘW죧ˢ\彸IBzWUC)\5Pz+Y09x122h>1tD<(l 'E^ljjY]g#b bz3'GeX1m)9pFc41ʆha]Ht?5(1n\gl(x|ܢ¡T- @mU /PU^_, sFp8ex ;Jc,e:^ڑy4|ANeTFE -Z1г5B^ߟ-0rtYٞ뻛SuZjQ, 66 1Krw72ñ3!yƭKBj+>rp]11()b&xR9\2P+@CECP+_dHq߷516u9a!}Qf 2Atf)yF5Z']H(pm'p05M, Y#ƅyhD̵w]$p[ <18̏cפ0uEx&D]9(4uB&';Vh3!D4T[ VaygxQL`fbp k5а[g:}qJp%ѐkMBhnhM42Bzi-ù.Pq]t_m)2*t&{ſ",Y Rҳ,m6Ӓ  L5ydu4~_m=0jVSc$.u6r~k3 p-4`TK3; La2q(N31asFY,PNcd?zS o~'30 !g|gq}1-u8UX!z,: $X> v|i!^ǁi9M3LEn=9\L:,BAڻr! R?f [tԒֆuBNhʄGQМNdܒӓONN70@E6*\cc~yE`NOp lS $02Ͳb|RJä*Zyi\f >M8NIݞPbJ%rpJ߁TVAB8T)$K"Y`M&ppM$kihI Jo΋ä9/+H4~|K >-Vګ?sߓ**;jfx>p4~lWlϨ p߻šAEH+B  0z1Ii9O&֍sN0')#ԅ!Q'i xZQ~S}Ko՞[ 6QoZq2|sAV׍|1i6o|_f>xl_,.4K|ӷN8~?ӿSL?um;n>e{a\#uuE 6cfZN׃1X j_7m~5RK{H;Zj(<R:>hPKT7|H+ 9+ZNv7(Bh`nFxA+PĩK~YsiWK ش>xܘ]){fT֥'&% {7ټ f$z-]Dݧ)+7t挖mAIT7ɾ4WH[=B|Rcfv8={ d-$aRbK<<#c hd~EEDђ.ݒR2: )/:_/Nqӑ$]җjJLLr8dagJG ;:Li~D2{)@_ M{~k鞥QCK)'=k;cׁ#-IENDB`PKwL\qRR=limit-login-attempts-reloaded/assets/css/images/icon-help.pngnu[PNG  IHDRX pHYs,K,K=sRGBgAMA aR2IDATx liY&9'̻ Em ݍ,R;Lۀ4jHآ<3O<#:͌Ӵ͌3=)h(eXU EQPuk_9~yo8_U܈s,9A9!󙓩]"zJ,ivT E%H?qrt)H!3oR &R@SZr w!dI3I)Pܼ_,8-,@ۤ!K68DH<1eig.]-OdIGrd1;.dYȏ%$+729\Uu,iIX7̉kҔWO,ը%բ9eYRK(_x|6L^t\aGRїSg}J Y=T4UڵoYJ%̈́VWnxbD },ƒfBhL Gȉ\%͖wOO;v2U&?}1I{%͋Άyc2%@\tbio,i!h @NKeIKZ+OiYcI KSɞǒ+$5ȗXҢS'o]|\vI[E`Eyv41@4w %4φ7D}+ɒtr<^& ͭb2BKʵ(/פܪ%tjo=R Z/v-OcvǙ]y:x rcKjIjZ;D2J5T%VKZa&6فKjIkh{^, %> @cIG`ora K:jtʅ~ @`շcIG ]ȣT _IK"ePe#%MۊщX-<h;*;iQdBd>v$$!p8Ɲ^Cy4$*n&@6o(Eg9Geu U $V_)#f/ux)I''WBă,R{|43qiɒv&S _': ؂ڋp\/Hd8] &6+%T&$_m钶ViA!чKě:iH5kphtdP ^Mb# cfmޫ岤6ըvTbCi!ӗa '('JA 2<9RzћԒ:'SF}X >I !_T<鰂%=jbntKS>'0î >yTM2_«/>BW1|_6k_A",+P$~b/ yZ"P t|g$ZFL MDޅǗC)e)c9: M[CJ S 0b$OQ MAp'&%TF 0 VdPFjTAUJYtʆ > #3|xΧ4 ],mI%CH$Yo݄YNZ7S/UV寊 !%Uv0` 095@u\ =LکEG7ܩeTYIy_*#6C{)8J(^ >,HSM2q1~Tи wKxyuP^)uz&ܱK+hod,&=vݞmĺz'07n]( mRĺJgүl3H XC2 HDq H|@,w y>=Pr9H{ʥR:Pz-JnleT _x+R`|B6ap}pz~%@bBժrLvקT !-H!U-ՒvG4u; =֗T5LX=WLAYgCUPDB{NL]eg4ȃJH*uD%<=LLNpo"} O]NeuAp82FZF^kD@H܆*(4̍>:.+2A` 6$bb*bhOA]AjZHf4Vr\=[ ToV ST2p9"+Nz]H6 p>>9Йs.T=oz~ǁ򯖉Ia\;XE_ !@bj \U*o8nbQ08L X7:x9DPU&Q6fIuP~zt"0E>&˟PJE:^UMR5ITS3kHC4)Ɛ *?t KGMthމk E);ABǔVrBpuk$$@vԞJJ5 ic-KW;`Iؚפ`- A|jL+!^ {%9qE>wʝ )lj6g$tG&\ ,qz7et(t%Nv=||t8Bp<8C`4'  H\ ۰MLlmFWDH%Gw |' C.ᰎQ؇FMb r9B;1>BZЭj UFC߂#n1apOR{oH Ii؁4sLnr3g`3[璑Kx7BØ=oV!yʤI,@-yB̦R3批 15{Wֹ)^_3.3B:6H$1 LQ0DCjgxHR%p]1|Ƙ*`߈׿. ż&2Hq84Jalps?`p*7u*TcABIh*>Frp%:p3WX5{uE ]ugSzH  ufdu:TS=R~ 0){%[x)ۗYzMc4OmFl؀Jվ*p)Cjiq2yލ_S#E- KVȢHVC+opjW1lq$NJ5+xńf2D:rSTlOG Y<"XSݷ^;:ry[ g> D[ɕֲn &=1O92 HG@(9>j7lU^`sxy?#K.l Dj z`ImCN0FuD>&R_&@R Esx51/0靈v]< I%%N2.5%?Ze8jay ~1&5 J/P+P)ܵXކ$Gx+= `CJBb]Fl*݀#W}^X\a9يeYY:VCl217~OtԸ ~fmLWXgbRBxuV@qLE#VMr[dnsXflhx$1Rc5 s N U o$J)EX2+plf"--+nLF?>p"6PSXV0-RP?\(d D+A2I8v*bn @`,icuo[ɕ^6pSͼ1Gx2ߗ= 6 ̩dwölt0$#LUWBK[HK6GE2C%~!~YMCx< LV_b>0ZwykPc }ml$ N*EFH7 f) )jkYBe CnzF P%u!Z $PA(H U.TBbۡ oHn߃DU +C /s!1eHhw`6UVO574ד^v(L7$`:xZ}PB@ϕ&E`Mh܄o8H{p6>iw,o2x[qB͖7,H_8m\aZ~Y15q(5,vtNzPuqfۀ*s֍c ak"∾Fҥ \O(HdzFךﰆ:vjf^̛ Br`E̙JM Q"IU<b%Lg|L 8=pil๐@Rkc~#/q#E'QFS؇`Аa$kdXSb.ScH/ڱ(5~^B%zP F>)@bÇA\rEa=@@%;+_$rygZ4mqY&(Hr^%\_=i~1#>g w%㴶Dj8GEGA7},\ׯVz'/ ul ܡ6)1`ZD=W)c*%ACuns<#)ԚC/ gem!' :Dk*U!-/EHt ؙ~#-S5ўnx*2DiXX{%ޭXSaSu? p}75 p 5I.#b݁UTu |=:b02 )髴PRdUh3s9[BX1$ 8}KUc!hkzuo9^TVUR%z伽B=} %I:|ٲH IHi?VGklUR;H j&ūng?D:h_3Υ5U >>#StMNiȺ$/ $t'(y=ߥk Ͻq0~sĘRڀ'5]`>\o' m]\#}SKgZ\ۣZ#[4wA4p$% * ՟WSV5hU-[|@zAbPC>v.H)f3D%Q%MaVF &RG;KhBh`/W No)GoVdZ9KC`"waLai7́"҈hT5g}ƭ+ |@ݰ^mn+#S[RAYSc`B,,-1Y(CШAEK8B E}N0Zў]<:ea{WHMO#kl1SžOl i[Q*&eGقzʫkWpʭ¼ 2ˑI Fel; I2-`>$[SHkHb!iڰ dNQdjؖo܍oSu`p{?b1ԦL~>fΝjj\sb[[kllm|QCIl<7Kvڠ@̦ ߎݞi*O{1YL B NuWʥjE+ovK' ^ sjr)k/^8䬪C6d1fa(iR-):ML)g :ڨK ̣a+`yQtsrq1t_}VչG&x^.i(4nh$ERRS jt-r4Uݵ2h?ˤTypv6@Q!)5VϿ?~Jo^ 'c3bu+=;QZ0 -2hMƥ-,zkSf>moGզꯢCWPIُ6Tz U#j!]{rVj!G @bâwpBPɼ 4a1_GTa5nV;T%`ŦrŹ-(FyMl89Hp{ U-m8 wv7yjV=d5c؇;dW(g&2iXZA5qXszu4KVupY92̓jBb5P5\eE|_˄}IR(T2gdTUXj5 ~K 7󭊕6:63cQ>_D "LtC[%!ƭFT[H˅.󢊥Q&}.o R)H yp6>p %iS)Hs~+tnc+@,<S!2w֘`ȳY)#jQĭ2zԼ|FWsJ,8p2i565cZ-P'8xNL@q2gch! cʃRO9BJ͕{䉋-mEF%*푒t9>svژ$1} *V1czkˋLlس#qٌ. M9fĬe&6B5*Z) NQQO^)c͈Y)w0a G$r2l76G ZD{S6Iy=\U S ͢c)\E0ѱM ꗚ8^21kPnQݻW;FHz $kL;|*?`Rбx| :U ~> '5R9U$&h = b8+*N1z4eOٻ"-Ǜ) _k`ܖجt LX{dM <_gt K(lڌד dDEf?ҜaB ! *G_vSz9E?Ue; -X9P r#tޯX%#.Лjmӵ =g 3o/8#Ja0øS GV`7LYqlQmࡺ΃*j_GwI֌Ӂ U6(9)kR qϖ~K $Qʑ` *q6^nίm,a.;6qSVҚiѤ=Y";+ @jcPA?9U{D~LRܰ S)Qu2yo]mbnTI ޳l[1įkPJDz(ى4ǤU)̛ CtY2;ŠJ![pfRD`mXڛ6d{w[U2vi?.}JFiJ |&mnlE L#~J}t"| :Gُh1Si1h:@pC"`wQ7ۄjp Zgo>jL.Eք}ZY vialk-Q` DOÎ;>)M0O61(ž_^}>bb6 gp?f[XsK8ڈXl63n*@f:xԺX&6כiCrw^!d)ҡAqpQ+dtߎoo Xg JuY2~S_ salH3f];FzpAlV{gŮj e4DH)h=zWqfTnb k8P_CHtp)'Hqf S̒YPjmD$:/?8@t03#}1$)ɨݹ{F%Ahe߉p[KWP NvJ mUKen,D9 v9U~%ѓu mr:e0a-C +o]I >-G מ6_J95@\ώ9Yz)(a>֩f*n `rrUd;0K 8'^3fk(]5Ql4EnLWe콲+zGn:i.3!gw^3#cajm OȾS`'apsU'i)=6&i# Dō{@e{w6ehfQ\ BpɬzonU;$7YfnN+AUxH<!.g6m qc]B>BLGJ[WX2pצc<+v*SUI3D:cǯj7,Ջݗvc]jxXM#t[;Ƒbp^ $*#jL(p"^ݍ?žsuײwo·w$Vq Hz^f/v 5sB HIRL2Z1=H\0լy:] fc!N67 ,9ܗacٖP C[@/s6ff.: aS_s7G+Q+i.,;R9bT)¦MvӮ+iiqΆMiiWǡB/ ԞȮ U2@#ư6/ͼH$lb@6ÍG-k{aijuL!OToVpm[XTh< *hԂ97F^bu\I+0pH(* )lH.թcw܅MÜZbXV9ǻsmq<[UJ-~mۢ7~RDwGm,4010\x`. Mi'DH2[-õ-0G sCؐ,*c|GЮaلX$f,mukVH5 IE΅JڌzY=Rߧ7l2{bFi -7`6#@ZWJCjG 4J;d 4$UGW];z̴>+dž^yNsiT740~ 6h %efMuՔ̗6_ s6Ŏe!M~Mō4b0Z.iA%Ӯ2dG0o v<)2JTezFJ.m9ʸ$QEƳQj=W~:b/?7za{9ڱ6~=o.+锺L@ IgG *PKJv,Vq#OAZ9'C}'F+d>e1$ b0Q3"p<$P|+,]C5)O|c#0L+-cfF=bB͚Ro,xwpZ nY>ka+]>Q3)O,gCT] 39e~7`6vt1p8Pr-v:Fbxf`#K{J&"3؃"P~P=qE3˜EJFY_Ղi1[GKXVJ;f'54cj3LJM 2m-%sJP*iHYuS4d|3;z&ja]jd}F%`#8k`^/Ɗ8Lٶ;lYlUVnm(Q$&@x4밚>f7ow>Wg[et<3 uc1718z b*;6 fg׏ZqI(kP9xJU}޻`خhА̬ԢKs8+ODZm̞瑘ij;`ؤ%|^R֪d 2?+M{T)K?c3 _H8aÇ`ig=b?Z]ulj<5n {ǎ,y*sd؆9rƂI2g\S[qnB<\7hihQ s & #/DA.]2ޕ]5L+aþ&-ɞ2-@j#ÍxU;ng%@ޏ ِ SgOIp@{9){>l-qP<˃rξȻ M)N,L7ݎ=}?ޯq]pb(O0K @ㅺxۛgF fupѿH @U0إ9z0QE 1۸{yA`gH>xG2 ;SܷH;bFT<6:1Hj3hVN e?f̱ ~mO#qx5u J)4蓮~:fH ` )\C@<.H£V@uN&ך%Ha1_u.!c.qaFdABbI 1f34 Vb9٩?A]fRz(Kbi[{NbK"KxQ8 MI[҉mRb6ldg5>Yhz[gr Q4)jgZ-ԆFu*$i OH%G3x9bx4q>(V~MlɳFlڊ)1V>1Gnz{ ,wXfb+D=&CXo:D bRiKWqCk*5%&҂~z7&GՍ%%#z2ine@Iy^ Fhh}2}k=Op`hY\Ay\ؒR仡y< ZG7aѺƻ? Kڎ(M5ou]UlםԑB0-t8=BA!AfSZ_cL(E?߼gLCm^"yYb 5~>K+p}jxzlУ%%n 5iaLR#{/'VEoVf@҄~ 3;n[Y!ǣPM͚8<^T61}=b%KYS[p9%[~$?8Umj<Fm@,@Ħ̿[BM :Ex 5NP3 CX˕G̍f> *^1 )rYEd5{Ux8bdP£p" 55-]4e&tl̪?;"ELLV2>VB!ix9!Bp2NlòއBkApv[eW$ruZ߃scP\kZLx۬i4.6"Kq/zAD(er u2_30nWdt Y7"IU?b@,ة>-m3vs JwA%9 bⳗ%L!EٕU1|ǵ: N)b-}Lf"`\~vG?s;.f )K ߯¨,Պ C;`۴Cić8.&\*[/~-ٲ{6e0^Vo;G=0̄  d3#v}gj_߂-Q`z#.c㼜 iX8X?C0ǿ{dkaZsjM N!!]6>V>jIHqACO J ?Yalͪc[F[隻ˎ;,:|տWٳ= ^e>Gs5=jT&27-8֙@xI2D9 6mpgl4v'CP?.>Z8>VLH6EBB\d>e6/:`/~̓4 :xs=okÆ0/COA@aU:P" $H] lglyv&&B*INR)X0,Mf̘l .-KX߈Mq!٦Asd<ފ T+ =ԡ`>L/6/2C\O6b^9tBoik Q…ei5Zt`Ud7AZmh٧p\1T@Ȼb6rmД[޲ѼQm!Vg9bwfePX57lPZAqJ}֌5ߥj8u {8btp(HcR88X\WI9~hȱq?^Ip+~:Da2|{_ O]+2,Hwա ߔ-nJ|RqDA^`Sǿ48֮VP~\oG1oYjlȰՇز)km*B8muR|BjubS]S{)G.=2Цq98ɝS &~6%[q^ԤC6Bq{e-l5V.&+],=HI8ߩlúoD<[+۴X_:*VTiDzj[`OJ tPw7VOfPceI!V $[bc#&T@. O b6j^Ze P-Ӗ24B Pd7BȤ=lQ3}AUɟW] sJրޞ4!)k?5⥚\:UB9G"\ 7eU͘udC[>Ƅ ~F1B@agψ(JjN p/gp}n=N/QrF`u`t0B/}+UmIj½}`[稀YэP7ozԫU 9 ŠkpXD;A xy Ujkc]=kS,Z'ȃ"AY%1Uyyn- jT7z?Fq ~yFiK뛬 6pqg hGp?*h$gȔZE>,=8!RNS9p3d'dRN8-i̋.5*k5A ^UwF@B'78< N5.J ,Uaϝ\/pdhlNpzL<.ۮ#bԉ8HBS6)I(I=Dr+0Jj˨9%4{G/Dv֝L9SYpƝv݋'ڟ  mRjӶ τ6ywkNjxƻ7A-ܛkA4q(A[g1-鄪ՠA:kyJC;>`0nm,ɶI97=${ﭽ8 !yP]"%>V^E]I:T, &СYlnBFbjH72lA\z5KJni:텸0$YVq#53؆Rzr8=>Њ /k 7ъGe#Xt(`c,UCPLxبzCk+.mΒ7bէ]W?|_3^9 p<AwҀK9.Uan L"i&LU,.6: `C`^Q>[\pNz̠J޵ @}6Dk'իgdZ 8 a,+$&nntyMnj_N8ӒE8&܅hvNǝtAWkydCYU/_7}dg$ŀVNH¯?!>9ݯ*cQo<T+.?GOS|Xl]A'#^ݴ^ b6vZ@knȥ"v^_[tEtS[4իʎ۲20v(5N'B*NН;z}<_,~n20Ar7FQذ%9ċIC8"|2 7[eot >(mPL"xϞ)4VT5wmkPj{=`JKh4~sՁ.Ĕ㝀3C'i%up`ÓJI:TW#;GV?E$J#aruM! i)!/u*ԉwEN؍,9Ya$S|3Dܙ 5P:HWy4ASP>wyzFU^"I#P|~D[ӂ8x%ї'HMs||xDYn\Y̍[./1G/8mh;+aO]`Xʮ1} ظJ@U1@83e@:vAeY@46pC:4F;fDpR'gvȵ I?6l52m Ύ!o l ;\7 qA/q;^݊c-\vCzWe}y,A{f3#J1Qxɜa8UM804sCw0ՉpCi2},,p7gbQVK qY܃ӃT@0cVnZuw[9f[xR8 ȶ44!Q 5ˮs [A+o–/H#-$xVlh'xmFs "N*հ;{?(#?ϳ96êfmnWB 0s4qNG j^I7TJfh #irJNw차VbܛC077OeoS>~l\P B!ǻ^[R\NTk@=Ê6HTD vWR*uJq<{B RKF85U)2.yJs.zѐDT MK׈;&K ǫ-vs5vgvx r,"@=wh'Ce9A;bP ʁ!LQ8C@[Cq>eyn:YQ7Z=T*{(x}Ϸp0gph; FܶzR#'Pr6H`ԡe}>A`PKxc"C>. &L^ 1 m| px搚Ly5e{  sL܏߹]&ؔ>gD39I9`߰ 𾉭I9]3Gta\!uvt)6OQbA5^0&p7j5@d `--/87J:AnCIܬ8D[^&1^sF0 H&wacGhk|YZ$CC@c0=V7 -f loRR1"~>8Q(Q8WSp/XqfW9Î N{p&T'wpW ;1+h(noiS 8VvP$Ϝ_ PCI2[e#䒖"=5efJHjV-)8W 2)\™T8OϦlAiT8M8ކlt̍,&WuOȰHsa:\"k[(8 *g@Rd7kҶ(J͢ʟ:DhA}$=Z6 s;\HbH4%N 6)QžI2-< qOQdSp\*88su<A"PJ<;U m3>SZh2!bqDI6? H;HΆQhQH i`7XYط:PձNÆ._q('q vEu+V!RE V~5Crd&dylfb [ud2R}Np%CrLL۬v 2E&_fjTg؀w4k&ǝ&+V\GK QF4T,gRoK%m ٠RLՈrY(K T+2;SHR՚Jc`odm9MWmяpՇ[Y2Lij'-U%:0?#u:I ?%djUy; ?hDwᵢ&83YҒ"]}&d`dZے05ן-Kj u H/vVuYd^Ғ#Kp\Kvy[E#geO6T YAZ7 Wo%( 86ɢ2ܗޭ%͗hO 3$iIod_A{N~$/L'ܱz2xI3!E| `ڷU^G*%%`n$#оAJ[ά[J%M(5V6Nצ3Tds.iRc+Ԑ^&Ke=RmJs4-ծ%MDT8dý\]K,iGzIwڮIh!b;᜴3K:x4Uj;Z`(_PzT9b+@H 86ڭT:ҔE'%> c|%_iq!: *Y`r<-s@@N eHb;:RGpжh)Gp0C\I`3&B]ԍCq6" q | ^|UIENDB`PKwL\FW!W!>limit-login-attempts-reloaded/assets/css/images/icon-ip-bg.pngnu[PNG  IHDRX pHYs,K,K=sRGBgAMA a IDATx]{Y̾ޗ};~&i픴U"LVf53O^ݙwBJ6qcy cĺzl->ΩǚzBC !Q8fIrF=NCf 2DV a,YNC)Mqzlb$z<%͒ mq?h`69r RFQ@MM(F'V9(Tq\m>lF1!5L lJ1I(!q1<QNh)h1klaN&:c!"|<5|F Es`L8 ?l#H5@4#=uFDo0d$QxPm#;xD0$&a M`Cd(qș*FpHLkfr0M. &CI@n#$1Ug| nV *&#@+( Xcp} bvӆ'h6ӈXO@ƴO< tJ㘳iŘv5ѪkD# YvO7:jþne(L,2f uz{cpSD9cVqBྐྵYűzaup ǁmD"sƬc묻80 DGs`hO &z2Gm4j F+~c0q;g  RL3L3VQ G A7D>w>Zow|C=k-V 0MW-?fH3_%3B}gcP}nmN<|iOEpN0W^yb^Щh?t5؇oH8B64d藴2J? [7 ;4/-Zx{zJQ<#BeS!fEzs!Z#=äs\Iz?Eُ?Jg&B2LaacT8+p.xEeDIOd!h?E>,o߀ǮCuW4Th(Ok)"2$ $j A.(r|=G`d^ }YX׀"GA $ Ph|dUc/]ބo؀7u,2}#Ay%GPq<YDZw|z;C].u5xuA/ѰDAQ7嵆/3+ؾ h!5 IW<dhïa"Ԯ{/II{QB5Jܺyנ&A1R{-ۿ ~Q8 ԯyZ/IJ^J58k4TR5y6il/g{yb$jpdSMC:c?o&vHCɦGe>ĈccVkp]W2DJ>&p\{xMK9esz}zޛk>i뤨e=(VBy 6cC*"mxMeݻN+T4aӗ7m,/*`G[\`! m<ĝOzwL}N{-N/seV{y{`YQ~/oGrAMCus1XRW^T7{E$:²oȁbC9B"xNaCR"!վ8bVBusZhB4Βs w^D@%`~wncSWϖ姪pLkz@%pDHe: O (k%laCJ@e*#\djQ`6ɂW5TصX=$R y.s#I,hn]")Wgc" ]n HrHM7^Ps_ڿK7 b__؀geEӗ,|V_IYx|$kF,(-hJ0 JQ"cKS P#bFZE0ʂB 9m&cN :~jL%LJ|EҜV"XQYOPs)2VB-Kn3ic'T. PK7 0R9*Ac-k-ËXy]? ;d*{%hr[ CRH2E9#B.C]+jW$WmjBEָŽ5”2 j`)[S"T>~eҚ/Woj7[~ldJoƌk?YمYH|2چ=y"̒2 " NhFu=S 8@"*M}$iA~oܿy2BӴj\ aOj-gwkwLPAϑ-=@ӡ:>M?0PPGţ@IQTDY=6rmO׃&t0 sk /q(p5!X"hb t_wdth㋠ը ()m]hsU︪SI}8]?<W+9^LA]=CŞTi:ՔR&8psoF u}5^;j$}Lf+"T9@s5ICsW)4;wQ9erK|+p.elf9Τ'E_eAr)zjy)rU2IPP{Cbn҃ݣӊxRGo ?7ElHA*FϔV."W!Fc^@eOY9 MIqKwbL&3 9L8lb!rlPwӉ'@i7|T3zO'Y`PdQgERX1!,w91Do]XI$L9+ N ;^e3L+aI ѶL&;yqrK?ۭ1fա4PGlne! ]va}[>-~3(ny8 j*;>X-lK>C=6fke5HWܪȱ_99R%h!"fc1&ArQZ=/Ž۶WIЅdA߃r~L+'35n1"Й-!#n_ n}UhMQ٠+;F0 ftD)5-iK Dufs]\7MjKh9h).B$=3;)@:NvduRٖ䐣5]'e3jՎvҝ{X Kak7lMUnA WRXkɬ2ȶ`'}L3ѩ &T烠` l)?Bs5+uu>ɁEEe)1l20 &wbTMbj?)|zJ%}MمچB m+Zh.jۢ*2Y7SjA$;ѫz7y +$FɖGʻp Xm'w&;ӘӰkɓFc:ĥ\XKc3&8/ 5oh}wi=.)q^4AddZTٲThBA(g@|?!:bӆ~&hPav$.Rv1lWێQLsb{{1ƅ ϙ9 3>$tk^ىn0w>Jw+V#ZPGz+N-ߜ BL? 5^lbE4]bz >HE9e@9EQB9;tmmQId&pg>3P?ESaGNh2nt@¸gSFͤDt#6Ǿ1t);[8>HtppAP .VLh}-d:M@{yM(nݓiq8NzKr9[kX%]wF0I"&͟t7 q!nxd;OW HR͛"\']Wg'0Ab' 1DDִ};fWBLNdqƂ b\@P`ąl+Vko\"inLeHx241xlAZa٦&pXfq"A' B9i]Yļxm8A4ҳv[KAĜ9iܾf=$Wav =FB(/ Y 6Z4m֣q%` 2 y"}`ҬA$FҐ89i{H& Nl!pyĘa8;=ə 0Xx b(YG)Xn tGET=`$1S^9}TQA /kL(iCRg>Hb0Ay "i.U5 I'1M7L-"6ۇ,5&a$¿ S9pfz&K1Ei3ȱZq b.%ьcCǩmЀklE]ޞ+f@A47dL-Ev^PPp[]Hԁ_yt.94% \:$ElF}vBFIDj22<{ܷOF#Ηz~y Zq);Ǿ|]W/Bm"}Zi'B[ o(~2|WK%6Jܓ pw,,CD[8x|lzI7J{He|OVJQOںMw-=H;lZ jtYnl 8 UL3\Ƭ@p]"'֎ '&ju$-+^[|5:O#=A0ʊ"I;M۶ w5_W֡b9vo=urv7mQ%c][PdTWe,m\W!F`F4JZDE+ 7k˗hςYyL:^`#" #:^'?\98?Hf'NLj 2 ~!!9k$sv݇R޼7nE<}Cbz~tEq b\о0Žux/%ԕof aLlGm_ rcb}$ Lʝ+z"wIQZP穪 x719+ BABE0^F;_dh{J|DA'SGBYxTu&`+"bS~IkN02{d 2`+e1 [y>D'&6y:Md{^v?iL)P5V(x힗4 Ջ>_PTBi35TϵɈkIP(Q jĔ Zs@c+EBHe&-l*WB[R$AM[Qhˊ O YS4{&)Qjtֱc 2bJK>jz,bsYs5A=9pl@MɬB5( + kA :@89y|-haSfhf$1zw:p')uU ϲO,QQM֧޲"_%bA,$]9zxi^Iilh+PUEkY@2`a4WHHMy/>av0n۰S>g u)YQ+\A8JU$e YI̱` h=-^ (,,E˭FD8 WR ZMp};|Fky& g` a r  &A" Y ^1S`0OuzqO"(wN iGm| 'm lݕ cU{ c@7{DagL+i{#Ό~"3 ԗ & 0Ӆ"VO6SsI&Ř2,ĐRSAޖK`04]/ie`d_O|" 9R2Ώ0aƭDHvy #1pgcuBՊ `0Rģ1tJ?6w= 9!0ƮLF149#|Hr F8i\1LFpb#Hr\m>LdLd&nyiFN &`l(As^`0ǝ0U#ؗ'RD4QX0F pY˘\H3Fj ]}Ɛ@mqbZE*+@H"pXD*Qn k F) Zd(HZeր9 ktrw\dvzE&AkF u Y04„'vySYݐ t" U|<k&  y/ҴIENDB`PKwL\SS;limit-login-attempts-reloaded/assets/css/images/icon-ip.pngnu[PNG  IHDRF pHYs,K,K=sRGBgAMA aIDATx][lY{׭ϙIF hh| D0u!EЙ%4yDI4ȃH$$AƐq23ok}ڻ{Wu骮>;ԩ}_FDtD]$-NR8K'eB){-5?.$1eGZ\>ʔT< ]#@3ҌӁ$I@!*LLlL%NvpJ-iz<6l!pcn(&V熃Dzf&@M;iqF ޮL` ?ԪW"I]y7>q?*<‘.M=>xUĸ@!}eKD"y<UT~+yn3:pa2j=[ X@m%p!;9h Y1 })cH<ޗ&(^RCŃCˌhnA쉗,@i5"U,ib,i9i1XZ);r.y^E&Dq@i0B%sb9B3iаenqh I C{Ң*H8ŠVX {3SG "5[ ok5VKhqTj,(;hk}Z\(Ҡ7,=%P,-Zjs-=iD06.e`og׻XOm| mprBXw,QL^ ƥFx/F>iUS&C1^lsxc~/}~ɹq.| Ŕa=ӯ֛p^b 9=|ٙ:#$ ҈V8 K:<9 ǑxFa}l cgmxV3 гF|tW0J˱ EM{WIs\=ŏb0?c0uJq2^2P*%V!)+g7#ka=ś#z_2868M@fxh:/緋\6nEY^Xi}PlEj߃BK2fH#)fKچhWӯ|ZL%]droYu\domb\ N}Srr,t-H/Pe)i| 0l:|L ±7xՒ[Rm۷صÐsWAd_.q't.=|\ +ŇTY).$vW4ST[ D/fUPzү6sPBA fiiTZM GQFfl@T1<,˃g?Oŗp\HN6Yc@K6`(Bvߵ o?v~ CuO<Χon;*d{1gZ?_%A J> dhSm  jDHĆKJƹׇiR[R\]ԊmؿJ ,CExz}'I\x*A18h fTQy) kܛN 9d,ͪFAEh>x&AV Zj@"W@TLI?(%ָryC~b..%P҅ci>s'=j@Iե 4 X31΅ܠ4s 'h$cF37 }b9IH({.6Ros~VNUtsT$6N_wF{b{RHё%GY*"'^A&&`:7@Me+%**:Gi'"+aYG^$">@BDxl\! mu-nHb!%%Pw*kyJQ]ָ:FVݧj/-`CAu`1ps8Wc"b6%P/x/ &#WSY+ۤ{^duˌ2utnYh^% I5 n5] :4v,R9a#@WU-n zeot%PeZUQ}6KHD/6ׇ$bL7GPaQlͻHqEd(JEgoo3FN5kAe-d5_T:yPIƟ heO׋*;_f_ϴ +* ^硭dXVZyfAs_^ H>@&@Q*R  "I/jfR*AGW,7 MC1om\/*Lオㆰ{:e^ Puh RKn*6΀qDI0i:g%uQUDkv7HD8h\G Qٿx;e^%uIXW!Xrΐ@4|BmS)U=7 4UrI|x@1+^X| Dpscn>E42ʶKi&n;yS@7k1Ecw_I&H'^̯(?ڸ7ԙYaZv5MK +uWڍՆkg&0WFR5TFHt[mgF%!$WQ^\u.߄'k>(_ F:dy&XeA^ĺE N/[ngr_3~AI+ɓ$ҺNqPVt$JCf0WHlc^oqKH{_(d):˄ Yh0O)B@uzraaqf)Jx1ȟFxg -M˰́vUKGYXL1cRSM Tʁ(vC+m 2 4N_é^51kY~?ۙi~)퇱74ITȹQY!vSz#%Ln:OdpHӦtu¼F3PqCc _R#S$J Nvs*L'0s5;,䣮L;oHxZsގ`^[>+οnHO]6oD{+{g߄҈ &!0OGC)!r͹ox^L5\v@5j]-9Zj3OYhz8Sdp!yA14{MAhlTz^;Y;mC]κ6wcM*lRj{m-f(/.˳<ݍF4% \vOn4h؄ݎ- 6LyjuE^gæD 9)m V_ReVj{v:bl ҄iC,\Ik'q #:juJ-L ya=L^/#UKVy4ly`epߩjoԉ"Gi9PLd^Fn9OK%Z cxUݎNKQTQcZk--r8ca)"H&ήztWS:Q w2$6es͵E J,yvE= *xQ63SKl9UXUaUw8t?HGXS yZ($UBYOԦT)b31zN&l8e7ѸϺqP%|mvqn<+K97>_=G…ݣd0x鑥 PaNY67"|v% Oeߢ Yjggh=iIԫ/d0N$Ȭ@0(}0vTPf=s{ :l`OًT\v8/,2m{/5m&vث 1NQs|Iiևi؎~C|tہDBE}RԫK k]QQ=#ד̈~Grnjr<ЭG %PBM)p3 nvwVT(*fljbR9 uEy9VQaDj5=뉅5]=3wlWlt3S\ YjR/n40d@1+kDe/k^gB͚E>_qZpm g=ps-z/n5Wm$"h|Y)N,dA=dmb7袷 l)i@ Ւ Q/mY#mQ,lw4}"rOXn]<-J^ou0oY*lu]}i_ya ե&_ԥu c[H*JʍNa**ES6 4k{H#Z NalI4nːls֥ۘu^زr;Zp$fC's1g_/1S2Чmq}_m˟YP,༰e*l]-n5ol=c`ȑJ>4RiBU8'fQ'x3m/P%w0#)>p҃QPPk_k-~LdC$ZZ.'ۗ>(q>TRrނם'UV7Qv:қu.J۩*p9A\PhqN݊w R;C83B\^ "W̤'e'cBh$HWc@[¶O J;~O6` qKZ99H=-H/ $%#E$[c)@ zlFd|۳z*1\~(.4EO8B0'l\. 썘OmŒ=<2:z߼bPpS?sN(~=^6-lL-N֫<>OEIatLAY֜j:SJYb A|_a"~[=`ΛW ԪK.P̽KUG ʢhCTSdZ唶 $PwPL#X숶a)\z^7ZE#ohS$L#™^@d2?;yWT)RLn(ʽ)[Amy'áH2"Ƴ|tL*%yA# Tz b"rڍ"zAJʇl礆bzmIid>t¨NJ0-ޖIv(qj [;UﴟaJU K҇n<}iDqɿPTd'N׾iL.'u=yC_:OuNr>ͦ"e;da`NO2/̮vX85O C nhn\P7̻_fǎ? ]v.h|BlKa :}G!Ρ(nkrFsa--nvDYu>ڪOS"Gk"x_rh G OH;Zh/!B-Q9_g ZA!KZ[[Y<3|F[h<-4ˊꇭA݂K.,BA 9p螴xq4|,ǽtZl|$-L$cG /f~asKX=O.V]5VXhwO~bA杲'ܸD48~~W&?|n1 y1fKOK[<AKrxTsUlo_ ^l c,گLT08Aш3G7I9wTV2 4~MV[jk'@$[ɍ m{㐇iuf&A 4[%}.1$6[ƃyˮlrhx, /9p!R\ɹXRB❛L77V| mtAS1cx AY[\hWPeU^&xTD$QHMqR=9z~!]HoE}Fq˸x#c ǣcnd4ʬB $QT:ɅX958OQZTǼGAC(өxG}2.ez%Yw+ G,ӽ$'_mW,Osy^Qzÿ8ɤeu+%ST$&ȏ%5`iX;\]8-BGҡ$EVs8|EHJ(liJ}#U#$ yq?gHH袷% އ!H=h6 OX}fclr\,!vPzAIH6U[,KX IT:ZA . ysB*M9Bed;c7fsIПosTZ&:Rڐ\]Ls6K~w8U~$2JԻN  t,f)c;Z_BkcmK^v@1JķYmjj9մ9̈́{'$z)G?ݻ'j'>񆬴Ȫ!R@:?c"\z_c$F #,;$ժl9*-=fT<$T\ZH6 Yiݧi^HBɿK3EYrIR.25%A,{ tB5'h"Q$ }"7V8C ]8xJ,IaByZ b^SBjB8_{=d!H-(vqȗF#?k\; RoTcTW,dkWr%㱱ă 7,^sTs.^k /K'kQ CZUK?:-$my49M+ljA]L^)Y>vYYi5s\}HȋM"\/oaRn#mݳ?^ 8g* ZB 7E>~U-0(=U[BZث`jI'/N*םz…vPmZ U*AO?c]"U\Xm]c0 8~dyxrT^PvȢne!H-|>C3fG/[cc!B˕ljK q >-d[Q0y%Q.WT$'{">kϳ?QHGx G:9Ng R'L,aC=p * L^V*+]R]me ʎ7a}%Þ,MSC'Qʁ*07dzN%?eYHOos̝N˚-AT!!og"[FivEOvX B*bug^$R0aL39F}?9iWr!HW 1Ɋ>8(L\]gB-M`Uwez^k܇m53)ʨlԫ A h_Uq-u"?&ʪCʶxBcqY6(춍гIH}+Lh@z`Ջ$ >p@ sTkkeλIeNjT*{4n'+O|xkb3q,A{-'Vt_W%Q>Beu+|p,'hk8m-e]F$6Dg'R良 tOD$QuAX*xf ݌?tdHby`tAt_r rmM*H d\8simAg$8/sFZ&] Iؙ?=d2`{4vLF؝+A]YP+UqiŞ:8RɭڰF0|^/Ľc?'Qo֏>}EYg4vha:ErзHHKULt:$GF\r cwesn\r>)-aUֻꥄȈyPU njK S\,RqՍnTsGP8%5Ūj:er;A*@GWPNP׹9BJs*żO@W#zStPEbt*4@–"WTjuHYiB(JlA!)k}C7 A B 3E/iV7zG6@-]zi8A$S"$ac*׫w k(k#l9vNśdu减ӞOMpAK"(Y$.NJmO IQӫG8cXj\&E+Hٓizle*J̉Vb5 =)=0 <'ipKxv(K9y9C9N Vo;ԪL~ pڻ^ bHoJ}jvDL+"I*-G* WTO)̷x0O)0R!M Km#K;iUYrv`r. Cc Zw_mD$ܲ5'sN#p}#r%q?H?dٮnP$X8?p`C!=.h|5ѺxG]ﹰ%O|e19cAi]ٕ}^ÐP?XM^~׽4s4LdDhqpE9-/G3>5u6]\0??_QMVeحpiu׾_>\#1>De7 Ur%QfM l0q.O)e ltSGT$vVHn&}JSc b۔;4ыTXFV% 6ɒ 5#;9 RζeȂ9LWLCxޗ7L="5jj*5m3tpВם~Ii=\Ju,˱' QTSR\ jd2&s{z S4&iCxh[^7CW|OQx,EJ2C7NwȆoVf6C`1S)*lE;' #A,yT$@Gٚ.x4~լLuV37S8FK4t"]'XU5*s5ɓjyX% v0`"|G=\N<sTT#8[.˜tUAfW 0 Hw 90|M%ug~N"t>4 x#)$}YIU$ :mJir6815=>eUWp=;K_`ڀLPVɰE wp& b NM8. TpdKWb<^Hn"Q #-t~Nx*NdHal8fK-s X=k4?ݚ}5qL7ʫiiA[ (T%PO2?J;RUcO w$S_d @X0hKY"/xAPeRPaYWV0<=nMI@L JT,D@xz7KMx MgCUkVB\ޛRl`ǒpI2&+4SRZ2^D?~DJ-(Tk?r`n[-|K~$;z1H~Z긌_J*ފb|WQ\j] _l ^awTO1%umE/Cs@\N??]^c+%|.'.8#j-_?[0/ӑOPRyxh-StME[)3G,FWvuaPbߑn*%K$4Yѕe<@i/ZPZd' i/;%uLIݟ( U9TjQP:6{g$Hw+mnbw"歜c! {€Fw豿-4lo0V|nAGYCOOֵBW :^uE+y~zbZ$ fﰖ\vF6>@7ujL#t,5 [_waoGI.N+l.Q/m]@Ei5dZ *j@Y"LwccKG?IWC-g)x4OR{ YRr$?re$HO(AuǮ ;}oȱRw*>~"oݒOr~פl▗&rNjzBrj-F;! WE?FzT]ٖ$Քqi>b[q0ິ FW|G.UrΗ 5W $|+; V:bɠcZHմ{ \>*w,+I+ 5%hʫ>{DAG.\@\%ݣ:d0Pk5R!v$Fk:Y]zR.'6 Cl}rm5-pZ$P }AY-b#W=-&d?5۪Gu'?+ 39TThu_g~ ~lu?!D*,:Ƿxg?-Ez16RdL댛˩n+4@s0Me ŵfh ‹&Gզ]/0LczyoU|JP8A eT*,grU܎9 60/0Jzz٨X 2~`f¤Y=m*訝VU!Oﴂ<2vFbu~Q}(v ɳGܯk*2#ۨdՖ?O6b{׿:ZCWd鼑V;09y=ZTk%9Pmv* ,Ƀ:Lx midX!u`[ q6ݤ͋jxQ"~^ {uATu}$ HKJGGű嚙K Yo[Xdsܼ =Oґ'ϏC70[c% )fv6򺧿9"Jjdծ]EDO1ܘ[LK~EIVd^.#·>>(gDYu(cAV5bY̓p':zuyӁd!Ar=7-v*羿N'i"gWЪA{q 讥;aJ:GIwѶȇodE:!i!J`Ro2 ]\/A 7_;G;¥HqΡv:s8MyI-*_W pJpBx| uw8oHcWrY.c\9;jv@Br6p Y[\Iz㡗aLYGD|:jBwd *H94+4\x)woVej2=_G鱿yYvgCb6jWkDIg5 $ǯt&Wb m-Whz[=sY7P"7g YvzJk ޾~i$r :ʚyJ(94l[crde .zD ѷvzE[6Hj\XKyrgʻ.Op≑5<鴎l>QD[Аۤ+qT_?m4s,:juL1$8V,$;v}xpėc)zKctϕ*up$WR0YʲG~$zrt_rfuͺziYUiVMCz(bIxFRqTrڪójjtg&k*m%vXӵWeJYB;91qm]_bn龑J.؆ @gV:% I@qL':J'r0ciyxf@#DmpWqt^t*MfxYI73t -v8?'U!BUs{7;FOoN#(u"t̰.Y*Yq8.5GCY:b#u@ CgFZpt|ɓ-K8YUR9Fy h ҡ361ƖS`AL!4 3YGl:"2?ɂ,-u!n0sGX-75q T!cF+"ߘ >3_ DaHՊ+x]ә8ڹ~6,wC) $ /帋HW`N(H эӂLU6zԪ^3ǩkkU__}_Ͷ j2FJTzFVR\P:ZAN/l̪E GV;/dLWn^ױB~SjMtzdZIG+<]9el\у{l]TGG70ג'J9҂ 5BB8fq"dADe.oZ,H\kBsD@~ ^z;=WDOT`:89Wf*8[)ٟH%?%! JvM()QB0`UP:Jƪ<5YWޓ5V,uyH񗅇.j^[L9/x4O`1ob)UP'Tǩ[Qv'EvYE)-[!G4m{Uwå TQ@u:C:"xd6[hO [j-0I z~[ "8y\Z ~GjUu~EPYwi[AC|j4# Bj#2 7ס:iokUjCísuD^RuvԻV0С5:AS楮CBaQ&BlLTmlyѢFgtz f941HKF²AnUka,{^xAj[.97m20X{9n) I VLiIn[S+FS{]Q7$#N%L4X] )$qђ*~;uxi ?h0ZXTuUYMG $Q41h& 5> J|r$l Tj$mbB@Zm-#Ve 8|9Ɇ+E[gD-ph!]*vod`Uj))vFQ*0Pktjqf< @!)UpT}$r.$T!!L2B֒X ,H88oRՑ' bQ:9 !֠IENDB`PKwL\S@limit-login-attempts-reloaded/assets/css/images/icon-lock-bw.pngnu[PNG  IHDR``w8 pHYs,K,K=sRGBgAMA aOIDATxRF{qʼnU)vqH&X "/`,l?ľ \1P)rpRWnIvfԳW%KBx<x<LSDXj7R@ >L/(Awd+nÔB_S V@4}q y15'X5po8ioQ(x?Lccmǭ:jXTN !nxxG+7_3"׌ TX񏭿4zB"sBӳ[?u%.8a{k;`F?C([3 @6PpO c>{FK>YP󑭣 /入%Z\Y_ B Cȷm&D*R(CEװ9m:(z]֨ LD]j4ꆊ!)XZu'Q Rpl앐+*b$ *3дt#!|wS'Bef8`tXUi@oD"&T@"{?z[ep>0& bRlgqej<< a svkZWD&',b #/RrF4Gd" 3 M%I ϡJ!a߱)X1֚U-$/Dl,,Fq5m3U=]98ӊoz:sˮ>qr7)B t4VX[_G+iKؚ21$ī\vWH6,Ÿ(H, зfZ061k/=P}q'1/~9v Jpv*Oo?hJ ŀҪJ .p@vak,IA3 6M( '̉A4HA3_z>r=n`yl ރ.Ђ]Oj`1pc>;p&oQP yйD%Sf"h{D: 9.+'.J_S_Jct_q?AM?S_`kAkf3hL}[/)C0nbrM; %0O ئkP8mǏK}prLebK& pDMb ѵ%=*9 Nyl(D4\љe*ZeH6}`37@@LLZ IC",Nd1.e]+bt+[BxI \Ѕ>m\zzҍ iқ6 SPJ]؂*(K 6B?}f5] 2',ǔG`3)wO w,K$N/0)q0Q|aZ=sh5eteO`}Kюo ѿvt7R`xS(x8*8PXcx806RDmRDjv͜\b@M+^*Ɏq&e?%A={:zګ9;xѬ 9Șw,DJ:`L5;5V(_-K-W0LqDLJWb6!ΗR-2BvI+(7J\9<ʈMNec1BQ~ٴm`I;O<DElb%@qvY:6ɬgYX#`;,\̇w'CSH9M+58"?j vN$y Z2i r~8v_$Q[ʐ4W( ed[rH"L3z+`sP)c#Ɯc܅P431.{`(bw;淥g^,7[ߖlĭ_&Pi>8#ZWU^Wzϓ1߀7 @q=G쇏Xg$0Whq <ۣe4(gDیO-JKI1 B'M`Om? 2ז<#΍*}`~<Ȉ fˈ1;/ =Zl<c~ .aӟJ.9cdB,?^McЦ*lB*H5y ~O[9gbwcY'sF2zwDe,UBz1.|/ػ)<>^U<1+BeOTK*JiӢG Pim!j`BP\~=~c#W'X%Fq Y;߉aT=x`قyh$p L:j} @"eSxkIJe PT,raOa< 98hV c=E1 ``](F"u&}*2(#K΢LUHh|'TmyMpir'0H'0H{C*c3|/Ef Z,@VJ[E*£k~䰯 3T!l$o[y63/Et%>{5_p WzYcDWwvA|9Ms7n M`k=a@Ooz[b11TcSu-R˜w%fDcН! fJI9JiJA|sZ|~[q\=f@.E u0F#qa5 CԛDb 60X'a,!8VFp\fTRKm&l|: UTe*< $Oѳq?4猟 z<1cȲ=*W܇A!ҝ` I_EpK dL#pm~~K_H** {An a"S~i`;<xkaʤ;䗥uA* !8 {rXFuޗ"I?N3ղ M0,g~|y,,bIe5 E$C:¦RcFʘXǜ5+Ľ$'X(֗,@d&I>y4_RݹQ(pjybV15%& ^!EGnOs>cH?P/X!>em|1 c;y]o洘KW&LAǛ?h@ f i|S aOb0"ܸ`fC՘e&࡚ x6&!d 8&H?fy ì8$ORm| ^– #xr *N3<6Bl E`XǸƌ4$"螧j,Nrqn|w -.z!1a(ToZmV"F\9\H|3?]E<4k7+Qe"?Ѹ1_'3,{H eJ-ѴJ6$=4xg|H%S,ATjl10=3}Xls}ojݫ;iՎ2hJX<3>+$XjD\H%8Tia)kwcwb;XI+5]iYDUqw7(-u` vԷZ #\'5)Sx]m ƒ#n"MқCniߛK ` ~+PR|m>ܡ%Z̪?P4/5UÐG OV4g(2ZYoڤaL=720$ -r>WInΣR j̑tۼ3뫹n2^'a:=4.`z&)e_+ =F Xf\AL b^8HN93_\*I|L[g x6պ#MdgQqvn 0b@=0@ Ȫ E&t#/pdD"GF6hEQvLm#ꅹW[ջ8nRsZ8gD||4 S9FطnBz r>KU$שZ@>Zo3 N->մ='`.5C\z= 0,k\ h'N۱АD83iZJ}zˢ `am@&lCvn_&QW0@k㆔]렌I1,O}´r Qݍq6gQv lkW,nn%}!|=ܦ>{!sȵGaCQتb0]za"5xB~|KW ^R}xRpi' kܸj,)׀E qDfZr7{H2\ 5iTOKoseoKG/udٲ9b:gcF.G].V6v,Xjb}@D<=aۼ6PqiLTN!a.(aX0h]p/H#J P%,c)h$EB**m!E{!LD/:`i=l͋Ne2`_OJxYA7ςJZ 8-gX(Ĝ_ !Tr7[>ݷQf0ٸo3^e{2jZ8`pA3)`>6 .K+IRH۶▢]gNO/^2}+Kyo[ZQoAzJ%\ܯ6oERAT)pke^#c hF9Hz٨hd TBg]pꎗ.ŤB,AzӸ, k4c>wu/-EϹvqz|g~ܽ XƏ;:YrmexHo3TF9n|Lepnfz$&-bY,Pd/%i;G|bU|G8+Q=5Gv}\\K>s4$L㞑}=qKe".ew5pK{L(7#2ą=t<6E'cMkqns9 @ +=r tƴ~8y8bwmg`fmQXU76Ϻ/_F i2v`Y<]j .D볰VNj:c)+;sF~Kό êUge?> E>GW{fө =oc'S-ti+\ ik/Ĉe%h>>aجv{h]^ {]8-cPΞ}pl(>~,n4h2]z6`b)kLhHoAD_J/I2 &2BOk2S+TY $τޣꊽٽU'R)K]{[D\5H  q"s]sbJ|K|CaoE]: b)K#qvshgB1Uγnwfla el7u--Tz]+&cUy]1@Lb16ܭfHDo t @50_`IF9穃yXRxala ցs}3.(4]MTuYǰF联dV,4xDB=AmHFEFŗ^t`E.h,, #5iHy˥X*:يuܮ=iFe?zʘ9'N4w6mmO[Ҩrzվ8Wpwoa#&ac=Zݭ;%fSʰÁb0$I =l9إWkZDlr@>{}ow瀹1]Mj:Hzg Sbiofa 4>2\\ m_'.$2/ L@|*Y崞[qV5~3 `{~jD &{*kM;1͹v1ABFٶIr<9a)Ķ5Uگ9 ZsCq9pDysT^l)|xD"\#X67KoR=@MZh PӀwG5ޅV[1(?";ylRziINm 7uÙ/KUS ¨|X @v8@@ qMP}f>! = ]n=YJ㲝Ce@Q|I O|͵8NfƨVlj/'Q,+}{kul;<38a>5P;ࢡZц H +W`-RIda.~ eq9` HGf6kv ;ۍt!\:irpjX69&VNjфu'fLK7Ɔ%Fagu$_D\xF:)*feI So0>Zt>abh`WX-vJXRXr+:da.6vA J;Ri82J\hA-D3r>Dv,f٬: 0gYgt*T&F3˒nO/| @JI7vBӡ,J76Nz?) %}:Yx~R9PD˴EJ'G0ϹrC]>CYf^.4 Z&%N<92 诓D\=r`:|2:Y|rQ澪]$FJ[AswNHnݱQ;%X ?P9Sve ZU5hP Hغ1]`e;Hdױ. '^>sngS@g P.i8W}@s9϶G$A$Z]v4"gjRl NG9F6-a>_tIENDB`PKwL\~""Dlimit-login-attempts-reloaded/assets/css/images/icon-pre-install.pngnu[PNG  IHDRF pHYs,K,K=sRGBgAMA a"9IDATx]mlWY~{9^J!D%h/R#F# {mD`VDAKRIӒTJ-s̞|w}Μs=}9y׻4YdtH_L@Zl#)$'(ѹ\V$cU:"OIFb88\(#@[ܱv@Rea"ALG:Jdm4 iXGB ~ZkǜP*ͣ ҡ8'$#'͝!P{Μ6N76{;0zU.3P >;Y)iq" `S.L wU:I_Z\J3ېKEG׮2jo>yvE!/w9J%ڽ N>pAw=} .!I1 B[$0^ˉtpc.ԐvXnVZdTϗ@mFs zfg6Zi{ZTH'+TYbEYL{`j&ߖ=Ͻ-Z!ˍjOA)Xk " Zm)-jEZҭΨ>--SG "5[Vj@=ibP1Od Ĩgo%r ~~79u]8((dUS: A3OCOPJy0Ȩ,ߦӎz7qqעcn\K1dCGoB<#I娸II ^L)egDv}y'bDߕl%y2,zzo'y~F^Y*_L7N/sycS8zSٛ^:‘~,5-GF\2\mCVDt"JO'. .kne O^H_쿺1PkסV s GCc|AV<,ƅ ҔAagf "H A&p*0Z) uXƂD17[gp ѫpƍo1_'U:J!DL(3 ԴHIPs+Czԫ'~Pa~g'8ENr1'C=ҦA; t@" d]I{h)sLq_=&=b2[Uh$TBVL L::"a%cH1I%|U'ЦN <7,$^)$qv%e+8)ڽ=%ɡA>2)N6\p$!+1TE(!㬈7m6D8Nf/A88u(1ՄA=Q|*sy1F9 ɖA=]HW|A/$#t,@!yMPGӱAeAc3L.< PVYgQm$ 5aHՙe Ա|r$'* Ҩ~ދ7I|6|>ԍV/aN19&.;Y׬MƄ۶;`srNgu,ࣆ[O@nFD$ *)==.8Z7Yu#TO0qn2v t|% Dž(]  P榈o6DD:0).9&\+"Q)ZXEBn5|}ͅZz"JLi ˕ƨƮp V@CTV;M2 WCvd!AFDmo&yWv[WC*>]mjPOu,'*0MD𰬿9[E,8 RSXtF! Y3W@#IpS5o G@X'2t }v| Fo#ڱmKKŨꗳv]a4SA"^ h:N0UPaAHOl5-b3S R1Bv4@[T͛C?*uօ:@f5i hzjܩA;%Pv&&H^#wEGpD!B%Fi׷jFu 8h7*A|Pcw8$Q RH$QU}h4-nCƍ-j T.!r\?^HwCͼ !׀뿢L$#ACJ- ]ލ;Aڍ3f}b@b܏#" (fLɉ=[<[hZT"tS3~#MS@ZTɳocZ>5w`G$ m#( iEDv:9`5Sz9q3tK:dĄ!~#x殹cYlǸ7#fGNѸZu ҰlT-eԵM["902;-10=5d1ӷ]4r]o]Ooy{wiE6 "/ice-fqzx>SoF 1m3[0N{$EO-TDڏvL_bV1 {3"%,FLy*Z ~!?D`^dzE9\ Poߵ7͗,EIHj;43Z6:d00I-5 kj<__]8Mi`Eq?;WJR֒4aU*@mg:BF.ﺰF푠%J .wC <)1g"kNI XNljzÜu!c:m0OnjVu5m3ītF3 V'Z:`Y Cz*i"1mAp\ 3V7_bsk$0Ԁ'0RȐxugh T)@1*Lΐd]8D*SL E$\l_F'QZu>UNq|XJlV-2 rz%n=nrM76 p4\a^]{-@qFwHov nq5V'ĝ{a,@ŽuMY#O kǾ%sF"=_{>q|cg3T5뻟 ˱2ur|$FP6Wh>σ<BvRH!R9߸le-uwC8~U p ?)G҇\tn Q Qkv.2 _*T$1~!/  铿pS™%KLC_:+a2ѫE52nN͒D ,#XvƢBiv}TJ?rBS_\os%A8᪊\*`$>6UqŁׇa<%zާp|\nr|UtV皭M;wuifT0Jb.!&>~8&9 PvIE/+oCD׬jSL̷~@d/BW&S:>Ody h.6^14R+Z$eQx ;/$g;W[Ad}AP=GF'vlg\:T2;Ѣp.qnZVz+ac߸l9&jJb eؔ<^oU~v"FϩS60`ʕ/$nxs:n-vpf~ЍlQ2UL;(t4'Pxa)"7 K1&ķWk +/mUTtIl=drs/lgC cu)~`~8P~7%:nTSaUJUYNh;r L%5(?#ǎfTSU[<ln81Kf hGO1zbls T='d|wH±yhΩMX<7†gy@qyw&CFS+a͸l /<4cDSE_jr ;v$AUd!{X9O_gV0T1<,b9d=xk2;{DP: l7nǂ<1v&f>QVVr&^ga5F44j@ngz0=ưQۂ1 ߍ٩†LSN҈} y2eq̀9̉qs]WIuDٸ/F@F &Gh+dW2z2d<$vw:4}(󌭯MK%VwUf^6 Mό#6bufƵ::M ؐA>d 07R+&w?6lb,:H3ZJT}m+V$C]U\A,n):TH8 Xsj߳u>_7T*%_S_^Y/yYW|Q T&ߥп9zo.L$r]N`_ VoeK&&=H_;AEIGUÜ}&ya3b!h]TeQԹ nJh T] G~sݑ\}Suh܍uc74Yq6&$16Z煏*PwƁ{c˼8H*+eH&j+|y2hwjA`l6IlT?P%'-|I*)cryGF<<':i0]xʘVȅGKzX]\|dNHjp+6`K.)^İy #4K㽰hUqYIơD q=aenAΥ;vgu c# MMc"ex3Ft.lF|`x;~be8 k S9D x[JZ'y[ψ9aJ8ƲVa&qj,e[n/(}tBClatIc'US7 Yr oI6JeYq9@퐤1aJOrAnp01 dam"+c[C<i|qAa + ~1=e s}a`d"M%P[ZE*Lu^O~pͼM@xW9]vFއ uM7yɞA9c}E ]#BWvZh $$Ktz|`s)66 SxuBl>v!wzNotY.7t둭6+I)}"b=⊷kp' P8S'L&{E +, :_.Egob^ 3I}L ffeE,"zk叓d )6Ƒˁo o(-"ݐ8n(&u f fkbj5Cfn߅G49FAFJ>Y/tvD5-w<AbgC,eF KhDl-L*}^^q/ZN(a_\s1:|1Zs$)DQ&I3ia7<ld =7 Rp1b\r,gEr7O}VNX cdYlykdj!ٗʱ2&>]M1s6bI躳|1}6U].{>ԸMe M|mHN6AS, |.< PD'^\Sp TKBbgfg|*j^ymߥhRvYZ屏O4rvdw..;?{9<9Z@/jեPT`ƘXJ溸UiV Z+UVU;c>z7=2# G͍}g6/o@!+!d) HvVǜK3`N}C/r@& ZDh+Ai|%6e1Vs~SLR0:QiG 2#l8@ %J2nW=2kK34-v ;!1eP%t 2M:ҁ~sY#7% l;Txw~xƥSH<ib/}LUX(q*^i&_&E 0=~hXRI uv NhKM-g@읨M;_8#ȗNs+φʹ߳gA`$ ؝xSn|gjl|"u[4R5*$#C Qa|&B~$}l"[=^/0Ӡ}W*mX.#VUW;1@ͮȲRm@6Rab9X NxqY_;VK<67HOmhUJw-z+mVQpǍ{&5UhľV3ڰMQwˮM`0#=D{Xwf@ۇHtJZ(X5d@LsXQ^m\l.z9#n3O7] x Y۶C?vNjMib6v@ J!whQX@ a+Z#ˍ=2o9-bjakPxddӵP|JZ4)]pڰ5[PuɻJ{1@҃Crcc1#$WeI!-Qi>d!s;QZ4=W].H vWԼ[@ܸDW>h4|rM 5_<7s f.hAum-ς$(B9Ѓ󂶦t5pLk撨 B8U'r11] vmKf>|-b'osG$BUac\;8H¿VwK1jIW^Za87N:-j4eIyh~xC4>spth8d ؽ@ZJh|hu5p{l63|ލ[Ww7.1o*|I'uZN*܄xvF˨'#G(R*^V% 5HȐ֛u)բX0?`G+8%o.wJ) ؑ%}G HAeeGBnd;'ō~ :kD*'.寓~NRL8t8J\GݕSB|])&JlUVVFx2S7&A}S E83N@wZʡgSx, t#&3dPrH4W:܈z Kwx''818N./5y2 9Ng-2 ABχ Hp9|RM8N *.=XR?+%bxs?o,ܯsT*Oo]wʮ?J)p) :pUH}pCDP(jY Ni_!L.,`}`)y{d9N 0 Yy6 q&sŎĨX%ǰ$r#F %;d2댆܎᯻&{pm #iAe^~$jN(Q\Ȁ *.׫C /a)os+8p1T"1@DhN9>V0vl^bDН`l4W9V#pp"w$s>S 4ँRrcVle+ =q4kU2%W;"1q\r .30߀|=Ty GzbRwɧnE *fq'cP~7ws xH; `3|?b:R \#-1q6 nq*ǎLu1$Eh[SvcD,tK"0k d // r<2AgÅ հ9D[9tcx- xQe| >8FfRԆCyY0`KL`𓜀b5!T Jц0_[L)=H+pN²7+dS`I/n6u܊J}b#֢lD׾($z*6'b)'@wlnDN8/g,w:C KJ2drM++LWXpO,DjW6qPbτ jKԣm]$Էg]=86w(2"N#Uj4{%_=Mam # >h+@܅e^BR+bZNUr4Ԙ{þJ q? ^1?. <1Ųv *,*5ZYgB+j$$/w$GH97*y\% &m >Bl#]eASׁ6~q7J-#{ )`UmًOi ZZ D*c|"g E1\0{ƿ[9=q![S8/ VV'ӸM7Q+y<}_s{ ^o[nL@D mZpc g~!G|< /]:DsE,aQZcy,8x ұ)tJ-eA?u$#<<0c]Pd(!Ѽ3D.!i?O젠w *aU3$DL|n y .dY7!<3w4z sЇ3Fׁ8Wܱr\o^ XD\^VyxfV}!8\<ޡS@M!t6he2"JLrL??H߫{c}Z_ύK4nVKnUhE0Xv?YT+>y|ms #W)RMF\J9yeaicI!."w4u!eQڮ$6U 2<1Z84˿\/=݆zӟ5IPixhJigy'd71g6LgB:Ȱ̲d/o<ȗ/A0Ο=`PiWS@&'[vf#x 6ngaDn\#<@EUE1R󺆽܄MN< ѐfZK}%Y?t@EĿMtxhQF\6q"0uke a .x΢NҧqٵyM``x(Okl®5=4k Zڿ@N=SWX>3,q['@&nɸkdMbiLgppC:KI(=BZ?u0Xq@ePIA`L/1rtFcU1ǩ08smi(23-EIdQEM馰XTxfAbkh̯J؜&N M@0qXǵysqEE1V]!a۱ f8-p^ VKH1}i*Ns*z{KAՕLÎY( :PQlOyħ#&pVߐSpX2G)avD3^"Ud})1 ٍ!Ps .r@(;jRP^[S܉9iEEс5.wܸIY8J#ߴ[rv59@l]=V\uՠch`L{RhytBiWTwz SyRqn#l8j8^<<:VY T*WxR~1WD>`ߑ}wl0$Ȼ` 2 XOj4}yjq uLor̅rGϖ.;k-B^_68|B- lV+xD eK r=Z?[j&AĴp"gB?Bn;\s"XuqOa35]H/`:w֎Iđw?.M;[-v6[0pdxF6(ԵIF鼽a@b+s [3z \` {݉ @BEWK@ҧ ,8Öa\&GڴPtv=*\Y4\X)Sf5Uۜ@8 k:NtW:Qr/|eìrbr]VC&`#Muą4@VWwҼ)uj<38&o 2; UZnH=(Ȕ5nwkJ9Ot]SMG%T~YThU;Utwnx/dNb[$KR]1%)|R1HcgE~eDd:p?hDP Y{\ձ%i/c9chzV"Yy;4: /(`Oa\,wٵ ۪Dڼ.: ۉLe1VDB*3_5(kbk˅nVxk=:xժ~F:1L\Xَ{# ~_Ѐc ,~T#E'^3PJߌk*K؛1tThdʐ $l"C 7i޹$x2AdwLHߠcfbqfq+p ғQXYʎ^ 8z^ߴőn}A+cY:nT1VWKm"Ta  i '&Zz!㍟Ԓc,-SrewDK Œ\!Pm< 5?qU?)f {WF?niMAbU5QU (jτpݶly-*dOǪ5)2խh(2_i„Gp<ss4rSFť>دUN&TJf ?Ӱ'[3|O4:ϔᘙ̘J{_!~6|SXaIZ:2 M"Nө9Αm5U\yh5gZU ^h"c>L9Y}h HES}[יK9iO4*6P4[ zCvAWւ% %wτt%Y= lRGN[&OɗQ?d0BNhr=-k9KL&;|?bm ~3݌gGj:X۟4E jQԗs.F沪h:uNl2^ t~܇饥 d).aY+ʾ/\GBѡiTz^XpD#B 4}d)ex2Z'=Ze͡D~F }c[~Q+аgVMh 4!jkSa&hYVki\$&ꆦFȾ e7<μfO8<0ݕ4m]f/8|;:xz#&M2ѤU "3L /Im-z&T9Ϩpe۰ePmv:)xPQMuQSf8P򈙈O =pk#R3'$.R(,ydAu"&B`{mE.CaM{~(+(v\tXNUbLm(pЃV6a 4 qt?",jyͿƠ'b}GMP6 ykn0. 7>T$OՎbWҎ?UP(g:<-ԦOzF-,UT󪊷S~a}" w>$ΩKMg?u u!e:#{F" 6Z<ǵ*–aiO9&ـ ܇AfFLIR:k7O_S3=`Xa-gVxvfh!ruXO [fjL6DCч6Dj O*(>{wC[)t8iI3E4VoB2Ұ$cS ta3cXk2;'$ذ(?@t|_K3lSbsm]2vr]o?Q6\(4j*}u7V֞ܬ#sNipSPňcmw3M5.oDGFcCa 8#zSm9=‰7TnK̆M A,s!SĀ_ aX9/&O>ss= sIIGs@^ox Ŏ·mn-( g7͞"hDGBP͹+޿I.67DOQu3HVy q(p-*v)q綮7ix^G&Ac0^ߟ"@oij鰡YfЅJu<"{j0BSjj}dQJ. DYRGߗf}h ǗCu%eąD*TВw_7Leg8NA# mǓalWRl7'#&g?e"1L_lM,$tMuێ@`7.BT-.6 4 ;},XCfE[3V<7`ބ%:bRGh:#xiz\!6v2v ֽGfXr"Nl< ?/Nh>๿4ۙ\;Ms˙l,[³&Kw;nXe); &(G,6C2L`Z d=|" %goQߴw {έ$!*YRm(%Tlh|s1Y,VL6gfz "UN1[L55u?Ʌc/]6s Y@$f{cXmo7k8@`9F&by3sqL(=Ǔ~k b ;Ѡw$=rq|rNIG=pȇZrrgLPDڟ''q GlE  0s[k}EE%ңt.Cq:ugn;r18OPe F/>J~ZL]1s@c V31w[W*暸f2NHtdz(vM1kq㻴&_ݨ(OH?V{FGBGXZQY?sBƿw M,vXm3^+''qC~{`Gi=Í3O[r 8m㠚&WjTMVKemA> 9M@*]g%4x]Il&4ة&] +$w w9D@-Ix8*B @Sb ꖟwS(uyRW! 5٩]ug@I_(gW\Okͽj'3!2qE[0L5ݶF-@$uӈYP88 X4+<ɊFs9=k=/zA_ecoO ]Ć<RjFYcؓ)PJ3*Gd;)9`ɪYƾfnP zÛi /cL\I)t>cXm&Uq7ֿ3Pswpw-w0ժ"y6TEɩ(qS}T;Ra4(fȐC (Jz7k{R]uAL< $ҕfvJT8^GpD`J LoC89LseҜpеde0Um`GUbW&m<,u}2맃0טhpC#\R ( =@\MfFLJ8θ&90  k}YAaf`r" ,W++u|D^5"k=A6Q_@vEQW(k'Uf/rt]d+I"hmR ׮_g+Pi!vCySl*ũ~XE mCgfWsx,a"aQ/9"ش5gZeZPlK@BGT=.baԇOXK]Yo!vcM0 Rlvf†!w(70xֲo9M,DQ%c+gԳ(UXԂ 3WIyZK@,Fgo6\ʪ\mUFl:h MrB"8$z;xoϩk= c:U!ɘ{faw܅GJBaY퍨IklCk]Q)Z5N襨 wזwR4ڼ4z'nv:nY)ivDU]&{UIߗlm'Uj{HB^BTs²8LWUS?7zZ+pn.F7x~cQ.bm 2rtxLc ъkg>t :|gtlN#kٍ2湌OJ"7-S'9`E.vZn[l ғ#ro.).N}\ hg.Áڪ,m IӢAtoɠύcpFtq4[ƪ(ˆgeA'%[ l[Ym uҚA͔YtMhGgh]҂.b[eG{;`-@tJ+vJ&p{Rϧ]'w` Q{wC<<36mAph&rVh 0 JPO.8m9UK\) ,g׷ڗ$zՋDB;uUmPh>)2~WǿOtl9!rRϳW::$l>b8T U~d^p&V$94GѰQp&KVWdy E7ZjTqw#I H[HK H}(Ψ+A1 ) 1 e*{Q:.QحNHV(u#JM bU)eD6JM"7q#YX,(+N'H=d)&j׊J aiL `EȁJ `l EkdaQ;`C[UEU%zPn! ^FE5aIBE=t YX4S$-&%Ec$YA,9,"ɒXb[rX4:xIXAʢpيQ1AlalEbt"D"چTIĽlHnd# rs*QVYrX4;m"E_iE+F)(l(r$U,ZemE "-Z%UR.hm" "U,Z+*QwBKt.J+=,V R[b|< Yaڰ-G+sՊ34EkZqInt=WXaڱMYbYnk|gZco}MdoSZns6<}v |WWo['È[  biEs:Caz1:rMh %hs49h.t zWHIhRحȟxK#K E&ct=?Rr&@bi: :'o[!/C,h M+QkԒɢ|:Oғ_YG߭FU iv}/)# si,QV {0ǨXVڨΪQOG~qÒE)yWLүԿ#N^X^6XȢخA;@r91ZM4|' n>FW>J z&A%An2 YF %5*g+#5Js Aƛng&8`8%IUqe@z( cor<ǃ6(Bb:=4p,uW/KjQ$t8Ŷϟ,NgY8#DT,o͝_bV>J^_Sl0!FۚuېA%ƢvWN9=I[;9\HH=$iE~wUſ5N!gS+G6Z_Oûy*B+bU>En-ABʛTv_8x&ZG5$vy#CWވ¼&}*UH-"Xd XG ^=m6ަjG$A b)H]aB*=VDĕ|2Ā/' $8#7ґ`<8E+q9;I!LH4疑Ee1E4;^\t %xQjlnJ*nJ1z]OX"¶CeE;UL$ gN_A$a"I[s:@ZɃA*%܀,HZZHӄutTmpi.- &ogY_ns'+]BqIB8:Pk  J r+mzz6XX!,A%5%+XuquܤqlE=}7%$Its=wtgS7_>)˵ңRXuz*fP빬5$ \c&w9dFm#lJa pt Av[˦_QjaKj  }撍}itmS,AÐ[8Ҥzph#ނ|*Ԗs&:fzup+"He::zXp՞Nњ}=_( HGI-wk)@'#!ol)@+"T8]WR/U*%dꢬ5ԮKOsa)ug7#a֭K&IU&M9)@^exZr, =Q٦%e\:\S֏ 63x4mtU)7"=Bެj/g!Ձ%H)p-N3-@X5q;֟wc(S5!Ʈmz B:$hxT@2[{ln鶦:U/91ETHNoadQX R @b l8'; h((9iIԱ̙ L0[ը3"BL΅1`oXoJd)V 3>0i3I`*{!>YGH tZ&n]҅L”$E=;ȃ 0!EBQթޱު%H0NT Xl+9Sq"si4I8ij3F2\-5bE` p:k-8yg <7hZ;.^2D6,YuC݄L}Xd&2Ԃ #4?_#g8AIߚ ,ԸIf@lx0=מ:-m,tF0~/F;Ow]O#t Bhjov 7N%!#Q|^wyv}j:էb1Ǿe7IhD7{";q%>TG!"@<xvz6Cm q$Kb:~RO=~V=늒?F:0p['b _ZGi PHӰA'ف1z⿕QВfoAVDmht42:Y^ GKmyZ%+n F۶a7R:odKHz֖P@$Mûhպps49y֒%7aG gO $˂X 9 cCqK*#8t*,|av8}Έ {lW#ifUs+1Hjhr6uۇǩ?+4R3S6\_·6AMTo|csgyZנk ()I1? ;8)&ԥs. N7["ǖO{= ÂzvZ R}n\4 Б'طu6hK[)NzwiW6 vE* ~g56Ca-P햑20Pqk"9K߾h)x4\gHLʌgoR֕ RCށc~)QRjvc+ =nYKjNDP2J SD-=];?L3k?$Ǜ*v6Єqemf~CY`;a 7@HA ujQ ")#M%GC|$uKbÎB:H{R &YПHsMfڸ{ܦl+K? I.@6&qJgEHL_/O=G3 /9ϏqI $3s5Є[xvjpkDbDEE#D59/(dIM#xG|{G]YB+ux˒q޵suj4k׍(1A<`.0TLvE{=F(yg;Y^;G~ԑTSn1T$Rhd^ä̝}e#$C~zY+Ս1AM^Zap~J߷ڸ&M>ʓ=B1l]yAA)h<d{ŗt{H4Fghn<@k$AF:s%x.-oS;=Xj`#9m;49!q3Bc$NJh鉉LL´> @pFaߝ3nbDy_\hpmt՞Q~6StTK7(׍I D?}XR+r6ͨR; ͠Sz*vWRGe?0qkȁ*=uj4>zqgyAWuW:Zy@,Ւ[$Z=Q C Ipqq'{CBKQGH£:Mҡ .z.SOF:$bT(+/J Ͷ]+R:ڦ6ꜸS-xyF²9 &u[xSX1wDѥSK੿tmesҔRe J߾(ٿq;P s NdJ_+z˘ ܍7%vDD1iPJ"$B@?Z w /l 7pUul^iTw#:0diaܹ@8}i$ȩuc KtF]% $?"8u]gBj& W`@6GeYQ :qt5^};H5,)O?] @&wI:$&1qHcIXRh~9JANF$0ଐ@r>UXcSiz$m=QD黟D wVҕKLUSgˋ#5l*&"17MY tdo]= T$^0ŕ79#d|xh(+*J~: 4ٺ%!@Uюwns5$4EX7ULVl#e&sdS2)p5(1Ga{HԒR~_;hS1hN ރ&7-PpGa{!WdQI}ljQI _.Թ>Q1cC8YD rSH͗OPy.tB ͱ%QeͦU-B A dxNzMEq]PrXV[>"^:y /.${sZ(3MWLe=|UE]yH71CZt !Ns65d>aiʀ XȈ{lpѬ"?>} ]0{$1]:#s#%+ m|$JJ=-:u-hqД[IH:4w:@Sǃ45KWPKWh+߸VD[.360q9A9tG}r$L'EhPq{Tޣ ({Up Du1b.$6r.ypuh1ZrZ(RDZ O|y^rO$;.dJc$ `$Q$5+v٥NDǎtGÐiC)1}M誑ESϐRdV-1%Iԛaџ Q:'nov\&OrN<o1" y M*Z`LdTI}ze(Vute;dH/Gd 5B-Y%E;c,rI |i`HfD?o.]?8;3s?.=^н9]I8RGamy418*HpZLv9젊$S'܊t@ծ`c7. >>N~^覤X\{9pd>j)C9(4v]_?A$hQR(=sI҈QGyQsoMR֜Yab5dзV+3 ȣV'Ct$J=) >=*oO-n`HI"AcTQ\B Sjz1v˨ŀtot.e649X'm|Fn$-}3zM heeR-/hQ8D㈰G$- zώӛ?Rn&)3O~54Έ:%i}Zf_61$Mu'ߝQ4"sK$朲@`` rZf9 4X3^MyNSN!;5: pRԅcYsh r&T4v8Rf֛M31Rp2٥>w(r~65IȡA\k/ Tyܠj"$( mn@R_J7uH궜n=-$ylQLQ\bO=ߟdУ\S)ɝ ,p"9ZM10DAHnQH Di{-hB0ܬ΢ZVUig^sHr2L$G\u'bp .~)t )ϏNǬ, 7/-,V9(˜"bu1GwXDx"A^X8C: bȺ*,cmՆSt8ǁ7˺|-V =bi_! ՁvwA>f=Z(U8`=Z[(Aģe vV}q\Sz)b vV]ԐJD{¢*^Ea_1܏Je (K2,!u& 7ZTF=0?¢9JT@IPl|Ģٰ7_2b),Øz"͂f+ƒ['DVY :XveQk¢re*͕,I,&Pc$-daQ`٨j{>KzJEt;`Em WM!)+U"wQˎh0 }kArbeԭbx^::VE"ʵbE5ݕ@MzXWE5RÏ2iwub. YKI6\.:Ţjn+AC ]ETBhAwb(J0PkwhI,&IK;\5j? ų)FddiNfFдi@Al.X>-G8*87!rhwKFqIENDB`PKwL\L_7R7R<limit-login-attempts-reloaded/assets/css/images/icon-web.pngnu[PNG  IHDRX pHYs,K,K=sRGBgAMA aQIDATx %Yyoˬ^ hnBX4#٣9㑄,u책,|s4b$ylY26@Q 6[/44V"ox/̊ΫdDxߗ!;$7.KD7+Y0ţ/G.AƉJR yFyrP,"e_l\Ntpt(K HJ1die$]:2+ie#Jdrg'0 ի֥?Kiҡ:YLgYVAT[ǎqirֶyLeɴT _:TZj\Vq[e,K0HҕgOfTKhrQ5ZQ~b(Ad:Z/:cy`g~YkNPHfׁ1H5Z(gA@$OkVktQ}3Hkrbx[ %ySΝ,t_꘤uieQ96-Y-A¯^~7ZZ Z ,A/C*KK- !lSO7d_ 2GK+Od+{$u[hiiۯ8.{=1HjPQ1Y5Aea͆_-D3䏮].-tv9ώo%q}R)ar2"<k=+e},^9(s!]lI:q4 nlV)Z qwdvR 1ǵˆ42Eob}2Չa ɇv釯xNM2{klF0 =imS$fgUsy:}=vqpOzs20N7,VMa|-I+H}F4cba& 7Cy7~#R6嗼V9ef^'.~LUHO:&߂0siDrXŬz9XW K5b\ S, &Xn !E L`u` o׉$d2r?` {H^!8M8J'},/7{!omާ$\M<9Xtc D$<am"Gkr+$1,d>GfV k J1OSoS&c3#]GI6%SR:1WBcgIHr/`!gS(qvtV&ZԎb+ !j6j"dMY8am|LxD#߄d/f}/rM WqIR;>Lrdw鵲 a~ / 톺[4#rğݔ \V=͖ٗKgxm 2 .WFNqrjJchJTBF<~C &7a(Lq۱uܛ HU(Bqor6ȇ 3 nO쾯8:ـEh%~ Oh;xϙ+tAґG~yYseNc_ħ?Wcb?)qqmfE[0z^& yL 7d/ƒOpg8hL,+eX(78ʗ@ǪEsC=VQ`_+&/4.zw"f {F. d^Xj n7x+|V©Xdc荏&)b"HXZG_#EF\w_Ăy揰ìlcq mRp'N\pr=54Oc[*c af`g}oSfj c峓`G ~+xL<*" 06oO\dqdcQl{L(8ѬLsMpː U)D? 1HM/pð)y7L%74q ̓9-Lm,q sCߨκ;Aסca:!L'=2H5|%TKSs$4I'H}PkP͗Re9SD>(I5oc4J`eGX} sѱhMI (>;z)'0obћBd G^}{?fl{4%~V5] &Bi$4x%أSv 0"),*8в%ΐ)$x J Φσ0`k sx?M}:@hMph4~\˜+Ğy0GB#ce`O*yy4%c$$}7]Yq6CID-׽2 ,'ASj &%no#]XeV iՆsXy!$+3>4Cfmyr+OZ 1AL'FS4LG&x,o)I;/taCc0'k̂C<|1o9與߅&lxF,X@<[7wKp{3;[EQvGBa,  DQ+=~fH ,7564'>4zW}<[0 8YH~dyDݓ 0Im5R]D-c4 |A | jHz,R!a!tKCYC!G6|;4 Ds(? 0[hZsKaDYԛV\f~1K~B&%gs\P^ izlȐw &/$OZA=<S[Ŏ4)U>nJŒDA(ӡouu_XãSh~saͫcN;YwgëȤAN=0ǢtQQ"8o]`579fknȄJt! 2sp1'f8MN۸9c h%S!1s0n,!_c!RJ@VY/h .ךNQPbO3pέ, -%s o\1LĴZckNͮdSSV5Z&$MbbZx?Dt4ȈXB¶Լ پd`,ЛN )`#.] darkaßם~OṾ1"NS1]1/$g\ep=,sG]noBi9RvRd L@d zL 8,0}s02'e9퇇AxQsX߁ +s2ZG`bMCN=ΙQPN|rh=8 ’ uTC ~Wb|#>~BUm &Ar}G$8B%$g׮ 8ayaLc!ߩz}tȵ$I8h[ZCiD[^QMVf`|C8 741|FBI[jОv99L2 j Aw:81%H AF e'ed/gqNmHBxԦaZѼ-\+1 4 ėCvF~j}قN>L \PehbZic0$۸IT%S7 >?,c,$eM1ivŗsz{^DG]R Q L~Y!I1r`7k|zV V6}0)L.'⯼9$>Ȉm 5 >onkbLeZFz;q oݞvjc19>ݎӈFI6"Cj+$EE~0o7ibRAL #M(k$Þ$.>d!fǴl t.7dz*[ґ.\P^;n=WF d4s4JC֚ !&Mo3 P  [OIQP+/o&d_@~ ť~+EVA⍋'^׏ dAC< =LF.9 oj{D(uӅN;s%'.eՑ$4)$~WIhv4&At+ MoCV`F_eEq|X^H1K$ڶZՖ#M%$1FjMcp (z_3Ht.\V` ḼT4]4L:k°;P;H3 nt ތ^B&hͰHߣCi:@c ~<u왦>5DYN5 B†Jw=dx-^BrQ|efByQVKvc0 9#ȂN7֟LJ-bW:辯dJniháu;"'mhىZNcQ #`Ũ*PT&?ሠ蜗#VSB(!4$4pm7cs.L].Ɇ&Jp/Ss ` fVaJ60syUNh +jhfkZd "D洃n͵#~ QFP{Q}j*0qkszЙBFO䆦/!m8>!.0XǰgtqRQVA8y&6n^6+)9M,&|#">al.f0%}uaRR +xNIB.~yzBL<3ru߫4;{ k$+)B"4UUY R_bh;)΀zRM Eo|}&A-T"$j^en !Z7&;gWK}µPxI4 qq%:W\e&aɌVOb$Do uAh:銇Y5G8"LY?Q[WbAd!gw׃*MSm@q~GTLF{aiA+#5CHS WhdZ&R)p$$c:ńa2uHJ-}qr=DCB 2H_LO4wl/Ng$Z 2IJ:ί >!g$vVRNU%Qa3nw^d|45CNeKa3Wj1Y "6XI$B5eN{S b:Xcv~D;ʄӥL=9.nx:2!BGN i5Hft5P˸,S3<_Nބ4M ͼP|q9 B".}Tqjp#j`D *bA:N tK8|R[E$+OBil'e ] *kt&]eW^8QC]7tbyF͵U6WG%O!@ݐ5"wXl+YPRkKD̒^>˝քyӋN)ل/54,[DkR3H}wmkWx$Cx"Ɍr`FD Xe뜎3S*Dmư?%2`41XE›#*0\sU_aib˜&3F6?vKu)xIg&&K#.ǧSxK- =/tlLm` x)sYjZ/i0+km x⚍'ל"T@j9"%qJk5n`JE+ F/S/K]u&4TD#~cױ`QXI=Y0u!2ޅW4Zb ()YEvg8ăI$§Δ4BFF9B88ʴ1S׵gێkG3_ubx!Vf qWW?CplwㆦY-ASt`NO;DsQ}ٙcGLB1QS!M40) |hhxamp>8j2v<[x$s0԰߁٘"UĵnK1JK8`FD{ M N |ٍu4'P e-u0׾8WЮ8+yV7N.)K[&VRYbA : NIQY4m3m:mYðdGsc:iX7Ԁ;I5 >Q:T;lQ]$\Z]*)uͮ[v d Dxxk2^KxoJ8-Q5?ǑBa.^a5]51OM`8⻒yZ)IntҒh d IC؍̳U;+‰'ɜow:̬X-l-bѪ=Lzew̫|R*27.,?O@[m{fI^Rbujx22$05Cm=͹.e)^ٸ|OF!&#c&x"< =_~B]FR}BH^"a^F-H FgM g~INzYRTڑ–9G;Xyde QR"g//or浚X%F0t$ ֭{՜Ob,+c Ypx1M^txxO_O8,d 258! Ag1G #rmS#Jn.̬)HGGlʐ3qN:9S2=] |\>Vv}x*]\d4awy'4jHب=H,ua5;ZM`-DMXùDK Lx1CH!aeH)B$MmANƠAUkw )\vsCI8+{r 9/҅NU;: Up˒tKG(6A51h*N;{PjD1@s>E4:r "|u>cӗehpIIW@#%7ޘlʢ FjjF< &(iV@y8i)Gy 򄙮 ɸ~&sqOq:TR3T{&"&bOa9.;Hl.Ꙍ)5T1`  oVa*Z=tVN|/̫䅍3|g8•XLM+?ookDpCԏSsu ,ЧbjvrB'P[^ Stdhx9"JR4Z፴I+!с PTH?)q7`'(6Aļg`7FRUGd ,n^^@ x.~6S'K^.!zB9) v}KXj7*haׁ$䟖"vIJy$.6OKGU#pai,!/ jPӐ1Ne4O%g8ϊ1qI 1 UUM^x#l'/%DFtɲ~;ȟAjƺ =A˭pQ\xpβc: +{ejJ>2r]z< 9V~3#ұ, ]5$/PRNu7nH=.Z~y^mݐ;-:{:PUDZjlb #-q ×!HNW̃ '4\6%Q=]\`օHKtoXr'gݰiw^"4 kpGMbLI ƅX2ZK tDje?VЦԂeƊk2U _Zz0̭%AaϨ@, M[)r-,dis襃P*ư,n:MR'Tk`ĻŹh_Je~Ѻ;o־<["\ŽjpAgl4zElO4lb* :l(_Nc(2W(`nQ 5Ҙ|Q9BjuCxTM;kxLN>m~'n=2nHLmNq&Jl?1E,M> F0iRR<^C8m40 ,BNb秀{8$ǚ; 3qA{AѮefP0x9"ü^&$bg4+MmJlM5q_\4*+gL i[} /Nc*Fv0?UWbB]# K]?V 2'xQ,PW'qCK01~\Y 3|˦@ QE vG  *^ Fd*']x8dF Z-EN{^~ޫ(F*zoyєY!qӮpQt!@B#N@U&#Z "i0Y^YUg%OM!3mJa%X.VN'p!߰~ >l?5#0HJ8B1ld;8||hXS$\59/`)KPjZ \imkC 4Fpp]_nfvV fbPK`VAxQXyiGxg'y3K= F:G06m$$ $Ii7y'lbj ШBhꣁUH;z,QH瘁3 \&=vIBܽyx>D {N,LZ-QMhRɀA}X Yq@f$Lc\[;z$@gщ@xlnOpDć"`suFmZyCPa(B !D\$c}^x\&,748/a_y'0$ G'^1 s^$"HU`˯[Cy GN}mi>{IU@i)20ɒ#`5Y/`w ]$B-((p&F00ӴCv I2>m~ ӗS0BpV*a"l1qjmԒfCSViB!eI3GhV+SD 8q]\I..^(>wnQ# cd'ҵ:)Vf!͓zG4"Kq`LA:1 kD ӺN.,2N,ͨOp8qi 1I(Tx4=xT!N|5U9gdvÑ##z笍r&t'I,I,h`Nܧey?JWcpob: ? 5ܤ;%d13xACP:1:Z0_iiM&Fh2Sm/^s_WX:iňS|$5q: slXLTIØK&.Bw;C`0?Z(#5g] -qat&3"ۈU!\V'ZUiB!|sXCn!}χvz B+l3Mvs" ,媶jx 7mT%J ˔pӼ~/bQ쟇| q$&biY3KA=+BB`}E|5ԍmD&.AtmosYY+ZxK< A0xch o0Ov}F~oR #O1ѧڣC{yEZM)$T*v7/1#_p?31.?Fovo0,II !mB3%}ppP 4Ur5bSմbj2KHfd,!18 !$Qh@i$%qwaJ)^(i#Pb90lRyd|H Ǽ҄(%'" K-ѫ&(Mmx\lŢkpFџi)n!0&#Uo`V$pWa 6wǨAXN1FMΘ$M 94lOv#bS (EGIHZbgowaj"к̑{ MJ\l<~xQ?i9.`AK4A贺 Vj4hGI!#Z-cSB{R@XI(ZO/Mv x:#$sw$/ZaR>B8æ{zW`p90;.rg8=t о$`4֭%]pǶyGэ8jTEMj]g,A=9?Va|Th.,Y9 ಟ?їQU'=;R0Oi5'oVrչgpf Lh`(92o1sp3 3-Ƕ< <#&"rSy''2. A9Q?Vr?eH O0("gJhPx9d_AZ]QN0ZN"H W`_a>EG7d59$,SXkQϪu팛wLa!!sj&⸅>TÝx3|mgez\&(o<ړ7RQڽYԊaok?<2}Z]ZVA~@*Ā-S+MCr&ROiFWڠP|}nDO3uS~נb8Ex\Uicֶtg]tdه!]cŇ?A;I`(n3iDKYoZ"dF c#XفEb}7+:M7$ dѬ}H1rV' K2ƤpRL59D­? Ur6aH 8ROh>nʱLz0 {1ϲ´&TRwW97VI@GXE4 hnp:D2/>^əi^VBQ1͵8謝EMmwcgx;qk} iDXֲ 5)iɹ"Eg% `^{G3o~ lB`߃"=͔xRVfOຯbf9+i-@ҼCIЗ 6D3BX 3A-{Lùc9W0C1/T0oIӊ&;p0츘trC=L5_Ǎf,ߐćQs_*1JdL صtj_s n D vvs0_ͫ?ZVSi&(}Z?3d );dּ+=HDH uI4l VH&~LO,?M$n|Cf;.Do&~?pjGmeE"` rQHX΂NѸ #QU})jĭHpv7Ź^&\ߙCsP[['T9iF*1 ?P 8ycݰLp3> L;ɽaG%=ퟫMJ{(cu2,jjc!`IJfŲSG!04kgVuu'jIsuN}΋m si9K`V3:\ !N%B=$p 6bX]IqY"|t6 YgB[SIA8Z-ѯ?t$OCj7Q*5\=6ó|RUcC4Q i5-5iס"woaDhɷ@Fh^&2{ݒ'O1Hے D aИx/48 8eHm!D0$w\GG5S}#?Ҍ&p62ͩadwLG|E`|DۖԓXJ`a]6CMȘ´ 3ҤZLq:ܧ:?/i><,cM &M*n:Ha4ˇt4՝D Mnt&8f+'<soua*_]7&̎Y3sp;̪3pY& ǧvm Zsd=xȖSTP] %%nC?/>3mjryաLJH*.%8&"jEa!6vu_ `0K }#uHrߒ!Bhˤs5lzJ5)NٛBpMLdJ:2BSpvXӄo*QZ$M"OKHJ~HˤmM4 zNob帡f0UG0rևwUcek2G&w| KAnWXFNEhq JR1zkK!T}8l>INKv dS,تM F!a¨uh^qaijAhO6Hq ᔒ)PQfxqfDm$f1'ŪP:)uWqU:^_"Q٨ҘЍy H*sgbĞmb NLQŇ4 PR[ts\&/b1dOAsA$.><[i$0u}1}`rSly(i˧rbA$&l!#%փO8'WC_24/c@rR?Se0;$%nO=yc4{TiG'y L ѭT!> ChԓmD`s]9dF3a8XN{Y=ʲ7舠PF1Gl8vSfHѡ6F{䛒 h牅HӸAy 'ۛMK0/Y0'pg:Ȃ1h X;I"<"qՀM=2 0r4hΌBi*I]@,>e_ ZqO^wb|'ibaDɱGddRؓ܉MGQo3wTB-"`hP9# f#9ڃt%݋tS珍ESh̙PzD JȢM1tdW60ЈV p1S:>ۇ1̹> 2b2Tm?x?$!yC%3Zz~$" :k|LP\#q6LĠ$fIE~Sxd|ڤWAk\%I@R3e :Y^lS&U?>I.t]_rDa5`$6fꄳ@P'~.zY:`bɼSgzqA@2?"8fr^ ɨ n6}{ gLS4f6(Z,g|s=XFF+I#fYn9`D5cffDYRwn=B 4(X$,:Hmcr1'IU fg0OA2~a3@AK_pz`ݙY^~A8qOq 6ֈMBcKg!QR6wYS:1B4iѤ(k#H]DFX)q?Lͩ$U Qa 2U`lgj WKv$8h̸%FD)j >=Wᘡ5+_\~!1Jl*k)XU=;3b6|^ygy /8:3ˇ80RDiNPifcga }PF(6DgUhW X)`-Nb%NWX)}3WF A™l)9WooӃ`+%+Q\9glԳ}6gE:ڙT5g9CS萫xT'J)3f810f9K޷ h.f6"'˥%T3QC[ d/rAng~b"$3}q'e{VNYsVDP1"v hҮ͘mDh'Jt F@wX(=H;mD`h'J6ENZ9}WŽpjc3vpPZj(wdFEZj(L+yP6ehDHHRKLpjHщѶf2ޚZ-~i+Ռ3Z/XDZjkQ+cG©0#lkRKlwIs_햍a͚?gOHG0[CCdw6;Τ=C 7%R蠖.:doP."/wK--]3AH-r -AH~I ki_ GCFZZ.!_sAfMғeqmK-]$bn4-!iJ$֯l[v[(fL6$4藬IK-`m<#ЁAK_6֏ڤ)4?@(~\BlRKgEu[ߤ}Q6b-Ak3i)ji.9u^ KK ŶҮ ٔCJ*4w‰PŠ+-SBR&M*_ m&p jiIUG[uK׫hAXCyu kilPSǞA?AX ljjW/`{_cgADW:TPY%Ɏ92k 5h}P`{u[Ged{g.5iĪ;*s;v8몏l*5h}' 4G>g]] @5hMY[4W}\h3!Q* ZfNbDi0b8S>g+5+a\|8Vk <=HKEp3k"Opu*5h\E_3+WdL$Oܿm%/zXE_iK1^ykMu4:4h68K,ݗ.[_2qYJ1p%Ȼ~Xn"p+-ۘIĨ* )N+bRȭ|e?9 `0nWx땇Syy%IK1l{g Zy("*<_d~{Y@+ߗg-&}%fZwyrh@k 6|E-سLeTAWP{%S(笅R^#81"cÝcr 5 ?N[d6A3/nޙC-#@-kcDp?m10aPT@J(; b̧^ ֻMsdֻWw_8v HٹS Hv !;  1\pG:BwB0$s? RH"|T@B;6Д&-u@ctϦioK vP!icvHĘ+ C4PV2@nN?;0h˞&-e@WӴw.30(k%0$ v2Z;WapJ0JeܵS9ҲgNYcaؘ1VvJ.L3ؾ12  ceNA޴*q- :/w! sr1lBb'AC{ hc6 5I. R)4|ܰa;ǘ1/x@=23:}Æàa00FLa{Æ 37;!`#c lTc"\'I5hQ3ή<4H,7 =0@ x #bc;!!p'FHsdBaa,UmVFs-id>` j߾}1o>o02 coF+;1ŝ,Es0I%q׾'$-@+3hoҕ Fj6fX;̀RrWiТq$/L$#T cOq:896ی4ĝG4Qt܄"oɓrI ,g@M`/ӂN2< y\zՆGAy)lu "=h¼Cϓб8$ȣyy)㎓T$c#!󤤝P3sg[`AwY bXހ#IYh&3 ]XN4$$q DWlg;ı1QY&}Syy.]L#Z\cd1t4yJ ,$#І39$RI!#*AC9o:@xH{CV JςC쥄 h.P~,wH2#Jx !#nuHE ԌC$gAK,f*.qlJ ߂FZ O%kJzClCz$ϔ0;>dap J>AdFin[>ݴ$470\IJa5dII+"=f %ݒXRfErf}%h(i̒9-@krMJmh=o,Z šY,< gad0V"a(qH2TY׈YHfC4?$A*@I,:n(&#n֖nZAsvw4<T"x%ps"r%h92񻗯]"w?>m,<:/ !WK|y d2K^C1fV?taF:i ʵںgFאe7#.JrV EFJby|N_R|6wf>,>ϻpw٬:⚤N0v ֮q. ċ޵tLI4-,rqE I×0 %H!$t{%2fmP+|J2yp*ek.Vm Zȭ *Uar_%J;fYGƹFG ͮ*k ee5T&l^#dNTf^D?Dim}:hϣF|f]+c+If5jc [D\"; |qHDUL!ƍ%)LfJv~)sMl85@QRXC5ua+2,_hUa}aQ%3Ad}O|r3G`UZA j!,<}b,|Hf d Od=`5eP28):|EϦ>~֪_B2D "V:fAXŚFoU4>D(ݷ_W;]U+>"&9FWHxk$LѡW#옴6 ÝKɋ2 Zsrx/C]L?7Y$QM0z2Lj$jd1CMw[p++?5,RI? IkOfH\j8}2`L ׯ=$= Ca_?wʊA{&k|IEq$es0e}AkT.ϱOSƃVJ~H?Տ,(n))N?ej($G~H[MVlrG[)88;&', ykYǙ{V][ON1FXXL҃y {c~ \F2y-'+VYD%{H @sG6"ƍS'D"싐8LXuJZ(ygAsIevh_GL#Gjci<՗O]֯i4Sf=ccd.Lo4rm8qg};i `YT;ɡ͊G-Ny, E/_2琴/ZU1|8{HowoǿClrqqu&y+M֞k ŅLfR?$,!XhxN9(sNOۆ27_wo^ap YtYNL왕6wj'oEj?ǼcEx9jZ[l5"~r,,`m(b>9DgP;8_Pyp LQF0ؙC7,.487h(cF 9Ue˚C6G a* id#!0G9d$X̡qY`S245>He@V,݋{1W~ OۓGcldqO9R4#+({Ԃ̑ r9At=xNמ,0{$)2.)Ր,,ޣ`@STG'c<T0 + ab аݣ !pncxSK=G9\~'i$<xjHy)XJH?`mNȞk/-Gmqok]?.Yf'ĻVtwѝ֟Cwl[@xب6y&9x<БQ98a8nR49-FO-v}\BK5gDf%ơ9ڸ3|F/<531 > UO{=a|#,=cr¾Yk-ABG%.-+ /D~ M &({M욿P2?95&|m>'&ρ3km܌fH",k^߂0 _󉰞i4AkrЮt?UFACK|?£s0}|-.WE `_,|CPQ*jS˔gh~S> Mpk|mj?lyw,x%q-$AnR7  x5L%xTXӅ|*Y埞..-+-&BrpEM_CA2sK-:P!wGdӟCĢcԅ#_PFT1p#$1GOCH _.SΡաnG`&@T1Gq 3Ν >}a@] SU,[c) eKq$ҥeyl9|:,ߧqD"Y7H^b$8_kVc;5WuZES$McğE-\ZV:[QtG,쓜uۡ?֮:EZ5cKy>ODgiQ_.-+eZ(r^y7}Pʙ _2YfZ]Ki}_R@ӣUgIҢn<3ɠ9shW^"E13!%-N3??]$ωÿ?"?̥#v s ^^E19/E 1rf=e&Gxq͇:-2{{4ul;mۑ[m}hG8ÄڟK2ȂrftEGELSyqAv> ପY'|q%ӶD,"s#Hϡ~ab+ Ιr?Hs63(Ciٳ_Z@D+kriਟT:ϱV1Dxj |˷,sgB]貺o6$%r`=%3|oO_К<)pEVaCezIӢf'^β4r|tmrkfVz<k&-ɴPf8ʑCl.PS"+|l-<xs ?nLCOfY.-kq^-{q9wV&h+mL\",yP:pshqE(ʭa96I|cXIڻqてļl+m.hv X/EsȒ%T!EEp.B8S3@)Ӹ@ xZV/Xru+Zhu,6lr&sV0ɱ`g첺<qmpx痖H.0,*3Hs%Ll.e9wf&8O~_V[o@s4ؽdh)@s \e-ϑ+b)-6;Z,y;ȑWs%82jsW09Ut08g"g:.={ɟ咜 K~m9ھiHGМ nH՗_]sTЯXVK xZ˜WpD*6%(IM[X~_;ԧh|9hP!/oq:ϚzB3?fpu М J ^AN|x5Ʈc*7'\Z}4'hXs<2gRl6S {.-?zZ!##lxDi?zש*wP~!ߐ,>bϥy?Z-G}5>ȳgoRg:rB^bu(B4 _*{vDl¤B U)D0TC 1gۯSUh<K@4fӥyvzZIgwwТֳmP~З-7VXv@k٩XYAհ|vTXy62ʏ+gQqRt6Nł֦>BM}Uz*;:ȖXX(a&jάTj9_ {j M!wSmb߻9:c)?%tl;R !M=.,vxyg%)xxmLMkb:h[_ E{;v^7[;j0(鷩3k–_S7@Tl;]vyeo? 5!T7|dž MTl;O^ u2{}vfԥݘOQ@5s&n;iZ^24f,LKޙqStM?5\qLlSЪm_ 2u8dI}2?DK;7>Xl _IhAפF X֐^Xt+"xsm̡pkNOS}Е!JCHTY=d4_F5 ջ1@*@Ϩ Z{koq"*YkjҴ7aݒ}ΟQ!]mOКl}O,d:Ux9$\ߥ@0i Tm<8>qL4DAQRqQ݃reꃼm˜~/S8S~x$K x:.h G.|TKpjRZJ`A*|ːK,@blr]_X_p(t4aP뾌Gtw}A;SimN^iXZ^c= ֢ݸN[ _0i;Xt@/Yu1r-WII@f~lu+U/g~ V-vϧ*A ٽTz\ z[FkXM;VC場0g,?[Md𰓖][e\ 5ZheW1Wլ? Z47AEs2XP-^-ۋոUw22j8dji8__~[m!go6qP ul5e%ehy!k2~er ~5_~ՃlwS4nQMeJF2,2 ]h9XzZ{uT~`cζͻW ]qfd.[6.[Ճ#e,?K68,j<hzgw;-`BըZqm0x54+jꃤT`ֱL֦瀀;h9.?M  Pj]"lXqK  |1q} Ӭm6JnkT%M,' մ{VS@WsiA}ׅ/[y!Ϧl]t W$.kly5*|v>vgC5w])wS.fN\Y=YIŴĵ52?<vt{XF̥K1QhEv$wK(J$"rNbp5kAZ[pJ XB[f=$,C mGZ@Q9t#G ڻnTf) H=Nz9I*uҤ5DM5:GVdS_3imZ]߯XbyF'ͳр{m&]PAܚtp uHnA*tf5CCD8BĀpXEgA5-X~hHŎuvG )GkwEԵ$Z,WPͅPVsh)xkPw/igY% 򃃃+6;@m) Z}دLSGFiWrLm: ;i.\:.θZ}bO?]՝B^q5cIœ& oqرSRsر==v&;X#Pi uԎIl %{D&f3dz GNotZa ;&:Τ6]UXq1,űܜ bӍG4P[Ce-dm@Ivc }^HagAELh $LUޝ}wύ=kWC&t~͵ڻgaX)рWΤR7 n9yd _za|Gcc-/++TV\rjF;.lw- L1&G]L6h LL*,UEL;Y 6ܽ|mmgxБQWR{=|&7 n@CPk2*+*ͫDR" uIj*^ü+fGP%'?øwo&R~HB:[4Yp2o7PnIH?cMa2^\,TWRU-;;i/Cܵk(ȤP$ݚ6Pmɏm\YEil@ߕa@WlOG3geepUEWXc_{4lОW:+26֬"K%ݓ3 .U󘈯X*sYKULVdeȺ?:A{(um ϢR:(z|qELйsi֊j'錹+2oN2h`7:ᘫHr_/m,-dV Lm*o&Ғ Df 5glHu6K~/ u=l #:X]ΠҢk).K،Uwٕ6ϳ>mSRCMU#wX{#. Xnlj`}RԓL[4̡yTpA~s-jf)5%7WoiUN!xB!}A{*TP$,-]:4 '64wY-b\v)ӢbLZĥyß]0%EnNaQ30J Zl.Nj,*2kIJrL>)H`j ňa`94GEL2gdmM!W 5m}@Ki~5(Y:0^HYAfeqe7̡Iv|v dmM)]Vi%Β QvfS1bPASL-]:P9С e ĻT0H)+&+*%zmrdjB^riЃAqzr;OV4[)2EV֥!vpiJ48K6hAڠ)E;`^}9CSOGy=iK'&j2)HwVҌ"YA3h jB 43ng !zA@e/i 49K2h_Af jl| B&.Ң.nz ZW=u@뵊Jfh~եuZT$gZ%5myݽ hDܽE24ߔY/i\M_뢬t*r?Q4ݔ/iX;uivmǠmuٺ ęzy[MG 뢨AIkJ3deNf~nidnPMf?G_xT64?Y' aMLs,i5XE"mqm]4]sU\LjZ\4+gQCZT*Ț'/v6%&,ڒ/Ӿ0,b^?FmqgqaGp]**pάT;iwH#_/ojw՞ Ý1д-QLCa_uzk8tiU>ǜ<輱ЌISJk7ʝ9AଫSIZovCMq;7vs;.Acw'c]Z玗pԴCwJVY(@oI lھ]|6nub&_94G3R:zڈݾV$DZ=׍kj#zRgPVɞ9ΠEqr>{?[.Pf֭ՄاmܺN /oMx~WY5 Km3ޫCEmF@[A9x mYlnݸV{6]rcc5~G+Pv k;m+}VRj%& %z۾ڌZֶn.7V{u(6yoM@j 4U'J _Ba0lӂ&VrB ۼu՞ۿ ?ŝ.U?wPvPx{V(AsټԷT1Rj<|3+hC`e4EJSqV,byXâAOw&6.ZO&2Ċs ܼy8u(-K nN=AU{\t)TVN_#iL|mݙZO(6PөdpvqaU6|8.?׃΅se@ >\K-ÇLTQ'4I XG3 7@-"5qmAbgX;+1ϐ @|#,?*LBmPcb:fe6&9*Ha$p8&?:LmF9OWΜqvվ U ,R?[UVqfwEL{xMyn֠|KuoUrcn'ϼ@%c5\{rﰵ9(û't7Zθb` ?tuwNo^.Z7yt[Pag$dփ&7[89ܒwsɥ/b)lHWKp$j24L=A Ja:zQk)iQLN&7ZU5Ad9l8(hktbfs~nG_jG}eI{4F|TjQ{#?uֵcy)T{5dKoe.4?lL6ټ@hήۤTCv@~\jQ7&>RI"S|پ4tkioT#4kWGytO,lcin92)hZ<'83&ͣ%)ou^=|ڕ䍁6nE*f"褁Bm݂Q=Ǻ;omH٤mt3 0z#,D iY<(m@Ѡ55oS !$O@(.l+ci?#_CqwmWc7A ؼ6P UMSOچ)3h) F{J/ǟqZ~ٸYXU|e)Ih)Ԧ m N .p6YG=Ş`3h#S6.~C= Z[bzAQFͣ6A(5H|J(j;VxT8!;hgO;*SB<hĂf>%)>b}6P[TT*Z,QBt/ϤhFzmӆ..h[BȶA=E@eo4;F7EF-y6.R*$nf!s QT%]O6fQ*LxV3hQfn-m2P<;ٽhBvB5&"toZw`MsoãG$]a7m)nH}voUwa Q_MuSz@yVb 6J}wj5uw_YL }>`V|ۺZ]4wANZs}1"ֿ)BJ0pYȗQڏ.?Ƣog嬴{i'SH}H ]@U'W1pf *[ xng2h~ÖT(h"N*!3$HXoY~fBoRkmv;iUR|͜yW͊jW(!aD|*?7sWarMu\AF̙֨2;h-t>G#$9JhmvICmҟRaHm& ®<G9 v~]ڻ f+%밅-5tT"̀`SW;gҞ.ٽh ӥ6gf%ho&Uq}ufLMԥ56ѶhOOpܤjdj7}?SFMV~"Eb{=IA\CY[KY}̙&sHmF51T/ii.M^zsp`} ŚjB^.zK{(}3r6u h\1총vxdUK/CK=N,7{uؿ7a}j;'H N$zhc*?nM`}~ĢSv$pMjCV9}B^k[S'Lmo"fKhN:'0\4!ڛJ0@m;b)ic;P:fM3ԀqS%k뱔?<{uhN  z Xh4P ~Ϯ;e= 1 GtJ^jדL:ؚܵ ?b]gȍhQhXO+'O8pڻ:{]G{R?k= (40>yrgm,c ?tj^*!t=u͵Юz(jk嚓_쵝Zc'ƌ6-Ւw9:U'e1NnM h6\1flF)9?i'ށ欋ak0NVZO_qR3}'i$ 70:O.cI:@C=4.8SGF5n_(~PdW /ihqdָMyq^g\~3YMFs GuTfV5 Tegi{V4HQIצ0Ӳ:gǑC|(%hf8x5KZڡOݳ1YkYx~EQ38!ъvGU4g3]GVYRfߛJڥu;$g.G+Ask\޻UftZuq gǃޗfdTGXq9c-ZG.vO+^hdnߪ{fdp~ޑdȌl=tZe?k`C9`WƷtjf\UJ|+;2|9{"4{6PgCe:F ~ =ͨ5 |Pac+3[h6оK;ʎ j=Eܹ\5IZ`Qjkr`׹i/ٍ)orX7 0*ܘt:84oAs<xUOF[E`: _jnB,Uz>!bB"m_RLKy7v3,*[¡y S?Ysׯ2j.k}{Z;;P/KZL)=zLɐ`ҟ$gfO.QHT]i<ͱKC:^%[[)ϞnW:ߑȔu2| ̭o0:6R}qyM:XP?kМU nJA *rp C(XDA st}$\ Azp(sSmw0D*16{URiм]?1 VjⴅU`tF5h6J 'r0c/squ</QcBl8 Sw<]Ir(0 mwhş0/D׃IGOһa{Ɩkc (`Nme(* s&ׯ֯Cܕ.sx.{J k=A[!. }0Q8j7sM `3"ozGfi8 e|7,ypy̎,+DdtмO覭-uHɪX#g޼Mh'_, XoFV7m҅M YOL23`joxg0/?ԁݖ~/&Ρyۏ| Da/d]8bh[|wl`"0V7q=f3?g[)Y$^1VvS~D;.orSBjmeA&~NEqOlAթhVrQav*$`xZH SD~!AA"3vS4~ը'mj ?ժ6N1$q *4K<i'۾4 \Sӝ Nݭ|Sі_p_H,h@WWNo=eZ[x0M`S&DV_(!S"HX-vE[ O埒:gn)I 1u(QD;Āw%Be*!X%j(d|dBM|Joe؊h]Hu9z_|Sp2N {ĴRCƐN.,ɢ8㩍͍ADH(R({0rʆzُJ>[OJڽǖG%SRDYZ1* |ʌ[ %IBUkh4@Sl)$mN[;C[C ]RK;6GrS3:氐3U-t\HQeyB'֧,hrÑ~Kt*| %\"2FQK M8o?`N<["B#)&|5[TT"sҪYEq!{?dG9R8wL $]UPwR:ho;9}5/bŋlñ hC6SKO+/]Ŋu~ngKe\$K/ҩ+.VNsן!؟]sjL_iHAv^:24~Ӹ UWe ۟3I.J@?AOg>T!)-|aimh0(2((U%7iR2J;] n𻿰QiDMa` C\ _b|7 JbWΈ'8Mm%E8 \R Yj &bzR@sC'VvEjwFXIBk]/BSQ@,W4*?j6qQx| heR2U%Tr+,b/} BQH%'L4hn5§[W0^ `l/hHnQb?mo%4bw@R!_): ثc.1rT úSi8w|T#dU6.ZyW5 YTzD{lJRT3OD:c`f*^ {ʿsp&49q~ 7bLQ(?†5Bo97wYCM9$R?* |m %yS9.\Խ^M kvjv:1aK"ΝmF,[7{+8ݑlf[3{ks7wиta!4³!aC3`l=<|4酵\{ Գ)2a:qlAdL޼. c}|h | XC!fIGЂGLTco<:WxtOA33+(aOs6s{^vS4dqn_`sn0pV3/rBرY|s"6عQHY?ܜ CD8Ռ'C^0f Es6dXŽ̦5S.0uh?K͎)MkqGs fV-؏_H’-A@G5P<4>I2LP(5HҁfvP1-hoư/TIz.U@sۣ_v %W\sYGD)Y l;`Nj&sRij5Syp|fSQ:,h|ӵ>0| f i 6Sh3X#-lm9 &M=ݜhOLDD dw8׈}%9>~]lֳFUnvYy4tmsǏ_q,V c<}Lx#=> @|+O>8$s!s"κTlKj\yJ87RTMN PaۡCegRcQdi pjC`U2C<ӆJ ⬲KU3^l!nďl=iСA c&$"JܐLCu?%6cJigҠ%WN:@ &Pr48&421#0@>?Y'#hz 5q!\5ƫMf<celU*FaUMg]hRevxd{sCRMǿ]s[p+ڐL'xYr:I<[L.Ya1wqVDG[B0b#bS N\𨌩Y 9iYx[(^ ңvӑa~NX!ZaMv#+1Q✥h4t{Š@]q"cᅄb­BW+-PH!|8zBէ6g)Zk$ ʍ8(BAr}Ebb)b}PwRTMTo߬1DNX!W( #SQTb^Sf֗jR4EZ"nqPwX3 " cң' @rz{9s35U[ii9hq}Vltpۉ(?k:h]`v`+._Qeru+A+ɉogdк*?)v&4aE.E9䃚N\Ӂ&xueb݉$2FMSj%2pƃf}q&{ &|4cٗZN Yi>Ԕ;oV1+'ZrgAf?@3}ϩի^j:4؅u'KzҴb+u{:+2lrj}/;KGL4;j5ډga; gWhsAR:/tiߥL|3jY?7xԌaO:4skgfȄ'&8g72a0ڟemYiS )^͂YԞ/*NK:]rmzjȌ1@&f Ԫ2̺i +3a 0Uv_b1W35DnZ Q֔јeha}t)ifgvYU-3k|ɵڑ3k0;Lȑ ZV W%3'm? ehtq0w geuYXjK nHEάDVfjĀ9⬾)mffk)™eVDWV-̭|My*]}@2tUm0ZBqV秩<W6ܱ2|Et|j'Ye[{8dcC75_{Q OQw@B>R3*;B-Y^$/6bǍe΄n D;W{[i>VhwP{SwUeBBCΪ*a_7 u_쨶vmpVUUh+no z>Y_Z1g@{'K㠑k#b,CB44ĊXKu[c4+aAӠ9 tWSuR;1 K:IZKSSuuuyyGR;0 ghAӤi4i4-4 &MIӢAӤi4i4-4 &MIӢAӤi4i4-4 Zʐ֦UAKiZD֡A󚴠פh4ϥAӢAӢAӢEEEMMM  -4-4-4-Z4hZ4hZhдhдhдhѠiѠiѠiѢAӢAӢEEEEMM   -4-4-Z4hZ4hZ4hZhдhдhѠiѠiѠiѢAӢAӢAӢEEEMMM  -4-4-4-Z4hZ4hZhдhдhдhѠiIyR铌> IENDB`PKwL\tz:::limit-login-attempts-reloaded/assets/css/images/ip-min.pngnu[PNG  IHDRJ NtEXtSoftwareAdobe ImageReadyqe<PLTE*/@bdfv䯱gjr⩮[`p\m]EIXqie݊tdz]bp~DIX|`oX؁3DUkJzncS^ڌQVdwcs㐕{_ZhxlhlyCHX[ja}xz}]bo^nuw|y墤WXؔ_ۂtdޝ{auXFl|_cphZpsw7i֠‵WL|VƨգP[R9` [ÒShNjE쓀YȤm5Z.4X  _SIkƷAN#'_GSք+_x}on G8`դ[<R9`U6a!%z{KXmT[<%63򱆖7y)&3BlSհ褲V tgb1ܗ iq6'} -p)fҾFE%E> dڈeO6`gV+2j׷pJƛGae倕 ìU lȌ#Y8g`<-f`! 9`9 &#s%0el~Yl2w-#/iDkbycY%4 xkZ $c m3v e,#l2K|BeTeeXކF!9:/yb2xCÍ>1U8iv|`n_uUQx޶n3g{ソ p^83ԬϦq|a1DSg|ꩧp?'/̝uګ^/,:bJe:ޏfd |P6#he>>Kz*xlF)S!20sFy/jA@Y|ʀ&24}Lgy1\vl3)#G!؎m~f6w_;Q }AO=3(+#2Y}2!| =s5T#ϗS.k ;vn&pi$yL`^VV& %Yh1I&K$&-Q (-}04mvKp;aDGx!`$2׷TnxLp}CNA_Zm>+?o!QCbTARL ɖR8 È+E,m~ 2l/^Ľ` 1[FH`@@>Q AtaP̿  Y $C PKc0 qK!"J<. A # 0HΖ`P0h !_dR:_$-]'m'388 D,=}Qx]+tA0 ~3op dA ! ѲD "ap Q0 E- !.$`B !!lGW:&㟆?ei o5퓐o"t&"o 7M!EiX.|o cXd R BR8`oR.7 !@FD*!N"oN  H'‡ PRz'RB>|8H _}AZPX[PJqQB{H ڃAAhPv ]t8~WB 8Dp eB~xqq$'8>~\`aЏC2RB/` D#߃㌯]`d`sjIxWCKbEl&rk$/v=bDDB D@$;¾Kx@|PJL_ʮ0lA 1!%/(/KhKK@V9bdz0D7+ã> _h׈>rRI:B^.12Z#6 QD<hyǃ|VL-;xMuyr9j|  4 3 @Xƒ|< dtqB>pnE ׊AfAtTT_q ii+y`@u9`HNX=P AZ2PFt:@W@5Ń 0$`Q15НyfU1HE];k󇷔5F2L 0E$Y~Qcrď"MN'ɨ1!tvmi}'9)Lٴ1Շ JY Ax&]EPC:tR WT)"E(39;e޴}>)5{W8eT_!!aN)Bf3t 7SP KV΍,G}#+FǍ9] YFLyl7 y:(ޑM7@*"ˍn XIsCb5GH+opP& ?fϊ9Eccc`͊=Vb,Y p')&T3/٧WE󃱃H  s~p0)6)3.Za?6IÎ ȋe! $ c14Hu}EӌIC$d`IbQ ;C÷~kklDY6a$"QrhãhsgdҔDb#c?E]fZm_ӁI Io&v>G͏G1Q3I$t霥 ydh9 P@1h a4d =%_'2)iB)W x!Ep(?|dh=!BnQF!8=hӈo͑ýd*kUS[6b wΙ!9ex=$~z!%9o1MhxxI5FW;\"fN䊆 %R&j`)ֳcxN_&#lꒈNZtj o1;w[_>,, A,\#jHR9w:Hj|rZos]7hPQ˓F0l}ؓ g*,DO" Lx=Y rqMiy\VdXaؓ'huB{0p )]È"ҰBB褩WԲ+pE5^XQX!]&{EaoBp]4Z(Gv!T"kVh{wUT4WfX&Ͱ~R'x4c4I^-" iW7ND\щ+;7xa͐fT*P, k4o""S x hGw I6oO3 QTẂȮ+Ti,aFGs'p G#+ YwҥP>ApO-z]ʉf9 ioΛWy3y̝Y_S`zNC*A+Wj_k1al=pR C[I$d#[=پn ZEUZ9ZҩK9m)3\[me-,Շ|]zD.ZvGWۺnuC #IQˈ2u֭Rl[X*+VvVe.[ 3!eEeyleGuMj*.,e E`D931xC0s۶bɖ 5n9uKJ*ljV{Už":ac.["9F҇%Sls%WgUV= DW!~Uc",A2t\K=., 1@8 2ƀުUW F@>)WAcc_S';J.x]M~x,U.YlH0=}|@ d;I!=^?Q#/kTbu\TĎKԐ6ؾU_c|1*yk1A4F6#^%Όb'Zb֧BCAGkso_Kw鷅k*-[kL,\(g(U@\ {.s|m"`t(>%f_sceN8r')VS<, ۴/7Jg`1ZJlZYŶhU56UYhcF o;e.1t+m)xgHl7(_ wYGɟ 9ɧEG)99odH_z }Pfw6w9ׁ^;E?g'-[X[b|X[Sijhu(@Cق{bI)v$od>S(ڥUBM]D*}{ &x9^gu(8MK4ĪAt3h~D;׍sw Ymh6+Ƕѫu_*)IX2Z)6ho}eh'zOw(G|MRZWw:գ%bG:$~cw|F U?lF0!Y hbÔ,+PGU|N]GxKIw76^moDAo ~j^rtz﷕jXJ9ݢaz+9u +2ڊ~w`%f|vHTxDjS+ؕ45y/z#mEylmlͻN>Z6i|]#^K[ZyqlӲuߔ݌r3\z8a<캃nO`*gV9F^OZ0܋H4 m.t鍺쿥q^OWNpGpX=mifݠjߟ{~|N^gdz5;&Ϳ 7']U%'LpGC0"%Np>뾭zV ps"<Kr?Tp83 86/5:2Je58`ـGs]uSq)Cyi벅t`P 9`/#R_l"o Quk=sܹfWVo p%Z/S/hSOm~jHya6lqb vRE}fo>>11>)x-hzvz"2ugR{҂lQ-XUz8 |ob{<ĕhn'&\dowr?{4fU ])PPX|A{|H; O,_mn_71hi)X퀵ȶ[[†K,lќrwX;9)(-eKL)8lZKX~v}WN5L4QVEz11LV ~L0HCwUr+nsu.&= i`2Qr/:$;bV=f^6$(7$Ac+ҶiB+K>3w ]Bގ?Jrf4)U+ x`/Y FcdewX3ihLu]@S&Vz೮o72iZJQlY䶱 07%oM_pQa1aZZlT?g݅ )))覤\ =%40]@=ޯ~f?;ׄˮ WB#{B/ C#P(D`Y˽i LXhzz4`hDDDyI9x H!Q^;%n [qWq@ZMU`#.ž\^]^>@"˓# f"  3qp]qCߪtbrrr%_P23 1}XFkfQNJijb mt3(kC :d̙vf2ɟz`T! 7t"w]!  8Je@ xX 33kgf lɔt,n,ec6(]N/(wiK6Zڒk!f';RTfGXXxM[=]-:%b+d`E6][YYY[Y{ kq'T$d? CYbx~5P:% *${@sj::*+`Hj~KRNج5ff̞O+A9芄?LY9 999#A;` 8 dȄ?nSz-<{ŶsDʟ~,H. YY7n0-GP;>:9=`"4$%4Or+R:slVtlRll`cA˂>N^y0 :z>D3ZhgIH bk`W!$6h<D p'a\yςIH3Z,m#T{t35vfIӾ'^$hIc$LG5zQZNwINU\#>b*XˢWַ"##Fۛo.]zQmBJ)NZYJL|dհdrL}b_EEϡ!4rhRt !S p( zd\[:OZJ;^"x5_b|P3g!*;KeJYRv<(jS_֫B]o P>;w+l;+9;ڏukė~{׶rd fSy㧳~† y$R ]LK(6uY LjfD8&P̾{^-u<[nV.#B:S;@?#`U:(!?:Mڜ VF9`(壙[33e.[N&V32ldBJ3? KbZ]^ekxUNMKSt^23^?z~c!|eh{CculVuG&* ܋nٻ ŪB)\5j;j,wcIOoߡGN*+`̊V,slk O¦kd_;L'}z;k)9/`sY񬐗-ƨd+|dNJsW,I\raM d@:rJ{ \=4], O<Ztާ3,'¼\r%?ɝ7Urz*ޟJS)(+0ͯy]~#XG\[/p#`0TS󖽹4]1wU:Oe'ND]]]/{ta|ZϙXīr먀 ^aZTukܪ5RnU+,h 93Y78NoݪOB<* dtA}nDY4Z,kwu>CmHY,}n^ҀTU kk"% ؑWC= u"#k>0=^"6wm&ۢzĖSOoT)96}7;h"|N^a {߬~>4}|Rqt=ZM)SF' khW4jV{ݯdxSM qcE{Φ9^o֭@wλf&loqd_[~vF`qF,0O`dߗB< je_}CMl_օzb}S n𫺸OW zLAAkE]Xg`Lٸ&ʱ0 v⠌>f\f(l/tZ7CɌN󼌁(reOᾳS vHa~sI(7mT͌ ;FsR ]aCqqqTTp4I 06|^?B$X?ڂ|ULFk@[Fϥ!ӽ]W_&KKF`1 [M&uJƍ# .vߒHFj.#/}|`.0s္p\8`.0s္p\8`.0 s္p\8`.0 s္p\8`.0 s္p\8`.0 ̅怹p\8`.0 ̅怹p\8`.0 ̅怹p\8`.0 ̅s\8`.0 ̅s\8`.0 ̅s9`.0 ̅s9`.0 E} ߻ IENDB`PKwL\``<limit-login-attempts-reloaded/assets/css/images/like-min.pngnu[PNG  IHDRИtEXtSoftwareAdobe ImageReadyqe<kPLTE=356"<9'7#8787;S()ߩp4~6D, Ս(/5ߩ4Ԍ!69%7.Ԍ)<ڛ6,9+":9aTٚ*)b657~7<29/ۜB40G-%8 ;2ڛ4$E5 "p;;8F7:'E"1TytRNSTIDATx_@'"ІQZ @[Ppo J/w'yzy.w@Y@ A1שJ&5M>a^i*;tJAFMF̬ 0SeS2;WM(k.Tƪ^ d"zdC%4RFEɠnؗ\K_ +^>(lAU7&Aso 9Aw {ؗ{ACᆢzA+0z  Wj@ZP1JǠH8ԣHiBz9kv*Ndʚ###D. rQ I H:V@DQZ@lHd@60RBR*rJd$ Ue]) "<*&@4ɑ^HIy~^@s ? Z@ZI$ YгᄓePxk0%[D.i3rdxJ4P7\@g\ˀ\p<@I""қ\0j]&_29';;G`eH2 n0`*p56q]DWUF] H@kceX@&x5;V^P^qlw l|ahtT:򁺒DZc[z@&9–.P?D:,dZcYI6ȔPBg&m L(;[zT(RPP4T;ݩjL gAThM D\C9@~pOP ~Y}ŠtFWAiL DӭC"ȫzN=@BhI @62>,"1wUχf۠T 4X 4xȘ-tZe @Bo%his\e@s\ky%pUk g,Ǻw_V5Fq d6NJq|tm^8hn$28~5;9h8Xb9l~gipU R)u}*8lUdۓIFGOb+-1IC6IENDB`PKwL\sqk=limit-login-attempts-reloaded/assets/css/images/logo-llap.pngnu[PNG  IHDR5TY pHYs  sRGBgAMA apIDATx]rGΪdθ5 IfqƆ0/B`Hq' 8.VkzcpeC-@؋4̬@r(1LuuueoU F'Oy|aEyGQ 5j8\DZ:hL|ЛǭFF. $ `#zT!&d5j8&$  >F!H37d?n7Pƌc*u|V P1 >Dp ~95aLD 1ح1'5GXa]CGPc  Dνr7D25f# ,THg%R۟JhZCVf`N"Y_Hؗ &5f S0R=w2_[h"xPJYX ͹hy"UWg]h!:}&!zQz·>\~0S?YuRB,<1Vu >Djb YŽDڹbPg8=ڂ`y  q\@Z7( 81HQӌ* E.޳B~כS.P;*D(*&=fjʏ$>!5jCbkoI{7SHl}Y9?֛X^-.\Dζm: QXܜz!3WI2O#RmwZ S{;jL6q< яq4a&Ģ`}lD\Gzb) RUoAZ|H]K W PWC UD㡡eX6-\<Ӵ.NuAD;=3JY*oCQTw nĸ4z܇ñuG{M2?@(rM:Z3@LLF=&DrA|LũO0̾soH7+jhLNuaYx>`ad~ hMe -~X)>d>HErF$#3(3TČEi>AEoqghˈ# XOuhGo|o5'SE~$r-hA+c$"D<Ί%{zReDxVbZ\PE[EU_x#RƗZNN~B JsY> gf e]E"bAl3V)m2Ը:*9NV2+Aq="[v "Yv +/ѤEei7v \%yĖc!L~2&EJpNGe-gdv1iG@TrCKNW!9/ 2+˰WQ&b(c@h۟BZ^w`\; (LۨSz;=)7D36 Wtf}l?SM /q'3meuX`I$_a6џ]JMMoQԨ )ުutd#sEo1v| uL\DjQ:T^n ˚@5,[ KPN)q˜w#92֐_}yLc>lm40GNޕ| Dl`Y oA]\wy{yR; S?mv ,7M}JW@T0 D`D2sdH^E-cHEIzWw3Na .^|䭬 mٕi(h._:D>\|t}aǠs i^c(ȊIf}LfI"G p4:ѪtU }U:)OIyFO6ں#}'IWStuig6Mq|}B%]etH,']|l `47 LΛ;CڧÎ8v~b?rˁZrg^a•D& s(˩VqK[P<|/U7Fz]VOH-EڲkDže~L4)q{l{(Wyus~XD:){RZ[ WׂՃA5~"[Y-1DhL Av[TG;nccz&沍xHyV;q|Y/{9{J1sm}v(L =cfu!c9Ϊ՞m}}p|c䎭-?wg0 sHˣDE8ʵJyTjԻ'!|G֫йc"kOQt%SAGwJ+)XUvBލVGAtY*g/Dl1>T0&3iB&Ǔ2dc8MޅSZ~܁}wCT'=n۝V'<㫋}>&*)OMeLۨ~"_Ia/h JXJ綑&YK#HÉ,;VDZNL/Yt VW#R-Nh qYd^ m?/ GlgγR]\EܳZ;T&\0xly1msI'WTL<^=(}#[j}9wd#0m[S/6ԃ~]^3>du"+"q  fic虅N`ŇDdA߈uwKPzVubL/u gP ݶ2:sgE"=+ֳJYA ЁmD }^sDz ^xŻ՜k4O.9R&zr>0O8- ~c"$~+8O,*o*Nbn@J6ZFm/e/'#,?@]١H| G%$UdDTZ Y(rWte\rɜ!6s*ǂIz&1DǴ'<%ANOڟwˈDGzE4(azw>%urBD$n&%,e5]ipn@団Bcx+hC!% '0ӡܮY}ۉx~G9:zMM;,k =(OӉX2L3aۆ7m;s,a@H7HA6wQ v|^q1?5G2r)Z4\c&+sɴ1I4 GiT>79aD┅aḻ'm3T>jKJ|;O}s\NOlQsnǖ1&EcX|,iZmyQٶH^f&oɞKμƞ>ۥW>:wj#Ml3 WGB$nF B9Zk.P3,sN5jL "Dy|PK3EЊoc8 e/ )z_DUhk!yMp{k@u~ܱy3Jj a*E5F2Ge9S0"UhSqE5#zмih9F7-%ʹp5tɍ5j &:"mwHzRZlGDOt^1vg6}>Z>BZ>TsdsOjԘE ;rIENDB`PKwL\zttClimit-login-attempts-reloaded/assets/css/images/micro-cloud-bg.webpnu[RIFFtWEBPVP8X WALPHvP۶6 A b @a20A>Ax:x֎ a?RւzwS ϴ8[]]y@TsoL-?<~_p}~eڂsq[}kF^kV^}*5?3/y)w|O[SCY3u+wpkk*kn-?gf^F=x } ˕M|)?OW4gjyJL>^Eiʷr} kl>_*%\g"SN?^g|z=K^?4K[%?g)c^Ps S%??_?Q3|RI@ _7_?~_o=%*%O;KϟKR}뺮}׍쟺u'K[/ٷ ~___+_oVP8 ldP*X>@K#! in_?t+#7>wivA5&m2j-e5Tdx[E Mv.dRkp ]5T\ !mA U& U&m2j5hACUIE Mv.dRkp ]■CtgY$1o؂qKh|*F\on[@:vpc!up 0$#QoB v.d[E h$QW2j5h-*^ΒtN)m3 G -LVLE (S;A Uqr4݀ I W󣼀CUIE n0vP]5fuT;ɮDIbAA8\!9] RkVqrעi6XWD+]YS;|U MtD5P r !j0FaRpQxdԘ`d!BLCQmA_mp ƣuabv,)oR XXbdճ? #HHR"%ܵ΋ ںp \8Rkp ]=Γ{nZU 'Fn ߡ2/q& - .W^Bs U&m*U&m2j-6.i:* v٫^ hACU[ і^H2jl]5TDFCUISx'̂MvAlD5T_FԚ)m\ % 'E\ ! ۖp mp0U\Y5T1[mYqKhPCUI`םH K^ACcR_5R^0j5 ʞE©CUIOp ]lqKhAg+z"w{kykV_mASvv CPػN)wRfuT\ !wd'ow-z@~!5T~)fRA&Ad<ҽ~݂p j5i 2j5cO Q[EuT\ !1akrsv> 'EèCԼ諄5T\?@eGP(ACUIE P:UnܸԚ 65/% ҆.fMp Jgٔ^3^qKhrעdRkp6˪T]NimIuW;_A U&m D5T苘{m2pگ1"^qX벷Wiz7-|}o}f=̖q1X5T\!E\ 5T\ !e\!9h~8CV)qRעdٯ[E KhA`9Tj5hӒň:UpmW2jy.=FZB'^̹2 wj? ơ58_ ^B8 /Rkp ] _ #ZAUOMv,_b p$QW2jH.bS`CbA88֖p ] iNV3vL gU P[w\8CUIL%(XX:lZ\ !wU&x8AGk'0S{^ARbkp DR.+ 5̶5hj5jSFêׅ*A|p ]5TVT=7ۗ#[Ir c(5[V.dRltwej5c5n%E\ עd?5ۤ j=37[Eha5T{rf7-!;VDKum2j5hACUJfI5TncsYp!U7qKhACUIۑ>_U&m/Z!dz;\!9l̂qLc.(uT\!y Rm\ $']z ע,mϰSxYE]}kW2$VN'\ ۆ;_賁kpodRkp ]Ko^/i:*A XXl\Ԛ^aFf+%\ !,Dk^UY)Jx\K\5WIc&dRk̀nfA6> *]':OkgrעdRkp ]5hu諃X: 4//bR:qKhKa Z\^ua-w+>jy'ѣI'! پ(%pz*ݮjOaR٫R g\ ɮ #j7Q[m} TڮdRk3&+)mNa~_Tmk-dg5 j$QW2_[E {r*wDԶ$A Tػ@0q@i)994W1.fp!ԃS5ߞ;W[8RkFjp~~+7-y%]65&m2^fkPBA XXEcE\ ם h1ϚTcFt}-E:}VCRk28Y*WUgȢd:! *|-z*ci/ >[\1lWm{S尌R'Y=蘖ZdRktD+m38ۗU&@΄Kh@yQA8r޹%E[L<-ϰSK8萒gbMv!![܅cz*! YGD.<-ED:s]:U/ZFa(%L0! U&m}AD͏znm pIf 6|7و2jJrם53|諄ѾQ&m2jt Hmݰo'܆,kU6o Eԝ&m1kA@^$mp >NA{|Rk񦝳Ԛ]LMp ޒ t) ۙ/-z3RE|Rkp[!RkQD$8$d_.e0p_LEvMN)N o;'Mv٣6lPЊ kW2_.d\"IEmi:,%, =YN -zڐ0BH!m]CUI+_QRl7kmIa&m]Ronh1qk΅b~duT:'y6PUIE[j5cH!,Mvڵ2dhTCUIU6?p V)pz*A U @ORua}]%H!A/MI.uOkE U&! m2_ VpIW2js]K5h7cC ShjN)m2jt򊸬u諄/"buT33ۖaU 3^`V!p iQ0R.CUK}0)o jEJ;d2jY)ؘ?;sG{m2j5 ؇ ?R(hz\P0NZ5w l1 1:dj5T*(0JgZ'R.+Bh8ACUIE Mv.+z*A XX\%qFjWKib ɤ kW:/8m|d39WkY !kK,R.eH_ U&R/[RkhjP3SE[*׷ h`k 0Jg>ZU Mv.lA U&Oۖf&/p ]\!G6jo[m4XAƟW㥶o+z*-H sKm!mA U&m'+ZdRkW yJ]"UI^vDV@!ڈq@o VD=L".l5/-z'qXVtv :SM#0iv YÄY0qKh5r2np ]v?j5D&یksRkծע㪤m-/8Ax-Lt.d.CUIE5{mdr'[EX!;Ǚ`P?Xj5 fpz+2vA%\sh'5T:5UŐ `=H a؂qKhu@ [EQB^rqEdRkm8ZU[o\ ע'A5,gpW l"ۖgfm1-5Tn[JuTv/DE\3B9A8Yd[E Lju;b -V-z*A U&"a;8@#eOqo;5h7cDYZ.zPN^`W/|2jSq諄&^}j v\cKn&BuTD:OE^a[ 9.] m}Di( > U&ʊ*lv)ShA~1D1lA U&mku1Յ[Ej= pjو2Ez U&g;N*ED:0`xo]Vpd-O鋄8,@:U ԸuI'U.dעW@`p ]i !I-z@1u6n6mH+bbB!zvil-A U&+G!s"ݓi` 0N)m_}]afqKhTj5{=]g1Ͷj^)t@`|}8ꩍrqKqRkp2l]' h \ !CqKhAhAC` 4]Y [E g₋(+mHSIiW^ArעdR{^F1nZp\ #j:Mw*XbpLm]ZD0*ɶN)mMsRkpp6٣{SESz3S߈AC5T\ !mA Z'U LCQn(!mrעd[AQ[E٨Omm{*A/mMv.d@!_} ڈ$;tZc77'H1rרtKa URbI6p 5rۧrעpg<-A&բ}lgn)in`VV`2)5T~#Rڵ/-ɣ&A U&j g\ !  Dp!"%,^aH!,M)RעdYW8;U ƻY)-A U&  1wp Rע#39OT:MvCF@ϧv GkumH一 CU7,4%Et#7t$߼3_ ɜkW|hj5~a2j5qRjpI`W lEc;|U5vvpj.d^|h6|u諎|~0/̍tn>B07Fob':γ.L c~m2jlhqXOCUH 5T;ɮE[y@ѫjMŹkѾq]N Ò'֡CL3upiv S쁿 {?ZMot.)md5hKa؊SE\ !8?mA ]z]%VHk&A U1nkRA.!Mm=7ڨls2P/=ɋ?qL5T>mv ?7[mqՅ[EcPMyn[1W3pn5'Xv=v/xRk5аW*-^"A8pod*@Jh +#} iILW Vu(9.S=spIQnZU]Q6 tM-QWb ,R:w.tat8"*,$|rbpbyjDKmo-z*A U&m2j];VmFo-tM_2j7CZ nөķۄGDO Gο!=Rkp 01w=?a T k[d*=e;ym1N)jNkIEL/mpn_-C[[9]ImphACUI01A TMv. `\ U#83ڀ7| A X^rS]`̵&)j?z*~鞢GUIE y,ZU&wƔպK^r[ vԋm+zD4˚pqX];pdqRlA8G_|$,R.8x Lg IyXXc5T[\ P?Xv9vn/iUIs ǔ VU&mq` 8|YT\-uTj}5UŐCkRn+z3RlZU(?] 1 l23^\{dq'ȫ`6d){}n & m/Ɲ[V*kWMg9Jk24͌^o52بapv1#hA ̕5&jDx^aGNE\V7TE\ 6Z]#/ p?vzgKi{rעEc:nxB!\)t)mZdȌ?m2jdؼ0mvRL:\SZ9Km40>gym9*%I7e[ȧ^BvACUN-EuU&A5TŦ0 lop02*A U&[#zlPyw24N)M+!>τ9'xPqKhnkH-A U&lС:FG&>ZU3, NDٲkcyz.j[mj:g:ɯ3[6ikW2j,wF3Efw:j5{\UmZԈv1C.}i㹝(tKaըsf\ !mPb_W2elj)-`Y|$uT(CUI*!o f|-ꡃU Mve.{d-B 5$ rj:M}ok/9w2X} :aW>j5hACUJrGdbbCxgCUId":x >]߃ ^`]'I_`#0sjz*A U&N"u}ȑ1wkp iEcטET`ZEIL!mA U&6"dW6}k]uSx' Nd|Rkp ]VJIĴ$a5`2 6DR!RkpHgc@p ٵ&!M폃 u R-bM~ӹ ACUIےy"N..`6̃I6`aD<ƺsF3زk`5c`J>j5hACUIE J]K ^Tj5hARm!5T8hy-ݪݎTbj[8#6A $6b 2B3W L({Iթyzvۈѳ&ĺA"qOѸ#"U7(wۖp ]5TNz H[m{5k|U }f-W2j5hA38ʗNxD-}n_dӪ t\bȘ9Gw.F#2.uiN|n^N*V5a( ~W4yj-U Mv.dRkp i;#Q<^ADEp6`9mݷ-vh> >ZUHu62 X.dg֏[zj5hACUIE Mva-zeH 17D*U=3`/0A;UWU&ܵACXK=IJ#Tրs}' ~f$d@K^A Uq-EDLuyj5hACUIE Mv./ϖo ]@1wkN!hAmUWD\^2.uT\ !mpj5&u͆3g)oaY`\-uTpCU7r25T;qU Mv.dRkp 6ܵ諄9D2-׵עvF]N2j-C\-rrޒ s\ !n6N Pi :R7-:y*ȖcȊ[E;ڄ5T:hu{m2j5hACUIE44N)m1-ۯU&Jum lFXpYrbH!)m2jn2?u7'ջ"] o5!t%CxX$wޛmF"p:#ט:@hު]5T\ !mA L(1^f܁pmWZ΅F CUJσ a7VdV[Zd3:#s)-A 2ߦXp PSuWjk !^z.d[E[v/)ɚ\Rkp ]5T[yr=z՛A8\sGePZjԼgCUL[V:I(T V='A oy%B#]SFOAx{ĶW{ \!gfp:cn jmA U&m2j5یvL#>А91'`l ^8ADL_VE[} }pa8 UI S8ע Rk;%WuޜWnJ=s{57[!- S)+`p ]5TY/JLowXTBGH؂t7rrEY\h.\Cl !FFR.!ԚPDmh 9M-z"0IupQRl?F 6 Ż&m4pۿ0t -A U&m2j5acTΈȳzCULpW2\!y 5EA Uqz4;[:`5_.m$;jMzdRo!!( 0LddK&pRjE\ !+{E\ !mA U CLywۖykWB_g")ܿ NgK:NDN-d#- [L§pfY^b -@am!ՅdicگN(&;]t"̇[Erע1^qKhACUIE \6b_|Bs/mMҊFdTvDCէ5bypMt5m\+PN)mCUIFE5k|X-Yp{nm1YO`wۖp ]#xx1q̽UKr vB>ZU 'FiI5Gg%l/Jĩ j6Fj^WCUIO*,|[V= ه;Lf+"GF4s~YٮDCm-- v. y؛$QVs9ȍw(\ 7,vcU ^R@`yG^WRXnLUz^z^WK ԳIUzWUUz^ۓ`Bckp{A U p.1%Z1rעQPoO!{c*H!l/'E @`թy" XX"ܽQ {mԷCFf]ˍ\Y m{}p3mԶ"Y" # R/ eucuT! \ 6.CC(^ANo/N~|RNMv"U&jonӫhܽ_fm#pRkbl,1#4]dRad2*R.ci:*DU OVRf8_ d‰z2pLVp;Ki)mtWSP#Q;* [E Mv3*{j_!R=VThId+976ڰN)tA T pz,nh5SfoVylv{W!Rkp +1N) Vss[m;Ep}jo@N),uT\ 5T:PN]X_DE107IH U&RkܵVvjm%A-ܡjd.HdSm#^AF""[!#|fp & \ 44Mv٫6ܵ5w3o&L[m6]'-רtnF?STH5l[I@hy[SK̆&c> {>??9oWD{kvL3| J.0AVTapqs@(6`s]3"V; rQ'r ΅U|rYv3*3 JZ~&nj.7GJ iI! >,mETA 2E` o Jqv0=d +  ,Cz`ns !Om=h1MpqĹ.F]Rcb@A3Daޞ(#[ܘE=ln=Wϐ+Vy'@q,qP^0B0IW-A)52q@&:`/9^?6@0!ojج*P^ęx^_J6q'AQ0"TTjEaJFf(i.KA :uQ؀ CPj9,F : *Kޝ/xl {ɶ:砥G냘%~&w=^70! 8 qdQ68Nq|T 1$3Q5^Юph3D!Ȭ)/45(:g\ H {eZ?>,r &D.XqNN+2S|.}<𲠹wY&S^C3 @Ѐ%dnW; pa u$`aio'|PYx=0׀*(PLҐ ؚWF 8RuXENͦXHu7P*XF­i; x0Ĕ45F4l!_&Ț_@r jZPxv:!/Y.fb[?|snv8>'U2lʖ"(iX//zDr׋Yk{ M~oK{ЗB8+QÌm[5`/(jm@;\կQ zx} h@./@ YGm@Sp_`}~v>j'8(R-^ PRԍ!#B6m(Db0hHF+cp0 zuO\U:C5)7`m g'@Dy d6/GЋ<0iHf8V= 'J_`l'WKU`?&cWTb\sap&\ o@ ?vlνA؏QVM=[ .(y AT/լ˜t/r*J`}]#P`UmB <)3A4MԵ'-p hpj܄EkӐd&>(<. k2'/fCt3B5/w>bt!EM OZKgBe"- &?&82~wxu*4Tw}t1H԰{@Ch!0G|cWmb ^65]pq:! dEʜK`i!T>dxEZ җ:_*`]bk #Pӏ2ٹ0) [pgh}r ͻ&`e@%Ctny+u!]ܽ>2' 9Ζ3i~ű}`t 'A')6usYu!̸*հ @W݋IumQ"I˭JeW#E|*_٠  ltl9¿hؠAY1h*FϨC4'=<AO' 0Kr'b`!tWLfCst?F|ȱ !/*d!zTUEYPOnSTЎhgil*q6r`:DQ=Z)h OWuIhwvjQH&_x.]n/WCxOhD Xƈ@+N2V PY 3Z1Jh~vmxje{~2wx C/ZZn=]M0F,,_O{yڞg1x>5Ԕc*y|c"l81P!1%C7 R!@mn g$OBsW3Ѵxw'FS+8v46d$=ua-`VR}|μ݅]>fo'jI,5P6 0{=s` @@Ȯq8'ȕx w8]EK7tA p6 b#j-5k:ڈJ iwxΝt7Ssm6yIi$b-A:(@MGS֓ ZGWޤ>B%"ߒa}4Zb̅plRlC+9l4bJ_ ق߇cI8k|V$'4Q7B˷+g\,9&#nо1DxKy %dU@;YF01=mUât?{=@ ,iF$ ;aeSֆ^ɨ~ HX· (,+tT?+} z Nxi(뜶 Ay+Y!TNA!1pŏFi D]_@xq!*@IvBrb_\a; a:Xf+#%T:wV+%XA"$P)ƌ]R{u[1Z$2Gf"rl< *N -!F}U[rH S} {5dT]^,=X} k-PA5>g@9<SD\McG_$%W(͵QЎ0^pwJi 5=F!$+") @OFW>oN^,Ob1%[o u0ۙ03UK4Bo$l%EH;^ %Q I2H(6|'gGS4 V&Bj-`ES?!h3s'A JrDY{~ 2-\&N% G۷ $d_9QL@]j8#]}hiJj N]t}ćldh*7 "e8-UCN6U 152> +'OC[R`T3O5d  X|3F {YXPMonRNieО`1p2z[C} 4?f< ͺӫ[E+A8, ieV23Fw&`4RrO\k LJ4D2 /){~~OkGMư5E<)1,ڂS1TLw~=E"BSFVnMw Oa]< x<0`)rxGLa@ #db`[ochnci /kߜOxW6@;R]Ӎ [ًñGlP1>GMN@/O1o ^aR TطTq'oнCkrZv[GXh~Cߦr6 z)A% ۔ f>!\`^tLS5C-@a 6 JI69jb"b6Cb~Q~=ƥ &Nj|Xbi _.~JQsӽ@2s=вҔVW=Y(6pX0"| U*V1bk]f@{ɐV0 ?i*<-n۽ ^(7oz ]'-E ,ʳӸWO %Kwx :t$!.!a@ΞkQG|LsnK(} ex'˨?J6TD>qwD=l_22&VSMo`ߗgǏ2Y=N% nWPK#f@jG`ln$m&Sj'4oz6z`"F{d[&#q;oKxP,K3kyŠ?U)%{n)w O|f\l<ʲ;RvԌY+VM[ \?'K^ZwiB  y5e$uTKyct a7Hލ ժe EBAh,A,"fP`w !avWӁ}G?`o1Z2!p?*+O&.7W 7thn>-׋@ )ڒD tK]y .DЛ NxlF&eAuVv7 4>eumL$ rȴV4 n<(gߡ_^&m ܗyz\r<<<P$**7jSQ/m(,J[6h*H3|b =."kp`0_͙nLyEɿzQC1+|JH̿_ҭlM)QGF 0<$(J@UPPpTSf@I^y` ˀBXk6;w%+8Nk >EC0%1 ׉%x>I8++>,[AmbM1st,؀)byq_>R޵%a4Lz'~Xyҿg`@B&b;Z 7Кu _BUh0#RHS ΩOiw4H}m+M,P2~PW,($1H?BsLP}VNpPu԰ p8'v'f+<'@ dEn?+oJ= 5@z<5<~tK/Yt ю|8 Z& !+S*VDR*δY14<K%yrw~]E6մNR R qjGAF0pDx+YU>LJ{?aMH).>Mkm? cЛ%#$l|X؄eU,kT6BVc~{w̼-ʵlX ܏ N :LBtAOXj^i8㛾d'FBInY|W7cͫ`Nʦ[ycEՌ68bfxIah]ߨZA "OE, ],j>6d23/Z⽳5 ᓙHp`VkdBbʦPKwL\6f]//Ilimit-login-attempts-reloaded/assets/css/images/micro-cloud-image-min.pngnu[PNG  IHDR =tEXtSoftwareAdobe ImageReadyqe<PLTE*/@  lkrT#DIX*B;-p  2I  b [7~_l_xk>?>}/w}WU L]þgbn/}K/|d Vbycc/ǞhB@Wcb:ƾc_D#qc2! S{S7d}c/0&8&@&x񈻇. jD1c]c} dc]Xcq/"dapO cwKUc#t-9TS◿{RB@f%|:05OP-6 QfC5+V(9GaB@f^}A31%cTRKyAc;th׮,,Yˏ+R_fc 2(/T۵d…% O./|_UTk*;F<[Ct+D9VR‡.\ҥ=f̸cGQ5ZWI#;jصbK,9p҇>/L2)^*nxTJ}Cjv#,) YKŏ36mz ,1\|9b4῰Ў;Vr%9jGی} k_B@h}S= +qlX͈C;vrlWI%DZOɚ1c尿m;}* ,_a?F P#ʱC+jVЈ걇r9_D56csmڴ 6=2߼q'|1PM _WTO=XJm1 ӧON VvmxYbTI1"Y1)lL1V m$(6uA?G{ AY"4,Lj{bN9fcL/CPcF3uCplO~%d".};0w1hF>TЀ)DG6㮒׀"D29H d\p!jh_rrR}/*7np5& 6}ر_>U H׀^qAX4c [Qk $6=w&M,ǘcǮYz͢ݳ0 @X#~mIbTROY˅b31S Mp\Pl5w^f,A@f>bTu\q5Fic+v$ &1N{嘨Ʀ˗)cE5Z迧_{ ☬ n* R)WTBׅ'u+n&iPWy|5ךEk d9ñȳul8TSʒhRC%Q}cuIK-%kࢁ d@2 Ы]b̗o26“]忰oH&)oXA1Szl"Q}cdM.tu[9=q 9bŮJ^*Y?_g8Q*jliȆnꇏl쁈1mZJHl/)Y N^*{klR)\5dNjRlСC45doUcsMOїfc;jvjlcʥlb1]k*66VjlƆNZ7n?  묩% !aM[BYslM丐5Xz$[HTcw Q B@T8{([J-刿LW~)?=U6vhSS9McBjkj'~  c ;oR3\HŊ;vS%/KeG_>`,cDHlLL@lPȆN4tR]]ĉwN7|! O?бTƴvp!_Wa*9_c{1&7pCRPlYBӦ ՋIu'nY3gcP9—*tQd.JilRٿkl^M mRP'cp{"o1~4sLcu&1DŽz?"dqƴZ…j8/U o'_sLyc3_; w*4\٘*5m۸QPD;s  ]äp1Y] &Jn'>Xk1-_[>]T]f5sl6tNbٻwܝA@{c@j ƨ]pR c }ck֬j?u|XmuiEbgr{ !gXL=wPd:ʅ'[**r^ NBbL`lYd1I&r)&JǪss+?G?d16ᖑ|ñ#FQsf^z郅ڵ݇}vg+$@6]MppLi3\SN4Ik b'R5;˱uk\B@~ߘ| cNJ*y]T. [cL1 ljzGco~ 2Qm(1'c=[[nڵ?ZU%bS4RUc4[Lӱ]+vCh)5z5&]3v_$?OnF*b;{K UV.\WXXs ,Ht5|T -)ysT'7]˸YF1T7Qpl'tXu*vko1XȢ}T~%p_9˱31Rޘ~ycy8FG2Ścz.c_1{rڵ3gn h5,c}e5& ~Ȣ՗J~bE-Pt&[P)O,/_yIlRډ< 3EOYYGk?sۇ>q|$! ZFK19rRSۂK4߭pl<dfTmXWTg.-r+ QK)3g?|cy(  Nߑvsc襒AK/-.__ەv2plj}rYq,&MK1}/zJr\$DW)e×-[w %dQd_@CS-ٱcobm䓰C@֕^ _w۵냓~=m߈__ F]49'm6~b?_*EO˧ϟ?ʳ{=I6>u /\1ZER%'eE,"QW)8?}ݜ/87FICÿVj~TkgΟ9_t-c$*6.! B5Ȋ 1ߌfcp#hl ^JiF]JJNޚ̙޹r+ E9&8FHgO3e(&%djl)Gp+ٵ%6vq^*Nr4v\,.]cuT3]3pp_}cL2&V9jϞ[06y2uF:GlI#&CkHGcr3\7\ne3䷠]$ixc4_wFcFm?<*sOuY5ƱtRD˰~#6V<]3d~>+iE85Q&\['JƻHb×-4\ldMd2uh"Ql{8G`lOZ\ZOñTR )G4eWIޢؓnݬsLߩ~cƠ 3}c1elc'9o6x3\;(Ht4|͚TblhI~1XSXaaS)~}c襒v}>;|9b  뤳

T;iĺzOgrsiqc/ņ?5''_>3f AYd [,J%M{ 'ݘXy5|5E>8*sk]E\;3tQS-F.(,A 7k (ON~|E_/(Eñ'KrV=7cLRc?zX~Ev;EK9tc]č~7{u(w*D9&@lټQ5WS _wPWyP`y'Hzy*$|ҫ^~"J@TN6~ :vhY43|୺rv1DZvl>9.F[GIؓO^eE~}MB ,'H]/[IY ĿW o<El8p"2y3wQO9tƍZowun.'\p[JGo{Fu=g2N-״@Ʉ ,`K O.FZPiYӧ>jv _h@fiZ+dOW7V]Q?;"-c=4{}G1.ƨ[ 96gdB@A-w>Mr¯&r_+&2Ħɜ:n)˘qQzma~0ᴌ쭳yrϫWɢ/˵9?E O|hL t~D"*\4mNЍ?&n5oQ(DR+-#Bd!aȑ>&daj įM|H7RMv9ug ~k~b싾(~^*9x1-UO*E1b˹[1!  a ͯ=>7coܠɘ3vjE UccN/"?U"Us75N,"ؑ76Y9uJ_`L#G̷ф ,qR ]x˰T2Ҭ1-bb1[޴$(_/j(dž7kycWN%ƨ1g9#G{1 ,ޖ.":#GWqNϬ1EM3%Eu?砞ӈTrz_TM/DUcur4&.x2Y5M osŲem1[Se~`[HۘƴaQ^5ܪSMSʌf 8K/:쯵uk'j~>{2R~%ټQ{6LH>G\ἱj{3g򌉿~{8n+>|nTX  > McWk~f_yO_UñuR5.\cy7bt1j젤VS+:fc\uNl`'dSƎDySd _,)"ibHRc۷Ϥrw#JI^.T.)8ֿcR-vf0cW ,T_3ıe ߳x26T ;k&[._ =ڀ_@L(b=S`L玒1QF7q|8! &n)eջΚ6r5=Sb^S7Vw*gp ]vQ{zr/g2ߩKrHb cdz$M=aQlÉ+ׯ  wKHvDOY[+mc3(Ǥ"of87C),?Tk#Gj[%JR$=٩hƿ +W<'d#~\FZKZm¿S捝˭.\k)bf> -2údyn_,%\8v1?ߘ؄ 6l8a}qw dWw,~˄ v*)B WZ(~el;/o QœOnoKT)/#i/0pq)yO1Qs2#G2zYwi#~^ ޯT Jz9=l8SqP5'Hb}*`O{q>Å҄JQQ5V\(zAYu,fnrycbou q16s&Gn4^wJ6\!XN-=k/w*IuJX9ĉ2ŇP=J7=M;\]Gqc#~_YoOyT|;#_@#~;F7C1S,..u+̝;)S AY.MŻHnc6Pku%;.h:Fv4mc%Ş|crjۜ{(9&*Q9\L%&c'K!1lB@FPNuujʉ\~ıµQcıcǴH4U>UٯOS;5FOHڌ%\n99۷c&Xqs =dʔ^S AY8 88&ѵ]m1\3k[S>؞Q2I}.N)vpj/ zO }/cg'N(^_\PnS.r`ʒ^Sz >=TN.&WqcteyΎuV<.U?g2O TNJDm5 ?UrNOaNH;,Wgj8bW߂oovT.GbL>TU\_JbSDW)^K{ȃ AYX1V7nDM0U殫^;oA3~>S9|Ȟo쪖H7F[\.)F1W;i&;4 '6\XbR9^*; ѧo AYXݬIuuu]|".~$_gΜ/(Ɨ(\ ?g\Glce5vSIWp!ksql}WD9&86Eג#Gz(qi/  at8ۻ27L:56|aWgb0իW5;;aM;76GKJ1-ol\}6lRc ֿK/D9&)\ƞ~io AYX=O;_$Re5+ESݨ0~~#wdWg;;=9~՞)Wo_1AVm1 ƎLbo(:*ccI~zJzgGOWqqb%al=_Fm$^bGh4Fn n*bgdN8dTIYMplp[FH|R.8brsAFW]ET-IVg_YO-%/U7Gr!tk_n$Ӄ?;!T%d*)_gncNe("M֢?98F.T%Ŝ9r3<7I=S+vl"߂W*e=606hg?HDg AY%9.J9gټ=fz|R>S(7"sD5& 6GKMm%wW*GO+Wn(^_w)*E1vS 7|Zc,! T3l[oEۺG[Fc# 0NI9#ܫ-#qRae\G3 &g*ޥJ|ڌc?ILǛ%d]츠1R76jď}|U.3V*_Z/6Q> + b(zI/}5\VcK Q.,LOǛNEdZ&ʱ c{$~n>ygL?JS4STy8yRDUR!=T]B)R)bc<&陙 KG|,WQVVccCCüy<Ou Ӻ۪Ŀ܂"@-}{pZ Gg*gM;st,ڵݕ++s95qsD&ΞٷnqOy:cg?`egoèr|57 z.Hů2lƴJ"aNi3z73֜p!0V*iO3| wGM؛:8=<3g[涜m(,s'cjlʸ1eQN-z7L8 ^yw.'rfG4HzFfFFy@X9/r'|(MX+yŭǏwTA=eO>;7E|zr TRNFp\^*3rEcY-#=')3wi/#M؃Ryo?lKDd;e9h_)>A;%X-+YwK-1{Gmcr/cqCl&ҌZF*S.cn5 ?=Q+%Yg2#ig\CbM2dYS4JN[8ֱQ7E|+z < 7*zPc~oe$ 64L+(!q]57dX/ 3RNHZYq9-o*E _-%?TZx ySDbpAe_y̑˕9̑kI&[埾b!F?szRlHa-Śk;FGOܰ- ~.F:0W^w*cU# 1bXV2 kN}xn/xXE{@plQE=7)3NN%M}=.i噼cɏx ϰX*0 '*E=v9N~Jv\dSuw1Z|Ly7gp\HWX&18Pt>Q%iFzo,mv#1 3M'EWIXA7Xh(Tde//fӺ)XPUc92Ϛb0&I.)6/z9d@fҥ?3g[zy%pejƋ b-cn䤘(ƺr΋Hd՟~aLI2RQ)ff{'3eW1wSG2 0~'-Flnj='gJo|F2 ^׿-Qeʆq@O˔]yƢ;dY_|Cd^}B?6㯦CR5ì %+2 Rvq;N"@A*Uj)I2 lSJt"  {JCF_! X _w 2 KOm4!@ADË1G0% Rs4bI$k2Hqu $2ru:73pU  ؟d kg TX#@AbfN2O\dʮ)=cHd5j(S:d@YN*,`I§ ,ǘ"ؙd@1Ou41Ed`4~dPc${uCAaPJ2\ 0mT$Y/>h+p{ LQ)Z2 J"cӢ\f?! n2 cHX lOf  1f?!W  1f;5D `̎$C"@%FcHGF >{d"m1{ qdEĘN!R|2 @1=v*D2d1s0f! X=1f! T+Rkmeag >sKl@2&|2]ev&v25G5cv v2Ȑ*Œ?+ RdXȠ+aOv# Ƞ*O6#V-2]ˡ3~ ,)N2?@ȠX91[ w2;]eJW[#,ɰAq+i1 J܎sp {g8<1 JuHVl> Y?)J5H&(fOd OReU+WS@)Z%QWi5iv' T,P2(YH K&dWKXV5dP w' ֒ei3QPy2(fyZ_\mlU-2{(][M%S`o풪]]h+-'S8Vf1}ຨB["L,"4ۂq @[&C$X-2(LjdYYZgdm m$k7\k 3+ұU!@fQdUC:I4dP1J5HVd򈬴 ͙_SslWF,/?tǴdRd Ykjs,~ϕY17#B U%d[/̵`dPBS{l\Ks1 YG1X/L`dP0Ǫ]ٔ81ZUi/;#Y@T @*%"*XYqجfZ02 vv<=MYYJ$3Y/̴`dB]4'x;PB$3׼%_jb6@%cn|k]OPMQx$ = ^|1 4XB)"FwA,U1ݴ$dVrc->TY **T?Adk 9c!q,R@ͣȲ-Na̓4@LjpR\Z/–d,8Z˦Xc2p̦jS *ɼ,8L%7YPE@\J;Y dYRq0[YϖȲM7 dPYuA74,u@9YMNX75l- ;YM 5dIdhq6Y,G odɮ!a5%V+n,Nحn2a<[ L&Al'Kd9F"@fȖyhȮ8=7dAvD2nW[C'z|9@mȮaȲMi BxU #@d'K\oYd Slknj`4^#[*;,L[QqI2%FQӺ/9f?d #Nvs V5t $ sy0.W Sa^wD^M &Grȏ?@ 3HWZ"Td3(` %dlUg,X[S*-u'%Z&( ĺ1wi}k7_*+K kKQ|d[J;^d}RX[Һky)Ivi\ @fds{31{C.^~-;Ȃ&r޻64?[2K&W\ص~$ǃ%^G2e 2ƫdMb/+|'?XmGv^yd&nvi 3u*&c(昑#bsd)HhR31%~ ܃VmCہ,Ͱq~,c1wf? dCL2 +&Ր=@djP8ܹ.fv=3o b/u,&(e0d<%f.%C.wlР|{ %@VoR3eػ @f"7J dd]iХ@$ r^d d YWx0q1upef '5(iS 3dpS^*v5eufTYo+H QF`U(CciW^6ƩZ{zİ>i@V2 wR5KH֚0q7p,+7Yd#YA4Ɛ4EY%E,y,j0REWX ,L9fDz",Ure< kpcƲ؄eacݷje@g$Y-87b |%we%)@Yn;d5ĹX. r eO O&CIq>q3dj8H0e9b~C4ct4a1M˜?H/?3 ^aA2{Ga,l쏑Fw1LҌ96…Cw?1@ $Til, ӫ1j2+ 2wL$$ri}#gc᫱^*5iMR+_XxqCj: s$sl(.Gʠ 1{7W/F,pfC5;>pbYfkl@X_Lzb,+X@F}e ̱TzlEM͊|2Gd 8`2l ޹+#~RL@LPLB͎C[bWɮ_KuY 2 cER/c 9Vj11wX\K% K.{@f`ϱfG`쩎b,o,ʗJFX_sl)kرbŎ;vصk(>+9yr2x/@2[sl0{4"a̯{o3% bZPM͎5?{oU} [qBc4Q@ * `|#>ur )X @L@ @d["Dq,'UcrF&;Iӛd]Iܵ}eiAZ+1K%Dc :@wU(0_bP6~A2cЍpc7'\̟>QasS7taL=bdxS?ޯ͵98vSɱ%KӘ6X<<0[e{4UxJKi4OYhhntݩ*uEs)g_4 cSSSо67w_@ ܄JGJ=##1Bˣd@ Yn {K8gs|)Nk"ԗfRA00כb,Fa$ v[u 3Nc_kʥ1MKN$ygu'{*;K2fhT%Mc d-ѧ_ QG;Hrce&~+`l TIXy@y'$S@V1/`0O[%@WX^z-}33_r ؟._TKM ȷ $­rTssg'*;(F8v? DuJƱZ(d##^)V80^BOwdAp ;.c( #\|L}D.ONMr@ d":75QJ$10~h$@җ8@v߳i c6[+4SiPcD(Yx4Ujj]tV8 5)+ ?)CC-^o v޾[?d^8H_+hW"-c[h "iZ,a1[tuuW=޹ 6hLoaǣz,+riS8B2A d/dƬG%\;U/9a\Q]]Q}ȱV1* #)gfpjjj߮wzT:HRރ^oʥ_?2\*7Q=S,3yp(`+&J+o1(-|GHf0UR5O}݈AcOYl(-`F*-Hhwk(&";1#oLg'R@֫J0ʹhFKTzݩow;H{E.̝r3ݘ#mܭs@!&:7&7Vk* cOeH~>\*-{,z󴊟H>U2EGFY,FpټA[doi*~5GBǍQNO3DH1n[_b--͝@ ̘dV8VW[m$ vҽ4?omc .>q#FFSuysg9N]͝(F:7Q(Ղ|VٗG*~\q,5u8Ucj++.pE$sy1_2) _ B F1+.cо⧚va /7<3FBi0jqLbj]?61}d+͋v8Z*M[pwr7q3+1CrA( Sc15)ËYdλ7ϖtvñw׀WQlqfcU"uHHoVEnp1qcOPPÏ/bb e1i:@ =k{{gnir̮] cX) R ~\PO%4#'.$n Y=}rš`oD ǀdX)2ɜwGc3onLdcfŝ浒JجF0v{tl"{MXKf? ʆ5͟Z +%3f1ci19i6@2;d+xf8ƢܘT,Tܴ1w -Tv"ĚH4ԈMTӘ'/ԓc536Y=- 27ZMbc T @V(+),y9H漫>j;K.F…*Jiwk8 2WLbX+ XN1=t DG_`+4Yʘ2`LKQ@(? syW#}tv8f,_z*wZ13₇1_;Ik5ZØ'ߒ#>d-c-)|Oa$NMJR ՙ LaBdq9qid9R,n_tH@#;±r$Sƍ"SIsп{Fč"WC7jaeceCeYbGAXaNlNNllN9H+Ɩ(xZ$ TLQ52.pszz7C+2~bB$&(Vԣ1\)kFYL8iL+,)S#Ʊ89H+^pLSc,Lc rcF#&n$3X'U;Gi#cw<UͣK%QЅic0̌uBYWAaT/NMcc wi s}d_ӘEpRݴ袜foj1](RQ:JpэC?L)֩p.p#ˉ)Q#YNa)dc9$se.lgKLcKfX[HW ǏD*i.k~PΑ5hwcX@p̸U0{ JIMů10~cb ' 039H˔]N;;~3>i^*y`RA@ygsa]MA=@1[>B7ׇF"?RJpvL3c"q,8`,SֿwA2-(w|~8^R9udSgszEB `+ p^^ĿXrq*U~7V ڍTkUǔa!_$s<mco|"Ry3]whP>`S!bGd#:jc-5p"qEA_a`q`23ohXdλYeMcG|ĴO9_7lh饲ycԋTJo:nL/Ec*ךj,5X붚*0B8Vj,'dy7e3Z3*°9Hv+_>ԍ_*|n qc(VQ]^Hc*1^*R$7;~*ZnÜoZEuK+Kˁ;%}i #v 8o ed|$sw_[|UØaEzjEJA+X*iEHD\!ָT*a$#eww%n, 11Td dMVX|wA2YhyJۥ_,W  iuVL Uz0b-'XD\X;;<Eੜkܢ1X*s45FPۚڪ0)O@pW9H<~ .fgIMn5aLKǦmj$Ŀ6w,V1a\T9 t"C%TrQ=Z7VMKɈy,2[)X33[8֤>x;|a$sb4vı\z4OyaFB'"z@ c]`=qz*GpȷzBC9:78b0UF~U[p~cQf" ( lؑg6a_z%9Hv zЎ&~*?鯏 -0P^90ꮮ bN򍌋F<#K.\3\"SeK `1:T;s&ZيI4VH>;@ 忇\R?̄ 14L}䨬xm#|]kLjU%%iX%x֎´BY* cMrP,~cMz0S?c^uA2ͧmy?.>9S_u?dD..]3q#TR++U` [%DL8VW&+ IX,6A5Fub+Xz d=8WwߥJŬ~K2t _a$P(6brc⬔,~1k┤XF_0 (~SrN01kU"ӟ kc (Kd7͆c Ģ_5H]#1b@.cS*r OR)Q=66ETU"BUU!ueFLZ_t Ę2j ?b@cc52V4|[eρE>Osz#zE0 =9 j 㤞<4"~5_c Sŏt4"Z12eM$0f*Ac#Sh?d=v+}ƴ@1#u~5wjKEQpo<=:oTBSJÇ9p $r.ѭX7֦V5eR<;@ ?wj4Hs㰞)M,GKe5uUs5Hsc N˓^ %Ʌ9r1,U6UQEKLljq c@tpU$s1?~m7O~ã A=@C76PM]|+} zɊn,WXG"wXk.. bG1i\RSAcqŏVSYrjòT*(#0)_tA{l[eGM}_Y$BYztkyyT3%g@+%Z1E1kBnbDF_ 6NLeoJ)qcRT ?3Yl\V24cc 4khx2z@" V/sj X)م0 6U4Sj*=N}L͘SbMݤⷦ&ʘB\ꘞI}3 ;1+} nqU$sc?RT1s%Gtc4#ƱbMsbFHi$FH_92u^$[Q9RZ[3 _!a50t_Urd0ųxK.,*~n1H)$K%ōk#<#㱦XAIn7T.Tߗ7yjs7rAE=tMGmlD%m JW#Eidk6U L ʖ\kXtnw+Eޯ+{m>U"2IpSp Z%*_jKoH4aP*p=d+==OͥZ)bM #bwʊ dTk񛼘TztS%]*am!sCrqA.51*Fb[4REpgh3?c"6|H~`i5t slc^24FK0ffXHbU\H## FCz<Ča kiQXoL_?J[%*k/3I~ƱBy|d3R,&?3G(f`yAw,v8F[$ⵐ;}TV\ÏN &rD}=-%h @S6ˢ1^-kkb]VWg1#H3bM8fv#I5[wbG2T|CoJ/D.仮ӧT((drb7CBVY߶ˍ8&@v')Z*djnn&EK'ߨFҪPk5-֒3|&iDranwñRS%%\80.XꡝhF2G1? 6N$:(~h@0 LXG#>2U$[w 7A@M&JdoQHjʊ.)-@jƍ;&~BWec_McpF.e1ii0Jɺ1͎R1?_D"5HďӘZ*Տ5Y<]yLX1>"UAT],V~C BʚrmL`̜njDU6Qd8U1|ܷK"0;*/ċ^i:*ssSys7L `uXaNL!p,.*cuV,h[ɎDJ@1j, +(/T06d\ {^}~ Ҹ[.4@s3QxSXW5TRoaB11:TժqΔ\0/oOPB!5=~r#$k1Ao1F^$wy(U(..D=T$#٭da=Ʊ6|{C%Kû*c)P3wT_KX_ :Yo- SɑT+z aeR*B)=WLf2XÂb2PX61c$,V_9~rLe slO>$8m_,H,Q]ĎuML0J%31CWXoylSS9̮Z5;&8f5UM{$LT45Y:Z#n>_zȊ]i\0WVfgggHv+S$ !]Gf;ydF2fhSK{&ȋ9j-Bz1Aײ 3n$FS%NeTTUIA=яQ)M~cM&_SZS? ^c8VJ*d1B@r$ "8uFL6%cS4t4, ˷<\*{*{BYĿv%0aƆkѷ[WfNJba c~0;E,Ďy} >w=McPMS졡!~V1ɂI݇,8MstPMcp")(< ѝB=s9;E06cGso8*uu*$m.,)K+ҀX*0 kc^*J1_; \ *@V-@SeȮ{zQSd^پxOڵAOdwjYTjzd*$nA2~c|DXe v7*shn1?DMЍ2C"t.>/'!;/Cٕ e=j kKd ["YA/ٳEFqdXåo1Ajbs@u'XWS[k=/^ 3kђ m8Z)դ)5- ] sz7J&'R+iƴ=WHj"!S0v]?99yt RW*==m5uz+[2"AV.yhggHcjFOe'UwW+%*=ODXycy:"O3čX\^@M%c4I…L0| ?}X3uyh&SkevJҿX6VJ cŕCŘƳdziVSdªK=nxk%=S|V)-:˛x/D5?<IL3cxTT_~qcRTgUj[z,m"şАv|dicw +卝:} +p4\NWFYN0VS(XS$f6DCoIL O_|PyIXAAqČUjc=)jHVSdװU.;{$ ҶwnxdWh.ԫ10vbt㘩#˓p '~L׻2CJc$JhY=ZĿpmDRU->7.0;<ݡJWGB3>R8֓ kKnI dWw1PCP-=㟸36pl"VJ\tuML 1z* Ec܌JX4h%\H/2\n;Ʊ)I¯crljms-ʼna16vJX7@` $tȡXP85ïPMc dYt:c1.tեDo=1TY]= *xqh-}yTUI#SJ+ԯԶ{Øcr|A, TK*)VvJlE ~byTI-Z@Udbjkm:K]qlkzqlVoE;:>#!*(ߍԯbMJV\{0HuZMѲ1}$S"12' 9ufkp3o 9 64{k .dgcQ @L-c'4d>=8fKzR9@nHSK° XF1:UZ]_ k#4q-(~P۝Z2#`ӸR"])2J@ux@QNH8Vc8LWq|VJS5Tɢ̘2NȊ|+} cߙwsl^ YYk-l$\l(Z$"_+B;YLcBf$,-3FEcbNMWeYSɦ4.ۍӕq|4_a gamrcc>_|4գnf1N!xcFAkcΒdDVdDDd][ؑ$)oZ" vgCa38E1=Dg8dT^j,*~>ԯp]\rN:E$G1bТ'TS5XxSjz|5v ,n$?tV$U'clko0f1'$TYJʿ8@v%oYqly4-_ HLJU9_Aٯz7[h\VZSZCOabe(s(:6К5&pLc:ol]@5e;E9zT&CTOGTimGbX09:z62]Z;ql94KgCaSNuBȯ=c:E,3ЬEH)VWdTJ70Qu5#pwԇJ5qE@3T#½^@t8o)5.ʷ%jQ1e\]ƢOl Xtj);tuUQRc%KeS_bIcp 'uSkvOȊĺ1MT@D`?gn'6ZdMMC9>4J}w.w&c.( aȾVJ\h-F.J: M Xpnt0Sk횎ʴB#n,l!z̯>MSz*D־{"va(~* /3g3FX2[0¦y#_)X*U<٥Bn>S Ҏ]X^ſt6WP?:E3|1są^ 7`̷NpXwiE H1cl"!&-BKz )yԯ(bzXOnRfóxSZ*HFU.M?qudd7Fʿv2|NF5US.H|$g8#X;õh{*ՉQS_*~*';''8Vӆ1TicgScjy_IIB]r7CB$8fKz(.$_X>I.͂7!XV>* oiFs̎uA:Vgh阂baÿQKe.xÖUJ/bOod$?|HLٿ!Zm d"Gҡ"1aJU|%q*o:I#~ޛ`)gJ!H/ b}SV.D)Z'H&XN\lavgrHff\ /e~45:;3+Ad3/~[ pdbYgϒnLcUz+qL "qJ`px@QW?Jn7_s5 {jXaRKͯAm1 cLE8cRdXgK%5 <ԟFJIMDnP|enI>#)֢fjlZ1EDe؟/XɏJ’~k!W$1ث^|s`+*2.xg8c"~݌QnœB2NScEjK9V .㥲z&8(1\-$ ~h`d# V"_LkXY caEIEEEQ/:@v98k}]rղ˾xrC->똞NXSk:4\:E YKQK& &~?##Uz*aMV!*~!,,cY)#%5 b, (VP,)* +{Hd7=Vk!U(}td~Z jeZ#,F⵲B,c:J-c?!%zk*Y7-3CF1/1 w.Xnx#_Ϩ}6#qků=YEJ!KH(IH*R6(Ĥe-˻^8 ٕ**|Z[O؂BvJ)0[e.XGhpq,1֍qX! 1"4i]FuZ6K+c~ESnP F*~F*.5VYYm#%''[tccER q6R3)0_?Q XQQ %d7 $ƭIÇJa kWX\\č⢶VZC9ycP\ĐU`LW`㘖ʱt WX=J)5o8#_k4] ԯ#O _%1=%r$jLMcaIX+R4%&} 1ɮVy<ƖJ}ZO3W""ȱ:ʤM cʸB.$H ZQI1"qc̍}trTcDniN蠔b66TmQ\l1'_"#.rŋU9VȎWXXh7~oJd 1ɮZo^|-?1PI1Sq"h͍I?jLMħ0cqqb3 Z1ܰ5RHtM'7#MҙưWu:U cmR$S²TB*XQIP&НXbXM%BB$ _嵑 9-mqPTGɯ}cnįb"A_KQTVV&1*ia & gF;R:ǍyݾzsSeKH[I ojcHiR{DJI2%y,A$%/b~6ip [\xn*9k5Vy9-?(RXs+Fc\RmGB7f$cvSVi-_8I.769yٱĿÎ44$8o=bf"P2?Xn!XRbVn~c 1ɮXrq$m}Vr.U#wJvUFJӮ. wK%4LW#q5Rbu/&aubmY:o>_".@II>UJI*RdT"d%?J:~Cma % 8U8T$dd۴:@dW(~9XazPq#g$k1#.rknbVƵHZ/ d~dMLicŽ]wzH&')6X0qE"Z*Q!֣Ʊ0[$=f\O{%Y±:@&oN؇CB$[vrcib*F4~-F*b] fLtc\[1#eHjrEʳt5q5+ 98E#nxgW0N,"Z7&gJA1EcE0ƱMa@2cقD8HvɱU7rgPE< [ec,V sԣ4FHˉ3lƭ5#I-֙F*} nP\FX %8S"6de͌19m55ӖݓtxVv$jLĒv'%1%z 86k}' ~2z/]Eɮǿzn%[nybP*2}! PZZo1s3ښaDe,?(~h.з[_?I5! eA1SEZ*Ǔ{ OnokknLqmaI:~Z(ElCeeĩrPAe[?cr.<|]!Π4{?UJ5\1H1*TŔұR1Kq80 cMM A= Kex7݋1ꑚvS; 0ql'".F1ݷq$3eJE*0*N#. &,mzľrl!!-+=6(ڼ^-}46.8GԯqdnwubMeSXXgV#"DgN* 1, `F71:; U(cO;RwTf,+_)ŔUU]βע ech$rL}[9@Aɖƶ_w-ߊ5~NQn"-.\P(/&TI 7GS_b]i,8̍~5 [)EDgݞdMA2n1#Q?TBQ5,`xY,|4%nS[֭CVe S圝&$Ar|tav_n\'/J_jh _P_bݩu$С2RJFJ~̘Wj_x:_}#}m g$!ԻuēBcC)R,JSpX0~bg*߸Ubo0$511hC%ر Hu;@6{M;X:Hvi:J.ZN O[ǯ1Fj"eXsua%'33֏1DX/7JRA׻&Aw$+F!>Tjk²6a=mSƠS6jk ᧂ$ɍdUVJ d_DdK؞oވ߷cs?Uj K%XxXkk?JD\㠞uւ7#1{R)*~(8&3=T$Ix"NHK!(A,J))5)J-0(à^@6g!!-]rl J/Rk}x!utcuP@!Z*r @*t[d";̢1/U#5P7Jݮw9l4RNOhˍ6ll6*J:U":_c:6q7v$4(~5$宯pM(V,(xK&z wvߟ #D^LxXJ`%qKeRQn!MD 0?(փ6Y@6g|($AeQ\\w}v#ZƴUusb'B(EM/RP_*5i;R1(RO1 㧂%'PYiXóٌT.uӺr:~!)P Ƶa6FJFɎ$FAad#۸qCޛ [H("o.gvQ{*ڌVJ_MfBΰ)VH.3ea!J_z\* ~X*Y86D!=td_9p̌G1$'LI(#51QTX)Y?Hi$,xh+'CB$[ҿl dçDßK؝ZesHio ⬲L?NPD .tx:` 3%6J" @)b $In!UfIP ƲSk(*L_F,"McľNȥa vhX@nA x@vXȏkMA=}+ۺ.ԌWJ)3Ӣ=p`݁@+*!~#67WUogzl-'Oʳ#_ ~O^J.2jL Y05RPl损^@2)/V - c~kag+a F=o S(9$q,DZ&a&? c -'ŅT[\1:W23ܣ{jŦi1J$'RJ cT)"Hu+ǘKc11Q8F1b`6onܼ쩛oMZH8=w~rXd3&!⯫+%bi, !c?6L+B&!Bct׀8~7#\Nrgx1%> bc,Q f$o!JFS%S%q,!!!,)I,"}F&!t,ƶI c=ݻ@%`7om'DFY9֭ނvFn$T ?!h 'Iuo~tnPwH'f mm\^,K+_Jyp0fPca% aE%% W(d) *H bQ[@ .s,(`,"{.@ T*~7\quamICƅ_ڍdHSex:-ZyTɅ"8;CvJbj۴"K&2a'#O* ;zы邷knIZ*I8VnZH6V܂F6ſQY㱽kV0) q 0fq3I8*$]KfэDSFHaPo|wpl>J'Ʌ**Ϙ5ϋeXH,?9r$Se2E1dZ ;'61 cǎݻ GS BlQ3Ҫ7b A?\K,5n1tTD7Q?nMV X*8 1 '/ɂ.TScj̖ o31eaHE[X9~˝2,))!))ɬ c4z"8 Bƽۻ9cRlQkP\,B}6@VvHR)䘮LcED\Pi"04'*Üş>S톫I~z₎ҾgQlqxzY 0tEYi;%]))[e*ҞJ3o?pT[[ mظ@Ge,X`,"{6@JlFptcS%p p\dhfvfIǏRlobMs{DpVƧJ0Fʓ4F$Yf*կ$Z*yL7 &;lc7oܻ c dwF1{RdQ7X.4kZ3k*~Jyҽ>wC. E0ނrqϮd31-zP.0ƞJgi1Q32~ N$[eãe+r3^)qTӘB1;vW,h[~6h`,">k K ?-+±B (1_e_7Yv0T> 1 Ev)3r Ն#?>j<}f<[35SNuRH)mwJsƐqd"%JAR]l=qB~ Δj$;HoAvwwq|zT CcFo$º GIeLNN^+s,dF1vU SɱƀcRNT 7RI}Ų9,2TfMc#K%U#E^\*~7[$,$n$. gn=(vĎvQbv޻w߿CJǂAK"YX`S2FHi(d;vM_8=?T~rz0"A<րi_ݘ&UHpQ$״2'7Q)IH~rc(/(T&Z ֆrl Qc;RǎU8 Hzq+!كd0h E6\W I=g40E`g8`"S8FgzT FR) fSh"D$ X4h=Bƨ1ѥ HU%1s$s& Mwq\zq󱽍TW;原rǑ;VhbPdG%傱,2ۨfg_3zb8pHgspAE~~0Ҍ4 ҇׆R՟[ei5'j1DXgÍ3NZ42~2"KaX*MnRkcIE EEa6ݘnW $}5vpčmLcjj {1ǔ1zbT1b~MQIb,czc'Qa)4Ej[S5zzjڤk,2T"JV+JX&&EY/qYDwJ|xl3<~ݱ{;wwK⠞$=),Dk%Qc" 015MJ~`L|ȑ;w8eۋ+.-疀=*+W͚^$er$bXbӳΈ> ?1Uy}71r7uWnOSeMdc%Mb'#"O]JF2_,!c?EO[%FPc:l r7;[?ܿ_b ƎQØ#[<ȑd.kN-dKQc }JJENg8r[t5Dj*QlLnc4A50~)ݓRBe~5!2'aMJdTh;RR&I?f1zI2.x 5Z (vlo*Vyj c,]@vw2dvD] ƾ3_\?;VHvB) `b401K50l,} ac>n8_λ]jtp9Y~,jΖ~7*-cjW.Fы/i<" D[e@…dZR10#.-Z*whDŽ!Jd0V"='K;"RXXod H̋-bqlUuBe` cSe::ý^] sx_yJY){܂ucď EᇙJ̞J Ą$Q\PnW6?$98vXFX#8~r#Q, Ǝ!זիJ{{ =r0%mKǖRJy\.ЌHppTrR.: Ùc܊4NWζiO2+2YA1J,BmF(~0 ?HT/0@įƠx(0lN5Y`l׮-`ldKRcz\D|-[}1T ͍H\SI1p[94FwKɉڍr!_Io6JfǒpƦQ15fP9-m&;F IErWKLqccud vٵk] ǂ~ mBM̊1fI&O%*A5P$\4>ox:Δjop(qIr㑩޲+c=2L,1cY76wʪp6Sjb[&6$ ۴ָ1-JHRw~5߿gJpc8e5ջ!^^H45m/&833bz N]rT>{*YƏ1T0$ l H5|D3ҴAE)bYN1EF3'Yydctqc@>F"~`"g?Mb8UbT vdn4lgWh/8||$ vJ|1;F)s$ ,:4Q}eWkB2VJWJ"]Hy*2dOY0eddڃ=ۊ/ $c학#Ռϰ#Iix:@17\>i[Y?Op̯pH~2,"aC1d=UpuCn  ombE2krlw@fůf1)A% ?)eǿOdc 7%RIp`l7)tf[uG2Ǐy4 {{ɞ |ǧda$ uz,1Lj"o _4lȰ5xJ5?y\%b:BgE=6$M 3(r,D3"P^$IESnqHdc7Kh"D&g8b$jLٶmjqǗh|@f'm1=:{r"كK^bYm? aXf41rBJ/f13~xPv%_ʶ6rc$WPc\.W8k,tc(2R&B7F;}rwHSeqqYe|e1F1x*p4I.:I8?71RzLO%aXʭDmݺFؚjͨmT@jkLcHrDƠU+j0Ub|AL>Ҁl{,_^؟dKRcvB~}ƈMpXۑD_\̢1Sg!-Y2. I>UaYVq`#5\!XnEى:ނPlչHJFca(~ƶȩ#.((.~Sp쮻^\a@targVq w.^Hv l(p/(~7~PSGe1ƆƩ6<r*3}"YP?gVb8'_nC-X شO HY#yf2#u,vNV\n;zQ'o-I=EG V,geat[z[*)olupxËFm`}f<[*ېn!7J$E5oqW(įbA=I2qecRGXs+c!޽p+E$%!AO[%H4R~~@a=j {€ BaȈl$3} oh vLc,ƗJƊ]C8A= {phi J~3wʄ03ËQ8UJ!S 6sg~e;v.`FڿNw;ri1T?.[T>.B{ԻfW=rDd~%vgQA=NV-aV8wsi;P/rX2!ͦz7c{e}͂_D^.xd!=z34[Wc{ݻ*?;^A -;ߧ]t\-(<\Af25wo4 NbA}X }ٰ2|L(~l)QT '.J `G][So8Qfr\;I?cMIo$l 2~h,J &'"~Tn]#wJ7r2߽OI¯vl٩SE7FpZ*'75jS{Bc4 _,u+=;ldsHnI"ȷ{!T: \0B9FXSc'niU8u[*-f$0CJ%jE8߂H?y @68obAHnr#UŨoSTowWXcĵy=i_H " \,h~HvԘKv-(p̋;!n{HD x#X2y*,H2E "MoXqXfSeů[õ/ܪōRaA-tď aKRXO a:|M*dr HzsMժU|>HsKe&>h v `S% kҾvtX<*dz{ʼnTCKe* O,d WeR&Q$H ƍk֬ѡڏtL cw AO c];jrVʿ] n;>Ҁ[AMz,ho]5f7$slѝVyV41Ʋ+i$C8رdknFfWI M)bJUU_X 5#%$%IvJBz*IsX(0H5|IOHF-.M䆷%MZ w±XrY쉠V}RdO/ Kn ncGԂ XGu6a]nD 7b/FpEM*c% EQ"nQ@ 3ѡ1Cboq1Qc+\"pJh2=2T~qmw|zكA_,ɮ|+ؓnBAX)u?PmznHMLHa,,!!~ NL4H ! 25W|In 1nF±) ?\vymE^*Az={~q;6;n>~?Ҁ7X, \22[G(7PkP@vv00ϭH"?C؞6F2R)";E"a ~s1B~M+%%Y:ElLhhZ.J\M"%*w^껍#+I!=/(S@;nCd˻Y.3? ?{Wd@ɾ} m-qK542hŃBK%"3|?gJXp,L0JTFH,ű򄡀]fA qcǨ2h,~ҿaQDHcz`{alyod׎dKF&^9BTzk=,Fx+Qd\APvTfMc'aʑ̼1RpXhKJJH_V)0F͆- oݸwp5Nv#+e dFM~1c/nvODe8 {,xZu53ĕ"5Sc6AeDd[ֻܔ_Mzb .Fu%'X2.$FU nzF/ޢSpʒ0r%E)*E;oTӘQ0ֈ^ޭ _AG`DbI:k (<ޔ{`T 1붏e,ȶ-?O"${X0#٭D?3Y?yFBkPB!T${.'SޘXًhۭ2X26TFEE,4h*OlC5F+q1,#o*-$~=kE _"E6vMY= /}ۉ!Sxd/s FKPcW=H֢g"8b־l,Czick?_*^D5Z+1cFpbB\*1q&hd'n[-!TblDI^w89Q*׳M$FO\"= ۠&?Z.V=B+Cpݨ1 ٭Eݯ1un,~r[Li٘N9i_eUe X)i+D]F2 ]+1mެv7#7Cs#kc ۅmq:Úb:] c?xq)On]q@f=Z~=x..x-Sn-/*>1ƭzjRT@QU~FkO%qL}ȉĕZ6ƦJstl\U.a=.43MsGlc T1]!h) [AWI&B1&F:WE]Lg LɖA,XCZN6B mCeL'(,f/v w$iHr'd&53~Ĭ҂gC^Oc(k2W-bddJ+$7.khErs>Z|dOdX3-vߘn/ ߂~;{Wi_1Y1(.`m4f2.8pHkO6Ʀ?{J*A7ThwqH1b0Z]jgjW;[wX+׌D#ϛˎ'ͼx&?|LN\*i|4|qG\|a[O5H.>v-cto$F#dsV9UdXŠҭ岕T lw)--6RgǰL:#)vCXПaVKmG"{dd[y{2&;|egn"dVbEQ[+}g8 [*GOELّsȰ; ^׋ʋ8[oxy1QR {0X2mz "P1$rh4p4,#]i6mx|:&;sd@V{DZ7}k\qX)]{ᯗyWecX)C/T}Pb4?.R.Fo۵roFZ.UեxKf__Š(Kl[Yﴛ-c>f>1ه-04fu;Ø]]{NO9z o~$_}RC՟}g8E$VfژE&.{ؘo5TNO4UfX/mЌĴ1;'1!6?s)'sͥ*b;5:12H.-7q VۗnH)`'rև1X066TTf4wƏqMaE|rc ~$tߒvȚ%CmLvGF2م~y@ar?ߦ~*V[( rX1)BmJ.^݉eB:2ɉ>o _Ҽ,Y]=&Xg[&,/L`2pDM{D@Cϕv'Gew4$LvtdYU2k_CNO}P'8u.u˧uؑ28cĐcѯbc5f1R5HJ\:)q2K쏒|#x쭃ժLs7!XRiʞAonH-uj_Bbz.]"əʼnT9oI=TJ?V;2Y=SH,@_J䈂D-@֜؛V56d1~1;E#)x掄hb|<`]3l "~±V6ƧJ:~kZ9PK^[CLR龭or3WiYdW&Xn̠ukZ3y,Fdu;,Z@vM>2.NvkV9Go .~ i: e÷؊D#YC^ IcF*;xA ) 'vBߨv4ժl;e}buZrH[2Xk+==y?Tp{plzfgPO-*QTՔWXnzFb对Ƭ13a^WEd+6Ď3v!{ѓYS{t,]*m/|i`[(ˋa.TLEPV/⯓wʨ2<7T@c]c,,~q=/Ӹ dՖn u?Xɶ6;37b4f"j ,9VCE}f1c0 3oOc5Kowq|щkfaPu RTj fY_)úYMfi>ofى.iGc9@p =lڭ[s++hJ"Iq?JK%HVHk* +UV阈Ɍj K,B<6MϹ̨ !!d "wstiժlBd7F{Bzj*~ܜ\ricRz̏b/iE86kJlFb/kuk%{RbV'c{dVukDWp]F"K0e0QeuwH7ӏ{5&;Ӿ_0{@H 4vֵ^*}E5nvj,,mHGpHH^-,'g[#x0kI}BYf.'"3˝>=zamfߌ{?a؟ X[źi,$ɉE9ܾ}lJ&޵ϯF:_*1al x ",ż/$AX($131k(dOum~Ts죪,y>|0rg˶3'mG ps]lTd.16,N,ZTBUTJ'-XOw8Cz|k˜jSk(OLh =ӟ "da;2S)ҙ bVLvDM=77KE6])ocR9ɉݙv៵p"k_CZ'lTVV/eR"4ohQ?$O-?ZN(b\xJN3˛_[^&Z T_YDHDdbh-|JUc8lȞ*}Z݉Uv@ǟCf+H¨ 3,3y2zВM2ER)#]#q?U@dl5YzQd=mncpsTZD\K-_fֵko{7b5lk0XN!XTbF%)Ibf$ɂ'Q29K*tcϕrE.Z*CX'-c>SƼvY.By"{E/;*HHx GO6aDY<_yubyyxy8\)q?F+hy§׿|R0vY]bu:uЎz/ҏ41kys[%IW: r J*}m8}6<>op6AnA ;u $ɐcm[fl3҇jԔ0fK-M6{xDv 48E;1iI/0Y6!]-NLޝjlحFa qTƏz7Գ0=_Z턌1te:~ уg'?e|#5/y[x[q?7uōzxDo4&mG \JƼ8龸r~kF"5+8zl\ LJ;Y&#Pʸ(G@eif= Mr cb,oɚ_h"xYem`-.O]r$_o5ݘW[k6T1x×buMf9#ٱk$Y5%0`JXm $h'"<ع+ &;- "8OLrfxyfy_ض;k1R 8zF8 bc&j_c [1x}Ij,V gfJlUDLvܕ{aLy\f&k2S'j1z|ErDPLc!hFZ]-9&KdyQϳVƦoʊȗ^Ĕhc&hY`TDV=x^/ILy>'?|3QX0I>89sי[\*gQ:v)׶ݖ` _ - gPџZ.*M <0?` gin(sɣJDUD,xo޽ƹsϟ?`ϝ{ʻԻdS1fI9'N<@-*glD Q8#M:6]l< GVk>'(ߴc#4 ٯeOJ#$F7_ md{Mzz9 2v%#H p%M(^IOrQt ǤF[L0kXfy쇵G+ʍ{ULv]wZ6XpHndX]3.|9*v +eiY[fy%4#!(QZ 0'xb~ hȌiEd30bx)0I{r1dW߷WsT:mRYʼ(vM(˼2&ڏꓠb$0aɟƍᆵȄ` XZׅM_=Vv,!<&_ Ώf *1-fpqle,_LR.tHb~|LPFјkZXϰ.8ΑȊ(3҂̤I]sQc2&7ǜZ4<^.{a1L@vYۓ]uY8`Áax4# :9M1ymX C"K2hY0>|ܖni3WޫȄva- *?!o%by ]n"LOc\ͻbY2L$b ב_0> ^Q/+"~!Iw?XX*|jd|T*C]°GR-;dޟ?3gQ΃CqYDds1f$O_b" ~|[y 5x7"KLd>yg[B8GsWjzN5t1߫"]:&& SY'e)~^_7埥ǂ-2xo/+"9O}C~fOeJ6%3)526Xcq.R{yʇMcqYgxdz$t,rl+|"2əlˡ_g·LR(a+^*m0C[c&G,L&6nf!b<9{El@E=ObROt xȓgQuVjeJ-)Ȅg`2g5AcdQgYr}"*`Mx9R1B_Љ{-Ȅg2)NJnk'y6 qDc rJ%pmkɕRD&<3rGVW^I%-S!#T2"wda7|HR)hi d٩?D0Z[-yb/H.H "`rX;q?:LҤGw!03,fNSUlo0Y9m|H]=LxJ&bq~)D;JORWb-JЍ# Odݚf(R${­EZJGl}wچDdS3d{g8+F(Vii!:<㱛þk3 OdJhw車@~\ 2j P/kID&<Ih=qվ~_ߍ'N Od1AD&8xyu "22+ LAD&LAD& "A "A ADd ADd "2A "2A LAD&LAD& "A "A ADd ADd "2A "2A LAD&LAD& "A "A ADd ADd "2A "2A LAD&LAD& "AD& "A A ADd "2ADd "2A L LAD& "AD& "A A ADd "2ADd "2A L LAD& "AD& "A A ADd "2ADd "2A L LAD& "AD& "A A ADd "2ADd "2A L LAD& "AD& "A A ADd "2ADd "2A L LAD& "AD& "A A ADd "2ADd "2A L LAD& "AD& "A A ADd "2ADd "2A L LAD& "AD& "A Ah c%7"IENDB`PKwL\؁gMgMClimit-login-attempts-reloaded/assets/css/images/new-threats-min.pngnu[PNG  IHDRhh1{tEXtSoftwareAdobe ImageReadyqe<PLTE*/@qEIXpdtigb7>ݳs1=}|{M}h,d̬̪Ȉ/S#"EfdŲAQ4b1h,ŠX Ac4bX,ŠX Ac1h,bX,Š4Ac1h,bX Š4b1h,bX Ac4b1h,ŠX Ac4bX,ŠX Ac1h,bX Š4Ac1h,bX Š4b1h,bX Ac4b1h,ŠX Ac1h,bX,Š4Ac1h,bX Š4Ac1h,bX +TܼjG@\\܁긺9551;G˿yȿ|G3N3hUL.. .^e z`7[AsbW⢍逷kA@6c_R,zS?}si:|U#vH9@_2yv-'cWL`,T[ڲF=B4="8;PA63gm5c.77w> ,ӣoԓ1ғٓ<*G73h6+|nxfmi,]:"ꮪW[Ӹ%{~ݪntzv}%[` 07g0h5ew.g`Kם4]xH3D ^xr7(=$FwhC' oP7~f ewj<}EWEe;:kMlZi=PC ܓrYƵ^/O Π2O` -whۺ2Z^ykIBL8=sȢWSe**~]3==Zz y^[z쵵Q&Ik_^;6Ay't`~|-]K̬k1ҤI!V"I/%34 ᔝTm}BOv$L$ K&Pׄҍ<'A6N3h&7fú*lQ喙&5ka„I %OBDI -МM^Teq„ΠyfFټ(55cڜIC ~)`ʗNA;xASh\ <5rڶ;YJ/%/'x$% _ ҃ R?Y[!/.3h 93]&zIN CN8&2`cʺdy Y0Zם9ɂ U**h4dHTS:Ql2_(dЌ9]dmdK!mN~`'#+n]AhOAA:A]e~S`g̋rrn'dZduDAf zoy#$&. Π) h v u%=?FJ`%=iMĕ)#ށdAmTm ܩA;a #v?3OMp7ب]~g H$6J(}#Hhy0XΆ gφ;YYE6jxa;7l؀¶av[2w<k~A$lg#މl4} yrOO;FǟzQbM8Tx1Ëqd%N"dgS.pEGʏ5H>h.:orEXZGm@JTp H8^&Ս4bT0~|*Mx 'k@h 1~Vڋ An;>F"r$Xu =ȝ lpEroq$:͠ݡL^oB2r9L!:P!A̩K #]Cv!v9%M~9\ߜF翧^,g/u#F0rАCau.0_΍cj7ıngmzEgj~oo^X5C7G"#y^∼4VwoF^A%7-)K|Amp:_6|h/0# qJJJ^ >Iyٛ$!6𹖖Fi^9{/"^ITX24A RmVFH$%]Cx_#ܐ5@Ie^CSikXU% Ws/Xd>4#aE̠QP-wO`ghӦYM,Bs$QKuMpM&8&x7m ri yBg9m>̚5+^0dV]x d2xDpm֬MTJo:[4wMxzc-n\m'+Y}~$M p s.$9rZMGP #G MID;r)qCX: 7`ІD-KW,->}{{5W[7 3lA 9PPa;+MzIb&z~EԦ7qg8 o"MGĝ/3hԨY}#.16GzID!1F[ŋD(9I N9y̺H<+b`vA4u 7Yx5:nߔ`!մXUmbub../B-tDӶoJfj']fд?ؒ _l> +qNܘxqcSuE J7^܈9e nWӑZvzf_f]Yܟ*\^5>zkI<:qm7n/|Oވ)pXڈdWE%El~HaPvnQ|ʈ{Pj{yם[¾ |yUSɓ/ ?`q)'}+ p_8\rdq歰6ϝX3sHL,L\ࡪzr`Y}Ɔrs*dEҹrD*:l)2RUUEv6R_-G=|9  hʀ, J!@H\k.*Љ)U?A+*\r 4U\ k oomɆcC;h$mܹ\ \J1>GNХX'N٪C1N!1Mtfg+#LU͡m lM+H 1T(Q`D+6asO' 4r/C?8/%Jsq\,Ν;#BA3a ׎@k;"9odln:1т6$tqn 9KD* H/OTr|~92A3yaR;T~<3H{`>>YhEd&M뷔?!M'N?z"]&( ODqt@۲!YkU86osFBBG"XJD qaqg<¯" 4:G<ʈ(`5 #7#/ ,6.\@ &*c Bۜ튇ya8fZm\pN@ꈐ)5zV!=BbM;GDfx 5a#Kbs#5ܹ BD\c6G`6 56ud'V4LÌlL2#0l)MND5\Is]PEઝ! .FM#+Gc_= ZFW)'0Q-9h{s+2@Qt}US:2s"`s\9nW3֨-?{@-JdV|6X<9dB>L@p9YPJZ|7 Ԙnfydb%"`ty^;Mkڜ@͛Hɪ&i § L`$b$np ?=;4jz4iڼy @aiLDj .& c6@ 9'VLlJ^#4jON6}*OӴhS4ATƌA6 PZDf"vto(@;SpOSƠ ]3@0l.KI `;!f*A+7vC;=-0J¥i4y>/xgɴ5 1ȡ~.`l':DβWt_֠85ΞZ-02CuR,lJ OЕխ?[xav sbu8À3٥RD' ?Cu"li\ɇƠɋ32j8D&g#jeV_!_XB ۿ TȽ ѣT4w7wiiج>u>ũ_s+._|tw#.fH3w ^]AQoTF򶺮+dhv!kv]FA\ԆN"PyxUr呀 lՎO>ykl4y~Oe5p9#lAP7بonǭ^qIجYDne}[EoyPXP^VA> WbTCrP)k|٦=I6YD[P'ނ,ȍe:+KnQF4MY=-?Mw|G d˟O 7ET3Օ4{T[5QcYY7خ;vVde+f@峴v/\ASmj8Aʭ%m@uK٤ei)p"kV+DQX<{^WT6;fbК9sf`f 7&PRH4pNV/SX t ̒Btg jf gUҟrGֆӴ_ȗW JBd}@>jh_XB-ڠF- 4kuMTkҾ[XY(+\`g{$ig!9ug?<[؃(;Rt)6hmvy. c[(Ww&SXAA!: tJΞs,FA'fUֹYyj#Nk;{"CvgyE}gZP'hU2; r4io`K5JɤDk\R+hJ_ }[˻mį P3?_!~|,#^2Z6fp%ml ![twAÇK-2# D#y2o[Кv=麍YG8h< FfJ))YM]#]\G&GAs|a ڀw)C֎ U MZRW> /lPWHvPՀH0?| W@bmRV![^?,Aej^M]/9,^G|a U؆- Z޾\2,eʕ49x:tz-HPKKj_j1{@a(/hJC;v7V1!JC[V~-HP-'Nm-_o!-[V/h*cef_V6j7 i-SiS13ސ:C&Lf ;A h*=g 3 mkwD ^"o4SR8|a  m2Q&Mߝ*њJD=Uo˪ę(l1h*Ab!&MHhpKl S/ĉN] g:TD4jlqL>j8fMvbo5hh6 9Ue364i*}'gFAW 'LoXfRU۬+eGU3E9m+hڨ։[`m¨Q bn먭ӶΙ͠KobocKk"j:4]b&rӅ@[Eh] ʹz(c {2A4McKٗ"8^ˇFBV޸0; O׈ L{T'J;?EhyˬR  q+fɁ ڣKo|ZBpc}C5mq3N_ f|էHKby|{}2^iNo֜=*ޤ_i{s!S Уŋa"Q3o|)=oMyЖZP;I鋟-^ o0fh:BlIxOLb1mc ZS4{3o- SlIiz"CP'SwH #}^j[f+\q,qݣ& P^RukЬ<\?o82;Akg<[ufuCqMڿz'^ .Hk&9&/tlLP3c#4pRK:|wXo,@?(%'i 0hڼ@cO^ 4-cChàinꎢYE24ko\W8I3h2tYIMk?&/jH@?h(ġ.og 7=n*0m ZYzUl Š) :gZw­AqdGc1hGTnM&đC\YŠ5*- Ĩܚ4+5`h'Yq톁UAubj͊ y =ZhV84u|] >ZhVܸ 'o&Ab@3O1Z\@30!Փ-4~1̿qAsh-f6f\N4Wff @k6D+7M_Ash1h&Oy2h.< ќ Aft/3sL mx׽E]vUwsg۹*w/kBh7Ġr"Ӽ*EAGl00+qH񔃟3F˂ >1t̍h2M韃 v`'9Mt;|v ]+~cͮmkO ZC[przsp/mh1myh2{Av`H5k$6Uݪ`D M qhc?Šn\6M!QhF07|qlcNFBfԔW^?6_X%F&.7ihA8jݰ T\sf6L->_fh FM@P[)K{/4ag?Lf<1 :M`Wmq)Z عԺZS0JcTOZ3[c'iͦ^k挩S>tZ@H"u ʴB ŠG\041.l&(PiޕFb1h. kU}gM.#z^lMan@C}!!mN:,`#hW`]1gf`/FB2^E9NVB]'i5}UB  DW:!{A$@̪vy9n8E44w*t3.7 _6_a/h*'iN2VsVNIH<؄f,oј Q4{AkW*lSwTS3Qu4b 5T?`q1 Z(OEG_u|vِ;r\͙@N>۵3J]#NMEG y08AshZ4cѶŹ9S֮zr"hh#úO 6gF84튡ܨ`O ?kٖ Q>͊I# 8΢=FEڀsAf@\})IQb 96j!?kˣky} 3 ]vF-E0o  6,5׉*vjlgMz&m0"1<g4kI˟goԖB13kFEsA rAZ` ńʨ`9k1h&m(jvRAalA4 !EX߃ֶ{M, 9s(h65.Y#gN?EiCQZuxf,f~ή4$-8?.4|MYAݢ* [nDeўǂŒ3',iQmZ3CC)έb4֬AvP0u ,s2߳QYsG;/nUCÚE{K[28Rne 2rWN:4sIjwR{ƭPs{sCeY^պs=_G0Bly@ץԘM\mLLjsyG CNfꉟŸͰXHF't?h ~ou 4ǃ'-4Zw_+LvH"ued̓{Fn3WtFʏL (c}kTlVǍ9?Cb3W6nɽwٷxi%l@ .$ɠ7iҤ j~!Mnieoqc-[vKccMqyV4Hrrs64k7Uq2ZrZב\^2|2!l^xq揞x[Hs,hVN0aʕ+׬t>햿*2 Z|kVBv55+F6UuE3A;SR$em FmUE9u)~%|ɟG<5a5 3vHs$hh&%999%e]rʺv3ݦHs"hK^o 0i4CA<(ۀ }C O99א<жvvgo0{vٳ!oh?AyҜ_K͆pl Qu#gY7\B@|`J*>q~EƏh<%P^4ұ ɔ |YCvق#A^4ϢqƏC D Ǎ8AJrq vZcH*OY@@#Hsh;G7|]I)|΍8|ar s4HrHbo #ݡ+=2lhYؑ .b5ؑP>ȑHd*C s<>t}m5k˾?Gl 7GX=:L,žz4\,qՊjkKӰڵ6@0@ 3@H櫙D G1y4($B!3\2QG_EZjB05ke'f0ʂ9/ڳG322): w3߅ܻ`»h ¬H$A: Eb6lz-m^Ͳk0aF3Hsh EEE ,w""ӱPYtlsET+n}y/۱ Fxʜˀ‰4vXVW EJ؝8 ,_ôh0a1뱄v߁h϶Vf40#9}4 by|%46 M^œIo;ߓph߉5l Vdt^>9}@l< g3U7Bس`pwQN6V9u[ܸh`W i:ՄɟYgMP0ff,S@͚cbAw7wjm}pJҼy-.i<{-wZkp!A% RPd "U$kEKK\@V@@-N3wE,~-aB@[a,A`ZRаaIU6@*P3% d9pt?]k9к: OC^ @[5 SAVm:wa xj:l9}u f-ܲ[a@nE5ՁBLֵjI]kz@Zu ԃt>?][܀}imN]kvf?Zl͆2` g[[-ԁ# <:r~7CO?f@=n?CՄimU)M`e#[Rϖfӳ٥"W /_@{z駟 P7'A?t~ȆOfc1;cFi~ˀ4c?>30?;+|#דKx!CBk/|2 A"R3(,(}aIs iNm_FF7 6fʨ'vvetwCRߍY,twףӮ]2njޢ>&19 Uy@~$v|^w^}F=l{pʃPiWwUM봏Is iN] n<`WdFH«y蚷cCDLرoa&+yYhKY[YyҐfe}"\>7Ǥ94G @^YYTI-Y_!lY ʝIsiYSVE ,ƮǤ94g-w9kEahu-i! 4eFH?1i"Y.,&I9 ={zn=eenaP**ê=-ANtpm\Kh1!*_1i"i}:4TFiOl͇| ]KJ`y(ΐ\4G渇Od]rd>D%T %= j Isi{%%IW#H)Y u>|f5~1i"y}_o0--O txuï^  <+~eǤ94>v_L}zԩHPuȵ`%T4O-]1iN#́VM:u*~N}ҩ' %+ e?1i#͉v=!t퉒72c*^ouY4G9q"uQ7,'q⨭SN-uDt ӷ|LHs&hM ﭐ(|6MBqn%iODg"͡v<Ӏ!xxӐ.̈́ k{)8siNͷ 8*MdW5Ⱦ:m$FM|LiwR 2-O}>&Mg!ZAMZUM H OQQ 5=jGyyj#4oh\=:]E飁&a|/ReCbU KO<-~Ÿ]-5cҔlIr3ZBR#HIr9/QŁg"`Hcڜ@ִ?7>V&-A hn|'9,XҚ;\f0bV+,&NƲϏ4P!e-ib44Ʋ~eiܢl!AcA:Yq4-oAlҺl 0hMZ _Ʋ`X&1 Jvv4h ZVg ZĒV>eiڊ>eiwػn Ew )u GcY@ZtS~{yGjwcA a2K9QcX&]0`"Qf4٨ @kmѡ.1 T?Ac1h,bX Ac4b1h,ŠX Ac4bX,ŠX Ac1h,bX,Š4Ac1h,bX Š4b1h,bX Ac4b1h,ŠX Ac4bX,Š4Ac1h,bX Š4Ac1h,bX Š4b1h,bX Ac4bX,ŠX Ac1h,bX,Š4Ac1h,bX Š4Ac1h,bX Ac4b/ QIENDB`PKwL\Flimit-login-attempts-reloaded/assets/css/images/onboarding-bg-big.webpnu[RIFFWEBPVP8 м*>@K$&U inw_)^catHā-˺Uɿ ^&sSK?zzyvzSCwlឹ:6q̟>x_(EU]ς !G=*9|AQl@oQضcf؇Xkjb!X> RUa=*9m!=" {bTs؇> !G=*i[ɲ+BO?䤫H}"bgMe2=l;~{*9h-ns`q D:C0ٌe`*9|AQlC {bTra ` #Kcd\ 8GY1+_C|aluD;nK*bӪgmm-,xԊ{вѕC+ZJ0*RlC> !G>Ȁ8pU6%zR2lwD!^#sq X؇(&Zͻg #(P"`w Gdgm툕*M}y~{eTs؇Js& ?Pnф+@ma":lJX |_ijWP{90TetDJըlTs*TBx؇=lC1p1r0GЬy.9=5DWޓlTfZ.|%MW,`c.)Px#N$C H*Wv> !G=*9|AR) ש|N;#RԌ46]*9SEcZ,*C ՙ>94rlC$\JeC @TSZA ¨'=Cp\b'ɲޢ z?TfZ.x[{HG \8|@UTY_I țL% ӱ2}x^{wˆI4G&Ze&ߞ؃/ dԚp1TtVET?atQ-/]G="Z' ؈rg~tQ܀q!$"9ZAb |ɡ6>kl*K*2iG)5&\>= !RNb {bױ%mCRc:!kJB9>${;dax¨"J絬i6jC'+uN-errї~{B cu,Lyhv؇(",)<=JDkzFdԢ2\6c)-xxcdw"1;$#]duXY@x6X!n&~by툼p/fr6(T*:kr,+nΘGQ1/f0; _i*(uץbsTsdzfկxK댴c֭scJ+pᅝ#DdR7AZC5'c0|AQQfxC^MpVP=8G Ɗ$r=W+rWbbN:Ӽ *2ю{ZJA ֑+p/=ȄDDܛ^RB""hr8l5$vhh|AM@#8f؟ - /DVF5x)iF'z///r"PdǠBu)=}|";-rwQlC |y4 L8ZF9Q7! (%>"Lj~ J@!2%N6\YMUX@\TtbMxU6⣞؉W^[Lj᪙c݃(A^hmh5bc㶭؎044CLXFex#53 VZsF0^=gח!G=*9= 'Ud<<.ht> C zB '  ><s{ 2UI {҄$> ̯skq+`*bk7 gWb {bTs$RB Lߨ)7ןq4Q^36Ж5ѩ6Xvx~{eDIZKQU& rw%Kyۼ B6؇> p\ R@'z㼰`L'(THG&na g9v_ruRL]v (F^_FpҼ]Z-G *:Ӵe7{Tf[*GGC 97H lLxYH}CRl؈mq)FJ-Z-MPI ͖TsP'18*?9+n_؇Cwx> )\e;$D |AȠ !_f(jPxDQ.⨀""wEaUH/6X! {c5=`C1O6>;8<=伴y^GME.c1T&͟9i$R95&6P> VeGo^9kCRkQdTeIpSm|AQp]^7ȼ/> tF! "ZGCjJnvl2G,h 4>"UFF]9!KgPў7!ӫb/ wh‰}ħKyH*9H2jM9ۙb P!4}Vp٨~O {=ETA 2YTr|ARMRԛ-Hިnuì=51tiG\`f1%b H*2ɬ Ox^;Tsx^{bxX =@khH/WbM KM"ve9gח:yu퉞> GQm^2fDZdG=): +Kb N> +";p;5, ρ%(ۣ/_k/u>Nxm6ഛk,Hvt !GBvɳfq23iw%rJ"T6X!ݦ}ycC>2C]m#~"c;dߪ FSy=[ 53|ʂMwikm%EDF6/(cyOWTsa2jMR_պGA\gs^[=dD \L1aG-Du2Q \`ώAxApդP 0 сD \kO9-CukLծ1> t~{{ i?sPN&Z! ^:FzNoVQwמ؇=ZCs.$܂ #6MGsB^&גC 蔀Rw x> F20jjl)Џx]?"^J =Lj)fC d 9\IlfGs*2/"^ Za2U|D: D!Z:0҅@C SfDTsgɘThQ5,;NexZ(/.g^M ;!=Cw6X Q{-jfZa blkD`BǚmY5&d=>U}y~{by7~4|>;f]Ddh>|rxi%`WӴe*wA%3ŋi a0sA]!_)4%9>@gw5I:"$O*xl {=0x1GSt)#qRPwD%HzM"`> ̃:QzhG7OXAO["&/=ZCEFexG;kAtH(D=7pqQ S ߀b;f= _=vDp~]}vi\*Mәm~SPՐ$ Wc+qZMTWXgq{DBT*- ܴgl,[ $Ə94=I^&t^_@Tsc! 툕*^U*&٩6N#6Cb x5+C 蚑"2f 6ǹ6Tm:L[2q EZI+MvP>,BvLj' R2jpZ($F1$<{>D57l'[=xI~^_ϛ~ X!N68" r}yj1m99}#O^;Yقp.ex26X*e^zlxq !Px _N[!\klC <1їxZ*?&^_CKQQXmxwu| ^{b/Rj,K]WSyk>>o$cpЊe {be]ae=B=EHtC' `?F^_؇ŌK j*K1e^%^ZM!EwRpаQ$`.^{ 'Fvɩ8=f6_L3FdQV$bݿ=x#kqռ,舒*92gjЎHfUyߏJJa !G=&OKF2`V)ۂTJ40# Wϒ ۹0K_ڰ j&kGbֱˠE2/eI6"|hikqWh|AQlC /hsh0*]wC (mtIxHxv)=IPvTsc`%r1%*D%txETAzENv9;wߤm|AQϙ5fBa˂Cވ؃*ʵi {bk39? 1TJKx#M6ٲq 絢)5yj R4ةX=jׯn$r$ 9e047$bJb؇=*WT؉H*9Hɩ``*9툐Թx(ˇA!$0/0\*9v`Cᢛ#źT!,JT9 \^_c! ߹&Bg& _2-eoǴ-o ؋ovr~C1My*AEd_]x3 =Pl-Uo֟F0D`1y~{arC{//a4/=Q^7R6o@-m~{b [RlׅNG$AR&KJ{ {bUgȪ|ӸRXZO/ʌtePK)(]/lLo%y햜S&Ԣ"DF9G>//lu ח~@G3IcnW@s-D*M̚>dXRK@_!H!޷xjC}yx/5F+a絬x^{=!I xALc%y~wAmY:i *9{g\AˡK0>`=jZC(WJ'p23GEjߕ^{bx"Jɳ!%i*`*9ȇd!:9Ƕ!*y|Al H=t*/Qbb# O%T&(NXUIWG=у/R>8-.\p`x}f=2$RnS]n# Pլ Ȣ~XbV؎1d 8@bCǛTXD#xwzF$C:I`<c .PE{#k.XS̤xC!8IH&Q{lBpX!mX!67oa2jMTؐp{/Hyl}^&*CK\-}a|Bq-' W|AF99, I'߁e@ }RlCdQ{喌sخrwikq*GlC גTN#Ɋ rZYi"|;ˤ\:c<'|AQlC _a&8f( Ţi9\T!N'Tt%bѕ> )= C Ă~#x""5&Ǎ%Wm$-{0 {1FT9*9{GKWA$KSq %u jfjNpԛ,-|oam.F^_؇HҼx|4 IԽ${"!E VCjMy'XC;d`JzBA)$\ZL >NXv!t`Hz*K_y~w2RC{^_2rxIc ]lC zȕ絭jBejL-)Hٯ 2p[pm6.yH$'ї8\;aqYxb b}⩀DH'K{)z@vέըJXIΉ!'AQBO$*Z>O*9SPxG-LLɦ)>C!B"yԻ?NhRHC$][2mWU&%M G! HC xةVA ʧt2/Ҿ*0&"!dk u2⴫~as9N]).ht>#7a5*Lc&I4$#mn!G=t˞9 HQ8NQyk9lC {b!V=N,> N>p~&ts^_|{m|AOYj6t9j;_1s.e@/*+ # kv\XQ߬rx_uFIތG=\ʴ͖xf ,TsI=S[*U|AQ܀~aU X[@ !I@ƨG%ȋic-"/c=D=x5I.exM^wT (>b"VU/LC {bTs ߗI"b Myy~{bgqu[Dxho2jYң0mQQWԦC*C+CjޜKCۧQl(GCH!}1af/*1W愿Vl~S͹6y}Fzf3FfmC>0:(ԝI+fv؈6H! }h)t$wQSz~{bepwE#3 +AJPNa>X*Hq??x^)?4kRl {bGt)oe>86X! {cakHS01ypKNФ+[tYvS|4huџ 6(q`cSLpTQn2* 46)侮'FTDG؉N""Mw B%TuC =*Knͭ8'5=|~pe!aELwzh {(tJZ&F">ҭ&5R% r꺀U&=]-+#I!H8L{UX{:NAF: kX#AxL_ "$c؋f{Әi>UFygiqс=B;*[33)؀DUO my~V(Tr^[[|AQGAIy+E_`ECfTuL&f2XR\6"cU|`+mrrvMa v.numZCW=>  *VQ?* /̃󵼛,G^_Q܂2`0^{*Yy~{cCBI-x'|t4;/t0y~{b oN 3R-̣/ZOحOA@y:W<VxՓ|f DY>z͐(! { j[8! =2C%UmwGЏ/l-'Wa[ZO^5 {!V=olC8yjO)UBi 'wE|[Jj,JԊ?>B%)xܙ $$ۂͦ d[k\F^_9!0NC R:@asA: 2HQ̢Qʆ$>J KHtjN;4nJM>nn;܀A ӫ[-ɨң.8Ifx?6ɦ0*="kOK [hy㤂 4B;<\^˳"P|Ox-8ǝ1QʱfA ;t:V/($H.:MmN֍H6VMEzG= 9ޔ؃J;M@H"N; dl}"Epn#S'-GR猠b&M6)`K! {e &% '_~;ˢU8>Y«ly谏 *׭qBH*9|M=5(d^d{5qqP"9)a {GHTwp;wYLEԴGcTEN rLG(o`ڨ%8m9D)1~gel*)o:""zE EG*+ԛ 4B>q(uG!kBuNabcW$=ݸ2ݱ*:#{AɲU/liSeY x4> _źW.0)foXPy3v>3 zN8B#^w()<ݱ {vH@:&^{b"*EG;G@etE skrCxY#hGFJiH~wLaܚ"%F^o9Rd.k.\Ĕ;e9[QZE `mkE&e=ZQ9黉}V1~kZ;G)_K6X!U*y~{D̚e!DZ)Fa1jEFg`A4>2߱eoo]Iv)hY%mŕwRԀbS6nH[7lα>=&鳫ALE%QM2rgbԝ!CɩC%T, 텤A|5 .{/p7S%nN̫@|I5׆~(Yds/@ ԛ,)VB`=|?[kJE*HGsnePqEAN2%-)z(pv - \fNb"x~|AQ^9eέv{K^ZAH! ~C>mvAX.2+n b/ )j5=ˮ}ghivV+=V 3^RhjwTh.3v#6VfK)׃}PFVEy~q8̫%߾/=쾼,鏎Թ센GK^7  ʋ־21FMH:AN#S"0LnTt8#N9Fg.:-5ZE*9ד=.SٸOD[*'VOa27gH$*RW?y%M l+ ? An0~ Pm۠G(A f~aṀ%l@z/)}& Ky툕*Ma&1 HDni <ӭ86LQ#❲qʥGxi%pCU|AQlCb wם~>*Ąq}pDT#3[P }yH56X"*w#l&ӻG%ye^{iv=APĂqA9K\#9W:9=q rN9 ^n4~{|Ёp\3:A(N,d}CG>dUI17.?D' K \#KIѧsc!UV R Cq 툼ty- I+eB@bT퉢}d4b%Je#9EV> -`%o&۝ӘT|E>.nAʰ_%. bvō . ,rx}`d z#VC8hCM!u"\MxTyB!8l3TSb1J^}Kq5WfUފ>(X,w@q@@|aT&[8*Nnk|Je pR+a.`[o@=O]{,-pW)C>e_؇^5^#/f~ul.)XA7CRc:t$߉CԘή5WJbRB tv2P5Uȅ[G>"Q!h +&8ҧ"ZCI[BteWZO ؇Rl=֬L}劐[ n㦰kq_|KŨ:XmIE ˘^We$;bc*e&ߥ L۳E&ws4AGáEϕnUts@c@k fD'Z &3+1PM-sNhA`> oMIUfA4_1lT<ǝ(Cë0NDDh*מ؇Q\"ז1oڨաwtx˱0| iL]KktP X9Zq,VDqFwe}{zv!G= F9pM^M߁r1BC0k!ԣ[0ILɴgbdnfb RT.|Z/60 )ƾQ`2uҩ3 (,Pt6>[/ 9|AQlCN|AQlC$q 9P\ŭˠ-x&ɱڗ-W:ӝMTłMˆVee0osZJeRlGx//G=Ñϣ//¨ 6'ttT -; =S6-٘"_;,rxU{-Hʙ`#0vrfϤKS9KCVx`h9 bT.9yoHY&J&spqrͷ^Md?~{}PH*9 W k6KubV!yHeӲpc3Z;v^%|@J5)R.)o/kVX: .}I> _ܵ!Px eT#/u!@[ [2*@씛f,oEG=>/LeRkɑ|`#Fѣ@ lZ5؋8E"a4#2 &Ts(I^{arC̫Nb 0K6X! {bA9=ɯ%@dw>@pCYq=|̇dמuVm=a_zNN/[ѴC |AȠB bm8C {bVSEsۯ&3Gr!tͿ-PJ;R|sNbϙHD*l"^!C!6t{ 5{ٸ݂b3%e 9T%eI}+ 9k_qp6D5x᳖6R班@K个#b(ScZP툇w{f}X> "aS9iv ݳ jiTC.gc SŨژNF,"0xƿB9UJ|e vjfH=1~|ʵ,|AQk@ai:Tsy^VIKУ4p/EjL@4> W!TyB! L>,B \U͍ȫWWмtc t ~^_صU"j.^|p땺Lh{7؈oINo!oW-U&&` =:'t?t =A%KqhlEzx勌Y؇' "*3vfy|M^e(g&F^k516]j &؇DDDgM?f@RMEVx$cqhH֪M4O EnDA/^ TU&kP6Xq !RˆM7T~ 綜C |;!kdKǼ~z)*9Ict_&Oѡ[<)X97J4=KiIa}Szz*YtTPK" &DZG>f2j} @s^,{ٻG!sc5+Z1Ki:,t>d8¿/lC Л!M_yaor2"RMV@T^sx^{b/xЗ|AQvnj*&AљX1О7;d/>!VԹeȥHN-I8q5`_hV 爖xnWTXlG?ovLj*9GQ;"&`KdeCCrgR*ak խ;) 6DMŢO`bZH*M$ W+gLQ8Kl +1UbV&o/gZvɯ$&]?*X!QMnߊ+]$W6 z9?X! :iI %G=1־et ޸g'lA';DrAo?ZO#F^_nn8 i!G(M\D#`L>4x8wXR_ڠLSzu }|Πeed_%ADDo`!6e!/ 7)=ET *=W^{b H! Tjma Z@+-.rHFw^ic1=mg(=MΣ;dмnോ>-#/-z2rOHYph$GTuAj~hՁ~{cI ;Z#puXpER^ [-HZw#"PpX[J L^zekYHRέFMj^8hy~AZ4#:V@ =c}T2bͺ Jܩҽ[o .L÷ʮ0^-P":"$_ e +S'4W> xE켿=|e-U&3ME49Y^`86؉T? $^#`Xi8 X 61cRv JAO[akvC-U+)Rm lC sS gɘTs!m9*2//lZJ[KN|=S H* (֯I([zA.{y~^[qH'F^ZMx// ! MNR5`8;^ODIYDHVXerکa>86B9b:9DBxUt9UEѭǞ?2NPCؑ!6fVЏoXR&^ȹצo]#)ߝ'@ƈ5.9%! ؇ l$|@<(k݄d$z9T>"]z2&:\oe&ߤ ZLeRv4ہ-M~(k l]p,D2d:W7YcR򑟿$ZөowXŁ$+mZ*;Eݥ,giG=7XHC! ;+`IxZ&'&1 ~̆:ϬjMEOZR5 0E8f.8[`D)Tp0@|DZo[|Maq}y~{bS^u }>H:x!0^ח/lI ?+/Зic تxALM\'ighr:@6Df q+!ATsP%AQ|e#^/rVvTmeAs(ѝlP{jdg絤1ʼrVJZG \@ʿ=Ü4H#> &@t{-q3:y\LBz!<MYHɩCͮl~QgŤ 9j̢\]! 5i6{*Q/^x45z*9텢/%7F=hZY㞏S $II5#fH*: *A }W_-0kheH9u/aЀs0DL?e"%?_vQi>\acwkK\MMa#=B  X! TeR2n=H*AeDi&fMyDN۟Pc`˻ "^O.x?F[h\h>N T?TDjM߉5@TuR

=>T;sRl6I@kngșk.EїԝhnU?RmFZC&?D0^=aT=$vM6 W\`I̧i]&JAQʏnx26kx\!6y%\@-r K.[hD؇Ė2 %NC/M54.1@YR(m\@N@pmH)"RM{:)6X .ٷaud:ŏ+ЊI{b;t`&ڶcTn}y=A /-=g縧!nߝh2! bȣ#h3i@98X`EEQm"' :-{܄JA |AQЗ!PKsؑy˝ 䪓^ϥhm[ɲv#//GTr}2z3[t@S8o9Zqb _- [!F9폳e0% pZuv-O@&6x!&||72j*'AvNH}FkHOa#C1 >!X *)5D, y~{bHZȰL*Y!J*{MCTd~{b \*,I,$Z!۟F_KRhD[ ?t(t e ~T3*Ԓ^I^xq<@)c |AQlC /.|#|iX3c9/0 p/B^f?tfMnG LDt Vvs qYXPD8ԕ{k"{;CI.|Hw׋ICS̓H! ĵ ͺ[3%tPh&smcE3|#Hms"jpW:Gskx[Zcp^çڄ6DjM㐶9jMC0#2q89]&`2uc2LJ>"% i0ŅG 5i]) z*$lC&@m*β$#"#hEPFrfZї50Gwgkż36%8- D)hA7CE1te8qN4jCRlCɲTC^J r"Nj:#7M^zcB4A7`nLZ>^ qׄ¼!u x^Tt64֮K!/3tϟeìBH!tx;j|?F\GW؇Oɩ6W7FH&+M r ?SU<5jtb[׋NI9NZ-?:S㤁[ L12Um $B>dFӥ!HRmj֑%Jv8njÉ,ڷyiձ+n b̃86CڹfRVBl?y|d\#&v"4:HG"c X#し~ !I|@CҶ!pO/B&>2(ĂeȣP7% rrW^f~} d4b>S:c4o ƼmXebsXgxt)*u=D* E -[ȼ4Aym(GcRl;Ij~ ʹ" WI|a=KI|ns;u2帇G(2U b:25.߈SoT,|Ѯ[<%15&= bTs*AZgG=$"kd1 z &qRn_4(Lh5RbQqlFhwƈppz6X%*1Ey툼oĚTsx^{bh0pD7׮^{R{T'rZA[ |0 Z1-{A#hGIe8û2Xhd'a4ѮƖ@@7iuKTw c@0MxYמsXLύ!6֭{D\28xh%nߊZy! X=vU`!'F[;9j_WN|AȠ+kq3JDT/R`@蛆xO}1i}y7{<:3:0|!Tz A!S=y6>.kF;9"=)ĈvUR`DL]~˝˴W^voL|%,` PAaؿHNW6)6S"1Ts!,>\*py_؇>0T&MG|aTRr?@4: Ma7"-yaU|L?7rȜ#]*{X5,il1*! {6X! 7CT^{b^_sTt%/-KwbGtA 3=CK3M*RCNR lDy|AQlC  2w3> y6NE)!"%AզlJ~$>4؃Jɳ09 o' 4bhp>a7 H@8ϯp *;S8Y֠E\wu&RxD9TaY9:9QPKtdas {D!rh|AQv`iš6btglB cfDDjMwy|e"lxWأaP {[yPCמ?]jAkcъ(J*I} l mݮlɌ=* b=w= U \96J//0>͓oDDL9=m !kR3P}pxh_֯I|۶ESyk6k1&x؋JS΁=U0! AWDT0|iLgC1[BXIцO-;'E=]._@fzFBfoK6ت?[x>kV6؇v~r)!y ؇&}' DDL>261޼,a>֑qG!nqżi U Joo9\3fȥ$;bE_#r ZF:*ԽI(W;E/mJ//lDRv1dNq CEZ** y#an`3'lG'!4ђ05>!bfIxskH t'mn!G4m|AQlGk`" ĜN9*- YGr؇i>ghH2_\ 䁭u N}.1`*3pv؇ԢOzVHjX_@YX~*c9//vk NsEtRlC> C}/3m])^_RI6w<[ ʫM2RYZ25ѮRfa> =l Ͳ}}zѧ $3AT3'ё*9|5?'ӊ;]]//qUtٌcR^nFXLQo1,w@HV XCRl =aã^{f,e QCv!ѦAkQ;lE5[Mj Y { CF1 %8d-7.V @C&eZahG ("G 1X[B : !$-oz Ә؇H!›"u9PtK5IG=9o"% lC =ӧGQ# C$dH _*Խ{ PqQ*K6w\`A;p[2aw /=:ɣqemhJoepמoX@x^|Ml6E_џ-}/e폳YFUo-f <24}amogyJ^, 羕[,pDu_gsTsչ 7pS_q@|5zvRn*6X"-lC\m"Ì 7o gA޲g<1 kI|9R*L #,s<]oj hcA5ةvhй#y'=Hv> @iAR' /$)dp;(NC$}s:ݔפּB^a٪-~f9BUA׋t׌ "\orܽbd +bT|T]8R:Tv"$4J9xEcC`z[yA@QkW81,E`csAi]"Idt=p*1qvbW}J&{3QGjJƸїiA7&>-z$̃@k85&|Ey~{}K*s56Z2- $(9~{iYkqf2p/dV.M '0=Tcf!%S9d<@7#Ek lGm ߏ #s^ =++0|Mؒ/Пdnm}YdV> \0`=S3 ߅0T 4"ץe- Ӆ ^gv#ݶ YƯ XĻׅu썠* K @o3"lC {bTsb'~* Y3^6yZDxZurZ NJ]5XG2SD"9`يE"^lD')J~^{b8 J{/-\-G^,bVY֯/ʌ&afˣ=ւ}Ť$TI)!$ /=6^-<=K G\XjNxRm^+zsOe؇ъ|_{td 6uC+! Ă xdb*-Y/zhR 4XM%+G6rE0Te)#xO! ñOz]h Mr*9혲M>*YBqȌb "! hy*`*WzLj*9u&xyf^e3>2jcy%wlH塺^,׻%{3 a&]  s,bU'L߯.#~[5NN5[GWgY19!ޟgS-<5F:/4Tx~Ẹhp4-.#՜;բU(ѣАbe]*K8i}&3>ғN|aTJ~1̴ Z歡+ wMxMG?MJmÇW:\b(dBǟv*z˓;e$lĦ~AT.JZYaPkq*9|Av~Iz/{v *:+ɌYceP d,ۂP0qN`6%x5~D+>ɍL%((=0FXvOw꽘 1*Db9, ğ*PD&NKdem _C 3"*їH*9Hගb}gyp/(bM{꽏!Ɏ}>H5C`6Ȍ@4\my~{bTuqx؈(#!'1G\ +>=f^{LyMx^|26ؘg" Me{Zt"NÛVoȸ ^?}1y퉌/)ah;z\(X<$QfUSGѻ2z<_'= #gb!V#Iy~wם˂㍺lqV `lC {bTDNmw!  ޼# ZHޙ()`H9Uu MӇ1d~ZA^ƆeCU~ѐ1*D߮Bע:Wl5jelC }B~{i(R ` W*.uNp5`QemO ؃Y>@jzrbǠM/TlYs[6[[z(Q)~ E /=b $ѐ1"lhq*:+X~/@^g 3Z9Rx"d7- K:a! BnR%mJ:Qk2#$7CFURh;h byɇ'%@S;yQc^lWu_+_QO. g Pp_K> 2ppg̯-Ic#/-}&16쐶uX%{b̉GknYҽu!#qA{46gB}܂u#QERcBc0pI (E/lE~8ƙb#*_D=#NN <֌% -:c]˞⼍bԜA Yk_)#SG4&aފeF"yja7r <b׏oyn$vkMGQszH#@^\pD%%#3%`SkH8R*JБ1vO&T^θb+ 'Q^ob? &гO@-Qu47^NӲr?7z_AjRns_evk4O'^*DߞۈDPܥ&mB^*VS".f> HgzQl&0ڨ! ɕk!~,-J"BEAIzǠ$gNؙ HQsy4cX1:6X"ƈ؇.90嘍xpt , zήGue@sYzÙpԀ` C&/=5& ׅNA,F^*"߮B׬bͶ!66sب,d_3{6WD"a T,M^о8NĖ$C3YoO34w|Ȫ‡e2!_zyRtc0<%3JV sJJD;q:nP\\1S]i׬eNYa$Tsj~ s> !/zfk=ET,qBa!-1,Ȧ9yiYE ׎ |DMZ$](o2< qCϢ\ޱ<DF~&ߞ֐^Mx*ErzCjFlM/|6q4j8^ȅJ[tV ̕ ~ 갞: s/)iuVʳfm_EBV`8v Q"R\P^vYMzB^_؇G B>''|;D9A/cRlv(},ب n!L@qU1>e_,āuÛzxsۺȂu{f`Nw;әMrn=gM5IHm$sduz7O}aˇ PU//ϱ2(1i!/SwMde:D؉kl{F諆OPrDk&H\ ChROynL Q֠G ,Fo QG3f'Oɬ'aa5{ٻ C>!.9 _Mv$ 9Eb{~!K uBT0޿,HS)i{ B@-`=O̿ע޿޿ܟ$IIy0?(I`@oiOVnku7LJQLFES k{+I#-O&ԇf. ,&G"ݥf 7&;<>\@mn>w׉hodǸlF%&nF暳~}Y$ Ҡ4J,=5՞wmꁱVPb͓ܖ"؀rhu-eE:iY˷;kR;d1JH8Y.YVIthŃϋ1սp-4~n"NEP8;~ۨWBlKP_(0p_^8 m=c f,u8-UCc\D(ҭ qiu:(MQ[%[ wS5P3NsB?|I;4΀⫄C& 6|:3әPL<8x\?}NT]Y@c{oR']EHfwתX;܍  yl uB,(NdL,0dt[@^;4uL)+石r7=ٿRSo/m3w)2NEbBcg$&18/.ϸBUwVRԟM2A@g"*ǥ1~ yJ anMI˦I@0o`+ 4窒 Dшc!)ӯ }1dț p6Å P_xM j.N##HQu Q88`(=q@ /cvb_b]5tՕ,^?fF L]scӞ~I~.606y"6b"$@cֲ!nWFqgoM9%TE][9;x@|"+JXLi&;PU0qab{g ,r-sPU ȟcxqv0$Z;>%bx>(qcAI0LEywݼfu'}筞gu_lnnܷ#y3hpv%A19",ٞP773I.b ?j=U0&O?4t^P᭩ҙS$dcǰE:y[Zɵ1<#'O51ޚ0uJ@)y,_DaܓB3{XcP{41G~~fpK(kVɉC{tBtm&H4`a5A(6v\|k5{6(buFYxBԅ< уLCek<;ѓc@ 5ݵ a:1jbE\ P:m5w3uJq{GS+d[7<0rW_g뫕f';{@9{lčC:eӍ^wIȀž@dlC}#٧Ď_"9@.ř"\\)}$ 8`Wox:D7tFZyMƲ+PNEݺ(,˴Q (mCo[84tk&"0{tMŢw`%%k ,+UO|%~VPq VzsqDd [&6w̠usBO̧FRi#67.5@R(ҁLw }pF-hB^gz_^EvɎ(o='u|'&!.dP6"زXؿ^Sc=X88QVč3 V(TK".[eШ ˜gcnkN1dnO qZfg ::2Y`ֳc#+AI_ꅐn('Ӳjp}]@'zUjs RÁ\j [>Rϸ\4<Mtr5-pjϲ@>D4onq[Jb>~%vec Nk\dIA4 @Aw?C+ ) Dif=s^= Rn6BVV p 0+0Zz՝~x{*@'\߁}p |GnK@J"I{!9p4)ʾ#7 $] *z0j{Pgʎ5\-3Sx-p39O^% ֶ Ojxy9rCZ'<`h"")8{#=i`fPDGM]ۃ0_GzB@` }q,6X6z%r),.b'_^df)gK Jx1Z_XjX!w}`IEM&L% $v@q8Jj*Hs?PuՒnk"G(7K5 dyج%1}Q:378qg[;o娭Wfo}cȀι6\T\Ⱥda3wMޱXAPAEJD Lb |wi}! =<# ]RU9)3<"_m_)!? / @~ֹ[*hlo4$f?Ǭfx%"v92PowY0Z;y<gwlN;@Pjt kLz5+:Q[ hCˌ>cJ&.$&ڧ=%m[8poP}L]ċN9l_wHO2KyDFEkpحZ6[s2EuPO+<25 BLHK.@'j|7"TБC8!vmף_q B()7_/}9Gh t-d5D/4#b¿?x w8WݴV6GK[["cwPBq =,XQXԵte)|K dpَTuՉeʦR9UI=,;>ΖLc@ugU%ug[s@g"jRg=BֱSx! ]zGPkW*:" e9o|n{j-XQs5J8RhFu3H]x Sq{ @+CW(R)ʒ{cXS)˚9 ng7fށ!Kc f E."hZ9J`CI- ęEIlw|wł4 Fx+2'킺*L )xVƈ@`#sܣXrhY/XB}滉>ƄF'yY9ShCC7BNΉ-y( ;@fPo7\c`e_&~[s@g" y,V-2aEb~c7G@oHp 1+s?/fB'8C@j3n#V5KR_Ȁ"/RrH&>@/x$"A$ #V k*G&*eIP v t͕izy=Vc4t|G@\h ;Nd}yPʰ'6Ge:,;h QֹCr؍l*KQ 0pcozˉ#N~X= `5\J?VZnpBXXJ szۃR Ҵ64x%d'@\X)}+ GPA0 ȼ0 +!8"K0̏3rӜQIq8+#_Ba x ςh{ m؇(ɪRf!0Z4vTnfNs65!ܾ)_8$]gOҎp`%</dEcְXIir2ql$7L'0pS 0~OHqLe_-hrvf]~c'䁣!A ".|O5Bz[dksk" ?f\Oi^Yum;뢔/H70J^wZ Ff9.HDYWk]YVOe]՞j7+[nYNWzM)|ww,:0O: iA4%˷`.pdځ98loxn|j tݸbU}U8:z0֩Kvږe3h V<e(~ zF'Eq$+AG?1CӮXġ%O76(`vo:=θ+d}Avks@'5rDsӪfզ+l)^Ż_н#h\+{H<$Ճp5lkKk!g[@7S՝%++fی{Hja^CiR qȨߚPD8h~GW "+S_8/F4ZoPX0S3)~ yä >UNI)24=^0nR@ĺsMR\vgQpbҾG}|,ά8W^"&;x?V;DmVu{bo=TXkq\i,7u"^9ֿ^Yd[dwT B#{s-,buDUU]c@4V9܃ K\9l ݞ`Lk{@x)M3-ԆUc!DtXk|<wx QFS54"6Y.8pn8lFwJ6M_} *zyӷ5>HM:;,fY[1R h'wOh̟ ;R'np!eB|:Pg7VĘ3rgPjS%2',*T_[P!9H>0"2QZKt_!;rVQfi`6%)3t8{c z+zN)פ0 Gз[B t_G[D\w!9DoĬtT۾tW?NNt.cFl Vh/ JÀ0P} ِy3!b'Jݻri#rYQE#m9l0̺|Iy]cP:G6uWT~JVDueuD("ۻxDbhv^bF)br|[voe՛F)#w?vK\e_[B00[̯k@G߀u?:W5=2}jȮ{-(aH@> 'd e̟\E-<=nC]z6tt%ה2 eRǙ ;Jifz>Wr^A w/jH}75zeWq[%{9yJRTђ(_x@EȬ\X/{zcLTU'`Y\8 ^KEuفD/K"s!-Naoj_Xw `_wYYFUn;.&.{54{ʀ~J=Snj &q-@I5GYg<b|@$LJ'Vk0+eYH"a1zA؇K /:`..8Ә3b:|WJ;p"z.f_1MGOguLvXj'Et5] ŠE7! D\d5;ōBuk;ϦT iV'7@TNTM~t<:oMNqH/mgsCNJg&$EQF.(Cq@ǽqFIA-sV8IE@35 `j<S1r}FTm5H~/¬hB^+FtZLD0u)ޭk^}dhxnɋ׌` brD7GR#_<q_r@Ro^YBhsSư!-8:rJӰ 冒 Z!ƖbIλ(4 upr촸3Y\'ˑd{*LzgM1i, I Q%E8'6a% O7P&j#x+ntipP@5ݤlj 7 ]Z0wq⬾+H6k%g"tB+jˁ/悘a% `ٸ@ tSʋƧg!&dt՞Gyi;@]7QE x3OWL9x)rS@k\*igL}ڴO4gR~]N,KCW'hKb)MAeU 1cpl$A&LƃRRxE^*I]Wm%'j8dUDAݍp'f)wp]2o[p(Q` Jhh-nwpkxXkl/1rL3Mr{;rv*T4o% 8WtRFD8}jcZ^ir3uxsUgq(aJ0W)K$|!;>nsU4aPlB17ZDB*uMHa{i(/ء+򻨖۱ &:"KFdD|!(pH d`̥Ej9VSJkwYYeЀH 2?G\{7$0\_Ю"n2yg =3 8`ƞŇ뫕 s89Bg<3ESm9ʤ3wlc ,1aO'wtd)#FYҭsMFVq؝W~!=\ X.ҌZ, "WŮ :OnY=!LhźlRj7^@{wGmyx5(Ã, g_0%P{ ҃O~}RkB)qtHr&@rEg~9 W R|XjTd/_W鏜܇^ÓRGBgN@ -i6&WYϘUwvJs#nR{TônJ+At-0 W7mB zW dznl b/y:g|1pVG۷ (1r-wci[9N5YC/R:Dx0pv!kB0xSĢL\WBx3ĈI0!kosɒr?Duyw&=3;6RIG'sᄛ_leBʸH (6_g*zf*('4v̹5 "M.zG?ׁWuI&͓fj2t\Z'6J@<%|bVq̌{Q|>Мq,N:<5V @sa.DarNlTs^k ٠].OܩX"K4dMڒ7 -i5k AL(fG۵8!N[Mv˗>RЕ6"姀t|Xs8l ,i&m_zęC{aKW0'1fڊZ Zjs@C `:H}!o]Px{/O? 4g^ 6&"qL}LʝA\Ikj:&/{HuB}] %ߺPUul1Œ")mM0Oͮ 7,&;4aBjI9 IN1ުk ";}W,*enM~nuw윹ԧj"GvkǠ,\__F_<)JI.b$"!UHu9T8kԴE/%: 1/}4J7$%De-[ -yQ:9mpTyxCBagqT* *DD0 ˿v9Oњ`[b*Pl9@ӦoD;|vӣQujjZB%ljF{GpK\6luRV[I> J7IJ'4#dDoc aSLX%?$ׁ R, u&`7zwC :}$Otwhꇌp2V+NʪTeE9'ՠX {_yQȌH򐒶7bkyO75!ՠNJ_ ϵH"x9 =f<8bŧU ?BOŤv;p;b-vb8Sb4imӖ9gss;^Dܭ'"] k7_GQ.ߜy7i>Rzω R.z'Q3= >cWT3m5<Ҧ7xR8$oB2ᕳ|\%z(9!w.U>"qQsDeͳBv o* DmI.5THqB|@5z;,yJ-C-VBL@z9Ha|[OYx ڗAZKQMZ*z~Ag0 cz? ?5$y*~OQr5a4v8C}ΈY-Y"MC7b";g,KᮦMɷۓa=&zUZ<Oz-˗=0\>w;J[wOn^lCN(ҡ↷r#_a7I}@h$fmZZB{6$oQdXw 麗GGzbaṭOXB9=f.և6bf ?`]>7Z/VE"O|鰽)Ȣ4:e@@ +ɴӆWiHmySatj*$Z] 'V/ֺP> K3㯡J.\): O)ea8bfX9Wɷ![dibnN_T-By--#Y^%9+ \H20!@P//]/Ё,`,jɈkQ:jT=e!PSKy?4 gU9I?$ &0. n90e*a FTY&J"5!̏KicTqZ|G ܹeUCDhM cknuABɎdN$7@ xr‘n8[ ]\X3җ!5 &.2sdX]QWd<3ԿICCHmd腿29W:*0Ų !dc˺yK HHq1l|[$RwXqX-l|i!Ä1+IhיEqxw0NlݤJ eMwr3^&2%\i lEdQESyrSךH,E?0ImDS xC8hû)Jrg.X1}$Ҭ3%dc1W5hU*D?XLlٷ^0W nTLd0/N@OrFbL"+_] 4UQQ0n>"DzI ɐ:O Qv̲;g~xX9c<H[d%g;˹#*6 b[=^Opߒ4LmR0A!> d%Tb UVm3tkc^MGB6րY +ÙR'D) Dac/sb@Kw'nK)<ǔМHk'vr[(Z;}囱p&ǠբQm0.d:z'᱅9 q ]:l|唍~HА `䬜}U/U6H!LyXK8v*;H O<5KU*/nT>ӂ\JPFIl>X- /A]en(JyHJ^zGx_ugPHosCVn9F"sH]z 0xm_$:`M Ve ު4",Iag5U]! ʂB='v~!]f[&ࡣ.ry Q"b_#ūuyXIpad^;:u]ѫ#m94֜5V"si_b Jeag~PfHh'W*/Պ:V\hggE؈^XiwQ:wͅd"fz5-sgʲ(@mwIYS9n`#PdX/P\M`MA;Feħ/焃\R"]Y! ceoĨn\IٗX8$\x v "Sq\oXWthg!? C*<0q_HEauO+) ϖ4Qn +%*jm$Y?$c^fFy#Grɩ×trJ4Ec;F FcU/43j); $dC$ %G}~$Q}~&e>sK6rF m4 xg, *t|O\U o{0*$[$ijfPO8蛊PJ?q;)fܧ sL;&G_``^wnI[^qYE]}ކ*262hdÀ'{𿳤cOΈJSCt̪zr 3X&jΧ@j6~ BVNk_L"1-px n^[,>\)s+Q6kהfR|R @c (G`)$* D{Dz8DK7v GƎ3|.Ֆ9_K%Ww$iklVi93É畹.`qi;L En *:<.yV'*'l'?e []ՏwOd`>;% 9KNs3Bd̎ V@:.+i7a[sT;~}q벘 x7C =- u 5o˲sTfS1ᖱ.kAE'y:3VnBSe@5M?whN؋;1>5JX a.XE ,N) 'Ě;'*Xo/VDžR fUBPEC'ޱ)T5l Cug\q(%  G샚y $@ ZM1YbU$#:q& AyVwl a^GiC,Gaw咟(3.җۨ81zDH9籬@B3 ]3cz1{paܰJXf[ W^ 'r-.SͦTO{8 hMD- a{8  eFǡt*QS8vP.!iJ쌄@%@[ ^h_>jJ!QJ1}-]ON^&(x߀8qcs8vWXwQmp11.)ZXNäXץ;n{ :R\c4 ]jӠlq0 8ˣӫ7Ɓқ QBs39Q%ܶkp8%sa8 S+hLCLW!dOZKgu!*6|*FsAY>x&:qX#Ƴh;1dBk~6^?>@~aqdNPB݀FĂ4A=3G)y疸<\ΫB=9  h^q)#2BY#_&0!9C 9Lbԉ;)mY$.ǪЭ鞁הJۦT)#b|m5Iz0| &-zhiRh"ja^ "\C@Tzƴ; <<=zȆvtk:graMvM*n^Iv7ncV!D[dCq+pUJ8+oSԊO`7=p XY1ym$Ͱ#qs. *:I)"hR/%1AɈs*JpcYu{qcc[N cSGb#c=@#< 7U|I.,Ų@^ɸǀ"%nn^愲$Q)"#7go T!]SC.H!˴8G$7GK{–Itp?ʝz ^#߇e 6h|U5/nVVK}vѓ$=Y*V0-,,s:zv[509Э00#k}QdJؚ#V|D"2P׶'~fE#FSu0 ~ _uF_tهXu ℯThܴ.ƞS#zAY>^@ܱ-}YQΆ%֖t  F Vx4N 1hѣHB$91I:_yWr5V}13Y&9\9"aMXڞH03ׇk|&oS` iD#|ۥ+| ьf8eNۤ!ǁ?A8 " k u;$eWCKB(T:b-F^*C t뜽:>@nmѾărsXcS}ˉ(=R1%V bډDд9Q$F"[:¢?X*- rXYE$'QO|p${W>}⇿ay 2IV6fAC-? Q[G܋-R#R 8"-H"iWc ~]8[3Ioג,ʹlښlPG@"+ET _CS/ׄI~B$mr"]nuPxƛ *@F(D 8U߮tcN\S6P/6 NcÓ_.ҎMm@8^eA, X_*e4Ę66̯2Ms [qSkm,a%|zߺcXjjǡ?K\fI?@#6{x̓m1M W#㊁dHǤaB KR4in ңMպD\A(A~{}}el2*7ےެ^9\:-nպI k\HE<Lo5'yl~K'^NOܛƨa ʰ'@zCdž\A|> JaXޒ!?GաHG6 P"'*30Fg^iH!w.|g6GbQsT /]ulI:t@.x ahN|0mwCN}.(l9?@#!ע=$B~=rrHr@Zԫ:0'Aw%͆)8#ь-J;h~hl|TPIVvj` yIG$+LVrz6XaI250W):PQT%W]cC?,>1xQ؊q_=d-Z"!\G_1X0-T+;֪6,ڌmkĊ3dveL D=Υ|}N 6jUTNG3\B[$4^W(M~FjBP 0&2o񬸖 W5o 3ˀ-opmKhew=k̄K|Fd8#T (`&ǘ} }h. mF#D`jIJy&)z=Zy AXe+_ol Uh@19+mT!`'_#Zy'"Ua< 3"cɱbWYd+:!RXœonW胢?u%=l 3),S"8V˾7F$lOz7~ 8>$:"^@ )?.sB{ ŏn1)dDlRec <i,I9b2=:x0ru:. S)JL/X1XD>粸Xa CM_S*Ӧ:0U`k@ǴNMY=D5}U- 5lF+h؉ Or$}KO448kvbWA4NFq]>^ rOސy#eDf,lG;XiJV d_+`1WJMX!%mX\f4͵$3mH* <?BS|@? ub>5(U)o ,J3RD*}lgΙr0)Ȭi#VLNeE(zJDKl޻$5":  hgH"ObF[7(L qYdlj#ϗzmaB(xeqѿ}%Qv>?a=K-tfJ;=;I-3 ׀<729d B9HoOLO+~2#Š#U&`|8\MӬ~ V'u#&<ehp)lHz'qdzᵑ!%`V![ #r ?q.RR٨U{-"%uAѠllEu4M~a_p`>sLU//&2,.S4W^܉޼ e=d$ig%vK =פ_GuQ^TQdq*E 2O,}B}Z)Q`=~4 f[#7jY2m}#m/c8ܿq;L7\n V"D] fRG( j,_4( t OIWO6AuXBY%GR:~k>1l@A3.7MIS'u0v ciE JU,Vc߂uz+BytDZA\d'؍gaő5̸ 1!BDGlI2sb#h1ϔ- },rV\QI'bY-|,DPYNV>d]6vP`c(UEbC_SZq~3.c:&m H_b_.lϗ+ XߪE$7qms~*/A,ƨsA@HrH!!E 2, ?@m<>@6[iu ƩT7NQA _Er}ibᱥ3[*B4P% Kp?/zҥI1Uv O"{ Nߞ&#P`sԲ/ B10rWp 6?4Һk܀~Tȱ,]PP鴷+qv71 0~)]ʅwRh0p;W"B?yuVCM@s^V6/:`h60]ZOU0k| BİLd3nGgD6< F  X!~_"1H7AMQ `kE6m%&̆\(tX̘ok+ m-!r Е$AZ ĊH|LZG21$+M(o^j..3(Ƌ13{# eD)#V5Z⤢,5W"drG\ 7T$Qfj5,|⺷DW3>7kd /YStJW5g*rd%jUddHT%>AV ā](1W{DΗi_ h୬nBp>IEQ9MD$5<;}8~bgRPmo/^5 3[qo􋳡]/Cc#6&WyK$S>(S L, (vM! B-0@'?j l>Y4}^;;@r-)uyX ,P`6 @@sӗo\ 9Gp8JPV1ߵ {S?\s|{q8lXiwf>A¶6*ߎQf,u[g& ;HxbJs#$.3C'Abŕxgn.].91+!,2FfhULm+UpNj  -@*_A |!xAq@4d@0Wx%@ťh3y@d¦M+CL)dkQ_D XAT|q*]u6 ifK]qlHF760KX(%^v7K xZVZ[j^K)v$b(%޻!9@ev9lRnCպgaOt`"XތQ%Ѧ]{E>H$7FMPMWD|ka&B[4PtL}8`['DnRfkroTYd% M`wNz&$QLn6jT*DDa\괔OX.ԆGm|Ү 9A >A[6g~΍ VT+@$ܧǛLcFHc9)(!,j=ݥ^5%O7W./̮t[ hh^|HeM\Y1:EGW9:wqQwkg+9>0_[sL-Fd𔵈llZ^_U,1/A@&\X~DڵP_Hr%:uN-0aҦ6٘MOV] 4XGYaCY'2DJ@E -*&DOg_LM֭{7M\(D`= 'nK]|Ŗܟ,C iwcTQI4C;ϸaQ*p?PuNoj[X|" j3 u"a'U nu[ ]jTZWOxJ~y|J-k7ڎN"KdyOv rrṀCar0UA'mnbk*)uʼnIpB2Bl*xs$D8[`j",-|O~`\b~+s #^xXm}7ekj_ܹs؆iKmEB#`Y 4h:}$}"Z'Ӥ:Y 7W>ThٓsnP6 |^P⬻TR8q.v0ޏ'Bh~%Y#!\:!cPղ>q;M{H|gV\y5[Eko@AJ FC1闅YOU`}}%̀ͽl<5&U*bWp~TPdjDo p;k}7H6̥|=" 3ڒߴipTGNwϺ|t)n 2ڀ:* !۳eQ씶%0D* IXp\J+H $*W n2uA-LUɍ܄c tۥ~Hݗp HT4A%(wO=\[J|# kP"Oo6ń18k8$$\=HUGRT,̵ QmiVwp@a"zϻ"Xq(ug"O0|Svt QCᢉ_,s<+۰_ B6f== ~__eaK !4ـT?V/3dD9u.Y~_̄qp2Eq/wBVk1˂j.z7mǛڍ)Twߴ?;A%~ lnp]GџBcsk&ȊG4 X7e%5we*o\QDpboolX|L˨O c%D:[5FJL@:og/JFMė[ o,,v-M#֖+a40Whκ"ͬa90-IE}TrE)*ciP(ۍCS c ]D2ɕbМQ_\q3`q0C jZ:R=H;X?0!A0wMz":pHc@J3Gkm*f V #AlϢD(@RGY\ e:k$Ɇk|B;g-#l0kZ41sXa#qs eFIׁsycxYn;ĘI IDQaqYv(E0LZ!8..`kXI 1򐸃2ۿK[ $RH8}'H~Y4}[syFomJ D y K5 H `K;ڔ؆w;m#]b|rpTN.^+׀Q@[h3R0 hcw#\r/508t:?xOyP4!jԷYxnO EIp~YvL0PKwL\s22Flimit-login-attempts-reloaded/assets/css/images/onboarding-bg-min.webpnu[RIFF*WEBPVP8X  ALPHW@&m56""\Զm]lY#bmYp 4\=᪶m+F0`ym6!@""5Og}???:ɯ?}???Gzo6??u#??%ש??O_g>?gOmoVP8 * >@K&t inVO}%3{zB-ߌz?IߧP^>o={=7u^;ؿ`~UןEeM~>.Cb/T6"Gcb/T6"*."GcE CTb"Gcb/T6"Gcb/EQF^ 午AQX؋午AQX؋午AQX؋(`3!',~4[k>lTE57,,Coq*K# [~^_*@iJ+GGd<522֑*?x,F!n Xw_ț X^˹֘1 /Vvh\$lFG(FeqloqC^`4k؝cb/T6"Gcb/X+2dtd&l|U{Amo:~Mu7teJD]S{AQYX+^0AIԩ߈*?x*?x-={hr/R.,lZn%+zN IA_"VI5Z2i,x*?xE$lE 0CKF#dWs0k 2dH'ثQ^1Ln uG_G>?HQS{MF^_^`͌OAQX؋午AR"`F^l .8~Qno" YqG$,嗤 H91|Bu8=*{ u7YoN >$}Q}@6l3$,^'et6%Qڃ9L'ccClEdkІoqoח,v͈*J|͍ INРVe@ї >yxlAQ\sd9՛7^Z@ uQ0`=%3˽WT~auFZSʮF^ ,,d7%9VrCM#v~U%seA}(~?F^_F午*M"G$؂R.FVXC9k_љ6ſxj. K7:xcCw,Z?(IJRMF!]M"M%CO6lӜǟ7]Mb9ΩS{3C=VW䨯c!{/=YTW!Aȁ%҉;} $[M؂#/XxsT6.wFZlE q*?' ;G3ĩdBBil2 AX%-b *~V`i^egQo]Mg.a@ceGlyer/TÊA5#x͈+ uZ46~ ?nPlARD:6і#e+s/T6# "W"[J,ʷS{\\}]*,yAuoCL Lld -&`7f Щz~۪;FGJ24]ySgmD:6 &oq١T\nR3OE ^ ,lE ʷ^-nL&,[^0Cy gw;KUG$$uK/IH E Gcu˪ *?EOl uVQ6 u7a+@`SVN-".)E + %U}' zъ |<ٱGynerVF ^ ,vC yxf TP`(ׇFu7r$p⭡/TV3w/gR#tkE{s*ZlEB#&x04b/ RBV1V^_9W#b/TZX؋H؋#0W28\j蜫u7p卑eW9,lFZ '; -N" Xn*Q_+;ad_#۫~֝ #ʷS{AXܴenxG=[U+Շ#a;t76#~"Gs؉`F^5 (+! 61X$˫>^،{C'b?pT! +CjoqFؗ9x,*oqU#2ї1m 2tC : F$iy1~;lIԛ?qoqH#9 /W8!O?Tzdi2Bg\ T:RmAkx_,cb/T6"H,cu؂70}l6>]ONsvDq*?{In"^̃?e<96gK0 f"6$_T6?}M"؂L\AQb<^[T: /q?4 e!z@午A]~_ņ$k5sfT72.,B#|Ĺ%>$*?!ᮦᮦx/T;/rѨ-x)q?[/TO]ʨ ɓUH#I^Wde.#:縣xl~E ?z^`;E ^ ,lE O*?`*?xY9nޖWb  h1i;QyLi@ gz yq%KxEE !@^ - {rDs0YyY.lD:^ iaS午εW#b/TK*Qtly%ϣOtnt''wg!ETk6"^gaT8؜έWy+q9؋̫lA'Ade午H.o7yMՐTN*D u:FQ&v lWm=dSxk)zطܴe]{AQX؋午D:6 +,*oq*?¦xӛE ՙ+|K~S/Yg#E:C!Sփ{{&OFx~KRCF#,lE3iAQ~U *Ad AQXط/  6%i؏*Á*U^F_DTC]N̈́ef7F{ӛ&NyxxUri^ ,lE ſv۩yN6"!QZJp }{sg]Icks nKboq*?fǩy §ު,]M%1eFđ"_S{c \׷S{AQX؋FQXVS{D:6!X}y2o !G>2E62gbPYۃ3W6&W,K0lA;,Yx rimⷺ|4[yj]ҭώi: Q FM"Wo$<5aт{˾oqU7C:*?xmAR %պ& ם1?Loؒb*G`l ׶ ;&INCb +qa*s4Ұ \M^zŸ_H~H멽^ -9E~ i_{e;E &=DEz*Hb«R*p[vu6"* g{S{AQ}^V(#A⸉lI9~ r,s<>M߼5/|3"+q2+|xV!/^ 7DH\;O h>erm ؕ[>-Txun. &=YyXk#I^ ,lE Y. T7^i#b/UvSMGcb/S SbL$6:,m;=ʔ'An2午AQr*B\ÅxE* h cb5S Db ۪yW\#^^` &mtlAQXًV(exk.İ 3+!Y?37wLV 0u>VР+CҾ,\ RRiedU "WlE TlARp)edeU0l&^zF揄y^ ,lEKoq*?T?6'0]Z2$?p$u7p;#uyY5/EcV/ߞ]M) @X/ZX؋H؋oqF*^#WS{AR %պOL;!{0WIG?u7\l{k(p޸x|,=$ԂqF^ ăxT+x#2T"T6"H2./_"~UBu0zlj.ǹuĩYӖpkzNfT.5uPH`:W)xs<Ѵ4: &MM"Gcf`!5M[p]卙^ V{+ɽ^/O7ur=%W,v:zxkLbBwfQ q x*?2M%?]պ|Tr6"Gcb7S{S{Uk_|AR?+ah ;=\lUSVMîD߻q;{FjKXj wNDH*oq-,FZ!OxL޴qcb/T6"GcdWo6&$I.˗mUi?%( gÈ*Bm^ x'b W _DTpHU0!7lAQX~]*h˗/P1*?x*JqNaQXXwLadT>ٝ P4;EZ/:" ~̢M"f%R&[_2H午\AR H]M^EPP*?sFuzTؿʾ]K"_Zv"cSL0{RT M3WJ'mWJ\u7RHG ,$]z['S{ &xu7 ][^ -$%n" SHd*+.rC _.[E;^؋d&7?`D: E~eSiטXYtJb:0]ven:2~`;,Fk]ŎeaYu0k^ )ǾlAQX؋0={//X؋(̫6U5`K/Il@dyx^IIlTHu-/ьA3v;t &O5epw|.FNz4ǫX}1GcbS{ѯ0*?z/edFİ؂k.+LMF!|t`{+n2` #}4QXsTr: ^㽈G+𢰒ĵ蝽fL4lN._%=\@!L"ϩe*F_JU+rGp:[Ɔ،!]M"Gcb1V?FaA.j֒HFu,شF%-aUJ ?w/0Aɑ29!e/+/19nQq:K;X |Z pUkbB{KqIR'"VI2午ASH{jރ4:RMhn@&xh\dKѝTa$%A"i"/c L:}ƓAXr(b/"` ]L4:(،IGzjC0؄㹐Db '4> F ,lK gz#bU~& &\V $eW$9u;S")2zALi\A؋SM"lAQX؋午AX,qITx*Q7Cdfu82SED`:Do,I*d?đ hsDBqZ]<1Zc+5@es2j/Os *?\E&ZVoq*?x+288)ǩ^ ,lEoq>/+Xa" L`ண@ VTld t@ .r}Rn'3w`,9_ u73GݖPTpFȗ}؂=&z.x&X>yXh: Nv%-0rehp^.=3K{kb7DTS{-Nb#N6" lE Ә^ ,lRĐTm8̬#b7S{1OO!ɉ`@5{rn@`z䆶٥۫VA] ?ud~;r[/TIS{oqCzvT^oqLSdEM^M(@i\R*Mh+^ '{ 3ltdƓA;ZD'tԓGf60 Ʋw4*Fr̬?Por S{AQXٗW* ^0卒XM2u8IQun6H]nucC=`d7)4帤T]\E5dM Ne\*2#"eHiw]יF j0L6n\ub{aS"TZlE z7ChbAJ嗙+3*ݖPTJً 1=3ZHj7Ҷ GD/yoPRxTҴG-ypuz;'fI} sgP('?'F^h2BM*b/TÈAQX؋06"Gl8amMf |NU,6e]=y:ʚuWTMn~tXK!]l(>H&ƫ֎j3> 7TΚeu72cE8$*/|, /午AQX؋O//Xؖh#ėq,+*|AQsQX؋単9nÿwp+ndڣ2{/Vlz(2kH 74_I.f&*O`/H@]8S&}qlVoqNQ'i oM~:/u7׷S{oqH!7>YȺ/4TO#TVe_*?+_(#YX"P唉7U!^I7snm6{rWzºJ7;-;Q)jJ9pziVr]y7Gc~ESHZ F{AQXؖ7H؋#unCbgTuVMC7 \L_Quy7S{D:9t\ot!8첛5Hz ][y۲!ѱGcf/B6 ߧS{.rvYJ+iơFgKbx3BFb&aI!7qF^ VGzuX؋.`QX؋ qi^ ޽ȩ%D|x[yqr_//X؋%+|'| _ |;b(5k+ X@H4uP-@[a\2W#bXT/T8؋午AQst*6"VF^`kψ*?1|]EUlA_rFA_*>[Yu 4cA_:',v,Ak9YJ޽tM" G+ İ^"zs~t۪y/T-ZyOqju7!˨^{pƖ)5ֵJB^EGRG>r(CVoq(Z`nrDWl7OE%^ ,lE ۩^F۪yo:/X؋}/T6"8G_ٳ,N(IjmHZ>oCxaw2U[؋P,lE _E0oq*?nA2_ Ţ ab7T6"`uV17A[K*8ZE&W^՞cF%:tČcba\AQX؋Yy揄Pediq22M"Gcb/+3Z$/ G7M8dy)ÎٱtH^t [1X#bpn7[Voq*?x2 6ʷSСXؖQMê*qJ#Uj-Tȗe֊t8@2X؏157έFTqZ@mFƈC>6oq*?x#//;y`_"|nBR|urD\ )V_:'uf ̝_AI~ rx7Cb ?qH ]M47~!Ԟb ^ 9,lE$lKO~"Y.Gl?F^{OE TkX%cnPu7'7$)WoZB'l̀72P72V- *0@W§%}R*?{I!3ZV7^M]M"؃+`j9*]EպG!#&f`||d'@L5_@ W>ђ6#`S| hױNf,9u:F^_2 I uQ6]奔na?q*Ad^rVLc,P˹Fa9iN!r M$vL؃ӛE㶅~b/ѧ]\VW|{Y*?x+#55M 9c81"amܫX$ %ϣ!8+)utf Iw@/TvHPU*m9aeǫrnI:6Ӣ午^0Y~s~/XmyHflc E q_2'*^˝_4$J*j|ЀLu4ZMݴeJ坶o['Pnq2 5ىl~/T6"m4Xsi#b078,*o5vZ2 u?ʼiB4zPq$XVo\PU8* c +6 -0p7*?`+H{u7Hؖ8z/iq>,AQX؋CQ~U^ -Ucʑl^in(BiL͝aW*bu7Z bj>'#T ,^F^ "5e΍FMdjZDOks.Ŵ&3]wS{拫u88+uN٫ËYAXCH؋$O,ѱT>y}M"߼?VV첏ދsj0rPpJB7ʷ[ 6' v/p ^FHؘlcbXYeݽ-/J-G;-|'(b Y4 E [즦xS>ãr& hUXv_5/YqGcv0ġѱ$efC~y47}䇆'oJ7U0:xD`=oYFE 'rߜJM"ln!#;AQsQXADz~'WgQZce2DCG:#-٬9cA>\]N,l!?t tFFKxXv*"k0 %Y u7Y$OE|#b/bFVd7mr񳕊Ird-As^a16{"vhׇŋ[AQX؋卉*FWTySi׳(f E -xK nD + eĀ%i ^T@^X~ u7-F [| ^`xјO5z 5VoF YqH.@U]i`K-j:۰IlXz/W.) NbmЂ7Drnj?[6S"$ꃛE#v$׬*!ѱHN^ *N̈́fBi`kό,|`H'!AU P'Gו @:#p<zN(a{^ YSuvh[oMbvdu~<9*W5FMaW:2Hx~-RFİ8"`^ jYAQ7U"_@1Si#q^ xiqI Fl\"}!V24*6"Gcb/TeN.M=Ł$ߗ,l`Z9n6bs55]w`*ue/b>^VZ|{ι"Gcb/*Q_+ƕ6E͐~'`T#j첆^/Tl؃+2aCb l؂'PB}˯Ir#|{C]N+8xu7H؋(0o"Ye$Vx%uK Ȍ~|FK/s#IАXbEaM2iQ6AZ~ζ 8墳^7b~}R 8F\!x\!*?`*?z6"exԲ~~KB?*@!|S׷Zw%4d!"B%ȐynW#f/,lK %פꃴo7 #e;^_6 ,lK E +̇01 #Od6#j/i:߾7~oAZ"6 -E ׻-njoh)]qi(/T#b ^ ,n{`/VÌC{m eRd޲ l@Jp$!(wjZu7GE0mU ՁH /Vex+#/6E~ 'i%넊ᷳ^,Ċ'#`S{1:h*6"4`xkwx2 AQ[//X،hZ3!-n(Q\ K1 ׻=h̄~(*坾qXN7+pt {7oOm-午\AQX{u7،|DQʖ?d8?q,*7 `'y'cb/T6"GVt$ a$QI"HQFa 5Ve&6"pG[CVoq]֋0午AQ~U,̂~/2uCxGw&߾ !y 24"2<׌;dX؋$cgW-ɏ2/`〨9,l~E ۩yW Y嗘EвʥN.iY\ט*׿ X`lFZ呟ahH+Ve.Ջe*@">dwHӍAQX؋午aS~I7 5\=8Qu5nxTuncCwWJthS卽!3AkglDJf լS9sAQX؋午D:6"i,7_ r 9ݎˆE!ѱVF@ D}jfTĐ-=z@Ӎ3+=W`} F۩^0T6"GcbXTeG̅%d,Բ˱4 ^bwa$OK4 E;KUa{;d$΍-1qCF]Y8]ޢU GJ+Gcb/T6"VIA\9pc$ka^08q)*slHv7_~9 qB9 ) :x@ 5k6"H #^_*?x#//X؋H؋e?'7Z45?iT?lF,w ETla{/04iCQ2љ22ӳiأxvb/efA?q*?xoqosHA۹WSDn .!Et?HbQ5IW6 (tjo0#eվeWN:m^gQn@~^_6"Gcb/TTlAXu7ܗ9"sM+}Z<+F`@05FLUbHb^ ʫyXm|c圐-;x*?¦x+4ӽSaC7^2(-|2H#? 8؋ #B|(TZ/gmӱboܺ!:SG<îM"Gcb/TTTk ?I4/#1ŗZwG4!-[b PjݾS{r2p#G=onGcuGcb/TߕnAe᮪9;}`2y'G"G +2olW 単 \'Pp;B~/ F^ ,lE!ѱ`F^`E Apɻ,eƋ^0'+c0C=Z\i!~ZZH|u7%87v'$RjőM{Gcb/T6"GcbXT/T̄"R*A~s 'Vf +3 yZl-(d ϖkU^pdGp7*?x*?ʷS{ARSS]M -Uv4uNϜץx )טh%NU,eY&opDaI/Kv\Hw(u |-DcDF午AQX؋[^ ̃ f*jdcs$[oun5_e eZuZ3xx&z1JōBr񅨜'3i5$oq*?x,F.W_*Q`CI ign l?i lZb8k{?}Tkח1rKX\ 'i7Y+"Gcb/T6"VF^br~ !@ !-ۥ@.?} x26m#1kAU(,Du7q#e7^M^M"Gcb/ededS{׿,Z2/,2]{9[0[wn+j׸ xH;A E xdH'#`'"Gcb/T6"Gd<5eGcug/-$\e%l؈N$^h$^]."GccF >*W0&)ڃeduZ2ٱM"_TGcb/T6"Gcb2#uH,:<q5&)=,lNgVot fG(C-,*ot6 1sR %Ib午AQX؋׷Wϒ$-6BiАYugDIZ9$4f]eD?qm##eb/h},ZaNZ/ZX؋午AQX؋午\AQ~bk̙7lap-oYC*3qYc; 8،!ZTqZ7S{xIXgFջṼe_պE ^ -99o/vO0@.RI1>|-3<9rpa{~6"Q]..Sg\64GUb.lr/"r:6!8^_*?x*?edS{S{o봐`|mNѻ[ "qFaGcb/i0 a ,ŕ64~+Y yY{cb/T6"Gcb/Ve2H؋pD\nA~ckQ BlLdҿm7n8]OlӍ<~Y)[ce_*?x*?xlATG0V//L]FJS|RJچKDl.x |*m,>*?zH,`*?@^ ,lE ^ ,lE!ѱVF^`j9!}ۆDݝR4{UZA cY |W`=~+ep"Gcb0 u8l5Z2."؂*?x27]eyve_q[2y^Vy_``XF午M>嶀.`"!Ie1y:$tlh 6rl|}RJ Y"? V#xVB)"l4"퍄3ɸ;1G7hl7:LNRKQ'OEV0&B=W /=ѯ^TAsnI6oG$f0p?y.!76 J^`@Fv mmh \E{,N2jZbkfe[4}UT{Q`g{T"Fic, 5i TFlqdc(^̠ȽF@5}6f3و0HyK'gz\~|ݔ>] j4l#8$B3CZ|!0jd.Г> ڣI x"2ѷp{{|XTuPnrRuj(X̖q_V >bx-D+3&^5g@t"E%'p@2['fjY uD@7Px(fJG]S-zcleQTPPHT0hkG5!H1GdS``E1 *TKk} qϯO ruDr莞'"b!ZmI™,$E$r|ZR V8 LSNHD; )|y@S Ƶ fkJN25fH[?4ɉj_$nz-@Q6R!R.9ѺGt&V"O ~8KC: ,Q6v 频S?S~HYxazxT[+gj>AuAm~{V<]8ZIukKٓ)BI /Y9{C $ t~۬VҶ '?;$1rSؼ)c:DzEz.}5nW, W$@[ T *]SuÖngkKU:PZҴYQAmi3v_/),lgiCݘO(5@  T$B>6RA.ı8/ pwau?x/4pI< ESQkcLuI۲: ߮W i }t!lPc| reCPG@c9^bNGdQ`IȂN/H3?Hǿp YzS3FoP,e=nN~/(b>Q 8`,W8!2:&pB(ߺSdO[[,m WZ_E#{hՕ5#ZWCl [fihyV~ppKR{qKנv΀vwm(eMH=o+*W{c+Џu2 q My@D 2%d"3k>䋿42jiZ'߼k8@ՂTfkFhUIqt,lmWCliJ7m(%]!#;ُ$B&6gԯ!_J}5UܡT>7YwfgWЄXՕ➅( kVs5IEJX4fZ{*-DV3^." (@t\ ȞC7rzC$r!Pzm6(Lsq+jٖ#1X6+-7/VttmZ(q>mn2Kq;9/uȐ=nN:';;*rТٚu0;X\z62ti# b<!HNʬs.eRY 5䮀Θ$(9/u4+Sc4R<%OeXdy _(#P@!'D9 De(>Rg"="X$..iX TGJ~ٹ= x͸QEݱH5p [/K^6~(w˜0y' ZYbL*jn3i;,5-^0=v̆6# 5}1hծQK5@$A]eSfW&qTo.sj'nn)j@'IMxg5kCV>گaB@ȍ'`Bv$'vnW ;/׹!(jY:3ۍ}PLUAGA_Y|";I+1Ƙ;WBjJp$15>?j#c'dw*&ʅphln+{􏻎b}dD7y,3ɦ0\oCIS->7F )#fG R'&"iy{wZV*f¹)xe$i:e c \`Ƞ9,edDfwfPj (: =6e#Ê?f|Xaŏw+8$v؜#\^6A[˳(U\C+H@C**cy.dķ/ >3kҖ{9kzL/uQ?~}bD]a.ߧ^.<[KBe`3RR%'NNb9dtq/!9 OW }GcCu{ec;G,K%uz9ѧu]e!d]1]>rBSHv`&J_jQ>BiI nvggG)5,8ܸJv8_t jv.[)ogr^6#DŽ|X%b'!U Cgx -=/.:U$A7$IJpGu{\+ NT0#c~_J%Dv㞳AyO\>dJz??r2BDXTcK꿯ꍾ٢O4Mc$F~ Ә*7f }PuG%s`pՌ( ̀[Iܑ[W(.jw^Hh9 *vzPs햱txf%K{"2{?21},9@2pD,;17r^|&f$YC!`@=68uxH($!&o2ߍ#M<.PwcPvǩO8n#I[d.ڛ1Dک.%b66DrpVc;2nV~^={;H\];w9&Ð!i@s+xJ˞;՗Km`[FwuiӞОR*ZȜS$EZ6'(+z<1Pi%V?܈g4H.0 -{U|iN6{c(*9Lk$1 %b_~Mbswt`\lM\P^/6_/JT&>Crt~& p7[?4V=~9DkFJ4g30J~5*]XK>i2*AɇكOdpƵKR3"-^mbPwV]K(G(pi`(g%Вzv |M&FRt6k72<é-m!@];#CSmh#\(}g aT!W?Log1neH5ƹnrq0ا)<8o(ۂ8ۄО8g7'*JGRaCuQ հ$"8DaE"~1;#MLxer<[3pN&i݋LMC Ц|T֏sx&^~ @`dZgo_\q<)@T;pjA4,6=:0-!؊7` םæ)sRS@tV!]L*1fai7a[yL :tӹ Xrhqb*urACsza 0t:lHRM 7 73hu)C`)kzsNiU3ކo7,(\K(rllsGtdȉK*7bgA|^#cqrQ?:X,E\H\ mjIF¿(e:hT[TYOSNk\D?#= f#~z@ yגKɜd[o[K350Ұv>Q6!2Ax=Z9eP%/ ]2 =yp|N*JRPmeuzP{]MWZ4T=Q)TnٸY9M/ص v@UY3]֖R(  F&͐I%=e'6ޮv&&[ZkOq/JNh\MtrZı;`q͵HF/6auNzS0rׁ7-AsZ⯐].ѴĈ:<ҔEydέl`Y7A'_tjs7b])*Nqs'A51,70w2 l2H( ptnRtlTL6z)'l? Q76oxZM >%ԩav 6BǬ"%!h 1a+ ѐ ;U T(f~@(Y|-̎‰/q$.lq3k0ƄHɏKGGjO)[l=ػH0H(ruF՘ F@K{z4ٌUcwE`m'SNk*3v)aNC&uc٧ƏXzل;}Y:0v,'@"ޜFXX<άO/]!:agѧk̂&L,4+ww1yH@jtQ~h1ZW`3Sʞ- `R!|@@B#avb{\İQ Mu̾oW:dĥ V7u2p4XC ңMt\<^p(wtO9Bqֈ߶rdBZT/xlՠ6DL|as\%MWY2^\ד6FdƔ*.b !Fk%)fǎ'TH"vdc0'w.R?"ymj/bDpŸn mʼ.x.i #?G0ۯ=`QP>*)ErbaR PtU#g78#Hȧz$eK~i4`r"`tn^`d7K_9E7ZzVUy -L4 .XrΚ\W@̓G7ӚMu@y+IQzv)' 29ggc'IJ_k7@h 0O?x-I_%?T0(Zڿtu^1jj!>J4A}G \- F2;nRI f}"5cq)BIٌDʉqIފvBH`wzm OkXh|BSoV6lH?S3vTMa1`q] {όqh+gip%u%+k]S= &^sh"/ ۻϷCu lpAGw"| Ւ4C3UPGg'\'\:SU;Õj Q q $a@+ r[D.(|H~` RWm<(})И%%]^C vJyDxSe hBraJ=oG$h($n[5pH\!B0%2=Q٢w\rcXS'VId%5D4E"oiN OٹouGAVYPK Y$w7lM/=gO&h9ÈesQ%n7_Yb? 9ߑ #?GkvB=ET|ց =_=9>3dHjj@0u27?8.žsmB[xk!2V<'F𬛓(Zp8)ʹ{F6p3Gs}$ޟ bEA`T#h ߇ib2P;?X~;z:\Y25 0|*AX}/P[el$ZK!-jq>u:96' ܜ51E~zsoo{B 7~E\H>O%!O5 {S5c auO%fu]QH#iKjlqZ:ۀ:k3z8CAof#= %3û:~[" 3Uq(ymȞ.xL-r;o-6Iʓ3ܸmZ{P^f 07Xat?ȥvTfэMM5QƓ[}!\sn\;| v-\(Am a=)׺"8lUI&e1fzE$aNu?Z߮kay%M8t*8,Zq@x)r8uSjT5ދFXAY G7OHng,`riJLGӐ)`U .c.\a`|'` 9M1 +d'EPcbV>e\m3C ", /M'xYCAD{ldhXqҜ\[BH)Th&7\꿍^4/*_y޷=`8wP#WBcARؐm / FeCŤXξ'wpxh$GV]ǡn|,Y~K*1{ĵ dn+8Tה\ΙEcJkC:6dl !zΧ;Ʀm|U9ixNJ[0R7ҋf ړ"," +w}%tsʅ4ppAS,.b(!0*Q=Xmઝ3zytM2b6mk~^1բ0#OJxd~UNt3CӼΰF0.Ӑ ۝i4:TZ'zN'+&tŌ*WWi^!BwXAlxY_Md6J6`Ӆyӂ&6Hwx =MOQwIѡSgJ=ӲW R:sNo:M>g4 B響7}߅ C ُ=*M')]j3ֹ+Leޒ4({PS/*_yMbz8O6.e`2u/gkemz!NߦIy(Bq@ Z!VSɹ`cG$)B;ā~N3rKdu:wJ7̋$Jes ձ,R~G֕p@ tTjyݞZ`{qr8j-̰M$]rk5Xt)&a@3>+P;4Q.ly'kfM Ix&'QЈe&*VkO?/ҩzf='܈(n\~w%}Av_3xJV5QWFUn3@TTP/<2T SǣbIkޟ#D5Jجy~p$:[ߕN_A/s-o. iHs#(|g-2!:\ t+`䰼!f0}oZs X$Qt6y)~*z8 4X͆$ soLo LFsCQo`йR yޮ)20Q&-w U @`Ko¼7Mp*?iT2}}̩J9MyBDծQ_)hrɺT|d<ڴzH†S.uJ'VB31!ͧ T `8]˅"T{8;9(0= %[IT 3>{2{T;J ]?J>,iI*0t#fhKA#W].hԋTEDd7UY2jJ:_MPlSX7Lj+:@"[Fd>mTPUGpތaI]M jl/CyO& $d#r>VwEb,P\3 h*mon 6=#: $K=hGzuI" ZPl }gpE5# "T>H* !Z#4#ߨC4{<٩L!џJ]rM%dL'40LOuIOKf ʳ e+Eԑz/T /]˫[5zc\ ^H k$g&[^g%vy&S:w\Xo;gΊ5Iӭf'GB3+Hɴ iحk+{nd/EӍ_Ùo왊4DbhiJj;%AWGPyD]~~Ӊ:PGGK9i_z9` o"&z B#07w6\=>'춄kɛ[[41pĐW04ji#Bq^ "e Ɗl9խ) زƯƵ=>1‚ ICP'?`VUS:1as&]$PXT) $_-SI~SNUdw>C&^^Y \D9@[-->``xmp?r73{h{oeVx?>z6&=\5W P6@y`➈+fXZŨ|/_ }QNj툽fJfds/UoncG!K]I[/v!~3r8p08cbUv+&807M렟:,/-`(@TKlrƟh(5wXx1,Fvk&|1ϤP7q]Kk kгaz}PnI ]թBdulo0-J1z;%X H44Uh<)c8= 1X'|& *n-7ScNÄy $9reZ$zLLccyٜB( SkB2sw~)AgH ]An !?'r3G.{hz5.#6Ϯ"gP6R*Y4z<=z{)d!bǷxm ;x'vG~ܥ$E"0zw\Z@g?<՜[4G2NӫGɀ>yRAu0~)ѱ4(K@:`.0{Qb?q'* Xy B[dc4E~ӟE䮓4VT)Hl7a, 6^ PT]7p&T_Ac qze(Hh_2:OR#,ĺ^+ߛ}J'xj6~N3'H\7'ntB, )WL;<XzB0K|1ե%mΓ'x݋>?-oCVsNB\R0hQґKW`@>rw_lzͽ\ս4Kc֖%>گW)7) #v5ݚǬH wM/ et1#q/ɋķ6iB7Fy.ADh+!$6h- K5 *)Z=@W40Q#cKg$UOĞڱ'QbZDˢg3e6lQծtB`lڔ&ߞ~,aǏp$/2hWwEaP-UQٲZ !B:fB%w,9;vF_3qT!3,X*ʻ6(ۼ,kOfD^rPŕ1>_JM+I5֞\(!I!`O(/D_x0p"D;}_" 4,bBs@%Oݺa:sN֐?J44md-s=Vǫw!x<& gѿ% _bHKJ)Ry$ixqxUn n;t+X `ЏSS]t:>CJ _QL.2FEʤ;KA:%øg3QGQ;N#A' (\0$#GN`?I2MT?g[f@tŀ1J 650bQSUМ:ю-+KHu'7yZݕ4L$v 53)zN),];O˙yV`$Ϳk} a o:};m>fAO0OFO ׂ r7OQ|}ߐҨy:6I&/FhPn(N1qde"ܲqfM']?2~@'9GY3i]-"1MQ?͡Ɓ &IBa,7} ]6cݽ+1E.˂;J;R&h3ػpc'w`?(꿅T1LH4dB_YDI~S'홭KY-gإtv iRS9C_I`` ^Bè2P؊2/$0 qхU/vdBܐ2,of7#A5_L:kxH:u 4Go/sS`u"9y@)kpL{r3G&!:-?n* : Ҽ-H|=bI@ICٮ{\hfwnɏuOV-6j,P5dbwxy3fA7o82j{T{ކ 4ߍBUYZJy h%PW:\f]ThHyɇNQ#s0!hʜj৅#cCS_^lBizTxot Ġ.N}XI& qȟ (cӵP#wG=py_؄5RDY)pWhXgUPy54(u{(B8UC`0 "}c󋾼ܛ̓0#Οt\;$TcYZς (U(׳W%xZ|g*zJ~_ݟ =9"^vZY׈s˾%etc⹚5c(cFW< R%%m3LI'̡A051!/ .Q|g֗l$t,nѠY!ⶥ!?Me!H3v mhJPa1˵ƴ͚%!P|, {d2ۂ3eGr)ǿ(-obn[H%if!BwTyBLdj_|u/cC= 3W𣀏]bsQ7Gr*#7Y5 Ǩnb\I6آaУwOf7ĩ ƝId1 ^ؠa.%HTqYbWy$"هa9kƄG=1eԇp8 fx$5Iү}UG"h2?X@ROƀ :+5(mKl#'dĊ{L"0NJ?j mN0 )n1EMEڞ0d \=T )1Z Fݤ(L&@VJfNc(NxJJr{{܃2F*4`Xߢ@0lLAŤُscm&$Bim$'h`=x8~x1#"exG/+B5DKcì6.3Q66K!NwBUF0{tul0J=3;۰Cn X{8&k'pIS[[&-GNW};P^XJ8gH]H[It0{Kdf:5!eo1'YR}+xX2f%fdAr9}ujgf 8{ђ҆^~38w;ӱηfOnss v'r$>LG8KN5z(4c N>ioT<0R,CQ3IK ܌O8j9zd8{@:9Od߹D}Al:p"x)NyGM`uÈMVθ]w ]5YYJ#-B`.ccZj)ݔ6mI֓KWj XprٱA_/C}j޴nPu_:Dv)v Jqui?6;rnQ}$.+s={N(U|ʹ^z%O~_Oـ}s\ɋͻCu'S?6dK"g?La(!GnłY oy_XҭckvmTV7^"r(Ks~wvz>>c7۷m)od gc#Q̤RLen戴()kSU/Ay2_Gx_<+PD]C%HVȩ&pe/DF3X;[E4z q4]VP߽7l ~E iٹpHLl 4&JpN/Uaxud>GODZ1[7#3 K叩pCX?ƆZ4q 7(m~|U,#a$ Ёy{4{6hl η͐6f?m,1[ ]@ע}I/l@l 3sj4 #?`ɇMwˮZPvd/t.ei@nRw!JGE^GcV.V^u rb@;oj{čKn9oy >]UY ˤzl[נ k7*X5``_[ Q"LOFL)"(1w6VyiB_'2 z9Wk? rj u `lGJRiFlh;Y[9.meV3J };w-A,?@>31Gwd)0W9 4{"HHRl]P7PM2xAt]‡;a|6 G%;W7`Wf( Ƒ>ෝ4-qfGi-,~K+7MB:8Y{3"A5'R::"Κ&ѝɦmz>t;n pCK,߉!=bH~3 @>h~) lpKִ o@cjC FS}gAudY]ԛDvVv)pwڼFZ;ٺJFIFvU%{ݱ{4q/9éX.)śP]rFNY Ԣ=Dt̉;U'ihB:k^Yԅ1pJ/pwպz q(bp:WdudYdʐ:$L@7@m7xZ|*"S[L*L6@?na{]2xtgES]N6B{3ćsZtN]"ZRkt^jIv %-x1rn>E1g"XaJS|)Caw/^B5sg5U4+,즱LLW!@(R%,ǎ"9n{[ar/蓆!Eݓ Cr.0=b_罻5&h/Sg,nMI@6g,,gy`P5?80 - ,5 :0C&]fS v "7}č2f@ֱP^(du(|⟳Uhǜ<-] -E.͹ȿ?D8Y[{҅SIMϒ,lлS<{)'=;YL.-Ԁ%:I'%e1n#m D|9h K)(QV2H@Sta"w542.`DF*nJ:2佢ќw5Jlց&ʴ)?B2}iJ doI-R6Xߨ'1iYU"lpUm:+\av.G HSjؔ:Sơb.L܃FH}*xh6W qoiH,W"E{q2l;))/fe*a7;"O+:_ֲ2:-5&3t}Mh}`{Ol5P^9-o(0ImaCR' y "1ېFR/Qw -7gI!֜RmfE`2BAhr5 %ȿnaIqg%u<S|QY?3x -oA#3 ,fgdP`1%/miiXa5Y<~TXJD6HڌXrXYRoy3fl[fr`Qp*>w&CPcGL+dԲDXwdqB=)6f\k &J ezEe^2q184*^dw82I]&ƿaX*!jP > O kGtu_Kn J`Nm/\d?3`#v ]w$mżDHezmgLuސ.h "N@ Kp2nǢ tC)L"b Syy%pHCIgBD/)Β4D^x?Yhώּlʹ4͟MwI& ;w> =:@POe1l!B;a]~4?Xg^*|^F .UR䦀>߷y8E:iKTdFԀȖ"Dʇ"yS'ap/KXb%AaϼY-mj0$0r 8@3qGj&QJ IQuDgzX8Tz?yr?"{0P Z9DL *te)l yTIp| s|Y$s`ki ?p #RjHSBNBY$R:.)BO7e.:_L͢QQ-R/UF jX^ox:FՄEt MsmHĬ KVሙ:AiToq2o@z ]WXMu<| McN!痝#FxHRYvꃪ3AJYƌNurz bm`gXX4W\Pp'R;pR,Ӆ 4 ~6Nk#l@; sn$^K}A?u?, h)%S q2ΎfՃ]C/sLHܝ#_)*}$zaU1_9؀qhp!962h"ghdeXu]hy]X#I2ΥǟvSp ?*&ة" M6l>ꡆ6[sU%= h 7O1e"hߌ#,0n=YzДM5w 2s:5m$bYfKL}-z`F*{8+b?H.{Ek!8>W"*8pMhm̓Yjs 2w, 4b#RRu|7732j-ɬDvRߜL0dhh \̑6=59Ə׹9w>$C2ރG㦔bU]n2_l!6:yZE1_bt#WnpC/~dr4.m۵7P*78O4&;2qOt3+#eHK_p/S-dh?TrF#Bk$>?3d{mH'rj`fI X]PsOXFyMEgOYyK?>1t{RcP2}]>: Si|?TΊCo٧>&h Ŕ<C׳Hs H ȯ<9*ǐ~^ 0H0Xt6-Hb ge;IYHcw\ږaRVClʩ&%Oɺ4\V6~VjH_ϕKj?+"$B;gE%6"[ U)‹7&1$Ґʯ@d řU3:gז _bq'3ChH%'t<2 KBY쥻[Dz౞˙" YfjeF,4@sJօ\s"L!zmPz[@1ȁ(@- AYa oE9#kS 5E3@ eDA øjEKL\)QOKI$D >K=WiGSxk%\-!s!k ~^ 2#UîWq{yR,b*Trܵ5IN4ʳS h0K0sYHJ܁ d@֡|3̇4d@܊xꀵ*Wtl)fi/XLHIDClaskA?l$c-ĉx.1y? JVN&b%-q]5䄤IP!$ws@gMNC wQKpKjq2p}_=j8 pWL)~Q>؛ywr%2" fJ5ȿ1d_z$JFвI,sr_,|;C'^C`9?Uр =1epFwIƻUZ Kk燸|K-9Wj+őkDwjM] ς+pǯ@Oj?~j{LStx&¼kxLͳefW01[rk a`gטjmtզy@lp-ro~8m؄;6HB|k+YyD#w Uߕ: |T2x av0jDNhdir _y|Fbn |@))+RvׁeQrZ;Ä>Sޫ᫣/or2;{8Rg ImJ1 #Ov܍tMb\m>E7Y 좧tp>ub=;#.lS \g/O@ؼxGfFdv`98 ~R\e_+O8ۉqlBJ xxbI tnaNģ> bJ\<lqF<sٙ uuR,t)p_&1tk:[Eju,!,v4\lXMBŶ^jAE|f Å-3}|g;ʞ] ]uy%pB}2Rg\a/tS ; u~ty>*I'K]Ka=Q#%f1^{@g&;OrN?<+]sZs`_"q?vY@*)s K&2d/ԉѓTYgoN:YQy }xh!)f='(w+ GLPĩƼ?πaA~ӡ$f̩G<|l Ԣ!s p&6MF.5SQPtRVs,#ֆ>Պfe 3(wA0%BG8n48DSZi}0XeSߗ3vDO%>^*A4.zko`iPd!pM#Qp 74 mE^9骉z]sI#x"&]PzkE"S(@-0ǿ8( BvfGܑ))W~D1L;;eVNu4ZP.]11\$z㌒>|;+SkJz+K(єȷ99{<8?.b'Aޚ!B00At?v]xBL$Hᦗ$ [S' Ye}qO02i׸8<""i)m8)M=ZVuDy!]nt_ @CJ)BNhG lzK;9<ǎ{o&pjpfjiFyj"$aė>ˤ2."*̡nD,Gv1k8H6/zcEO&r~vW!4?.?<Nb`To5lZ?]5%SN,iv%t#?8v ;̌q}=RUtQZ:(x@X!BDz X tGr P<"})}87٫ Gi|`xV|E/x{z.n $.0R 5J?Iq ذ5<ުBjzP@\gAԋfwFz;mv밻Op6dD.j/D-{%\n*go$L+fFsJ& cFB}Fס[SP hIB[s?3CKѰcg jBQ O>uzuRK4J 7LV|ܰ R'v`yH ijXټ'^lbJ=+FaP[5Ԓc{FBpJK퓒i`/PtaӞD Tlimit-login-attempts-reloaded/assets/css/images/rocket-min.pngnu[PNG  IHDRИtEXtSoftwareAdobe ImageReadyqe<OPLTEJTY$c =ڤ󤩫􉒀O_`NOȷKɋȠ\3豱gjjˀTń^{ʁU-;5CT]a7GRʱ{p୭#3ty|:$3zi7Xa œOYu9'OX]+jpy}ip_gjb6yGQX`*ior过gOZPotwr1|Lp$5B,;ouw(@3|L$3jpvT^an(.@rxZaf 4 qyB>J6~q0y}%1yC苓`hai>K0(r100kYv:|+_fj4YtRNS4VǑIDATxdi4 KhuulnN1s0 r# ! }}aYy='O~{Mx8ߥU,! =zb%SOi(,QBFM}@  ܩpE̜fCQ?`ΉWvd29 s6r7OoKBqu ZvV<ѸAͧĈ;C,Q-Ixk$t{dj[kdpzVH%-/&@L Xz^8hsB)R`QYDO:D jESⰈFszY~Nz&9["DgF2S0UC4h'TDy^ (C\"#mi(*;ږ* *< 0-aBl aﱷ(Z]ubWD @Q{{pAgI eD$RmcRzLТ7CqC (OPA8<9n#??88=L~>>1A"&O5.BPC9^OB.O(z{k\<\lV Dx;5xmlZ~MOhx<8} :%,Ĺ5h׊HOB_8ԜOܐE2TКNibN<@q;W{,b"9PZaO$?s#B/.x;q=Nl!oG0~=IME)@֚s#)-y<yf帹  z@Z6YК!ge߹@WqCRhgy5G^Ɨ<̠|%)#}2-W< $ Ed= Þ@Ȑ:hq rwW MШO֊DpIENDB`PKwL\`lAlimit-login-attempts-reloaded/assets/css/images/schema-ok-min.pngnu[PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<PLTE*/@ DGTEIX7$|~}|7s`|<5uG\}f䍑o>># A6GO,\(}/|晑#g1cC0,}w¯)Jxr_F/;ƌ={6?0# A69f3#9{dw` __Woٳ{Nn>ٽyX՚~!zy۳t7N2xOn6}Y3`V{J;͛5k _3| 0Y=?!}ʻtE+};=,vf"eÙ7=0YiZ}XJWRjD:3x_Mt{ժѤ_[bZ*qrɓ~ _/x񦦦Uׯ&<}G޸A}=|ÆUI^濫~2߾8 CB+e32~|YtM\x҄LN8*SW/%,]%ejj M\m[i0w5þ+n|)oy;'&.[vԶKK+ Ai̳Jƞ<̗:G"=~I.ԶStʿ|!<~5Jtح`M\vnP켤d9 ̶˗^>`2P?</wJoyF+Eϥ+笜:'o&F- ǽW2r_vE7{ w%Txcgw#~&CaZu_?U'Ra̤m//Ƨ&RhNJ^l~ һ*&ov*eh2}m̗'{IYdgCAzHW]Y Qm %44ɼi⒒R--9J'4O`2Dd}_8{u%VKK0_oⲃJN\b+S7M;yo֕+E#_d4\vL J6Dw8Wm+ g</ ߼#fCzN:4I͠e|]w bf)w"}K/w9\M3c!//,CXr>]iFAUb]xj*=3%JrXK3}K_>3ٯ2eJ4kM!Hw-+|fX`r{\<6[Ωm,zngچkyC= !gg}2>,i_ n7R.-{>蒒%PE╅ч|P#yjۗ}y'rߙO}.%=z;VLC>z`~ź~i7YEEEcu_jl8wƮbbE2}U A>5}%W+|h۴oI:UwM}qr//]M;quL!H'sSjKkscҩ+"^y.qtS8rzWug (y.,L\2Q,dBz{}<Ϧ[Wr<.[6LӦbws` `}ЉKJ&J Gtix陏<Ϝ9 ϼtuTN}EjaҢE^޹W+Olҙ}aƓ91 0H6(x5K}gK+w0(:c%U [ې󳜜L=Ң^~'\|= TQWT<׷S9HiHtir[>̍c'v-q{`ᄍ[Xa|Ej;|wc7c/Hҋ/{zsa4Y@rR͂[+>5ɯmiR|@3=3o,v~iт%~8K؉z yĭ{ LJ+ ؕu%<ѣG  9YCC5rߗ;#|X~mȈ3Ʒ--<%Kx݊!Ӗ*S l 1J}ߗOsǘ~nj%vVȓzmp?Dxwe/K}g3 ѻT>.\ؽe_y~<҉E^>q1f̘W^]gK-u1˵r7C4LrKѳT:o۷uDG/s|A=I~a6VZOKѳx ?-b3gUw߅-_ ZYX=1FG4؞y^#|g$TGN]|Qx^C{g-6ސ{O~3}A}ޫ ^]×t5bĘW>UFo\ѥIL}򱍹'_W!u%Ƙcʑz+6–}[v@SWq5ifr'7^a/CwPk=l sr_g)hޛJ9FYqNﺜC_ ]ؙK/_.cw`DG;€ `9G񢴬Or{=Sj˾ 9y}s_'I7M xzڭ߹/_Nj`{*\Фũ|FcK+ |F8IA~+t}"ް{7KY^]?!!wx`14zCX -°؋_ƒ`q<0({LZY3OL;xx``:zy۳9op .x%_ieaĈǢ? 4oM;G㣩}4׭?`H{y?..Fx|H}ijR—DbHv7cv0̓x5?]u9u7L ~m,>R,Ӥ`13?^GSẊN_~Ôg[;#)2AkeqV޺6z+׵ _w~ÖAܮ[H[FS7o>m$+ïƋ#_Gcs[@Oosp$X6=)wx`8Ox}#] XƼ2>"e)0xwmnJЦ,];h/LF OVw%ZOK[xɪ]|&-~iKwV})3]p+ V =߰(66! c3?IWZmի@HS ^"y`MbpwF.OMBku)d=Kf^:?Z6H.8 pɭ֎Ů5i~* _9 ;vw i:c}l|Й Ѵ@Hm]>3f&x SMd7͋_׼)^҃~oOvwnwȮƋS þ*?|p}W8= xU+nOZ=7mk*X.8ar>,c3tO_N)7^Ŋit`7>B:Up:Q/Dr'pi0^U ͉<]3ŽN[y#UEug0,dps&2zf)t~GXgDҪ'`[k}^biG Zp9vFzGRr]Ir I1^M΍e,C瞡tNww-OqF?67l绻Cosys75j+UN(aM8LɍpFEx\pEuccq×#oe$:H7+©*t­n^*tjnNVrcRnCj{7;tG|{A8ݾ1t*ZY{ˈp{cs@`[7l6ѣxqf7գ'9~\/:Ŭ|&n8ÖMT^Lme±+mDaq]Vr3V&n~)pzH[msnk;.8v)p&%Gzѱv Ӕ?RgmS.Gۥ'q8 V=vܓs#HS|Ä㕯m װj|W%_n[X.8NГ=)_}ݭU,|\]v߄k*V^h~3a=.r>jb5a.$9`ò;P.kK){ a#]]qvP~v`{iqPrI]Gr>IvH|\'+tFS`{I ,@TF[ةOsNA)sat]:.m;\W|WI+eyܹx>31VVu$V8P~ፁ ux,*F'BbqӋ߸dGk eMh߁%–\:x3x@}r`ÓAv-h`G嫀JY}d.C:7#k#ߪ/W=EyJ+ W~;oh 7~>?o%tρ(*0&`H0\_g pu;u({|(ui3-_~ `lq>GWUz/;p3y,k`l4`m$ӚI8)Wss` иf -E08 `SF06x9 ,4m&]V6 p+HF5`:P6  ,U)! 0^`0NՆ8,nEB1I8 J f*[0ֽ\ Ȍ-di {0C 8aM#HWC8N6w`,b$nla^4FRqA435t2w ttPaA4+A|`yTYKwCh4:%?ygR]FP:cfp\~Ȁ>ՙx!c}>/Gj_J*N p(-`pbuQTpdD3 j3jšq `!*zUjX8\.a0z#X5X B X'~&\:k֟߀ } Q ߄֋{v`M3`ZH`obOp V0?t>^8%v%c_؀#bhFA=m !bhFA_l2ҼK  0"h gh14v!.?Qh14v!7.7?Sq(_kBkAokTpW Y dM *rt`Ł9h+A;_u:}cYjb~Ws^` jf`4oDu$6Drʿa2w4~5V8~#*HnM$#8 Hҧ;9$ fn"%<8$ VRU*\*``Λf)ڇ9i2;exL$ b3Q~U ~CpC i ՛ojm87~:%`gcv"Qjvp|tYï}vAr`W1_~ck<$a=]5,o~.ex8~Qx\FӱLo/oU,*k e(gWSa 5,/~F;_M:W976"ؑjX8\nA W* 촀_T~jpo.@W{plXz`ڀ`-`r̯ 'Fί;_Mz2OS_K v6LC`aH:0~-$8<n5b:P~-#8t~#`l@)~-!jH8,E _ v>t-tuNL;  mP5`#pxuįߠ=N._v $#.VʯIߠ&9{.s0`;`+!8<a d ao0`2Å_`a/.r`5jÈ_\:/B5iFl%aů pg]CpxU|0W} !l Í_++] 8U>XCONpī=';. 8(WX8 w"Opp7u"99". Ur7u,#Go0Ew4 m1aïz;#:'E.C+G(ߛ!8 f`-#8U')'pXp ao0M;e{+~+n8I N+΄A b`7l$3i{#Ë_98<N7Ⱜ3=5`3]WmؔF vAtGuL&uW"] z##;ߊ q`w\cRI;HUP8b¯E #9E_7 į 4#OC;`'\ ` ]opEh.̚v7+"4vMC۟`gĪ v'a5x1s;Oo`lA˞;ߊ``\c~ˎ;_M +1&bٓ`/~o5,2'=eGȯ \4sNښ`'/pXbE)NWKx5#II#Uy"pXlzrÒ`gq$x I"ءH8V#ة9puI;_5apU` v,u[[JsU8l-W3= C[L ] J#oDqpؕaCMvXKIh~70Vw=aBUH#0d:Wm"`ou#doDFM$FF'" v:fH I'e01tbhsv>]!4+I mW ,v/6'tP_jFlCM -61_Mpr ~)M&6`W:ץ_u:`J]¯I :)ߐ#hR:*ׅ_H 5ew v A z"Fk4`.` vj +ྲྀ*cH{  X"~VTS"C- X&~5%Qr Wv3+c L8Qz `Mܞ{΄1zVX. ef<]ZƲK')]Ưƀ`a6~`.zrNl_҂ uCnx=-؛਎~=.W3qhs+3du'`g$ʂ}np9-j8 8+cJes'Zt&UN(خCp#g\ǯƀ "u89n{yJW+ 1QQ~kU 8*MWTQj6&*X/-_ X pEus01Zsut`Ob[^?~3``OHg$`[|ѮY>^P;%hY9`;.D-7l<`DĔDD}[=Q).%`[[o1or[w$ V\\Y"8lNP:)#`[[@M.-jC1ŭ}3XYYQG +22[-}'UW/|=uy[^]ԧ `V{Q,pRyTWV٭8 "i8VM3:{&|C7^Tf$5 b Z7 %WHVX֨9M! &z"XJLVh!-`i6aGNrq]L G'Ǣ>q0bYZ^5%DԱD[@[|v)wgS XSBmr`Vߪ=R M8 AU x+-רF~D[@5d98ړ8AhOZ?jmc~)LD!=5x[گ{ɡ9 ڂz鯧nja<.ev=%3vOƻmx ,zMX[b,90] %Tq6>hF`֌sdj ~198p#%f}`aD# 6- o #b(^TG _#uy!رNzkLo%! 6)~> ~cE!;?OԧN}`Y'͋m5/J!; 4鹅_wz;G XweؙDu >n8^R%P3DYů ?/?FcV uCpyL+7b<ϣeZ&(qE -0ޅ=Ra@sl$%8Žkcw|g=UL~ 5Y[rpݣc3)jq}~~{& L2{Ǥ#GF|(J9~s_o|f-d`Hk XSK0Q_!ˎu_)~{82m;8V)VhLQPVo^hs SV3|_6$d -}+Jy/ޥhC3~5 芨2fSak2| 9w)*G i`?~j6"֔:] |a~gL 0QڷjȈ+C߯-7Y / pd6W9`W Fxp.IW |}/k rM7`f48^m~׫qW79, J#h*ִ[}6٣Ca׻tTޔ}jÃus&2!r^Cm\?"xf>c> X9~5t),BDwp_ _ȑ#?+H~^6|`M]\)|7ƁAjF825`!\89Mh5+M3c!X4^6YF/H65At#~w}Qw%̯͆eb}Ӑo :ɉ?!R>s_yJ-]q[`m8`~+q^O9O :?;}ψ~11"`wm12066SIŀ5?B ^@x}cڙgt%k ؗ`'p~M%:FbP \0'#soc#G g#ϖ͘QV#!88wP!IC:GXʯT]?cRJ]͸1Fٌ=7XIS(ށ}[MGbgf4g>*#TAKsRxԗxo `g Vl8ZRa5{iױ :KoYٍD=7{7 ;aP5kS$ps7q_ eٲ{,v`FpAс̯igf8j $~݀N%w (xC`K~{l ^:K̈́)B)MufpRl[T,&gce7n(/{r' 7ap_'} 6~^w1`_>0g;R})x/!Δ2 {H&\R>MCbnCt~={9d(kFP`pD\KIПYYe\F쿛U dWiF kReu9Wi<Wo^;̗ٓ2úUUUY[QD>G&(0ɀ0 `u"ۯ*}#Qz=np5OwSKYaF'{Wp=zא!H+V'$ 蔖Gc/^rսyذ5~Q,|{w0j?MgRoats27=$3e&/<<  >xUFg>v ntS\%eùVehFWĚtrQ&2W9-](/_ =Ƥ@ 4iw6bjYr|op—/׏G'rz9l5A?HV:[3ߕI6f9fsw0Qwf22H{0-G'7 WCsG[9#E\gO0{)u+ǹ75}`*^_ }O_"e_D mz~V)L_9wpT5LjV kW DpZw0ׄ3\oyg+tI|1&U W7=,6عJ<^}~M\eK+Y< pG5D+puf<7xG&) ҡ:@j3M9Tw}9Tw汳w)m:зnX鑑v6a[]:گf:yC=Cg&y+/ӭ|VmvenCR_}IS**ʆIp/&T<)JⳤxsUpH苍_Uf9*🾧)gJSWv3xyG"x^=|qrC+qժm >+z v0`u3I bgH}3(+ edgJgo7ݺRBgz _  nsxɀW}`qh8:>ʵլܔ;$,h35P5_Ul {Dy3KM5ڡ+6_/ײUYOYr =KQuěD}zbmGrx?=IaKBpH M#gbgȭ2J~ܳyfd:ovujQԮyseۖz1z+=G:Ԟ{Ԍ M+XQɡ2lS+ |e,$7H4[ |eEѳ9Jwٲm:'l0T!|'g] \)0!>{CywYߓ>vFjxUoq>5tU*Sۖm۶੃rx!zVnJoV]\0,hW(.n'>J#We_WzYJwZzyٲSȁL|ֶ^b;UQ/L5Ҁ=2ۻ:Z 6V2421,Nm*}i㨪{ffR,g3U ӻ)ootz`XqFScg3f Bgy{t;bE`X7s7Sл4t%|'үw/q2~5G:apE|##qήؘS^_ SXZw.m߲2+/ :1oӲ:4D^:ah9pm4F!r_>39A<{՝9}]0wĉ,0'F F}^=?c^Z**?^7}_?yVslYWY~5׮n7I+2_J|wûtʕ+2#,#+ù67jaBk^2& ) m0Syϴ<{G"x[Uʺy4tE+%e^bR;pʕ#~Yp>Ir?Wo? ,prhD (A.YId7hݷJ3A+i43y[Jl1~ܗ׭%+YrN߫|&9_}ΚRyJN=7*RQPXߕ+A>u-X ]I Y{7n+CƠ<|j)kTZW%,^ɕN`k6Tx+O0˞˳w4$!:#r澣s~(&͟PIZU#Ă_QZ}^DijcY]Sr$L Po 75\ EV\Ss`}w5Z*Cq+6 \uW3rWL^i&w4RrR߉+WR*%z33SSU tzm,y{^'.?fާz8EۏJ2Pny&x^^3/>s]$]IcgI"x&25Z]Ask69* RhH_BnjicPX'gi]gr9%QqyGBݗd8~7{b)]\N@^g0৻WRxK?}ϋҳx$e:_Zv,xV%]IS%r(3g_2 06?j>ı-y߳&\ʏ!e?[ dijuPijR\iݤ9l$=EWYԞM#%r_I(JVh&ĖpГNApHn:tF}W)>r"KNIRኚKJxeo6n _+Ϻ'8qG~$^>f2IF|&yД@ xa01}W?~VOm绌eҩ u6RЩƶFa/{ѣWњF{1wzH*/wtiRMX%}e](6 Gbߗ_n%ssff[fcaJ~LWuH)yqGǘz~C~جߟ8YM~Jw_t8oj/MҡL Gܗ 7hi!U[zؙe%e#])qkBMh ]74MPXCw8.ڸ-ˌھγ8L,]Z2QR%|60~E݊waaW5u,OZzzk|Bl _kO;de&ަƯr=5_1U|Eے)+=wN+Yo'5{/v$$$zw\dǙ; W.]I&I͹ 1sŬ'~` %~"tV업#+=Y7+My_=Ny\xL]D}9췱ey ?߬+~k닊5hn5`8638/mЕP&%+yl+ r{s+v=I `;B;mm6қ$/SYYX+iAN~iWx7y|NGwt=o}-߆n.ӜYJ>] 33V7{J_ijdt*V{o&U_; ի, ۋjk64wD3ywkm%?e^ZZw&/< {3[Z25]_84~۳kY[@WXXȷ?0v du&H{,3o}&miyWm朗+.HcsݗWruXZd_U_7o2^?%|Ig>k[k Lݕ6ʠ>h'R.=Sۯr$mA╸TBu6m,w}`42Ypυ^i7Cg;k׮cE0!O1 h8g/Mo, 9xH["7x&&#yj徵E|Gw̒ϳu:{׮Q I(<[@X,ծI/ɱ/}KDۗi(#7JugPH۳,|Uw$eG(t%γ)}z(]ٷoxH쬴P_7I<` ]JSuxM}O]+qж̶6mY__>Cg x7If}(F[NrXp Jx@sF:%s tgrxlm)3ujzsTg54 R|z]<&z2ߛxNh:Wrj%~lAFhiB%rLbjM2_/9o `9 ]R}VQ.{Wbq g*Ej`?}w e+KH,&3Ssq=hfs}mQCQծxhPI Fe5nܐ[a3bjC"UE20^&}GRJbtzGW]z>Q_PTRkyqD<_E<]DŽzk×[/Ep h p u1/+7VNY߶ãkd/- zlKϷe|b^|o!؃k,C[ p,B85Aŗ/QW"K5KWձz~-+,6f ;}`q!#9,#BgJ8Rf2z 9UGogbŭ qyWޘ!S<ɯ(^&uDT$z2`0~HNɎ8>"t0o{{V{¾IWکtu/=ߒĊlU7yK3㗊V"Q,Bwܙ{aˡ RpZ( l]?٨pt罂+vz2߷Eߗǹ*gg+3ϲe8 `}w9~{/pa'JCf$C{8\W(x[P"1qW|j|nbJ<[ټvuS,/F>G6(x+ eQ߫+c{߁۲¾ݻ'öRyYpl()pWS|/[⑅v·hWgq$J{H;Gm^AnwEjծvH+Ts w.0vlٲ{CΆ 99r1}()JPt9svPW#GIJie0Ojk9+ K}o]ʳJTuIgg);z_^x~tŴe߾ [6~wnuy ^7I@lml+X~ӓk6&RPV]GaZM]љv~s^,&wieS9#Vcfw|ul#rgf6lزaoκy_}k'vN[ns]Wn'2VuyAņtKyؓk?Ts_q)OX DݪPz>IOOJ3|56Ƒhk9,|;_.sŜrC{g>#|0ys_nu罺-xiK''cn@Ͼ!)CII͕uS2*k7Nc)$ԙ ߠ 8#/<',}/<>smHhRW>MRc~fRx/MߥQn+swa˅ .l`Yy ~{mkH/8?ӭm48F+|{R撊C!秇P7t>?QtjW۳x緞/,A<0X(L~g=vZ}qmCԱ3IܨʑgJ~ɁWH;}: n{ھ۽!g7̗ o_ ^ZhK'dLqxlĈ_cƼ2&@XI=GU&p~v{Jha#+kjkv: c9R*[3WQWI=:M%* ՆU&gnrt47<2 `;uUbUFQA(mKsӮZ @ύ>97yZˍJk3~# N} i+ 旃 6 ޝ-&˹=/nLM,,L8>B_ e<ȝ1}7 @$ X*Z_~b-𵷧ok>+k7~UB?^uA_ M?[%ܨxmzf<:/c\࠱wiRr/bcȅ]8 0޻*n8A߬ ;]oy{tUZ]#p_;~l}y_WN/wj; UWCEmfc G-&Sv|ܢ/&GStYx^q]ES#wo^Rػ_BDq&q9 4CnҔȊH#<ʂ{/>'>sr̦FS{Yd>::_q=5Ǐ\1$V0]D˕#6VǬq5&dkh^9P1>h# Rf7ZXq,ep5ǵaՈGRmpyfKKse_^=o>]\$7h ms53>w{ޕٚWoɥA9 4L],]V kw 5 >p#ob>hF$,6ǩ:u>-.—秮X?_=< М:hב%ώI : ,%w5a])^j ػ _ս ^k[uf 5H&9m7;º RMD_J/ Kv9ޯ!ԩ/>=}e .{ۂnT9rd+<;Nhrbb09yٻfqw+ Kpϡh4[WAqGT_ˡ]\{L7m]Vؼb{f_Vs%ӭ %`Vo4`BԨ@Sm\`\9o,\s'/~w<-|lro] /- /͙YΎO!poXc.zYā*c)wNkD:ue׹}6$ecw08˾y %~eV9.{0$:Ws0x9z( Q*kk@׊|b\Y\!1Mww/ύw[M^1ª6 z:F*b&rL<…ʺ/!gvC4p2~5nk\$zY< tB7~me׹Ѹzݷ4W,k&/87715}iӧ\aia݅u=?M|eϥGPPKQF GI!&D7K<} tN l2s~׮}'wOl(gqcqghCy|ld|f/wZrŌecSqDabHp;7n?fή~O}]G&/ҷfx\*ύ.U͍`n4E\(]awg}]]ů9Bu/_Ŭz ½bRP|3UF p/tͳ^uy=ovOX]Yߪ_4lhWEqN:)3|8b9Q՘ 6jN^3 rÌbϗՆ(ۘrwXyU=Bmb˱ɓ[&/\#LC;T!7-DCAY ٟ_?96yfWU'7xߗc_˟ǞBWmln/[]Up #ǘ JۃA`+M̴M@cp5&~ֶhrs\vuSn].yE ȞF ̮Fp?&+ s_.<9# 4aS*DILIM|*d@Nߢzk2$pvAtW̧Ģ.Ϟwc G#Oqaվ}0lW'06707r5#(Fs&I'Q~@b;5$v>PXĉ#ncsDWnLML<7}GhdxycNũWRKT 7 m˾TQHD CL`äbٟ&)w|wr]݅nTxs#XXUL?TW/qwm-mxIaue|]50:()IXI31¤ϝ;xtn#{«|epqjoF Lqaɳw3kseg>oN!_2{hM/q*Goq nM֍#o\wvlcʍE ~'6h*_X]c?iUbA׆v*♪طr\-1V%IMȥĘ"3a#bξ>o,Tlqe}~j}qۿ>>9-g{֎,gj'Rvy!f9ˁnǹVysswnm&q"+?ˋEFqJg. MRVV $R EnFh_2E@|w{ܷEϻ]mlP1bNu`0rֱ?C:5# [hJdHtDy,FY!JxFǯē@]Y\ջ/T^ue6hG DH\n\[{W(M)&(fCWcVaQFtGbyJ"jҬr@"kgg'^ɷ#]muEGd/;*_7A^ͭyǛml N>Ơw:m*4ڀ_;C M0fW+e$~_-8wFPo5eIҎ][93sgCz5?fcxXՆ"{.s7JM>`qݞk<#wϤ7iY]S 7-84>羮}6 #pġ0Ф\ y75W9nF..NQ[WO=5J黓6pG*m҈s!OL(5u4JH8t>gkF^X{";=wv#N̂Kjrd0vv@ߥ'xdak(,=8M"{o2 uJsy?TkJ?H5 NͮBY8{yd4$ƑY)3. >.\p pN1"1Sh^Gn0 掰u ߣ(@ଷ{g.8M:<<:u(vВ6? *^8ҥϏSVԾi~{ U}`m͚^YLLL<yAW߻;9/, r"J2X˝CjirR6Kml,uˁZs_(GNf&غnaiٳ G~Ӿ37;M}oa Kl9sF." GAY/O[oakʚY'PBlgR|jfJߥ%mx:}@̭$0kD[]wC/zXm_e]~kAmHY0g;PF KM<'O7+ 1;Tv(ݢۃHѬ190:6XM{zcYX& uoYإyʹWױ;^}_j |_nukD#EOY{L Jm0qsULh \s Gؽ*?]DjάϔY.y͕-(v G%Vֆ l%~0ph2+kbEv;\:쯚*ה?G[vjK kbwdW[7:YzȄ 1~QctWqb#|5 m(iA 'ښ5|nG_}\<gJ~ ?]x&Xw- Pkh)Gb}ӳN:A&'rk |G>ҏ:ege7m)DWkv_6Luf Ivh{ e5-JB΁/S 툽DюLk;vͻ-?y{ z[Q,gTb\2bR0靽%ynH`^{48 _?0{d N"yͳKwr Ny},$7)΀ؙ~W`0 ᵑ'̡-G Фn ~[;/v~~n4{O Ғ%n,lY}_G0(-$c8Q#t<%] GJF^NJ{l|kQs)}G`G\\ˍ9sE:3ʢ¾*s1s#y4"K]V~tӇr7-"]׆9Z+_Syb׏B'K4 dC6m.4-ߘH^~@uf{k![Lw(ϞyJ*^ # @ԴZECsXLZPN; wůz͋?Aax[QԹQbʝ2'N"/nB5J;m+>rܽdouK- _=۽Δ#eXi@rgW 0J9漏qd:nU{.}z0~hOK|tMo#3d(JפIѮ}d+^W@ ~7/O({ii95 [î}-$.!+dʜ*|ޛU`՗1^4rFI vu )]B?limit-login-attempts-reloaded/assets/css/images/shield-min.pngnu[PNG  IHDRJ NtEXtSoftwareAdobe ImageReadyqe<PLTE*/@bd`e7dQgNåm>X:P-+Yo :f9Q^Llky1ߤCLluQxQm,[`4^ /E%샀.' |@Io5Vs&/. Tʄ_='7a 7{5uR!-{\d/x[`]0Û=#l3yU7 (k,=gx0VCO`og`.C}^&SO>Ke&D[~4%eӞ>ދx .*K_|{__w7)ߧ:<!k3ǎYnQXBڗF< xKs޼y֬Y` &\ -+luwT.ݕ =w-2Ad7o&;f%R6#R5SnoS@gᔳ)n_(`rWW(a$ԬB7 "dmvbҢXo_A=U8)pR0OSOAP!]ߗMO9` 4d?"SBz@NzP,|p"@=üS(PE8@) xNE_DEEXv㶇J { kjѵBAd,ѽP.tI(?M10A_OM0uыDlS@}d}-:I>8`#r"`h=}q9L&ue˾A磏A~珠'y`uH#7G7v,8bgG{b[fP>4R+e_(7:F4"H|E1E uF$):IL=vFS~Ebh4#}27$7XvF߈=O Ɣ\Mq"ǫӣ驔ƓmHL <.lU,ƢFEcT4%`ҞA 3p4b2B}g_ [>$U%`Dɪ  > S?s"jF`{{GpٗJΔTLUIn TaUB ,p@r)mp k4x|l?繹U *U"!FjHpRD֒*֒ܭUU[ss lIJޒx#joJA&'/(9(9CO$h4Rd ?Ro>$/&kN |DC0QZȍv#(X 5ǿՕϔluꍴ(&!A,hBM.M!dJq HP2j2M1>(\H "?ycȤ!vo vF~ 6<}.sHHL 0Q 91 vqQ 1 J?|iT*e_bvC 8  |n~la Y'}/ut Eqކ$vf$@!1TQ!;wBҘsaqpYv!ߙun/x5\b(;(K[ $)%b1&JB^g!|`ɲ|>1&t< CǏ XS$Q!Qx+`6N |E#%{{G՞b_c𖕵Ki{@]Rr81ic^I$p@HH)n5ٳWϮ]CGٵl xC$Ă&]qOM<{lnj"{ ~YgFȳWk7"r 6^r,QtS|ܓ;ö#-4 W:=_2?F(fŘO)hx͍,)Y/ ,d$h|K|G:VnږN/=8prl| DL%tG]=ۦ1D"QM`K!a"KuKha)A6} #!MLX ^DJ櫨0Y>L؀?F%>3QF n)At7Q#I[4˄w31nN|W_3pاПH0HH9̏k/_k V$& Kday' Ӱ ,ڮl{c$R=aM!q0$~$$8cOjZW7r)j k^aadB4IImG UMqTt{Z.hI܄i'-va6./fK3elUNiEӫ)Y>_S&|}Tv:Q.q/GdEgg_ p t>+_U Zز~ fXuw \сQ#ΎrFNda@YV=ZnCA,:[&g}`TzhF U,j=sP65awZvv皲Sׯ/G,bBzF_ wz7O];T=YHӫ }p7߬p zB; 7>x)Ml+SVuf!i@ `__A+Z X&z0A VEŗ5ٝ}Kɧv @MMԈo6f Y9p2׿zp|ܔ*xp:@ѧ*U]p0g*>ƨYQ1G]EtH&cS-&V)FxFU=hsxXz:h!t$>~tcx V' )7dY C;,/EvHyL ^`=F$.cF'D_È?sNQڔWeNc |o# _H'1lF<5_nl> ucP%)(AC2 c1v`v{8HE(aXw>zuEs<<=QpE zTz\w_u3zC[A>  xL#@IJXap4 n?UL+R<جF֫-F `.G#!ͣNh ^NiN]2(FjIYXͫWO%R$ dp/ɣ,قG% 9vF6OV5CJY8_Mk1 ̵C99wr7/Y]9lT7z*g_Oɞ8Wyd؞hlR`P*SYdwe%À/@R}Cf mZ#jYFwr߷]|sWU4zʫ=U^W] g _0ܥx#zGqݎf2:Ԙ$UiիJ 5pk>jj0n'iѬ"+G6pae Hx>dk*նU͕u[U͝GyJv\_S3 ϟf>C#vbN7jIjf;S$EutfTRH aFn0ԶT˄JX\|C! GP ( hz*)Z]g@tPh7;RI4gFHV{GvޙSӉd#S{MUj'ڊ/ƙ3Y\3eM!/eyZI([G5Ps{nmU v(tQ]s#=(5vw:,Obot sguΡ`[p;6SE-&rF2` ?Vtb'sa+ߙ_tޘ5cey꩐PӡgGe P2#s窨er۞ V"yu,-;o?#cuA;N{g(/|,8Pֱ4ٹWt͝*U^iCS)Yci\$SJ6]{ {IzpnEJ4u gRgW6ySTe7OJDƩnWk?vY1DhS<:̽\ Grڦ#ό_PxNk T0,;$q8*YSn|p9xt+0dbђ0/53> Lpa|Z0ڵ,Ju!gTVm+J:qVO#3[~:k[ʧE)j>ᔥrVRD{0 /-/3`eVN9Hs~{0cx?pw*gh\67TȖrJ~{0cYa];/]c Q[aPGSQqLx!h2YJtέ`}Ky|Ύ+}7HGQƄ7 XaQh7V6*F{pAs;WG&`ewmev+_G:H5N5Jǃ J `pU ()^lUXп;`g_)ج|-JPv{y?F!lS?CkJˏe6}'z0纝J֩_]WZп?`XMiK6psG=`2z†=o),G=`2zPaMni e`–7Jh|e47ohf=JW"ߍ l)+'-6dRՍvc)-ztsSҍfԝoVO:2^LPzZb}_AoWP~|`-P8}@a;%7PX)aB0n (_S `V;;X4K,ͨuh-CVr@Z:Wa7q,V3fحpH S7 .{ Qy alReC^*ɹkn,}}+H-EX K0Pg>v[غ*1R=6ѥ7A1[*FHo *{cYa7h sd^yvU[F7.^0S=m?w-_WVL%HU݊ )L/+YJ)^k{:wvmPס|;ׯ5`#{mfΥIC9"6OlX][^5ޥ+,i$m]# jܽkᕷ 0oo鲙c=DyE.Z#؋EޱEF × m(*VTT;Ck͊ӫuL@0+ 7Ҭ]6oV j iK h ZJ|k_6cHq ݕ#~ ^ܣkV-ZlXZ2m#y,l7yvzca˼ ^lm=~*E.gNşYEˋ=Zte^:`l\k%Ʒ #;~ uvpfaK|gd,6 aN~ XU zEb* KuKrF. ˄m7s5D:`uYYUr^2 K[)K1WFlRMׇ12U" HR(}N,i X)?

G[GxtrmF2`6îT6X=]{>jp YȤJR1]NHj`Q2!Nu=$IO_ W&C*EFl(ߩ!M$|_oǰIڪ=RN7̾lMq0k*nl?J5"@= ߤq8b- j[no?ReR/6[ܮn?{͖) S2`g[MZ 6;)#WHi3F'E&6-"ѕRW*GgBl.8kSMW5^np zȭ8P%sft͡{ nԤ'z>]Wq>zwrٍo; ]& 4w7G_Y#, ms3Xm,Ҭpa+a9ƺQ4:e>Jf; f4r(*hEn?뭣NQ&o/ L]|-j%]eKSm?m`v;/V?mupfEF]e{Yw옵ym 0vCkRͰ:KKK/6:CZH&o!mvw,Y73/ Bt Mxp֬S b UAJQ--N-ZS "7 !eؚEQ-=(:ڑEע+^#^t" `1l5xo0:|l4#y$|2Xf2bcU%`ĂgTU!bW{W{0{ ^;_*6$ N=SRmw[)XnpVJ#Gn֭[k6?t1”`Rq  ~@R6ZþSb= AkV c՚@p KTZ͓vA}1Bv8Nx`VGU~ 8A  O2*ZУ3{x^w򂘀7BNNFo2yA L s~X+Vʀ`Ą sw sh`G'*Г`} hńDgEQNv[Tn`DED#Q;nTHL;zD$1Qǣb^ Tn52A#p|% ȡZZՄ&ppZ .CB[T6pc@?LiiBe\پ%J3CHF  61Ә:JK?̪m,d~ў`AƂ 2N/e.R-X6jcIj M2\]^`e%G+no_dɒv%(0S+m#RIYrɒZ0W.Yr%X`K |5.A+!j5FSX׸%@/յg^z `վ.VFU A4:VɢS[qK4[HegC.& @){a#E0a6\cIӊ7bfIڈ ,.Fo1+x6:_4PRZZq+-b"Y{18ioqxa@zԎWMJJڛt=xrKA{!:Ii“&Gƒ&i5VO[|R|< $aTJbGy *F ×mH/|qx;f+,.9Ѝ1IqOfC5x %..KKő040*LKtЯ7f Gڧ^IL|%W0lB(}R//Rc8|ްaC}p$'ډ/ Gp fq7l-;J!3}xn؇9Q zǠ"-gٳgkvtˆdagY H1g_;hZ.S^@W"X^ёx"ggwxP|9X*aiX2:__Q^zY~}9:0>L׃czH:<9/up(Yoc+Bx&YA~1R*~X^_ RzXŸ>ޏUT|,]_1)~ X %XZZ~AF#]sS '|N阛˕isχ4˞҅SQrlS~F4MSܬ^ޯOMm<ɃaIl;./_bGCfBG3w/ nds*֥ũ|~$-})+M JD_*mV~.޿Dwbrug=L-xξ?Gs{Kޣ˴6Ȉ]V û唅>{ҥ{ S峞Y`9Kx+O;Fя2" 'ֹkxWOuhm0ᐙKFF/1MFGu? 8Y׍ڦo03ʣ];}(Ѱ~۴OQjڏ`XH`!XH`!XH`!XH`!XH`!XH`!XH`!X`!XH`XH`!XH`XH`!XH`!XH`!XHO B,$ B,$ B,$ ,$ B,$ __CxIENDB`PKwL\0c >limit-login-attempts-reloaded/assets/css/images/sprite-add.svgnu[PKwL\8:limit-login-attempts-reloaded/assets/css/images/sprite.svgnu[PKwL\F&@@9limit-login-attempts-reloaded/assets/css/images/start.pngnu[PNG  IHDR66Ej pHYs,K,K=sRGBgAMA aIDATxݚO^F8Gpod6>A  ,ZݡMjXcF4E0-5μyfT G@NX?IߏF 20U0> W*:co0&܂LRi gkw7xۀ`4%1p>ajdxj!xaC^vzOחgdd X+=A~Յ酃ѿlHLu /bp/ݫ/WH +PL`ғq2[F a>_ekBA^]ǁ륿!m\`[% -E3l`s1Ÿ5ko}mi>?Cyk ̙Mɦ00|x2&İɓp^{ LÛzaA{0cD ؐg{R*E*  ܮEhulo`SjbjlUZhcAe&ZW.OSŤ ((qnؗtnil,.=(l}<u޴v-y]KB&1nϚ0r|7n;2Ǿ5?k_FyhLu[(h E 1EdPj*rӫ"i_ $Yr *K~7 [ v"s2c/X:x,+kMEj;+7KNOFuM 9lp?YdvOs[Sas==3`*sHnB ?b5͈O&AeZ(Gۘ?NOGQK7Hpg { .1 ; @rSxWҬO |s=r(DFvk)+v۷i`aJv#Y%vh"#[7qqGez6op!/ނ,>z{IzL7U 鏌dۼv=Q;1֬*R&_RVEI>9c>m%Z=VBoJLjw pD1x:K~{07d6$2'#v)IwWo1a/3M} LpߚM;M)RM"ɕyy.-/o^Fj˫閐ts[kuO[ hR ~>Ah7.vB ePEX&A)XgM+MeDg&8SV߽S AO3B?tBQ'jv2%N]k 8%ߣawҜ b Nװ֮0-lLZQ)kLt0(2m clMaX/ͩ 5n:f[W']w&6xۗ h{,Y-nr%K7狛6]E!*^v)-Nν3}S~9}<>|Dg7\J{4K 3tfZޱ`7u7Yɶ~f]<4m*<%%{^`FR l8<Oh8<Ok2n6cL`>]=u$,`&+hk6J_*|K0?@lxdom]L3ݞߌ0.;TE,;4tMOmPLUA&e+`8u]577~"h8<Oh8<]C8YsZ}iA ֠)ȞsW.!m. z[#R䨚 \R{v r R ?˝#[|f`y)A-QN 4wϮ:Kr{河3ZP!0t{l\YwSnPIA.Vm-R $ysI@;eغX.vYvB n]gWcVn*ôyT=Mhpt +3 '@ px4 '@ pC`=x?.jlk]R Q.ޫ5@P,[Zj6ƵKɟڕ[ ,P/5/thzG]Yn!wk9څR+@K tťa.mKu DM篂U!LgK\At$VrX˒`LoMe/R+X.X.]L]Nq%e7w"< ּp뻴ʩ@  uǤ OO7 '@ px4 PdrvM{wQve{Ȯ]0d1w%L,vQwqyyx`]jW.!WWl/D3,v܁6]iZ<:IݯtM~9UPi!snS!QyU緯lJ Ț!$(7-/ޮB¤F[^)F#*U$`7\!OUŪ3ǐ_J:𨃏ܽX6X!|.!}t$ePROQա/P[Cmb,=XA!tho14]Zh=Oh8<#@keEٲM&IKѢ&b04(.%thtIH2>Dgͳ]ݢ@NE]hɟ|T=m5@ .#BW2wQ׿¨alrvEb)n#ය݄F/N6%t]KX" nz"t.'`[A-y-LTi rgW=)lj&˺;YeF,6CG_0l;y1|5'@ px4SLT_ʿߐ:ADV\cK !e8L}F{=.y0~w,ݭ9^n gH]Y,b}H!0 La4-Uڣ$R|crQx/a _seRmDz$V\ 3<ɔ0㗹1VD#a=5!*,6~ ^#Jt Wg{ȃsd,o9X1 ?*uuB,=`޻'1l$[Gx4 '@ DΞ-z)E}:g˖ gÁyk>fiNa~  ɏk`.73PȸҜ;+ ZpMlbinFݬLپȓ4 :a.0JN.pk8NPx\lh݅x2iǹ?OH5M@.K4p\a/>ay%^zU25O'0VOsMR4"0VܞFqyYEL0])PK~Irx /Qs*SL1fn>6U4>i#\}cJjrjo_u8n,JFgyFk6a[0y|kS\6 + )L*g EDخq|Y_'-?Z";<Wϼ= [\IL}‹7OqX 4<z7=~CP6w'ƟL~*?7ȳg%npMBC{ L^O2;C!-c%DP]y_VaX1uҗEc_t'[PP> `4B "O7ՑF3 <5ϝ|B.0#bb],ҥK{/QWܯd0~.ꏜ}eK Y@3>?_"X,u5OԘ(xsG4DI 4 '@ p4XNIMs(,ѡކ<&R=>@]ZG^ _Hk|p7rFp,/^>G-B+7(z3d-A^'qzj z_`I:L0T|aɄ܇'/CTS̤ U (.2Rr ?< aGBKsRƔ[IlcylU_ɷxO QH1NcӺ#?5f4ߣ3lgGAnjԄ&"\r'VZvD)ykCbW;I[‰k!fuiQ*tWsN_~W< g)'8}ږjHzD66Dkx3?xFy znoO+v,bcxsLwxtnGĝlNn2ھIOΐlƟw g kг=ޜlAl)l; )"W2:-.H٥aq66$\0oqnjcC[Oh8<O":F@j1Xg dbݖ3zELHWW+wx0- pxk` px4 '@ pAܣDkH2u]AzwnPExFyAum 0F0bG:1;L6|CGICHRݿ6y~˘{o}@]Q~"h8<Oh8/~B P-d׻͒£"D ;R򠫹 `d] a{ -+PS#R3@O z-̒ ¿rvJQz`W_9HGx\EA2͌r͠&~U>wS[Σ- `9'C~ C@eCٹq_ XzN%tEXtdate:create2020-11-26T11:59:23+00:00T%tEXtdate:modify1985-10-26T08:15:00+00:00"StEXtSoftwareAdobe ImageReadyqe<IENDB`PKwL\mh!Klimit-login-attempts-reloaded/assets/css/images/ui-icons_454545_256x240.pngnu[PNG  IHDREr@gAMA a cHRMz&u0`:pQ<bKGDE;-tIME 5sIDATxk%Gum;!^pl0[HXȹH:w8;g1s]&<Clfq؅!,"·Wu׫{vGwn>UUuN=ΩSx4g : 6!Agb3 6+JD0&s؇N_Bs&&ڏ>~= c{vj%_DYEF qܸG RSơCEہ!' NP)~tϷ=;wהmeBH{s S&S6MCP6z̐!(hnE6VjնcO6y7iʶ~fKjڬT0<26+^;4~%pxh84^/ :2n6eLh`~=uprn0sOs횶WrGh _ Cmz-=)wFi#@u-cթPO{Ss˛^|BA'm TQn`.[ܫ |Եt7^p @pxh84^sC8UkN}A 栺*s%~aJYT}-1pTVP%%?p(>~PA.E ]1^([#\ֱWRЃ>4j"mhI@I>]yҙA6E:q7n05AuPy L8Pj K9 [EZ.Ȫ.Lu֛L;Xt0Ua29@às_!_ l84^/  @7R?~¥\4F>R7F{VCl9wT.[)?}ڕk Po5othz'\CVgskۥb%@6[\ܩ۶`6YsKݞs7jAAnX2G?1R6+u W@P"[U|~mm`3` { H+"ȤN=Mϯ4U `z~S=n0o粤= ̙hJ#[4ٗv4`5@bt n0w59-̩B(X'[67i3SP@  Ĥ/7^/  @:6U.EowsXE{LsUXcau7WvR҅l~٭Nv]h;Іi;MGC'{I79J*F ͦ> B\u}A窞o<ȟVaCHP"nLum߼]݅=eMFdUf;Il;:DCߪiŪ'Ƚǐ_VL:p s/5V.~{3R[IAH]$fCT5 Pہ(Ku^([ݬN4]&E@.`C5oJ @pxh84'Җ:6lB'.D Рxw5%1\U)F:Jm^[uRdTwOtI&~|Uͩzq;j~đ TsD_S>ܵ TG4m5'W:m" VH#t|dM‚ nz: um?bGA-<[ez#S/\хyDV{+ @u6y#L<"<]5d lj&˺'Y%iFbgJ AH} P=o2O౩pxh84$Jl_ҿAwp( UNQ߆'$kLe>Wƞ%ײ:RfQkb½?.ux8LPr07jNװOfX˼I\99Tn?S#Z֙kk@ g?mbiʘ,kċr]= JOE*We~ 4 -E,dN9wuʬqw>c3e|qEwKځ3%,y ]Y$p)CǢ yR<KۿK}AHD`!@}Enevp7/ 4shVTʉXJ`ג ~\#gᅑ./T!Ij|*<^T@+]uƜO eә"O>^(/檜}cݾ~["ɯx·z&$u7@L&ir=G g jw)ZLZsܗ~M+@>7pZOI'y#GSAS^zUK! ;4Og0͂_ ]%=e`d ԣ=K?RPz12Ӎ-x9uJZ[Ԛ[@byvp#ai.\wiC#Y. ǵꚸM*R6ȩ-~fZ>Ohզ:as|3|*f0S}a?~oVJ]@l,5}c×%ESԸՙ_T !co `_Xp j9C>|"qOꁾKt͝i' t #{P&rej5hv^M8GE h&]@X֔AfaJɂH*_VnX3ug<}hr PPv!o[@ [DF- 2)oCOSP{y#\_.1C|ܼ],ҥKY단Kssͅd w2L)߰O˾e+'HL$1 ?Ѽz>!0r>:xGtb*h8.pxh846VtU9Oyw莇!+IT .ZvZF "pS΃ѯ?!p !B|5CޞH(zzi8[97Q{ z_b:LXTO>٭E {R\)|er}o+BO#/}WH6gvs!Pf^3d"#Qgh8la0`XJ&ɂ`7;a E EO8SҿLD_:Z Qz2*T55XQ{8!WfS~!a89'JHSle'@&3YE,_ɷx1O WP1E#u3jkEyg\iQbp-; ;ť\ {ǔU5e)6ti,UJ6os&X!؉N3˔A! :)OFH*V3 9g[yTΞ,FU &_C<ҫ(_?(W1p? OW p!3J8ҨoWd'`9MYa,3˳|ClSŦ.׳wU!ܟzBļ:b ؑr@jvx_ E4X3|8Wi5gqqp/+3v+s+Q7].v )gp (6G,(6G ?Xd ou'p0M:nCfF/?>mO΅ؑT^rR[M)<#5Ќݤ>;rZs[{uY0c?]yUm-~/d|d7?C e_>DѡWg>iKݑX8ƫ "Jfqvqxh8 p_]|-Yw :o\+ >%W7 :r.\+tW#*Oԃؗq!TFQu~rÁ &(_=q~}`_ƳCN%EHs hkQEϬ6\PO6/I m!ƹClg>҅ 1O 6X}G.M.W@@,TKD6k,s?ofR"vޣMt2'zlY=@'Ӥ>U?Rω;}]q?ko)\LXfӜ4X jJĽAonLٮg{SaDVf2n2tdcj˚k$ Ongyv'C46ާ~4=MI3dF9ݑW= dH!R u}8o=-p`$ ^/Oe4VF/X[II V=zd1abXC :oFE,(`p4lbZD'OWA]4RCC-yЍis'/US$C C#\r=hLݒï6^/  @Ñ[D*-> Mk_>zlIТ3,ruX(+d<dBqv%^IgPY=:-*%]~E#grboncLE8ȝ6ΰO;㚌u5>zAC &C&gIZP bsb/p.o'G+o^_n\! 噻/fvq=fJ>yOeĢHES|fD<`gizI>7p5SZت!{y{~=4@#˹5"p@yU8ZSq ?*66x{ϖ/  @Ñ <п8~o>U8/yu67s|Wٿpo.P<]ץƟ/Doz7hz ! 6*Uyjr6~`oK?B?o˿9iic.ͅ%wvms%]\7}U]7%~T_|JOvh務Ѹ[鄚{ [@+r.~ٳuĭO"2#f`Ͽ=MMv7Q}WLZnJߔ B &+$U= ;T=(r/Kj +oد~jI8&e 1Uyz;6~hoK?B?o˿)~yUY: uRXX ^fNK)Fi޲i~o8KX/pu 97:dس~o! 6^/  @*l;ݣdmxr ]1t(XnM^ j!!/6nt1P;FXQA^qƍtCTxDqۜBk 3||9/`/  @pl]h^@l!=mV$! 3hZ`꠳9 `x_ akݞ=k.|!,!ثØ~A+l[U?d0ğrB0_S<ҥI_~?CWS|3ȇɲ_>Nք(az X>E=<Y=kuo UX0%tEXtdate:create2016-09-14T12:30:40-04:00brmw|~:Qaeޏ[tۃigiy}Xp~|e{jo|oِx|W.9Jogydܘb`>Yiyc܍dܘbtsbc݄zmrmrW׋Iqwi_j׆gՂ_|ulnЏ}e|eq%@tRNSS%EIDATx `Ty4H腪IzX4R$dE #a=)Y)U@[CG6RB`mk;v6&mӇnm}ܙ43ޙ?wsI?sϹwX,(,ŠX Ac1h,bX,Š4Ac1h,bX Š4Ac1h,bX Š4b1h,ŠX Ac4bX,ŠX Ac1h,bX,Š4Ac1h,bX Š4b1h,bX Ac4b1h,ŠX Ac4bX,ŠX Ac1h,酎[ ::4Ѵ[oo~k 8/t?cL ߚiXᵵŊjkkZl/ep!QiLt@Hcp],1~#"_J٫r*-}lz_u0hU8h5XR f ? ~@PQ/*`v0c"67Ki,k鵾6j28F4>X@`  ςX,ǧ26rCiA@끒<aImi3Cp|SǾ1gyti 8{? R &/ oLSi0x4k>A?5G mh7-pd K͇MZoQ(,k%%T,!.% 5 3q/;:DUBhW9fHڅP5ARLKbC*< hwg1h^i[r'3y%%KJ~L^ Pז]H3L)ڍ[慓31gkN4{i[vnݽ{(bRek7fo[IY{i}XԼ2~v pqa!0SX} s$ R!]XFµ2!" + !t5.|ʟ)^)B^.E{1--|O@FXĠyR{83Z|wL >lJ^Z3(^W*_"JKJlT yAF8cɳgj_T:reJK+_-Jɦ=Y}yE;gjD{+Ch?]^X+_Y^xWt9\yw*z|׻WRu,b GKC*r9VHWyo/[{[[9yvKnp녶Vp Mc:<<|vFw/v X.z"`SwkAAAkw7$Q\"ݽةKԽAlSgfM Ar C+BUvkpFڵk*qZ5OK 4OYT|&O>؜m^ 6#,i76o 6)Ђ,m.P>i@$t* 0hӒYY0~ϑ9mɒK@mdvH|k*I%e͢XҖ#)؉%KbM0Q7Kkb4nqnH`bЦ>K{SHT8:  8boι{Uh|`vA'Mf-'}HGD1SIхXD 13ǩקxA̚NqJ.?;s&<ә;2sS0` ## xRE6"^#y6IksiSZxL ڄ:boqTDc[&mr:(FWȈ=I̜+99WPq3FŹ <mRhoaOyp̝;w;J##_\2VHO"SZ`7<p ܁mR=pf3OF"h+RцI05FBYPU:ϝǠMa٧9gcc&qڴn Y6R&EP-͂&g&!ӺIqj7pcᬬMYYYc6dH P4Ă ;LF(SF8f5foG5eE5S j :b c*kjl ڤp=I23hxeR"ӟȒpȈpb=ڢ'Ҏn|㣛 8oz荀NF+t36Fc>B0zFظ>DJ7n#+`ظAsO)-KidcaU+$X_ ~e#P_A+_I*#fOU8=<'#oWt4m~;zoo#VEHz]$}/PiXզL yE'FwA%*)*Nb^TT@hvP-z6A(h/XTD{Ѹ7z-o:n9z|·!!!CPBBBB;P-v@TB/h\$I"QB*B >ٸ'CoJd/z9$4 Q`}9( FB]nhS8Z5!%4nE 2.96/( EB.eLHQSMw>D'\!?(TcEVD *mQ.@{idД&jJRz3*ԎZEwD&]wrШZ-MiwiQE!jɔaQے`F~Q_i߹u*-FM: l_߆ީ;E NT%ױhdJpOZIUUUϴoVUv4&UQ1}[{NਪZWa(C ;{{5e0{y>C3UL$XgDaM`Gah(ܠΪIIwI/+ 62\q1b8))Z#**:t1-r<.vSRE0T5_:6%t94"**"""*"* 2J+5e]`.܇0 HRZܾqeee]e Ȼ"(,{DЅ$_Dtuasٟw5bt6v}+w9rss=` \hn..e{rs\rˤ4ee(h\0C@ٌmmn~"\>lmO3vp2枞=CH X-?rN ̓&2Xi>ۓx6''jknKLL%bul@$ $&F4Kwo_kγÍG23L,Q~Y<}m `[xQ'#qm0hX}hčN(jC mkľGlE}Ffm߾}g6Ƞɋpw=I$LΜ< QEۙ3PYEu@G߬:YЊC WP5s B ++4yX邻'X~<gӘ$bh֊YԬYT5 <,Ƽ}7@. =53`vaʌ=K ]˹;9Le|̬c ֵ{v,m&}5]f. d1'R=2:m̘i4 =unt`jA ( 0-MD-?AsgyUcJW4eΖ23SSF͑Ĝ@;1g~MffA3g%-AO}FäG_dES$-= @wn] jϫh4 \l@-x.lB7תhbҙriJSNUuT/@*7TʫXxA3hJܒyj ihZXH{ u+K|[u@+ZYJ؀:YTEҀ:s8S#&`Exנ-AslZ=h|SeF^.g|L5|U]ڜɫ@yCu47J .! pAc4Of`€7j3b h{'V8cИ3A4G%@(_ Jj4mqW1hƜ1h pƠ1g ?1hƠg s R30g 1h̙A2h6}ȓEƜ1h pƠ1g ?1hƠg sƠ1hƜ1h~ڹ1h>=,AW<1h>34i3Wz 3MǤ3M3M3M3M3M3M3M3M3M3Mw3Mo3Mg3M_3MW3MO3MG3M?3M73~^H9g M_#'M=h/$|Kp4s3pkKMϙ_Ct3텼 c@K /?CW/_i\u6- 6h.H\8\b61i~™MkUzD4qnS-);ZZZ,h/ ի8f>[44Fj) ?/ߦ' Zh Y p!]OvhvFղS K1|14 жB[MXhv҂/١j9:gv>/=6kllPzZT[9H 7۱g ϝ NX .P5{0-=[v.H/JeF-1~ [mhKpxŪp2e)RŖkx?n͞`KN@ Zgxoƻ^t,hxvנB8k43cokZyi߁ԋ\=mj4ihٱXϭS}̴p_G (|)=x@ fgFT95[8 3/d{ kO0h O5C e)m`]kH3Nt`65q݂6DAL$JVR άfxR%NPPMD`WZ5җvU<)hJJJAD&A,~LԸ:gb=O:6Hh/SW",g)FMP?#T}wMG?&C5edjfOݒd1h.OL}3){P3i7VдV$k~lm\`^Kywe_i-aZ|] E @[%h-܍1hjا+:Y!p-M = əoM=DY'ж"JCp*D,sܾ&>l| /IhMWB 2VX 통"Sj;}8n}Fg@ZX*%Eշa A៉g13|+f`*,oWR"VJ5Sciw>q5|͙}u<V0m%R)Jctҕ'x봾N<tZ`D(*V*Ra?-<];™M7 nihH#(!h|gʌӤ ΔӪE6oޜ9-m3!d]@;:  ?l x]@sC;yA[RZ!^K6Sa $$;82zK6gڀ3C+Ѭ=@&jK֠u V Tm^Ca'i4pi| hzSM4֚%78l3Ui~1x\ w6@HG)N(^3V%a7G頛'i}Z2.9 #.\*Ν;<8KK}rv,; .'iS p+q;"qk)9Svr^q`-qܦ#Όwȳu-a7sо88%pD<;2&Ek> -8*™qs jNWћhLx\S#ur607&lA10˷H?+]|e~O 4PRpx "P슠GO郹@fbt穹b6@kĈQ@͕$5njT`F(!Tӹ_s'"bd4~ G@۴iYMgaHXacVVq6 zi3x.h˯{q WvN4 Ɇme?Yф>AxCSc6U*)&h,LjsʠF(5b Íg7bYBS,l@FFd? eۓޞtjK-]4lhAMVaxA l`FYaQʦBev/@廾f보|oL4d+!A% Y70KOiW7ݹrI& J(jT6lBbs 葍f9}3ŝ\Y\mB@! uXCD6e#s ^vCήTX߫p棩r~Mu5VUϯC{C#p󫫫O`{X#?u8AStp##P!hBc|U)Lw>c(VχIs 4A{J7CH!l"C:0ϧL$e5u'1$ܠh9ZnlGAȞUϏQ,ѲA0=ߤs&,ƕx^#$nms6Z@(:#AdD?qT9~M;։aqqUn} .hEh 37beDc}~tƌV"/@xÎ3D'87i6~Oyѭvzp3l Yr2hBg#*gF$ O4qDEm#nA`kҞr Z'.n3*v$#'5sef@:(B2 no` _VG ق+I4?\uZħq0.5sf[JB1P@A`hH,!""fo(v D7{:~fްٚ2JV[o0oGg"QS6n@]ȊBB^a7|N.x};]?٪$(tﮢѣTQ跋 fȩP.jzcbJLv{#oytZ|xѺKE >в /r'Ӣ"Q8Ee:.l|?>]r wН[tŵT1~ߴ@[|\~0Q A% U Pj} Nmt}7s_:'Y~֭N9h[u)ֽ>.g@/*TA(*T%6W$WLC$/vDE^L 'j%%[&~Z@ GΊ-**Jƶ) ڰcTCG a?%'Ytн-xݓ&׏2wvN[ v¢L^(l9y;L^ιxeU|)7cxZl@P<LDQAΉ(%D/y?yŸO78EdhAם;`y5zQ;O;C>2QzD sQvPQ[gt=aH3h,f[JIwbh||πE"i M~JY29>ddC$2GP ^'-vc%0A9`H#R$pq_C(%KRJQoK-;Կ#Mb,u o*qI}G5|V%&;Tls%N7a=YImۤ#DY$$PA'?Էn7{mڠ@G;@@%SUd!1ɝSU՞ܾm2?:ۑm m:\m[6pt?5@ֱi=(dhdjlo6:;_rKතPy}_rg' $#hooTAW8pm &gԂ/dNM}#u"Fi b*fRUEU cgpHJ@ ~Ψ:˰Cc狞nDHg3 Ԓ5$U33IIIS"C v[3 ;$`kH2/0\0nU4\LgDUHD-&=LE4# —tLfEgP4jR5=v{ahwNJRp$ bR0E{&ʢE4w^^9i8ײNOcYZ R@[DDWE1Y0`WEWu rDu8Wlpe RZ4~f#9=-!(#6a Je]eRUe"7,vaх;ˠ=!WYRL 'o|ۗ K۱5UM|OA+SVVD!bePT?B;5v \ъ*¯K!2*NJ>Čõ Xm."Z!)++=dѾ^$7GV&EL9-/UXQ ,rRf}L]vs.$9{_Vр驀@3iռ`!wO \l;Ԝ eD+ ,(^͢W.1I3(ܞ2mA_o>!m:z'y 7x>Þs4p{\ yY=t'8"zdE?ĔPw{?f 1td䐦1l䤹9*RҞ$@J"DSbOn'M$Ϟ==r?5QH:O6/r~_?w K oԂ i -FàD@(JD{МijX=Kg$& 'Kl> FӃ^=glƣ9l؆I̳BfC hZ6!rhKL|#lYes"6$Mlg)'93@W=Y&q̽F[3 7+ <moz_h`o'A6@jDfZڱMgr&zen/mmm& 6`|С X gJHh:C(h T 0A GkK>`3*' ;} 9VO$8!t lQLƮx/(:h3J[$2 3C@ w"i$'3WHEã`HEAJeDd*f}M&.nxJ@,h& L2 }3|&Z!pQC$@-`̌<? b Ux'2g6[8at 8zL}&\@~HQ Yd=JMG;'$4D_06wK3 @Tȣy6}I,q+mx4"zLO_D3 X8BGe؉HQGz[z63lF }zE-mx4[^ ;kz,e'dp8 _}_(JGfOsqľŋ3ofˋ`K:<$ {|l=qs-^6*U:d=qBp8 ,RCΔiAM&(|PYvBحm_[GΔS+QU^8io&'ٓ=^_=^'0Ğqv | <>%G,O 8)~1f!oߎi|1H{ ѓla=N (*\o'"TߎP}Mf,%o8mQ8q jF%؉:\=.ŋ&x8lbc7tcE8LY5 `YoݏC>@4!qq"1V8=8Gx @ȼq){ɸ_$t>p'p@ݽ]V\j*r,Iu`xuWz<'%*W߱6]Kn+Wj==)v'(8O+.MK4.LSjP4Wt.y&oV.A)<°e˖-[Dl&ءВJDB_$ Rt)!244ʎ9 Ԇ-HN|}3μ "IѐONLZRW:7:bN׊cMwl#Ux3gjVHЊo@+`B8}#5 `l7x 8ļ{6;63f%mD @ef:Rg b"N}ǙO@Cf6f!I,J ,,LW6S>c_to>e !g>7٬YϢ  \C@r_)g PE!Y5 e(a>k$op~DbLOԔ3| 4@ l$=Q[YT~*ʻ Yߤm֑w3',F'[ݳb 轠nr\A>=ޡLL)ع[63E`o5{834:[[įe2e˔4YP6D;A|4 P 4k^f=ሙ0i8{6ۭ"9eM NgHAF;n-[ٲ_|'e_kJc L97OVxxn-@#iǽ[ -k,!J#PxZF Kgjjf*|{vƠi])&' យ@<àiY&$(j0:TΏ i[1Ψ_c_`14xjP 6?[C=4 xb{#,c7j1C0hXGR;>n)H)`﫤VY,Fm J 88ppH!]U?}"luAvH^L'~QpI$Y{teeYx$Am$ISgoVW}EdIm[ eAX aAXaAXPLL1D#$I$I%$!c?$?kAYF̑MF2bmsOArPMʠi0>w_?Q/QŶ߲D@0D~Uw147V-{ֱw4kG)\jj2|2؇:O4(4?ok??߽6Y+#v }IL/tef+ʥ=տ?}%? 08ۻP}k>qu u*5:}8DLGM Qѥɺ2:g6I.h;$n{#[CO7(\,3ƒ:my2q_SRQX]!Q^̱!ݻ7n}a5>B!G-iӋHic[4!fLpWOׄʊO2-Pf9 |Ƒ8e&7p̽K/,Ù(Ѝ dM\ck`àEu lC==dhw񿱴gKq$UdE C?k鐬A$Fi`-jEڻL=Qϒ׈a y SєG\mPHDf94 chL(/bw埻7{l4O6L2 sXYj ; ̋jdֻjB2w ݓ>v MH\l IiC@:8$@_̓;KQg̚- Sb3irq=.N {>d0ӄ Qc60汃kg\hGH 5sz$nK36p᪆Wzp{5RL}N?5D^Zw?~c=k#Gd ۈaS( Qт@(lj? [rEsē:Zmmt#0^#"-O=nPuQs:C5GY`ݲZ(,Iiuق4b0,}|!Ye h0H9ރaQ#S龜L⇻ݻRd/ِ.CCgx6 *0}{j_s osdlc9w]^luSS:R]uH%N-m/|s{apӏ^hPkQl{CF / <={,dRrx`pH.{0W)GD5#a0BLdD?.\.8DJ68ܽ=Q/7փ0`S'VcYTOѦ8'+4QA4=od?=%ur=g =?340YtCцGf=xٷͰ×l5ܿX4Cpӷ%K \C-gpA*.RƩ+Z(a Q}m>`Me<k]դ$GfBBd6slbyMj@iGL=,IK3I.@ p8X)nFlr% F4DjLHH@ RQVe7: Xah]Gbhx`5;QդD;|L5U6 X~~']:ctaxR:i[ov4j~S>5;VϋJv"q,m)/GJi9cXU`ˆ{tz@ %p5^fۃt=xI|| ?bN9A Jna܆ Bn;'JuEe3=wsߨDf6Sc1EچPIB F `=W-uQuH[Q@ۘ~<|6`. -T4rOYb㚧BEAA+/jC;J߁:V#X7ŤI܌@CM%] -,BMqmrKm6`*q!27Bbޕw)<8EiAI 7 =qi FÛGQBpxĽK =1-ᅴGͦŢC(bq-"&&m"cC+)Er#ﴺW d v&,4/ = sޱzw{{kJc x"4 n-/ {M׊X"anpj{w茑 @; ?|esSy62SⰘ9 .ƻ?vtFS2H:ft"Ih0%8dI5PNG@w<9{o!)"?߁Eh`4i:i7Blpt~ZKnxO 1D@Ami ,d6NaXjE[!i3p7fxϏ P)x@8$ H7!_ehbc;tpwJ22T$j3 σ}HE[s|hp0ރKp߀6}csC 2Rd2>V ܁*[DV8+ Ԙ\, iFƅ=!( E} ^mڅ`{xߋu$)fYT.R5 _J8m"߆P"p;/~Ro0ݣCLD0@E w+h & ^`|kˉhO!xeAâ1@ m#rm2L?@ۘݖu^Z,bx0_ w;p?I"bcl; | b~rQ qnA@0(;pwXTdf[u{m%{kS~\9\q~K9 cT; /q@)qGb30aOoۜ\Q.[wJ9߈> w Af6m iXZG[ExcD(;7cӇ'ܝgix}#/Wgs&;};ѤśG)b|x1=lny~Z;)m{{Y,Nc@)!Ŋϱ6Oud:39Iq^~\Yϼ߆;w -'H+#OLf(/u>{s2K×"@O})$i=tq/y { ǥi,Rqyo!n [y~ͻ鹧ܹ]eD("k)hp7 Rr(_RZwGa[!ʌul#ܯ/i;G%lH !!1$ A$\Ey cWBBۄ5率n=~rZ{Dx֍%366 rQ=|%lŒֆ }u X3;2 K+M~zlc 1S'x<6ʹ/ - 8=DnGc{-$ش`-QZƝϝ-ψ ]ee&A4&`ppie[3"ts_̧7'1uk88w%-\ǽp .KC]9(8CvZaY#N`U> yMܽ'Ëw=:zañwû \DEW4%ΦpuNyUbJMXTN KٽaUbJSzϹun} Vc~j]Y+vYxxx_6Bx({BwC'0Yir^@{P_׭k·`=۞\Wh2E]3J8ר+`N\|!iP=R޵wsz|{3}}g{G.a}t#8V>隡pH;{J%x?鮆wZ{XPs{N5?Qufc;S8S>2 _w ;}=~ʜ=x4/x\=8v($q ɔXn}Dޙ}*-lX̝#y?#w6{|{OSëO("q$TDn6a.j0ɤܧJt#y='ywE;yg=0cXr43nfN,M6&py݊,D v O7 @#k{q{yw$s]t:Ĝc=8}+ojg=.Y3t2"! %YWw;sNrw@sˈdbx=~1`|rwves4=< 3!w1w;wTMdj RC-d97n!a4$7NԚ-+M&E&a4$'9]\Ͻj ;]aG;leڹc~k$)2_F(ąۤ*92rfa"nvy\_޳sN$wR͔&LO۸|p3aA{MMxGfřNOp}!nww/ )|nCnJY3{GXƭhN#jA2vLY}6xL,OQrRm`+؝Kvsxݨ'6w2']#x:Фę]^AU9:Z:N7iaqZL>L6&SnY]^0ç'Qwӟ8w6wwdI4(mOv1#! -iK:cS'0[ilw=ww. azv;i޽:;9BTޙ.'wNUӚ+b5#蒱QQ)SV]cInd "֡EyF^)nj]7tsp8]Ν޽-}`xL{-m*L#.qN/l 6W;f.M29wjޏw]$(MNh8$eڧ:)8JM <t9r+\istst{ $^dއo{glL> 1eBNJ+MX~9%/B m؝!s -'wFon,;{?0w#BǽVpc(6킈J<=Pԥmw;a4.kkA=>#&;ޟT93wNyQ=#ah..6(3ܞ5ը\;gis܍sn }~,8w .AV^  \KJ5F?$%BHe8tNWwo݉ǤMq C`,<5qP&XE.l-sUo@ Kzw"w'FܭP7 bι{P ; Yw*U"08-R6beH8\!LCL ~ ;n:LPމGM43gCdۀ%?w N3H- T`x<se-! /ްf+&rxmhޕ{Wh(M3'GƜo&G4xɤÐ9 q鋏y(wxs[&[箽ý ¹bpC3@^q>aF1sBNVÉhV_ݩ 5]Iy'/ǻ9aɬuv+{8Ȼ8+fΜKpξps'tsE "ylL5 #>N!;Q rqe 5256 8YܭM׼{D]:fZ\s5y/Ыur@I|rRrM|ߝ6LS0`TaKDSAiKᖽ3LX!fgsap{8.׻㟻xמmSY6pkJAk YMF1 $˹[.c n޵wĬFU,)/@1L5շ2p1 Kde2Vݬ[؝rsisjW)o{i3w]ݪh=$m]X:#͘r?TRӛ%G3_Ik-Kӝ;g8\3. ]=]zz ;]?B]2*QB3DFԃ#B w^9w 傟);\NWr܁X ]yssg;!й$۞y'I݀K#O2rld`.4?w=w򆗻McB]ǓrJ͑6qW~gS/t%w%j.1rGvNs{蘻sp@-kC͢RP!?,D13%|h#s+us;͹;rq\}8&nI{{y/ UmVA%C (XwNo|- ȝkks$yRN/<5;][-ˎV5]zƥ ZX,I 0z͜@ η|4ȹ;=wKH JLs 管YDDVpb|qPL4Vɍ5UH6"V`w;5Dsns\.Ő#w.cԞW>_ү޲H))Xm;9D+gw;hH  Z}w1`R9wq;܍A;A@{q }`G=")|4@bj"D5dΦϹ[\|mzhh-}XWrT r4Թ}7ä_]k8sz݄"+m@_LO_z2W>wmj{pʤ1F<-'/7j(tv#俄ݙ\wmׄiT0DzJ'ra ss}܅z M@Z)鹋ŝnղpK bJ*BjQGw,EP(s;mŀ ;G2;|HOmXuz M6r2B6]Z:f?*[ݯcj)(?;V{<ܳ&#NCg-HTΦM{j{?Oge*Mu) bm:t wZт?}JR>T#`M2!>$Fhj54?q[@|vڹ,8]Dk=_E/mJt !Ƶ^=]~0H8naoݒa?jnq{QU>lň .A_j[Ic(N&v{R0}/yXxan7&wlxm{T:s߫*L Y&|'A<|>. \#sHܗwh}X8yڭ]S9.eSۙN5E$%o3'UJnh8A~C(]J.jR>F'f=~kyfx(8AbO3j O[Yaa7&FԸ{ i/xMHԅ`[ ag=Dn3ǗRC5DԶpL#0$}n 7x3а+{X7wCxM2*Jf>ӅyEpX)-SRp_>wsqUW;*3ZycbTKᰤx Z8cTMײg+=Ce,a('/hn>jLc>PIڹ /b܍ȷobDH~DֲW%3m#)n)"'F5ovbw~pjxw(URj4H敝Q[;u͆Y93$aMˁ;` VoD#:OSU3djnPN🻓x*ӻq--sL8`Q*d| 41EܱܝĻx*nYҌyÑeIu̫@=IgJ!G*m܉1jDK;gS8IDr-ޡ1]n!w@ 2˸{pݸsq;_w4QĂA3\H^E6de P@:a&^ȜWik\wyG A֓J.BmKNZ;ܳFBn2|Ѹ#sraޓ;R5wS%@qw ~xԢo5~WU.(DL4$58{=snzisGL~INTYDJ¤C"&[K޵/U<\5===U+wc%ݜW&huluZZ7 *?FlOQL4"|KA[3 Ƞ&tA魂0wI"q8I>_|{,jaQ ZlF &+crDג$dƂy wOinzș;!ZHޓiZ:ZHQf @wpoՏT8SA{E=U*wcRd,q}fN3ars45 E~b0O`_!ywOynֵ1~ִwlw!>>!Ww&! IN:^!ćf{"5~nNd:ܚ;.:-Eމ{ b(igLbD̓1h ,8}u\DAY{~{ [ur7Q͹[Jw4{t5l}ÃDWNnA這Ό3\H9]{Bruu}= KN#q9$Į)8,z*GMf ts?45w~׉Jns1I~-NpErX ҩ1%ӵ-!pIPbyP;!Gv].3<3?w͝jU lpG XBȾk+d.eSDlmGS=0(͝u~IԺ1wjƽq'`%dlo> A񔠽oe6:&NR) yPdsZ8SRĝK< `Q'mۙK)C:@񌱬dd:d 2m=3]b@jFm^w;c-+㠑{\L9@ yd4G6u@Yf=Iȹf$牬ݦ|!ݔ=߲qZ9?Th9rM8[He Ȉ\u= 97xowWNcܱǝ eD<|ᐧb/\QF6# ]K,CZУe9s|󸛴#!*Ɲ̾|/uV1R0( ɘMWH$W:gܻrgw$;_θ3ubB>DB2O~yEWL@E3J{ʼn ݓft=:δP~!džZF^h mWp@>MIny|RI #&BgR)7sУHwץ5mdALXabIÐID̋jdw=I(nsﶇeIԟ)i74~*=XJ?㨱A)p(qde*quX5Pɽm{M05rq'dF}ia1iU0KgSGwtPמr9)OHAF^ya⎊Ƙu 9eBssiqVRim\dK[5%6{{|wn^:į})T`]_mF,3hɽg{/} =_wyA,IJӥu>~8LuL{#4ȴ9toIco}#%ϞqwG55?+BŻdu";ݓ -;މ&_ŸCL[jІ&&# Yf?EpG!i;vu畖{掿z?s;fA֘(3X=xʩS^=Ѿ{~{$sdjw>1ԐYcfA3`-h3D :5y-}T쫐q gr H D~5_͈;|Zfa`Ϸg}%sG;̵;U!19>j,L"75ᐈK݊߃4=y"&cq5;z{F.!?lS)a[  $z(s>{A;IgYhoyWFok$ SX%eבG0:"2V~\?{jr8w3 w-Q1v؜<CK yn Q|γV.}?{3EJM玾wQ=z}|NZpF0TY#>,e'f3{1N;Eu;z{Ulۖ) Hj*0%[a=,O)fFwöM6$y")fsﬓ+F \~ q~CΡ!c}0TU`H(Ծ@2Y[}{sFL-玼wi]NfJ~*LN=:?.t p=R=-ZHlt|{Os{'[/# rɻ$`;`<\uLJѓ6 5SJ;]g}UN sG;*w0goHi:LdZcY!Y]3'pnr;֌]msa֥g?򧏑@M3 qNViӖvO(I7;igO;462!l}Ѓ&k’n(Plւ(!} ;|˞ѓ{ܱ:W%X/vZ 6/agorsl9 Ru2NO^!B [PSD֯ ɽ1:*K qrGź(RR5 qЅ^&i@ ; א@ +3{ӹsL+(uD^LZPe_E⊙W$vFSJB)I^͗+fB:D^/r8Bj)vTrro8w콳6u;zŻ`v6].GS~gT&HZ4ڂ"|\ь厽wQeh觔Ŗ̈T.VĈ]m~+tHYPVUXzr7w콳NQqlC F0IMF|'h Xt 41ƬQfsY%(vsG;0q'`4`(,^_7]T LDBKnpKpA>$ Ie{ޟ_Г{qnYNwn$!*V음JjwrPc =Y&qa߂A}ƹg*?9<޹vK;LynYf+`ўba4XZ ͣQ(^pə6ʽQx{矯Ūŝƕ G8j6!A 5qXn{&r~0۪&a;Y$qO c04B ^-O1 7oL^ Q$9")fcF6_*Oy a"mmX! b˾rOt&2y(N>zgp wϰw:BCBu{wzp'[٭zg+G]t{'6&mnG@Նe6+:G\.yOxjRUsW/T'E;#5 Vp?l; | b~rz 8vmH At?ϛ;U;sS>z &E}Aܽ׶X{c?RN_)3]ոHO>3$ġAW{ (%9 9RN~;wN%?+wK;Rl5aiU9:nieÏhjіN xdn;Ռ;,=.ށVrim(_GϨ'@y:!/Y N .o&bwGmPsW:QROFjm%.96K<'->ՆSj@%rA=Ơitܩcw?1<:Kݔ.CD6Q5v|1]B9s)X $D)9I3[Z畒;/qn N(]DΒ !j_5Q l2G(_ӻ.yY*'N6 #|ܹF ha bb~NJBI:cQ8:ߌ%'~r z)#[NF;POp &}GN>LX4m@Lg5P;.ln]#{Zr';P4z愫+S+ӄee!RD#/DBf %jhe隸{pn;q]n A,a"/neJا' ^qO avGL콋;E,#ɘKic&eD嘶985#'LR?%O=.w.)\?dPRB<'?ӈ[e/POLetw[Ľ;%{'{'"MΡ4$"1:z'>zRW?{%{O%wd1X{s")pUtx o~(QtBsT2(g#;uCe$gfGXr8 bJ}KUHylf7W)B-Erglokev6 H\YkM~dLMoc ~qgls}q 3M/4>"mɉDZwxvqg({trHe&1J178`vɕ.&h^⸳F&ZAeý&p'&+>n:DQaif @wL _՘3ǂ]qA*[n@ӓ#)YK|M5`o'C]"@B~4,SH j)*)/KX$:X&ބ7C@ /0 tZiBS !|(|chҢn<ʅ2#eꂼK3¹k]w64$\Ey cWBBjoN#"5"|n,x S-fng+6h7(6` _ܩDxwĝn)eĽ'xg.ɺ {T5HK ɨ}v7J gIR!hPt89\Z v5g&~pRJw19youՎ=d1 VeA꣐Wj#;mqFETty}NSµb-X_>&C,*o"yiEp!55;l&8SbGEh᬴@9/QV=(je]9sN*m 7XXuLŵKayF+Pam +m8a4EՄu™rL&M w:״1pGAk bL>|VX&oyw2iJĝ=f)]Q01u|zѨGL?QMQnvK"yyrmPA;!2M=CP qP8c*AՒ5;]N)̗ gah0,ΎU;B L E>T hިݏtR@cz]w#=9`xOlg1Rq4?e^ɻ\wK($q ɔXn}Dޙ[J3|`d*^ݵ/e`XNaծJwP3?J*К9EM&4P48tiwØmװ,#3nPشIqK09M`s(󺕤G֠.p1<~!FN,º ?VZ_kBxhqbUTh{b߼ߡ-qX#JAQި.K=BsF oij̓zv);nz N p>q6i}j#f8ai#;4k@iUg4> :s103Lp}!n{[SfweG"5nEsQ c);ƈe2OdyBjT;{?w^Y5?}ihR./PW{ݐ>td`TxTT-RKp; HeI4(mOv1#! -iK:xViNЕ8a7D#+iy .,{_:-&hU WJ3킕{ xuOPXSoRsr;=挨P !NR <7d eێv06q $ysWu{6?9.nUbJmUgpzAGzKY݋;ttWMLA1`zo!0)'p45\"!dEܝVr7w0ۭ;8T) G=Gj i6r[9ziPwYd2Q!un>MUwb\ѾFL`Բ/CU \f]22J>*%v0!;"0P1̝] `:l{kRI#Y(k/S ڿ9LYS\F1wf]|x4tL6MVLa5]:4^9(ϕhP 1e| wgUzaа<[eQ~ޡ3%Π eY|m!x&x^ɥ !-މ{ 䃵PT#'B.Gw+7s띾5,ӼOtFPJu2V+)bNIz/8"/e;-h0"|k 1;֌o.JO]Բ\P!n^TFX$Kx ƴ? g͆j`D5#<׾Bqj4`"_7\bU1y&-rE*Is(5u;,"C`Rbmhy * W >d¿3^),߉^ɥqrVET ;pBk`3j:\T0~.,3"rh&\DbMMl ט(k a|q<5۸;z!:޸q&ୢcg,Q}pdd^WV(ɭw]JOtXg+M1|'C3P(+Ƹywa3X@k;8fWJ42d&;9{;YXZSḺZF Jw}XZH C6ĭh[(  s'Ms8UIU@[> q7$<_8wPlFQgN9[MhI!sPy/<1E;> t\hϴDܩb wjnqnb*-b}#%z 9`&xt>oV)4 ny\{0?9/YϽj-z2V.nW_p[rB@x I\8/wh,aߨZcә 'UiZYxX/-zvsŭꝱ1dME,}L-[d2{`ySYئm?u 72$h?.Bc/ TqGGI&8wPTC{Wh 9KJ-{?ҹ3tT] 9$nl/0>34waUwTme&zքZ=ӪI{) 4/ N>% cwl@7UN|.b'o;d$tgOffN!)4`aԠ}4Ed,QdL ZktrA3F w %eBmۀUPI,ǐB&$[گo{Ac;";_d8+S]\M rw^cQ*?qieT|'+Գ<߉)91+;H͙ziukHmDk;8tQb!Nປ:M(rږȏ~$ûF%]4ŽLCpa{rqB1iWx>bH~svi#]rX9ROk)v3*||kJ9w!`Q;iޠ2:z2< s&'w;s<+u7.{gavU{hZOX=[^tȎcD">R熐1G5w]0ێ_?;<ljZMѤ!Q;vp_Cs3x2 wYp,ThrqQDA&L2PAk[" Yf_٣wBot.d9BgY-RsgS ܩ!IgaW- @ijJD1{R j=QR4,,cx)s;l\(X1*xh49fQ a,o:yA=)w|(u.+r-D(Qpŕ9Zk*K+;jr7MhZlqŽOLŠi,,ƉBPu+h#2M|t;*ヤ1wAq;ywP]F!"1*J 62T/cLK`YdPcq)aoII<ۦpy! szAC;{KAIr5jݽ{2EFW | ʾ߽,y7ySN8Nwt#AK}mdf[m2S.u49B~݃= ;˦މm1K%YCg-HTΦM{j{?x4wT{흵bm:t s R}!""r0BwZrw|#yDߠ0Fι0;'g mߍ9cinQ>fdmE2V=EǣTP 1wm2fƀ 5%Ȕ>+YXhLdԏv {@ Ȓ+!^>{v;:ۖ{o͸U3 hQ%e,"-?]+zٜ %cnAw<0Yc9%`phP9\HXBm/.psGw)u]ӷ Ke!J2 M"8ypBaЁ3L)1n]5%/yq9u^g=T'3dJL!|s"9N[8))w0=?&A r{|/z6Nqp>91a7fU=3YD4$3WfHI,o~Y]d_IꖮAUœP}Z3Mjzp4wtNNqBECBs ^Gd!*4v,10~@VghTP]{ vmB[ >w 85׈)T!q~ds"UxIɾaopcMpi_ M+y8|ԍ;Is,[6m:4u{biIceAl/5|-9(C7 {H z"Mpǩp]? T6ZVmkBH9ACAc.9; RN k\T#QȁET5hР=F܁Z{@9vz݃t{99ah cہTcƹCT(c,=Gg3<\EbofZM :wӲ>K)*LsXBCbHZC9S3dYA3ݯwv=Oٗ6%eZJx.R?OF0/ztak,F\=Lw z s+p En/3\PEzvGqm.w+u+'WULN" !>?ydܣ^rJ FT@K'AOevJngv;G#lL /Wqς\8 X@@lŖM.jR>F~p{j2;h̭ o^E.fAb/})TǃFqvWY4d)`&̦'-ߒԼ5 7ggH W&C>'f=~kyf\cu5w:,sӖ5tVdE f65n~u/vF4Rjbpږ{䯰퀣?&o{_vmb&jrLP,"8tn ,zѩ)˲.ᚹgwg4A=*0aQ}4-2qǨte;le.c.}*D%oO<.+t[g쮻ts71DֲW%3m#)o -l#Y̓M#Кeww\qDzǡTBK8 M +Z_'ߩS.n6̂a!yWvEnP~8^Ώi C?hdUi*)stB`!P|䎑; 厣c4wMhis iQgpǧ2U,mh`cƔ>2/)VB{G|3d!%8մpdYbR]j3>Pn1 -ݫ5̛b:st[Lr$[G(' 2벻2޻Xyrn5w 1Ei  R p1#y G2@*Nbnz7Z7=vmw 6%\M~m|Y!6ꈞ#d"RNY# =%ݴcxn^jLr]r{9im;샋& g% =I$7++W:@GgTZ0:@EL =̏ظXa_\5=E]I{7mpo%@fBs7s[恆 ʏSS,EL1h ]1PnK;~F 7GC;32AR=1VAkIVc"clޏ/*8v7&.ŁZ3[P;G[*eԩUCbAz78sG^M9e4 e*k8a%A;n+!z>Rs7ó1rpe}'l|!,¬ew/w [=w⢴w{ b(igLbڂCy71t]{Fw?}wQCe֭7M`Q :|crT|Nwrf_:b#x  C)}IL/teo$EK}eݑ;{CH/kâ%$Lv^.PQFnR7.'dwe7w8~R莟uldžZF^h mWp@j 6ɍ9_}3)dĕDh{;Md iZKx}r;cY=95 w:x, R$"â6'ܑ\p\#"'Rh-O/UP+-9Z;d|1&ܝޏ 掲;FUDw`81FwA([P>|(uMP6{\z[L`v/˚htGP>!NM3 uuqc#AZ#͇i0ӱE%"t˧V\_N8Z;8n93ڈ sGnxthUc`&&i@L18V,i2 9(y1^ xWvW/ 3#ۖSiي̒:j,w5G >l\d:+Ӂ媆~$+ +ޕwtt|>gx6&dF}ia1%!aNPxQ5确=3^WEԻACuU; ! s/׍1rʊ2ͥŅZaKqQ,mN[:֐4 ޕr;۞S.wĠ '~xN2mD|ǣɃ\pLX#fs~rGx]@cS >4DP4xIuo&vX8]M;@!]gy˝Bw3A"ktC\k5)왅w8 YE@wo9N|B4<[iK-$cTu#,0Ԡ㧐4\;J#0w?+u7 gw"(1 Qgz,4~W*A4#]AlHL|4K@G9hAF i%"hО{V@=4EY'GQ͈;|Zfa`oX3p3c6=&Ǜ‡Q횅)YB&5y[{PKp6w3|wQ aH@ J $z(s>pԘaj'kl/ιDu:% {Ԗ;S wb쐱9y2-EDŸ[->`~_4Gj|^dw? n_Ml2&I 4#yJОC~bV+f^\bcwwNIBՈ@j\1+wFEeZ) zRKMGfzw7%ؔEV5r1[|$-\mA>t9r'wĶ Jq{5b+/1!BW[gB:@R$&cw w$V(s$m&ɎV# JUMJTCX,lsߌݙ`]ؿnH.tax vX3C>DA/,{w#LhTz^TҷkfqhSOy9O@Ԃߌݙ E|L+J/.E#b΃t=xI>D'o o q!d%r v 6D\Et+9Q3ݗ*a ٝIND%l4%b(R /&t ,A% Bew++)U%0ÕC6B s;beޅ>HaM\o4'}*bZ8#Rt2r\Ӏ*D^W6 M#D@gG^ JD[&#wX431`H[bT_'SjQBD``p (۱f Vi0Ni5"<P>Ep@ZL 44Pֽyw (pcD,BMsH8T2u 0  a#O̰y߻q #`|n?:+`פa4XZ ]fI!k2Cx9a.w(ҘÜplBbѡnjtS.3%M`!U/J;t].{>  ~Յ(ZP$Wa9 f}& M HqrB̰a~wcۊ1JшY[Zg _J)@`b[D”mSܷcw4z?.&wN ,/é$#Ǚmbx;vw`1]_]\(=M|"5щ$-_œ}Qr 7*M0@;9=>ŢIk ^;&!B>#N)<+aaGU(3>enP]նJc?pN,cT0G@ ⊥2chawҙnm?xEFjC\FY F ։Lm^s`@_:OprwQM:w[@l4p:#<"N2 یBF"ð&]zN-#J{oy`"wN s,?I%@?B3U+vJqQ8*zK[n@_SV"unݴ ?Isܗ{9!Mh¸1fF^,޵|]%wh  BY/eXx|#?ys/x:B\䎐:w n81R/>r@hs)DhP,S8 {?va\,Ƨ@[T6֞aUkA]@P Pn2ٚ*0e8vo`:'1֔_xοwF۹rEwrlaxTmXismZSpe@r~3g ߽c)F8s yzhpf@u 5y1vlܟjw(}5R3h-qqcOEWNk򝨚4}˱R2 Y6{ }PNnJ]"Z(N2!brR60^`~쮽{^)qHܶݓ=`TY!Xk#MB%1ߡ|/gOU {0V@ s 8PJcMqf,l=XRp'fwޅz~{l6618}2nb:2qgtpcwPG㞆s{P4Ƅ+S+ӄee!RD8=|w 1]ӗ;)?)Vxj/$+.'[߻)aP.x>i,`q뱻VN%+0wu4ssfg̤HӶ8 f4Op$db nH*z, '7z[?|+wg J]gQTes4yb*~5vkzy&;Wػibvަ2N:܈ĤF.|OƖK]A&"!;SξwGUd/X}},H5Z*SXYOeek;xdQSn@Kc0p1>Z 2Wc^h6a*>[pϝ3VLҹe3 rQ=|%lŒֆ }n0DQBw:״1pGAk bL>|VX&/ ޹c1RڕEY 0T>eE2G 4E-ѐaEp{'wCC4edz.3*pVT,kl%w۶;7AB{a}t#8]#4@tPD8JՀ-۽ N{xk?4qF*zra NLhdoMm$&]yvewƐޙhhT< H;sk:{\iolX뱻(TQtWI]QB8N D*К9EM&4P48~Tn,rw|U81bwP{X64)C-=m09M`s( XPA8L ѐ?[B(;is#w{[V~kM8#NLQ`/#ïw{dw-dwPEMgTTRC-d97n!a4Ɛ]JS E2;+#j{gٓp>q6i}j8acw4Yjxqqwʘ!Zn;4QԘ4wdQt` qEwΝ9 {WH[ќFԂdd+옲lJ1"ywY$(j*y~+/;id{+uI3@]U߫suu o^1J}mM^Ww()w@w(XP bGBZӊu񈭾Q+po$rZ;NEzn 8FmU WJ3킕{ xuOPXAV y>Dpg:%x(eG q̖LA$cX(v!8(`Ewn.SFwu޽#o/uu{(p+WZ-m8s <V_:^1L9p .!i20"fly^-D=PKq2զ*ɟRrg݅@"LvYΣ#5G(|,O^`*yfSnwDYd2Q!un>MUwb\ѾFCiidw(v73AUӚ+b5#蒱QQ)r8r#w-%%]~ﲻJqef]umgYjRFrz{wP *\9 wUwdS<*Zn!w+ hM [m$R zzwƨuOn$*Dd -qRcKP8tu~ΐ(U(y1vGΪ. A{Wn4ϘT-1%C*09^ݵwx'⮣1&  H9TdhKB#}%Œ0)b(撅tpS۱Q;%3f w!{ٰdV: 3 U;sJ/-9.[ !w BXwud*m^s0B 7WFj>R#Sc"w[X;QlYn3Z:C9 $UZr>yڤZ/U! ޑ/N+wr+Nk p[ڃ)L̗׬RZZ}=vךaOkz'Ndv]K݊*S-Yv9E!TZt\S$.ebbwU;#Co\h,C:Zcә 'UiZYxVEۢqN+w|!'-8 jr9Xb7c*(m)ܢ 1;_PQ,,>ø 6h waC/p##Hr"(4f@wqd0rײaR;U]T]Xj%t (Ɗ|VeFwDV&inwS޹Bf{G-H'e3Xȥ XiG3N4wv~i !eC?9I("~\#^}{Sm,;C@o-)p,=scB]㶁2Sk:3 'K#i)4`aԠ}4Ed,QdL Zkrţj$*|NXm *RH@9݄dZObo us?wxeGu.=t%5tE-˨>}m ^3'>9GJxMM,""+R818(qs^}+|Fƚ*Raeq|~C1jͣjK[C#EZLI1j йMRA{; Yxg ϽSOî3zZd?!B!SM@[C֐JA6Y1G ~]w8hv%#8o;OŽLCpa{rqB1iWx>bH~-wtMS}]U˞i.E[TbJ*0z6LjD| !5wnIBܕ~s7nxS`AOu7[1(&Q| :/V9"cwNYB Ω<$ܖƶ${CElp2owPw1KEg/CiǂrXpTSd ¹t\NFP#,Q]0[]tQa!&Ex)җ(AކHɵp: f;Uf{G´Mh\[W}k\Kv'L.qHN?1d#B fNvM@cnMp]yn3蝂p,Thrq7# L80}z\,o]ͼD q6G49BgYRZ[ݢ(D$FPTC:r4pg;I>iQGt4NrC5/v_ؘCIN!+YXhL:s)|\%4#Kˇx7vTz=Ժ{M-C#`10PB[-jDlE凳 {Ej x{hbńƊ<%`phP9\HXBm!OqץwnN H=$PLuR=d޲Xi8SfICDp2'[И`u+u(K8i#%f9SbLݺj,K^| R+r|;ޙAUV%th ^L!|s"iy~D湇irRK[;<hNo:˖(EN@%itfmO%dŹ橢vgbj bϋGqð7ynwZp`dEDKV(w#St]"J0wIdD7FRmPPCiS0;hC#S!vj$鯱,wIɞ$UxrD:9B~ 4o{uQ&ށ[P]>`^5nw`qNr5Avu4,G6y1vz ]5np:r7@c!$ ЗhNPsn[Az,i5/xP޽jZa/׊yRn*#}]ʵA&R#4Eb5[@3|=vWq8b4iɴ ҦDb\U/ЅPT- @{Km;=z $wɦv؂n]|J2CQw2 "Tm{s2>3<I-P?E:s߫*L Y&|'A<|cɝJJT G/R&92,<߉8adZ_m^ݕS`,L${x<+LNlŖ jR>Jt <5|P4MTixۆ݃~w"K XZgfpϣЧ;&axҷ&~}M slX5]wOl ,-%u~ ع݃3nz3=H.w][t'̢ VJ6G ^0vHFgb;5e⏥0wM۬@g BҐsut\*Al28ShXߋ#P^ϝD$w r@xO^`0\dHԷ(ĬGa-! wer.(w݅\,fQd*$(n5;Mmqx~LsgkZnK!"oP/䯰퀣?&~+e9 "rD&jr%O\C^l:|wFJhtTO 0vSɆWѻ3o}gĨ>+AkY>^ !Ǩte)`-;dBkG??.#WkwH?GNxAs-DžUcqJmw0r\r|WSwc&e )mosXbF+ W[F"'F5>YB掳w%]=*[cw>wJ!dD=Uu:f,VPSZ%S{䍭 wzQ_w'Dx; 56ު4 9CF:N!0i^ocl f ,cl'wCwWuZ) AZ9ҢB>2iOGeX&ƌwe=玱H6r/IFpڌT8[ H!ӵc{:{)?X~\gwݞ OLD*-XHMbu~RaO6BLBĆa u.fMAc G2@*-)k.8~q{0 ^x0m0%QhY?`Ҧ6>рCvuD2)'mB}`9Oix3u=pr*v}M"J&zIӟ{ʉб {!?WvE*1*be$>arT+<EQ#b;Āe9%)W},ZZ7 *?FlOQL4"|KA[3"2Š&teӹ`s.xp$,utȚ$2NAR=1VAkIVXД$%p Vy) -u*ق2U?R)l>?^1eܑs"xƬ:YW25 E~b0EW@ X9"]>.Cupe}'l|!,,z$"й{?eVsw{ b(igLbڂqp00`4C\Y>Ժ번tù ?6.$hVREN^9)3grq\wܽ);si55?y0cA41,Tӥȑ,WL?wgQ:u6|t-!pIPbyPH;wogmஂ-WR#2^!S, Mv)=5 bkEwG̡4ƴM-iJ Nk" xXV222\kEfn?wܽ ޟ,WXq=S><Dha*)f bҞce5! i%][d-J@ @p[VЕ>FF䪻}z@ZJ n~˭k;ʈxTuC|2؇:&S*|gϦW]~@+bRWr}Nd6chFx @a(AQ1)%\.Z#2r70:J>@8,Z{(OQ$Lv^.PQFnR҉sXV;4- /%=!r=&$7<>P7A\F|]\+7u_ ڦi-y23K괧&AWAt)b| ]y^Ŗ!0*xwe%GkG,И/SwZܽ9enEH*H )cv 'Fȱ ?7玟7;lݡNӷ@no\y y8Fwd E\cApG@ P]56 (kk HlbO-7Nf &Z7;}m|LBB>kwq ̙LmDSqA"c)Ȯ==w_wVĄ9}CdALXabIÐI᧗(y1^ (Bn?w}QW dݶJVdTQc9RPf"F U$+j.@cB"<-; LJ[Ƅ(/#5| ͝*t upUs4DpU"c%|aNuo&vX8]yAo<.;xHzE׻o'!wTDN< )n  pU($_gBnFS80k(NϚZ"h2yB #_ﱞyd-˴mhb56*ː=McBW2À=gY,*Чh Hbƴx~39y;wg˳A㞴OaIA7m(zbz%oa?,{{7hzr qiw^Q7wNjD3׿d)Kz( .HPRek~T_5;dzF`ip݊ԼxBtIZ+Gf '@ ++#vޡcq;rרMl2O$2*ďg_E⊙W$X7x?vHz?%J뎽A|bV(0,S@ kj) ewe7!Q (987+Ni1wF՘-`GS]>.C;M[CCwIi[wIaT۫[\`/DՖ'뙐I$pyIy_vWx;4 E&o4IՈDU1V ۜn`u]zwFi]!ؿn"Kc(x vX3C>DA\T8enqlRyQI^$šM=<=Ph'dž=@Ԃew]rG, B@ Gx.E #b΃t=xI>D')ܕw>YuwCG JD:m *Vsg(ڭ/U 4u7CI4Sc1EچPIB F ew'c{;죻S :(Gm&W t C U$>Acr;.A$}.#(hxOFS2H"C /aNh$n()&sCw[/yRjn.:KDy"SvT2#wXpW=~$vw ঝA+X@@Z^!=f@W,5@wkwFɶt5i "Ape-{,xZ'2yuc ۝G ЖV4ɼ@/ یBF"ð&@qg "GQBrڮs3fĀ$mڰ,bx0_'˶ʝL>kHܵ0S'\kNƱKnkDP 5۝92 |ALTY{^{m%{kS~\9\qHq¯tvwHJC?*l0~tY|+r GlQ)t@O[ؿ~vw REϥ-+VOV&^0:GMFSt"lh#E۝)j28ݴ6ӚIϨ'@y:!/Y N .o&cD?5kf6[Kr%x^jéD5i_݉m`۩M2KDk c?6DLP\+l~vgE=B еN,BvXՀ&!sп];[;Sl7Z-,D Z)@I(Igq>7#G[u'c,$}pEBS?=\6@ [IArt%m@Lg5P;.ln;x qa72? #\]X&,C. "釿;J.򭒻#JO 1Tj/$+.'[߻9u+NIc3S~MvGLyyBB'BHLX8 ggxH<=#Kp/lϯ.;Î܍do!wg MҞ4}hITyga  7"1:z'>zRW]Y{ԩޱ-~H{( R1h5Z*SXYOee;bup;F2t.c%1-Z*L-E$r<)䮬;L.] ,=2YB13fRj[XF9h SV0ݷs;2KJ;(=_R+Bf89*P{Ƞ mmR6S-)$F{9YG&]q7|Z X S}.EPT۲%H߸6li y0`2J3Z` }h7ScCijX䮮1%;>2oGIqCmP^2:I[ALʸl LF~s}mvGم/5Cp )p[(]E,OJSe阷]`P5%wO4\ʍRm|E="=Zi$p_|;1TEm8LޙcQ%xf\mhpW8|h~|I̱DSU<5JMuaXzqp1 &$wےY-V3ݦ<4jZҊ槁2EG+t8G%ӏ{V?>8ʼCNHepr|TGXr8 bJ}KUHϘSb!qy/޻fy^KTZE$YDa  ll|@+k906e< /{DPq7ȝ6]?qECn ^K#~y^Ɓ|LTupwfwODܻzGce;}J5h1AQFXY [$WvX6{gvGRww,ϐJN.:jiܛacblpeǶ/w…welA$B|pg= W\T\CὗfwX;Rn4{q LRw<-ב4zȌӤߖy]))Ii& wအJ|[:>51yM]4Wfwϳ60Νl'x녃-h[40׹{q*;=ҼðN師j"_A^ĵ3C wP.,5)X-Gr)rW}16$2_1|P]x1U|24Ww솹s-XE.[X&:^.Ow`ݠXrPv/_q]wcl1@w[TN =I?n}LdP}ѨgaMl*>{Ԋ7gw]w vRH ]ee&A4&`ppie[3"45Z#;q'ѱؒ-,  7{8RJ2(ab Q+S@p@S O3ʝ.̝!n؇fh6\gA1TAXVKJǃ$Whw]n t] ~qt8]#4@tPD8JՀ]; "ܹ=0^=桩6RιR{Fޞr!!&]y{vT콋qG^xwu; I\sfx2e1VB~wkl_uxˬ%d#7Vї;5qqs殌(?J*К9EM&4P48~Tnr׵u\>% MP k{LN\8ʼn"TN;'oC4$NwG$wԕqsvo' kq6i}j8a߿AOv^u-4h0z17iȈqy_rZv^kʎEj܊4$#[aǔgSwɻd%'&A_!B_Z8 ^7 56;Xd;ޤŽbh1<0Ud{Om@.{X`Ai3| ah)N+_ #NsGu @< c;2q|uZNMs f+Ꞡ5*%v0!;"0P ;6]iW"fpDg!X^_=U?sԞ0e 6宀'J@dDae&XEC;\YŽSv;5>aK[y"ӣȽCgKA˲B,M/.i0MNh8$eڧ:)8JM <t9r+\i?{o ݾ5,ӼOtFPJu2V+)bNIx/muSV8qFÈPqU'X3 M {T(=u)c9.EH0hNtؠ kLsp{lFT:s/+]qjf"_7\bU1y&-rE*Is(5un|{(LJ "OAe9ǁ7\X^),߉~vGęqkw9H1 N <&y +f=6Yn* N?OkwНywɡ`fsd,^c%2lJ#$hkĜo\DH8XVQı3Ĩ>r8rR8;pp=.KɟW6x)fS`}{JeM#okLEe=(4層q.pǍcc;I 8&AF N1n;$bv1Efw;);tŝwRwkj _Zd$FpdxY;8J2F{ ; o% _9jJwܸKcB]_yO㐑`Zӑ6qW>YߣݡG :w+l im͢RP!?,D13%|h>펛\C,UwPRw[kYPE6`>PSYH@9݄dZOh9.&P)wiwDV׹q9 U:.M7PRCWԲ'+P5ss+ΗiwHiwPbYDDVpb|qPL4V HmD[AQpW PkU(_>֖#Qs -Tws@eV&S)tꋴ;,s=;2S;&Gb0jCu>DUHq>b\c A `1i~krmm!w4,rDž9U 1j1]/G&q]9mKGp7E+wɫFz򴜼~bA "Dv@_- sǹ εe4-}EXK[%!T?-[SZ]WޥAPez7sG0H˯K5Xb5cQuH5O֐;K2wL;↕:JmTj Cv?D8HBZGUcg5DΙ_ي!%6F1ѐ 3(Inf(YwM+\KxXX _p8@"o{U.r!q;ݝa!&zٽRS25=p #VN~C * Bb,B_2<(EH[z] ;ewQƈ{wl;h`BjQsM@̬}s;m#/o#]Aրr\I"F &&X+eq,2w,4>%QxH3*)T |f%f)[CFS6;8^]]շ40PԬ ZjE βQpޝRتb*i$ V'AYɋGRc x~vi{ż#rQw˔:܃JF"PpD9BHkE Q .UoHiJ/rG>.)"[?<>0KR' AխX7kM_wr;ywP]F!"1*J 62T/c Vܡ1_rw]K}'om P 踝Fc!6PRSbCً.qpGfJYFSNtB4/.{4 ܃RP{.5#q wLKyмk{9aVLTKgMY$4mUwb[w#wϘ g-HTΦM{j{?gm#caR=u0uaeP9")s]+; (s&4mCL!X,aqG!\H֙uOwLRvc?o'M %Dd{ɫHlpYyEpX)-SRkl)3= qGA?wR3LyhGr|OAkY>^ pIZ,w0##]Tx$VK`8.m^݉,}K}qa՘ }\:C܆mw]YSӄE&gds?mM,~Lz HD6) =`yߴ].;N5ƌ}:*n,jNֶ=Uu:f,VPmwKlRXŪ:2iOGeX&ƌM;TwD=K(a@pHW@(5.yqCUFRwݞ OLD*-XHMbuf+`˨/u/;hq^1as)gC|E G2@* ؆5Rһ;N{g++I%USE\M~m|Y!6ꈞ#d"RNY# y~wUn^jљlJv꽜 YpXɂ#9F-w7W֓;>x}>wYDjcGul,{X.V#sGMyvEܻC{5 wT [\W:ҺU1b{b#^B)7+0j#HޱaD4+;E|_}aEdgd{P+crDג$dƂyv7;@K[p-6$dXb4AުmqRW ̓ ĽAo@pd h&D͜2f25 E~b0_ &țxa=>$HqG>w߇g>rpe}'l|!,¬mwĹA;;.qD 0dLbD̓1h ,(tnwۻ;dŹ`9RЊ5LfC+_'nb7Q~"sVBVlwܻEz~̈^ۓ8f]SqX΁U *RC/wq̀ܠ5u%g% ҩ1!2-!pIP*bP8Y2o}'lN_w#s`q*"BpIBX8ABSzj@vxt9qwĮvױ<$t, wKr6}lK_)A{m tHM0RsbrB; [H!P_6M ĩzMDKogdd:d 2m^ݕwy Nowĉa1ֲEt GfLsdQ nvySwso\]ip[@s~Pz{--VPf E`33 Nsw܍ReD<|56\cBM/\QF6=! Fw3ӓaKL)PJqwdLJdzɦ+{s|'):^=s9FHwںoѕ҇E1!A"l'"+\&U]G'_;[tcC- /Ն+8a &$7<>)ͤDWZ:ٜ5w^F4%Q>gFp85 w:x, R$N ȅȉ<F )v1TvK֎*Y1_L/" vc]u('nU@+_RƐ=j77Nc@1~~%w;iH^=>5O,0V>rwsō:-Jz~k H7!cRЛc vS3hwrwN%-N~'-s| SєG\mPHDf94 an]ץ5mdALXabIÐID̋jdw/P-4lEfILE5;#e6.2 a0R%N & Q`_GkLIȇ%ԁ3©#;:^TykO uW^-b0 E?A k.HFe:o XC` hvU6݆t#Ww,2b쐱9y2-EDŸ[->`~_4Gb>#6n˩hcBGj#UpӢ54on2Z;w[t% ޠv쀵JLJѓ6 5SQϛu:;CI /,.h,Y>sXyaEp.l;mqmI:Sv ka&؜ .u8S y X:ƴm];{'KظDdA㞴.OaIA7m(ia_ ξmeaf 4CNɹ*eD&x@4Cpk;J.Ȗ3 Q)Tb-Uu&j h[Vw*],+g$X\"5/%^c]e PCn)} IaZrwr%;[i@??NT_T s/S"bq+ɜL7x wTs_N]SP5"5Y4(*ЪN׋Z Dh:05.'`0vdsWqt'sv?< ĹDOW#RX#"tez&B8WӼü?2=@~BksWb C~dľ $jDAwIvjAhu ^Ti"Ͱ\v)Rf'0] g̭Gi }!ww݀+sk48g{+ERWZk!fJRa)s `uj+i mDSh*4w?&Ԛ9JT->p)"zكFG{F;Ƀ;"wRN;!d%r v 6D\Et+9Q3ݗ*a}+wew)6w9` 6֌ 2s,Ju6Lҍ&/1ԗ0oAHۻ#y9%Ԙ)pJ\!6%0ÕC6BI9 9*{xdSaʞE5/( ϓ v~o{-BLD) :[ͤ08i08/ )2w=q=l- W6 M#D@gG^ JD[2w]Bs ^I=-4Fhxh?SI7Lf 20@ c ;k3$NkZJ%Cr|fc<Ц&q3 M7uosǼ;i{ӢwR.d4wsPc =Y&qa߾>5C |q3x&gv(ǝ X&/x3@)m r4seM ]qarn8]3,J;sWm\)qfuSw)i"cz!wGܝuL\7wܹ{ B^-O1 =`YBSzkiC݉rnz'+ֆ"fmJժR ؽ֦kE,0e KkDs7K;YsK5 m=RC6lg"?#J_Y]|qNM/S;ysC h4^ M|"1 HZD;x'9!.h$nT`(sW޵aƼ9q.l?uM/T;is')o*xSuj {\\R'q╰*aL]AnKy9n4|(d݀I0@:BZ1Xw0-v?` Z^!=f@W,5@2nl6}ލ^zܱ Kχ*s"[ADY#`ȋ(4Z0XNdjJ4j#O_brMeD9wUK 1@2Hݣ/B6l3 :D R(JD2wx{GQ\λ1㠊QEdy ('/qA'</ 1BW=sw] o=~w2nܵ~b{[݅\Мw]HWisrw A~R减z*DhP,S8 {1w.ӂ6'e~7{$E#w8R@AC0@8o@bJ:LzolN.'o!!xcܛmb?|ν8F|hSp7ˠ;ilaLdD1-UEl\q٩'e^ge7wG`5/6 >1?U9(C8vmH A7g̔0y,`TwKd_@ܽ׶X{a5̇?_^/V3>`wG=9\Gn@@= UHhނ'ʷrmNq@`=maݽWOl? ]$&QcU}U! ?Fcr7t"lh#ݽb ⾮GYwwd]G,atDD!;&RqtD̀2j{(B5wqwT "V݄:,6q|.mxO1Z|=x]+DդK~qw/3@KZfl B Q~ 7.x&ľ)ܿ" b*t EK'ƿ#7=߇> {헣rH~3:}=A/nT}_H/zGo_Kg=_^_z_^z_^z_^z_)ۣyݑH?wGݑHyw_//{#樯?{#ןhs3|fsT/ljnԏ]Z}RWv/ZWzk}mӮ `覔^EFmݽlZo?/bG-6D˽g_lzX\B\JBKO;muf4} m: m:|̥)gӯϿѾn^붨_=ˇOW_ߴ=Mϼ5^:~v?;rn~K>Gf?K\H!]lqMNmQKJnk|QG ?75E>d64⤧K%LO^hw/?\KowPG>yOS{|ɦ>sy韇O_v$C.VP8 * >@J&:!qY@ gnZnڃNz+_?w>/OWY*Og՟}T3W7Wooz?&?W^?,~Z?qC43_Ǿ_/?-6?pz}G'֟O_`z_'Gπ9~æ  i;c݈w+CXbǻV=؇r7? ߽q=4؇r;v!ܬ{|mvz{>m:x"ͧ}Q,S*SI݈w+CXbǻo|6k8(4MUXۣ|c݈w+CXT0@tK+ Τzr(_ Gmg߲ nǴJ;Yyh Vٰ/G Ҡwұ|lgu6y&%qV%` q8*spFQ՞;H :S'[9"ĺqM'v!ܬzBrWmn5tyۣ9Q= G{K\xoUX-T >Pf؎h<;a3E kVdž<$ w+OD㞰lOF˹Hzs䝻ȑ0ġ^7LONqUa܎A4Ma+C+W~RnoZyQHsۣ "_tdj\;v!ܾ_ GlXSI݈~K:WHL4< !GwMHZڞGY[8h]k?EKoztDp~n%Ԑ۳5D,4S .Z7I[3ME_Ifq+CX>:k_ Gmk_.X]_KLJp%悈$M,:ރgF'|aZV{a_ Gm֞89ObGt/( \|6k_ ;1b" kը<-^Vxpy7v+apOLf~JkΐCե4+CXbǻObJvݛmlV=؇p(: p58UM"uX'!ai`bǻ1cܒC@q+T)Zj@WE 5j)ZkҀ7v!ܬ{c݈w+7&/.-ox׬.=؇rQn5tyM{2XO .q[v彼pQn7In(jZ(s3fHa_jHOu_|v. SgzxLtyۣ|6kd;qS\0\b08 );cv^R#Vn4iLb߆ۣ̀{6؇rÎDpy}~\\q/)C[GբsUSjΆ;HzR>+b_ Gmk^qlG-I؄+FT^ GD(wbۣ|5flP+:YڲԵqzgUtvKT(yG[FnzZf|6k_ Gm`W'jz~ OQLrs_ GNk]X3 6vXbtyۣ|6H/:J6ٝ-< (nm6t5ҙNL1a^`nw+CXbǻV=茼昂ڢ,ܷDV<6]n@Xa^CXbЬ{MnY D'7S΀%eoؓN@{6O/ ze4[9GGWK!oy%f՞gYߌKۢǻV=؇r;uRZ7>k,.U؇~k_ Gm=V4])xq~Gk} kEepGtQ} 9z 0NCXbǻV=؇swL${v}=؇r+#CXbǻV>6kᲖBX|Ftx]ru(zt mBG 2ױ#7.e+!fy@ic{^M^rBNSu:NSu:Su:NSu:͒Y:i_65v!ܬ{c݈w+CXbۣ.Xm _fOH߄;%)T/]F71,%X}{**]Sc<*i f:n$SDh኿,gy͟? 6]l/<^ygyƱz W 6k {c݈w+C[tyۉu[ PW5FtSreN x`s8'v$Os]ooÿڂZN;C੡/Mܬ{c݈w+CWvC9lr"% v`^c݈w+un5yEv!ܬ{pK@ǹvlS}\㷲oKH*)p\'EoK#(Y5׀Ii4M&Ii4M&Ii4M&Ii4TdQ܅|/PnhnCXbЌ{cHV=؇vlkh >:q,TEi}xomJ^gZh@,pTQ*H%Y1M)tÛgd1@Q&(";^ԄFR@h(ƱչXc+?Wh)m"־5۞v:v->X ~"'L'(C ǻ n1_ clhL-cؾ+@<5¶aܬj`ٹw+J&hwۣ|6CX@ۣLn{0b6o*Z@bG"dL6 O~hPv4/Q# |w:Wm8Z]Fâ>%Vmn5tzU4؇r->kᶠbp] IEv"U=L{ $tC 's4xXOlꝁIhԟ_|O 픓V D z,a1ʌI݉r;v!ܬۣ|6kN709>d&n;m D?̖=؇r (&[RtF*P/-+;J1vrźd"5g(ÆtP;runV9{k9c݈`؇WWmn5sx:p]\6Ul*yXV0t^Y5tyMLm_̦AZG.`\9yMľ(,"8=iiLbG՘ \@i₊;Gnň@J |mAXףVTuh_Qy>12ZS)) Nꅲ4 Pv:M&rcNB# 8Tڝ[Pó + 1l3 dpXyVuőnǁ_L;v!BH[|6miNpvB<}"7'2";JqoK 8 hh4CU{͖Wxwr,ka.~xnBnH6mn5tyۣ|6ҚNCѿ5ny-8ՙ?cY t6^VMy&-xs2oPv`]0k;`v+9?Jfd f&Yov< #ʹ*i*`0>kbǻV=؇r;v!ܬ{w$]a_ hK桯G}03BˠM<6D~RN%X.nrlFD*?"V=؇r;XbǻV=\)6 n3]4]' s/gw&F,',.! EDHo滑=#+mL<^ KZ . OLzXmy |m>k_ Gzgݹx׍C 7;Ǻ8Gu"!/cRrF'UIе@IL].!;ʩm-a$ mA/+CXb^a_ ֕@DHd]b"4P)!/Aܬ{ v{^HZV3:ѭ{I A;9Koi GEd]T`[tҒsXf3!ܬ} %a_ Gm<סD+%nYwNc` >;.Mƴͨ=!)4Iִu 70Q3O>S63HٜBʼ86ەulNc-הzr-Q-Yԃmcs~d\CXɭǣÞMyzEDf?ntti`V=؇rᲮU T65tzA;XqZq:he?eP r@={ldIY~ NSI݈^%^8.rbdoCI>'ih]9)RJ=[x !ܭ]ǻE@^3V=؇r=ĹXbx|76l&gϺ\f ǻqEWe | $S={<臮u=84*>Qbi+ ԲJ#s׵wxD |&lOʹwy;V!n5ty?Ǭ=QASi_AG`F˂pwnN{qNSu:NSu:NSu:NStN6% 6FpQOO21AIMKnr kw7![*dʝ'r;[hH2a~`i;gN|$ Y{->աZөu:NStFwAhu:NSϽF u#v;clncz $P=PCS}.䓺ָ͘CD4'4v@_ GmiVnj.:b-6n5ZAmA[eJk }=Rbu5gi` (kr;v!(zK=؇r\]2K ۝#Dėi-D*zbǻV=؇r|`V{ʊ^gْ_y[dh= 6۶^dN4ʐw+Cn6 ȓ[ت/ZNCXbǻ;;dhV*R QYD|xTB`Rhmn5ty=W$dgW4]ư#>w O; hZ/ݘ#W UF\+VNtyۣ|6͡+xZ5gUݰeW?r!ȍV=؇r;uQ7x[ҹ 0FLՑNm|Y GRYpLա-FX* zIciqQ݌̮*L8.r,7M'v!ܬ{:!}RMbʿFr/fHI'v!ܬ{c݈wؐPpVn~:Og;DӊTќV-|1X6k;v)ap춟X. { XbЬ{bN _ )@ۣ|6k~f:ngqbw)aBcv!uܾm<)_Yu;d I݈z7n7In?-vlc |mn5M͹Ƹ $Ȼ rIr\IB,^P2l.k_ Gm<ۢsc]Tn;R[)aFۣ|6%_L!Z *M['n5tyۇ- O烫=yd;s;Ui\HR GKm |Ը\ǻV=؉>_0{銀y2Wm^mv&45q !IF?^d;v!ܬ{mqqjg۶ۨ3`we*N@H*ڼ]%Ng3}Ls9yCi4M%lD =?f%'2\NRUҺd3H2~b'_w;_u_jI9N4pKgi*J;MLT:Ӏ۸N'Zq8N'q8N'q8N'QJFWeB}ط S`^W$z | hQJ8fi\_~fs9g3}>K@bmzWW~j]5v~ۗ;^ Q J"-D%("ӠZO[r9b勄3'+~j]5wմ %;j{j/>; E˞ 9x'R ;c݈w+ܬ{c݈w+CXbǻ1gEa ck݈w+DQg8ckē vn7@6/-{c݈w+YDJEX|ۣ>fm_r#3tUHq)[9RY{4`}ubE@WXudabKsIA +}w^؇r:(*`,`*pD$t4G([,& #va].Kt]. G-5s+_ Gm<س{c݈w+ƀRd؇r;v!ܬ{c݈w+CXbǹ7 z[fw;:!n;z*8#6~?K bЬxiAޞMD:>M%.kD?M'n <vTbr4I/W6-de%+g)A)^O>bi6ƽE.>wM4vI+淬Kv bBݟ |\ ,=IW[:ҫWZJ/ ȼ>5G};:LNO[LcDA\̾#XT:,\J?ޘ(hƅac466/Hw[ʌmx_#7^NچKPJkB|We _e6lὋI~J:}ZEO7 {tGվ-.f#\<OSzAL@ĥ{wP+z(oEssR;D&XHza,8Q}L(A܏OiP.'9;d'1Ḇ'z=-@-4?˜%FoS+;N\*3Wvpl%bc,ΰlsдR,u~5Bl( OrɃ۴'?-Ge-`}8bsIf)B:a9YkmVXNL$Ίwm%XqSa%&=^_On)7t ahRR~F3`!` %2bҊ9.@vU|ߡ]nW "T֓: ;]ˡl A'9W:h!t lX}j@Ǧ߂)|v]d/y{a8`h`oS^,EXŤCgKhì$98 A=X2:Qp y+ #M.mL(E)miSNa&ilRH_#x<P=.MUtCU6Ȇos5ƚEfMVOOݷ\}S8CuĬ%$wA4 ;bz[*{N87fCJ+dmL<:WʘB2rgdOxFV0ԙHS%v^:Y*۰`u_5)F^nyz܇;|l`.H$T?ZwA:e9Xh+_/:=@"d׳`1 I&̼@+PMncQUpP:@؇Gx" +M?&OJVJmk38 oRv-v 56jx:?661ۧ@|rƾZ'g),!9_3sHqn֟w4:H%Ha (}{܉tw;cDD1|n[%=k /}؆qhfư%eMa$Ilxa+IIu3>B<{::ՉBzcʼ?5 x.b*v<=x5Jɏa̽~AD֎eSEGgFPđVѢ0',7?mJ˽].lE551z!LW^%PҨe:Eˈo6#]; E7w,`n7[~,D&bcvht -v>KMV<хO:vo.)iDZ K=G'F"м-$>-6U\L斒"+MQ'P)eUAߥ׽U@YG271tƮu; Y| ǯ z̈Yhr$lar~#y; l赗k~j>E1>NHkI첢bGG)?:jF #'?јzCxtN &"g@JJrߪtD=ɔ͕NƎ _ݗB\Y=Ћѣ J;xMIV E!ٷiAI!A-8#W'dXpA#pPH<^Equ?^}a>o:3 Hz= R* Qde1:']g;ްuX#wŽda[kp{pZ|uTQdu? ͰnR:CB '{WIkrQBdͅߟCZ#oy{-)2~Eֲ^D)mEys6-63NF^g!n ?ƻw?f{^+0}n҉^ϢcˍY͵.8ҺxobmYHwjr$s5yf֤f/=k;6i`udbY1|OӲxa H70UCt<0S#bt8@tkhֶMlL&,IȠ7?eU>P4QLLk1l 뒣_?1pDJдnqb<!d7Ǟ,2$I˥IZg*3ۂ&}}ʡrM,ff]8M+`:#iKIsu|=L͖#hgW Svy0P 4(]S&,;eNqD?OMJDlm,drϹ5zzַl3qb`5xT(> <, Zz $E|{bZ2"(W2/W !|;dmvGײVW?/Fio6E{0Ӎr>''X/>)8IU=ijC\O $@T,^V{ w.s־bټZTY$E3[d LWQ{Ijxn\H⊆'ooQZnLy5arjQ@:=OB#Uhu>]^% h7p cvɰlQOm&uG7?{V+&J(8ADp;PYLcW{LLYKļM D\ Aa#W'? ʖ}p;? ?iKԻ-8"Vza?q!]ٍᏱ[vPȺIGr6Utϳ\TD F>}IâU${p"Y+1v~NQЊ]3DfZ9̈IBhD&YvR|b@О{ ޱS)wlm*IS^@2P x ]1sӨfnɜ jπ70}O %q@UhGwgf!8C Gb@OJϮqۉ [醄xL?/kfG\:mȦk#Gn_ğ50 rȠ݇Q T.t.j%"675gH}7V2c97$DD>sj@2lm|{#?53տJEk3-)enK hNJ`{t١W V<2+ꛨ .4Y32~ wa`4U]5{x͗tҜml7X F\/oL `f#MlOm}U .ߵJiV]Bewt`vm{b\iweٌ^r>}}z$)xuP5u8덨h67G81GwyHY9KC|kO<q8۶xd,7R39.ef.ul%CLF*ްnn9)guAɗ$~HwZD V 6\Bwp[t?0̹ԅ5f--xesl:,lNd+eҢjZrDԥ0}4߈nq+i)52'wn8 G;(s1Ya3 @VEı@ʋuJzwvj~M#Hu%],:c4+3܁Bb? 4gO[mk8ue1[[ʗІZX. s"A`]8:LbrEQ`;i.?\ISYG|kFǮ$ bdo;;ϲU:;!fp}WP,XYat $hm;Jf\[6,+G!@!x :&~z&J}y#Hv1f8,C4̡tYf=`GŽ`V@09FvZ`럗Z+"/1* d+J/, cUGn ȪH<<,R°6e5ks_;)gñ< m mЪ;0s'65j]%3P~yp27Y,/a ,k&ɮD;:K&)ky u) hhSiIG%"KnXӨTBʲ cF<$(35S7=m9)ňو*@;wOY x{ %3 s뒕!kP]v/=Ģ9oz&{]/U7 \28FiE44;Dtw5T6Z}iFVα׾ce5"P9Alźl $s:h.aA}\ӓlq@ %P(ϳgo2]5WF=iW8xXʉ+PSkrd}6\^.8692h0۠IQs%Dd[Gi]ke.ÛV>ԫӠ4!OƆh2 Koݿ;!ĻNz]qVxT"NVbqyОM"M$BD|Xmf?;h6?q>1X\|q(f.o-57jnѨ~.Tm`n1+-DEbfg~nڦD:y+KILgh&! ~?֠~\ok-x`ċֿ0AMBZsVh|L\Db:3Y>&z~ŠhhehRU>H`#BCy_/pJGLiaTȧ1k n`]&M$y| 7DI9qN3[$g 4|ܢ'.xߒTIҦ+8"L>3܌iΘC-8Ѱzz6Q]Iꅛa gLr \w'\mɭ3ݽ ҁCGMVoR[PgZa_"njKt;[_[T$_Qxbj#dc  }aCHqqwl}~VA)6iGos%7G;^>g8[xAս; zrd =4bI}X}%gxwN 1>ZnO[7 84p& 0b3~g4~8U@aaYiހ%E+/~Y83PA1YxʫQ[n28|5qZ.rXh(zH gwL %Ţp3iC(i k?]UY=!y<\ zM Ek [}5 +oҐ \^:S+yK[."y0{ܯ"Qrep}#ۙANiV)$"[AWpY7\V/zu`AG&hJmƑJ1 "4ZcA +U_ܹG;tFm7C'Wuir}Er-Eyd: L.%ʈ2q%RGV qJM`+t 0CF+! 7Tsτ^;rm+{LI*y5\2Keʁ#5>[\H{{+r7`33B,5leV9Q9ƢsΔ)zjqw#e`ddC1L3؞eqvP6 uNpT:Sc7eO$[˳+'~wi =7Dx=1Orᕅҩtװ%n;>y>3n'ùLiJ%ULE_e:mά[ש?36'a0\&J>R].1}grH1I{Rl&^qH ~c$*hTIȾQP0RN: 3fts0#}b_SwP9<&}T_2՗E(.TkTvƦ6 ;2\vT&e^a WF[& T/4GJp^ 4YmQ"26X^UGa~Q&PSy^-'&3eGCd,*"ozx~rC_05P]Pz^LѦ {A,_nٽY{¿6Dl!IetaЪ[d}M +Vm]:fk~$J*Crq&`.jS\P^>,? ' (AfST[LO5Hd/]֯c&*ZPf4A}Sdq=rG:adZ/z!u^}QF} )u߁I]#MCp?vd+wMth%HFS~CipxE]YOJG+-z7yO{`Q>|؂9q e %ͱX,2ai)}𙳤#5^Eb1Uu;M9z|{! {<-Y]~`\ &*upQnEy@O) 9rF/8 4JOx͘n'O=6g:D,$.n-ԫ`l< S6N]Tf$'<˳Ͽ^"HszG You|Jy, x'?qU :r)kS-2#ˈ`)kJ{Qzhd PzSX_,& ”gG<_6NCs,` 0-y\Y~%gza#zo6zfziAM@PkQ@3=L'^o%oPr |;qӗJr_*q#+J3Ow奨wtՊޫ$z R{tlJ/]b#(f >yڰN5C*ez"aHrME}OMAxv k`|t I:aըo'ؘ[ِm?,L|Hwg>5m_@b֏r \4,znIsLVx?X b(#<8TZтEpnZD՚-'CZ{=tLAǯ2"ۡN BunTX#/WUF;M b8)+)ig8aV[k]^wJ~MX<%u#Nku1L⻃*Nm\"0@5|qzf&mf{ZN+_GK-Ir;'⋸<\C*XFz ֲդz~5G%._@:4'87E5~Mj1I>2û4ß&ӗml^Ā> 4@ 6&*,Ϗ|br1 sx1(T |k.QK,q@*"T37__R`F+ A|AeфTۃE(f/+Ksk*ð4%,P(8[Z WefM/,Q'/M_r3bX9^NH|5~;O]r\2J*XADiְ/̟Iǃт^'X>%4Ij6_AlDDv?!7nL }!5 貎{0lIc[U4("j)c3m)Opcv&Xds c#|(Zi,{ y EWGCUQyf uD q ۥu]K0 Г#Zsf0"om̮5è 3Z +G W9Ax{Nx0:ʵj| M*Z|d-:Q6 *)-oD@غk[ϱ婦ր!]DzAoR?&<<8圡ެ{d/1̼¯=T - \=ՁqvEv=8.:dsN'* 7?pkŮ5]K>6+u,ͻb壘CZyU?448 bE6s Z 8kCb0(7s_j˄/OT=̓KU|XEÎVKABO4R|߱ߗd<>('P8[ot'ѻ+aٮx .@ fwdbeNwπ,0V[T3l Tq`4eMg9{nOh$ 6 o&v xs>'Г+Ijf^czd3|ƷF#MxΦѨQFje)Co R zv1wAsA\Ɋ4F8QŢW<éRG"V-wp:s\cn^a^-!V/I_? GT.53 8|e`aLJk*|3+IhtJ#үT>G``ߢKGA/KcW@>fp*as( _Fin%\eX TX< WgH SiD'hViGj4X$))Z9NK__ "I|T,>0?QF߲GXY|5%p {RzY*#9"d|bOB0h=H},>Ǖ7 B#Xv1#eHpTQIf)~0wg'pOpEm˻^1so_oMBh#;'㜺Rȗ$AG ێaSG  73ڦIf*OȀe-PZPgyH0Eν.4. ayИ&M2DdY-r_{$wOj4w?\?)VYC'UJy!YS'cs"$ |vtp K 1G*Q!1q9یxrpS "BFc[(o/=aHh<P!X˖b&jMJ}:( bLkP13Mq$ބ,.?@:[^?S>;6ygMp^Kjg*_aL[7䦹x_]T $~OZ-H?|ZHc5)FN-Ǟ nsc9La2K̅-5C[_عf%9: l &fN5ѯeSIuVbpJa|FeAD {&➦|yx5C "06MH ۰JS{/F К ^0ld lV@2'IٹuLL6H^w%7O՜jmD}sn4M-a_D/ ۸ uOPx E3µ8!,瞑&L<:XuCm( Z4]vH&j>؇?ؘh;-/,sQtT[GSiB m줻sOWDG2:W_s%na ptwbpB<X)$ z ̻)˽DH_wĝ~T3RS:B%ggR{ |`^/}E ӂ1Ӈ9V|F&sxz{c,9Eއ3Âm'/Iaֳ.8JGKksϜOfv?>99H'KQn "P3JA{\Sa3 w%lIn1D3Mkɇ} ekI٩Ñ ӏC#ԳuڞJԃeq"ICK Qo$j_UwIK)} $^t衘YfXi2&@S`O0sDZJgCJ2JwرL' on& #ݳm2bU'eK^ >qP+\n;Z0U~d%x)"F$#_s aD=Y[MTNxLo)R%eq3t9WU\^0R$g1 o%/Tp3~A670g3:ټMb!ljPtY]9 }af/c(AD fl?" {|'@$x})B$QC>W,@N챜aG9d& we B;4O&VJXt 9G{cYӭ6ǝGTŚ{/p[DcԄmfґw{)FµLFo)=,$sAM&.W1^SP fYgCc{S%8?#x](mě.klKI: >h*?Y|  U[^lgPA[_Ô`N ;kn"ef|e .AGCtt*m#$dW.s]0bOAûp3ytI8!&m"4Dxה(_'+ٵ:$:`g<}lnq:GUBܰ'n~]R".A p&T e:nB`FB C4&K6M"cy3M.t?)^PzdgY M(WZqԻֻ + kVqb=mh)T?q7ZH jZp]DGzF;!8veP;aW|(hS1tCB`ӄw$KrܽpFz2BhhJ0JsAJ2h3fj܇[4'J|U}.3" 4e|+ٗ9 *ˋc9@ˁL~rR,yr#D'dWH&p rX_ 5ө.Lkт݋Zhvyܦrq|qg( Fz.,>= [V1 *8,7hF뤑|G/Oi@*dϫzp(}TC3_+rqJjt*lojݭ?_,ٮ!Kū 'l9<+&0nJ}-$}F?y-G2 *:krx% hF֨W=+>#Ȟ4Yx5>C=&$TRB,YUW6%ATf.;%*bW6hq6YF<-5Lٛ!OM_Lyb k[ܵ#ۧw`A5f{ g_@?y3p_QnjӿTE+Cz5-m0E)r2nr^A+ Bb5|k?phNY5u9#&=P!XUӳu3_6R{yYJ}3R7 #G~"UdV6#F393gt5_GAZL~Wh&8]pB:GACI45`rj[c`HPÌien5[x‚Td<4f9j;3;9;xcWQjґfmŝ,%αĶ@wA-KIt q ' HI(rUa.?p Sx?a\2-C'8W'AxGv LaܱfnA%qyt,6JnkҶ@h6[Rf&h1#p[*]kEGPTNL1K,#e|ND^Fԟ cmI Rrj8}ΧN,jl$Yg Pu9NM+SXqr#Uɪ[9"L;<eC_xѝb} ć[T૏UΖ9~-9zC1$!3ǿH~g㦕_Am:^*׫؉trH]ᮕgc,αzL/I'*-̔ $3Sp>؏)PSCjT  ro˃C_cc.t@mbLCWғA3ٗ>({V< $84naL.{LКsG. ek  W~@=Cӳ7,p|/nRjTI(KG7BH<ꘆ>ӳ\i=d.ݵnmm-Ih%ïz`klVz@ {Vu8DP8#_,6vjv`n<CpΙi啕;ؿ(($@bI cWzZÊ9[Vs&' &)&=8w}zOz?O&,lX59}b !|!uXM|"ǗYDqyŘjuLN،^ t94n*u!ђ@ȬR4" mRDClv4τ4c:4W_oUSV9fIwZ9}jK#C4\SsoDE98p7X ᑵPoma\^߼jѿa&o?z*lfv}@nZdOLE7j7t17uRg7"%jC@Q+fέ\U`\J0Y{e zh|!k"nrH(2Ph=*ze =̺q|4e,{JdM8#5=cTl):ƃy唼&P_ptL)DԣB =G{X$vkZM`99g\PJ@ܰY@Z3-XQFW5 ZgN&&<ݗhոO~\7VY{@V(I\E/$Td_ο.'˓"ŮkV[b7A3ۺ":U]Ot𷣓*I]rlҀvz&*=>_art-ń=}G50fj3<-9[ 'ÝTg"}hl ~=@F0tB:{@jMG}2{P+9zOZ ->eܙ3ޭ2Z{xZu'= 4N#-Фbc WB:Xak<Ib^js龕Nj{')E<sj@2v1õ~C7ej!:p.%Y:ae5bV]0S #!)boX:Drۄ{6 uCTѩ*H~^j_5CD )uW)N"fsJE~2aЛW q0i^Ih̳Qf ӿGS2_ʍ0$9ܣdz[rToAs.heCWM[a06Ë ޫbӄu 6$uǛ/D>9׭AڿNqSR(u ƍEs!4QfJwQ T{#ghn򞶰 T;6#&0 !r" *R6cHQ[~`8iY "TR4ޓB2ALZb:TG#dt0=(%9ބH͠L?6CrCA)2b˳ dШ\5{B $ֻUG[_JwDEΩXyaSke0Lw:7$2Z˹2 l:Dc,;B(hQ>z(oզ\sG8\#4+9OoL< Y 檅;R?cOa+\4QR XC?4/ [$h %p坡W+YBlU~0xCbt={:G""oGd^ vwc:v8qjٴss 1j j"UFPQH%6~ ˎ8hXq^7&3=/BfU@&bB`mI,rg~( IuK{*D`gB)|Xlbf(`!x0n 4[Z{+|>"ҹ;?ڽcqRwިYh\o-'Բ:} c7 vKڻfjZ+HyViF!Dv,؁W"@ݕbuX'}6\XV*W9C94Vp{$#:QA g$, w՗BP\E1mSX1曈i\OpKr^ HUqXw@R 7LmڙN ;."1$@Qber/WapJ}@!m !;5yTHCf,)z%:=z iBtD{N*-ެ5贑 lCRPMF`aEO(]uGqTl+@q̬6xMħDeݺ^H*eu%} ^)|hXC;e2@z=O"d$3YF^r9uF"t"^V-uȹum( uK2 Xjx0sw=Z 4|1h@aN3}z6|AK/-I/$C6CdXnP- Jwy0gG^e$hq\oZh(*5 "XRN栩Iuo ldJٞ U019\Pd9N^w 5̳tk8| lPtedQ[?s0 a6q_\4wU"IHeX/}tݲ0%?hBt}x/Y+\iJH(OLZdVQ%Ssc,Ea ߹kF+ ^~60P>̔R @֊0۳ 3H%;~> )+[b_%`e]0tFNpܓx-s5BAH^!A'5Omm[P$jLg%;hlYwcK+臩ً*&x񐱸TP_ۯkZqQvx1h?dˆR[V:b#Xv|6Ͽ׮Z~>Qtqio.A# n+52(ΠRG"<*x|x= VPu$j ]yɫ"֘nmP=f/;8 Ѡr;[!R0SO!{.Ɠ~"lV:ϡ!ӫH]|6^ԣLܭvխS2PaH,}Z-[DöIFBޫ"%\_[Z` D؊]wUI2=HE9~_hLswQnos!dcHW^*ThDx_m}ы}(" [[9Y >يhժ)ko߻ .C޴Ly-SVYt L[FY'[W^y@j?W;gdN2qx녽e`C8K$9un~_?cGHF3XE>sRW8I0999D p{4Kѧ?Iy}JSw/2 LؚP_LVg(dףKۦy` KYmKE}_3epO?[Ya wЅ|3C1K8muX;ds#@W>?UO.mAT7ӽvjU񣓁;h s.UCIҀ^qRbT2L]/ɣ {*WD75&vö+mkf"B dsNo@ n/|N=@%bg>ƘR37Y3ȸbʴ,p^%eN~( 2$9aq;RB~g=R>7۳M6߆ cA|x"NlB;81t9ayR_ʅ@-aiDsʎNl#K[_|y/"Au8U8C0 f6dRZ 8L$h01Q¹{_qR1[V=KEc yʵz+*:~ Y4\2$}I܀oNp( 3^&XI4.v<-sqab'z?;7æW 5>,o*V= ,m$qW|{[G7 $~aZJv5-%;v\qSX^ d^:8ڸۄ5':\&}LvYC?Cڠa6q4z~ R2<'Y$"fւ_ߝ<b\uHV䔬sċ8dK]? g%d!(VEY#Fs" <@]3Gz-f5-bjK i~"tn\ߨ`O#ML;$ > [Rh~9b-Չʊ+Fj)=bY/!9y{gxVupR峅f,1! ]hݮxb$⯄Sk'ZatM,qH5?4.Hg71來/N{&U)l?$* 8g tK*K{(n:z"(qC|FTaJdچ1 Ce&(CZpǤj Q [^HaZ/Z_ YJ[2x"j;?{+@>\V * "fܬBjPUPSFrCѵh^u9|5';U1t.H=}Ze*n 0;'#SF(SiQHZwEH&/,Քk1YQ80_(7yyZ~XPmsέ[?w 6Y$AHv,Sm=]a#] `ZXgdqdJ}ylT݌oP>H/6jT*VQ[ș}ڶ?=.gՖ*>8ኈ}/)bYYy豿6%"n\:<UnNϗ6Z =xZR<,hw8IwF;}c9̝+4{M .}xmٱ*Ѭ(  IIt`HVᎩi|,j(Tl߇n2п!ߕ8+YWcV97l2Nctkעk"JkD{@p&Dtno 4}].㔾[w n-6V[T}e:$?F oFb vVB| };wOzku k֝c4t4(qLxSo1i,//z":4~wpe {7sX?hC=.粻Smڊ+Zη4 dnT#YE3E ^SáBP.uL~Rn#|*5X U{#=LeFk_!3< W0RMa" 3k%S=SǪ4} |K C=E.`Ghbgk*M;BCԢ0յ)x%ΚOEw +rWTGܹ͟m`0 THBub (zn3YQPƴ`q\7FI8M() 9o:NͳSw}e*L@(nN;mCx+)H˴!ki&2Wvih;zD}^+n!Jlނ~o_zR+K~Z;$#f)Y\ 2'`Fв9Wm3jTa^:700v kcUp ,Lؔ*9\ؿs@ɟ^P q8YgHf_d!qN)#i@] .]p)J~*i9 bȝ{rY RYUޥ^|:pF g˳UJ6g ,^Q~=J+clP+I[(m07[4Jg sr}|@0Kg~Vq 7}*tDҰBUuZ""A$(L1AO3^bd7+ɛ1+5xnT~nEK88tÒvudQO[ )!³4`jrU8RIe ɪ77PVV|IdEN8,jIDl)ّE$6Sw88!2?c2D, 횺(@iyxoXߩ~&6=iDĪ|Ѯ Z$vwW)69pL ~-lɼKvx#*cnB)㊅) luB[JqA&j;oY侑=a Ϻ$5x~TAvR< r\kRؓm@U~Y+7Cvˉ.tO"^KӶ0/@Nk DY񪈨Ds ,.Ww.HԨ8/ʫ_yE7 dG}Մ)9 P^z`FRU'~-_o׀o}e&} w2@y3| WAO2H4Tز|;|n'C7@6BxOTy6gl >'5]31Eow?#jA?h¢6| aܱU7]_ ECXt$Aji1 ] γD,O<|_eo"aoQfD615W$?18%Y.9hm֚@ʗT_Uħ>1O[":|yWAtLveqx @Ҷ 3-Y*oEBPLQ:BmKeS?W X` ^^dQ2)onǯػ1s"U̸{5M nmM@S8pxI0vɊ% ^>!tx{ {rxe2?If+ė LFpc./g6`7+?tX6*i!B4bE/iYλ #Woȵ Isp;dlvIy3M9ܪ1 ÌFTl P*V\rd`}IӪgfԟ$˞ Te$|.uA:  LX6&Y^IюkyDT*6 6%ɿ%2`>SQ5u;)"~Q֛QV=7 oh)2J8QiDT?S!{NjX`TMvP9}9 |I9s6+ $%CI.KVy#3/ZТ'䂢/Oi2e_ SCPjxu3x T>5#L 9Z^N|}I 0}Ƹ9#K,  CaΊ!sbƪ/i+=c؝gۜ!6I6{9i@ 3*D#ۼiZ .>3$O|@>lmy^ yZE8e S*Kn'3(>h7XΏ 9q.4hjQ #ZHm:p ތAΑ^v"SW:- ƤhRp6DK-eI<Ѧ`*_{I@"vh^X8Dl}bX_Uxր:eNl}l[& $(|uO=IrOxGڗ󹢉'PhA`(YTw/.J\i#?eⱋ'г3i{3}RV3lǯG_406@U Pcb¶K9~{3>=Ya6f{+L_rFy[˟zF&vBZ_#3^(PI@ 9<.C_+D=9NG⑮}%8|c!L%"W4- ^rUuA;&XvAQ ҩLO MƂöHJnu9ukQ* NɤgYIO|T"SK@! <:uҥ1ʌS 7{Cl2GIa#%k$%6$!~^V$AcA Ro%.9ҡ$*\ v!@6onNl_$dvN&/)\~s1o4-[C;vL{ȁ n׼%᷽[Ű~5ǙsEz>ϓ6b g xh7x ;pA|5Gu.6Us"t ] Sdհ=y磘AHdRGEu}Y]vj޺"o'`*ѡ!,}P_']` 5*koJm ˢgȿG,&i[AM5m#0&dmStE?8yB=bR؜ vxz2s_mhQuI#`+mkѯK1mov$+h47Y2<6^T@oCf)lH(O'BH $$tprza__79DbmYm 򨵅**f"t[B&|^hZBa٭!Mw.`sgèqO"mP/M^W(6Sڙe^,{$kE(@y{D^8ʴ%+}܃uA܀Pl1m( Z>fK^(M|/Jkt prХ^PӋaR>k$rC %:|lv4MU+ Z)8 8Vɤoc9W[hi%\}&V 9챬"(dV8/u"Iy(*A}L⦃&W|XR4Kpfm'E* w86rF4y&`)_T#qQR Xpu/ܦrLxzHr;DΓM;^9.Nѵh*to;}!]Y0xHS=yZ=Sf !]F gN~8+ݔVߌh'+X O*|[3Lf&czVF U#Xr}!'uF4t3@z4$QS!WR \dkJ">Z: QT xpcֆ#ZAyW'w(#J]Hk EH?@) $`II0 Ma&w.E5PR^@8 #βj6X]Qz {4-]ѮE01 #K}HlƜhSU_rX[r]1L$GS8EAɀ~\Ojaca(œhOmxJ@)SubMLv0)f]MJDy __MRL2\=kt&J>0 %6%8<\aT9tqdsoxAIAV[dy2焍]NJt F+ֆQKYo{0=FK^ퟍ%{ܼ qd[e Y87_\lmxdE EpطL ~uSlv|dZj 1}fV36O 7礒݇dx15F*KTu6;BlŽVm@啫td$pb2Rpd{›0PANzDhj=t}2GMl?.yܾ0`NLߘ)&}&VbBIa)(a?  iPGwAysZAm+qj‹SaI!4jlE4!/͙$_ߏw5#}*/Am$iAYͅdˆz7ި߽Yvwۅ,iƽNj|r+3R!t q1A0?69«z2b̟9]5@C[|17pڲ}f%]mDٛp:!Е{ 9eZ҃{@n%;%?j3mG,;H O9m?`sЍ"݅/# ,< , t`b9_1*h=xEe"uE@̫:_HRjEp# yj{y.^Y@øUӐtw)nj4J$9:{/KĢ*"zWB+W.v}6Bx돍?xS]t$ͺy;.].;H%!.=h$4"($eAd9lSmseOz]cKKЙ%zOjw $;g+6tߢ4&J5,9CP2TuHf%6=>w| k?Bbi(()<<ڦ4?YO2EH #Pv'&"9ܶbno,~ .#7n?jס(ݠ=v/2ȴɒAoR; 堭@Ph:]Iٓo0V/P}&tOxZ*|2 y6.93e֖&^==b Q 0wn+&,.ۘ>t=-I]i#9TF˸k#\XgA趬%cp_ É1ܷ 1[5MZH/n*|0,$mKpc=nd`}l 3 mDH]M`o"<X,{Q-%3c?񠌠l1;Oh0P B/ :(yFcbI䬤H 4zЏYe?=|lS56 }fXhRZgaZfB 6tvv+ &t._sO*hV-9;/<ŪLܖn m? I ƿhϻ_?Xz.g s%ij|%KNTJ.zxFMu%7ѕfPx3XP%ŮmU{g#؊jir1dZQ}EFhTI:mv=.y6R߉U9yً|Ѳ~J)D3:r*UǥFSv MpHuTJJ4&"X s GEo˪EUszՠfrb˓sq?䣄܌ =`<*34o芎E&^BMR!"3v"i4b(:DZbZR4ze=J 5bR|&%gJ#w愰\Ʊү|VD&E_^dR-gU#"}2^*DR]S(fV۾f5wwoqOl5h?CE{H"[L9AnSj.ѳk+l`0=k')h6J?BU!{so>b 5&F0N%3]AQ"`jBᩋ]ƥ} ~?,me!SÉ;[JAdH#e:'oeτ$-g`fENDJgrr2gEAEC<3؆˯6M4m#6>&!C]@ֶ:7@bL &q @wSoZ]Q+`y0hl5K;jBc|2D` NG,j\(lTˋE^bN{ <7|$=j8n-!6,:bQa:0?#F+7,)LOh@S}x ~'f"ˎELc*?JMǛHbEt/uYgCCdbS0MET1b}w[\C1`>QA uˌT>-eOocd!u{<@QX*t+?QVN|47Q6@Ԧy0|Don灖Iys(i8U'n֝F@^Xf1i@%#@@1XW1S5\R@QvQ5*HUPV9f eVT Nb7.6ճ'BV u  hh4-GAEx5( ;pް%LTѐOXQ&ڇ䢁rfejriԃfUY"AciLE.!8_2h$f[#Do)` < ÜZ ).T?YU)@|h wDҽn"4zkLRb=5."# z]"m[(3{? GLYOfXZetY֊i{"6iPHL}W%ڹ\7o4Bnʋ'^7 T\ mSs8HNFmw! }(Q=ciq]l(C)"0_RWF}"k;lC=V]xM}D2*Zv$ҙBZ! .m P UlW<]@*~IENDB`PKwL\|x;limit-login-attempts-reloaded/assets/css/images/welcome.pngnu[PNG  IHDRF pHYs,K,K=sRGBgAMA aIDATxkluϝcDR-9CƒFDՃRbK@[ @K )a .‰DKv,%bH4p DPD~TmUQ$rwgrvv̝? wvfs=;xϺ }j:}8Ì <r'ohc>عj cY 9>ƴ$K|־a1U9VgO+gq޸Z$x&I~(%Q$w'71RU@ڹzp5oQ^i[(hT8l#ܹr;E!ca6GU- OS؈QV{jl8kqԒ 41usflO]&M\C^hSRN}(ђ㚡O1J~k1 KGE_NI!۶&]v<r!A앨U)@#b}J*2Ȇ#;Wʼnm޼rMHk6we?.5xñkaAbCT֥^rB\+l>$Y8aMӖ5į ȆVOǕw+pO-Pm5A҈G5,_BeQINu_85,U,*'XBZu@ed1W_.kmX#ykn:(_щwJ KlOqū,D狖BJЫ$KЬPA8-p jaԥ't2v$\٬ѷO"E&IJ kdIL$;( 48Գ3sxVBKKR~vmenPՏd^\Λ/bfM"Usa*1N1u(`u=X0cDfi]])loiDSz-8 kQ{e|VQ ^o:>5 EV@ƟmhU ֧,lH O x A9eMG{wl * s"hU v,7 XOxFD+ִL}],O(zAy1cAߡQSZF2}㔛Ŋs "m~8cp=V|,{R# V[O"}:Β5j4gfF;SB"q.$OOԉ!a~}3_2 uI4M=!pk z !UBPtgu{gqu D'{f B"H$F~O_S>Cu.dRmĥn'pDhx+>#=?&@hXT2r Nlbaa &ԏ~uQ?!$ ~~}7,Ï"TA/n鮦?n{:n~L0Y"rìj4cX);{3\Lby!"cڿ?:H \@w: ikJ,Azӈ1]8t"A"`O/e{,*>v1rA Q8r1PWɉ#eFlFwiZc\\7N:NWT3:9clzsd`K,A'ڂ6}cPC.T@sqLv|;J#:DB9EAߴ%WفIw3#0 ^/Nݍ\O"чbs)VȎmVy&7/Ѓel.{pOf0aqe V2Zz>y\֥& ]h(Sm?^YDdc\,%#+c||Nu%A/{K?ZDd&ӣm!vUy Kd5 v_#ՌY\iՋ:Xɗ*.}"K\# ]`,rJg9d;?R:*mCnj V1Sm0ė<˲]S3nh8:H.PJ *Qj EwkFnV>k"lvӟfIQwg0g"k9H^8 =WUۉ#f\#3ژHd4Ftxu*N):m%3SVU}O O7ɷjƉR  z+$aׇOV>zU']ٙS͛=}[2k(^U2 *yNҖøDaMr\VDv *͸G_#;Ai┱ țP+i@r- Q~p ^>"*<|?khL+ =frnVEdOc#)qE\ %*+,; ^;X596x QQqyHRDqG W2ef0|UCDY}*E*~,/^n*|HȚ""wA4g lUD] r&⋯h&q+M$]jC jQ 8D+zmE'%1mH(0";$ v* U64rPQK - 㖕7ʝoFίt'8."::b+ ܉gOnB3b=$"c5~S'z\W1V'q!Eݢ2^xt{VfdbcVgY^P)"(PWm ¦7 `vQ󵆘C&q\mZ,b,Qn*E+b";7jX (Д6uE9g;bOpkCmo7q1JNI=Cߠ[)۶T[L,{r͋lM"2D*e)" ~l Fc+Pzog_/{ݷFɽSB{#}߆,\N2d>zo?1 "T1;JPrI˸#+fG#\QP" X݅rmS "UVNd].ٖm]Јu}rRDi/ #eJg Dtc>"P"nzjv'JTv&NlJqfr' 'Hdڣv+CƩ.ew\yk^hwaa86qd\ө}|pgY\K6UM~^PtreQ9Z+>Y hZkꕙmj5ri-!%,mATjU,Yb=(Q$[+Tu,Ip]V'|PE ]1VF\vDmSŷ T{,p1DkZ}24I~'%dbOR_8'q |{~;-axg;Y}+IO8s>qԤCc(hJM[c4('4^=$j|YΜPjMo:*(w'ğSPO۪̓77#72,lӤ2Ƥ&IF-&}ΜRNB?-oJ8 m&(")Ub9 SŢ:2S K<%6g_p"">Z[5"BI&k l753o99BA -Z`˷D${՝|' <M"\ϦmPrɑ_vr l^%̕㪈 fz} WFwƶCЎ*]s>xU%f 5#F궁M:WS|'3f,ăѦx(=֓$VnE _>NŃS_nGhAyH6E5kw&uaƗ/kCg/_l ";\<݊~zm&_|S3n-&f}` 0eXEv^L`w!+)}a/Ë CHRY=~ z X X?limit-login-attempts-reloaded/assets/css/jquery-confirm.min.cssnu[/*! * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) * Author: boniface pereira * Website: www.craftpip.com * Contact: hey@craftpip.com * * Copyright 2013-2019 jquery-confirm * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) */@-webkit-keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}body[class*=jconfirm-no-scroll-]{overflow:hidden!important}.jconfirm{position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999999;font-family:inherit;overflow:hidden}.jconfirm .jconfirm-bg{position:fixed;top:0;left:0;right:0;bottom:0;-webkit-transition:opacity .4s;transition:opacity .4s}.jconfirm .jconfirm-bg.jconfirm-bg-h{opacity:0!important}.jconfirm .jconfirm-scrollpane{-webkit-perspective:500px;perspective:500px;-webkit-perspective-origin:center;perspective-origin:center;display:table;width:100%;height:100%}.jconfirm .jconfirm-row{display:table-row;width:100%}.jconfirm .jconfirm-cell{display:table-cell;vertical-align:middle}.jconfirm .jconfirm-holder{max-height:100%;padding:50px 0}.jconfirm .jconfirm-box-container{-webkit-transition:-webkit-transform;transition:-webkit-transform;transition:transform;transition:transform,-webkit-transform}.jconfirm .jconfirm-box-container.jconfirm-no-transition{-webkit-transition:none!important;transition:none!important}.jconfirm .jconfirm-box{background:white;border-radius:4px;position:relative;outline:0;padding:15px 15px 0;overflow:hidden;margin-left:auto;margin-right:auto}@-webkit-keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@-webkit-keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@-webkit-keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@-webkit-keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@-webkit-keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@-webkit-keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}@keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}.jconfirm .jconfirm-box.jconfirm-type-animated{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.jconfirm .jconfirm-box.jconfirm-type-blue{border-top:solid 7px #3498db;-webkit-animation-name:type-blue;animation-name:type-blue}.jconfirm .jconfirm-box.jconfirm-type-green{border-top:solid 7px #2ecc71;-webkit-animation-name:type-green;animation-name:type-green}.jconfirm .jconfirm-box.jconfirm-type-red{border-top:solid 7px #e74c3c;-webkit-animation-name:type-red;animation-name:type-red}.jconfirm .jconfirm-box.jconfirm-type-orange{border-top:solid 7px #f1c40f;-webkit-animation-name:type-orange;animation-name:type-orange}.jconfirm .jconfirm-box.jconfirm-type-purple{border-top:solid 7px #9b59b6;-webkit-animation-name:type-purple;animation-name:type-purple}.jconfirm .jconfirm-box.jconfirm-type-dark{border-top:solid 7px #34495e;-webkit-animation-name:type-dark;animation-name:type-dark}.jconfirm .jconfirm-box.loading{height:120px}.jconfirm .jconfirm-box.loading:before{content:'';position:absolute;left:0;background:white;right:0;top:0;bottom:0;border-radius:10px;z-index:1}.jconfirm .jconfirm-box.loading:after{opacity:.6;content:'';height:30px;width:30px;border:solid 3px transparent;position:absolute;left:50%;margin-left:-15px;border-radius:50%;-webkit-animation:jconfirm-spin 1s infinite linear;animation:jconfirm-spin 1s infinite linear;border-bottom-color:dodgerblue;top:50%;margin-top:-15px;z-index:2}.jconfirm .jconfirm-box div.jconfirm-closeIcon{height:20px;width:20px;position:absolute;top:10px;right:10px;cursor:pointer;opacity:.6;text-align:center;font-size:27px!important;line-height:14px!important;display:none;z-index:1}.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{opacity:1}.jconfirm .jconfirm-box div.jconfirm-title-c{display:block;font-size:22px;line-height:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;padding-bottom:15px}.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand{cursor:move}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{font-size:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i{vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:inherit;font-family:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-content-pane{margin-bottom:15px;height:auto;-webkit-transition:height .4s ease-in;transition:height .4s ease-in;display:inline-block;width:100%;position:relative;overflow-x:hidden;overflow-y:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll{overflow-y:hidden}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar{width:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track{background:rgba(0,0,0,0.1)}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb{background:#666;border-radius:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{overflow:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img{max-width:100%;height:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty{display:none}.jconfirm .jconfirm-box .jconfirm-buttons{padding-bottom:11px}.jconfirm .jconfirm-box .jconfirm-buttons>button{margin-bottom:4px;margin-left:2px;margin-right:2px}.jconfirm .jconfirm-box .jconfirm-buttons button{display:inline-block;padding:6px 12px;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;-webkit-tap-highlight-color:transparent;border:0;background-image:none}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue{background-color:#3498db;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover{background-color:#2980b9;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green{background-color:#2ecc71;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover{background-color:#27ae60;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red{background-color:#e74c3c;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover{background-color:#c0392b;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange{background-color:#f1c40f;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover{background-color:#f39c12;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default{background-color:#ecf0f1;color:#000;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover{background-color:#bdc3c7;color:#000}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple{background-color:#9b59b6;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover{background-color:#8e44ad;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark{background-color:#34495e;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover{background-color:#2c3e50;color:#FFF}.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c{color:#e74c3c!important}.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c{color:#3498db!important}.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c{color:#2ecc71!important}.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c{color:#9b59b6!important}.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c{color:#f1c40f!important}.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c{color:#34495e!important}.jconfirm .jconfirm-clear{clear:both}.jconfirm.jconfirm-rtl{direction:rtl}.jconfirm.jconfirm-rtl div.jconfirm-closeIcon{left:5px;right:auto}.jconfirm.jconfirm-white .jconfirm-bg,.jconfirm.jconfirm-light .jconfirm-bg{background-color:#444;opacity:.2}.jconfirm.jconfirm-white .jconfirm-box,.jconfirm.jconfirm-light .jconfirm-box{-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.2);box-shadow:0 2px 6px rgba(0,0,0,0.2);border-radius:5px}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default{-webkit-box-shadow:none;box-shadow:none;color:#333}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#ddd}.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-black .jconfirm-bg,.jconfirm.jconfirm-dark .jconfirm-bg{background-color:darkslategray;opacity:.4}.jconfirm.jconfirm-black .jconfirm-box,.jconfirm.jconfirm-dark .jconfirm-box{-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.2);box-shadow:0 2px 6px rgba(0,0,0,0.2);background:#444;border-radius:5px;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button{border:0;background-image:none;text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none;-webkit-transition:background .1s;transition:background .1s;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default{-webkit-box-shadow:none;box-shadow:none;color:#fff;background:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#666}.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake{-webkit-animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow{-webkit-animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-2px,0,0);transform:translate3d(-2px,0,0)}20%,80%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-8px,0,0);transform:translate3d(-8px,0,0)}40%,60%{-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-2px,0,0);transform:translate3d(-2px,0,0)}20%,80%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-8px,0,0);transform:translate3d(-8px,0,0)}40%,60%{-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}}@-webkit-keyframes glow{0%,100%{-webkit-box-shadow:0 0 0 red;box-shadow:0 0 0 red}50%{-webkit-box-shadow:0 0 30px red;box-shadow:0 0 30px red}}@keyframes glow{0%,100%{-webkit-box-shadow:0 0 0 red;box-shadow:0 0 0 red}50%{-webkit-box-shadow:0 0 30px red;box-shadow:0 0 30px red}}.jconfirm{-webkit-perspective:400px;perspective:400px}.jconfirm .jconfirm-box{opacity:1;-webkit-transition-property:all;transition-property:all}.jconfirm .jconfirm-box.jconfirm-animation-top,.jconfirm .jconfirm-box.jconfirm-animation-left,.jconfirm .jconfirm-box.jconfirm-animation-right,.jconfirm .jconfirm-box.jconfirm-animation-bottom,.jconfirm .jconfirm-box.jconfirm-animation-opacity,.jconfirm .jconfirm-box.jconfirm-animation-zoom,.jconfirm .jconfirm-box.jconfirm-animation-scale,.jconfirm .jconfirm-box.jconfirm-animation-none,.jconfirm .jconfirm-box.jconfirm-animation-rotate,.jconfirm .jconfirm-box.jconfirm-animation-rotatex,.jconfirm .jconfirm-box.jconfirm-animation-rotatey,.jconfirm .jconfirm-box.jconfirm-animation-scaley,.jconfirm .jconfirm-box.jconfirm-animation-scalex{opacity:0}.jconfirm .jconfirm-box.jconfirm-animation-rotate{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.jconfirm .jconfirm-box.jconfirm-animation-rotatex{-webkit-transform:rotateX(90deg);transform:rotateX(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatexr{-webkit-transform:rotateX(-90deg);transform:rotateX(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatey{-webkit-transform:rotatey(90deg);transform:rotatey(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotateyr{-webkit-transform:rotatey(-90deg);transform:rotatey(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scaley{-webkit-transform:scaley(1.5);transform:scaley(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scalex{-webkit-transform:scalex(1.5);transform:scalex(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-top{-webkit-transform:translate(0px,-100px);transform:translate(0px,-100px)}.jconfirm .jconfirm-box.jconfirm-animation-left{-webkit-transform:translate(-100px,0px);transform:translate(-100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-right{-webkit-transform:translate(100px,0px);transform:translate(100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-bottom{-webkit-transform:translate(0px,100px);transform:translate(0px,100px)}.jconfirm .jconfirm-box.jconfirm-animation-zoom{-webkit-transform:scale(1.2);transform:scale(1.2)}.jconfirm .jconfirm-box.jconfirm-animation-scale{-webkit-transform:scale(0.5);transform:scale(0.5)}.jconfirm .jconfirm-box.jconfirm-animation-none{visibility:hidden}.jconfirm.jconfirm-supervan .jconfirm-bg{background-color:rgba(54,70,93,0.95)}.jconfirm.jconfirm-supervan .jconfirm-box{background-color:transparent}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark{border:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon{color:white}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c{text-align:center;color:white;font-size:28px;font-weight:normal}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c>*{padding-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane{margin-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content{text-align:center;color:white}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button{font-size:16px;border-radius:2px;background:#303f53;text-shadow:none;border:0;color:white;padding:10px;min-width:100px}.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-material .jconfirm-bg{background-color:rgba(0,0,0,0.67)}.jconfirm.jconfirm-material .jconfirm-box{background-color:white;-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 25px 10px 25px}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons{text-align:right}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-weight:500}.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-bootstrap .jconfirm-bg{background-color:rgba(0,0,0,0.21)}.jconfirm.jconfirm-bootstrap .jconfirm-box{background-color:white;-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);border:solid 1px rgba(0,0,0,0.4);padding:15px 0 0}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold;padding-left:15px;padding-right:15px}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87);padding:0 15px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons{text-align:right;padding:10px;margin:-5px 0 0;border-top:solid 1px #ddd;overflow:hidden;border-radius:0 0 4px 4px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button{font-weight:500}.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-modern .jconfirm-bg{background-color:slategray;opacity:.6}.jconfirm.jconfirm-modern .jconfirm-box{background-color:white;-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 30px 15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87);top:15px;right:15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:24px;font-weight:bold;text-align:center;margin-bottom:10px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{-webkit-transition:-webkit-transform .5s;transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s;-webkit-transform:scale(0);transform:scale(0);display:block;margin-right:0;margin-left:0;margin-bottom:10px;font-size:69px;color:#aaa}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content{text-align:center;font-size:15px;color:#777;margin-bottom:25px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button{font-weight:bold;text-transform:uppercase;-webkit-transition:background .1s;transition:background .1s;padding:10px 20px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button+button{margin-left:4px}.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{-webkit-transform:scale(1);transform:scale(1)}PKwL\я¸6limit-login-attempts-reloaded/assets/css/jquery-ui.cssnu[/*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px * Copyright jQuery Foundation and other contributors; Licensed MIT */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; border-collapse: collapse; } .ui-helper-clearfix:after { clear: both; } .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); /* support: IE8 */ } .ui-front { z-index: 100; } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; pointer-events: none; } /* Icons ----------------------------------*/ .ui-icon { display: inline-block; vertical-align: middle; margin-top: -.25em; position: relative; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } .ui-widget-icon-block { left: 50%; margin-left: -8px; display: block; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin: 2px 0 0 0; padding: .5em .5em .5em .7em; font-size: 100%; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; } .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; } .ui-menu { list-style: none; padding: 0; margin: 0; display: block; outline: 0; } .ui-menu .ui-menu { position: absolute; } .ui-menu .ui-menu-item { margin: 0; cursor: pointer; /* support: IE10, see #8844 */ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); } .ui-menu .ui-menu-item-wrapper { position: relative; padding: 3px 1em 3px .4em; } .ui-menu .ui-menu-divider { margin: 5px 0; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; } .ui-menu .ui-state-focus, .ui-menu .ui-state-active { margin: -1px; } /* icon support */ .ui-menu-icons { position: relative; } .ui-menu-icons .ui-menu-item-wrapper { padding-left: 2em; } /* left-aligned */ .ui-menu .ui-icon { position: absolute; top: 0; bottom: 0; left: .2em; margin: auto 0; } /* right-aligned */ .ui-menu .ui-menu-icon { left: auto; right: 0; } .ui-button { padding: .4em 1em; display: inline-block; position: relative; line-height: normal; margin-right: .1em; cursor: pointer; vertical-align: middle; text-align: center; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; /* Support: IE <= 11 */ overflow: visible; } .ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; } /* to make room for the icon, a width needs to be set here */ .ui-button-icon-only { width: 2em; box-sizing: border-box; text-indent: -9999px; white-space: nowrap; } /* no icon support for input elements */ input.ui-button.ui-button-icon-only { text-indent: 0; } /* button icon element(s) */ .ui-button-icon-only .ui-icon { position: absolute; top: 50%; left: 50%; margin-top: -8px; margin-left: -8px; } .ui-button.ui-icon-notext .ui-icon { padding: 0; width: 2.1em; height: 2.1em; text-indent: -9999px; white-space: nowrap; } input.ui-button.ui-icon-notext .ui-icon { width: auto; height: auto; text-indent: 0; white-space: normal; padding: .4em 1em; } /* workarounds */ /* Support: Firefox 5 - 40 */ input.ui-button::-moz-focus-inner, button.ui-button::-moz-focus-inner { border: 0; padding: 0; } .ui-controlgroup { vertical-align: middle; display: inline-block; } .ui-controlgroup > .ui-controlgroup-item { float: left; margin-left: 0; margin-right: 0; } .ui-controlgroup > .ui-controlgroup-item:focus, .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { z-index: 9999; } .ui-controlgroup-vertical > .ui-controlgroup-item { display: block; float: none; width: 100%; margin-top: 0; margin-bottom: 0; text-align: left; } .ui-controlgroup-vertical .ui-controlgroup-item { box-sizing: border-box; } .ui-controlgroup .ui-controlgroup-label { padding: .4em 1em; } .ui-controlgroup .ui-controlgroup-label span { font-size: 80%; } .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { border-left: none; } .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { border-top: none; } .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { border-right: none; } .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { border-bottom: none; } /* Spinner specific style fixes */ .ui-controlgroup-vertical .ui-spinner-input { /* Support: IE8 only, Android < 4.4 only */ width: 75%; width: calc( 100% - 2.4em ); } .ui-controlgroup-vertical .ui-spinner .ui-spinner-up { border-top-style: solid; } .ui-checkboxradio-label .ui-icon-background { box-shadow: inset 1px 1px 1px #ccc; border-radius: .12em; border: none; } .ui-checkboxradio-radio-label .ui-icon-background { width: 16px; height: 16px; border-radius: 1em; overflow: visible; border: none; } .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { background-image: none; width: 8px; height: 8px; border-width: 4px; border-style: solid; } .ui-checkboxradio-disabled { pointer-events: none; } .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position: relative; padding: .2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position: absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left: 2px; } .ui-datepicker .ui-datepicker-next { right: 2px; } .ui-datepicker .ui-datepicker-prev-hover { left: 1px; } .ui-datepicker .ui-datepicker-next-hover { right: 1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size: 1em; margin: 1px 0; } .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 45%; } .ui-datepicker table { width: 100%; font-size: .9em; border-collapse: collapse; margin: 0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding: 0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width: auto; overflow: visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float: left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width: auto; } .ui-datepicker-multi .ui-datepicker-group { float: left; } .ui-datepicker-multi .ui-datepicker-group table { width: 95%; margin: 0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width: 50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width: 33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width: 25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width: 0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear: left; } .ui-datepicker-row-break { clear: both; width: 100%; font-size: 0; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear: right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, .ui-datepicker-rtl .ui-datepicker-group { float: right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width: 0; border-left-width: 1px; } /* Icons */ .ui-datepicker .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; left: .5em; top: .3em; } .ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; outline: 0; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 0; white-space: nowrap; width: 90%; overflow: hidden; text-overflow: ellipsis; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 20px; margin: -10px 0 0 0; padding: 1px; height: 20px; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin-top: .5em; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-n { height: 2px; top: 0; } .ui-dialog .ui-resizable-e { width: 2px; right: 0; } .ui-dialog .ui-resizable-s { height: 2px; bottom: 0; } .ui-dialog .ui-resizable-w { width: 2px; left: 0; } .ui-dialog .ui-resizable-se, .ui-dialog .ui-resizable-sw, .ui-dialog .ui-resizable-ne, .ui-dialog .ui-resizable-nw { width: 7px; height: 7px; } .ui-dialog .ui-resizable-se { right: 0; bottom: 0; } .ui-dialog .ui-resizable-sw { left: 0; bottom: 0; } .ui-dialog .ui-resizable-ne { right: 0; top: 0; } .ui-dialog .ui-resizable-nw { left: 0; top: 0; } .ui-draggable .ui-dialog-titlebar { cursor: move; } .ui-draggable-handle { -ms-touch-action: none; touch-action: none; } .ui-resizable { position: relative; } .ui-resizable-handle { position: absolute; font-size: 0.1px; display: block; -ms-touch-action: none; touch-action: none; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px; } .ui-progressbar { height: 2em; text-align: left; overflow: hidden; } .ui-progressbar .ui-progressbar-value { margin: -1px; height: 100%; } .ui-progressbar .ui-progressbar-overlay { background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); height: 100%; filter: alpha(opacity=25); /* support: IE8 */ opacity: 0.25; } .ui-progressbar-indeterminate .ui-progressbar-value { background-image: none; } .ui-selectable { -ms-touch-action: none; touch-action: none; } .ui-selectable-helper { position: absolute; z-index: 100; border: 1px dotted black; } .ui-selectmenu-menu { padding: 0; margin: 0; position: absolute; top: 0; left: 0; display: none; } .ui-selectmenu-menu .ui-menu { overflow: auto; overflow-x: hidden; padding-bottom: 1px; } .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { font-size: 1em; font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; height: auto; border: 0; } .ui-selectmenu-open { display: block; } .ui-selectmenu-text { display: block; margin-right: 20px; overflow: hidden; text-overflow: ellipsis; } .ui-selectmenu-button.ui-button { text-align: left; white-space: nowrap; width: 14em; } .ui-selectmenu-icon.ui-icon { float: right; margin-top: 0; } .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; -ms-touch-action: none; touch-action: none; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } /* support: IE8 - See #6727 */ .ui-slider.ui-state-disabled .ui-slider-handle, .ui-slider.ui-state-disabled .ui-slider-range { filter: inherit; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; } .ui-sortable-handle { -ms-touch-action: none; touch-action: none; } .ui-spinner { position: relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } .ui-spinner-input { border: none; background: none; color: inherit; padding: .222em 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 2em; } .ui-spinner-button { width: 1.6em; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } /* more specificity required here to override default borders */ .ui-spinner a.ui-spinner-button { border-top-style: none; border-bottom-style: none; border-right-style: none; } .ui-spinner-up { top: 0; } .ui-spinner-down { bottom: 0; } .ui-tabs { position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ padding: .2em; } .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom-width: 0; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav .ui-tabs-anchor { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { cursor: text; } .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { cursor: pointer; } .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tooltip { padding: 8px; position: absolute; z-index: 9999; max-width: 300px; } body .ui-tooltip { border-width: 2px; } /* Component containers ----------------------------------*/ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget.ui-widget-content { border: 1px solid #d3d3d3; } .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff; color: #222222; } .ui-widget-content a { color: #222222; } .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; color: #222222; font-weight: bold; } .ui-widget-header a { color: #222222; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, /* We use html here because we need a greater specificity to make sure disabled works properly when clicked or hovered */ html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { border: 1px solid #d3d3d3; background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #555555; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited, a.ui-button, a:link.ui-button, a:visited.ui-button, .ui-button { color: #555555; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { border: 1px solid #999999; background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited, .ui-state-focus a, .ui-state-focus a:hover, .ui-state-focus a:link, .ui-state-focus a:visited, a.ui-button:hover, a.ui-button:focus { color: #212121; text-decoration: none; } .ui-visual-focus { box-shadow: 0 0 3px 1px rgb(94, 158, 214); } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { border: 1px solid #aaaaaa; background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-icon-background, .ui-state-active .ui-icon-background { border: #aaaaaa; background-color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { border: 1px solid #fcefa1; background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; color: #363636; } .ui-state-checked { border: 1px solid #fcefa1; background: #fbf9ee; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a { color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { border: 1px solid #cd0a0a; background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); /* support: IE8 */ font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); /* support: IE8 */ background-image: none; } .ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; } .ui-icon, .ui-widget-content .ui-icon { background-image: url("images/ui-icons_222222_256x240.png"); } .ui-widget-header .ui-icon { background-image: url("images/ui-icons_222222_256x240.png"); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-button:hover .ui-icon, .ui-button:focus .ui-icon { background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-active .ui-icon, .ui-button:active .ui-icon { background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-highlight .ui-icon, .ui-button .ui-state-highlight.ui-icon { background-image: url("images/ui-icons_2e83ff_256x240.png"); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon { background-image: url("images/ui-icons_cd0a0a_256x240.png"); } .ui-button .ui-icon { background-image: url("images/ui-icons_888888_256x240.png"); } /* positioning */ .ui-icon-blank { background-position: 16px 16px; } .ui-icon-caret-1-n { background-position: 0 0; } .ui-icon-caret-1-ne { background-position: -16px 0; } .ui-icon-caret-1-e { background-position: -32px 0; } .ui-icon-caret-1-se { background-position: -48px 0; } .ui-icon-caret-1-s { background-position: -65px 0; } .ui-icon-caret-1-sw { background-position: -80px 0; } .ui-icon-caret-1-w { background-position: -96px 0; } .ui-icon-caret-1-nw { background-position: -112px 0; } .ui-icon-caret-2-n-s { background-position: -128px 0; } .ui-icon-caret-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -65px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -65px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 1px -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-on { background-position: -96px -144px; } .ui-icon-radio-off { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa; opacity: .3; filter: Alpha(Opacity=30); /* support: IE8 */ } .ui-widget-shadow { -webkit-box-shadow: -8px -8px 8px #aaaaaa; box-shadow: -8px -8px 8px #aaaaaa; } PKwL\P--Alimit-login-attempts-reloaded/assets/css/limit-login-attempts.cssnu[@charset "UTF-8"; @import "../css/fonts/stylesheet.css"; .llar_hint_tooltip, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip, .toplevel_page_limit-login-attempts .hint_tooltip { display: none; position: absolute; background-color: #4ACAD8; color: white; padding: 12px 20px; width: 180px; border-radius: 20px; top: 26px; right: -20px; z-index: 955; } .llar_hint_tooltip-content, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip-content, .toplevel_page_limit-login-attempts .hint_tooltip-content { font-size: 12px; white-space: initial; text-align: left; margin-top: 0; margin-bottom: 0; } .llar_hint_tooltip::before, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip::before, .toplevel_page_limit-login-attempts .hint_tooltip::before { content: ""; position: absolute; top: -12px; right: 12%; border-width: 6px; border-style: solid; border-color: transparent transparent #4ACAD8 transparent; } .llar_hint_tooltip-parent, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip-parent, .toplevel_page_limit-login-attempts .hint_tooltip-parent { position: relative; } .llar_hint_tooltip-parent:hover .hint_tooltip, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip-parent:hover .hint_tooltip, .toplevel_page_limit-login-attempts .hint_tooltip-parent:hover .hint_tooltip { display: block; } .toplevel_page_limit-login-attempts * { margin: 0; padding: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .toplevel_page_limit-login-attempts .p-0 { padding: 0 !important; } .toplevel_page_limit-login-attempts .pt-0_5 { padding-top: 8px !important; } .toplevel_page_limit-login-attempts .pt-1_5 { padding-top: 24px !important; } .toplevel_page_limit-login-attempts .mt-0_5 { margin-top: 8px !important; } .toplevel_page_limit-login-attempts .mt-1_5 { margin-top: 24px !important; } .toplevel_page_limit-login-attempts .mx-0_5 { margin-left: 8px !important; margin-right: 8px !important; } .toplevel_page_limit-login-attempts .button_micro_cloud { cursor: pointer; } .link__style_unlink, .llar-label, .link__style_color_inherit { text-decoration: none; color: inherit; position: relative; } .link__style_unlink:hover, .llar-label:hover, .link__style_color_inherit:hover { color: inherit; } .link__style_color_inherit { text-decoration: none; border-bottom: 1px solid currentColor; } .no_href_link { cursor: default; } .llar_typography-secondary { color: #666D84; } .llar_orange { color: #FF7C06; } .llar_orange:hover { color: #F07200; } .llar_turquoise, #llar-setting-page-logs .description-page .description-secondary a.unlink, #llar-setting-page-logs__active .description-page .description-secondary a.unlink, #llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink { color: #4ACAD8; } a.llar_turquoise, #llar-setting-page-logs .description-page .description-secondary a.unlink, #llar-setting-page-logs__active .description-page .description-secondary a.unlink, #llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink { text-decoration: none; } a.llar_turquoise:hover, #llar-setting-page-logs .description-page .description-secondary a.unlink:hover, #llar-setting-page-logs__active .description-page .description-secondary a.unlink:hover, #llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink:hover { text-decoration: none; color: #4ACAD8; border-bottom: 1px solid currentColor; } .llar-label { border-radius: 8px; background-color: rgba(74, 202, 216, 0.0980392157); padding: 0.125rem 1.125rem; } .llar_bold { font-weight: bold; } .llar-display-none { display: none !important; } .llar-display-block { display: block !important; } .llar-visibility { visibility: visible !important; } .llar-hidden { visibility: hidden !important; } .mx-auto { margin-left: auto; margin-right: auto; } .llar-disabled { cursor: default !important; pointer-events: none; } .dashicons-secondary, #llar-dashboard-page .section-title__new .llar-label .dashicons, #llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons { margin-left: 8px; font-size: 170%; line-height: inherit; position: relative; z-index: 1; color: #E8E9EC; width: 15px; height: 15px; border-radius: 20px; vertical-align: middle; background: #666D84; } @media screen and (max-width: 767.5px) { .dashicons-secondary, #llar-dashboard-page .section-title__new .llar-label .dashicons, #llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons { font-size: 1.4rem; } } .dashicons-secondary:before, #llar-dashboard-page .section-title__new .llar-label .dashicons:before, #llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons:before, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons:before, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons:before, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons:before, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons:before, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons:before { position: absolute; top: 50%; left: 50%; font-size: inherit; font-weight: inherit; line-height: inherit; transform: translate(-50%, -50%); } .llar-auto-update-notice { display: block !important; } .llar_input_border, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border, #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border { font-family: inherit; font-size: 16px; line-height: inherit; padding: 6px 8px 6px 16px; color: #4ACAD8; border-radius: 16px; border: 1px solid #4ACAD8; width: fit-content; } @media screen and (max-width: 1599.5px) { .llar_input_border, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border, #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border { padding: 6px 8px 6px 12px; font-size: 14px; } } .llar_input_border:focus, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border:focus, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border:focus, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border:focus, #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border:focus, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border:focus, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border:focus, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border:focus, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border:focus, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border:focus, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border:focus, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border:focus, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border:focus, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border:focus { box-shadow: unset; outline: none; } .llar_input_border::placeholder, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border::placeholder, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border::placeholder, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border::placeholder, #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border::placeholder, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border::placeholder, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border::placeholder, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border::placeholder, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border::placeholder, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border::placeholder, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border::placeholder, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border::placeholder, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border::placeholder { color: inherit; opacity: 0.5; } .llar_input_checkbox, .toplevel_page_limit-login-attempts input[type=checkbox], #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox], #llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox], #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox], #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox], #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox], #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox], #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox] { background-color: #FDFDFD; border: 1.5px solid #ABBFC1; box-sizing: content-box; margin: -0.25rem 0.25rem 0 0; } .llar_input_checkbox:checked, .toplevel_page_limit-login-attempts input[type=checkbox]:checked, #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox]:checked, #llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked { background-color: #FF7C06; border: 1.5px solid #FF7C06; } .llar_input_checkbox:checked::before, .toplevel_page_limit-login-attempts input[type=checkbox]:checked::before, #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox]:checked::before, #llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before { content: "✔"; font-size: 14px; line-height: 1.1; width: 100%; height: 100%; margin: 0; color: #FDFDFD; } .llar_input_checkbox:focus, .toplevel_page_limit-login-attempts input[type=checkbox]:focus, #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox]:focus, #llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus { box-shadow: unset; } ul.llar_list, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content ul.field-list, #llar-dashboard-page ul, ul.llar_hint_tooltip-content, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label ul.hint_tooltip-content, .toplevel_page_limit-login-attempts ul.hint_tooltip-content { list-style: none; } ul.llar_list li, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content ul.field-list li, #llar-dashboard-page ul li, ul.llar_hint_tooltip-content li, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label ul.hint_tooltip-content li, .toplevel_page_limit-login-attempts ul.hint_tooltip-content li { position: relative; list-style: none; font-size: 12px; white-space: initial; } ul.llar_list li::before, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content ul.field-list li::before, #llar-dashboard-page ul li::before, ul.llar_hint_tooltip-content li::before, #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label ul.hint_tooltip-content li::before, .toplevel_page_limit-login-attempts ul.hint_tooltip-content li::before { position: absolute; box-sizing: inherit; content: "✧"; color: #FDFDFD; margin-left: -18px; top: 50%; transform: translateY(-50%); } button.llar_button, #llar-setting-page button.button, .llar_button, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button, #llar-setting-page .button, #llar-setting-page-logs .button, #llar-setting-page-logs__active .button, #llar-setting-page-debug .button, #llar-setting-page-premium .button, #llar-setting-page-help .button { font-family: inherit; background: #FDFDFD; border: 1px solid #2A2F40; cursor: pointer; white-space: nowrap; vertical-align: baseline; } button.llar_button.menu__item, #llar-setting-page button.menu__item.button, .llar_button.menu__item, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button, #llar-setting-page .menu__item.button, #llar-setting-page-logs .menu__item.button, #llar-setting-page-logs__active .menu__item.button, #llar-setting-page-debug .menu__item.button, #llar-setting-page-premium .menu__item.button, #llar-setting-page-help .menu__item.button { border-radius: 10px; font-size: 16px; line-height: 1.45; padding: 6px 18px; text-align: center; } @media screen and (max-width: 1599.5px) { button.llar_button.menu__item, #llar-setting-page button.menu__item.button, .llar_button.menu__item, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button, #llar-setting-page .menu__item.button, #llar-setting-page-logs .menu__item.button, #llar-setting-page-logs__active .menu__item.button, #llar-setting-page-debug .menu__item.button, #llar-setting-page-premium .menu__item.button, #llar-setting-page-help .menu__item.button { font-size: 14px; } } @media screen and (max-width: 991.5px) { button.llar_button.menu__item, #llar-setting-page button.menu__item.button, .llar_button.menu__item, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button, #llar-setting-page .menu__item.button, #llar-setting-page-logs .menu__item.button, #llar-setting-page-logs__active .menu__item.button, #llar-setting-page-debug .menu__item.button, #llar-setting-page-premium .menu__item.button, #llar-setting-page-help .menu__item.button { padding: 5px 16px; } } @media screen and (max-width: 428px) { button.llar_button.menu__item, #llar-setting-page button.menu__item.button, .llar_button.menu__item, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button, #llar-setting-page .menu__item.button, #llar-setting-page-logs .menu__item.button, #llar-setting-page-logs__active .menu__item.button, #llar-setting-page-debug .menu__item.button, #llar-setting-page-premium .menu__item.button, #llar-setting-page-help .menu__item.button { padding: 5px 14px; } } button.llar_button:focus, #llar-setting-page button.button:focus, .llar_button:focus, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button:focus, #llar-setting-page .button:focus, #llar-setting-page-logs .button:focus, #llar-setting-page-logs__active .button:focus, #llar-setting-page-debug .button:focus, #llar-setting-page-premium .button:focus, #llar-setting-page-help .button:focus { outline: none !important; box-shadow: unset !important; } .llar_button, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button, #llar-setting-page .button, #llar-setting-page-logs .button, #llar-setting-page-logs__active .button, #llar-setting-page-debug .button, #llar-setting-page-premium .button, #llar-setting-page-help .button { position: relative; min-width: 175px; text-transform: inherit; text-decoration: none; } .llar_button.button__orange, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__orange.button, #llar-setting-page .button__orange.button, #llar-setting-page-logs .button__orange.button, #llar-setting-page-logs__active .button__orange.button, #llar-setting-page-debug .button__orange.button, #llar-setting-page-premium .button__orange.button, #llar-setting-page-help .button__orange.button { color: white !important; background: #FF7C06 !important; border: 1px solid #FF7C06 !important; box-shadow: 0 6px 12px 0 rgba(255, 124, 6, 0.4980392157) !important; } .llar_button.button__orange:hover, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__orange.button:hover, #llar-setting-page .button__orange.button:hover, #llar-setting-page-logs .button__orange.button:hover, #llar-setting-page-logs__active .button__orange.button:hover, #llar-setting-page-debug .button__orange.button:hover, #llar-setting-page-premium .button__orange.button:hover, #llar-setting-page-help .button__orange.button:hover { background: #F07200 !important; } .llar_button.button__orange:disabled, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__orange.button:disabled, #llar-setting-page .button__orange.button:disabled, #llar-setting-page-logs .button__orange.button:disabled, #llar-setting-page-logs__active .button__orange.button:disabled, #llar-setting-page-debug .button__orange.button:disabled, #llar-setting-page-premium .button__orange.button:disabled, #llar-setting-page-help .button__orange.button:disabled { border: 1px solid rgba(255, 124, 6, 0.4980392157) !important; background: rgba(255, 124, 6, 0.4980392157) !important; cursor: auto; } .llar_button.button__transparent_orange, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.button, #llar-setting-page .button__transparent_orange.button, #llar-setting-page-logs .button__transparent_orange.button, #llar-setting-page-logs__active .button__transparent_orange.button, #llar-setting-page-debug .button__transparent_orange.button, #llar-setting-page-premium .button__transparent_orange.button, #llar-setting-page-help .button__transparent_orange.button, .llar_button.button__transparent_grey, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button, #llar-setting-page .button__transparent_grey.button, #llar-setting-page-logs .button__transparent_grey.button, #llar-setting-page-logs__active .button__transparent_grey.button, #llar-setting-page-debug .button__transparent_grey.button, #llar-setting-page-premium .button__transparent_grey.button, #llar-setting-page-help .button__transparent_grey.button { color: #FF7C06 !important; border: 1px solid currentColor !important; background: transparent !important; } .llar_button.button__transparent_orange.orange-back, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.orange-back.button, #llar-setting-page .button__transparent_orange.orange-back.button, #llar-setting-page-logs .button__transparent_orange.orange-back.button, #llar-setting-page-logs__active .button__transparent_orange.orange-back.button, #llar-setting-page-debug .button__transparent_orange.orange-back.button, #llar-setting-page-premium .button__transparent_orange.orange-back.button, #llar-setting-page-help .button__transparent_orange.orange-back.button, .llar_button.button__transparent_grey.orange-back, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.orange-back.button, #llar-setting-page .button__transparent_grey.orange-back.button, #llar-setting-page-logs .button__transparent_grey.orange-back.button, #llar-setting-page-logs__active .button__transparent_grey.orange-back.button, #llar-setting-page-debug .button__transparent_grey.orange-back.button, #llar-setting-page-premium .button__transparent_grey.orange-back.button, #llar-setting-page-help .button__transparent_grey.orange-back.button { background: rgba(255, 124, 6, 0.0980392157) !important; } .llar_button.button__transparent_orange:hover, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.button:hover, #llar-setting-page .button__transparent_orange.button:hover, #llar-setting-page-logs .button__transparent_orange.button:hover, #llar-setting-page-logs__active .button__transparent_orange.button:hover, #llar-setting-page-debug .button__transparent_orange.button:hover, #llar-setting-page-premium .button__transparent_orange.button:hover, #llar-setting-page-help .button__transparent_orange.button:hover, .llar_button.button__transparent_grey:hover, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button:hover, #llar-setting-page .button__transparent_grey.button:hover, #llar-setting-page-logs .button__transparent_grey.button:hover, #llar-setting-page-logs__active .button__transparent_grey.button:hover, #llar-setting-page-debug .button__transparent_grey.button:hover, #llar-setting-page-premium .button__transparent_grey.button:hover, #llar-setting-page-help .button__transparent_grey.button:hover { background: rgba(255, 124, 6, 0.0980392157) !important; border: 1px solid currentColor !important; } .llar_button.button__transparent_orange:disabled, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.button:disabled, #llar-setting-page .button__transparent_orange.button:disabled, #llar-setting-page-logs .button__transparent_orange.button:disabled, #llar-setting-page-logs__active .button__transparent_orange.button:disabled, #llar-setting-page-debug .button__transparent_orange.button:disabled, #llar-setting-page-premium .button__transparent_orange.button:disabled, #llar-setting-page-help .button__transparent_orange.button:disabled, .llar_button.button__transparent_grey:disabled, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button:disabled, #llar-setting-page .button__transparent_grey.button:disabled, #llar-setting-page-logs .button__transparent_grey.button:disabled, #llar-setting-page-logs__active .button__transparent_grey.button:disabled, #llar-setting-page-debug .button__transparent_grey.button:disabled, #llar-setting-page-premium .button__transparent_grey.button:disabled, #llar-setting-page-help .button__transparent_grey.button:disabled { background: transparent; cursor: auto; } .llar_button.button__transparent_grey, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button, #llar-setting-page .button__transparent_grey.button, #llar-setting-page-logs .button__transparent_grey.button, #llar-setting-page-logs__active .button__transparent_grey.button, #llar-setting-page-debug .button__transparent_grey.button, #llar-setting-page-premium .button__transparent_grey.button, #llar-setting-page-help .button__transparent_grey.button { color: #A4A8B7 !important; } .llar_button.button__transparent_grey.gray-back, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.gray-back.button, #llar-setting-page .button__transparent_grey.gray-back.button, #llar-setting-page-logs .button__transparent_grey.gray-back.button, #llar-setting-page-logs__active .button__transparent_grey.gray-back.button, #llar-setting-page-debug .button__transparent_grey.gray-back.button, #llar-setting-page-premium .button__transparent_grey.gray-back.button, #llar-setting-page-help .button__transparent_grey.gray-back.button { background: rgba(164, 168, 183, 0.2980392157) !important; } .llar_button.button__transparent_grey:hover, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button:hover, #llar-setting-page .button__transparent_grey.button:hover, #llar-setting-page-logs .button__transparent_grey.button:hover, #llar-setting-page-logs__active .button__transparent_grey.button:hover, #llar-setting-page-debug .button__transparent_grey.button:hover, #llar-setting-page-premium .button__transparent_grey.button:hover, #llar-setting-page-help .button__transparent_grey.button:hover { background: rgba(164, 168, 183, 0.2980392157) !important; } .llar_button.button:focus, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button:focus, #llar-setting-page .button:focus, #llar-setting-page-logs .button:focus, #llar-setting-page-logs__active .button:focus, #llar-setting-page-debug .button:focus, #llar-setting-page-premium .button:focus, #llar-setting-page-help .button:focus { outline: none !important; box-shadow: unset !important; } .llar_button.tags, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags.button, #llar-setting-page .tags.button, #llar-setting-page-logs .tags.button, #llar-setting-page-logs__active .tags.button, #llar-setting-page-debug .tags.button, #llar-setting-page-premium .tags.button, #llar-setting-page-help .tags.button { font-size: 16px; font-weight: 400; line-height: 1.7; border-radius: 8px; border: 1px solid #FF7C06; width: fit-content; padding: 0 20px; z-index: 50; } .llar_button.tags_basic, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic.button, #llar-setting-page .tags_basic.button, #llar-setting-page-logs .tags_basic.button, #llar-setting-page-logs__active .tags_basic.button, #llar-setting-page-debug .tags_basic.button, #llar-setting-page-premium .tags_basic.button, #llar-setting-page-help .tags_basic.button { color: #FF7C06; background: rgba(255, 124, 6, 0.0980392157); } .llar_button.tags_basic.active, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic.active.button, #llar-setting-page .tags_basic.active.button, #llar-setting-page-logs .tags_basic.active.button, #llar-setting-page-logs__active .tags_basic.active.button, #llar-setting-page-debug .tags_basic.active.button, #llar-setting-page-premium .tags_basic.active.button, #llar-setting-page-help .tags_basic.active.button, .llar_button.tags_basic:hover, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic.button:hover, #llar-setting-page .tags_basic.button:hover, #llar-setting-page-logs .tags_basic.button:hover, #llar-setting-page-logs__active .tags_basic.button:hover, #llar-setting-page-debug .tags_basic.button:hover, #llar-setting-page-premium .tags_basic.button:hover, #llar-setting-page-help .tags_basic.button:hover { color: #FDFDFD; background: #FF7C06; } .llar_button.tags_basic_add, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic_add.button, #llar-setting-page .tags_basic_add.button, #llar-setting-page-logs .tags_basic_add.button, #llar-setting-page-logs__active .tags_basic_add.button, #llar-setting-page-debug .tags_basic_add.button, #llar-setting-page-premium .tags_basic_add.button, #llar-setting-page-help .tags_basic_add.button { color: #4ACAD8; min-width: fit-content; border: 1px solid currentColor; background: rgba(74, 202, 216, 0.0980392157); } .llar_button.tags_basic_add a, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic_add.button a, #llar-setting-page .tags_basic_add.button a, #llar-setting-page-logs .tags_basic_add.button a, #llar-setting-page-logs__active .tags_basic_add.button a, #llar-setting-page-debug .tags_basic_add.button a, #llar-setting-page-premium .tags_basic_add.button a, #llar-setting-page-help .tags_basic_add.button a { vertical-align: middle; } .llar_button.tags_basic_add:hover, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic_add.button:hover, #llar-setting-page .tags_basic_add.button:hover, #llar-setting-page-logs .tags_basic_add.button:hover, #llar-setting-page-logs__active .tags_basic_add.button:hover, #llar-setting-page-debug .tags_basic_add.button:hover, #llar-setting-page-premium .tags_basic_add.button:hover, #llar-setting-page-help .tags_basic_add.button:hover { background: rgba(255, 124, 6, 0.0980392157); } .llar_button.tags_add, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_add.button, #llar-setting-page .tags_add.button, #llar-setting-page-logs .tags_add.button, #llar-setting-page-logs__active .tags_add.button, #llar-setting-page-debug .tags_add.button, #llar-setting-page-premium .tags_add.button, #llar-setting-page-help .tags_add.button { color: #A4A8B7; border: 1px solid #A4A8B7; background: rgba(164, 168, 183, 0.0784313725); } .llar_button.tags_add a, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_add.button a, #llar-setting-page .tags_add.button a, #llar-setting-page-logs .tags_add.button a, #llar-setting-page-logs__active .tags_add.button a, #llar-setting-page-debug .tags_add.button a, #llar-setting-page-premium .tags_add.button a, #llar-setting-page-help .tags_add.button a { vertical-align: middle; } .llar_button.tags_add:hover, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_add.button:hover, #llar-setting-page .tags_add.button:hover, #llar-setting-page-logs .tags_add.button:hover, #llar-setting-page-logs__active .tags_add.button:hover, #llar-setting-page-debug .tags_add.button:hover, #llar-setting-page-premium .tags_add.button:hover, #llar-setting-page-help .tags_add.button:hover { background: rgba(255, 124, 6, 0.0980392157); } .llar_button:focus, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button:focus, #llar-setting-page .button:focus, #llar-setting-page-logs .button:focus, #llar-setting-page-logs__active .button:focus, #llar-setting-page-debug .button:focus, #llar-setting-page-premium .button:focus, #llar-setting-page-help .button:focus { outline: none !important; box-shadow: unset !important; } .llar-form-table { width: 100%; } .toplevel_page_limit-login-attempts #wpwrap { background-color: #F6FBFF; } .toplevel_page_limit-login-attempts #wpcontent { background-color: #F6FBFF; font-family: CoFo Sans, arial; font-style: normal; font-weight: 400; color: #2A2F40; } .limit-login-page-settings { margin: 8px 50px; } @media screen and (max-width: 1799.5px) { .limit-login-page-settings { margin: 8px 16px 8px 0; } } .limit-login-page-settings__logo_block { display: flex; flex-wrap: nowrap; justify-content: space-between; align-items: baseline; font-size: 18px; margin-right: 20px; } .limit-login-page-settings__logo_block .info-box-icon { display: inline-block; margin-left: 5px; } .limit-login-page-settings__logo_block .info-box-icon img { width: 15px; vertical-align: middle; } .limit-login-page-settings__logo { margin-top: 21px; margin-left: 4px; max-width: 172px; } .limit-login-page-settings .nav-tab-wrapper { position: relative; border-bottom: unset; margin-top: 20px; } .limit-login-page-settings .nav-tab-wrapper .nav-tab { border: unset; background-color: unset; font-size: 16px; color: #2A2F40; font-weight: 400; margin-left: 0; margin-right: 35px; padding: 4px 5px 6px; } .limit-login-page-settings .nav-tab-wrapper .nav-tab .llar-alert-icon { display: inline-block; vertical-align: middle; box-sizing: border-box; margin: -2px 0 0; padding: 0 1px 4px 2px; min-width: 18px; height: 18px; border-radius: 9px; background-color: #d63638; color: white; font-size: 14px; line-height: 1.4; text-align: center; } .limit-login-page-settings .nav-tab-wrapper .nav-tab-active { border-bottom: 4px solid #4ACAD8; } @media screen and (max-width: 991.5px) { .limit-login-page-settings .nav-tab-wrapper .nav-tab { margin-right: 20px; } } @media screen and (max-width: 767.5px) { .limit-login-page-settings .nav-tab-wrapper .nav-tab { font-size: 14px; margin-right: 0.87em; } } @media screen and (max-width: 575.5px) { .limit-login-page-settings .nav-tab-wrapper .nav-tab { font-size: 12px; margin-right: 0.5em; } } .limit-login-page-settings .nav-tab-wrapper .llar-failover-link { color: #4ACAD8; font-size: 14px; float: right; padding: 7px 15px; } .limit-login-page-settings .nav-tab-wrapper .llar-failover-link .llar-tooltip:before { right: 0; left: auto; } .limit-login-page-settings .field-col { display: inline-block; margin-right: 20px; } .limit-login-page-settings .limit-login-log table { background-color: #fff; } .limit-login-page-settings .limit-login-log table th, .limit-login-page-settings .limit-login-log table td { padding: 10px; } .limit-login-page-settings .limit-login-log table tr:nth-child(even) { background-color: rgba(0, 0, 0, 0.09); } .limit-login-page-settings #limit-login-app-setup-code { width: 85%; } .limit-login-page-settings .llar-app-notice { background-color: #fff; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); padding: 15px; border-radius: 3px; margin-top: 20px; margin-bottom: 20px; font-size: 14px; border-left: 5px solid #ffba00; } .limit-login-page-settings .llar-app-notice.success { border-color: #46b450; } .limit-login-page-settings .llar-app-notice p { font-size: inherit; margin: 0 0 20px; } .limit-login-page-settings .llar-app-notice p:last-child { margin-bottom: 0; } .limit-login-page-settings input[name=admin_notify_email] { min-width: 243px; } .limit-login-page-settings input[name=lla_trusted_ip_origins] { min-width: 400px; } .limit-login-page-settings .llar-test-email-notification-btn { text-decoration: none; margin-left: 16px; font-weight: 400; } .limit-login-page-settings .llar-test-email-notification-loader .llar-app-ajax-spinner { float: none; margin: -2px 5px 0; display: none; } .limit-login-page-settings .llar-test-email-notification-loader.loading .llar-app-ajax-spinner { display: inline-block; visibility: visible; } .limit-login-page-settings .llar-test-email-notification-loader .msg { margin-left: 5px; } .limit-login-page-settings .llar-test-email-notification-loader .msg.success { color: #71c21b; } .limit-login-page-settings .llar-protect-notice { font-size: 15px; color: #848484; margin-left: 10px; } .limit-login-page-settings .llar-protect-notice a { color: #222222; text-decoration: none; border-bottom: 1px dashed; } .limit-login-page-settings .llar-toggle-setup-field { color: #2271b1; text-decoration-style: dashed; } .limit-login-page-settings .llar-toggle-setup-field:hover { color: #222; } .limit-login-page-settings .setup-code-wrap { display: none; } .limit-login-page-settings .setup-code-wrap.active { display: block; } .limit-login-page-settings .app-form-field { display: none; } .limit-login-page-settings .app-form-field.active { display: table-row; } .limit-login-page-settings .llar-app-field { display: none; } .limit-login-page-settings .llar-app-field.active { display: table-row; } #llar-setting-page, #llar-setting-page-logs, #llar-setting-page-logs__active, #llar-setting-page-debug, #llar-setting-page-premium, #llar-setting-page-help { color: #2A2F40; margin-top: 40px; line-height: 1.5; } #llar-setting-page .title_page, #llar-setting-page-logs .title_page, #llar-setting-page-logs__active .title_page, #llar-setting-page-debug .title_page, #llar-setting-page-premium .title_page, #llar-setting-page-help .title_page { margin-top: 40px; margin-bottom: 15px; color: inherit; font-size: 20px; font-weight: 500; } @media screen and (max-width: 1599.5px) { #llar-setting-page .title_page, #llar-setting-page-logs .title_page, #llar-setting-page-logs__active .title_page, #llar-setting-page-debug .title_page, #llar-setting-page-premium .title_page, #llar-setting-page-help .title_page { font-size: 18px; } } #llar-setting-page .title_page img, #llar-setting-page-logs .title_page img, #llar-setting-page-logs__active .title_page img, #llar-setting-page-debug .title_page img, #llar-setting-page-premium .title_page img, #llar-setting-page-help .title_page img { width: 36px; height: 36px; vertical-align: middle; margin-right: 8px; } #llar-setting-page .description-page, #llar-setting-page-logs .description-page, #llar-setting-page-logs__active .description-page, #llar-setting-page-debug .description-page, #llar-setting-page-premium .description-page, #llar-setting-page-help .description-page { position: relative; font-size: 18px; color: #666D84; padding: 30px 44px; border-radius: 20px; background: rgba(232, 253, 255, 0.02); box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } @media screen and (max-width: 1599.5px) { #llar-setting-page .description-page, #llar-setting-page-logs .description-page, #llar-setting-page-logs__active .description-page, #llar-setting-page-debug .description-page, #llar-setting-page-premium .description-page, #llar-setting-page-help .description-page { font-size: 16px; } } #llar-setting-page .llar-settings-wrap, #llar-setting-page-logs .llar-settings-wrap, #llar-setting-page-logs__active .llar-settings-wrap, #llar-setting-page-debug .llar-settings-wrap, #llar-setting-page-premium .llar-settings-wrap, #llar-setting-page-help .llar-settings-wrap { margin-top: 20px; } #llar-setting-page .llar-settings-wrap .llar-form-table, #llar-setting-page-logs .llar-settings-wrap .llar-form-table, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table, #llar-setting-page-debug .llar-settings-wrap .llar-form-table, #llar-setting-page-premium .llar-settings-wrap .llar-form-table, #llar-setting-page-help .llar-settings-wrap .llar-form-table { color: #2A2F40; font-size: 18px; border-collapse: separate; border-spacing: 0 18px; border-color: unset; margin-top: -18px; margin-bottom: -18px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr { position: relative; font-size: 18px; border-radius: 20px; color: #666D84; background: #FDFDFD; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr { font-size: 16px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th, #llar-setting-page .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td { font-size: inherit; line-height: inherit; border-radius: 20px; background-color: unset; padding: 29px 5px 32px 44px; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th, #llar-setting-page .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td { padding: 12px 5px 12px 25px; } } @media screen and (max-width: 1399.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th, #llar-setting-page .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td { padding-left: 15px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th { color: #2A2F40; font-weight: 400; border-top-right-radius: unset; border-bottom-right-radius: unset; width: 300px; } @media screen and (max-width: 1399.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th { width: 260px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons { font-size: 140%; width: 12px; height: 12px; margin-left: 2px; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons { font-size: 20px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr th .hint_tooltip, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .hint_tooltip, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .hint_tooltip, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .hint_tooltip, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .hint_tooltip, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .hint_tooltip { right: -140px; top: 30px; width: 200px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before { right: 142px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td { color: #666D84; font-size: 16px; line-height: 1.5; border-top-left-radius: unset; border-bottom-left-radius: unset; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td { font-size: 14px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border.full_area { min-width: 720px; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border.full_area, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border.full_area { min-width: 70%; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea { font-family: inherit; font-size: 16px; color: #666D84; background-color: #FDFDFD; padding-right: 24px; border: unset; scrollbar-width: thin; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea { padding-right: 18px; font-size: 14px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar { width: 8px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track { background-color: #A4A8B7; border-radius: 8px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb { background-color: #666D84; border-radius: 8px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus { border: unset; box-shadow: unset; outline: unset; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td select, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td select, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td select, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td select, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td select, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td select { font-family: inherit; background: #FDFDFD url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234ACAD8FF'%3e%3cpath d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") no-repeat right 5px top 55%; background-size: 16px 16px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td select.input_border { padding: 6px 64px 6px 16px; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td select.input_border, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td select.input_border { padding-right: 35px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border { border-radius: 8px; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border:hover, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border:hover, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border:hover, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border:hover, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border:hover, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border:hover, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border:focus, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border:focus { box-shadow: unset; outline: unset; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink { font-weight: 500; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink:hover, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink:hover { border-bottom: unset; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice { font-size: 16px; line-height: inherit; color: #A4A8B7; padding: 16px 8px 8px 24px; max-width: 740px; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-additional, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice { font-size: 14px; } } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-secondary, #llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice { color: #666D84; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice { font-size: inherit; color: inherit; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a { text-decoration: none; border-bottom: unset; } #llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover { border-bottom: 1px solid currentColor; } #llar-setting-page .add_block__under_table, #llar-setting-page-logs .add_block__under_table, #llar-setting-page-logs__active .add_block__under_table, #llar-setting-page-debug .add_block__under_table, #llar-setting-page-premium .add_block__under_table, #llar-setting-page-help .add_block__under_table { margin: 8px 0; padding: 24px 48px; background-color: #F6FBFF; border-radius: 20px; } @media screen and (max-width: 1199.5px) { #llar-setting-page .add_block__under_table, #llar-setting-page-logs .add_block__under_table, #llar-setting-page-logs__active .add_block__under_table, #llar-setting-page-debug .add_block__under_table, #llar-setting-page-premium .add_block__under_table, #llar-setting-page-help .add_block__under_table { padding: 16px; } } #llar-setting-page .add_block__under_table .description, #llar-setting-page-logs .add_block__under_table .description, #llar-setting-page-logs__active .add_block__under_table .description, #llar-setting-page-debug .add_block__under_table .description, #llar-setting-page-premium .add_block__under_table .description, #llar-setting-page-help .add_block__under_table .description { color: #2A2F40; font-size: 18px; line-height: 1.5; font-weight: 500; } @media screen and (max-width: 1599.5px) { #llar-setting-page .add_block__under_table .description, #llar-setting-page-logs .add_block__under_table .description, #llar-setting-page-logs__active .add_block__under_table .description, #llar-setting-page-debug .add_block__under_table .description, #llar-setting-page-premium .add_block__under_table .description, #llar-setting-page-help .add_block__under_table .description { font-size: 16px; } } #llar-setting-page .add_block__under_table .add_block__list, #llar-setting-page-logs .add_block__under_table .add_block__list, #llar-setting-page-logs__active .add_block__under_table .add_block__list, #llar-setting-page-debug .add_block__under_table .add_block__list, #llar-setting-page-premium .add_block__under_table .add_block__list, #llar-setting-page-help .add_block__under_table .add_block__list { display: flex; margin-top: 16px; margin-bottom: 8px; color: #666D84; font-size: 16px; flex-wrap: nowrap; justify-content: space-between; } @media screen and (max-width: 1599.5px) { #llar-setting-page .add_block__under_table .add_block__list, #llar-setting-page-logs .add_block__under_table .add_block__list, #llar-setting-page-logs__active .add_block__under_table .add_block__list, #llar-setting-page-debug .add_block__under_table .add_block__list, #llar-setting-page-premium .add_block__under_table .add_block__list, #llar-setting-page-help .add_block__under_table .add_block__list { flex-wrap: wrap; } } #llar-setting-page .add_block__under_table .add_block__list .item, #llar-setting-page-logs .add_block__under_table .add_block__list .item, #llar-setting-page-logs__active .add_block__under_table .add_block__list .item, #llar-setting-page-debug .add_block__under_table .add_block__list .item, #llar-setting-page-premium .add_block__under_table .add_block__list .item, #llar-setting-page-help .add_block__under_table .add_block__list .item { flex: 0 0 16%; display: flex; flex-direction: row; flex-wrap: nowrap; align-items: flex-start; } @media screen and (max-width: 1599.5px) { #llar-setting-page .add_block__under_table .add_block__list .item, #llar-setting-page-logs .add_block__under_table .add_block__list .item, #llar-setting-page-logs__active .add_block__under_table .add_block__list .item, #llar-setting-page-debug .add_block__under_table .add_block__list .item, #llar-setting-page-premium .add_block__under_table .add_block__list .item, #llar-setting-page-help .add_block__under_table .add_block__list .item { flex: 0 0 32%; } } #llar-setting-page .add_block__under_table .add_block__list .item .icon, #llar-setting-page-logs .add_block__under_table .add_block__list .item .icon, #llar-setting-page-logs__active .add_block__under_table .add_block__list .item .icon, #llar-setting-page-debug .add_block__under_table .add_block__list .item .icon, #llar-setting-page-premium .add_block__under_table .add_block__list .item .icon, #llar-setting-page-help .add_block__under_table .add_block__list .item .icon { width: 50px; height: 50px; vertical-align: middle; margin-right: 8px; } #llar-setting-page .add_block__under_table .add_block__list .item .name, #llar-setting-page-logs .add_block__under_table .add_block__list .item .name, #llar-setting-page-logs__active .add_block__under_table .add_block__list .item .name, #llar-setting-page-debug .add_block__under_table .add_block__list .item .name, #llar-setting-page-premium .add_block__under_table .add_block__list .item .name, #llar-setting-page-help .add_block__under_table .add_block__list .item .name { width: 80%; padding-bottom: 17px; } #llar-setting-page .add_block__under_table.image_plus .row__list, #llar-setting-page-logs .add_block__under_table.image_plus .row__list, #llar-setting-page-logs__active .add_block__under_table.image_plus .row__list, #llar-setting-page-debug .add_block__under_table.image_plus .row__list, #llar-setting-page-premium .add_block__under_table.image_plus .row__list, #llar-setting-page-help .add_block__under_table.image_plus .row__list { display: flex; } #llar-setting-page .add_block__under_table.image_plus .row__list .add_block__title, #llar-setting-page-logs .add_block__under_table.image_plus .row__list .add_block__title, #llar-setting-page-logs__active .add_block__under_table.image_plus .row__list .add_block__title, #llar-setting-page-debug .add_block__under_table.image_plus .row__list .add_block__title, #llar-setting-page-premium .add_block__under_table.image_plus .row__list .add_block__title, #llar-setting-page-help .add_block__under_table.image_plus .row__list .add_block__title { flex: 0 0 14%; margin-right: 20px; } #llar-setting-page .add_block__under_table.image_plus .add_block__list, #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list, #llar-setting-page-debug .add_block__under_table.image_plus .add_block__list, #llar-setting-page-premium .add_block__under_table.image_plus .add_block__list, #llar-setting-page-help .add_block__under_table.image_plus .add_block__list { gap: 16px; } @media screen and (max-width: 1599.5px) { #llar-setting-page .add_block__under_table.image_plus .add_block__list, #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list, #llar-setting-page-debug .add_block__under_table.image_plus .add_block__list, #llar-setting-page-premium .add_block__under_table.image_plus .add_block__list, #llar-setting-page-help .add_block__under_table.image_plus .add_block__list { column-gap: 10px; } } #llar-setting-page .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item { flex: 0 0 15%; flex-direction: column; align-items: start; border-radius: 20px; border: 1px solid #4ACAD8; } @media screen and (max-width: 1599.5px) { #llar-setting-page .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item { flex: 0 0 30%; } } #llar-setting-page .add_block__under_table.image_plus .add_block__list .item .name, #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item .name, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item .name, #llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item .name, #llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item .name, #llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item .name { width: unset; margin: 10px 23px 17px; } #llar-setting-page .add_block__under_table.image_plus .add_block__list .item img, #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item img, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item img, #llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item img, #llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item img, #llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item img { width: 120px; align-self: center; } #llar-setting-page .gdpr-information-link, #llar-setting-page-logs .gdpr-information-link, #llar-setting-page-logs__active .gdpr-information-link, #llar-setting-page-debug .gdpr-information-link, #llar-setting-page-premium .gdpr-information-link, #llar-setting-page-help .gdpr-information-link { display: block; text-decoration: none; position: relative; } #llar-setting-page .gdpr-information-link:after, #llar-setting-page-logs .gdpr-information-link:after, #llar-setting-page-logs__active .gdpr-information-link:after, #llar-setting-page-debug .gdpr-information-link:after, #llar-setting-page-premium .gdpr-information-link:after, #llar-setting-page-help .gdpr-information-link:after { content: "\f345"; font-family: dashicons; line-height: 1; font-weight: 400; font-style: normal; text-transform: none; text-rendering: auto; font-size: 22px; text-align: center; position: absolute; right: 40px; top: 50%; color: #2A2F40; transform: translateY(-50%); } #llar-setting-page .button_block, #llar-setting-page-logs .button_block, #llar-setting-page-logs__active .button_block, #llar-setting-page-debug .button_block, #llar-setting-page-premium .button_block, #llar-setting-page-help .button_block { margin-top: 24px; display: flex; flex-wrap: nowrap; column-gap: 16px; } #llar-setting-page .button_block a.button.menu__item, #llar-setting-page-logs .button_block a.button.menu__item, #llar-setting-page-logs__active .button_block a.button.menu__item, #llar-setting-page-debug .button_block a.button.menu__item, #llar-setting-page-premium .button_block a.button.menu__item, #llar-setting-page-help .button_block a.button.menu__item { text-align: center; } #llar-setting-page .llar-accordion, #llar-setting-page-logs .llar-accordion, #llar-setting-page-logs__active .llar-accordion, #llar-setting-page-debug .llar-accordion, #llar-setting-page-premium .llar-accordion, #llar-setting-page-help .llar-accordion { font-family: inherit; font-size: inherit; font-weight: inherit; line-height: inherit; border-radius: 20px; background-color: #F6FBFF; } #llar-setting-page .llar-accordion .ui-accordion-header, #llar-setting-page-logs .llar-accordion .ui-accordion-header, #llar-setting-page-logs__active .llar-accordion .ui-accordion-header, #llar-setting-page-debug .llar-accordion .ui-accordion-header, #llar-setting-page-premium .llar-accordion .ui-accordion-header, #llar-setting-page-help .llar-accordion .ui-accordion-header { color: #2A2F40; font-weight: 500; font-size: 18px; margin-top: 20px; padding: 31px 40px 31px; border: 1px solid #4ACAD8; border-bottom: 0; border-top-right-radius: 20px; border-top-left-radius: 20px; background-color: #FDFDFD; } @media screen and (max-width: 1599.5px) { #llar-setting-page .llar-accordion .ui-accordion-header, #llar-setting-page-logs .llar-accordion .ui-accordion-header, #llar-setting-page-logs__active .llar-accordion .ui-accordion-header, #llar-setting-page-debug .llar-accordion .ui-accordion-header, #llar-setting-page-premium .llar-accordion .ui-accordion-header, #llar-setting-page-help .llar-accordion .ui-accordion-header { font-size: 16px; } } #llar-setting-page .llar-accordion .ui-accordion-header-collapsed, #llar-setting-page-logs .llar-accordion .ui-accordion-header-collapsed, #llar-setting-page-logs__active .llar-accordion .ui-accordion-header-collapsed, #llar-setting-page-debug .llar-accordion .ui-accordion-header-collapsed, #llar-setting-page-premium .llar-accordion .ui-accordion-header-collapsed, #llar-setting-page-help .llar-accordion .ui-accordion-header-collapsed { border: 0; border-radius: 20px; background: unset; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } #llar-setting-page .llar-accordion .ui-accordion-header.ui-accordion-header-active, #llar-setting-page-logs .llar-accordion .ui-accordion-header.ui-accordion-header-active, #llar-setting-page-logs__active .llar-accordion .ui-accordion-header.ui-accordion-header-active, #llar-setting-page-debug .llar-accordion .ui-accordion-header.ui-accordion-header-active, #llar-setting-page-premium .llar-accordion .ui-accordion-header.ui-accordion-header-active, #llar-setting-page-help .llar-accordion .ui-accordion-header.ui-accordion-header-active { background: white; } #llar-setting-page .llar-accordion .ui-accordion-content, #llar-setting-page-logs .llar-accordion .ui-accordion-content, #llar-setting-page-logs__active .llar-accordion .ui-accordion-content, #llar-setting-page-debug .llar-accordion .ui-accordion-content, #llar-setting-page-premium .llar-accordion .ui-accordion-content, #llar-setting-page-help .llar-accordion .ui-accordion-content { padding-top: 0; margin-bottom: 16px; color: #2A2F40; border-bottom-right-radius: 20px; border-bottom-left-radius: 20px; border: 1px solid #4ACAD8; border-top: 0; background-color: #FDFDFD; overflow: hidden; } #llar-setting-page .llar-accordion .ui-accordion-content a, #llar-setting-page-logs .llar-accordion .ui-accordion-content a, #llar-setting-page-logs__active .llar-accordion .ui-accordion-content a, #llar-setting-page-debug .llar-accordion .ui-accordion-content a, #llar-setting-page-premium .llar-accordion .ui-accordion-content a, #llar-setting-page-help .llar-accordion .ui-accordion-content a { color: inherit; } #llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table, #llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table, #llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table, #llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table, #llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table, #llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table { margin-top: 0; border-spacing: 0; font-weight: 400; } #llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr, #llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr, #llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr, #llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr, #llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr, #llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr { box-shadow: unset; } #llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr td, #llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr td, #llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr td, #llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr td, #llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr td, #llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr td { padding-top: 0; } #llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr th, #llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr th { padding-left: 0; } #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea { color: #A4A8B7; } #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary { padding-left: 0; } #llar-setting-page-logs .add_block__under_table, #llar-setting-page-logs__active .add_block__under_table { margin-top: 20px; } #llar-setting-page-logs .add_block__under_table.image_plus, #llar-setting-page-logs__active .add_block__under_table.image_plus { box-shadow: 3px 5px 23px 0 rgba(162, 180, 189, 0.2); } #llar-setting-page-logs .add_block__under_table.image_plus .row__list, #llar-setting-page-logs__active .add_block__under_table.image_plus .row__list { display: flex; } #llar-setting-page-logs .add_block__under_table.image_plus .row__list .add_block__title, #llar-setting-page-logs__active .add_block__under_table.image_plus .row__list .add_block__title { flex: 0 0 14%; margin-right: 20px; } #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list { gap: 18px; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list { column-gap: 10px; } } #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item { flex: 0 0 23%; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item { flex: 0 0 49%; } } #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item .name, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item .name { margin: 10px 33px 37px; } #llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item img, #llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item img { margin-top: 23px; width: 154px; } #llar-setting-page-logs .description-page .description-secondary a.unlink, #llar-setting-page-logs__active .description-page .description-secondary a.unlink { font-weight: 500; } #llar-setting-page-logs .description-page .description-secondary a.unlink:hover, #llar-setting-page-logs__active .description-page .description-secondary a.unlink:hover { border-bottom: unset; } #llar-setting-page-logs__active .llar-table-header { display: flex; justify-content: space-between; align-items: flex-start; margin: 40px 0 5px; } #llar-setting-page-logs__active .llar-table-header .title_page { margin-top: 0; } #llar-setting-page-logs__active .llar-table-header .right-link { font-size: 16px; line-height: 1.625; margin-right: 5px; text-align: center; } #llar-setting-page-logs__active .llar-table-header .right-link .dashicons-image-rotate { font-size: 16px; vertical-align: middle; } #llar-setting-page-logs__active .llar-table-header .right-link .dashicons-editor-help { vertical-align: middle; } #llar-setting-page-logs__active .llar-table-scroll-wrap { max-height: 400px; padding: 0 20px 30px; border-radius: 16px; background-color: white; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); overflow-y: auto; scrollbar-width: thin; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap { padding: 0 15px 20px; } } @media screen and (max-width: 1399.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap { padding: 0 10px 10px; } } #llar-setting-page-logs__active .llar-table-scroll-wrap::-webkit-scrollbar { width: 4px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table { position: relative; border-collapse: separate; border-spacing: 0 3px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table.llar-preloader:before { content: ""; display: block; width: 100%; height: 100%; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+"); background-color: rgba(255, 255, 255, 0.7); background-repeat: no-repeat; background-position: center center; z-index: 999; position: absolute; top: 0; left: 0; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table thead tr th { color: #2A2F40; font-size: 16px; font-weight: 500; padding: 20px 18px; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table thead tr th { font-size: 15px; padding: 15px; } } @media screen and (max-width: 1399.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table thead tr th { font-size: 12px; } } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody { color: #666D84; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr.empty-row, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody.login-attempts tr:nth-child(4n+1), #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr:nth-child(odd) { border-radius: 16px; background-color: #F6FBFF; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr.empty-row td:first-child, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody.login-attempts tr:nth-child(4n+1) td:first-child, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr:nth-child(odd) td:first-child { border-top-left-radius: 16px; border-bottom-left-radius: 16px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr.empty-row td:last-child, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody.login-attempts tr:nth-child(4n+1) td:last-child, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr:nth-child(odd) td:last-child { border-top-right-radius: 16px; border-bottom-right-radius: 16px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td { font-size: 16px; font-weight: 400; padding: 18px; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td { font-size: 14px; padding: 14px; } } @media screen and (max-width: 1399.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td { font-size: 14px; padding: 12px; } } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td.llar-col-nowrap { white-space: nowrap; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td.llar-app-log-actions { display: flex; justify-content: center; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border, #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border { color: #A4A8B7; border: 1px solid #A4A8B7; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select { font-family: inherit; min-width: 150px; margin-right: 25px; background-size: 16px 16px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag { display: flex; align-items: center; white-space: nowrap; gap: 3px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .hint_tooltip { width: fit-content; top: 33px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .hint_tooltip:before { right: 20%; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .hint_tooltip-content { font-size: 14px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .llar-tooltip:before { width: auto !important; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag img { width: 34px; height: auto; border-radius: 4px; vertical-align: middle; margin-right: 5px; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag img { width: 30px; } } @media screen and (max-width: 1399.5px) { #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag img { width: 25px; } } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button { line-height: 1; margin-right: 5px; border-radius: 8px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button:last-child { margin-right: 0; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button .dashicons { vertical-align: middle; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button.llar-app-log-action-btn { min-width: 35px; text-align: center; display: inline-block; line-height: 20px; cursor: pointer; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button.llar-app-log-action-btn i { vertical-align: middle; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button.llar-app-log-action-btn:hover i { color: #3c8dbc; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader { text-align: center; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader.hidden { display: none; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td { padding: 5px; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .load-more-button a { padding-bottom: 1px; text-decoration: unset; border-bottom: 1px dashed; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .preloader-row { display: none; align-items: center; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .preloader-row .preloader-icon { background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+"); background-size: 100%; background-repeat: no-repeat; width: 30px; height: 30px; display: inline-block; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .preloader-row .preloader-text { color: #999; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader.loading tr td .load-more-button { display: none; } #llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader.loading tr td .preloader-row { display: inline-flex; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-preloader-wrap { position: relative; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-preloader-wrap.loading:before { content: ""; display: block; width: 100%; height: 100%; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+"); background-color: rgba(255, 255, 255, 0.7); background-repeat: no-repeat; background-position: center center; z-index: 999; position: absolute; top: 0; left: 0; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-log-pagination > a { font-size: 16px; line-height: 1.625; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-log-pagination .spinner { float: none; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules { display: flex; justify-content: space-between; flex-wrap: wrap; column-gap: 15px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col { flex: 1 0 49%; min-width: 590px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .help-link { color: #4ACAD8; font-size: 16px; padding: 10px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead td { font-size: 16px; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead td { font-size: 15px; } } @media screen and (max-width: 1399.5px) { #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead td { font-size: 14px; } } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead .llar-app-acl-action-col { text-align: center; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td { font-size: 16px; padding-right: 5px; } @media screen and (max-width: 1599.5px) { #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td { font-size: 15px; } } @media screen and (max-width: 1399.5px) { #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td { font-size: 14px; } } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td input { min-width: 195px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td select { min-width: 200px; margin-right: 0; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td .button { min-width: 20px; margin-right: 20px; border-radius: 8px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule] { margin-top: 10px; border-radius: 16px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule] td { padding-left: 45px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule] td:first-child { border-top-left-radius: 16px; border-bottom-left-radius: 16px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule] td:last-child { border-top-right-radius: 16px; border-bottom-right-radius: 16px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-acl-action-col { padding: 10px 25px 10px 15px; text-align: center; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-acl-action-col .llar-app-acl-add-rule { min-width: 100%; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-rule-pass { background-color: #cffbe8; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-rule-allow { background-color: rgba(74, 202, 216, 0.0980392157); } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-rule-deny { background-color: rgba(255, 150, 155, 0.1490196078); } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-acl-remove { color: #EC4652; border-color: #EC4652; background-color: rgba(255, 150, 155, 0.1490196078); } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table .origin { float: right; opacity: 0.5; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section { padding: 30px; background-color: white; border-radius: 16px; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode { font-size: 16px; color: #666D84; display: inline-block; vertical-align: middle; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select { font-family: inherit; min-width: 150px; margin-right: 25px; background: #FDFDFD url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234ACAD8FF'%3e%3cpath d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") no-repeat right 5px top 55%; background-size: 16px 16px; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-toggle-countries-list { font-size: 16px; color: #4ACAD8; text-decoration: none; vertical-align: middle; border-bottom: 1px solid currentColor; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list { font-size: 16px; color: #2A2F40; display: flex; flex-wrap: wrap; max-height: 400px; overflow-y: auto; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list:first-child { margin-top: 0; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country { flex: 0 0 10%; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country label { padding-bottom: 10px; display: inline-block; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected { display: inline; margin-left: 20px; vertical-align: middle; overflow: hidden; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country { margin-bottom: 0; display: inline-block; margin-right: 20px; padding-right: 20px; border-right: 1px solid #E8E9EC; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country label { color: #2A2F40; padding-bottom: 0; white-space: nowrap; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country:last-child { border-right: unset; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list { font-size: 14px; display: none; margin: 10px 0; } #llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list.visible { display: flex; border-top: 1px solid #dddada; padding-top: 10px; } .llar-blur-block { position: absolute; top: 0; bottom: 0; left: 0; right: 0; backdrop-filter: blur(1.5px); background-color: rgba(164, 168, 183, 0.0784313725); } .llar-blur-block-text { position: absolute; top: 45%; left: 50%; max-width: 46rem; width: 80%; font-size: 18px; line-height: 1.3; color: #666D84; text-align: center; padding: 1.5rem 2rem; background-color: #ECFAFB; border-radius: 20px; border: 1px solid #4ACAD8; transform: translate(-50%, -50%); } @media screen and (max-width: 1599.5px) { .llar-blur-block-text { top: 40%; font-size: 16px; } } @media screen and (max-width: 1399.5px) { .llar-blur-block-text { top: 45%; font-size: 14px; } } .llar-blur-block-text img { max-width: 5rem; } @media screen and (max-width: 1599.5px) { .llar-blur-block-text img { max-width: 4rem; } } .llar-blur-block-text .title { margin-top: 1rem; font-size: 26px; font-weight: 500; } @media screen and (max-width: 1599.5px) { .llar-blur-block-text .title { margin-top: 0.75rem; font-size: 24px; } } @media screen and (max-width: 1399.5px) { .llar-blur-block-text .title { margin-top: 0.5rem; } } .llar-blur-block-text .description { margin-top: 1rem; } @media screen and (max-width: 1599.5px) { .llar-blur-block-text .description { margin-top: 0.75rem; } } @media screen and (max-width: 1399.5px) { .llar-blur-block-text .description { margin-top: 0.5rem; } } .llar-blur-block-text .footer { border-top: 1px solid #4ACAD8; padding-top: 0.75rem; margin-top: 1rem; font-weight: 500; } @media screen and (max-width: 1599.5px) { .llar-blur-block-text .footer { margin-top: 0.75rem; } } @media screen and (max-width: 1399.5px) { .llar-blur-block-text .footer { padding-top: 0.5rem; margin-top: 0.5rem; } } .llar-blur-block-cell { filter: blur(7px); } .llar-table-app-login, #llar-setting-page-logs__active .llar-table-scroll-wrap, .llar-table-no_app-login { position: relative; border-collapse: separate; border-spacing: 0 3px; } .llar-table-app-login.llar-preloader:before, #llar-setting-page-logs__active .llar-preloader.llar-table-scroll-wrap:before, .llar-table-no_app-login.llar-preloader:before { content: ""; display: block; width: 100%; height: 100%; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+"); background-color: rgba(255, 255, 255, 0.7); background-repeat: no-repeat; background-position: center center; z-index: 999; position: absolute; top: 0; left: 0; } .llar-table-app-login tr th, #llar-setting-page-logs__active .llar-table-scroll-wrap tr th, .llar-table-app-login tr td, #llar-setting-page-logs__active .llar-table-scroll-wrap tr td, .llar-table-no_app-login tr th, .llar-table-no_app-login tr td { font-size: 16px; font-weight: 400; width: fit-content; padding: 20px 2px 20px 14px; } @media screen and (max-width: 1599.5px) { .llar-table-app-login tr th, #llar-setting-page-logs__active .llar-table-scroll-wrap tr th, .llar-table-app-login tr td, #llar-setting-page-logs__active .llar-table-scroll-wrap tr td, .llar-table-no_app-login tr th, .llar-table-no_app-login tr td { font-size: 14px; padding: 15px 2px 15px 12px; } } @media screen and (max-width: 1399.5px) { .llar-table-app-login tr th, #llar-setting-page-logs__active .llar-table-scroll-wrap tr th, .llar-table-app-login tr td, #llar-setting-page-logs__active .llar-table-scroll-wrap tr td, .llar-table-no_app-login tr th, .llar-table-no_app-login tr td { padding: 12px 2px 12px 14px; } } @media screen and (max-width: 767.5px) { .llar-table-app-login tr th, #llar-setting-page-logs__active .llar-table-scroll-wrap tr th, .llar-table-app-login tr td, #llar-setting-page-logs__active .llar-table-scroll-wrap tr td, .llar-table-no_app-login tr th, .llar-table-no_app-login tr td { display: table-cell; width: fit-content; font-size: 12px; } } .llar-table-app-login thead tr th, #llar-setting-page-logs__active .llar-table-scroll-wrap thead tr th, .llar-table-no_app-login thead tr th { color: #2A2F40; font-weight: 500; } .llar-table-app-login tbody.login-attempts tr, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr, .llar-table-no_app-login tbody.login-attempts tr { border-radius: 16px; background-color: unset; } .llar-table-app-login tbody.login-attempts tr:nth-child(4n+1), #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+1), .llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+1) { background-color: #F6FBFF; } .llar-table-app-login tbody.login-attempts tr:nth-child(4n+3), #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+3), .llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+3) { background-color: unset; } .llar-table-app-login tbody.login-attempts tr:nth-child(4n+2), #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+2), .llar-table-app-login tbody.login-attempts tr:nth-child(4n+4), #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+4), .llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+2), .llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+4) { background-color: rgba(164, 168, 183, 0.0784313725); } .llar-table-app-login tbody.login-attempts tr td, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td, .llar-table-no_app-login tbody.login-attempts tr td { color: #666D84; } .llar-table-app-login tbody.login-attempts tr td:first-child, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td:first-child, .llar-table-no_app-login tbody.login-attempts tr td:first-child { border-top-left-radius: 16px; border-bottom-left-radius: 16px; } .llar-table-app-login tbody.login-attempts tr td:last-child, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td:last-child, .llar-table-no_app-login tbody.login-attempts tr td:last-child { border-top-right-radius: 16px; border-bottom-right-radius: 16px; } .llar-table-app-login tbody.login-attempts tr td.llar-col-nowrap, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.llar-col-nowrap, .llar-table-no_app-login tbody.login-attempts tr td.llar-col-nowrap { white-space: nowrap; } .llar-table-app-login tbody.login-attempts tr td select, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td select, .llar-table-no_app-login tbody.login-attempts tr td select { font-family: inherit; min-width: 150px; margin-right: 25px; background-size: 16px 16px; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip { box-sizing: content-box; right: 0; top: 30px; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip:before, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip:before, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip:before { right: 25px; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content { font-size: 14px; color: white; } @media screen and (max-width: 767.5px) { .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content { font-size: 12px; } } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content ul, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content ul, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content ul { padding-left: 16px; padding-right: 10px; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content ul li, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content ul li, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content ul li { font-size: inherit; color: inherit; margin-bottom: 0; padding-left: 10px; min-width: 120px; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content ul li::before, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content ul li::before, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content ul li::before { content: "✧"; color: white; font-size: 12px; margin-left: -15px; padding-right: 3px; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent { display: inline-block; position: relative; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent span, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent span, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent span { color: #FF7C06; font-weight: 500; } .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent .dashicons, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons { color: #A4A8B7; } @media screen and (max-width: 1599.5px) { .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent .dashicons, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons { line-height: unset; font-size: 14px; } } @media screen and (max-width: 767.5px) { .llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent .dashicons, .llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons { font-size: 12px; } } .llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag, .llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag { display: flex; align-items: center; white-space: nowrap; gap: 3px; } .llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag .llar-tooltip:before, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag .llar-tooltip:before, .llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag .llar-tooltip:before { width: auto !important; } .llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag .hint_tooltip, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag .hint_tooltip, .llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag .hint_tooltip { width: fit-content; right: 0; top: 35px; } .llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag img, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag img, .llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag img { width: 34px; height: auto; border-radius: 4px; vertical-align: middle; margin-right: 4px; } @media screen and (max-width: 1599.5px) { .llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag img, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag img, .llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag img { width: 30px; } } @media screen and (max-width: 1399.5px) { .llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag img, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag img, .llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag img { width: 25px; } } .llar-table-app-login tbody.login-attempts tr td .button, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button, .llar-table-no_app-login tbody.login-attempts tr td .button { line-height: 1; margin-right: 5px; border-radius: 8px; } .llar-table-app-login tbody.login-attempts tr td .button:last-child, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button:last-child, .llar-table-no_app-login tbody.login-attempts tr td .button:last-child { margin-right: 0; } .llar-table-app-login tbody.login-attempts tr td .button .dashicons, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button .dashicons, .llar-table-no_app-login tbody.login-attempts tr td .button .dashicons { vertical-align: middle; } .llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open, .llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open { display: inline-block; width: 30px; min-width: unset; min-height: 30px; padding: 0; text-align: center; line-height: 20px; cursor: pointer; color: #A4A8B7; border-color: currentColor; } @media screen and (max-width: 767.5px) { .llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open, .llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open { width: 25px; min-height: 25px; } .llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open .dashicons, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open .dashicons, .llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open .dashicons { font-size: 14px; height: 16px; } } .llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open:focus, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open:focus, .llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open:focus { outline: unset; box-shadow: unset; } .llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open:hover, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open:hover, .llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open:hover { color: #4ACAD8; } .llar-table-app-login tbody.login-attempts tr td.button-open, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.button-open, .llar-table-no_app-login tbody.login-attempts tr td.button-open { padding: 0 2px; } .llar-table-app-login tbody.login-attempts tr td.cell-login, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.cell-login, .llar-table-no_app-login tbody.login-attempts tr td.cell-login { max-width: 9ch; } .llar-table-app-login tbody.login-attempts tr td.cell-login a, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.cell-login a, .llar-table-no_app-login tbody.login-attempts tr td.cell-login a { display: inline-block; max-width: 9ch; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .llar-table-app-login tbody.login-attempts tr .cell-id, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id, .llar-table-no_app-login tbody.login-attempts tr .cell-id { display: inline-block; } .llar-table-app-login tbody.login-attempts tr .cell-id .id, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id .id, .llar-table-no_app-login tbody.login-attempts tr .cell-id .id { font-size: 15px; max-width: 14ch; display: inline-block; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } @media screen and (max-width: 1599.5px) { .llar-table-app-login tbody.login-attempts tr .cell-id .id, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id .id, .llar-table-no_app-login tbody.login-attempts tr .cell-id .id { font-size: 90%; } } .llar-table-app-login tbody.login-attempts tr .cell-id .hint_tooltip, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id .hint_tooltip, .llar-table-no_app-login tbody.login-attempts tr .cell-id .hint_tooltip { top: 30px !important; } .llar-table-app-login tbody.login-attempts tr .cell-role .hint_tooltip, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-role .hint_tooltip, .llar-table-no_app-login tbody.login-attempts tr .cell-role .hint_tooltip { right: -25px; } .llar-table-app-login tbody.login-attempts tr.hidden-row, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row, .llar-table-no_app-login tbody.login-attempts tr.hidden-row { display: none; } .llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open, .llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open { display: table-row; } .llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td, .llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td { font-size: 16px; } @media screen and (max-width: 1399.5px) { .llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td, .llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td { font-size: 14px; } } .llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td span, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td span, .llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td span { font-weight: 600; } .llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td a, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td a, .llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td a { white-space: nowrap; } .llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td .open_street_map, #llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td .open_street_map, .llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td .open_street_map { border: unset; } .llar-table-app-login .table-inline-preloader, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader, .llar-table-no_app-login .table-inline-preloader { text-align: center; } .llar-table-app-login .table-inline-preloader.hidden, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader.hidden, .llar-table-no_app-login .table-inline-preloader.hidden { display: none; } .llar-table-app-login .table-inline-preloader tr td, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td, .llar-table-no_app-login .table-inline-preloader tr td { padding: 5px; } .llar-table-app-login .table-inline-preloader tr td .load-more-button a, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .load-more-button a, .llar-table-no_app-login .table-inline-preloader tr td .load-more-button a { padding-bottom: 1px; text-decoration: unset; border-bottom: 1px dashed; } .llar-table-app-login .table-inline-preloader tr td .preloader-row, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .preloader-row, .llar-table-no_app-login .table-inline-preloader tr td .preloader-row { display: none; align-items: center; } .llar-table-app-login .table-inline-preloader tr td .preloader-row .preloader-icon, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .preloader-row .preloader-icon, .llar-table-no_app-login .table-inline-preloader tr td .preloader-row .preloader-icon { background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+"); background-size: 100%; background-repeat: no-repeat; width: 30px; height: 30px; display: inline-block; } .llar-table-app-login .table-inline-preloader tr td .preloader-row .preloader-text, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .preloader-row .preloader-text, .llar-table-no_app-login .table-inline-preloader tr td .preloader-row .preloader-text { color: #999; } .llar-table-app-login .table-inline-preloader.loading tr td .load-more-button, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader.loading tr td .load-more-button, .llar-table-no_app-login .table-inline-preloader.loading tr td .load-more-button { display: none; } .llar-table-app-login .table-inline-preloader.loading tr td .preloader-row, #llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader.loading tr td .preloader-row, .llar-table-no_app-login .table-inline-preloader.loading tr td .preloader-row { display: inline-flex; } .llar-notice-review, .llar-notice-notify { display: flex; padding: 15px 20px 0 !important; border-left: 4px solid #333 !important; } .llar-notice-review .llar-review-image img, .llar-notice-notify .llar-review-image img { margin-top: 10px; margin-bottom: 20px; } .llar-notice-review .llar-review-image span, .llar-notice-notify .llar-review-image span { font-size: 80px; color: orange; width: 80px; height: auto; margin-bottom: 20px; } .llar-notice-review .llar-review-info, .llar-notice-notify .llar-review-info { flex: 1; margin-left: 30px; } .llar-notice-review .llar-review-info .llar-buttons, .llar-notice-notify .llar-review-info .llar-buttons { display: flex; align-items: center; } .llar-notice-review .llar-review-info .llar-buttons li, .llar-notice-notify .llar-review-info .llar-buttons li { margin-right: 10px; } .llar-notice-review .llar-review-info .llar-buttons li .dashicons, .llar-notice-notify .llar-review-info .llar-buttons li .dashicons { margin-right: 5px; } .custom-app-tab { position: relative; } .custom-app-tab .spinner { float: none; } .custom-app-tab .llar-app-ajax-msg { font-size: 13px; margin-top: 5px; display: block; } .custom-app-tab .llar-app-ajax-msg.error { color: red; } .custom-app-tab .llar-app-ajax-msg.success { color: green; } .custom-app-tab .llar-delete-app { color: #dc3232; position: absolute; bottom: 15px; right: 15px; } .custom-app-tab .llar-delete-app:hover { opacity: 0.8; } .custom-app-tab .llar-why-use-premium-text { margin-top: 20px; } .custom-app-tab .llar-why-use-premium-text .title { font-weight: bold; font-size: 16px; color: #4d4d4d; } #llar-progress-bar { position: fixed; top: 0; height: 6px; left: 0; width: 100%; z-index: 999999; background-color: #eee; } #llar-progress-bar span { height: 100%; position: absolute; display: block; width: 0; background-color: #00b357; transition: width 0.4s; } .header_massage { margin-right: 20px; } .header_massage #llar-header-upgrade-mc-message, .header_massage #llar-header-upgrade-premium-message { position: relative; margin: 20px auto; width: fit-content; color: #FF9800; font-weight: 500; padding: 14px 32px; text-align: center; border-radius: 40px; border: 1px solid #EBB35A; background-color: #FFEFD6; box-shadow: 0 4px 18px 0 rgba(114, 117, 123, 0.2); } @media screen and (max-width: 991.5px) { .header_massage #llar-header-upgrade-mc-message, .header_massage #llar-header-upgrade-premium-message { padding: 5px 14px; font-size: 11px; } } @media screen and (max-width: 767.5px) { .header_massage #llar-header-upgrade-mc-message, .header_massage #llar-header-upgrade-premium-message { margin-left: 16px; margin-right: 16px; } } .header_massage #llar-header-upgrade-mc-message p, .header_massage #llar-header-upgrade-premium-message p { font-size: 16px; margin: 0; } .header_massage #llar-header-upgrade-mc-message p .dashicons, .header_massage #llar-header-upgrade-premium-message p .dashicons { width: 32px; height: 32px; font-size: 32px; color: inherit; vertical-align: middle; margin-right: 5px; } @media screen and (max-width: 991.5px) { .header_massage #llar-header-upgrade-mc-message p .dashicons, .header_massage #llar-header-upgrade-premium-message p .dashicons { width: 16px; height: 16px; font-size: 16px; } } .header_massage #llar-header-upgrade-mc-message.exhausted, .header_massage #llar-header-upgrade-premium-message.exhausted { color: #EC4652; font-weight: 400; margin-left: auto; margin-right: auto; padding: 12px 25px; background-color: rgba(236, 70, 82, 0.1019607843); border: 1px solid currentColor; } .header_massage #llar-header-upgrade-mc-message .close, .header_massage #llar-header-upgrade-premium-message .close { position: absolute; top: -6px; right: -9px; cursor: pointer; } .header_massage #llar-header-upgrade-mc-message .close .dashicons, .header_massage #llar-header-upgrade-premium-message .close .dashicons { width: 16px; height: 24px; font-size: 24px; } @media screen and (max-width: 991.5px) { .header_massage #llar-header-upgrade-mc-message .close .dashicons, .header_massage #llar-header-upgrade-premium-message .close .dashicons { width: 16px; height: 18px; font-size: 18px; } } #llar-header-login-custom-message { position: relative; margin: 20px auto; width: fit-content; color: #FF9800; font-weight: 500; padding: 14px 32px; text-align: center; border-radius: 40px; border: 1px solid #EBB35A; background-color: #FFEFD6; box-shadow: 0 4px 18px 0 rgba(114, 117, 123, 0.2); width: 900px; font-size: 16px; border-radius: 20px; } @media screen and (max-width: 1799.5px) { #llar-header-login-custom-message { margin-right: auto; } } @media screen and (max-width: 1199.5px) { #llar-header-login-custom-message { width: 795px; } } @media screen and (max-width: 991.5px) { #llar-header-login-custom-message { width: 710px; font-size: 95%; } } @media screen and (max-width: 767.5px) { #llar-header-login-custom-message { font-size: 90%; width: 100%; margin-right: auto; margin-left: auto; } } @media screen and (max-width: 575.5px) { #llar-header-login-custom-message { width: 400px; } } #llar-header-login-custom-message .message-flex { display: flex; } #llar-header-login-custom-message .message-flex .col-first img { width: 150px; } @media screen and (max-width: 1199.5px) { #llar-header-login-custom-message .message-flex .col-first img { width: 130px; } } @media screen and (max-width: 767.5px) { #llar-header-login-custom-message .message-flex .col-first img { width: 100px; } } #llar-header-login-custom-message .message-flex .col-second { width: 30%; line-height: 1.7; color: #2A2F40; margin: 16px 25px; text-align: left; } @media screen and (max-width: 1199.5px) { #llar-header-login-custom-message .message-flex .col-second { margin: 16px 10px; } } #llar-header-login-custom-message .message-flex .col-third { width: 45%; margin: 16px 25px; font-size: 87.5%; } @media screen and (max-width: 1199.5px) { #llar-header-login-custom-message .message-flex .col-third { margin: 16px 10px; } } #llar-header-login-custom-message .message-flex .col-third .row-first { color: #666D84; font-weight: 400; } #llar-header-login-custom-message .message-flex .col-third .row-second { position: relative; margin: 5px 10px; color: #A4A8B7; } #llar-header-login-custom-message .message-flex .col-third .row-second hr { background-color: rgba(255, 124, 6, 0.0980392157); display: inline-block; width: calc(50% - 50px); border: 0; height: 2px; vertical-align: middle; } #llar-header-login-custom-message .message-flex .col-third .row-second span { display: inline-flex; width: 50px; justify-content: center; } #llar-header-login-custom-message .message-flex .col-third .row-third { font-weight: 500; margin: 10px; padding: 5px 10px; background-color: rgba(255, 124, 6, 0.0980392157); border-radius: 10px; } .settings_page_limit-login-attempts .update-nag { display: none; } #llar-welcome-page { padding: 50px 0; } #llar-welcome-page img { max-width: 100%; height: auto; } #llar-welcome-page .llar-welcome-page-container { width: 100%; max-width: 760px; margin: 0 auto 30px; background-color: #fff; border-radius: 4px; box-shadow: 0 0 4px rgba(0, 0, 0, 0.1); } #llar-welcome-page .llar-welcome-page-container.llar-premium { border-top: 5px solid #50c1cd; } #llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section { padding: 20px; text-align: center; } #llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section .llar-logo { text-align: center; margin-top: 20px; margin-bottom: 30px; } #llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h2 { font-size: 2.4em; line-height: 1.4; } #llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h3 { font-size: 1.5em; line-height: 1.4; } #llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section p { font-size: 17px; color: #444; } #llar-welcome-page .llar-welcome-page-container .llar-welcome-page-video-wrap img { width: 100%; height: auto; cursor: pointer; } #llar-welcome-page .llar-welcome-page-features { display: flex; flex-wrap: wrap; justify-content: space-between; padding: 0 15px; counter-reset: cnt1; } #llar-welcome-page .llar-welcome-page-features .llar-feature-item { flex: 0 0 24%; text-align: center; margin-bottom: 40px; position: relative; padding-bottom: 60px; } #llar-welcome-page .llar-welcome-page-features .llar-feature-item:before { content: counter(cnt1); counter-increment: cnt1; position: absolute; left: 50%; transform: translatex(-50%); bottom: 0; font-size: 1em; font-weight: 600; width: 40px; height: 40px; line-height: 40px; text-align: center; border-radius: 50%; background-color: #ecedef; color: #979aaa; } #llar-welcome-page .llar-welcome-page-features .llar-feature-item:after { position: absolute; content: ""; left: -39%; width: 69%; height: 1px; bottom: 1.4em; background-color: #ecedef; } #llar-welcome-page .llar-welcome-page-features .llar-feature-item:nth-child(4n+1):after { display: none; } #llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-image { margin-bottom: 15px; } #llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-title { font-weight: bold; margin-bottom: 15px; } #llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-desc { color: #979aaa; } @media (max-width: 768px) { #llar-welcome-page .llar-welcome-page-features { display: block; } } #llar-welcome-page .llar-why-recommend { text-align: left; font-size: 17px; } #llar-welcome-page .llar-why-recommend ul li span { margin-right: 5px; width: auto; height: auto; font-size: 25px; vertical-align: middle; color: green; } #llar-welcome-page .llar-welcome-list { font-size: 17px; text-align: left; line-height: 1.4; list-style: none; } #llar-welcome-page .llar-welcome-list li span { margin-right: 10px; width: auto; height: auto; font-size: 22px; vertical-align: top; color: orange; } #llar-welcome-page .llar-upgrade-btn-wrap { padding: 20px; } #llar-welcome-page .llar-upgrade-btn-wrap a { display: inline-block; background-color: #e27800; color: #fff; font-size: 22px; padding: 20px; text-decoration: none; font-weight: 600; } #llar-welcome-page .llar-upgrade-btn-wrap a:hover { background-color: #af5d00; } #llar-welcome-page .llar-upgrade-questions { font-size: 17px; } .dashboard_page_llar-welcome .update-nag, .dashboard_page_llar-welcome .notice:not(.llar-notice-review), .toplevel_page_limit-login-attempts .update-nag, .toplevel_page_limit-login-attempts .notice:not(.llar-notice-review) { margin-top: 15px; display: none; } .dashboard_page_llar-welcome .update-nag p, .dashboard_page_llar-welcome .notice:not(.llar-notice-review) p, .toplevel_page_limit-login-attempts .update-nag p, .toplevel_page_limit-login-attempts .notice:not(.llar-notice-review) p { margin-left: 10px; } .dashboard_page_llar-welcome .video-container, .toplevel_page_limit-login-attempts .video-container { position: relative; padding-bottom: 56.1%; height: 0; overflow: hidden; } .dashboard_page_llar-welcome .video-container iframe, .toplevel_page_limit-login-attempts .video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } #wp-admin-bar-llar-root #wp-admin-bar-llar-root-premium a { color: orange; } #toplevel_page_limit-login-attempts .wp-menu-image.svg { background-size: 25px auto !important; margin-top: 7px; } #toplevel_page_limit-login-attempts .llar-submenu-premium-item a { color: orange; } #menu-settings li { position: relative; } #menu-settings li .llar-alert-icon { position: absolute; right: 5px; top: 7px; min-width: 15px; line-height: 15px; height: 15px; } #wpadminbar li .llar-alert-icon .plugin-count { vertical-align: middle; margin-top: -3px; } .llar-auto-update-notice { display: block !important; } .llar-attempts-chart-legend > div { margin-right: 10px; color: #60666d; display: inline-block; } .llar-attempts-chart-legend > div:last-child { margin-right: 0; } .llar-attempts-chart-legend > div:before { content: ""; display: inline-block; width: 37px; height: 9px; border: 3px solid; margin-right: 5px; vertical-align: middle; } .llar-attempts-chart-legend > div.legend-1:before { border-color: rgb(54, 162, 235); background-color: rgba(54, 162, 235, 0.3); } .llar-attempts-chart-legend > div.legend-2:before { border-color: rgba(174, 174, 174, 0.7); background-color: rgba(174, 174, 174, 0.2); } .llar-attempts-chart-legend > div.legend-2 .llar-tooltip:before { left: auto; right: 0; } #llar-dashboard-page { font-family: CoFo Sans, arial; margin-top: 40px; } #llar-dashboard-page * { box-sizing: border-box; } #llar-dashboard-page ul, #llar-dashboard-page ol { margin-left: 0; padding-left: 32px; } #llar-dashboard-page ul li, #llar-dashboard-page ol li { font-size: 16px; color: #666D84; padding-left: 16px; margin-bottom: 10px; } #llar-dashboard-page ul li::before, #llar-dashboard-page ol li::before { color: #9762EF; margin-left: -20px; } #llar-dashboard-page .section-title__new { display: flex; flex-wrap: nowrap; justify-content: space-between; gap: 20px; font-size: 16px; text-align: left; } @media screen and (max-width: 1799.5px) { #llar-dashboard-page .section-title__new { gap: 10px; } } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .section-title__new { font-size: 14px; } } #llar-dashboard-page .section-title__new .llar-label { color: #2A2F40; min-width: fit-content; text-wrap: nowrap; padding: 2px 16px; border-radius: 8px; background-color: rgba(10, 172, 208, 0.08); } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .section-title__new .llar-label { padding: 2px 5px; } } #llar-dashboard-page .section-title__new .llar-label-group { display: flex; column-gap: 20px; } #llar-dashboard-page .section-title__new .llar-label__url { color: #A4A8B7; font-size: 87.5%; margin-right: 18px; overflow: hidden; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .section-title__new .llar-label__url { margin-right: 4px; } } #llar-dashboard-page .section-title__new .llar-label__circle-blue { font-size: 64px; vertical-align: middle; color: #58C3FF; } #llar-dashboard-page .section-title__new .llar-label__circle-grey { font-size: 64px; vertical-align: middle; color: rgba(174, 174, 174, 0.6980392157); } #llar-dashboard-page .section-title__new .llar-label .dashicons { font-size: 140%; width: 14px; height: 14px; } #llar-dashboard-page .section-title__new .llar-label.exhausted { color: #EC4652; background-color: rgba(236, 70, 82, 0.1019607843); } #llar-dashboard-page .section-title__new .llar-label.request { background-color: unset; } #llar-dashboard-page .section-content { margin-top: 16px; overflow: hidden; } #llar-dashboard-page .dashboard-section-1 { margin-bottom: 20px; display: flex; flex-wrap: nowrap; gap: 16px; } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-1 { flex-wrap: wrap; gap: 8px; } } #llar-dashboard-page .dashboard-section-1 > [class^=info-box-] { position: relative; text-align: center; flex: 0 0 auto; width: calc(33.3% - 16px); padding: 32px 30px 24px; border-radius: 20px; background: #FDFDFD; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } @media screen and (max-width: 1799.5px) { #llar-dashboard-page .dashboard-section-1 > [class^=info-box-] { padding: 30px 16px 16px; } } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-1 > [class^=info-box-] { padding: 30px 16px; } } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-1 > [class^=info-box-] { width: calc(40% - 4px); min-height: 272px; } } @media screen and (max-width: 1199.5px) { #llar-dashboard-page .dashboard-section-1 > [class^=info-box-] { width: 100%; min-height: 294px; } } #llar-dashboard-page .dashboard-section-1 > [class^=info-box-]:last-child { border: 0; } #llar-dashboard-page .dashboard-section-1 > [class^=info-box-] .title { font-weight: 500; color: #666D84; font-size: 16px; line-height: 1.5; } #llar-dashboard-page .dashboard-section-1 > [class^=info-box-] .title-big { font-size: 20px; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label { float: right; margin-right: 18px; padding-top: 2px; color: #666D84; text-wrap: nowrap; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons { width: unset; height: unset; background-color: #97F6C8; border-radius: 4px; color: #FDFDFD; margin-right: 5px; font-size: inherit; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons.disabled { background-color: #EC4652; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons { margin-top: 2px; } } @media screen and (max-width: 1199.5px) { #llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons { margin-right: 2px; } } #llar-dashboard-page .dashboard-section-1 .info-box-1 .section-content { clear: both; margin-top: 24px; margin-bottom: 16px; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .chart { max-width: 300px; position: relative; margin-bottom: 15px; margin-left: auto; margin-right: auto; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .doughnut-chart-wrap { position: relative; width: 200px; height: auto; margin: 0 auto; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .llar-retries-count { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 28px; font-weight: bold; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .desc { margin-top: 10px; color: #A4A8B7; font-size: 14px; } #llar-dashboard-page .dashboard-section-1 .info-box-1 .actions { margin-top: 5px; } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-1 .info-box-2 { width: calc(60% - 4px); } } @media screen and (max-width: 1199.5px) { #llar-dashboard-page .dashboard-section-1 .info-box-2 { width: 100%; } } #llar-dashboard-page .dashboard-section-1 .info-box-2 .section-content { overflow: visible; } #llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap { width: 100%; margin: 0 auto; clear: both; } #llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap canvas { height: 300px; } #llar-dashboard-page .dashboard-section-1 .info-box-2 .chart-stats-legend { text-align: center; margin-top: 10px; } #llar-dashboard-page .dashboard-section-1 .info-box-3 { text-align: left; } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-1 .info-box-3 { width: 100%; } } #llar-dashboard-page .dashboard-section-1 .info-box-3 .section-content { overflow: unset; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .section-content .list-unstyled { padding-left: 5px; font-size: 14px; line-height: 1.5; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .desc { color: #666D84; font-size: 16px; line-height: 1.5; margin-bottom: 20px; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .title { color: #2A2F40; font-size: 18px; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions { position: relative; width: fit-content; left: 50%; transform: translateX(-50%); } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons { display: flex; flex-direction: row; column-gap: 16px; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons a { text-transform: uppercase; font-size: 16px; margin-bottom: 5px; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons a.button.menu__item { text-transform: none; text-align: center; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item { min-width: 200px; max-width: 235px; padding: 7px 8px; font-size: 16px; border-radius: 8px; margin: 0 auto; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item { min-width: 160px; } } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__transparent_orange { color: #FF7C06 !important; border: 1px solid; background: transparent; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__transparent_orange:hover { background: rgba(255, 124, 6, 0.0980392157); border: 1px solid #FF7C06; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__orange { color: #FDFDFD !important; background: #FF7C06; border: 1px solid #FF7C06; box-shadow: 0 5px 10px 0 rgba(255, 124, 6, 0.4980392157); } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__orange:hover { background: #F07200; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item:focus { outline: none !important; box-shadow: unset !important; } #llar-dashboard-page .dashboard-section-1 .info-box-3 .remark { font-size: 14px; color: #666D84; margin: 15px 16px 0; } #llar-dashboard-page .dashboard-section-1.custom .info-box-2 { flex: 0 0 calc(66.666% - 16px); width: calc(66.666% - 16px); } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-1.custom .info-box-2 { flex: 1 0 calc(50% - 4px); width: calc(50% - 4px); } } @media screen and (max-width: 1399.5px) and (max-width: 991.5px) { #llar-dashboard-page .dashboard-section-1.custom .info-box-2 { flex: 1 0 100%; width: 100%; min-height: 126px; } } #llar-dashboard-page .dashboard-section-2 { display: flex; flex-wrap: wrap; justify-content: space-between; margin-bottom: 20px; } #llar-dashboard-page .dashboard-section-2 > [class^=info-box-] { flex: 0 0 calc(50% - 10px); min-height: 100px; background: #FDFDFD; border: 1px solid #e4e4e4; padding: 15px; } #llar-dashboard-page .dashboard-section-2 > [class^=info-box-]:last-child { margin-right: 0; } #llar-dashboard-page .dashboard-section-2 .info-box-1 { padding: 0; } #llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list { padding: 0; margin: 0; } #llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li { margin: 0; border-bottom: 1px solid #e4e4e4; } #llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li:last-child { border: 0; } #llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a { text-decoration: none; padding: 15px; font-size: 15px; display: block; } #llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a:hover { background-color: #f9f9f9; } #llar-dashboard-page .dashboard-section-2 .info-box-2 { display: flex; flex-wrap: wrap; } #llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon { flex: 0 0 100px; display: flex; justify-content: center; align-items: center; margin-right: 15px; } #llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon .dashicons { color: #0073a0; font-size: 50px; width: auto; height: auto; } #llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content { flex: 1; } #llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .title { font-size: 20px; font-weight: bold; margin-bottom: 10px; line-height: 1.5; } #llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .desc { font-size: 15px; margin-bottom: 15px; } #llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .actions { display: flex; justify-content: space-between; } #llar-dashboard-page .dashboard-section-3 { display: flex; flex-wrap: nowrap; margin-bottom: 20px; column-gap: 16px; } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-3 { gap: 8px; } } @media screen and (max-width: 575.5px) { #llar-dashboard-page .dashboard-section-3 { flex-wrap: wrap; } } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] { position: relative; display: flex; flex-wrap: wrap; flex: 0 0 auto; width: calc(33.33333333% - 16px); padding: 20px 90px 26px 28px; border-radius: 20px; background: #FDFDFD; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] { padding: 16px 25px 30px; width: calc(33.33333333% - 5px); } } @media screen and (max-width: 767.5px) { #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] { padding: 16px 10px 16px; } } @media screen and (max-width: 575.5px) { #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] { flex: 0 0 100%; } } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-icon { flex: 0 0 auto; display: flex; justify-content: center; align-items: start; } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-icon img { width: 50px; height: 50px; vertical-align: middle; margin-right: 16px; } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-icon img { width: 40px; height: 40px; margin-right: 8px; } } @media screen and (max-width: 767.5px) { #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-icon img { width: 35px; height: 35px; margin-right: 4px; } } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-content { flex: 1; } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-content .title { color: #2A2F40; font-size: 20px; font-weight: 500; margin-bottom: 4px; line-height: 1.3; } @media screen and (max-width: 767.5px) { #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-content .title { font-size: 16px; } } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-content .title a { text-decoration: none; } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-content .desc { font-size: 14px; } #llar-dashboard-page .dashboard-section-3 > [class^=info-box-] .info-box-content .actions { display: flex; justify-content: space-between; } #llar-dashboard-page .dashboard-section-4 { display: flex; flex-wrap: wrap; margin-bottom: 20px; column-gap: 1rem; } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-4 { gap: 8px; } } #llar-dashboard-page .dashboard-section-4 > [class^=info-box-] { flex: 0 0 auto; width: calc(50% - 16px); min-height: 100px; max-height: 600px; padding: 32px 23px 24px 30px; border-radius: 20px; background: #FDFDFD; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); overflow: hidden; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-4 > [class^=info-box-] { max-height: 515px; padding: 27px 18px 20px 22px; } } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-4 > [class^=info-box-] { width: 100%; } } @media screen and (max-width: 991.5px) { #llar-dashboard-page .dashboard-section-4 > [class^=info-box-] { padding: 27px 16px 16px 18px; } } #llar-dashboard-page .dashboard-section-4 > [class^=info-box-]:last-child { margin-right: 0; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip { box-sizing: content-box; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip:before { right: 25px; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip-content { font-size: 14px; color: white; } @media screen and (max-width: 767.5px) { #llar-dashboard-page .dashboard-section-4 .hint_tooltip-content { font-size: 12px; } } #llar-dashboard-page .dashboard-section-4 .hint_tooltip-content ul { padding-left: 16px; padding-right: 10px; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip-content ul li { font-size: inherit; color: inherit; margin-bottom: 0; padding-left: 10px; min-width: 120px; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip-content ul li::before { color: white; font-size: 12px; margin-left: -15px; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent { display: inline-block; position: relative; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent span { color: #FF7C06; font-weight: 500; } #llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent .dashicons { color: #A4A8B7; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent .dashicons { line-height: unset; font-size: 14px; width: 12px; } } @media screen and (max-width: 767.5px) { #llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent .dashicons { font-size: 12px; } } #llar-dashboard-page .dashboard-section-4 .info-box-1 { position: relative; } #llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title__new .title { color: #2A2F40; font-size: 20px; font-weight: 500; } #llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title__new .desc { color: #666D84; font-size: 16px; line-height: 1.5; margin: 40px; text-align: center; } #llar-dashboard-page .dashboard-section-4 .info-box-1 .section-content { height: 100%; overflow: auto; scrollbar-width: thin; scrollbar-gutter: stable; padding-bottom: 30px; } #llar-dashboard-page .dashboard-section-4 .info-box-2 { line-height: 1.5; padding-left: 30px; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-4 .info-box-2 { padding-left: 25px; } } @media screen and (max-width: 991.5px) { #llar-dashboard-page .dashboard-section-4 .info-box-2 { padding-left: 22px; } } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title__new .title { color: #2A2F40; font-size: 20px; font-weight: 500; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title__new .desc { color: #666D84; font-size: 16px; line-height: 2; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title__new .desc { line-height: 1.8; } } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content { margin-top: 0; padding-top: 5px; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list { color: #2A2F40; font-size: 16px; font-weight: 500; margin-top: 27px; } @media screen and (max-width: 1599.5px) { #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list { font-size: 14px; margin-top: 20px; } } @media screen and (max-width: 1399.5px) { #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list { margin-top: 15px; } } @media screen and (max-width: 991.5px) { #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list { margin-top: 12px; } } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input { box-sizing: content-box; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input:disabled, #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input:before { opacity: 1; pointer-events: none; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input:checked + span { text-decoration: line-through; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list-add { display: none; color: #FF7C06; margin-left: 10px; font-weight: 400; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input[type=checkbox]:checked ~ .list-add { display: none; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input[type=checkbox]:not(:checked) ~ .list-add { display: inline; } #llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list .desc { color: #666D84; font-weight: 400; margin: 5px 25px; } #llar-admin-dashboard-widgets .widget-title { padding-bottom: 15px; border-bottom: 1px solid #e4e4e4; font-size: 14px; text-align: left; } #llar-admin-dashboard-widgets .widget-content { font-family: CoFo Sans, arial; } #llar-admin-dashboard-widgets .widget-content .llar-attempts-chart-legend { margin-bottom: 10px; } #llar-admin-dashboard-widgets .llar-widget { margin-bottom: 20px; background-color: #fff; text-align: center; } #llar-admin-dashboard-widgets .llar-widget .section-title__new { font-size: 12px; line-height: 150%; display: flex; flex-wrap: nowrap; justify-content: space-between; text-align: left; } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label { color: #2A2F40; min-width: fit-content; padding: 0.125rem 0.75rem; border-radius: 8px; background-color: rgba(10, 172, 208, 0.08); } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label-group { display: flex; column-gap: 30px; } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label__circle-blue { font-size: 44px; vertical-align: middle; color: #58C3FF; } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label__circle-grey { font-size: 44px; vertical-align: middle; color: rgba(174, 174, 174, 0.6980392157); } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip { left: -100%; } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip:before { right: 82%; } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-premium-label .dashicons { width: unset; height: unset; background-color: #97F6C8; border-radius: 4px; color: #FDFDFD; margin-right: 5px; margin-top: 3px; font-size: inherit; } #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-premium-label .dashicons.disabled { background-color: #EC4652; } @media screen and (max-width: 1199.5px) { #llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-premium-label .dashicons { margin-right: 2px; } } #llar-admin-dashboard-widgets .llar-widget .chart { max-width: 300px; position: relative; margin: 15px auto; } #llar-admin-dashboard-widgets .llar-widget .chart .doughnut-chart-wrap { position: relative; width: 200px; height: auto; margin: 0 auto; } #llar-admin-dashboard-widgets .llar-widget .chart .llar-retries-count { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 28px; font-weight: bold; } #llar-admin-dashboard-widgets .llar-widget .title { font-weight: 600; font-size: 16px; line-height: 1.5; margin-bottom: 10px; } #llar-admin-dashboard-widgets .llar-widget .desc { font-size: 15px; } #llar-admin-dashboard-widgets .llar-widget .actions { margin-top: 5px; } #llar-admin-dashboard-widgets .llar-widget.widget-2 .llar-chart-wrap { width: 100%; margin: 0 auto; clear: both; } #llar-admin-dashboard-widgets .llar-widget.widget-2 .llar-chart-wrap canvas { height: 300px; } #llar-admin-dashboard-widgets .llar-widget.widget-2 .chart-stats-legend { text-align: center; margin-top: 10px; } .toplevel_page_limit-login-attempts { font-family: CoFo Sans, arial; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box { padding: 0 !important; background-color: transparent; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-content-pane { display: block; margin-bottom: 0; border-radius: 16px; overflow-y: auto; scrollbar-width: none; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-closeIcon { top: 17px !important; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-buttons { padding-right: 15px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block { margin-top: 24px; display: flex; flex-wrap: wrap; justify-content: center; column-gap: 16px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block .button { font-size: 18px; margin-top: 20px; padding: 11px 60px; width: 70%; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-horizon { display: flex; justify-content: center; margin-top: 20px; gap: 10px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-horizon .button { font-size: 18px; padding: 11px 60px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-single { margin-top: 20px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-single .button { font-size: 18px; padding: 11px 60px; width: fit-content; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content { min-height: 930px; padding: 15px; background: url("./images/onboarding-bg-big.webp") center top; background-size: 100%; border-radius: 16px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .logo { width: 90px; margin: 100px auto 50px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .logo img { background: rgba(253, 253, 253, 0.4); border-radius: 8px; padding: 20px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line { position: relative; height: 2px; width: 50%; margin: 10px auto 60px; background-color: #ABBFC1; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block { position: absolute; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; left: 0; top: -30px; width: 60px; height: 60px; border-radius: 50%; background-color: transparent; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block .point { position: absolute; top: 22px; width: 18px; height: 18px; border-radius: 50%; background-color: #ABBFC1; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block .description { position: absolute; top: 60px; font-size: 16px; color: #666D84; width: max-content; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block.active { position: absolute; background-color: rgba(74, 202, 216, 0.3019607843); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block.active .description { color: #2A2F40; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block.visited .point { background-color: #4ACAD8; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="1"] { left: 0; transform: translateX(-50%); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="2"] { left: 33.3333333333%; transform: translateX(-50%); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="3"] { left: 66.6666666667%; transform: translateX(-50%); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="4"] { left: 100%; transform: translateX(-50%); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .title { font-size: 32px; font-weight: 500; color: #FF7C06; text-align: center; padding-top: 40px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .title img { width: 36px; vertical-align: text-top; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .preloader-wrapper { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.3); align-items: center; justify-content: center; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .preloader-wrapper .spinner { display: block; position: relative; float: none; visibility: hidden; top: 50%; transform: translateY(-50%); margin: 0 auto; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-disabled .preloader-wrapper { display: block; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card { min-width: 768px; text-align: center; margin-top: 37px; padding: 23px 63px 60px; border: unset; background-color: #F6FBFF; border-radius: 20px; box-shadow: 2px 2px 9px 0 rgba(162, 180, 189, 0.2); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .explanations { font-size: 14px; color: #666D84; margin-top: 15px; padding: 0 35px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification__error { display: none; color: #666D84; font-size: 20px; line-height: 1.5; margin: 15px auto 0; padding: 9px 70px; width: fit-content; border-radius: 8px; background-color: white; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification img, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification__error img { display: inline-block; width: 12.5px; margin-right: 2px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification__error { color: #EC4652; background-color: rgba(236, 70, 82, 0.1019607843); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-wrap { margin-top: 23px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-title { color: #2A2F40; font-size: 20px; font-weight: 500; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-title-add { color: #666D84; font-size: 18px; font-weight: 400; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email { display: inline-block; line-height: 25px; margin-top: 11px; width: 100%; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border { font-size: 16px; min-width: 420px; padding: 15px 30px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .button, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .button { position: relative; display: inline-block; font-size: 18px; padding: 14px 30px 15px; margin-left: -25px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .button .dashicons, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .button .dashicons { margin-left: 15px; line-height: inherit; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-error { display: none; color: red; margin-top: 15px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border { min-width: 100%; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-desc, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-desc-add { color: #666D84; font-size: 16px; line-height: 1.5; text-align: center; margin-top: 22px; padding: 0 25px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-desc-add { font-size: 18px; color: #2A2F40; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-desc-additional { color: #A4A8B7; font-size: 16px; line-height: 1.5; text-align: left; margin-top: 12px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-list { line-height: 1.5; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-list .item { font-size: 18px; color: #666D84; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-list .item:before { color: #9762EF; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video { position: relative; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; margin-top: 24px; border-radius: 16px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video .video-container { position: relative; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video #video-poster, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video #video-frame { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 20px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video #video-poster { cursor: pointer; z-index: 1; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-checkbox { display: inline-block; color: #666D84; font-size: 14px; margin-top: 10px; margin-left: 25px; text-align: left; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-checkbox input { margin-top: 15px; margin-left: -25px; vertical-align: top; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-checkbox span { display: inline-block; margin-left: 15px; margin-top: 10px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-image { width: 240px; margin: 0 auto; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options { display: flex; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .info { font-size: 16px; line-height: 22px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons { display: flex; padding-left: 15px; align-items: center; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span { text-transform: uppercase; cursor: pointer; width: 45px; text-align: center; vertical-align: middle; display: block; height: 34px; line-height: 34px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span.llar-act { background-color: #0A75B5; color: #fff; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span:first-child { border: 1px solid #ccc; border-radius: 4px 0 0 4px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span:last-child { border: 1px solid #ccc; border-radius: 0 4px 4px 0; border-left: 0; } #llar-setting-page-premium { font-family: inherit; line-height: 1.5; } #llar-setting-page-premium .llar-premium-page-promo { padding: 43px 80px 60px; margin-bottom: 20px; border-radius: 20px; background-color: #FDFDFD; box-shadow: 3px 5px 23px 0 rgba(162, 180, 189, 0.2); } #llar-setting-page-premium .llar-premium-page-promo .section-1 { display: flex; align-items: flex-end; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .text .title { font-size: 31px; font-weight: 500; color: #FF7C06; line-height: 1.4; margin-bottom: 5px; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links { font-size: 12px; list-style: none; margin: 0; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links li { display: inline-block; margin-right: 20px; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links li a { position: relative; vertical-align: middle; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links li a.gdpr-information-link:after { position: relative; font-size: inherit; line-height: inherit; right: 0; vertical-align: middle; color: #A4A8B7; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .action { margin-left: auto; text-align: center; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .action a.button { font-size: 16px; padding: 7px 35px; min-width: 250px; text-align: center; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .action .label { font-size: 14px; color: #A4A8B7; margin-top: 9px; } #llar-setting-page-premium .llar-premium-page-promo .section-1 .action .label .dashicons { font-size: 18px; } #llar-setting-page-premium .llar-premium-page-promo .section-1__internal { font-size: 16px; text-align: center; margin-top: 40px; color: #666D84; border-radius: 20px; background-color: #F6FBFF; padding: 27px 0; } #llar-setting-page-premium .llar-premium-page-promo .section-1__internal .llar_turquoise, #llar-setting-page .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink, #llar-setting-page-help .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink, #llar-setting-page-premium .llar-premium-page-promo .section-1__internal .llar-settings-wrap .llar-form-table tr td a.unlink, #llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-premium-page-promo .section-1__internal a.unlink, #llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink, #llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink, #llar-setting-page-premium .llar-premium-page-promo .section-1__internal #llar-setting-page-logs .description-page .description-secondary a.unlink, #llar-setting-page-logs .description-page .description-secondary #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink, #llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink, #llar-setting-page-premium .llar-premium-page-promo .section-1__internal #llar-setting-page-logs__active .description-page .description-secondary a.unlink, #llar-setting-page-logs__active .description-page .description-secondary #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink { display: block; } #llar-setting-page-premium .text-block-1 { margin-bottom: 20px; } #llar-setting-page-premium .text-block-1 p { font-size: 15px; } #llar-setting-page-premium .llar-premium-plans-table { margin-top: 3.75rem; } #llar-setting-page-premium .llar-premium-plans-table .content { border-radius: 16px; background-color: #F6FBFF; padding-right: 15px; padding-bottom: 15px; overflow-x: auto; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background { font-size: 16px; font-weight: 400; line-height: 1.4; width: 100%; border-collapse: inherit; border-spacing: 0; border-radius: 16px; box-shadow: 3px 5px 23px 0 rgba(162, 180, 189, 0.2); } @media screen and (max-width: 1599.5px) { #llar-setting-page-premium .llar-premium-plans-table .content .table_background { font-size: 14px; } } #llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td { font-size: 20px; font-weight: 500; text-align: left; color: #4ACAD8; min-width: 150px; padding: 16px 29px; border-top-left-radius: 16px; border-top-right-radius: 16px; border: 1px solid rgba(74, 202, 216, 0.0980392157); background-color: rgba(74, 202, 216, 0.0980392157); } #llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td:first-child { width: 25%; min-width: 300px; } @media screen and (max-width: 1799.5px) { #llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td { min-width: 100px; } } @media screen and (max-width: 1599.5px) { #llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td { font-size: 18px; font-weight: 400; } } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody { text-align: left; background-color: white; border-bottom-right-radius: 16px; border-bottom-left-radius: 16px; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr { position: relative; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr:nth-child(even)::after { content: ""; position: absolute; top: 5px; bottom: 5px; left: 0; right: 0; border-radius: 16px; background-color: #FDFDFD; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr:last-child td:first-child { border-bottom-left-radius: 16px; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr:last-child td:last-child { border-bottom-right-radius: 16px; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td { position: relative; padding: 16px 29px; border-right: 1px solid #F6FBFF; border-bottom: 1px solid #F6FBFF; z-index: 1; } @media screen and (max-width: 1799.5px) { #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td { padding: 12px 10px; } } @media screen and (max-width: 991.5px) { #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td { font-size: 14px; } } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td:last-child { border-right: unset; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .icon-lock { color: #2A2F40; width: 24px; height: 24px; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td button, #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .llar_button, #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .button { margin: 40px auto; padding-top: 12px; padding-bottom: 12px; width: 100%; } @media screen and (max-width: 1799.5px) { #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td button, #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .llar_button, #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .button { width: auto; } } @media screen and (max-width: 1599.5px) { #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td button, #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .llar_button, #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .button { min-width: 120px; } } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .category { font-weight: 500; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .description { display: block; margin-top: 5px; color: #666D84; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .description a { color: #5C8FDC; text-decoration: none; border-bottom: 1px solid currentColor; } #llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td.inner_fields { text-align: center; } .llar-help-page { font-family: inherit; line-height: 1.5; } .llar-help-page .section-1 { display: flex; padding-top: 45px; padding-bottom: 50px; margin-bottom: 20px; border-radius: 20px; background-color: #FDFDFD; box-shadow: 3px 5px 23px 0 rgba(162, 180, 189, 0.2); } .llar-help-page .section-1 .block { text-align: center; flex: 1; border-right: 1px solid rgba(164, 168, 183, 0.2980392157); } .llar-help-page .section-1 .block:last-child { border: 0; } .llar-help-page .section-1 .block .title { color: #2A2F40; font-weight: 500; font-size: 20px; } .llar-help-page .section-1 .block .text { color: #666D84; font-size: 18px; max-width: 80%; margin: 10px auto; } .llar-help-page .section-1 .block .actions { text-align: center; } .llar-help-page .section-1 .block .actions .button { text-transform: uppercase; font-size: 18px; line-height: 1.4; padding: 4px 20px; } .llar-help-page .section-1 .block .actions .button span { text-transform: none; display: block; font-size: 12px; line-height: 13px; margin-bottom: 2px; } .llar-help-page .section-1 .block .actions .button.button-secondary { min-height: 40px; line-height: 40px; } .llar-help-page .description-page { font-weight: 500; color: #2A2F40; } .llar-help-page .documentation-section { display: flex; flex-wrap: wrap; } .llar-help-page .documentation-section .questions { display: flex; flex: 1 1 calc(100% - 550px); flex-direction: column; } .llar-help-page .documentation-section .questions__block { display: flex; flex: 1 1 auto; flex-direction: column; } @media screen and (max-width: 1399.5px) { .llar-help-page .documentation-section .questions__block { flex: 1 1 100%; } } .llar-help-page .documentation-section .questions__block .question { display: block; flex: 1 0 auto; margin-bottom: 20px; padding: 30px 40px; background-color: #FDFDFD; border-radius: 20px; text-decoration: none; box-shadow: 2px 2px 9px 0 rgba(162, 180, 189, 0.2); } .llar-help-page .documentation-section .questions__block .question:last-child { margin-bottom: 0; } .llar-help-page .documentation-section .questions__block .question:hover { box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } .llar-help-page .documentation-section .questions__block .question .title { font-size: 18px; font-weight: 500; color: #2A2F40; } .llar-help-page .documentation-section .questions__block .question .desc { font-size: 16px; margin-top: 5px; color: #666D84; } .llar-help-page .documentation-section .top-list { flex: 0 0 500px; margin-left: 20px; } @media screen and (max-width: 1399.5px) { .llar-help-page .documentation-section .top-list { flex: 0 0 100%; } } .llar-help-page .documentation-section .top-list .list__block { padding: 30px 35px; border-radius: 20px; background-color: #FDFDFD; box-shadow: 4px 4px 18px 0 rgba(162, 180, 189, 0.2); } .llar-help-page .documentation-section .top-list ol { margin: 0; margin-left: 35px; color: #5C8FDC; list-style: none; counter-reset: my-counter; } .llar-help-page .documentation-section .top-list ol li { position: relative; font-size: 16px; margin-bottom: 15px; padding: 3px; border-radius: 8px; counter-increment: my-counter; } .llar-help-page .documentation-section .top-list ol li:before { content: counter(my-counter) "."; position: absolute; left: -45px; top: 0; width: 100%; height: 100%; font-size: inherit; background-color: #F6FBFF; border-radius: 16px; padding: 3px 20px; } .llar-help-page .documentation-section .top-list ol li a { position: relative; color: inherit; text-decoration: none; } .llar-help-page .documentation-section .top-list ol li a:hover { text-decoration: underline; } .toplevel_page_limit-login-attempts { font-family: CoFo Sans, arial; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box { padding: 0 !important; background-color: transparent; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-content-pane { display: block; margin-bottom: 0; border-radius: 16px; scrollbar-width: none; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-content-pane::-webkit-scrollbar { width: 0px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-closeIcon { top: 17px !important; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-buttons { padding-right: 15px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .preloader-wrapper { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.3); align-items: center; justify-content: center; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .preloader-wrapper .spinner { display: block; position: relative; float: none; visibility: hidden; top: 50%; transform: translateY(-50%); margin: 0 auto; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-disabled .preloader-wrapper { display: block; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border { font-size: 16px; min-width: 420px; padding: 15px 30px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__content { padding: 15px; border-radius: 16px; background-color: #FDFDFD; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body { font-size: 16px; font-weight: 400; line-height: 1.5; color: #2A2F40; padding: 0 15px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body .card { padding: 0; border: unset; box-shadow: unset; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body .card-header { color: #EC4652; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body .card-body { margin-top: 10px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__content { padding: 15px; border-radius: 16px; background: url("./images/micro-cloud-bg.webp") no-repeat center top; background-size: 100%; background-color: #FDFDFD; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body { font-size: 18px; font-weight: 400; line-height: 1.5; color: #2A2F40; padding: 55px 60px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header { display: flex; flex-direction: row; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .left_side { width: 60%; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .right_side { width: 40%; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .right_side img { display: block; width: 306px; margin: 0 auto; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .title { font-size: 44px; font-weight: 500; margin-right: 70px; text-align: left; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .description { margin-top: 10px; color: #666D84; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .description-add { font-size: 14px; font-weight: 500; color: #666D84; margin-top: 10px; padding: 10px 20px; background-color: #ECFAFB; border-radius: 16px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card { min-width: 100%; text-align: center; margin-top: 15px; padding: 0; border: unset; background-color: #F6FBFF; border-radius: 20px; box-shadow: 2px 2px 9px 0 rgba(162, 180, 189, 0.2); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-header { color: #FF7C06; padding: 15px 63px; margin-bottom: 0; background-color: rgba(255, 124, 6, 0.0980392157); border-bottom: 1px solid #FF7C06; border-top-left-radius: 16px; border-top-right-radius: 16px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-header .title { font-size: 20px; font-weight: 500; text-align: left; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-header .title img { width: 22px; vertical-align: middle; margin-right: 15px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body { padding: 10px 63px; text-align: left; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .description { font-size: 16px; color: #666D84; margin-top: 20px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-email { margin-top: 20px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-checkbox { color: #666D84; font-size: 16px; margin-top: 20px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-desc, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-onboarding-popup__content .field-desc-add, .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .micro_cloud_modal__body .card-body .field-desc-add { color: #666D84; font-size: 16px; margin-top: 20px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-image { width: 240px; margin: 0 auto; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .button_block-single { text-align: left; margin-bottom: 30px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .button_block-single .description_add { font-size: 14px; color: #A4A8B7; margin-top: 15px; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body.step-second { text-align: center; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body.step-second .button_block-single { text-align: center; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification { font-size: 18px; margin: 5px auto 0; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification .field-image img { width: 220px; margin: 0 auto; } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification__error { color: #EC4652; padding: 9px 70px; width: fit-content; border-radius: 8px; background-color: rgba(236, 70, 82, 0.1019607843); } .toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification img { display: inline-block; width: 12.5px; margin-right: 2px; } /*# sourceMappingURL=limit-login-attempts.css.map */ PKwL\3֫LLElimit-login-attempts-reloaded/assets/css/limit-login-attempts.css.mapnu[{"version":3,"sourceRoot":"","sources":["../sass/_settings.scss","../sass/_mixins.scss","../sass/limit-login-attempts.scss","../sass/_dashboard-page.scss","../sass/_admin-dashboard-widgets.scss","../sass/_onboarding-popup.scss","../sass/_premium-tab.scss","../sass/_help-page.scss","../sass/_micro-cloud-modal.scss"],"names":[],"mappings":";AAAQ;AAuDR;EACE;EACA;EACA,kBAlC0B;EAmC1B;EACA;EACA;EACA,eAZc;EAad;EACA;EACA;;AAEA;EAEE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAEA;EACE;;;AAOJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAgBJ;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE,OApJqB;;;AAuJvB;EACE,OAlKuB;;AAoKvB;EACE,OAjK4B;;;AAqKhC;EACE,OA3J0B;;;AA8J5B;EACE;;AAEA;EACE;EACA,OAnKwB;EAoKxB;;;AAIJ;EAEE,eA9ImB;EA+InB,kBAvK+B;EAwK/B;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,OApO8B;EAqO9B;EACA;EACA;EACA;EACA,YA7NqB;;ACYrB;EDsMF;IAcI;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA,OAlP0B;EAmP1B,eAnOU;EAoOV;EACA;;ACtQA;ED8PF;IAWI;IACA;;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE,kBA9RgB;EA+RhB;EACA;EACA;;AAEA;EACE,kBA7RqB;EA8RrB;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OA9SY;;AAkThB;EACE;;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,OApUY;EAqUZ;EACA;EACA;;;AAKN;EACE;EACA,YA9UgB;EA+UhB;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;ACpVF;ED+UA;IAQI;;;ACrUJ;ED6TA;IAYI;;;ACjTJ;EDqSA;IAgBI;;;AAIJ;EACE;EACA;;;AAIJ;EAEE;EACA;EACA;EACA;;AAIE;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA,eAhYiB;EAiYjB;EACA;EACA;EACA;;AAEA;EACE,OAlbmB;EAmbnB,YAjbwB;;AAmbxB;EACE,OA7bU;EA8bV,YAvbiB;;AA0bnB;EACE,OA5aoB;EA6apB;EACA;EACA,YA3ayB;;AA6azB;EACE;;AAGF;EACE,YAncoB;;AAwc1B;EACE,OAhckB;EAiclB;EACA,YAhc6B;;AAkc7B;EACE;;AAGF;EACE,YAldsB;;AAud5B;EACE;EACA;;;AAIJ;EACE;;;AEteA;EACE;;AAGF;EACE,kBFJmB;EEKnB;EACA,YFoCc;EEnCd,aFoCe;EEnCf,OFMiB;;;AEArB;EAEE;;ADnBA;ECiBF;IAKI;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;;AAKN;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,OF1Ce;EE2Cf,aFda;EEeb;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AD1DN;EC+BE;IA+BI;;;ADxDN;ECyBE;IAmCI;IACA;;;ADvDN;ECmBE;IAwCI;IACA;;;AAIJ;EACE,OF9EsB;EE+EtB;EACA;EACA;;AAKE;EACE;EACA;;AAMR;EACE;EACA;;AAKA;EACE;;AAEA;EACE;;AAGF;EACE;;AAKN;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEA;EACE;;AAKN;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAIA;EACE;EACA;EACA;;AAIA;EACE;EACA;;AAIJ;EACE;;AAEA;EACE;;AAKN;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;;;AAKN;EACE,OFxOmB;EEyOnB;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AD5PF;ECuPA;IAQI;;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA,OFjQmB;EEkQnB;EACA,eFpOY;EEqOZ;EACA;;ADjRF;EC0QA;IAUI;;;AAIJ;EACE;;AAEA;EACE,OFjRe;EEkRf;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA,eF5PQ;EE6PR,OF5Re;EE6Rf,YF9SU;EE+SV;;AD1SN;ECoSI;IASI;;;AAGF;EACE;EACA;EACA,eFxQM;EEyQN;EACA;;ADrTR;ECgTM;IAQI;;;ADlTV;EC0SM;IAYI;;;AAIJ;EACE,OFtTW;EEuTX;EACA;EACA;EACA;;AD/TR;EC0TM;IAQI;;;AAGF;EAEE;EACA;EACA;EACA;;ADhVV;EC2UQ;IAQI;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AAKN;EACE,OFvVa;EEwVb;EACA;EACA;EACA;;ADvWR;ECkWM;IAQI;;;AAMA;EACE;;ADjXZ;ECgXU;IAII;;;AAIJ;EACE;EACA;EACA,OF/WS;EEgXT,kBFjYI;EEkYJ;EACA;EACA;;AD/XZ;ECwXU;IAUI;IACA;;;AAGF;EACE;;AAGF;EACE,kBF9XQ;EE+XR,eF/VK;;AEkWP;EACE,kBFpYO;EEqYP,eFpWK;;AEuWP;EACE;EACA;EACA;;AAKN;EACE;EACA;EACA;;AAEA;EACE;;ADlaZ;ECiaU;IAII;;;AASN;EACE,eFlYS;;AEoYT;EACE;EACA;;AAIJ;EAEE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA,OFtbY;EEubZ;EACA;;ADrcV;ECgcQ;IAQI;;;AAIJ;EACE,OFjcW;;AEocb;EACE;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AASd;EACE;EACA;EACA,kBFxemB;EEyenB,eF3bY;;AC/Bd;ECsdA;IAOI;;;AAGF;EACE,OFlee;EEmef;EACA;EACA;;ADhfJ;EC4eE;IAOI;;;AAIJ;EACE;EACA;EACA;EACA,OF/eiB;EEgfjB;EACA;EACA;;AD9fJ;ECufE;IAUI;;;AAGF;EACE;EACA;EACA;EACA;EACA;;ADzgBN;ECogBI;IAQI;;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAOJ;EACE;;AAEA;EACE;EACA;;AAIJ;EACE;;ADziBN;ECwiBI;IAII;;;AAGF;EACE;EACA;EACA;EACA,eFxgBM;EEygBN;;ADpjBR;EC+iBM;IAQI;;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAYV;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OFplBe;EEqlBf;;AAKJ;EACE;EACA;EACA;EACA;;AAIE;EACE;;AAKN;EACE;EACA;EACA;EACA;EACA,eF7kBY;EE8kBZ,kBF5nBmB;;AE8nBnB;EACE,OFjnBe;EEknBf;EACA;EACA;EACA;EACA;EACA;EACA,yBFxlBU;EEylBV,wBFzlBU;EE0lBV,kBF1oBY;;ACKhB;EC2nBE;IAaI;;;AAGF;EACE;EACA,eFlmBQ;EEmmBR;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;EACA,OF/oBe;EEgpBf,4BFhnBU;EEinBV,2BFjnBU;EEknBV;EACA;EACA,kBFpqBY;EEqqBZ;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;;;AA6BA;EACE,OFpsBU;;AEwsBd;EACE;;;AAWV;EACE;;AAEA;EACE;;AAEA;EACE;;AAEA;EACE;EACA;;AAIJ;EACE;;ADjvBN;ECgvBI;IAII;;;AAGF;EACE;;ADxvBR;ECuvBM;IAII;;;AAGF;EACE;;AAGF;EACE;EACA;;AAWN;EAEE;;AAEA;EACE;;;AAWR;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAKN;EACE;EACA;EACA,eF5xBQ;EE6xBR;EACA;EACA;EACA;;ADj0BF;EC0zBA;IAUI;;;AD9zBJ;ECozBA;IAcI;;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAIE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAQA;EACE,OFh2BS;EEi2BT;EACA;EACA;;AD92BV;EC02BQ;IAOI;IACA;;;AD52BZ;ECo2BQ;IAYI;;;AAMR;EACE,OFj3Be;;AEq3Bb;EACE,eFj2BA;EEk2BA,kBFt4BW;;AE04BT;EACE,wBFv2BJ;EEw2BI,2BFx2BJ;;AE22BE;EACE,yBF52BJ;EE62BI,4BF72BJ;;AEk3BF;EACE;EACA;EACA;;ADt5BV;ECm5BQ;IAMI;IACA;;;ADp5BZ;EC64BQ;IAWI;IACA;;;AAGF;EACE;;AAGF;EACE;EACA;;AAKA;EAEE,OFl6BQ;EEm6BR;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;AAMF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AD19Bd;ECq9BY;IAQI;;;ADv9BhB;EC+8BY;IAYI;;;AAKN;EACE;EACA;EACA,eF57BO;;AE87BP;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKA;EACE;;AAad;EACE;;AAEA;EACE;;AAKA;EACE;;AAGE;EACE;EACA;EACA;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAaF;EACE;;AAGF;EACE;;AAaZ;EACE;;AAIE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMJ;EACE;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE,OF1mCkB;EE2mClB;EACA;;AAOE;EACE;;ADroCZ;ECooCU;IAII;;;ADloCd;EC8nCU;IAQI;;;AAIJ;EACE;;AAMF;EACE;EACA;;ADzpCZ;ECupCU;IAKI;;;ADtpCd;ECipCU;IASI;;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA,eFloCK;;AEsoCT;EACE;EACA,eFppCF;;AEspCE;EACE;;AAEA;EACE,wBF1pCN;EE2pCM,2BF3pCN;;AE8pCI;EACE,yBF/pCN;EEgqCM,4BFhqCN;;AEqqCA;EACE;EACA;;AAGA;EACE;;AAIJ;EACE;;AAGF;EACE,kBFhsCmB;;AEmsCrB;EACE,kBFhtCU;;AEmtCZ;EACE,OFttCO;EEutCP,cFvtCO;EEwtCP,kBFttCU;;AE0tCd;EACE;EACA;;AAMR;EACE;EACA;EACA,eF7sCM;EE8sCN;;AAEA;EACE;EACA,OFvuCe;EEwuCf;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAQJ;EACE;EACA,OFrvCoB;EEsvCpB;EACA;EACA;;AAGF;EACE;EACA,OFnwCa;EEowCb;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE,OFpyCO;EEqyCP;EACA;;AAOF;EACE;;AAKN;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AASZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBFv0CiC;;AEy0CjC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OFp1CmB;EEq1CnB;EACA;EACA,kBFh1C0B;EEi1C1B,eFzzCY;EE0zCZ;EACA;;ADt2CF;ECw1CA;IAiBI;IACA;;;ADp2CJ;ECk1CA;IAsBI;IACA;;;AAGF;EACE;;ADn3CJ;ECk3CE;IAII;;;AAIJ;EACE;EACA;EACA;;AD73CJ;EC03CE;IAMI;IACA;;;AD33CN;ECo3CE;IAWI;;;AAIJ;EACE;;AD14CJ;ECy4CE;IAII;;;ADv4CN;ECm4CE;IAQI;;;AAIJ;EACE;EACA;EACA;EACA;;ADz5CJ;ECq5CE;IAOI;;;ADt5CN;EC+4CE;IAWI;IACA;;;AAKN;EACE;;;AAIJ;EACE;EACA;EACA;;AAKE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMF;EACE;EACA;EACA;EACA;;ADz8CJ;ECq8CE;IAOI;IACA;;;ADv8CN;EC+7CE;IAYI;;;ADz7CN;EC66CE;IAgBI;IACA;IACA;;;AASF;EACE,OFt9Ca;EEu9Cb;;AAOJ;EACE,eFz8CM;EE08CN;;AAEA;EAEE,kBFl/Ce;;AEq/CjB;EACE;;AAGF;EACE,kBFx+C2B;;AE2+C7B;EACE,OF/+Ce;;AEi/Cf;EACE,wBF79CE;EE89CF,2BF99CE;;AEi+CJ;EACE,yBFl+CE;EEm+CF,4BFn+CE;;AEs+CJ;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;ADrgDV;ECmgDQ;IAKI;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAMR;EACE;EACA;;AAEA;EACE,OF5jDW;EE6jDX;;AAGF;EACE,OFtjDU;;ACbtB;ECkkDU;IAII;IACA;;;AD/iDd;EC0iDU;IASI;;;AAMR;EACE;EACA;EACA;EACA;;AAIE;EACE;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;ADzmDV;EComDQ;IAQI;;;ADtmDZ;EC8lDQ;IAYI;;;AAKN;EACE;EACA;EACA,eF3kDW;;AE6kDX;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OF9nDY;EE+nDZ;;ADpnDV;EC0mDQ;IAaI;IACA;;EAEA;IACE;IACA;;;AAIJ;EACE;EACA;;AAGF;EACE,OF7oDc;;AEkpDpB;EACE;;AAGF;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAKN;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AD9rDR;ECurDM;IAUI;;;AAIJ;EACE;;AAMF;EACE;;AAIJ;EACE;;AAEA;EACE;;AAEA;EACE;;ADltDV;ECitDQ;IAII;;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAQZ;EACE;;AAEA;EACE;;AAKA;EACE;;AAGE;EACE;EACA;EACA;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAYF;EACE;;AAGF;EACE;;;AAYZ;AAAA;EAEE;EACA;EACA;;AAGE;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;EACA;EACA;EACA;;AAIJ;AAAA;EACE;EACA;;AAEA;AAAA;EACE;EACA;;AAEA;AAAA;EACE;;AAEA;AAAA;EACE;;;AAQV;EACE;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACE;;AAEA;EAEE;EACA;EACA;EACA,OF55D2B;EE65D3B,aFv3DoB;EEw3DpB;EACA;EACA,eFr3DiB;EEs3DjB;EACA,kBFv6DyB;EEw6DzB;;ADp5DF;ECw4DA;IAeI;IACA;;;ADl5DJ;ECk4DA;IAoBI;IACA;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AD16DN;ECo6DI;IASI;IACA;IACA;;;AAKN;EACE,OFh8De;EEi8Df;EACA;EACA;EACA;EACA,kBFp8DoB;EEq8DpB;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;ADv8DN;ECo8DI;IAMI;IACA;IACA;;;;AAOV;EACE;EACA;EACA;EACA,OFt+D6B;EEu+D7B,aFj8DsB;EEk8DtB;EACA;EACA,eF/7DmB;EEg8DnB;EACA,kBFj/D2B;EEk/D3B;EAEA;EACA;EACA,eFz8Dc;;ACjDd;EC2+DF;IAkBI;;;AD3+DF;ECy9DF;IAsBI;;;ADz+DF;ECm9DF;IA0BI;IACA;;;ADx+DF;EC68DF;IA+BI;IACA;IACA;IACA;;;ADz+DF;ECu8DF;IAsCI;;;AAIF;EACE;;AAIE;EACE;;ADzgEN;ECwgEI;IAII;;;ADhgER;EC4/DI;IAQI;;;AAKN;EACE;EACA;EACA,OFzhEe;EE0hEf;EACA;;AD1hEJ;ECqhEE;IAQI;;;AAIJ;EACE;EACA;EACA;;ADpiEJ;ECiiEE;IAMI;;;AAGF;EACE,OF3iEe;EE4iEf;;AAGF;EACE;EACA;EACA,OFjjEgB;;AEmjEhB;EACE,kBF7jEoB;EE8jEpB;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA,kBFhlEsB;EEilEtB;;;AAQN;EACE;;;AAIJ;EACE;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EACE;;AAIJ;EACE;;AAIA;EACE;EACA;;AAGF;EACE;;AAKN;EAhEF;IAiEI;;;AAIJ;EACE;EACA;;AAII;EACE;EACA;EACA;EACA;EACA;EACA;;AAMR;EACE;EACA;EACA;EACA;;AAGE;EACE;EACA;EACA;EACA;EACA;EACA;;AAKN;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKN;EACE;;;AAMF;AAAA;AAAA;AAAA;EAEE;EACA;;AAEA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;EACE;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;EACA;EACA;EACA;;;AASF;EACE;;;AAOJ;EACE;EACA;;AAIA;EACE;;;AAOJ;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAQA;EACE;EACA;;;AAMR;EACE;;;AAIA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;;AAKF;EACE;EACA;;AAIA;EACE;EACA;;;ACv5EV;EACE;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;AAEA;EACE;EACA,OHIiB;EGHjB;EACA;;AAEA;EACE,OHWO;EGVP;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;;AF/BF;EEyBA;IASI;;;AF5BJ;EEmBA;IAaI;;;AAGF;EACE,OHzBe;EG0Bf;EACA;EACA;EACA,eHKe;EGJf;;AFzCJ;EEmCE;IASI;;;AAGF;EACE;EACA;;AAGF;EACE,OHxCgB;EGyChB;EACA;EACA;;AFxDN;EEoDI;IAOI;;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EAEE;EACA;EACA;;AAGF;EACE,OH5Ea;EG6Eb,kBH5EkB;;AG+EpB;EACE;;AAKN;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AFhGF;EE4FA;IAOI;IACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,eHxEU;EGyEV,YHzHY;EG0HZ;;AF3HJ;EEmHE;IAWI;;;AFxHN;EE6GE;IAeI;;;AFtHN;EEuGE;IAmBI;IACA;;;AFrHN;EEiGE;IAwBI;IACA;;;AAGF;EACE;;AAGF;EACE;EACA,OHnIe;EGoIf;EACA;;AAEA;EACE;;AASF;EACE;EACA;EACA;EACA,OHrJa;EGsJb;;AAEA;EACE;EACA;EACA,kBHjJgB;EGkJhB;EACA,OH9KM;EG+KN;EACA;;AAEA;EACE,kBHvKO;;ACPnB;EEoKQ;IAcI;;;AFtKZ;EEwJQ;IAkBI;;;AAMR;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA,OH/MgB;EGgNhB;;AAGF;EACE;;AF3NN;EE+NE;IAGI;;;AF5NN;EEyNE;IAOI;;;AAGF;EACE;;AAEF;EACE;EACA;EACA;;AAEA;EACE;;AAGJ;EACE;EACA;;AAIJ;EACE;;AF5PJ;EE2PE;IAII;;;AAGF;EACE;;AAEA;EACE;EACA;EACA;;AAIJ;EACE,OHvQe;EGwQf;EACA;EACA;;AAGF;EACE,OH/Qa;EGgRb;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA,eH5QS;EG6QT;;AF1TV;EEoTQ;IASI;;;AAGF;EACE;EACA;EACA;;AAEA;EACE,YHlUc;EGmUd;;AAIJ;EACE;EACA,YH3UW;EG4UX;EAEA;;AAEA;EACE,YH7UgB;;AGiVpB;EACE;EACA;;AAMR;EACE;EACA,OHrVe;EGsVf;;AAMF;EACE;EACA;;AFpWN;EEkWI;IAKI;IACA;;;AF5VR;EEsVI;IASM;IACA;IACA;;;AAOV;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA,YHxYY;EGyYZ;EACA;;AAEA;EACE;;AAGJ;EACE;;AAEA;EACE;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAMV;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;;AAMR;EACE;EACA;EACA;EACA;;AF7cF;EEycA;IAOI;;;AFxbJ;EEibA;IAWI;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eHzbU;EG0bV,YH1eY;EG2eZ;;AFheJ;EEudE;IAYI;IACA;;;AFldN;EEqcE;IAiBI;;;AFhdN;EE+bE;IAqBI;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AFzfR;EEqfM;IAOI;IACA;IACA;;;AF5eV;EEmeM;IAaI;IACA;IACA;;;AAKN;EACE;;AAEA;EACE,OHxgBW;EGygBX;EACA;EACA;EACA;;AF/fR;EE0fM;IAQI;;;AAGF;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;;AAMR;EACE;EACA;EACA;EACA;;AF5iBF;EEwiBA;IAOI;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,eHnhBU;EGohBV,YHpkBY;EGqkBZ;EACA;;AFjkBJ;EEwjBE;IAYI;IACA;;;AF/jBN;EEkjBE;IAiBI;;;AFvjBN;EEsiBE;IAqBI;;;AAGF;EACE;;AAIJ;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AFtkBN;EEokBI;IAKI;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAMR;EACE;EACA;;AAEA;EACE,OH3nBe;EG4nBf;;AAGF;EACE,OHrnBc;;ACbtB;EEioBM;IAII;IACA;IACA;;;AF/mBV;EEymBM;IAUI;;;AAMR;EACE;;AAMI;EACE,OH9oBS;EG+oBT;EACA;;AAGF;EACE,OHnpBW;EGopBX;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;;AAKN;EACE;EACA;;AFprBJ;EEkrBE;IAKI;;;AFrqBN;EEgqBE;IASI;;;AAOE;EACE,OHxrBS;EGyrBT;EACA;;AAGF;EACE,OH7rBW;EG8rBX;EACA;;AF3sBV;EEwsBQ;IAMI;;;AAKN;EACE;EACA;;AAEA;EACE,OH7sBS;EG8sBT;EACA;EACA;;AF3tBV;EEutBQ;IAOI;IACA;;;AFztBZ;EEitBQ;IAYI;;;AFjtBZ;EEqsBQ;IAgBI;;;AAGF;EACE;;AAEA;EACE;EACA;;AAKA;EACE;;AAKN;EACE;EACA,OH1vBW;EG2vBX;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE,OH9vBS;EG+vBT;EACA;;;ACjxBZ;EACE;EACA;EACA;EACA;;AAEF;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAIE;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAeF;EACE;;AAEA;EACE;;AAOJ;EACE;EACA;EACA,kBJpDgB;EIqDhB;EACA,OJjFM;EIkFN;EACA;EACA;;AAEA;EACE,kBJ3EO;;ACKnB;EG2DQ;IAeI;;;AAOV;EACE;EACA;EACA;;AAKA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAKA;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;;;AC1JR;EACE;;AAIE;EACE;EACA;;AAEA;EACE;EACA;EACA,eL4BI;EK3BJ;EACA;;AAGF;EACE;;AAGF;EACE;;AAOF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA,eL/BI;;AKiCJ;EACE;EACA;;AAEA;EACE,YL3EmB;EK4EnB,eL3BS;EK4BT;;AAIJ;EACE;EACA;EACA;EACA;EACA,kBLlEmB;;AKoEnB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA,kBLvFe;;AK0FjB;EACE;EACA;EACA;EACA,OLlGS;EKmGT;;AAGF;EACE;EACA,kBLhGwB;;AKkGxB;EACE,OL5GK;;AKiHP;EACE,kBL5GY;;AKgHhB;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKN;EACE;EACA;EACA,OLxJe;EKyJf;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAMF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,kBL1Ma;EK2Mb,eL7JM;EK8JN;;AAEA;EACE;EACA,OLjMW;EKkMX;EACA;;AAGF;EACE;EACA,OLxMW;EKyMX;EACA;EACA;EACA;EACA;EACA,eL7KS;EK8KT;;AAEA;EACE;EACA;EACA;;AAIJ;EACE,OL9NS;EK+NT,kBL9Nc;;AKoOhB;EACE;;AAGF;EACE,OLtOS;EKuOT;EACA;;AAEA;EACE,OL1OS;EK2OT;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKN;EACE;EACA;EACA;;AAKA;EACE;;AAIJ;EACE,OLzRW;EK0RX;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA,OLpSO;;AKuST;EACE,OLtSU;EKuSV;EACA;EACA;EACA;;AAIJ;EAEE;;AAEA;EACE;EACA,OLrTS;;AKuTT;EACE,OL5SD;;AKiTL;EACE;EACA;EACA;EACA;EACA;EACA,eL9SA;;AKgTA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,eLhTE;;AKmTJ;EACE;EACA;;AAiBJ;EACE;EACA,OLvWW;EKwWX;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;;AAIJ;EACE;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;ACvbhB;EACE;EACA;;AAEA;EACE;EACA;EACA,eN2CY;EM1CZ,kBNNc;EMOd;;AAEA;EACE;EACA;;AAIE;EACE;EACA;EACA,ONXe;EMYf;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;;AAIE;EACE;EACA;EACA;EACA;EACA;EACA,ON1BM;;AMkClB;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA,ON9Cc;EM+Cd;;AAEA;EACE;;AAKN;EACE;EACA;EACA;EACA,ON5De;EM6Df,eN9BQ;EM+BR,kBN7Ee;EM8Ef;;AAEA;EACE;;AAMR;EACE;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE,eN/DM;EMgEN,kBNpGiB;EMqGjB;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eN5EI;EM6EJ;;AL9GN;EKsGI;IAWI;;;AAOE;EACE;EACA;EACA;EACA,ON3Gc;EM6Gd;EACA;EACA,wBN/FF;EMgGE,yBNhGF;EMiGE;EACA,kBN9GmB;;AMgHnB;EACE;EACA;;AL7Id;EK8HU;IAmBI;;;AL3Id;EKwHU;IAuBI;IACA;;;AAMR;EACE;EACA;EACA,4BNxHE;EMyHF,2BNzHE;;AM2HF;EACE;;AAIE;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eNvIJ;EMwII,kBN9KE;;AMsLF;EACE,2BNjJN;;AMoJI;EACE,4BNrJN;;AM0JA;EACE;EACA;EACA;EACA;EACA;;ALtMZ;EKiMU;IAQI;;;ALjLd;EKyKU;IAYI;;;AAGF;EACE;;AAGF;EACE,ONpMK;EMqML;EACA;;AAGF;EACE;EACA;EACA;EACA;;AL9Nd;EK0NY;IAOI;;;AL3NhB;EKoNY;IAWI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA,ON9NO;;AMgOP;EACE,ON3NO;EM4NP;EACA;;AAIJ;EACE;;;AC3PhB;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA,ePyCY;EOxCZ,kBPRc;EOSd;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE,OPLa;EOMb;EACA;;AAGF;EACE,OPVe;EOWf;EACA;EACA;;AAGF;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAOV;EACE;EACA,OP7CiB;;AOgDnB;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;ANjEN;EM8DI;IAMI;;;AAGF;EACE;EACA;EACA;EACA;EACA,kBPvFQ;EOwFR,ePxCM;EOyCN;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA,OPvFS;;AO0FX;EACE;EACA;EACA,OP5FW;;AOkGnB;EACE;EACA;;AN1GJ;EMwGE;IAKI;;;AAGF;EACE;EACA,eP7EQ;EO8ER,kBP9HU;EO+HV;;AAGF;EACE;EACA;EACA,OP9GiB;EO+GjB;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA,eP5FW;EO6FX;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBPvJW;EOwJX,ePpHA;EOqHA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;;ACtKd;EACE;;AAIE;EACE;EACA;;AAEA;EACE;EACA;EACA,eR4BI;EQ3BJ;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;;AAOF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAMF;EACE;;AAIJ;EAEE;EACA;EACA;;AAKA;EACE;EACA,eRhCE;EQiCF,kBRvEQ;;AQ0EV;EACE;EACA;EACA;EACA,OR9DW;EQ+DX;;AAEA;EACE;EACA;EACA;;AAEA;EACE,OR3EO;;AQ8ET;EACE;;AASN;EACE;EACA,eRhEE;EQiEF;EACA;EACA,kBRzGQ;;AQ4GV;EACE;EACA;EACA;EACA,ORhGW;EQiGX;;AAEA;EACE;EACA;;AAGA;EACE;;AAGF;EACE;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA,OR9HS;;AQgIT;EACE;EACA;EACA,ORnIO;EQoIP;EACA;EACA,kBR/Hc;EQgId,eRlHJ;;AQuHF;EACE;EACA;EACA;EACA;EACA;EACA,kBRjKW;EQkKX,eRpHI;EQqHJ;;AAEA;EACE,ORjKW;EQkKX;EACA;EACA,kBRlKgB;EQmKhB;EACA,wBRvIF;EQwIE,yBRxIF;;AQ0IE;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAMN;EACE;EACA;;AAEA;EACE;EACA,ORnLO;EQoLP;;AAKA;EACE;;AAGF;EACE,OR9LK;EQ+LL;EACA;;AAGF;EACE,ORpMK;EQqML;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;;AAEA;EACE;EACA,ORpNM;EQqNN;;AAQJ;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE,ORrPG;EQsPH;EACA;EACA,eRlNG;EQmNH,kBRxPQ;;AQ2PV;EACE;EACA;EACA","file":"limit-login-attempts.css"}PKwL\b2<<Elimit-login-attempts-reloaded/assets/css/limit-login-attempts.min.cssnu[@charset "UTF-8";@import "../css/fonts/stylesheet.css";#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip,.llar_hint_tooltip,.toplevel_page_limit-login-attempts .hint_tooltip{display:none;position:absolute;background-color:#4acad8;color:#fff;padding:12px 20px;width:180px;border-radius:20px;top:26px;right:-20px;z-index:955}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip-content,.llar_hint_tooltip-content,.toplevel_page_limit-login-attempts .hint_tooltip-content{font-size:12px;white-space:initial;text-align:left;margin-top:0;margin-bottom:0}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip::before,.llar_hint_tooltip::before,.toplevel_page_limit-login-attempts .hint_tooltip::before{content:"";position:absolute;top:-12px;right:12%;border-width:6px;border-style:solid;border-color:transparent transparent #4acad8}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip-parent,.llar_hint_tooltip-parent,.toplevel_page_limit-login-attempts .hint_tooltip-parent{position:relative}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip-parent:hover .hint_tooltip,.llar_hint_tooltip-parent:hover .hint_tooltip,.toplevel_page_limit-login-attempts .hint_tooltip-parent:hover .hint_tooltip{display:block}.toplevel_page_limit-login-attempts *{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.toplevel_page_limit-login-attempts .p-0{padding:0!important}.toplevel_page_limit-login-attempts .pt-0_5{padding-top:8px!important}.toplevel_page_limit-login-attempts .pt-1_5{padding-top:24px!important}.toplevel_page_limit-login-attempts .mt-0_5{margin-top:8px!important}.toplevel_page_limit-login-attempts .mt-1_5{margin-top:24px!important}.toplevel_page_limit-login-attempts .mx-0_5{margin-left:8px!important;margin-right:8px!important}.toplevel_page_limit-login-attempts .button_micro_cloud{cursor:pointer}.link__style_color_inherit,.link__style_unlink,.llar-label{text-decoration:none;color:inherit;position:relative}.link__style_color_inherit{border-bottom:1px solid currentColor}.link__style_color_inherit:hover,.link__style_unlink:hover,.llar-label:hover{color:inherit}.no_href_link{cursor:default}.llar_typography-secondary{color:#666d84}.llar_orange{color:#ff7c06}.llar_orange:hover{color:#f07200}#llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-logs .description-page .description-secondary a.unlink,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-logs__active .description-page .description-secondary a.unlink,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink,.llar_turquoise{color:#4acad8}#llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-logs .description-page .description-secondary a.unlink,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-logs__active .description-page .description-secondary a.unlink,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink,a.llar_turquoise{text-decoration:none}a.llar_turquoise:hover{border-bottom:1px solid currentColor}#llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-logs .description-page .description-secondary a.unlink:hover,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-logs__active .description-page .description-secondary a.unlink:hover,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink:hover,a.llar_turquoise:hover{text-decoration:none;color:#4acad8}.llar-label{border-radius:8px;background-color:rgba(74,202,216,.0980392157);padding:.125rem 1.125rem}.llar_bold{font-weight:700}.llar-display-none{display:none!important}.llar-display-block{display:block!important}.llar-visibility{visibility:visible!important}.llar-hidden{visibility:hidden!important}.mx-auto{margin-left:auto;margin-right:auto}.llar-disabled{cursor:default!important;pointer-events:none}.dashicons-secondary{margin-left:8px;font-size:170%;width:15px;height:15px}#llar-dashboard-page .section-title__new .llar-label .dashicons{margin-left:8px}#llar-dashboard-page .section-title__new .llar-label .dashicons,#llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons,.dashicons-secondary{line-height:inherit;position:relative;z-index:1;color:#e8e9ec;border-radius:20px;vertical-align:middle;background:#666d84}@media screen and (max-width:767.5px){#llar-dashboard-page .section-title__new .llar-label .dashicons,#llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons,.dashicons-secondary{font-size:1.4rem}}#llar-dashboard-page .section-title__new .llar-label .dashicons:before,#llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons:before,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons:before,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons:before,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons:before,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons:before,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons:before,.dashicons-secondary:before{position:absolute;top:50%;left:50%;font-size:inherit;font-weight:inherit;line-height:inherit;transform:translate(-50%,-50%)}.llar_input_border{border-radius:16px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border{font-family:inherit;line-height:inherit;color:#4acad8;border-radius:16px;border:1px solid #4acad8;width:fit-content}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border{font-family:inherit;font-size:16px;line-height:inherit;padding:6px 8px 6px 16px;color:#4acad8;border-radius:16px;border:1px solid #4acad8;width:fit-content}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border{font-family:inherit;font-size:16px;line-height:inherit;padding:6px 8px 6px 16px;border-radius:16px;width:fit-content}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border,.llar_input_border{font-family:inherit;font-size:16px;line-height:inherit;padding:6px 8px 6px 16px;color:#4acad8;border:1px solid #4acad8;width:fit-content}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border,.llar_input_border,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border{padding:6px 8px 6px 12px;font-size:14px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border:focus,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border:focus,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border:focus,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border:focus,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border:focus,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border:focus,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border:focus,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border:focus,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border:focus,.llar_input_border:focus,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border:focus,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border:focus,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border:focus{box-shadow:unset;outline:0}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border::placeholder,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border::placeholder,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border::placeholder,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border::placeholder,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border::placeholder,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border::placeholder,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border::placeholder,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select.input_border::placeholder,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border::placeholder,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border::placeholder,.llar_input_border::placeholder,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border::placeholder,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border::placeholder,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border::placeholder{color:inherit;opacity:.5}#llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox],#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox],#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox],#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox],#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox],#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox],#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox],.llar_input_checkbox,.toplevel_page_limit-login-attempts input[type=checkbox]{background-color:#fdfdfd;border:1.5px solid #abbfc1;box-sizing:content-box;margin:-.25rem .25rem 0 0}#llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox]:checked,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked,.llar_input_checkbox:checked,.toplevel_page_limit-login-attempts input[type=checkbox]:checked{background-color:#ff7c06;border:1.5px solid #ff7c06}#llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox]:checked::before,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:checked::before,.llar_input_checkbox:checked::before,.toplevel_page_limit-login-attempts input[type=checkbox]:checked::before{content:"✔";font-size:14px;line-height:1.1;width:100%;height:100%;margin:0;color:#fdfdfd}#llar-setting-page .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country input[type=checkbox]:focus,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td input[type=checkbox]:focus,.llar_input_checkbox:focus,.toplevel_page_limit-login-attempts input[type=checkbox]:focus{box-shadow:unset}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label ul.hint_tooltip-content,#llar-dashboard-page ul,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content ul.field-list,.toplevel_page_limit-login-attempts ul.hint_tooltip-content,ul.llar_hint_tooltip-content,ul.llar_list{list-style:none}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label ul.hint_tooltip-content li,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content ul.field-list li,.toplevel_page_limit-login-attempts ul.hint_tooltip-content li,ul.llar_hint_tooltip-content li,ul.llar_list li{position:relative;list-style:none;font-size:12px;white-space:initial}#llar-dashboard-page ul li{position:relative;list-style:none;white-space:initial}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label ul.hint_tooltip-content li::before,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content ul.field-list li::before,.toplevel_page_limit-login-attempts ul.hint_tooltip-content li::before,ul.llar_hint_tooltip-content li::before,ul.llar_list li::before{position:absolute;box-sizing:inherit;content:"✧";color:#fdfdfd;margin-left:-18px;top:50%;transform:translateY(-50%)}#llar-dashboard-page ul li::before{position:absolute;box-sizing:inherit;content:"✧";top:50%;transform:translateY(-50%)}#llar-setting-page .button,#llar-setting-page button.button,#llar-setting-page-debug .button,#llar-setting-page-help .button,#llar-setting-page-logs .button,#llar-setting-page-logs__active .button,#llar-setting-page-premium .button,.llar_button,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button,button.llar_button{font-family:inherit;background:#fdfdfd;border:1px solid #2a2f40;cursor:pointer;white-space:nowrap;vertical-align:baseline}#llar-setting-page .menu__item.button,#llar-setting-page button.menu__item.button,#llar-setting-page-debug .menu__item.button,#llar-setting-page-help .menu__item.button,#llar-setting-page-logs .menu__item.button,#llar-setting-page-logs__active .menu__item.button,#llar-setting-page-premium .menu__item.button,.llar_button.menu__item,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button,button.llar_button.menu__item{border-radius:10px;font-size:16px;line-height:1.45;padding:6px 18px;text-align:center}@media screen and (max-width:1599.5px){#llar-setting-page .menu__item.button,#llar-setting-page button.menu__item.button,#llar-setting-page-debug .menu__item.button,#llar-setting-page-help .menu__item.button,#llar-setting-page-logs .menu__item.button,#llar-setting-page-logs__active .menu__item.button,#llar-setting-page-premium .menu__item.button,.llar_button.menu__item,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button,button.llar_button.menu__item{font-size:14px}}@media screen and (max-width:991.5px){#llar-setting-page .menu__item.button,#llar-setting-page button.menu__item.button,#llar-setting-page-debug .menu__item.button,#llar-setting-page-help .menu__item.button,#llar-setting-page-logs .menu__item.button,#llar-setting-page-logs__active .menu__item.button,#llar-setting-page-premium .menu__item.button,.llar_button.menu__item,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button,button.llar_button.menu__item{padding:5px 16px}}@media screen and (max-width:428px){#llar-setting-page .menu__item.button,#llar-setting-page button.menu__item.button,#llar-setting-page-debug .menu__item.button,#llar-setting-page-help .menu__item.button,#llar-setting-page-logs .menu__item.button,#llar-setting-page-logs__active .menu__item.button,#llar-setting-page-premium .menu__item.button,.llar_button.menu__item,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .menu__item.button,button.llar_button.menu__item{padding:5px 14px}}#llar-setting-page button.button:focus,button.llar_button:focus{outline:0!important;box-shadow:unset!important}#llar-setting-page .button,#llar-setting-page-debug .button,#llar-setting-page-help .button,#llar-setting-page-logs .button,#llar-setting-page-logs__active .button,#llar-setting-page-premium .button,.llar_button,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button{position:relative;min-width:175px;text-transform:inherit;text-decoration:none}#llar-setting-page .button__orange.button,#llar-setting-page-debug .button__orange.button,#llar-setting-page-help .button__orange.button,#llar-setting-page-logs .button__orange.button,#llar-setting-page-logs__active .button__orange.button,#llar-setting-page-premium .button__orange.button,.llar_button.button__orange,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__orange.button{color:#fff!important;background:#ff7c06!important;border:1px solid #ff7c06!important;box-shadow:0 6px 12px 0 rgba(255,124,6,.4980392157)!important}#llar-setting-page .button__orange.button:hover,#llar-setting-page-debug .button__orange.button:hover,#llar-setting-page-help .button__orange.button:hover,#llar-setting-page-logs .button__orange.button:hover,#llar-setting-page-logs__active .button__orange.button:hover,#llar-setting-page-premium .button__orange.button:hover,.llar_button.button__orange:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__orange.button:hover{background:#f07200!important}#llar-setting-page .button__orange.button:disabled,#llar-setting-page-debug .button__orange.button:disabled,#llar-setting-page-help .button__orange.button:disabled,#llar-setting-page-logs .button__orange.button:disabled,#llar-setting-page-logs__active .button__orange.button:disabled,#llar-setting-page-premium .button__orange.button:disabled,.llar_button.button__orange:disabled,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__orange.button:disabled{border:1px solid rgba(255,124,6,.4980392157)!important;background:rgba(255,124,6,.4980392157)!important;cursor:auto}#llar-setting-page .button__transparent_orange.button,#llar-setting-page-debug .button__transparent_orange.button,#llar-setting-page-help .button__transparent_orange.button,#llar-setting-page-logs .button__transparent_orange.button,#llar-setting-page-logs__active .button__transparent_orange.button,#llar-setting-page-premium .button__transparent_orange.button,.llar_button.button__transparent_orange,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.button{color:#ff7c06!important;border:1px solid currentColor!important;background:0 0!important}#llar-setting-page .button__transparent_grey.button,#llar-setting-page-debug .button__transparent_grey.button,#llar-setting-page-help .button__transparent_grey.button,#llar-setting-page-logs .button__transparent_grey.button,#llar-setting-page-logs__active .button__transparent_grey.button,#llar-setting-page-premium .button__transparent_grey.button,.llar_button.button__transparent_grey,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button{border:1px solid currentColor!important;background:0 0!important}#llar-setting-page .button__transparent_grey.orange-back.button,#llar-setting-page .button__transparent_orange.orange-back.button,#llar-setting-page-debug .button__transparent_grey.orange-back.button,#llar-setting-page-debug .button__transparent_orange.orange-back.button,#llar-setting-page-help .button__transparent_grey.orange-back.button,#llar-setting-page-help .button__transparent_orange.orange-back.button,#llar-setting-page-logs .button__transparent_grey.orange-back.button,#llar-setting-page-logs .button__transparent_orange.orange-back.button,#llar-setting-page-logs__active .button__transparent_grey.orange-back.button,#llar-setting-page-logs__active .button__transparent_orange.orange-back.button,#llar-setting-page-premium .button__transparent_grey.orange-back.button,#llar-setting-page-premium .button__transparent_orange.orange-back.button,.llar_button.button__transparent_grey.orange-back,.llar_button.button__transparent_orange.orange-back,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.orange-back.button,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.orange-back.button{background:rgba(255,124,6,.0980392157)!important}#llar-setting-page .button__transparent_grey.button:hover,#llar-setting-page .button__transparent_orange.button:hover,#llar-setting-page-debug .button__transparent_grey.button:hover,#llar-setting-page-debug .button__transparent_orange.button:hover,#llar-setting-page-help .button__transparent_grey.button:hover,#llar-setting-page-help .button__transparent_orange.button:hover,#llar-setting-page-logs .button__transparent_grey.button:hover,#llar-setting-page-logs .button__transparent_orange.button:hover,#llar-setting-page-logs__active .button__transparent_grey.button:hover,#llar-setting-page-logs__active .button__transparent_orange.button:hover,#llar-setting-page-premium .button__transparent_grey.button:hover,#llar-setting-page-premium .button__transparent_orange.button:hover,.llar_button.button__transparent_grey:hover,.llar_button.button__transparent_orange:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.button:hover{background:rgba(255,124,6,.0980392157)!important;border:1px solid currentColor!important}#llar-setting-page .button__transparent_grey.button:disabled,#llar-setting-page .button__transparent_orange.button:disabled,#llar-setting-page-debug .button__transparent_grey.button:disabled,#llar-setting-page-debug .button__transparent_orange.button:disabled,#llar-setting-page-help .button__transparent_grey.button:disabled,#llar-setting-page-help .button__transparent_orange.button:disabled,#llar-setting-page-logs .button__transparent_grey.button:disabled,#llar-setting-page-logs .button__transparent_orange.button:disabled,#llar-setting-page-logs__active .button__transparent_grey.button:disabled,#llar-setting-page-logs__active .button__transparent_orange.button:disabled,#llar-setting-page-premium .button__transparent_grey.button:disabled,#llar-setting-page-premium .button__transparent_orange.button:disabled,.llar_button.button__transparent_grey:disabled,.llar_button.button__transparent_orange:disabled,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button:disabled,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_orange.button:disabled{background:0 0;cursor:auto}#llar-setting-page .button__transparent_grey.button,#llar-setting-page-debug .button__transparent_grey.button,#llar-setting-page-help .button__transparent_grey.button,#llar-setting-page-logs .button__transparent_grey.button,#llar-setting-page-logs__active .button__transparent_grey.button,#llar-setting-page-premium .button__transparent_grey.button,.llar_button.button__transparent_grey,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button{color:#a4a8b7!important}#llar-setting-page .button__transparent_grey.button:hover,#llar-setting-page .button__transparent_grey.gray-back.button,#llar-setting-page-debug .button__transparent_grey.button:hover,#llar-setting-page-debug .button__transparent_grey.gray-back.button,#llar-setting-page-help .button__transparent_grey.button:hover,#llar-setting-page-help .button__transparent_grey.gray-back.button,#llar-setting-page-logs .button__transparent_grey.button:hover,#llar-setting-page-logs .button__transparent_grey.gray-back.button,#llar-setting-page-logs__active .button__transparent_grey.button:hover,#llar-setting-page-logs__active .button__transparent_grey.gray-back.button,#llar-setting-page-premium .button__transparent_grey.button:hover,#llar-setting-page-premium .button__transparent_grey.gray-back.button,.llar_button.button__transparent_grey.gray-back,.llar_button.button__transparent_grey:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.button:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button__transparent_grey.gray-back.button{background:rgba(164,168,183,.2980392157)!important}.llar_button.button:focus{outline:0!important;box-shadow:unset!important}#llar-setting-page .tags.button,#llar-setting-page-debug .tags.button,#llar-setting-page-help .tags.button,#llar-setting-page-logs .tags.button,#llar-setting-page-logs__active .tags.button,#llar-setting-page-premium .tags.button,.llar_button.tags,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags.button{font-size:16px;font-weight:400;line-height:1.7;border-radius:8px;border:1px solid #ff7c06;width:fit-content;padding:0 20px;z-index:50}#llar-setting-page .tags_basic.button,#llar-setting-page-debug .tags_basic.button,#llar-setting-page-help .tags_basic.button,#llar-setting-page-logs .tags_basic.button,#llar-setting-page-logs__active .tags_basic.button,#llar-setting-page-premium .tags_basic.button,.llar_button.tags_basic,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic.button{color:#ff7c06;background:rgba(255,124,6,.0980392157)}#llar-setting-page .tags_basic.active.button,#llar-setting-page .tags_basic.button:hover,#llar-setting-page-debug .tags_basic.active.button,#llar-setting-page-debug .tags_basic.button:hover,#llar-setting-page-help .tags_basic.active.button,#llar-setting-page-help .tags_basic.button:hover,#llar-setting-page-logs .tags_basic.active.button,#llar-setting-page-logs .tags_basic.button:hover,#llar-setting-page-logs__active .tags_basic.active.button,#llar-setting-page-logs__active .tags_basic.button:hover,#llar-setting-page-premium .tags_basic.active.button,#llar-setting-page-premium .tags_basic.button:hover,.llar_button.tags_basic.active,.llar_button.tags_basic:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic.active.button,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic.button:hover{color:#fdfdfd;background:#ff7c06}#llar-setting-page .tags_basic_add.button,#llar-setting-page-debug .tags_basic_add.button,#llar-setting-page-help .tags_basic_add.button,#llar-setting-page-logs .tags_basic_add.button,#llar-setting-page-logs__active .tags_basic_add.button,#llar-setting-page-premium .tags_basic_add.button,.llar_button.tags_basic_add,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic_add.button{color:#4acad8;min-width:fit-content;border:1px solid currentColor;background:rgba(74,202,216,.0980392157)}#llar-setting-page .tags_add.button a,#llar-setting-page .tags_basic_add.button a,#llar-setting-page-debug .tags_add.button a,#llar-setting-page-debug .tags_basic_add.button a,#llar-setting-page-help .tags_add.button a,#llar-setting-page-help .tags_basic_add.button a,#llar-setting-page-logs .tags_add.button a,#llar-setting-page-logs .tags_basic_add.button a,#llar-setting-page-logs__active .tags_add.button a,#llar-setting-page-logs__active .tags_basic_add.button a,#llar-setting-page-premium .tags_add.button a,#llar-setting-page-premium .tags_basic_add.button a,.llar_button.tags_add a,.llar_button.tags_basic_add a,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_add.button a,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic_add.button a{vertical-align:middle}#llar-setting-page .tags_add.button:hover,#llar-setting-page .tags_basic_add.button:hover,#llar-setting-page-debug .tags_add.button:hover,#llar-setting-page-debug .tags_basic_add.button:hover,#llar-setting-page-help .tags_add.button:hover,#llar-setting-page-help .tags_basic_add.button:hover,#llar-setting-page-logs .tags_add.button:hover,#llar-setting-page-logs .tags_basic_add.button:hover,#llar-setting-page-logs__active .tags_add.button:hover,#llar-setting-page-logs__active .tags_basic_add.button:hover,#llar-setting-page-premium .tags_add.button:hover,#llar-setting-page-premium .tags_basic_add.button:hover,.llar_button.tags_add:hover,.llar_button.tags_basic_add:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_add.button:hover,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_basic_add.button:hover{background:rgba(255,124,6,.0980392157)}#llar-setting-page .tags_add.button,#llar-setting-page-debug .tags_add.button,#llar-setting-page-help .tags_add.button,#llar-setting-page-logs .tags_add.button,#llar-setting-page-logs__active .tags_add.button,#llar-setting-page-premium .tags_add.button,.llar_button.tags_add,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .tags_add.button{color:#a4a8b7;border:1px solid #a4a8b7;background:rgba(164,168,183,.0784313725)}#llar-setting-page .button:focus,#llar-setting-page-debug .button:focus,#llar-setting-page-help .button:focus,#llar-setting-page-logs .button:focus,#llar-setting-page-logs__active .button:focus,#llar-setting-page-premium .button:focus,.llar_button:focus,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button:focus{outline:0!important;box-shadow:unset!important}.llar-form-table{width:100%}.toplevel_page_limit-login-attempts #wpwrap{background-color:#f6fbff}.toplevel_page_limit-login-attempts #wpcontent{background-color:#f6fbff;font-family:CoFo Sans,arial;font-style:normal;font-weight:400;color:#2a2f40}.limit-login-page-settings{margin:8px 50px}@media screen and (max-width:1799.5px){.limit-login-page-settings{margin:8px 16px 8px 0}}.limit-login-page-settings__logo_block{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:baseline;font-size:18px;margin-right:20px}.limit-login-page-settings__logo_block .info-box-icon{display:inline-block;margin-left:5px}.limit-login-page-settings__logo_block .info-box-icon img{width:15px;vertical-align:middle}.limit-login-page-settings__logo{margin-top:21px;margin-left:4px;max-width:172px}.limit-login-page-settings .nav-tab-wrapper{position:relative;border-bottom:unset;margin-top:20px}.limit-login-page-settings .nav-tab-wrapper .nav-tab{border:unset;background-color:unset;font-size:16px;color:#2a2f40;font-weight:400;margin-left:0;margin-right:35px;padding:4px 5px 6px}.limit-login-page-settings .nav-tab-wrapper .nav-tab .llar-alert-icon{display:inline-block;vertical-align:middle;box-sizing:border-box;margin:-2px 0 0;padding:0 1px 4px 2px;min-width:18px;height:18px;border-radius:9px;background-color:#d63638;color:#fff;font-size:14px;line-height:1.4;text-align:center}.limit-login-page-settings .nav-tab-wrapper .nav-tab-active{border-bottom:4px solid #4acad8}@media screen and (max-width:991.5px){.limit-login-page-settings .nav-tab-wrapper .nav-tab{margin-right:20px}}@media screen and (max-width:767.5px){.limit-login-page-settings .nav-tab-wrapper .nav-tab{font-size:14px;margin-right:.87em}}@media screen and (max-width:575.5px){.limit-login-page-settings .nav-tab-wrapper .nav-tab{font-size:12px;margin-right:.5em}}.limit-login-page-settings .nav-tab-wrapper .llar-failover-link{color:#4acad8;font-size:14px;float:right;padding:7px 15px}.limit-login-page-settings .nav-tab-wrapper .llar-failover-link .llar-tooltip:before{right:0;left:auto}.limit-login-page-settings .field-col{display:inline-block;margin-right:20px}.limit-login-page-settings .limit-login-log table{background-color:#fff}.limit-login-page-settings .limit-login-log table td,.limit-login-page-settings .limit-login-log table th{padding:10px}.limit-login-page-settings .limit-login-log table tr:nth-child(even){background-color:rgba(0,0,0,.09)}.limit-login-page-settings #limit-login-app-setup-code{width:85%}.limit-login-page-settings .llar-app-notice{background-color:#fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);padding:15px;border-radius:3px;margin-top:20px;margin-bottom:20px;font-size:14px;border-left:5px solid #ffba00}.limit-login-page-settings .llar-app-notice.success{border-color:#46b450}.limit-login-page-settings .llar-app-notice p{font-size:inherit;margin:0 0 20px}.limit-login-page-settings .llar-app-notice p:last-child{margin-bottom:0}.limit-login-page-settings input[name=admin_notify_email]{min-width:243px}.limit-login-page-settings input[name=lla_trusted_ip_origins]{min-width:400px}.limit-login-page-settings .llar-test-email-notification-btn{text-decoration:none;margin-left:16px;font-weight:400}.limit-login-page-settings .llar-test-email-notification-loader .llar-app-ajax-spinner{float:none;margin:-2px 5px 0;display:none}.limit-login-page-settings .llar-test-email-notification-loader.loading .llar-app-ajax-spinner{display:inline-block;visibility:visible}.limit-login-page-settings .llar-test-email-notification-loader .msg{margin-left:5px}.limit-login-page-settings .llar-test-email-notification-loader .msg.success{color:#71c21b}.limit-login-page-settings .llar-protect-notice{font-size:15px;color:#848484;margin-left:10px}.limit-login-page-settings .llar-protect-notice a{color:#222;text-decoration:none;border-bottom:1px dashed}.limit-login-page-settings .llar-toggle-setup-field{color:#2271b1;text-decoration-style:dashed}.limit-login-page-settings .llar-toggle-setup-field:hover{color:#222}.limit-login-page-settings .app-form-field,.limit-login-page-settings .llar-app-field,.limit-login-page-settings .setup-code-wrap{display:none}.limit-login-page-settings .setup-code-wrap.active{display:block}.limit-login-page-settings .app-form-field.active,.limit-login-page-settings .llar-app-field.active{display:table-row}#llar-setting-page,#llar-setting-page-debug,#llar-setting-page-logs,#llar-setting-page-logs__active{color:#2a2f40;margin-top:40px;line-height:1.5}#llar-setting-page-help,#llar-setting-page-premium{color:#2a2f40;margin-top:40px}#llar-setting-page-help{line-height:1.5}#llar-setting-page .title_page,#llar-setting-page-debug .title_page,#llar-setting-page-help .title_page,#llar-setting-page-logs .title_page,#llar-setting-page-logs__active .title_page,#llar-setting-page-premium .title_page{margin-top:40px;margin-bottom:15px;color:inherit;font-size:20px;font-weight:500}@media screen and (max-width:1599.5px){#llar-setting-page .title_page,#llar-setting-page-debug .title_page,#llar-setting-page-help .title_page,#llar-setting-page-logs .title_page,#llar-setting-page-logs__active .title_page,#llar-setting-page-premium .title_page{font-size:18px}}#llar-setting-page .title_page img,#llar-setting-page-debug .title_page img,#llar-setting-page-help .title_page img,#llar-setting-page-logs .title_page img,#llar-setting-page-logs__active .title_page img,#llar-setting-page-premium .title_page img{width:36px;height:36px;vertical-align:middle;margin-right:8px}#llar-setting-page .description-page,#llar-setting-page-debug .description-page,#llar-setting-page-help .description-page,#llar-setting-page-logs .description-page,#llar-setting-page-logs__active .description-page,#llar-setting-page-premium .description-page{position:relative;font-size:18px;color:#666d84;padding:30px 44px;border-radius:20px;background:rgba(232,253,255,.02);box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}@media screen and (max-width:1599.5px){#llar-setting-page .description-page,#llar-setting-page-debug .description-page,#llar-setting-page-help .description-page,#llar-setting-page-logs .description-page,#llar-setting-page-logs__active .description-page,#llar-setting-page-premium .description-page{font-size:16px}}#llar-setting-page .llar-settings-wrap,#llar-setting-page-debug .llar-settings-wrap,#llar-setting-page-help .llar-settings-wrap,#llar-setting-page-logs .llar-settings-wrap,#llar-setting-page-logs__active .llar-settings-wrap,#llar-setting-page-premium .llar-settings-wrap{margin-top:20px}#llar-setting-page .llar-settings-wrap .llar-form-table,#llar-setting-page-debug .llar-settings-wrap .llar-form-table,#llar-setting-page-help .llar-settings-wrap .llar-form-table,#llar-setting-page-logs .llar-settings-wrap .llar-form-table,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table,#llar-setting-page-premium .llar-settings-wrap .llar-form-table{color:#2a2f40;font-size:18px;border-collapse:separate;border-spacing:0 18px;border-color:unset;margin-top:-18px;margin-bottom:-18px}#llar-setting-page .llar-settings-wrap .llar-form-table tr,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr{position:relative;font-size:18px;border-radius:20px;color:#666d84;background:#fdfdfd;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr{font-size:16px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th{font-size:inherit;line-height:inherit;border-radius:20px;background-color:unset;padding:29px 5px 32px 44px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td{border-radius:20px;background-color:unset;padding:29px 5px 32px 44px}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td,#llar-setting-page .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th{padding:12px 5px 12px 25px}}@media screen and (max-width:1399.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td,#llar-setting-page .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th{padding-left:15px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th{color:#2a2f40;font-weight:400;border-top-right-radius:unset;border-bottom-right-radius:unset;width:300px}@media screen and (max-width:1399.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th{width:260px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons{font-size:140%;width:12px;height:12px;margin-left:2px}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .dashicons,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .dashicons{font-size:20px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr th .hint_tooltip,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .hint_tooltip,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .hint_tooltip,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .hint_tooltip,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .hint_tooltip,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .hint_tooltip{right:-140px;top:30px;width:200px}#llar-setting-page .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr th .hint_tooltip:before{right:142px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td{color:#666d84;font-size:16px;line-height:1.5;border-top-left-radius:unset;border-bottom-left-radius:unset}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td{font-size:14px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area{min-width:720px}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border.full_area,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border.full_area{min-width:70%}}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea{font-family:inherit;font-size:16px;color:#666d84;background-color:#fdfdfd;padding-right:24px;border:unset;scrollbar-width:thin}#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea{font-family:inherit;font-size:16px;background-color:#fdfdfd;padding-right:24px;border:unset;scrollbar-width:thin}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea{font-family:inherit;font-size:16px;color:#666d84;background-color:#fdfdfd;padding-right:24px;border:unset;scrollbar-width:thin}#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea{font-family:inherit;font-size:16px;background-color:#fdfdfd;padding-right:24px;border:unset;scrollbar-width:thin}#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea{font-family:inherit;font-size:16px;color:#666d84;background-color:#fdfdfd;padding-right:24px;border:unset;scrollbar-width:thin}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea{padding-right:18px;font-size:14px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar{width:8px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-track,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-track{background-color:#a4a8b7;border-radius:8px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea::-webkit-scrollbar-thumb,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea::-webkit-scrollbar-thumb{background-color:#666d84;border-radius:8px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea:focus,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border textarea:hover,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:focus,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .textarea_border textarea:hover{border:unset;box-shadow:unset;outline:unset}#llar-setting-page .llar-settings-wrap .llar-form-table tr td select,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td select,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td select,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td select,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td select,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td select{font-family:inherit;background:#fdfdfd url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234ACAD8FF'%3e%3cpath d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") no-repeat right 5px top 55%;background-size:16px 16px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td select.input_border{padding:6px 64px 6px 16px}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td select.input_border,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td select.input_border{padding-right:35px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border{border-radius:8px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border:focus,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .input_border:hover,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border:focus,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border:hover,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border:focus,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .input_border:hover,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border:focus,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .input_border:hover,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border:focus,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .input_border:hover,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border:focus,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .input_border:hover{box-shadow:unset;outline:unset}#llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink{font-weight:500}#llar-setting-page .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-logs .description-page .description-secondary a.unlink:hover,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-logs__active .description-page .description-secondary a.unlink:hover,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td a.unlink:hover,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td a.unlink:hover{border-bottom:unset}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-additional{font-size:16px;line-height:inherit;color:#a4a8b7;padding:16px 8px 8px 24px;max-width:740px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-secondary{font-size:16px;line-height:inherit;padding:16px 8px 8px 24px;max-width:740px}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice{line-height:inherit;padding:16px 8px 8px 24px;max-width:740px}@media screen and (max-width:1599.5px){#llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-additional,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice{font-size:14px}}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .description-secondary{color:#666d84}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice{font-size:inherit;color:inherit}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a{text-decoration:none;border-bottom:unset}#llar-setting-page .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-protect-notice a:hover{border-bottom:1px solid currentColor}#llar-setting-page .add_block__under_table{margin:8px 0}#llar-setting-page .add_block__under_table,#llar-setting-page-logs .add_block__under_table,#llar-setting-page-logs__active .add_block__under_table{padding:24px 48px;background-color:#f6fbff;border-radius:20px}#llar-setting-page-debug .add_block__under_table,#llar-setting-page-help .add_block__under_table,#llar-setting-page-premium .add_block__under_table{margin:8px 0;padding:24px 48px;background-color:#f6fbff;border-radius:20px}@media screen and (max-width:1199.5px){#llar-setting-page .add_block__under_table,#llar-setting-page-debug .add_block__under_table,#llar-setting-page-help .add_block__under_table,#llar-setting-page-logs .add_block__under_table,#llar-setting-page-logs__active .add_block__under_table,#llar-setting-page-premium .add_block__under_table{padding:16px}}#llar-setting-page .add_block__under_table .description,#llar-setting-page-debug .add_block__under_table .description,#llar-setting-page-help .add_block__under_table .description,#llar-setting-page-logs .add_block__under_table .description,#llar-setting-page-logs__active .add_block__under_table .description,#llar-setting-page-premium .add_block__under_table .description{color:#2a2f40;font-size:18px;line-height:1.5;font-weight:500}@media screen and (max-width:1599.5px){#llar-setting-page .add_block__under_table .description,#llar-setting-page-debug .add_block__under_table .description,#llar-setting-page-help .add_block__under_table .description,#llar-setting-page-logs .add_block__under_table .description,#llar-setting-page-logs__active .add_block__under_table .description,#llar-setting-page-premium .add_block__under_table .description{font-size:16px}}#llar-setting-page .add_block__under_table .add_block__list,#llar-setting-page-debug .add_block__under_table .add_block__list,#llar-setting-page-help .add_block__under_table .add_block__list,#llar-setting-page-logs .add_block__under_table .add_block__list,#llar-setting-page-logs__active .add_block__under_table .add_block__list,#llar-setting-page-premium .add_block__under_table .add_block__list{display:flex;margin-top:16px;margin-bottom:8px;color:#666d84;font-size:16px;flex-wrap:nowrap;justify-content:space-between}@media screen and (max-width:1599.5px){#llar-setting-page .add_block__under_table .add_block__list,#llar-setting-page-debug .add_block__under_table .add_block__list,#llar-setting-page-help .add_block__under_table .add_block__list,#llar-setting-page-logs .add_block__under_table .add_block__list,#llar-setting-page-logs__active .add_block__under_table .add_block__list,#llar-setting-page-premium .add_block__under_table .add_block__list{flex-wrap:wrap}}#llar-setting-page .add_block__under_table .add_block__list .item,#llar-setting-page-debug .add_block__under_table .add_block__list .item,#llar-setting-page-help .add_block__under_table .add_block__list .item,#llar-setting-page-logs .add_block__under_table .add_block__list .item,#llar-setting-page-logs__active .add_block__under_table .add_block__list .item,#llar-setting-page-premium .add_block__under_table .add_block__list .item{flex:0 0 16%;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:flex-start}@media screen and (max-width:1599.5px){#llar-setting-page .add_block__under_table .add_block__list .item,#llar-setting-page-debug .add_block__under_table .add_block__list .item,#llar-setting-page-help .add_block__under_table .add_block__list .item,#llar-setting-page-logs .add_block__under_table .add_block__list .item,#llar-setting-page-logs__active .add_block__under_table .add_block__list .item,#llar-setting-page-premium .add_block__under_table .add_block__list .item{flex:0 0 32%}}#llar-setting-page .add_block__under_table .add_block__list .item .icon,#llar-setting-page-debug .add_block__under_table .add_block__list .item .icon,#llar-setting-page-help .add_block__under_table .add_block__list .item .icon,#llar-setting-page-logs .add_block__under_table .add_block__list .item .icon,#llar-setting-page-logs__active .add_block__under_table .add_block__list .item .icon,#llar-setting-page-premium .add_block__under_table .add_block__list .item .icon{width:50px;height:50px;vertical-align:middle;margin-right:8px}#llar-setting-page .add_block__under_table .add_block__list .item .name,#llar-setting-page-debug .add_block__under_table .add_block__list .item .name,#llar-setting-page-help .add_block__under_table .add_block__list .item .name,#llar-setting-page-logs .add_block__under_table .add_block__list .item .name,#llar-setting-page-logs__active .add_block__under_table .add_block__list .item .name,#llar-setting-page-premium .add_block__under_table .add_block__list .item .name{width:80%;padding-bottom:17px}#llar-setting-page .add_block__under_table.image_plus .row__list,#llar-setting-page-debug .add_block__under_table.image_plus .row__list,#llar-setting-page-help .add_block__under_table.image_plus .row__list,#llar-setting-page-premium .add_block__under_table.image_plus .row__list{display:flex}#llar-setting-page .add_block__under_table.image_plus .row__list .add_block__title,#llar-setting-page-debug .add_block__under_table.image_plus .row__list .add_block__title,#llar-setting-page-help .add_block__under_table.image_plus .row__list .add_block__title,#llar-setting-page-premium .add_block__under_table.image_plus .row__list .add_block__title{flex:0 0 14%;margin-right:20px}#llar-setting-page .add_block__under_table.image_plus .add_block__list,#llar-setting-page-debug .add_block__under_table.image_plus .add_block__list,#llar-setting-page-help .add_block__under_table.image_plus .add_block__list,#llar-setting-page-premium .add_block__under_table.image_plus .add_block__list{gap:16px}@media screen and (max-width:1599.5px){#llar-setting-page .add_block__under_table.image_plus .add_block__list,#llar-setting-page-debug .add_block__under_table.image_plus .add_block__list,#llar-setting-page-help .add_block__under_table.image_plus .add_block__list,#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list,#llar-setting-page-premium .add_block__under_table.image_plus .add_block__list{column-gap:10px}}#llar-setting-page .add_block__under_table.image_plus .add_block__list .item{flex:0 0 15%}#llar-setting-page .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item{flex-direction:column;align-items:start;border-radius:20px;border:1px solid #4acad8}#llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item{flex:0 0 15%;flex-direction:column;align-items:start;border-radius:20px;border:1px solid #4acad8}@media screen and (max-width:1599.5px){#llar-setting-page .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item{flex:0 0 30%}}#llar-setting-page .add_block__under_table.image_plus .add_block__list .item .name{width:unset;margin:10px 23px 17px}#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item .name,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item .name{width:unset}#llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item .name,#llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item .name,#llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item .name{width:unset;margin:10px 23px 17px}#llar-setting-page .add_block__under_table.image_plus .add_block__list .item img{width:120px;align-self:center}#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item img,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item img{align-self:center}#llar-setting-page-debug .add_block__under_table.image_plus .add_block__list .item img,#llar-setting-page-help .add_block__under_table.image_plus .add_block__list .item img,#llar-setting-page-premium .add_block__under_table.image_plus .add_block__list .item img{width:120px;align-self:center}#llar-setting-page .gdpr-information-link,#llar-setting-page-debug .gdpr-information-link,#llar-setting-page-help .gdpr-information-link,#llar-setting-page-logs .gdpr-information-link,#llar-setting-page-logs__active .gdpr-information-link,#llar-setting-page-premium .gdpr-information-link{display:block;text-decoration:none;position:relative}#llar-setting-page .gdpr-information-link:after,#llar-setting-page-debug .gdpr-information-link:after,#llar-setting-page-help .gdpr-information-link:after,#llar-setting-page-logs .gdpr-information-link:after,#llar-setting-page-logs__active .gdpr-information-link:after,#llar-setting-page-premium .gdpr-information-link:after{content:"\f345";font-family:dashicons;line-height:1;font-weight:400;font-style:normal;text-transform:none;text-rendering:auto;font-size:22px;text-align:center;position:absolute;right:40px;top:50%;color:#2a2f40;transform:translateY(-50%)}#llar-setting-page .button_block,#llar-setting-page-debug .button_block,#llar-setting-page-help .button_block,#llar-setting-page-logs .button_block,#llar-setting-page-logs__active .button_block,#llar-setting-page-premium .button_block{margin-top:24px;display:flex;flex-wrap:nowrap;column-gap:16px}#llar-setting-page .button_block a.button.menu__item,#llar-setting-page-debug .button_block a.button.menu__item,#llar-setting-page-help .button_block a.button.menu__item,#llar-setting-page-logs .button_block a.button.menu__item,#llar-setting-page-logs__active .button_block a.button.menu__item,#llar-setting-page-premium .button_block a.button.menu__item{text-align:center}#llar-setting-page .llar-accordion,#llar-setting-page-debug .llar-accordion,#llar-setting-page-help .llar-accordion,#llar-setting-page-logs .llar-accordion,#llar-setting-page-logs__active .llar-accordion,#llar-setting-page-premium .llar-accordion{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;border-radius:20px;background-color:#f6fbff}#llar-setting-page .llar-accordion .ui-accordion-header,#llar-setting-page-debug .llar-accordion .ui-accordion-header,#llar-setting-page-help .llar-accordion .ui-accordion-header,#llar-setting-page-logs .llar-accordion .ui-accordion-header,#llar-setting-page-logs__active .llar-accordion .ui-accordion-header,#llar-setting-page-premium .llar-accordion .ui-accordion-header{color:#2a2f40;font-weight:500;font-size:18px;margin-top:20px;padding:31px 40px;border:1px solid #4acad8;border-bottom:0;border-top-right-radius:20px;border-top-left-radius:20px;background-color:#fdfdfd}@media screen and (max-width:1599.5px){#llar-setting-page .llar-accordion .ui-accordion-header,#llar-setting-page-debug .llar-accordion .ui-accordion-header,#llar-setting-page-help .llar-accordion .ui-accordion-header,#llar-setting-page-logs .llar-accordion .ui-accordion-header,#llar-setting-page-logs__active .llar-accordion .ui-accordion-header,#llar-setting-page-premium .llar-accordion .ui-accordion-header{font-size:16px}}#llar-setting-page .llar-accordion .ui-accordion-header-collapsed,#llar-setting-page-debug .llar-accordion .ui-accordion-header-collapsed,#llar-setting-page-help .llar-accordion .ui-accordion-header-collapsed,#llar-setting-page-logs .llar-accordion .ui-accordion-header-collapsed,#llar-setting-page-logs__active .llar-accordion .ui-accordion-header-collapsed,#llar-setting-page-premium .llar-accordion .ui-accordion-header-collapsed{border:0;border-radius:20px;background:unset;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}#llar-setting-page .llar-accordion .ui-accordion-header.ui-accordion-header-active,#llar-setting-page-debug .llar-accordion .ui-accordion-header.ui-accordion-header-active,#llar-setting-page-help .llar-accordion .ui-accordion-header.ui-accordion-header-active,#llar-setting-page-logs .llar-accordion .ui-accordion-header.ui-accordion-header-active,#llar-setting-page-logs__active .llar-accordion .ui-accordion-header.ui-accordion-header-active,#llar-setting-page-premium .llar-accordion .ui-accordion-header.ui-accordion-header-active{background:#fff}#llar-setting-page .llar-accordion .ui-accordion-content,#llar-setting-page-debug .llar-accordion .ui-accordion-content,#llar-setting-page-help .llar-accordion .ui-accordion-content,#llar-setting-page-logs .llar-accordion .ui-accordion-content,#llar-setting-page-logs__active .llar-accordion .ui-accordion-content,#llar-setting-page-premium .llar-accordion .ui-accordion-content{padding-top:0;margin-bottom:16px;color:#2a2f40;border-bottom-right-radius:20px;border-bottom-left-radius:20px;border:1px solid #4acad8;border-top:0;background-color:#fdfdfd;overflow:hidden}#llar-setting-page .llar-accordion .ui-accordion-content a,#llar-setting-page-debug .llar-accordion .ui-accordion-content a,#llar-setting-page-help .llar-accordion .ui-accordion-content a,#llar-setting-page-logs .llar-accordion .ui-accordion-content a,#llar-setting-page-logs__active .llar-accordion .ui-accordion-content a,#llar-setting-page-premium .llar-accordion .ui-accordion-content a{color:inherit}#llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table,#llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table,#llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table,#llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table,#llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table,#llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table{margin-top:0;border-spacing:0;font-weight:400}#llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr,#llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr,#llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr,#llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr,#llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr,#llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr{box-shadow:unset}#llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr td,#llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr td,#llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr td,#llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr td,#llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr td,#llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr td,#llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr th{padding-top:0}#llar-setting-page .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-debug .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .description-secondary,#llar-setting-page-help .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-logs .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-logs__active .llar-accordion .ui-accordion-content .llar-form-table tr th,#llar-setting-page-premium .llar-accordion .ui-accordion-content .llar-form-table tr th{padding-left:0}#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .input_border textarea,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td .textarea_border textarea{color:#a4a8b7}#llar-setting-page-logs .add_block__under_table,#llar-setting-page-logs__active .add_block__under_table{margin:20px 0 8px}#llar-setting-page-logs .add_block__under_table.image_plus,#llar-setting-page-logs__active .add_block__under_table.image_plus{box-shadow:3px 5px 23px 0 rgba(162,180,189,.2)}#llar-setting-page-logs .add_block__under_table.image_plus .row__list,#llar-setting-page-logs__active .add_block__under_table.image_plus .row__list{display:flex}#llar-setting-page-logs .add_block__under_table.image_plus .row__list .add_block__title,#llar-setting-page-logs__active .add_block__under_table.image_plus .row__list .add_block__title{flex:0 0 14%;margin-right:20px}#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list{gap:18px}@media screen and (max-width:1599.5px){#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list{column-gap:10px}}#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item{flex:0 0 23%}@media screen and (max-width:1599.5px){#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item{flex:0 0 49%}}#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item .name,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item .name{margin:10px 33px 37px}#llar-setting-page-logs .add_block__under_table.image_plus .add_block__list .item img,#llar-setting-page-logs__active .add_block__under_table.image_plus .add_block__list .item img{margin-top:23px;width:154px}#llar-setting-page-logs .description-page .description-secondary a.unlink,#llar-setting-page-logs__active .description-page .description-secondary a.unlink{font-weight:500}#llar-setting-page-logs__active .llar-table-header{display:flex;justify-content:space-between;align-items:flex-start;margin:40px 0 5px}#llar-setting-page-logs__active .llar-table-header .title_page{margin-top:0}#llar-setting-page-logs__active .llar-table-header .right-link{font-size:16px;line-height:1.625;margin-right:5px;text-align:center}#llar-setting-page-logs__active .llar-table-header .right-link .dashicons-image-rotate{font-size:16px;vertical-align:middle}#llar-setting-page-logs__active .llar-table-header .right-link .dashicons-editor-help{vertical-align:middle}#llar-setting-page-logs__active .llar-table-scroll-wrap{max-height:400px;padding:0 20px 30px;border-radius:16px;background-color:#fff;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2);overflow-y:auto;scrollbar-width:thin}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap{padding:0 15px 20px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap{padding:0 10px 10px}}#llar-setting-page-logs__active .llar-table-scroll-wrap::-webkit-scrollbar{width:4px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table{position:relative;border-collapse:separate;border-spacing:0 3px}#llar-setting-page-logs__active .llar-preloader.llar-table-scroll-wrap:before,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table.llar-preloader:before,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-preloader-wrap.loading:before,.llar-table-app-login.llar-preloader:before,.llar-table-no_app-login.llar-preloader:before{content:"";display:block;width:100%;height:100%;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+);background-color:rgba(255,255,255,.7);background-repeat:no-repeat;background-position:center center;z-index:999;position:absolute;top:0;left:0}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table thead tr th{color:#2a2f40;font-size:16px;font-weight:500;padding:20px 18px}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table thead tr th{font-size:15px;padding:15px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table thead tr th{font-size:12px}}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr.empty-row,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr:nth-child(odd),#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody.login-attempts tr:nth-child(4n+1){border-radius:16px;background-color:#f6fbff}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr.empty-row td:first-child,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr:nth-child(odd) td:first-child,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody.login-attempts tr:nth-child(4n+1) td:first-child{border-top-left-radius:16px;border-bottom-left-radius:16px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr.empty-row td:last-child,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr:nth-child(odd) td:last-child,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody.login-attempts tr:nth-child(4n+1) td:last-child{border-top-right-radius:16px;border-bottom-right-radius:16px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td{font-size:16px;font-weight:400;padding:18px}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td{font-size:14px;padding:14px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td{font-size:14px;padding:12px}}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td.llar-col-nowrap{white-space:nowrap}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td.llar-app-log-actions{display:flex;justify-content:center}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td input.input_border,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select.input_border{color:#a4a8b7;border:1px solid #a4a8b7}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td select,#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td select,.llar-table-app-login tbody.login-attempts tr td select,.llar-table-no_app-login tbody.login-attempts tr td select{font-family:inherit;min-width:150px;margin-right:25px;background-size:16px 16px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag{display:flex;align-items:center;white-space:nowrap;gap:3px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .hint_tooltip{width:fit-content;top:33px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .hint_tooltip:before{right:20%}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .hint_tooltip-content{font-size:14px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag .llar-tooltip:before,#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag .llar-tooltip:before,.llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag .llar-tooltip:before,.llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag .llar-tooltip:before{width:auto!important}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag img{width:34px;height:auto;border-radius:4px;vertical-align:middle;margin-right:5px}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag img{width:30px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .llar-log-country-flag img{width:25px}}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button{line-height:1;margin-right:5px;border-radius:8px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button:last-child{margin-right:0}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button .dashicons,#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button.llar-app-log-action-btn i{vertical-align:middle}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button.llar-app-log-action-btn{min-width:35px;text-align:center;display:inline-block;line-height:20px;cursor:pointer}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table tbody tr td .button.llar-app-log-action-btn:hover i{color:#3c8dbc}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead .llar-app-acl-action-col{text-align:center}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader.hidden{display:none}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td,#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td,.llar-table-app-login .table-inline-preloader tr td,.llar-table-no_app-login .table-inline-preloader tr td{padding:5px}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .load-more-button a,#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .load-more-button a,.llar-table-app-login .table-inline-preloader tr td .load-more-button a,.llar-table-no_app-login .table-inline-preloader tr td .load-more-button a{padding-bottom:1px;text-decoration:unset;border-bottom:1px dashed}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .preloader-row{display:none;align-items:center}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .preloader-row .preloader-icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+);background-size:100%;background-repeat:no-repeat;width:30px;height:30px;display:inline-block}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader tr td .preloader-row .preloader-text{color:#999}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader.loading tr td .load-more-button{display:none}#llar-setting-page-logs__active .llar-table-scroll-wrap .llar-form-table .table-inline-preloader.loading tr td .preloader-row{display:inline-flex}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-preloader-wrap{position:relative}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-log-pagination>a{font-size:16px;line-height:1.625}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-log-pagination .spinner{float:none}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules{display:flex;justify-content:space-between;flex-wrap:wrap;column-gap:15px}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col{flex:1 0 49%;min-width:590px}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .help-link{color:#4acad8;font-size:16px;padding:10px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead td,.llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td,.llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td{font-size:16px}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead td{font-size:15px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table thead td{font-size:14px}}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td{font-size:16px;padding-right:5px}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td{font-size:15px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td{font-size:14px}}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td input{min-width:195px}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td select{min-width:200px;margin-right:0}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody td .button{min-width:20px;margin-right:20px;border-radius:8px}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule]{margin-top:10px;border-radius:16px}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule] td{padding-left:45px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td:first-child,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule] td:first-child,.llar-table-app-login tbody.login-attempts tr td:first-child,.llar-table-no_app-login tbody.login-attempts tr td:first-child{border-top-left-radius:16px;border-bottom-left-radius:16px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td:last-child,#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody [class^=llar-app-rule] td:last-child,.llar-table-app-login tbody.login-attempts tr td:last-child,.llar-table-no_app-login tbody.login-attempts tr td:last-child{border-top-right-radius:16px;border-bottom-right-radius:16px}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-acl-action-col{padding:10px 25px 10px 15px;text-align:center}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-acl-action-col .llar-app-acl-add-rule{min-width:100%}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-rule-pass{background-color:#cffbe8}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-rule-allow{background-color:rgba(74,202,216,.0980392157)}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-rule-deny{background-color:rgba(255,150,155,.1490196078)}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table tbody .llar-app-acl-remove{color:#ec4652;border-color:#ec4652;background-color:rgba(255,150,155,.1490196078)}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .llar-form-table .origin{float:right;opacity:.5}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section{padding:30px;background-color:#fff;border-radius:16px;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode{font-size:16px;color:#666d84;display:inline-block;vertical-align:middle}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode select{font-family:inherit;min-width:150px;margin-right:25px;background:#fdfdfd url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234ACAD8FF'%3e%3cpath d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") no-repeat right 5px top 55%;background-size:16px 16px}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-toggle-countries-list{font-size:16px;color:#4acad8;text-decoration:none;vertical-align:middle;border-bottom:1px solid currentColor}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list{font-size:16px;color:#2a2f40;display:flex;flex-wrap:wrap;max-height:400px;overflow-y:auto}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list:first-child{margin-top:0}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country{flex:0 0 10%}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country label{padding-bottom:10px;display:inline-block}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected{display:inline;margin-left:20px;vertical-align:middle;overflow:hidden}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country{margin-bottom:0;display:inline-block;margin-right:20px;padding-right:20px;border-right:1px solid #e8e9ec}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country label{color:#2a2f40;padding-bottom:0;white-space:nowrap}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country:last-child{border-right:unset}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list{font-size:14px;display:none;margin:10px 0}#llar-setting-page-logs__active.limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list.visible{display:flex;border-top:1px solid #dddada;padding-top:10px}.llar-blur-block{position:absolute;top:0;bottom:0;left:0;right:0;backdrop-filter:blur(1.5px);background-color:rgba(164,168,183,.0784313725)}.llar-blur-block-text{position:absolute;top:45%;left:50%;max-width:46rem;width:80%;font-size:18px;line-height:1.3;color:#666d84;text-align:center;padding:1.5rem 2rem;background-color:#ecfafb;border-radius:20px;border:1px solid #4acad8;transform:translate(-50%,-50%)}@media screen and (max-width:1599.5px){.llar-blur-block-text{top:40%;font-size:16px}}@media screen and (max-width:1399.5px){.llar-blur-block-text{top:45%;font-size:14px}}.llar-blur-block-text img{max-width:5rem}@media screen and (max-width:1599.5px){.llar-blur-block-text img{max-width:4rem}}.llar-blur-block-text .title{margin-top:1rem;font-size:26px;font-weight:500}@media screen and (max-width:1599.5px){.llar-blur-block-text .title{margin-top:.75rem;font-size:24px}}@media screen and (max-width:1399.5px){.llar-blur-block-text .title{margin-top:.5rem}}.llar-blur-block-text .description{margin-top:1rem}@media screen and (max-width:1599.5px){.llar-blur-block-text .description{margin-top:.75rem}}@media screen and (max-width:1399.5px){.llar-blur-block-text .description{margin-top:.5rem}}.llar-blur-block-text .footer{border-top:1px solid #4acad8;padding-top:.75rem;margin-top:1rem;font-weight:500}@media screen and (max-width:1599.5px){.llar-blur-block-text .footer{margin-top:.75rem}}@media screen and (max-width:1399.5px){.llar-blur-block-text .footer{padding-top:.5rem;margin-top:.5rem}}.llar-blur-block-cell{filter:blur(7px)}#llar-setting-page-logs__active .llar-table-scroll-wrap,.llar-table-app-login,.llar-table-no_app-login{position:relative;border-collapse:separate;border-spacing:0 3px}#llar-setting-page-logs__active .llar-table-scroll-wrap tr td,#llar-setting-page-logs__active .llar-table-scroll-wrap tr th,.llar-table-app-login tr td,.llar-table-app-login tr th,.llar-table-no_app-login tr td,.llar-table-no_app-login tr th{font-size:16px;font-weight:400;width:fit-content;padding:20px 2px 20px 14px}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tr td,#llar-setting-page-logs__active .llar-table-scroll-wrap tr th,.llar-table-app-login tr td,.llar-table-app-login tr th,.llar-table-no_app-login tr td,.llar-table-no_app-login tr th{font-size:14px;padding:15px 2px 15px 12px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tr td,#llar-setting-page-logs__active .llar-table-scroll-wrap tr th,.llar-table-app-login tr td,.llar-table-app-login tr th,.llar-table-no_app-login tr td,.llar-table-no_app-login tr th{padding:12px 2px 12px 14px}}@media screen and (max-width:767.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tr td,#llar-setting-page-logs__active .llar-table-scroll-wrap tr th,.llar-table-app-login tr td,.llar-table-app-login tr th,.llar-table-no_app-login tr td,.llar-table-no_app-login tr th{display:table-cell;width:fit-content;font-size:12px}}#llar-setting-page-logs__active .llar-table-scroll-wrap thead tr th,.llar-table-app-login thead tr th,.llar-table-no_app-login thead tr th{color:#2a2f40;font-weight:500}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr,.llar-table-app-login tbody.login-attempts tr,.llar-table-no_app-login tbody.login-attempts tr{border-radius:16px;background-color:unset}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+1),.llar-table-app-login tbody.login-attempts tr:nth-child(4n+1),.llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+1){background-color:#f6fbff}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+3),.llar-table-app-login tbody.login-attempts tr:nth-child(4n+3),.llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+3){background-color:unset}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+2),#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr:nth-child(4n+4),.llar-table-app-login tbody.login-attempts tr:nth-child(4n+2),.llar-table-app-login tbody.login-attempts tr:nth-child(4n+4),.llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+2),.llar-table-no_app-login tbody.login-attempts tr:nth-child(4n+4){background-color:rgba(164,168,183,.0784313725)}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td,.llar-table-app-login tbody.login-attempts tr td,.llar-table-no_app-login tbody.login-attempts tr td{color:#666d84}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.llar-col-nowrap,#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td a,.llar-table-app-login tbody.login-attempts tr td.llar-col-nowrap,.llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td a,.llar-table-no_app-login tbody.login-attempts tr td.llar-col-nowrap,.llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td a{white-space:nowrap}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip{box-sizing:content-box;right:0;top:30px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip:before,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip:before,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip:before{right:25px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content{font-size:14px;color:#fff}@media screen and (max-width:767.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content{font-size:12px}}#llar-dashboard-page .dashboard-section-4 .hint_tooltip-content ul,#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content ul,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content ul,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content ul{padding-left:16px;padding-right:10px}#llar-dashboard-page .dashboard-section-4 .hint_tooltip-content ul li,#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content ul li,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content ul li,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content ul li{font-size:inherit;color:inherit;margin-bottom:0;padding-left:10px;min-width:120px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-content ul li::before,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-content ul li::before,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-content ul li::before{content:"✧";color:#fff;font-size:12px;margin-left:-15px;padding-right:3px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent{display:inline-block;position:relative}#llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent span,#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent span,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent span,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent span{color:#ff7c06;font-weight:500}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent .dashicons,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons{color:#a4a8b7}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent .dashicons,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons{line-height:unset;font-size:14px}}@media screen and (max-width:767.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .hint_tooltip-parent .dashicons,.llar-table-app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons,.llar-table-no_app-login tbody.login-attempts tr td .hint_tooltip-parent .dashicons{font-size:12px}}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag,.llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag,.llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag{display:flex;align-items:center;white-space:nowrap;gap:3px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag .hint_tooltip,.llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag .hint_tooltip,.llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag .hint_tooltip{width:fit-content;right:0;top:35px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag img,.llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag img,.llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag img{width:34px;height:auto;border-radius:4px;vertical-align:middle;margin-right:4px}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag img,.llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag img,.llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag img{width:30px}}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .llar-log-country-flag img,.llar-table-app-login tbody.login-attempts tr td .llar-log-country-flag img,.llar-table-no_app-login tbody.login-attempts tr td .llar-log-country-flag img{width:25px}}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button,.llar-table-app-login tbody.login-attempts tr td .button,.llar-table-no_app-login tbody.login-attempts tr td .button{line-height:1;margin-right:5px;border-radius:8px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button:last-child,.llar-attempts-chart-legend>div:last-child,.llar-table-app-login tbody.login-attempts tr td .button:last-child,.llar-table-no_app-login tbody.login-attempts tr td .button:last-child{margin-right:0}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button .dashicons,.llar-table-app-login tbody.login-attempts tr td .button .dashicons,.llar-table-no_app-login tbody.login-attempts tr td .button .dashicons{vertical-align:middle}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open,.llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open,.llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open{display:inline-block;width:30px;min-width:unset;min-height:30px;padding:0;text-align:center;line-height:20px;cursor:pointer;color:#a4a8b7;border-color:currentColor}@media screen and (max-width:767.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open,.llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open,.llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open{width:25px;min-height:25px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open .dashicons,.llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open .dashicons,.llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open .dashicons{font-size:14px;height:16px}}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open:focus,.llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open:focus,.llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open:focus{outline:unset;box-shadow:unset}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td .button.llar-add-login-open:hover,.llar-table-app-login tbody.login-attempts tr td .button.llar-add-login-open:hover,.llar-table-no_app-login tbody.login-attempts tr td .button.llar-add-login-open:hover{color:#4acad8}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.button-open,.llar-table-app-login tbody.login-attempts tr td.button-open,.llar-table-no_app-login tbody.login-attempts tr td.button-open{padding:0 2px}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.cell-login,.llar-table-app-login tbody.login-attempts tr td.cell-login,.llar-table-no_app-login tbody.login-attempts tr td.cell-login{max-width:9ch}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr td.cell-login a,.llar-table-app-login tbody.login-attempts tr td.cell-login a,.llar-table-no_app-login tbody.login-attempts tr td.cell-login a{display:inline-block;max-width:9ch;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id,.llar-table-app-login tbody.login-attempts tr .cell-id,.llar-table-no_app-login tbody.login-attempts tr .cell-id{display:inline-block}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id .id,.llar-table-app-login tbody.login-attempts tr .cell-id .id,.llar-table-no_app-login tbody.login-attempts tr .cell-id .id{font-size:15px;max-width:14ch;display:inline-block;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width:1599.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id .id,.llar-table-app-login tbody.login-attempts tr .cell-id .id,.llar-table-no_app-login tbody.login-attempts tr .cell-id .id{font-size:90%}}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-id .hint_tooltip,.llar-table-app-login tbody.login-attempts tr .cell-id .hint_tooltip,.llar-table-no_app-login tbody.login-attempts tr .cell-id .hint_tooltip{top:30px!important}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr .cell-role .hint_tooltip,.llar-table-app-login tbody.login-attempts tr .cell-role .hint_tooltip,.llar-table-no_app-login tbody.login-attempts tr .cell-role .hint_tooltip{right:-25px}#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader.hidden,#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row,.llar-table-app-login .table-inline-preloader.hidden,.llar-table-app-login tbody.login-attempts tr.hidden-row,.llar-table-no_app-login .table-inline-preloader.hidden,.llar-table-no_app-login tbody.login-attempts tr.hidden-row{display:none}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open,.llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open,.llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open{display:table-row}@media screen and (max-width:1399.5px){#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td,.llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td,.llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td{font-size:14px}}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td span,.llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td span,.llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td span{font-weight:600}#llar-setting-page-logs__active .llar-table-scroll-wrap tbody.login-attempts tr.hidden-row.table-row-open td .open_street_map,.llar-table-app-login tbody.login-attempts tr.hidden-row.table-row-open td .open_street_map,.llar-table-no_app-login tbody.login-attempts tr.hidden-row.table-row-open td .open_street_map{border:unset}#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader,.llar-table-app-login .table-inline-preloader,.llar-table-no_app-login .table-inline-preloader{text-align:center}#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .preloader-row,.llar-table-app-login .table-inline-preloader tr td .preloader-row,.llar-table-no_app-login .table-inline-preloader tr td .preloader-row{display:none;align-items:center}#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .preloader-row .preloader-icon,.llar-table-app-login .table-inline-preloader tr td .preloader-row .preloader-icon,.llar-table-no_app-login .table-inline-preloader tr td .preloader-row .preloader-icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+);background-size:100%;background-repeat:no-repeat;width:30px;height:30px;display:inline-block}#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader tr td .preloader-row .preloader-text,.llar-table-app-login .table-inline-preloader tr td .preloader-row .preloader-text,.llar-table-no_app-login .table-inline-preloader tr td .preloader-row .preloader-text{color:#999}#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader.loading tr td .load-more-button,.llar-table-app-login .table-inline-preloader.loading tr td .load-more-button,.llar-table-no_app-login .table-inline-preloader.loading tr td .load-more-button{display:none}#llar-setting-page-logs__active .llar-table-scroll-wrap .table-inline-preloader.loading tr td .preloader-row,.llar-table-app-login .table-inline-preloader.loading tr td .preloader-row,.llar-table-no_app-login .table-inline-preloader.loading tr td .preloader-row{display:inline-flex}.llar-notice-notify,.llar-notice-review{display:flex;padding:15px 20px 0!important;border-left:4px solid #333!important}.llar-notice-notify .llar-review-image img,.llar-notice-review .llar-review-image img{margin-top:10px;margin-bottom:20px}.llar-notice-notify .llar-review-image span,.llar-notice-review .llar-review-image span{font-size:80px;color:orange;width:80px;height:auto;margin-bottom:20px}.llar-notice-notify .llar-review-info,.llar-notice-review .llar-review-info{flex:1;margin-left:30px}.llar-notice-notify .llar-review-info .llar-buttons,.llar-notice-review .llar-review-info .llar-buttons{display:flex;align-items:center}.llar-notice-notify .llar-review-info .llar-buttons li,.llar-notice-review .llar-review-info .llar-buttons li{margin-right:10px}.llar-notice-notify .llar-review-info .llar-buttons li .dashicons,.llar-notice-review .llar-review-info .llar-buttons li .dashicons{margin-right:5px}#menu-settings li,.custom-app-tab{position:relative}.custom-app-tab .spinner{float:none}.custom-app-tab .llar-app-ajax-msg{font-size:13px;margin-top:5px;display:block}.custom-app-tab .llar-app-ajax-msg.error{color:red}.custom-app-tab .llar-app-ajax-msg.success{color:green}.custom-app-tab .llar-delete-app{color:#dc3232;position:absolute;bottom:15px;right:15px}.custom-app-tab .llar-delete-app:hover{opacity:.8}.custom-app-tab .llar-why-use-premium-text{margin-top:20px}.custom-app-tab .llar-why-use-premium-text .title{font-weight:700;font-size:16px;color:#4d4d4d}#llar-progress-bar{position:fixed;top:0;height:6px;left:0;width:100%;z-index:999999;background-color:#eee}#llar-progress-bar span{height:100%;position:absolute;display:block;width:0;background-color:#00b357;transition:width .4s}.header_massage{margin-right:20px}#llar-header-login-custom-message,.header_massage #llar-header-upgrade-mc-message,.header_massage #llar-header-upgrade-premium-message{position:relative;margin:20px auto;width:fit-content;color:#ff9800;font-weight:500;padding:14px 32px;text-align:center;border-radius:40px;border:1px solid #ebb35a;background-color:#ffefd6;box-shadow:0 4px 18px 0 rgba(114,117,123,.2)}@media screen and (max-width:991.5px){.header_massage #llar-header-upgrade-mc-message,.header_massage #llar-header-upgrade-premium-message{padding:5px 14px;font-size:11px}}@media screen and (max-width:767.5px){.header_massage #llar-header-upgrade-mc-message,.header_massage #llar-header-upgrade-premium-message{margin-left:16px;margin-right:16px}}.header_massage #llar-header-upgrade-mc-message p,.header_massage #llar-header-upgrade-premium-message p{font-size:16px;margin:0}.header_massage #llar-header-upgrade-mc-message p .dashicons,.header_massage #llar-header-upgrade-premium-message p .dashicons{width:32px;height:32px;font-size:32px;color:inherit;vertical-align:middle;margin-right:5px}@media screen and (max-width:991.5px){.header_massage #llar-header-upgrade-mc-message p .dashicons,.header_massage #llar-header-upgrade-premium-message p .dashicons{width:16px;height:16px;font-size:16px}}.header_massage #llar-header-upgrade-mc-message.exhausted,.header_massage #llar-header-upgrade-premium-message.exhausted{color:#ec4652;font-weight:400;margin-left:auto;margin-right:auto;padding:12px 25px;background-color:rgba(236,70,82,.1019607843);border:1px solid currentColor}.header_massage #llar-header-upgrade-mc-message .close,.header_massage #llar-header-upgrade-premium-message .close{position:absolute;top:-6px;right:-9px;cursor:pointer}.header_massage #llar-header-upgrade-mc-message .close .dashicons,.header_massage #llar-header-upgrade-premium-message .close .dashicons{width:16px;height:24px;font-size:24px}@media screen and (max-width:991.5px){.header_massage #llar-header-upgrade-mc-message .close .dashicons,.header_massage #llar-header-upgrade-premium-message .close .dashicons{width:16px;height:18px;font-size:18px}}#llar-header-login-custom-message{width:900px;font-size:16px;border-radius:20px}@media screen and (max-width:1799.5px){#llar-header-login-custom-message{margin-right:auto}}@media screen and (max-width:1199.5px){#llar-header-login-custom-message{width:795px}}@media screen and (max-width:991.5px){#llar-header-login-custom-message{width:710px;font-size:95%}}@media screen and (max-width:767.5px){#llar-header-login-custom-message{font-size:90%;width:100%;margin-right:auto;margin-left:auto}}@media screen and (max-width:575.5px){#llar-header-login-custom-message{width:400px}}#llar-header-login-custom-message .message-flex{display:flex}#llar-header-login-custom-message .message-flex .col-first img{width:150px}@media screen and (max-width:1199.5px){#llar-header-login-custom-message .message-flex .col-first img{width:130px}}@media screen and (max-width:767.5px){#llar-header-login-custom-message .message-flex .col-first img{width:100px}}#llar-header-login-custom-message .message-flex .col-second{width:30%;line-height:1.7;color:#2a2f40;margin:16px 25px;text-align:left}@media screen and (max-width:1199.5px){#llar-header-login-custom-message .message-flex .col-second{margin:16px 10px}}#llar-header-login-custom-message .message-flex .col-third{width:45%;margin:16px 25px;font-size:87.5%}@media screen and (max-width:1199.5px){#llar-header-login-custom-message .message-flex .col-third{margin:16px 10px}}#llar-header-login-custom-message .message-flex .col-third .row-first{color:#666d84;font-weight:400}#llar-header-login-custom-message .message-flex .col-third .row-second{position:relative;margin:5px 10px;color:#a4a8b7}#llar-header-login-custom-message .message-flex .col-third .row-second hr{background-color:rgba(255,124,6,.0980392157);display:inline-block;width:calc(50% - 50px);border:0;height:2px;vertical-align:middle}#llar-header-login-custom-message .message-flex .col-third .row-second span{display:inline-flex;width:50px;justify-content:center}#llar-header-login-custom-message .message-flex .col-third .row-third{font-weight:500;margin:10px;padding:5px 10px;background-color:rgba(255,124,6,.0980392157);border-radius:10px}.settings_page_limit-login-attempts .update-nag{display:none}#llar-welcome-page{padding:50px 0}#llar-welcome-page img{max-width:100%;height:auto}#llar-welcome-page .llar-welcome-page-container{width:100%;max-width:760px;margin:0 auto 30px;background-color:#fff;border-radius:4px;box-shadow:0 0 4px rgba(0,0,0,.1)}#llar-welcome-page .llar-welcome-page-container.llar-premium{border-top:5px solid #50c1cd}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section{padding:20px;text-align:center}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section .llar-logo{text-align:center;margin-top:20px;margin-bottom:30px}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h2{font-size:2.4em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h3{font-size:1.5em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section p{font-size:17px;color:#444}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-video-wrap img{width:100%;height:auto;cursor:pointer}#llar-welcome-page .llar-welcome-page-features{display:flex;flex-wrap:wrap;justify-content:space-between;padding:0 15px;counter-reset:cnt1}#llar-welcome-page .llar-welcome-page-features .llar-feature-item{flex:0 0 24%;text-align:center;margin-bottom:40px;position:relative;padding-bottom:60px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:before{content:counter(cnt1);counter-increment:cnt1;position:absolute;left:50%;transform:translatex(-50%);bottom:0;font-size:1em;font-weight:600;width:40px;height:40px;line-height:40px;text-align:center;border-radius:50%;background-color:#ecedef;color:#979aaa}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:after{position:absolute;content:"";left:-39%;width:69%;height:1px;bottom:1.4em;background-color:#ecedef}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:nth-child(4n+1):after{display:none}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-image{margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-title{font-weight:700;margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-desc{color:#979aaa}@media (max-width:768px){#llar-welcome-page .llar-welcome-page-features{display:block}}#llar-welcome-page .llar-why-recommend{text-align:left;font-size:17px}#llar-welcome-page .llar-why-recommend ul li span{margin-right:5px;width:auto;height:auto;font-size:25px;vertical-align:middle;color:green}#llar-welcome-page .llar-welcome-list{font-size:17px;text-align:left;line-height:1.4;list-style:none}#llar-welcome-page .llar-welcome-list li span{margin-right:10px;width:auto;height:auto;font-size:22px;vertical-align:top;color:orange}#llar-welcome-page .llar-upgrade-btn-wrap{padding:20px}#llar-welcome-page .llar-upgrade-btn-wrap a{display:inline-block;background-color:#e27800;color:#fff;font-size:22px;padding:20px;text-decoration:none;font-weight:600}#llar-welcome-page .llar-upgrade-btn-wrap a:hover{background-color:#af5d00}#llar-welcome-page .llar-upgrade-questions{font-size:17px}.dashboard_page_llar-welcome .notice:not(.llar-notice-review),.dashboard_page_llar-welcome .update-nag,.toplevel_page_limit-login-attempts .notice:not(.llar-notice-review),.toplevel_page_limit-login-attempts .update-nag{margin-top:15px;display:none}.dashboard_page_llar-welcome .notice:not(.llar-notice-review) p,.dashboard_page_llar-welcome .update-nag p,.toplevel_page_limit-login-attempts .notice:not(.llar-notice-review) p,.toplevel_page_limit-login-attempts .update-nag p{margin-left:10px}.dashboard_page_llar-welcome .video-container,.toplevel_page_limit-login-attempts .video-container{position:relative;padding-bottom:56.1%;height:0;overflow:hidden}.dashboard_page_llar-welcome .video-container iframe,.toplevel_page_limit-login-attempts .video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}#toplevel_page_limit-login-attempts .llar-submenu-premium-item a,#wp-admin-bar-llar-root #wp-admin-bar-llar-root-premium a{color:orange}#toplevel_page_limit-login-attempts .wp-menu-image.svg{background-size:25px auto!important;margin-top:7px}#menu-settings li .llar-alert-icon{position:absolute;right:5px;top:7px;min-width:15px;line-height:15px;height:15px}#wpadminbar li .llar-alert-icon .plugin-count{vertical-align:middle;margin-top:-3px}.llar-auto-update-notice{display:block!important}.llar-attempts-chart-legend>div{margin-right:10px;color:#60666d;display:inline-block}.llar-attempts-chart-legend>div:before{content:"";display:inline-block;width:37px;height:9px;border:3px solid;margin-right:5px;vertical-align:middle}.llar-attempts-chart-legend>div.legend-1:before{border-color:#36a2eb;background-color:rgba(54,162,235,.3)}.llar-attempts-chart-legend>div.legend-2:before{border-color:rgba(174,174,174,.7);background-color:rgba(174,174,174,.2)}.llar-attempts-chart-legend>div.legend-2 .llar-tooltip:before{left:auto;right:0}#llar-dashboard-page{font-family:CoFo Sans,arial;margin-top:40px}#llar-dashboard-page *{box-sizing:border-box}#llar-dashboard-page ol,#llar-dashboard-page ul{margin-left:0;padding-left:32px}#llar-dashboard-page ol li,#llar-dashboard-page ul li{font-size:16px;color:#666d84;padding-left:16px;margin-bottom:10px}#llar-dashboard-page ol li::before,#llar-dashboard-page ul li::before{color:#9762ef;margin-left:-20px}#llar-dashboard-page .section-title__new{display:flex;flex-wrap:nowrap;justify-content:space-between;gap:20px;font-size:16px;text-align:left}@media screen and (max-width:1799.5px){#llar-dashboard-page .section-title__new{gap:10px}}@media screen and (max-width:1599.5px){#llar-dashboard-page .section-title__new{font-size:14px}}#llar-dashboard-page .section-title__new .llar-label{color:#2a2f40;min-width:fit-content;text-wrap:nowrap;padding:2px 16px;border-radius:8px;background-color:rgba(10,172,208,.08)}@media screen and (max-width:1599.5px){#llar-dashboard-page .section-title__new .llar-label{padding:2px 5px}}#llar-dashboard-page .section-title__new .llar-label-group{display:flex;column-gap:20px}#llar-dashboard-page .section-title__new .llar-label__url{color:#a4a8b7;font-size:87.5%;margin-right:18px;overflow:hidden}@media screen and (max-width:1599.5px){#llar-dashboard-page .section-title__new .llar-label__url{margin-right:4px}}#llar-dashboard-page .section-title__new .llar-label__circle-blue{font-size:64px;vertical-align:middle;color:#58c3ff}#llar-dashboard-page .section-title__new .llar-label__circle-grey{font-size:64px;vertical-align:middle;color:rgba(174,174,174,.6980392157)}#llar-dashboard-page .section-title__new .llar-label .dashicons{font-size:140%;width:14px;height:14px}#llar-dashboard-page .section-title__new .llar-label.exhausted{color:#ec4652;background-color:rgba(236,70,82,.1019607843)}#llar-dashboard-page .section-title__new .llar-label.request{background-color:unset}#llar-dashboard-page .section-content{margin-top:16px;overflow:hidden}#llar-dashboard-page .dashboard-section-1{margin-bottom:20px;display:flex;flex-wrap:nowrap;gap:16px}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-1{flex-wrap:wrap;gap:8px}}#llar-dashboard-page .dashboard-section-1>[class^=info-box-]{position:relative;text-align:center;flex:0 0 auto;width:calc(33.3% - 16px);padding:32px 30px 24px;border-radius:20px;background:#fdfdfd;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}@media screen and (max-width:1799.5px){#llar-dashboard-page .dashboard-section-1>[class^=info-box-]{padding:30px 16px 16px}}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-1>[class^=info-box-]{padding:30px 16px}}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-1>[class^=info-box-]{width:calc(40% - 4px);min-height:272px}}@media screen and (max-width:1199.5px){#llar-dashboard-page .dashboard-section-1>[class^=info-box-]{width:100%;min-height:294px}}#llar-dashboard-page .dashboard-section-1>[class^=info-box-]:last-child,#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li:last-child{border:0}#llar-dashboard-page .dashboard-section-1>[class^=info-box-] .title{font-weight:500;color:#666d84;font-size:16px;line-height:1.5}#llar-dashboard-page .dashboard-section-1>[class^=info-box-] .title-big{font-size:20px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label{float:right;margin-right:18px;padding-top:2px;color:#666d84;text-wrap:nowrap}#llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons{width:unset;height:unset;background-color:#97f6c8;border-radius:4px;color:#fdfdfd;margin-right:5px;font-size:inherit}#llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons.disabled{background-color:#ec4652}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons{margin-top:2px}}@media screen and (max-width:1199.5px){#llar-dashboard-page .dashboard-section-1 .info-box-1 .section-title__new .llar-premium-label .dashicons{margin-right:2px}}#llar-dashboard-page .dashboard-section-1 .info-box-1 .section-content{clear:both;margin-top:24px;margin-bottom:16px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart{max-width:300px;position:relative;margin-bottom:15px;margin-left:auto;margin-right:auto}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .doughnut-chart-wrap{position:relative;width:200px;height:auto;margin:0 auto}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .llar-retries-count{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:28px;font-weight:700}#llar-dashboard-page .dashboard-section-1 .info-box-1 .desc{margin-top:10px;color:#a4a8b7;font-size:14px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .actions{margin-top:5px}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-1 .info-box-2{width:calc(60% - 4px)}}@media screen and (max-width:1199.5px){#llar-dashboard-page .dashboard-section-1 .info-box-2{width:100%}}#llar-dashboard-page .dashboard-section-1 .info-box-2 .section-content{overflow:visible}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap{width:100%;margin:0 auto;clear:both}#llar-admin-dashboard-widgets .llar-widget.widget-2 .llar-chart-wrap canvas,#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap canvas{height:300px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .chart-stats-legend{text-align:center;margin-top:10px}#llar-dashboard-page .dashboard-section-1 .info-box-3{text-align:left}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-1 .info-box-3{width:100%}}#llar-dashboard-page .dashboard-section-1 .info-box-3 .section-content{overflow:unset}#llar-dashboard-page .dashboard-section-1 .info-box-3 .section-content .list-unstyled{padding-left:5px;font-size:14px;line-height:1.5}#llar-dashboard-page .dashboard-section-1 .info-box-3 .desc{color:#666d84;font-size:16px;line-height:1.5;margin-bottom:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .title{color:#2a2f40;font-size:18px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions{position:relative;width:fit-content;left:50%;transform:translateX(-50%)}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons{display:flex;flex-direction:row;column-gap:16px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons a{text-transform:uppercase;font-size:16px;margin-bottom:5px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons a.button.menu__item{text-transform:none;text-align:center}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item{min-width:200px;max-width:235px;padding:7px 8px;font-size:16px;border-radius:8px;margin:0 auto}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item{min-width:160px}}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__transparent_orange{color:#ff7c06!important;border:1px solid;background:0 0}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__transparent_orange:hover{background:rgba(255,124,6,.0980392157);border:1px solid #ff7c06}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__orange{color:#fdfdfd!important;background:#ff7c06;border:1px solid #ff7c06;box-shadow:0 5px 10px 0 rgba(255,124,6,.4980392157)}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item.button__orange:hover{background:#f07200}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions__buttons .menu__item:focus{outline:0!important;box-shadow:unset!important}#llar-dashboard-page .dashboard-section-1 .info-box-3 .remark{font-size:14px;color:#666d84;margin:15px 16px 0}#llar-dashboard-page .dashboard-section-1.custom .info-box-2{flex:0 0 calc(66.666% - 16px);width:calc(66.666% - 16px)}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-1.custom .info-box-2{flex:1 0 calc(50% - 4px);width:calc(50% - 4px)}}@media screen and (max-width:1399.5px) and (max-width:991.5px){#llar-dashboard-page .dashboard-section-1.custom .info-box-2{flex:1 0 100%;width:100%;min-height:126px}}#llar-dashboard-page .dashboard-section-2{display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-2>[class^=info-box-]{flex:0 0 calc(50% - 10px);min-height:100px;background:#fdfdfd;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-2>[class^=info-box-]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-2 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list{padding:0;margin:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li{margin:0;border-bottom:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a{text-decoration:none;padding:15px;font-size:15px;display:block}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a:hover{background-color:#f9f9f9}#llar-dashboard-page .dashboard-section-2 .info-box-2{display:flex;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon{flex:0 0 100px;display:flex;justify-content:center;align-items:center;margin-right:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon .dashicons{color:#0073a0;font-size:50px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content{flex:1}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .title{font-size:20px;font-weight:700;margin-bottom:10px;line-height:1.5}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .actions{display:flex;justify-content:space-between}#llar-dashboard-page .dashboard-section-3{display:flex;flex-wrap:nowrap;margin-bottom:20px;column-gap:16px}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-3{gap:8px}}@media screen and (max-width:575.5px){#llar-dashboard-page .dashboard-section-3{flex-wrap:wrap}}#llar-dashboard-page .dashboard-section-3>[class^=info-box-]{position:relative;display:flex;flex-wrap:wrap;flex:0 0 auto;width:calc(33.33333333% - 16px);padding:20px 90px 26px 28px;border-radius:20px;background:#fdfdfd;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-3>[class^=info-box-]{padding:16px 25px 30px;width:calc(33.33333333% - 5px)}}@media screen and (max-width:767.5px){#llar-dashboard-page .dashboard-section-3>[class^=info-box-]{padding:16px 10px}}@media screen and (max-width:575.5px){#llar-dashboard-page .dashboard-section-3>[class^=info-box-]{flex:0 0 100%}}#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-icon{flex:0 0 auto;display:flex;justify-content:center;align-items:start}#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-icon img{width:50px;height:50px;vertical-align:middle;margin-right:16px}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-icon img{width:40px;height:40px;margin-right:8px}}@media screen and (max-width:767.5px){#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-icon img{width:35px;height:35px;margin-right:4px}}#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-content{flex:1}#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-content .title{color:#2a2f40;font-size:20px;font-weight:500;margin-bottom:4px;line-height:1.3}@media screen and (max-width:767.5px){#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-content .title{font-size:16px}}#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-content .title a{text-decoration:none}#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-content .desc{font-size:14px}#llar-dashboard-page .dashboard-section-3>[class^=info-box-] .info-box-content .actions{display:flex;justify-content:space-between}#llar-dashboard-page .dashboard-section-4{display:flex;flex-wrap:wrap;margin-bottom:20px;column-gap:1rem}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-4{gap:8px}}#llar-dashboard-page .dashboard-section-4>[class^=info-box-]{flex:0 0 auto;width:calc(50% - 16px);min-height:100px;max-height:600px;padding:32px 23px 24px 30px;border-radius:20px;background:#fdfdfd;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2);overflow:hidden}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-4>[class^=info-box-]{max-height:515px;padding:27px 18px 20px 22px}}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-4>[class^=info-box-]{width:100%}}@media screen and (max-width:991.5px){#llar-dashboard-page .dashboard-section-4>[class^=info-box-]{padding:27px 16px 16px 18px}}#llar-dashboard-page .dashboard-section-4>[class^=info-box-]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-4 .hint_tooltip,#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input{box-sizing:content-box}#llar-dashboard-page .dashboard-section-4 .hint_tooltip:before{right:25px}#llar-dashboard-page .dashboard-section-4 .hint_tooltip-content{font-size:14px;color:#fff}@media screen and (max-width:767.5px){#llar-dashboard-page .dashboard-section-4 .hint_tooltip-content{font-size:12px}}#llar-dashboard-page .dashboard-section-4 .hint_tooltip-content ul li::before{color:#fff;font-size:12px;margin-left:-15px}#llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent{display:inline-block;position:relative}#llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent .dashicons{color:#a4a8b7}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent .dashicons{line-height:unset;font-size:14px;width:12px}}@media screen and (max-width:767.5px){#llar-dashboard-page .dashboard-section-4 .hint_tooltip-parent .dashicons{font-size:12px}}#llar-dashboard-page .dashboard-section-4 .info-box-1{position:relative}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title__new .title{color:#2a2f40;font-size:20px;font-weight:500}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title__new .desc{color:#666d84;font-size:16px;line-height:1.5;margin:40px;text-align:center}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-content{height:100%;overflow:auto;scrollbar-width:thin;scrollbar-gutter:stable;padding-bottom:30px}#llar-dashboard-page .dashboard-section-4 .info-box-2{line-height:1.5;padding-left:30px}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-4 .info-box-2{padding-left:25px}}@media screen and (max-width:991.5px){#llar-dashboard-page .dashboard-section-4 .info-box-2{padding-left:22px}}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title__new .title{color:#2a2f40;font-size:20px;font-weight:500}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title__new .desc{color:#666d84;font-size:16px;line-height:2}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title__new .desc{line-height:1.8}}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content{margin-top:0;padding-top:5px}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list{color:#2a2f40;font-size:16px;font-weight:500;margin-top:27px}@media screen and (max-width:1599.5px){#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list{font-size:14px;margin-top:20px}}@media screen and (max-width:1399.5px){#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list{margin-top:15px}}@media screen and (max-width:991.5px){#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list{margin-top:12px}}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input:before,#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input:disabled{opacity:1;pointer-events:none}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input:checked+span{text-decoration:line-through}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list-add{display:none;color:#ff7c06;margin-left:10px;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input[type=checkbox]:checked~.list-add{display:none}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list input[type=checkbox]:not(:checked)~.list-add{display:inline}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-content .list .desc{color:#666d84;font-weight:400;margin:5px 25px}#llar-admin-dashboard-widgets .widget-title{padding-bottom:15px;border-bottom:1px solid #e4e4e4;font-size:14px;text-align:left}#llar-admin-dashboard-widgets .widget-content{font-family:CoFo Sans,arial}#llar-admin-dashboard-widgets .widget-content .llar-attempts-chart-legend{margin-bottom:10px}#llar-admin-dashboard-widgets .llar-widget{margin-bottom:20px;background-color:#fff;text-align:center}#llar-admin-dashboard-widgets .llar-widget .section-title__new{font-size:12px;line-height:150%;display:flex;flex-wrap:nowrap;justify-content:space-between;text-align:left}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label{color:#2a2f40;min-width:fit-content;padding:.125rem .75rem;border-radius:8px;background-color:rgba(10,172,208,.08)}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label-group{display:flex;column-gap:30px}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label__circle-blue{font-size:44px;vertical-align:middle;color:#58c3ff}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label__circle-grey{font-size:44px;vertical-align:middle;color:rgba(174,174,174,.6980392157)}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip{left:-100%}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-label .hint_tooltip:before{right:82%}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-premium-label .dashicons{width:unset;height:unset;background-color:#97f6c8;border-radius:4px;color:#fdfdfd;margin-right:5px;margin-top:3px;font-size:inherit}#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-premium-label .dashicons.disabled{background-color:#ec4652}@media screen and (max-width:1199.5px){#llar-admin-dashboard-widgets .llar-widget .section-title__new .llar-premium-label .dashicons{margin-right:2px}}#llar-admin-dashboard-widgets .llar-widget .chart{max-width:300px;position:relative;margin:15px auto}#llar-admin-dashboard-widgets .llar-widget .chart .doughnut-chart-wrap{position:relative;width:200px;height:auto;margin:0 auto}#llar-admin-dashboard-widgets .llar-widget .chart .llar-retries-count{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:28px;font-weight:700}#llar-admin-dashboard-widgets .llar-widget .title{font-weight:600;font-size:16px;line-height:1.5;margin-bottom:10px}#llar-admin-dashboard-widgets .llar-widget .desc,#llar-setting-page-premium .text-block-1 p{font-size:15px}#llar-admin-dashboard-widgets .llar-widget .actions{margin-top:5px}#llar-admin-dashboard-widgets .llar-widget.widget-2 .llar-chart-wrap{width:100%;margin:0 auto;clear:both}#llar-admin-dashboard-widgets .llar-widget.widget-2 .chart-stats-legend{text-align:center;margin-top:10px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-content-pane{overflow-y:auto}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block{margin-top:24px;display:flex;flex-wrap:wrap;justify-content:center;column-gap:16px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block .button{font-size:18px;margin-top:20px;padding:11px 60px;width:70%}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-horizon{display:flex;justify-content:center;margin-top:20px;gap:10px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-horizon .button{font-size:18px;padding:11px 60px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-single{margin-top:20px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .button_block-single .button{font-size:18px;padding:11px 60px;width:fit-content}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content{min-height:930px;padding:15px;background:url(./images/onboarding-bg-big.webp) center top;background-size:100%;border-radius:16px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .logo{width:90px;margin:100px auto 50px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .logo img{background:rgba(253,253,253,.4);border-radius:8px;padding:20px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line{position:relative;height:2px;width:50%;margin:10px auto 60px;background-color:#abbfc1}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block{position:absolute;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;left:0;top:-30px;width:60px;height:60px;border-radius:50%;background-color:transparent}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block .point{position:absolute;top:22px;width:18px;height:18px;border-radius:50%;background-color:#abbfc1}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block .description{position:absolute;top:60px;font-size:16px;color:#666d84;width:max-content}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block.active{position:absolute;background-color:rgba(74,202,216,.3019607843)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block.active .description{color:#2a2f40}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block.visited .point{background-color:#4acad8}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="1"]{left:0;transform:translateX(-50%)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="2"]{left:33.3333333333%;transform:translateX(-50%)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="3"]{left:66.6666666667%;transform:translateX(-50%)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-onboarding__line .point__block[data-step="4"]{left:100%;transform:translateX(-50%)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .title{font-size:32px;font-weight:500;color:#ff7c06;text-align:center;padding-top:40px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .title img{width:36px;vertical-align:text-top}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .preloader-wrapper{display:none;position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(255,255,255,.3);align-items:center;justify-content:center}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .preloader-wrapper .spinner{display:block;position:relative;float:none;visibility:hidden;top:50%;transform:translateY(-50%);margin:0 auto}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .llar-disabled .preloader-wrapper{display:block}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card{min-width:768px;text-align:center;margin-top:37px;padding:23px 63px 60px;border:unset;background-color:#f6fbff;border-radius:20px;box-shadow:2px 2px 9px 0 rgba(162,180,189,.2)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .explanations{font-size:14px;color:#666d84;margin-top:15px;padding:0 35px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification{display:none;color:#666d84;font-size:20px;line-height:1.5;margin:15px auto 0;padding:9px 70px;width:fit-content;border-radius:8px;background-color:#fff}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification__error{display:none;font-size:20px;line-height:1.5;margin:15px auto 0;padding:9px 70px;width:fit-content;border-radius:8px;background-color:#fff;color:#ec4652;background-color:rgba(236,70,82,.1019607843)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification img,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .card .llar-upgrade-subscribe_notification__error img{display:inline-block;width:12.5px;margin-right:2px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-wrap{margin-top:23px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-title{color:#2a2f40;font-size:20px;font-weight:500}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-title-add{color:#666d84;font-size:18px;font-weight:400}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key{display:inline-block;line-height:25px;margin-top:11px;width:100%}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .input_border{font-size:16px;min-width:420px;padding:15px 30px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border{font-size:16px;padding:15px 30px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .button,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .button{position:relative;display:inline-block;font-size:18px;padding:14px 30px 15px;margin-left:-25px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .button .dashicons,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-key .button .dashicons{margin-left:15px;line-height:inherit}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-error{display:none;color:red;margin-top:15px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-email .input_border{min-width:100%}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-desc{color:#666d84;font-size:16px;line-height:1.5;text-align:center;margin-top:22px;padding:0 25px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-desc-add{line-height:1.5;text-align:center;margin-top:22px;padding:0 25px;font-size:18px;color:#2a2f40}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-desc-additional{color:#a4a8b7;font-size:16px;line-height:1.5;text-align:left;margin-top:12px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-list{line-height:1.5}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-list .item{font-size:18px;color:#666d84}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-list .item:before{color:#9762ef}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video{position:relative;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-top:24px;border-radius:16px}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video .video-container{position:relative}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video #video-frame,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video #video-poster{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:20px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-video #video-poster{cursor:pointer;z-index:1}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-checkbox{display:inline-block;color:#666d84;font-size:14px;margin-top:10px;margin-left:25px;text-align:left}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-checkbox input{margin-top:15px;margin-left:-25px;vertical-align:top}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-checkbox span{display:inline-block;margin-left:15px;margin-top:10px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .field-image{width:240px;margin:0 auto}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options{display:flex}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .info{font-size:16px;line-height:22px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons{display:flex;padding-left:15px;align-items:center}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span{text-transform:uppercase;cursor:pointer;width:45px;text-align:center;vertical-align:middle;display:block;height:34px;line-height:34px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span.llar-act{background-color:#0a75b5;color:#fff}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span:first-child{border:1px solid #ccc;border-radius:4px 0 0 4px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .security-alerts-options .buttons span:last-child{border:1px solid #ccc;border-radius:0 4px 4px 0;border-left:0}#llar-setting-page-premium,.llar-help-page{font-family:inherit;line-height:1.5}#llar-setting-page-premium .llar-premium-page-promo{padding:43px 80px 60px;margin-bottom:20px;border-radius:20px;background-color:#fdfdfd;box-shadow:3px 5px 23px 0 rgba(162,180,189,.2)}#llar-setting-page-premium .llar-premium-page-promo .section-1{display:flex;align-items:flex-end}#llar-setting-page-premium .llar-premium-page-promo .section-1 .text .title{font-size:31px;font-weight:500;color:#ff7c06;line-height:1.4;margin-bottom:5px}#llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links{font-size:12px;list-style:none;margin:0}#llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links li{display:inline-block;margin-right:20px}#llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links li a{position:relative;vertical-align:middle}#llar-setting-page-premium .llar-premium-page-promo .section-1 .text .links li a.gdpr-information-link:after{position:relative;font-size:inherit;line-height:inherit;right:0;vertical-align:middle;color:#a4a8b7}#llar-setting-page-premium .llar-premium-page-promo .section-1 .action{margin-left:auto;text-align:center}#llar-setting-page-premium .llar-premium-page-promo .section-1 .action a.button{font-size:16px;padding:7px 35px;min-width:250px;text-align:center}#llar-setting-page-premium .llar-premium-page-promo .section-1 .action .label{font-size:14px;color:#a4a8b7;margin-top:9px}#llar-setting-page-premium .llar-premium-page-promo .section-1 .action .label .dashicons{font-size:18px}#llar-setting-page-premium .llar-premium-page-promo .section-1__internal{font-size:16px;text-align:center;margin-top:40px;color:#666d84;border-radius:20px;background-color:#f6fbff;padding:27px 0}#llar-setting-page .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink,#llar-setting-page-debug .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink,#llar-setting-page-help .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink,#llar-setting-page-logs .description-page .description-secondary #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink,#llar-setting-page-logs .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink,#llar-setting-page-logs__active .description-page .description-secondary #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink,#llar-setting-page-logs__active .llar-settings-wrap .llar-form-table tr td #llar-setting-page-premium .llar-premium-page-promo .section-1__internal a.unlink,#llar-setting-page-premium .llar-premium-page-promo .section-1__internal #llar-setting-page-logs .description-page .description-secondary a.unlink,#llar-setting-page-premium .llar-premium-page-promo .section-1__internal #llar-setting-page-logs__active .description-page .description-secondary a.unlink,#llar-setting-page-premium .llar-premium-page-promo .section-1__internal .llar-settings-wrap .llar-form-table tr td a.unlink,#llar-setting-page-premium .llar-premium-page-promo .section-1__internal .llar_turquoise,#llar-setting-page-premium .llar-settings-wrap .llar-form-table tr td .llar-premium-page-promo .section-1__internal a.unlink{display:block}#llar-setting-page-premium .text-block-1{margin-bottom:20px}#llar-setting-page-premium .llar-premium-plans-table{margin-top:3.75rem}#llar-setting-page-premium .llar-premium-plans-table .content{border-radius:16px;background-color:#f6fbff;padding-right:15px;padding-bottom:15px;overflow-x:auto}#llar-setting-page-premium .llar-premium-plans-table .content .table_background{font-size:16px;font-weight:400;line-height:1.4;width:100%;border-collapse:inherit;border-spacing:0;border-radius:16px;box-shadow:3px 5px 23px 0 rgba(162,180,189,.2)}@media screen and (max-width:1599.5px){#llar-setting-page-premium .llar-premium-plans-table .content .table_background{font-size:14px}}#llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td{font-size:20px;font-weight:500;text-align:left;color:#4acad8;min-width:150px;padding:16px 29px;border-top-left-radius:16px;border-top-right-radius:16px;border:1px solid rgba(74,202,216,.0980392157);background-color:rgba(74,202,216,.0980392157)}#llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td:first-child{width:25%;min-width:300px}@media screen and (max-width:1799.5px){#llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td{min-width:100px}}@media screen and (max-width:1599.5px){#llar-setting-page-premium .llar-premium-plans-table .content .table_background thead tr td{font-size:18px;font-weight:400}}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody{text-align:left;background-color:#fff;border-bottom-right-radius:16px;border-bottom-left-radius:16px}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr:nth-child(even)::after{content:"";position:absolute;top:5px;bottom:5px;left:0;right:0;border-radius:16px;background-color:#fdfdfd}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr:last-child td:first-child{border-bottom-left-radius:16px}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr:last-child td:last-child{border-bottom-right-radius:16px}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td{position:relative;padding:16px 29px;border-right:1px solid #f6fbff;border-bottom:1px solid #f6fbff;z-index:1}@media screen and (max-width:1799.5px){#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td{padding:12px 10px}}@media screen and (max-width:991.5px){#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td{font-size:14px}}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td:last-child{border-right:unset}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .icon-lock{color:#2a2f40;width:24px;height:24px}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .button,#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .llar_button,#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td button{margin:40px auto;padding-top:12px;padding-bottom:12px;width:100%}@media screen and (max-width:1799.5px){#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .button,#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .llar_button,#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td button{width:auto}}@media screen and (max-width:1599.5px){#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .button,#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .llar_button,#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td button{min-width:120px}}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .category{font-weight:500}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .description{display:block;margin-top:5px;color:#666d84}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td .description a{color:#5c8fdc;text-decoration:none;border-bottom:1px solid currentColor}#llar-setting-page-premium .llar-premium-plans-table .content .table_background tbody tr td.inner_fields{text-align:center}.llar-help-page .section-1{display:flex;padding-top:45px;padding-bottom:50px;margin-bottom:20px;border-radius:20px;background-color:#fdfdfd;box-shadow:3px 5px 23px 0 rgba(162,180,189,.2)}.llar-help-page .section-1 .block{text-align:center;flex:1;border-right:1px solid rgba(164,168,183,.2980392157)}.llar-help-page .section-1 .block:last-child{border:0}.llar-help-page .section-1 .block .title{color:#2a2f40;font-weight:500;font-size:20px}.llar-help-page .section-1 .block .text{color:#666d84;font-size:18px;max-width:80%;margin:10px auto}.llar-help-page .section-1 .block .actions{text-align:center}.llar-help-page .section-1 .block .actions .button{text-transform:uppercase;font-size:18px;line-height:1.4;padding:4px 20px}.llar-help-page .section-1 .block .actions .button span{text-transform:none;display:block;font-size:12px;line-height:13px;margin-bottom:2px}.llar-help-page .section-1 .block .actions .button.button-secondary{min-height:40px;line-height:40px}.llar-help-page .description-page{font-weight:500;color:#2a2f40}.llar-help-page .documentation-section{display:flex;flex-wrap:wrap}.llar-help-page .documentation-section .questions{display:flex;flex:1 1 calc(100% - 550px);flex-direction:column}.llar-help-page .documentation-section .questions__block{display:flex;flex:1 1 auto;flex-direction:column}@media screen and (max-width:1399.5px){.llar-help-page .documentation-section .questions__block{flex:1 1 100%}}.llar-help-page .documentation-section .questions__block .question{display:block;flex:1 0 auto;margin-bottom:20px;padding:30px 40px;background-color:#fdfdfd;border-radius:20px;text-decoration:none;box-shadow:2px 2px 9px 0 rgba(162,180,189,.2)}.llar-help-page .documentation-section .questions__block .question:last-child{margin-bottom:0}.llar-help-page .documentation-section .questions__block .question:hover{box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}.llar-help-page .documentation-section .questions__block .question .title{font-size:18px;font-weight:500;color:#2a2f40}.llar-help-page .documentation-section .questions__block .question .desc{font-size:16px;margin-top:5px;color:#666d84}.llar-help-page .documentation-section .top-list{flex:0 0 500px;margin-left:20px}@media screen and (max-width:1399.5px){.llar-help-page .documentation-section .top-list{flex:0 0 100%}}.llar-help-page .documentation-section .top-list .list__block{padding:30px 35px;border-radius:20px;background-color:#fdfdfd;box-shadow:4px 4px 18px 0 rgba(162,180,189,.2)}.llar-help-page .documentation-section .top-list ol{margin:0 0 0 35px;color:#5c8fdc;list-style:none;counter-reset:my-counter}.llar-help-page .documentation-section .top-list ol li{position:relative;font-size:16px;margin-bottom:15px;padding:3px;border-radius:8px;counter-increment:my-counter}.llar-help-page .documentation-section .top-list ol li:before{content:counter(my-counter) ".";position:absolute;left:-45px;top:0;width:100%;height:100%;font-size:inherit;background-color:#f6fbff;border-radius:16px;padding:3px 20px}.llar-help-page .documentation-section .top-list ol li a{position:relative;color:inherit;text-decoration:none}.llar-help-page .documentation-section .top-list ol li a:hover{text-decoration:underline}.toplevel_page_limit-login-attempts{font-family:CoFo Sans,arial}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box{padding:0!important;background-color:transparent}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-content-pane{display:block;margin-bottom:0;border-radius:16px;scrollbar-width:none}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-content-pane::-webkit-scrollbar{width:0}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-closeIcon{top:17px!important}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .jconfirm-buttons{padding-right:15px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .preloader-wrapper{display:none;position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(255,255,255,.3);align-items:center;justify-content:center}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .preloader-wrapper .spinner{display:block;position:relative;float:none;visibility:hidden;top:50%;transform:translateY(-50%);margin:0 auto}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-disabled .preloader-wrapper{display:block}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .input_border{font-size:16px;min-width:420px;padding:15px 30px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__content{padding:15px;border-radius:16px;background-color:#fdfdfd}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body{font-size:16px;font-weight:400;line-height:1.5;color:#2a2f40;padding:0 15px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body .card{padding:0;border:unset;box-shadow:unset}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body .card-header{color:#ec4652}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .popup_error_content__body .card-body{margin-top:10px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__content{padding:15px;border-radius:16px;background:url(./images/micro-cloud-bg.webp) no-repeat center top;background-size:100%;background-color:#fdfdfd}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body{font-size:18px;font-weight:400;line-height:1.5;color:#2a2f40;padding:55px 60px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header{display:flex;flex-direction:row}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .left_side{width:60%}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .right_side{width:40%}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .right_side img{display:block;width:306px;margin:0 auto}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .title{font-size:44px;font-weight:500;margin-right:70px;text-align:left}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .description{margin-top:10px;color:#666d84}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body_header .description-add{font-size:14px;font-weight:500;color:#666d84;margin-top:10px;padding:10px 20px;background-color:#ecfafb;border-radius:16px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card{min-width:100%;text-align:center;margin-top:15px;padding:0;border:unset;background-color:#f6fbff;border-radius:20px;box-shadow:2px 2px 9px 0 rgba(162,180,189,.2)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-header{color:#ff7c06;padding:15px 63px;margin-bottom:0;background-color:rgba(255,124,6,.0980392157);border-bottom:1px solid #ff7c06;border-top-left-radius:16px;border-top-right-radius:16px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-header .title{font-size:20px;font-weight:500;text-align:left}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-header .title img{width:22px;vertical-align:middle;margin-right:15px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body{padding:10px 63px;text-align:left}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .description{font-size:16px;color:#666d84;margin-top:20px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-email{margin-top:20px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .llar-onboarding-popup__content .micro_cloud_modal__body .card-body .field-desc-add,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-checkbox,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-desc,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-onboarding-popup__content .field-desc-add{color:#666d84;font-size:16px;margin-top:20px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .field-image{width:240px;margin:0 auto}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .button_block-single{text-align:left;margin-bottom:30px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .button_block-single .description_add{font-size:14px;color:#a4a8b7;margin-top:15px}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body.step-second,.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body.step-second .button_block-single{text-align:center}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification{font-size:18px;margin:5px auto 0}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification .field-image img{width:220px;margin:0 auto}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification__error{color:#ec4652;padding:9px 70px;width:fit-content;border-radius:8px;background-color:rgba(236,70,82,.1019607843)}.toplevel_page_limit-login-attempts .jconfirm .jconfirm-box .micro_cloud_modal__body .card-body .llar-upgrade-subscribe_notification img{display:inline-block;width:12.5px;margin-right:2px}PKwL\Yxx>limit-login-attempts-reloaded/assets/css/login-page-styles.cssnu[#llar-login-page-gdpr { position: fixed; padding: 15px; background-color: rgba(0, 0, 0, 0.9); width: 100%; bottom: 0; left: 0; right: 0; color: #fff; display: block; text-align: center; box-sizing: border-box; } #llar-login-page-gdpr .llar-login-page-gdpr__message { font-size: 14px; color: #fff; } /*# sourceMappingURL=login-page-styles.css.map */ PKwL\H;Blimit-login-attempts-reloaded/assets/css/login-page-styles.css.mapnu[{"version":3,"sourceRoot":"","sources":["../sass/login-page-styles.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA","file":"login-page-styles.css"}PKwL\y-Blimit-login-attempts-reloaded/assets/css/login-page-styles.min.cssnu[#llar-login-page-gdpr{position:fixed;padding:15px;background-color:rgba(0,0,0,.9);width:100%;bottom:0;left:0;right:0;color:#fff;display:block;text-align:center;box-sizing:border-box}#llar-login-page-gdpr .llar-login-page-gdpr__message{font-size:14px;color:#fff}PKwL\kWdd<limit-login-attempts-reloaded/assets/img/features/icon11.pngnu[PNG  IHDR:l)%PLTE{zzZ*+R[jzYYS\kYzR\k*S[j*Z+y+yy*ÃI|/.<~āYҵ䠣ͤDž_kyٿɼ8JޞijϱœYbpU_nտϘ[dsl}v}IѰ顼æy̮êv^hv32ryᜫʫqeB.ftHܜfvݥSzGpf[~ZX䪿\mCpbcerm™rOt_z\tL/b0IDATxڴف1E?]E{nQ͌ ~=_i{}C2ZR0r Ҏl̘4$sx 7ZJό9z(?~2CX7 #gU\'(rsyׄG!uPVos@PzƩZspb%9Ť ῷ[kZbqecʉ/ (yy^@YsO `&ݠ  PymE= ?Do9^"_CgSJ~ߴQW&z~wڒ)rLtbǰO^x]s2Y"*ְq_ĮlS}|[ ҫ<̞s2D`F v-}iZxA$|{ ={>lIΝ'07rAepn=ϰwF.c݁)skJ K"؉*T2MZJf`_ @u Pپcs_RZgč[UVP;dYَp&<< }-z/,O: 6&/X0k~:U&:&s "S1$䙞l_|͇wvڟMHHm..;&Z!8m;bi+ո6 <9 I%U/c򫛯?w7iAigX@ ȤuKCb;7 0㫜ݵ$|?<}c,Vyҳs5uMa=zDPF9*)jU:#j]kDCO[ǧ^QG+,10J7is#uN7>nr*FD)rUX-@mB:ta6Y2V8@@ 3'׆:?u{ _0crh:] =0 h&S/Eɰ/vuG|?smw!Re n1x¡6zWa E̋6/׫rr}g8%R'#KE.P]q7LWd4enY]=Gt6EK_ދtz;<,6tydʧIM1x*i}l(b6vR%/|* /!/*C!d[T+_N+a+-NSX%G=#*ڣqD5c [-*-Fs,% Fg[1Su cc{νWٲ#b*b|_FZeEqUK@GNU{"*C fYI7Q`P-=;=kq RϭmQMu*_Gw։a(#&EF)aao뿡@CK{m:gB!k-0/6EmS|szUnB$Fi ىȎ_M5TITvQ*]A7Q .91W=yv8ĂBaRC A*Wcz_xiw3vJ5D!w Uv#Rw:J7fMIOwt|O6fN˕ մ)j _4rԩ2nkhC4jD7d悔Ε$ |1@SΪ_,Ϻ&)MHi1;b byZ #|~m.Oy<|A)'>z[?A-0`,{9"ͧp]a<֭'IYs׿uVp(E!65MGS-7?4%/{NrM/)-v {]z\ "(xыJ/K=R;"@q%V OjyO̪Jtd~r"2{rF9ҙ BGF*Y=LP0 A*d|Z9ua zQvTTuc]ծ%(HȅyyOqOk9ֆAY>}LtCD7`]+J%YWWjVntUg`M\i^r*sUZ)@Dao@4)cV&KA|eW e{C= y5Mj@;' rMhja#6>ߕw&-#Gn_=^| A[r/oϰvx~m p! уvw=$T>芀&u Z?#V5R>F3S2|Qã c!^^U)m!2[s RSε2<@Gts(L!z]GWwٌl- gDTݒueq(?PàsӃ`'K顝f l_Us4},lV4AU,4~6&3ޅPxμ6QҧQT?9\I͋ms"i!{a%#ج۵qKG_hr^AĤ|g9穉E>n,c cPs#NTY+Kg,-|nď[l%;;lyE"2WKnGfv|{@FwL =<z 8=hx)wN.b=ŰՉYw=Wm9us ]Nzsg'gjHdtqK}QMOzMWY%BfɊJ `x&y 9->ߘse1@<#D73_I`hn١)UxcQ($Ə$(4u7Pt+ω.Vuf︹fIѴ+snQG[diXf@rɀn\+?9ʶ7pZWZeAڵ`=QRfZ\\|ؿF #BWJ:ʒ5qoGv];ad ^P|>^rP5ke{+w#='ek!=TsEq2=r^?VzQ:GZu6S?Pv_cTO&{vchZpI0t&mVA]* \@k*4{І 1E@Ջ)bRKLs 19+wIqMy.aeKCTE=s> "'*(ދUIUd}P{wg|GW(r*j85vqMٚҗ<^xh8hf5ҏRqX]Vr\@E?+Z ![ON m1[$ot,PN>(]G*tMys矰N%qZqJ.~].;#VsMyFaڌ@pcvzoDǚcቆ꾼6M-t>_cv4J!}ڔ+a(VbWiLpxkn5CpQJUм^~MHXhJ~Y, YꢕkRοQ\Ŏ5C_2ou"Uq&yrHǍRpT]5U:yF]iHO/=/C0ްRQVFId[(4\=D;Sx!֩)Ɇo>) ZO_Je7%+ZjޏaZEfAMϩ:9YX× `뭘 TPkhS'ED {0#'k`DqeMq}ЙN$7==0DVܢ ހ!iPY5[$jlDL(vө~Ηϙl̦ȿ+FE3p`~2VX{<\ZR Rs\tϡgCN;xaC[oM`rSS\Ncxx  >|3\!gQIg [{n srY(Ѕ 1O]:ΧoO;K]4荭E y=6P-H6d(c!mV2ɮ:e=Y x2tkit3/cƕjkkƳQb˶B!a@8&z38q&7R40Dْ~J5ka8X 7C /YÅre̦ ɿ+ 6iІI#(aԲS7ot|jNj{?w [$UXpM Hk jϒ2 GYHJ7XQ|Ҡ3C3YD} hzg:f E 52l{;2f1wMCx㻧njXL/ѷ!O:8$` .f" ~8wCxRvPD;0YP0ڣ v6fL&TLt\O}ƮEvLxok5ZA ԙޏC.6=p\[Ŗ`rH?zB^@M$ !9x-("5Ô߯uؙ}D9LхPzY"z-(Ҁۺyf'j>X(PJLJ+4FjmOz'v0sG/|L<|-_ ;dGfXUSۢ Y)uu^PmڙO^4IW)pg,0$1 PeK.49OIVcuħ6mW`{- Ѽh:*!g~KbDZpYYg](H@Q#N8Nmu0I{WIyd֘PKmP\DyM  Ѕ[~9+\m,Y$'W~TGK&%AP{ upG;T%D^$S``Jbfq 󜗗Y l6KxZ%>T+o٠/612Q{U*|gBU.)cMOᐗj^cCNuޠz 0sOX5$6_͔:;v4 /] KˀШ:MRb7#q36i+ }ھT@'7vA6(s$C_Ͻ+GRhf\/-V#ETt_NNR1S.#(IP2M@HgJE(2eMa͠B;J ;;O!(AlG1Oyv;ЍyDEA}zQ5 eۙ-]kGe$Q9Dm>CL }[9NC-lNZ5%P1uNօ[\R3ĭR  ,tB!5ʗtj͕ϙBm~CS@ L.qUPewGFNH.:T_6V2Fqr7Ӕ-iUb(b4_$fzm -} p\xhPEDHt HH +BxԫS9&!d1NÓinl5 s8 VAZР``wfL\Xxa1e``FY'PY:l-Q ('lMQpBn, PST7Ͽ GQpkL7.NK?ʦ1G:# #4U<]P'%IRNMl /\LOy}FMZq~g~dlaYkiz<`ZR 3SwBO I9hhՅNfj1[Țt13$9R!e7:q*N ?f ܏ŋO_xKkpi`gHGd.dؤY0tX; dm0p@~x(QtOT4+]L Iw7G#%5;#Ϧg}\hxwJD}X|꭭-'Fh_uJE;FFV mpQs$qq`so!NKL1$sd=SgW6$GƓw)jr`4MJ:7Dìkb{|>E)-|\;SE!5?*?4*iRR )/#gB_O/S'ĕńG[eI`끭o:9Ɉ\}Chf\OGPW_IՉ.GٴvաT{P(85֐7VVq~hւsq:xCo!L(L> #Lt.PfDꚦ"EQӘ7,6VCv)3~3j> wTc~`{i7F`d}Ӊ$8rTeхn_\)t,\%9)_Mbz6;ZtDGxA"Яo=#AN#t' F^r5ؠ^g[JCw?/ ]hGwx6iZ)Y&S>SMJ50i|;,B., mC DXw[`. ?5"a$r{Qh ksOjXW]( ChIFbko^y#C@ #M&P-"莭B$RZ?ql~aѧN|)7@H[] ]k~*TfЧM:]_4E,بF[hj:zNɛ7GCä(cz & + QrCFC5a|=84tv1yi%<ٕôat(=Ɠpn݌YyFhs] ^Fs>n8, P\0278>D+ &dr P퉳vi\JDDѐ]AX,3 ^BxVLT'˃pOެ -S@]¸{!.=4E.u|?Yo^J;+0Tz5/wki >=[JX)1_[QC>fM\w^t x&:n O4= |ͣS#lNt 21~V3P`4@㔞Qq*9Qe~9bH}(㨎wfTQ% MScjtF뮸QѢ"ío+>" n/gͧFߌ$3ޙ$7Jq*|WTVUFO$AmRUdFi^W+9++%;gGۜ$F1l#e^,=2oz矰4!V]3cYf2yTM0\κD+,XQF٤"2IsljVVDwNcm)One?^@]EGF@0VGrF?\08?pKKwv:]- S!JJlyM*!O㔖AZZp̉AiD*Oa& w)P@GQƱ A K;Ȳ+{>$!Vxڊ;!LjTT3!9Ln"_)L\=2. SE0{-%y7_=4 Oh]Wc"g ^QY Nb/w 8d++:SQ̣n. ILX2:|x4N R-dl!',9e!tcb7V 3v*wJRV+)(A:y'>*sְy>+<(&r $Fa 8 > yI,i[Lt}LN),\_~,B8&gkϿ$bɂԇ2NYtZ&~j4PY&SU$KB|[3r X A$JZ!UA2jх-T$=n#yF;UʠHzrRf~aY2?8|aeO0wTJ7}8>irH$Đ[XIDבѝx RO-Uɀz6̕S5}Lτ~ꊝHLW)楊LzBS"ww줪UALR[_?󗛫2id,``S.jCy?bK,(s<#%T1U)9L9x`aZ\2a;T`J0ƷgZSdzڦDdTyB'YZZ #kEtjcbHb:Of&0VH#f az1U36ԅAs>AtUN׬]m2U2esʓ&贼xnwn/z]9)3^u;ö#M7H:4TTt Db2 &B&HWB5&ךEn^YGW{գSgn< V1rߩ,}֏tҳ#3ڄenVYsGwɽ9B! ai 9hiM?( pmȄlѢQ"T44Ajyjّ'l ?P]ZNO3F-g,>I7xΔ߉P S67BPxT.NklLC*㐑)2^2ߖsNrA(D̹X!G3T/Ϡs {ųSU򴤀JY-o(RWޥ߱6Y`=6 s~dxrw"gp?*L]2 ƿ.80I-)|-LK)$Y*= ,[wnUU)Sjso]cEZW#KG*n頮3[hA]sT207^DP#`(}kQ߫ fSA Gk i3ӅY&6Q;/Xvܾ췄tEպg}i]E-;NuLjKЄ.w3[hfoRq0VlO4q}& oǁ+:iL1b- rg]2F-7~ϥX*j~J7cݍLUaO JliU)OP̿;Kl} =^HœOh; Ps'e[<;&Oj%9ि.dG9e {+W ݸZu-p$Cg$1u|QabRX0~AYqʹ78=1ʃzQE0{$\~ۄp;LxX,ѭv Ae'ZmHzlZ*`,U nUC:;F h-N^ear36pĺNk쥈Y"y|4fIpȺtBk3neЛ--,r{'2M: R8cPm e]X׎`ձ:BYL*tJluR>g'+1^٩ζV-17PnYz Jd, qbpJ6DjlFI ,Q̻:wcsST)qn!wW*r}$vgcukuuYfn.;Fy՜ՓNjj d :jՠmu-eohV9 )&S t"r d-10X{:Zשmo\\&y+V9vQPت"YZ)fgˏ{=.Z*ۣgb;}w\#|d[hƭӂIN& J8a#JdnTɑid֤3^`9PpOS*c1e_X1ؤزfYbS!<&hQy6K&+vlRCWmy-tmE0Gr:(5JS= U,݁ٻ6 kJZ^EqT Ti¥%-* 'z\8T FyMln=^[{2ofn]%^Fn^G_@ Ϟ`5-4[YeXƕBxTLe$Ȑ;d.ExmttuEߖ#`ϻOr3_Zw%piR؞lpBrNl%ťWjb6j<̍} h6I}`{gЇ_\S<`Tر"luٰR"N Y48wp]>쐨^7bW"BN=4i&wRZI< _ gAЫU Ԧ *Kzj F4*rSaF'TcZECHa"zgk8c +'6"IG%evM:@cD#ĽҽBwf_\xO@qw.=9R=S5Y'*9#&4 <8&5 GCP9\ɂ$ƳbpUY}g :"% d֯fO[gݴܕ՝oGӸ/HKm?X+fpժGb9ON2 +;m`XRCa~*dIXX躢À5$Ja!Fm_)9u&-@6'D\Ʒ9^mͦ\EPo sovyE$Dzpz98igjf/ݳJy\,<Уm51 ^s\nݡo>jQǻ4P}bxfND6!grXD<bY2*x<6%` ]G;:ֶњ c,eb&`Pvܺvo?<) JL#[W>ϱ(S/+&qjˮ۲B$'xZك8Zܩj X("1@6Yڒ&XӤmgኅ}S Nn:Ay@DX_hx̌!)(,x9gQ91A  LAVg0V.tˊٲx+\}|qag#jR:~7#kׯLfNB96J8ᚔ;AS&Ő%,Ɍl+d:9ۖXM3 %6E%:n>eS:PLK 7o'݋_DvQIϛ=>qxiIfg3<0 3sYyU6) { *#:ZU,-m mL1: L]9El|ݏFPG2 ` +YLb-)Z3ū<AhN"BX(ah_ḃf ObP8 =&?~k@J2Jsd:ϻy|IoUlcner]Y[ae협SMd ~s\@PIؒ?:6g FXkq؁6;_ϝ'R.NH}Tb~+܆tY-ܭa0"+=#UhgfT T!6h_ѭ'PW  !Xhn!ڒf" Lӄ'D3nK+xe\AdVYo/>6br]4+!33 > CX%Zi1C,fp]84hCeǛ-flc{+SK1((IO$$ &5i:׵H my&gLU.wFri9E`M3M%Dē[E\I,P :PW E\gh˘l MaǑ:qvvOn1*i.lE)/xOϩ&N{qt̻nx.xZ&?# η݇Z'EGt;8`W%DI>ڱ}*Ǭxdna)Xmd&o_ݼr&$6w.` 5X[E E_\ <<24mr_s= =A İ&tDd/>—Eג9!YW|7K°M`RZ$X( lfQ](lR鬘i2=Av/OE`bqnr]{lUj55|m#pR,T;*=ZЬXv5FBiqť4TbiLci^t6LjNyXԋg zYVMVFLs4$Ox lQA ҂L,乫f mfil nW4gaw5W&f璬̻8TvnsfFQ$T}ua jkAݙ2,4H;A/t X8Ffjga+f0Yt<: a\kf5]RLsxDҏHENرQA;{!v@-d,auקﯘi3h1DTklJ4ER-O4-VNc0r }cU=4ZB,!64$x`O4̚O3imk% ˙idqgx3͉ۨH +De%':6,L9-a:+f4 *:VS<_L.qfxb^Xh<jMk؆(ItX硝3M;f)PGs)3MW;WHivOߡ;1C,tދ[*: 0 +|"_y~: UbiL;Gŵ:ijLz?ޔQuJ9ĺ P: Ţa],u"2-ʿF|G'n\v~묘iZ3cUd- JkfQL!ߓd )1\ދ?Y:X%_Ue&DB 儠4 Sbɮi0piÂh2|[<$Z5BNG 4&ȝhe̪O0U/!+f4cC2Gx62ݽkZd8Nr~&7W2cЖMc,ts0Y OrygLS/lEY1ӴdA҅3Y\\LCwIN_QirwdV;B1` 14  -J8oHo Ȋ%3+ rx2qA颏^Ff:e'GB,ғE| NBb;v it} 5+f4oH|$҉s4skLldnX0,D۔V`P-r[+7a8?/ˊ%3>ex(%6/F蜬 r#f9)w0IP`Z!.th)Hמ4O J*3M{f~V/cŏ9F=Utss&v4uDbgaȠ_m®8EF/{3kPv3Mkf[-c{AntM b!1d+(|'|ėX>WD0 еB8u$Y1Ӵgym+#`|ދ9"9eYRfP'#<&9߉=r+^0X(zXk ƻ(lbiLKcH|^yVNKL(D9"Օc/=B׮U߂4Tc 5~5=<@3ӸsuG3MkfIOti$s3`qx)”H rI<jذS#=}bZ 1q4^LaxY1Ӝs᠛rD$[q4x}Jw`f*j3öb,tDZo3Mkf{]<3lJ3{.3#BE'݉*yMظ`h~EP9^0 Ns`?絉(hEB7(BwEZ)6RKQQXIɋz/z) (UEg$fyېyod{3>dZV=dԥrR[HX2ӷ_cux:IY b( b2WzUBD,M{q2R9jBӭZ$iQU8Iv1ĖLC-{T=kN V= !@,ZA2Y/PzUŃL/J|4!d^j2KfD< yiQr%Tthz@XhMgTAmY'yiL(i4U蘫-x%Ӝ<+dclmDv>BEK[fg o2bf"&LspN #9LêtEc k/P*Dg b(A1>Չd_2 d ~^&OJE< 4;ZI0Mg!:eS.Q B2g4AdYm!n|1xL3+i3$ɭ7*J VQ )&Y .{i\d02o) D<F0{ndp:zPx$A{(҈dz`zd2g\iAɋG#ƏLUwqӠ~4d?v1$!F<(k8Ӯ],4C2 yM^DR?2Jid2 rq9M[4~{sn&2Gn6}e~ظK2XaKԗL3~H gSz&X#)PTq+eƑi !ЇwH@TM5JՉd 2 |H'D}+V#h $I$5⩐Xadl!'Tb9>:-U7L1l3+e{iP"&Lz'7!aɹxaЙ#E {.}z@Րigg6#iaQ01-T&" S4d)Xvm]ԎMsY@tg5uG7L_e7v79YNQ(bϓ$q@2sk5i4)ߖd6ėw_.ݘ>h5cieï_$2 ZLJ;tO՝lr Ӕ#LFтKcgZVfޏ˷o^};S}L"Ә\tă^ܸ?{?%s]e8ԩ_4dkY`NmدY!jyId 2N*i^u$i]b{tZN(4M @`;7}*](!l?2MsN~H !Ө}W~! ;ͧtr PQM"`/bwq$uqiskd?2 6+\{ CIYp E1Lc- .+NQɈQH%ة~Io`q}4`7c@ʑRK17^F2MFjPUuJ~$[rOИ|Q2M6F2M6=+^L1iz7ƺ%TEm!Ӕ2i40(p4WǢ}VO2954]BEԵ"i4fi&Պ4TڙBşL# d6}G I)IdiXkoF$xi Kkp/ 4ʐي?aR~h=0C/bU7wj5LGOJn>[IAR7Lc⣊wߒ;AoJπ4dSC+v# $PAN9"Lc{zJ*ķC :aܖ7do2 D[mw9Fg4F]T/Y!XWEvк3=`u}3b~E2`W7:͵r~4X[YB)V^G2Q4;VB-mw_ "|sDeYj%&~< ƀ4i!2mu}vf"r>?d"% h:EFa4U2=*Gd7.^ .: J,9͊&&P(H=ma(JidM*OM{څ.u>d:f%Һz*2r-A]bYMGa L)Siw/`h(!Ci6.!V͋҈~,MM iN4VdZJ vCy8d2a\TܑjsQzO8!7➺!Ӝi>a ۅ:t'-d4d\p^mlJnz0!Ӝi<]P!>lC0mcdGJE96dc2MNP,dh2IivA~OI>1>dc2 5C@xv6=LsNYa96P+įU#=B.F':dc2 ސ߳>XaP~w˱Gj4iMDzo֠sG$Yvhtx%zt'@U1#7(&JY^wq=^Т#y }4Q &}L5 }C%.v?TT$/_C ʥhojKXuR./+S&\( C>eWdʴ斴װLJ'0iE !cDDܻc7%J ~` ]s1ž5zKcS8P,~|+޼voJu6ΒsVFԃ~cU_̄+?LLVJ, JdqyIwGԮV VhFP,J6y;}_&6!Q`cHFq_Cg)Y}B旘1rڅqp8[y4"QI>-޾e*/sS(3:oXreD-8ͨ#oa azmHnd8]7۰m#=hD,[G"@-*0 1ApΟ߶e;˔F%I"))tZyrl}^gT1;%C>s7Hs]fB?c,ڰp/jN$.EYʻ?V,y+eM__??DX9zn-հ*"1L#u* inWisBY6./F}=˱ \|g.8|+ʋkӇ %1 B$5~p2*1K  fCӏ1q6A[Čf)ƉP7ZykT[v62KV+ޗa,2t<-k ' R3L#!Wd}^T٪[8zqM;VqS`c&Ge2U%1-"K+ѐSdh@Ә$\x(ٵ04h52d'Raj]X =b I h\e>k$f{bG >1ˍq*Oԝ͊Qph-W y8=ѼN^,kIx5oJ˸Wq6^,NxϘ:" MS/T>qM N1=ҒME9,Z8v |D;ZCak#%SNh '˦Y9[?NMUc4rIz]}-BbC\G 'Zŕ(Xc_{G#hN,3Wɯp-Dhe,4ڀC*n XOʮpىgb02$1q2N0LA<5gD/\GþH%r/OQquFh <"32`*9_Ѿl,E}e1Aػ>򑮧v\hlXFYB6MbRLHiªkzL5^ߜ6&h#/lZ y_FMد2gyM@oᷰtY/>ɁlZtpDlP{3Mdq1j6#f4o@AOKjG`AP$-!#qm[M\|O+ǣ8Eo/Ttη8AF T0PYoUpNlL_h?2s*^M*fSSҠ>2왫ޔW[aTaSax:57cU Sc@3ܨ>C6hv&y8Qm eFfll'&, fUñW*`)&w/i+8Tn<'9B?CO ^{wzA0ww%IH{ű%HAO/vbjqk>9?^MEie*h5/$8a0 nZtNU nlc˨f Kz7;mϸo|yosw9osf*%-%Rg"Y3%*G} 3?ycބ83j(†۩jM`J?$|!FbfUTb+`967b ՎaCk%$FqkYbMVFΞTG9e j&* 9˒JD7{wFbhɦͻW[2aɁ $3_ܴ7q}B#9:G#[vc[x :yf,~^uU{\ U S1(C>X'I YlHY*d"sܜy*Jvlfe_Yn+t !ߠ8k|>)k8OX8A9=o۴+ B|bz獴M3_hSΰy: 4u%Q:F_]4 J1űV/* ZO;a< &e,>jRf_29 p\;9Dm Ӭw1s8<'\ 5fாqm}ϙ9HĈDΛQdb )<9@;X()H(ʙ&FF=%7Fɔ l5=`dđt`(\kph=e A bHY=S\Vt~S>SoI9ǒssz(b" XI]C W?.&V] |9-WYBGƻ otb yC qqǸcW&z""P< G6š@W jDtvȴϏv߄(r+5Mt2&"<-̌ɚ/h5N$M O\ӒG8Ra QzInq&B $\8쎧]$I;JU`;'̡6.,MX`&ֿؗme^8~ycǙF@uC xչ_-L&rGIɈ7)\dH't0.ɰئ2!KHY~ѝ/uG2~9ѓ[n#GH -MM!wU$6AM8؎~j,7k^!lC60 WZЂ >\ 4ȏ8k EPts}QuẓLUyx^nKvTE,-4(f/OwiS1z+ Օf$*DT%5%g#T J3Eai*uۋI,vLoCh!!bELsGQs\ZBqiƒ0ɐݯG$c,_\cqA"Pd|@N"mPec}TPK[F]ǣ ciiUN|EgYhntPf$ %W@8X-!"xAiXQ̎C>Ҋ+|Y f xix+o$rH*Q&'k<<99~?1X- Q'3eKiV!G{(6kWt9$i/@߂ȼz8><3a+#Gp$}4h6 j\/M#.pNy5$)Զsu+2#8NX" cXHxXQ:bcbpJ?/~4!3zv9dL/-r @63 |;6Gk_,E;kNnHIIzҨ1ld}yI,mh|NH3,ObyCBZ>NC](pPE`ȘvL߈:J\hhYm&n!?-(B*b.Q1B ^&x $N=e6R_v|1aK#v?1S ɍk:E#ާ_nbo dMdhV5R+ם|C}I{GV ۔؋[NrYOn EE,:ʦ5g͸\tB4jIIԶ}B<c&,5!E NKEwt?nO~Z6[*x,RBUZ9ȆKiZ|u~=HITͦ< 9{@",A؋Dfﴞo;M I݂R\ (R)e`fd5҅%fCg8՘E?^ N*(Y(2yrmC_i/c+Lvϧ(oMBR (ȧ($Ef0?\=<ƛU]O%,#`AȒ j?4Ex8Q>c4yK轑]p29'Nȹ.X%9iD}u)4-4qZ5|c'>QAN/#I*8A rzz#i,!Mv]7Ou#FsPHiK>4,\ $& 0D6oDWzq޿ Ӭ? `:KheN7Tlˠ^|I_AH"wD%yzs0ɻWȝc ju+ςRhnuԭM2qƃGRS#V`XCxƢS;o(KApɾz :vBL9SDP?p(D+s{鎍>;J Fz27phu(22-#úo]rFRD7ݻTe{$E03!nqN9@W$aYqF4oN) L: P2RM٘:nݢz1 C C ,WHؙH`X*ɖHpA nNUx O5황z'q*m@76۶M2KMSaOU<ʵ-JDlL O2To|ME;-.4>INjuYREkU]Fќ !nоc>יЩ~lA|lȖjHvjJ.r7,ml>uƣgQhezz^hϿA2 Rl.v}ZPAs5cYc !QQ͍qb/|1fK t%y׈' /g}B2װnݾJ{[ b6l c2E'#@4w;1\'<|~RiɎJp[JTϟe%f_hU 8IInY2|*3= >q["H+퓂(Ѷan.IR#'yR<羅1>,w,Vx*k%ET{ST\\]+U?B*oLy[7MhSuH;d #E#?#nlj.[:6ܻD8f>^2!Ǟ. .YdۄN>8:%W>0.蛲Rd֘Z,i b˚U~(9:sY;IȠ= 6ꍩ'gA@H5 \FVjӎP&'! *.M x4wU3/jY7%B<&32'&ɼ]q.ՙi,*{+{O,wDDk"Tuy_  k|lJLz@4v:#QJ-4wzºe|Y&޷,cA#%rd;q4䛯}>Acd+#N `S?YW_@v˄N8˕nKο2WѭND` s064oP #Wan3JqK9a7,Et]R{%BKħs&$D&t Q-x? [|yM?}S~e7]9?ñonvC]ݧ32|Z:2'ӁD/"XrzuK)WCz4Ԑ<_=FtXky:,cWD͇]#_\Bkk5!bK-ڨh 0۝}I{2;;3{{<M=H4(?u"\ |d4~ÿ3WſI=IFi w>apH&A:#&;':o `)f+v'/ XӂEIE(VM^ht|% 19>_h+E`g^Fɏ\{I\k;'3Wa#s~3hS g&K7nTJGI=Ь"ڤuTYx2g aV8i$%iED5͟$HwLw**·¿sB7auuswjΰv7.)k|v@;ser)Wt1c J N5 G <|(Wή]NN5aMzW)U j.TSHܺ{yI/o>0wYt$Acn|OZmf ! ֢l^g?ֆ~j%pBՁvlΒKJQm"+U3lU#@P8 Lu-iHkjU;qG|8'' W/|Xdꭰ4ŶNˍ딣tSG9_˺\,' v#kB0Ei 0gy\9-|u茎dC@kh]QmtGu۶U Z$U%0jCLM̺IYl@.B(q2j2b:BQY _.q}dZn|pIa3N4^fU&8_uJr&ۘY!b(|x`v mhS#nO~IF%cdi1"S 1>!JZTBKm:-#7Y{iǬz15MzG_)=Lnt.un$*҇2Jʻ]*rnDyvZvW)t02#3H; {d@"fm/8앧 M-{J"Z+N"Yב>N|i&R,8~9ٚ,Rj}NS"| =mOqE$s<,!bj^D,)bnHX%M"t l7Znv<bNg1%݊} =S{77ֻ+hOr*SL$gD(?;>_G^2nrsI/` S gvY Cʳ0Y v6Fk\6Jiҏ|셓p[- t BBRaB O0 sᰖgX2S3eJk|{s Q/ vv QhHnΟ8? 'hyֈ%a8&P3s  L&hlܨI=xBbcOF@в> j1BXґ"g m?dU = "\8,EݥAPtnON*OmU*ޮJ٫g AC|uP-jh,O|#I"W KLUzԥ5D48vܳAvȨ@vR2K3"j e9f~0*1â[hHz &'mDa4M:hl!Yu!62o*{j+ꖘI曊4 qE.&U^=5:1:}Bϑ _^ Шʆb4Gn,t*jV>%U7c{b+(o좌>Y8qFMϽ(IC\B.4^"M(yʓ2^?U l5nӒh)[Scm5"9zA~pC "m+tP ~*`2ۜh*dj)rrA&.N%m /A;01ŧ ]Vz+uPG/44iBJ0 +9א~4ȅ$؂n1~rܕ^oG1X05h٭ )(e@ .s̰we;@g7ieq2 0rd '.'u.P=΀ J@aA/z]`9|Έ2Ne*sL7lMj*c۬~"<ɝk~7)4]]N`,Uri Ky`k&!S[g-R05$wY, \&ǯX4 <8ivBUm&M E>[_s]bX*GiZNaUIp$ц(Pk*g:/i}iQ)@Ƶ?ۄg顯mw jG͊cDҋG8P D*\%fFl,fZC$ ANlgIKAhgTzk*?A+S{r3Bl mD8i>OcKާKP`jѺއ6u7ymxM Rՠ#8tTϟvx?ȧ/:$v8ΟշuU-:5V=3gF9?/ ^AG?q+@ye—W;Kr?oMwf@" KMQOʆwG.WOwf C8D/|qy 5:x,+l^NYy i^aNzP'PZZ* x2 :D1u^+4I;RF:MQU"c [J *Co{6 ϳ#> XcD#>!HT"3F9Y4-,V 4#dκq#طC*wWhKWgY6־,u;z]Oy$P s}צF*u7cgʝ{$3_撖`6` 6$b[ ]`"|!:՝JT&EB\* &Bvmg7eEOfR%o!#%M4֭5_ EAģKp~6Rr:B 8(uմ&WJ\\t>eq/n6kN#܂;5跕s|Co3gI}88#"&R!A@Dʼn0Ao>$pCO q~oHM!!t-Po&\j\/2K reɸBh Xɂh9HDd^WY? mp=cy7ɟDٓHvۈ',|_9S6u}@)L}Lqi#b1/ ,I3`eE>#0] /{`piR\b`{VkR1pruS(I -ZMd|B"kG 1PU]j-!iud*q"qoTBCkXq]RLHt\t-baS$h\ I{8,qoe4e"he25f%c,R5Zj߭8rIn iQTTB_jJ H5 DTmQ9̳@EW3E«KrYBE=cT]Ae9D4QsȖZ RvDTe9_`KJ1P汧<_Sn0L݋ڌ7:&ڋ&mjYz#IwջkO adMi@[WP}OΫW 4Qh/ܥ7w @*"If18>i]e;i&VNF= Ǯ) @š'B)z=6j12qh櫜?T  3 DǩUز' +eoOƁx>!Tn(MKPPe@l9MUH m?0[b EDphwpUEI> JṬß*%E(ȀjYq]$^:|%_S_(6b@DcOSX@,LDp :kOEr 1)1z͉»[䓋l`%iу /:&-%,G*:?3sKx\eM*.+pVYg˧ Wq cGdC ̇8~yPPdmilx5G'r| ,.RQfcZ  >,SDXJ\Jx9*B(]el%/ ,fYq3edx"5*U'3є`dlP`Ep$KwZ`eT"=VVe˭^ř.8xQ6\1]# o捽AT"@jNy)&C8#K4"$ලs,R9XdlH+\O4ń,WHohGk 3XqdAR)S:ozCźh:%m)$٠9JZV"؟SSfJ$(,ן2exsX!-ÄZ, )5X{K5ɱ&V#'UM,/lm6<,֎);mo7Z} d֍ZSl]?\t{j%&nZ1EuXW;֙[ b%AI[-YWe.d5MU 5w,6Tl zgVo2xX2[7 Y>,"0ȍue-/ uUk8vr[uPW:s;+Y/9ֲ#[x$FZ>>u,xJI5"e4[qu %=U\ry6"6&9 Dm79QjgF?p5ٿΓSE6#|-ͧ܌MIDw7i>zdpDXXؕԤ@5A &\Uh,"Vxú(%uRJQܳ 4;{mnF^VoqƥwkllٍluCuy\ZFdN8h/>=O}:oQE'q$}#-l."2W#jWz>aA/mjcl(w؆g.5kơY0dMŴNKVy2wS͉V_M@^d1s,{.%dܓ)i0a 8b7=uaUOy,ڵNu.Ǜ66Myzޤ |MK7^NSzLNL>=sJەąF5sR|e~Jy)㫋NFˋXMIέRQDAA042%lx qwubl;GӀRXo޸fӬtܮqgai6aYGNJ(w\mDCfW/ryZ7ik[v_6`@ٶ@u!AE:E}* ,*V$4+Ip:6` gwĩ6x?wguAOWo_ {ײӵg_xvmJvo_uE^bm|Ivn#FŜZTbNÓ iJ-g}EP3yOD.nYtbN1Ù u_oUJIS&E)Q juU=uX;ca$55e`OgzDy -P%:ҕBiitG}sY"0.QD8DB*"T\_Q9ݕTR=ӕN.]yu:Ru9=-/@J]`d3ǟV)aՂ/CCIM {~Kkׯݒcw'=oZTbVwF׺P˷~=YI!G6E#*U8P\o2$.D ]{z nmul98oSn_QTas)1c(9֜fB2h2siD\ob߹|Spi(M]5JEu=vY74$jfHP3$q lVW^[uNry?8N酬iWPzlJf)i Z*OEwRhmޮA>j 9 !qwv(f 'ϑXrvQ-JW Hi]v%@J&. +: P{l<_ՅHP E49 :vت @Tg%‰Cv*XFl_#RĹΔG\ZJP~Ů&R~3Z=JSM)Ŕz9 sY!/<Ѣ›J  :VSM3˳E6)&).CzwVmd۾ J<+-Kv4;yi-OWJ6A$<[C`yQ^ ݹU[>8"dhej`R) 46LnI~$NԳ_'Z_&'?C/Ȍ?% >^wvڔ@wݳ2RrOjyz >g4"E%(|g%l419?1A L1l>˅$nza+p~DK) .=ۏW6-m1DajR'@DWkT*"@[Ľ\R%S'󫟠7z@/؝FJ\f|j$J67hr9;ʕ:$ yQ*琉|.( }h!%qaz,GVFWVg6Vge1F*@Wq1Ͽ}v@/7 iK9ȪPyy2Ց؍Bcc2]<' iğ<{̑~p>曃W9RDVQw!@t.̤/C9g01 M>I}^OKfaf FivZ@vj.ѻcSeb1 ʼn OXV )[1BTGul@ۮe;֌ڍ[+:Ld!Oj1ܬVj׮7Osg2dY@gSu5BIEv ${G(=TAejOɩ*:pha50ug)"`d|Abvi\){TÎ8KfvҸ kH5Ex<85!ZMesyK+Pti29b JN,Z(?Z (, L4F@!}g@j! zb;/Iw]v\.+3R .,܊9Z~\0k\x ΀_2X! Әpj XAt~ȝp}.z5#&\.1z\nx8./c]8o>st2y͂UF C+p Vۆmo9#u :8Sba^pJ J>2y<^WD0D'Hhy rwR )huﻬ=juCet۟<vr CDH=ITƄP$H)oyJ Q|Z(^2c2}6mC<)zYQRH~ػJvs.h,zu:]҂˨r, D2"ONY_D **Y\w5<)f\?xc* #?Q-b ̀%[iW<^P` QU7lXOE#i(5i'b! (X_4N ":|c"P%O)qݩb %2s6)_Ԫ)gƏ:&28˅}*X{c r06q{_=qAJx8u%p5 E::r2p ꏫeYrH*C4ۣX#=GьZy$3jw4E5AIѸ=C+9 LZhڳJh 鮴uKρ'hE0kO($hH_J=(  ^l߿7mKd\y}hԌhNq_7dG_ܜפ NfqC)Qɯt VF1z@`}\`5QLT'Gײ8'KQN4rO?~gh>i5QjY YTR [Zly|zuSjmӭQl.lD\ϗ%9dr9ЦXS{$9F)"@Z;ի25#ghQ71䪳cjMt<=zylXF_=G ɶ|6G:juk' }H {׎Ȱ*?0/.&Pւ}5GY1aB-`ܒV[s[/@ ddCc82!;b>̉B b k1j*:Ut_OvS=ܝ-ŷ X>]^|]=j#Ч7HE?op^udf"wU:^/qf"TTGˏhzX $ƓJXD) |fOfm;heU ۂ0|>S8ыD$_Vs߭J8ZmX|B?=JX~jYRhlJYC*%v2ֱXYEԨTQDN *7:xGN+o%A$s>[TnU=_Œ25rϥ䔝8Vu}Ey5l,tw`XASEu^ɞ.;ҴR l2^V0YyBs$H8uR߆"Y&9]G*`,OJv]ڀ/|0H?D痽A8b ;۷mbIP"L#P;qCJU䔓/֏rGtcE~h"2`Aw-dlw&:U,ޛ|յ&^}JN4< Ͳ}&[>_vl9ҡ> CH0 PQ"ԭZCSD])]q!_"$!gd_ɂHk jz,/jjBYU $0#6Tl@wVQdt/!OIU%p&yPTjP+u_U Tw6+W0ƅҍ^A D'S[f8(X?gڤIgN3mdܦ&V-zVFr2ΉaRK8Mf:fzrUTm!Z!⚶dwڬUDFQ`ݫ@^ a-p%g*iǕqѸիC~8 ^?JF%;Q+38uorx/V2RϜsh)uytƷG̾N7%#XDen܉NҤ O_.VN Yt* q62XӘ jm[@^\iyZDۥv.6VCX xXX# Ir>CibDO?OxѠia Ud.ѷg}07EޑYuPz!m2B䢣[-E!UT<ʖ̑2]Z7S JGEDkT<G&L 3;;<|>^Dj%߬% qjJd hpQyo]na^g궦P9s5\[t*#x2,?W6atuc-g1*"<&v*^< iSCUby H@pciz'-Z ~muԎɣ~lKma)k8NGtMj2y3C"qr~ I;ңޣ: X2Zb#yp.>Ͽ\/5!$2tV. {K\U{7^~z@j&mƑ$q۶KKP* MjVdT !3˯GD1)d6e{Ed#>I ÝDxpeh#fLviSO?dl7&rȖt{[b!^pD؜i½yo?6hZICVHjb(C(cz$g˓fn& BXW2:wSP<񜭥ʏsq@'Z+Db'/6=Dz{dxŹ5_cBB[ y͈kMB[A:RĤ9i)0baZ m6*fq;X E.U2Z%WŒVPT>>q3Kqz" >_iraNl.{pTg'bKsnlN8iWGHxl\΃'`Qi%0e|, 5;Hk> W^s)y";AęC^0\sa12IA*aخ;ܑhFyyM$dtSjnM=3&'DJ;䴀jdeW)x@)uA S4o`?H?m'lp?(_N,[趸f4[Mwhɐ'g"p!K;B[{:!PW -eKT=2ܑ T*{&\NO.rP6 ZLyzb!]thwJJF͝=ptDq=;%͚k2)\jIMau1D*QL2}Lxf=M&6EB!HK鳗(ǁw=X"52mZK4V֤;Ny 6 "Γ"Ddש^Đu0^i;e @ 5ohw]2>r#7R+ycA6R)77q]$V3^ # %@[UkW"ϫ] _;iߙ MvTBy7%1)du$f7!\o>+囘5ۃӚf]#W0Hb8A$JO}ơ݇p;%CkԆҹzӺX1S?A^y-?:aӄ,W:-5+un :7lP}ibSQ4R@.fwΌlda$,`h"|4{i'Rmxn2(䧐Xb@(Tb~-M_'vI.\[AaFn iI`,"Xq"]ze">y"3O&(x^&#F -γO-,&Vo2-냠 jb\$Wxn5A{p[~⭛IENDB`PKwL\Wn * *;limit-login-attempts-reloaded/assets/img/features/icon2.pngnu[PNG  IHDR:l)PLTE{zupzuoup{uoZ+Yvpup*{YyXYvpvo*{*d念XMvp{uysxr}x챮~wrztT}~{y}w+|94J.Owr񜙜B꼻뺸E0봲륢긵쬩zwzηƭ¿쮫|{xts?+*SL쏌tf~d+Z蜘3')IDATxMo@3d0s]GN"!48P>TR"!E|!@B@q\?ob'^bDcb^V>Y; ) ϼMkJG;L)˞\ I<}y'MqHa@c*/$vV)85t VlDOQï4DáG=Zj D ,o'uXc|mas(>NJgEgg2㜉_Yם+0sIp.95 `cUh=x%"v>Ry*ODńgZUH$ABRs+۫MO]aղ3ШLXxLWBHf]*z49HX61Ą,Y6u\rRffȊVf*uNX;BRXB#F^l9 8E[a@bE9 V/?R%ee:.%be9䄕D>7-Pw ;EW/ߨ *bRE-s_UXx kDd+LXDbF ~4 qV _bv*⛻=5b5*01ݽzk\(_sDZh0 z6[|ŠVrDTRѩ9aso}$6cP pPqZ cWl愕:UI-;PXGV,g>9a%P .acgD W̩';0QkX1}3EQjujZt1\y4;%*v$ ēKOwFL#^,"@*ƂDB>z7 AgϠTG{`GjP~޶$kKO8qiJu-VO%MpP$,}lbtOE5E7sHqO|Uk–u|4|JŇ.S 3cg).Akrbj 豎7.נ Z0LV޽pd&& 0>wUNX_@Mh=)a3ΕiWRAC9aMzG֯P5ÈH4)O"$HqH=n)Dβ/O ^տ1`&,O I{kiÛ=҂aRH>u듕\q|C+ưaZ֖V ֲQ晰(A{|l0C6D<,Ĥ6U)0LR|qW\"mRDSb抄R^OD96__G&syǦIP:"\º㩆 7 rdlJ#SOHBY("_\Sugxx[zIK1 Q}nCY[wA `*vK:Č>hH++5_`" ;8'g;G|Ǜ5q== Mm;9sAd6Z$Qt֭ت vK}7flCwxwʼ(O,C%锪a.=0 #;o JM AoEr&f[/L0Ŏ36) 6(D_Z+Hjk֓yЖ `aM,0Y!ۖNV#խL"^+T,:8T*,GΡףIk3 +?b9D̅*"Ӓ--=3DLi ² #uZwIkS +tkCD$a}yyrJ5كVˣ>> L Rjnmp K91{NBXZD&{]QIXE[%(E#@_Z,R|wT]P&!&,"g'ëg6%i/bd$'<{N9ͭH:_6A83~YD]v4Kȉ|;9 amn K_'9gj 8 D<7yPfQBkg5IMXd[[$5,NdԎ`=KZD J[! XΞ<9[,T" V&uV$}ύw_LmK; u wjN Sֈ f$m qRN.Z/});6VV]w2ѯqb8SsI)s!#ycER QBQpz{w *Yf=Eֹ FFpzֈ Y.oL!hkiL]&7v̓\s~` ˨p"Z0NZR^G'lY?d'V4 pmE<Ԛ*w 曰 b)4UeT;c.PϼnV|ub  [ׂC]3QO8_NXƔ~㪊T9 g}pٝm%= wvOO1 %zBa%o²2)Ks\'ZLڲp'/ԉ0%Kߵ(F9|q;T5ˮ|6@$,L!?7mt)%L\"-woT)W(#+߄erS;b9KbZ0B@@Z4V?XRQIy9aQ۔|4ت@ "C1kX,gh^)(TF'V[T/W nbu-9h[iY+]_*csXaťZr Sq .JV=€N<*A`g۩_P5 cyS`!le5VL$#˥>9Jݶ$F@O4g'6au^M.} d LTFQWZ2rsqP(!0&߾VoXN6gW&7,;c~.0԰sʈ^{R54:(|lҜ%W+#!a*ng#l8_ڼ]fʖ?=Ya=n|/sקQgZB1~!tW tz*uJJGY;ČfC'a.51{Y"~fC/g^ uuxDXD^Jvc=G~v~s%70f :FGM\TVE7ڧбjn1W=yOMWY&t\r֊*F) rѻVi6$_)qͅ_L%~R/d~> +ƪձLX0QBr4zֆƜa`sՖ&,r=Ј$Nm5ݔzLC_5BJk`ˠOXGXii|{0q2Jў],-tZ,mK{ΞR\bG.f|"5JOXzZOy՗i'Ȟu-h8&053q}@301";BqGfl{aa`XtΎb2s K-,u4I.|C?֫0,DEĹaO1s h)CetaطύUaEN6vezg^,`XDԫ1,o}>7>>}|WŷZ;_z`ׯώܾp;l JT囹acXiKՠ<NɩO(ǰ9#4G4ɻT>JtrxGg丽LVXa:TX:L2 ˗zaeFXna9y*7r Ҏ ,L] a!,BXkFX a!,BX a!wBX a!g{w8am|ENtk-rHP 7|13٤v., ˅raҼ-U.҅ ?r7n2ʄp7 k l'*R0B,1K?‚MuۢXm%akyDZEgꍰU 8Q.[ kܵ/uR%aeR6)+HN8cL6a Y0!'aůP)‚YĘb2%,wFXVdVIy-u8VMPC9% ja6VNvN)X1#au#4xʴ`ǔ^ƕdWX{'?ay-(6-]|[oՈ,;š3,DR{]Ќ`,@ 8tú8eSV*K{T}?cuʌpiuHVFaTJX:za7,~:0TL6 /xR1\X., K n( º/8kuWCQ7,~NXBpa k8S:ʅJVC<P̅ra ~3+{xI)k.K]RWIENDB`PKwL\G;limit-login-attempts-reloaded/assets/img/features/icon3.pngnu[PNG  IHDR:l)PLTEZ{zXZYYzY+*y*+z*R[juey]eyQ\kS\kR[kXsMyY9+*+y-XY|ւY=X1Yn[:ڴFx]);͜\WjàpXo6twSj}Wޥs=ªhKmc^aگ؊WBpR_oXf\NRbrTWܘcӅ:hǷůlSnRevڟ՛ӀRƬrSv_bWjaɦplZڷڪ/UTrCٳ؏{οe4VVVUUTS|uOHwnLU8K.V}]5F)IDATx1nA `^z(mZU(]%GB:d}"zflk{}lrŴ,Z)-\<$&+ZRSDhzA5}yiŦc]le}9^YoK%-rÊ.}1c0ie`t9IH]B!ʄ20eN͔)pl,>/{j`I<.:"E.-z\KSB-sX[ ӧ1D[Js l]"+Ȃ H!3HM`nRW [Lz@KNSh"Pn4d!7TFHtOFHe Ng73]ߍvAP|4l0dnʹz#fm6ŋG턽jQ=! xwryPGuWRnP3tO\ٝP _[?e&攲be:okM1ZZ]sf&t1Bբ69t HÊr:]ɩcg*0֚b΍_V xJqh313S4KF(#O $N~X64 b>",.EyU 8#h"L7Ӳ?3g_2Ţtm"pĻ&rD2SpHKbVrGZZ Ծkl4tUS "`j=Q_32?|"YσVO-a :r:q<6HdD$y ^Cʪ%7rpb8б!~|{i#3,ܤKK!Ks&0yiO PSblb,RĢF^`ECk̙wxKt9 9>|yדN huDr6Gj+Lp  $5=_dl1nL9dfV)I帪5DK%Ca2}0&Y%)ZV]ѳ%yd8-W_w$u;km,  Il{¸:KCf8%Q=Sc#!f\ ҠOzMEiE#FQL{>E35AS+0{CYԀ ^تnHg<>0u,!gvVg& )@cyK|ЛWDUD+*ª&gsf]PYNaƄ Ia -&wuJiJ%3{ìLrZ {3gՑꁮGRpe;uᡅ%!Z? 'f`L`tj]vMyWkW4|F-Qjz!ǝz`ihh-E3-k2nq5Y -^ۏGA%ik> #:a7dsl Fn _J%pd263Ϭ$6Vm]( (@VNYh-[u:Й#P^ٮŮ,ؔS2 aV{ڸb}ުټN2KV9[[uli7zan>jkq3k>W#ah>@)2'0oXxj e^(jp^CqYOV@Lx˨yi+̶4F6n1IuH;-GwJST[)zx%)R M ɉۼRCvֹ1dvȓDbPvYaikzyx&,귨 {}w^;7F,H CBR9?,hPRA)$aWMNZ7]  "I3E'KqGLw1=kH" K&MN%nGYFp|#PH盰Ŗ2AeZZ$)0ؽY ӌ=0Aed@e܄ʊƘеV*\w!\tc|:RgOݯSG&W |.?o&Fn~Cץ!D]mH/ߞL&Wb3"$b)Dhd.uNpSVaT1q:u½H)l~d:L{Un)oOe75cqU@1kJ&. 8Vp|oR8 `Dz'YBʏ5S :{g!YP(17!d5шmi:(Q_]z}8>6q93߼<1Ec~w$dwV~|Vo{ˍWEּeH+ #Z4nU6EJKXhFh>]R4)" Δ#~k&(dL HȸaP {&uyd2И4J_ٓaiÆ` )r\xqJB$:`wX PHglԛBduc2GJG{!C!wNd0 N= ƵA`VTR((!aЗyvn4~'e/ȀbA#(9V ⱛ}p7o֦Q4[y|Zj9h͌YW>I ʯ[/SgfXGT!MSNtBP55++QvTѓdf=y\gb@1^w{/K;3J: Y^R.J^\&lkX[Uʭ„.^ PrB8{00!k#tz"UɏXb3` &)%!,!_EF ;&#yhOl^X{ Q9;Df˟ia|\u\bgAت!53EriS*AYܜfeVVT DQJE5C,iJK#Yi.jAJ?UAnIk5v,_sbj,s_+gႶ~@ƪOӌSWf9WBv ׉-^9S;%s%'NgϜ?… Ο|xӥ[9p:E,̣ f (axUȜ YZb(.nuB~[.8<{iD>8俪vm5%Yt9@]B*Qq&VTR5O8IP'(3L%|ΰ?^Z7Ə.# b;<>FT5Qd`ɕh Yu_Ak>]-4ǖ/kQ1UjB"ؙ̹]b k鋮 wpFl@*יc竗=vFV+ N/ݜ1@Jx`0v}:84w3NC:AS xLb%DW;:+縗=_}:SSՙ).RłL4n^ѸɸTU G7Rm-*JB-"uJq.,WB4k'VBVC5.S7qg7V{=衁VA"P|:tEU lw=QxkUXld{A9&&> R5e b9]HVQ1R⨿:>f[!$&Fա#,- 65$rղ>bF³?xv2ʧr)䙾e1֠L)Y(Z4];IEvkA|bGxE`g rt;9B梈ea!4h4=%хFaͪ.uȪ͎Dq pRlYy2a,|6EF|\n8kU:+|9ɠ!# pܾI` uRtt8Y %!]b82ZI(Ϧ ZA&L:aSe)M;S)֜WY-og*.@2:-q Y+XNKх*s Kq'0u]J!9LݠCK4`mtϜ5Ι hP$^U={jտwG wP{.vcnPrd<4rKF޼'W-baEeԏa3o/%Ps}8k}lk6j>A;TS"5ִ)׷Gn; `= ^€9pYƭR4PDoQs\(e7Im3^nYb˿⦥tu1ۂ;}B5/cv˦Fv>}fgWhldЯ7m2~D$}~aKʵIWNJ%RfhSZu7̝yNqC,4OZsquނ3,=Utm -}'N 5sB`Ti4P jqMKwՠ2 P`q7D!lpuOC(;ྜྷ3!{ ^"9үcBafVk|cpZ. u9Y:>4=&>8Dx_zTEG&wkQ;HA`3PQ`O)y ,wt;yGz/޹S~ͷ~nLȈl1t rr $OJ D8 s<蕊MC29:~:㜻wKJ+~_B*TY$4w:]xٺ,~;[:'un7~􎎘GN,ک384u FP쳺$oX٪\T9qFZ' \"doQ|rEoJ MCQnE;M!:\5vŕ5ݍt fOc[D$J瓮(%YNX]:|EelgoήG* ?8ө^议t2d2AF@ &`5EE1\D㖨}_y|sR]uVf/w|;?өx\ a뛣CӲ+lƃO6/inSBS#)yhcJ,-T Nʡu&Q9khM` "ׁa̴yDp3xNLo7Kq:WQM !XɈ&S/VN8z!?c8A7fD^}dGT-tN'VP@n밅 "L\kH'mb1j%O2`#6º28i\qK=eb#t -bhČ!XGK]F9B)8WypYkB'!M:P%ŝt"^o\bUNMB_*5Ș2KHiI\۱8L) &{E>.m'f%H0a)6f9Fp9dL{%^uZ{|J:1༷H0Q2asO,J&nGa}d]&_\gG-[XݓS\ճuCGɊB,4N*y ~ŇAdJQ2Fu_v)4Fj[iqu@ X4P*V.ptMWy^6?^8ɵhrɕ^؊ގGvfr2ݬv(ٞwϩ/MX:DnH]r,PoJ .Y6W$.=m~ xE z1^?~xkUӪmn`IՃ NesxoYΎb G!@Y ;W8|ڔuV`X%N ѕتn*īN|H€"Q pޛTb.&<)蹋H8-x ˖O$&Ek,Ǐ<$\8#A{D-i!iG+q٫x(d.G 'd$/%bBl>l\Ty rޮcdܠ=cNNI NBY,VԳu~ZoVyQY=`#2PU+3yjPIį]|BQZRO\%Gg6DhFXW5+n$mv`w¾,@W0(Z "+0"Y]LB#J{V/k`߻v|= ٜ1T<"|1ujbʱ>.]8tu`+ŀZ#;_ =NIt.*G#yN#O:c?DRhۇ sP%+GCФ&G_̂ʘYWN=IP!MSz׹6$SCLXgȿ{`xJ[(!) e`öEqǩ=lo :5̹Vr""LS5I:=I&vfg20p^-V;D@g[:c:,"$x)M1Lŏ-s'öx1IPkp!U:ot3`Gt!qш9Lb9[T2sKm^:tGtl8gV{hSefcJ4Ř&;dύ!Kc-]#G9!j6藣Wet-G6 Hz!$}3@]_q+bK.c69Y{>\d#߉U>c|觯]j\Cn$-8\EpRD҆LOĮ=z]TTS{!L=#/KP[`. sbM)zB!D/MCX쯙4߃p.nEpSM7R ErVMF .֠6$\6j?l;$ qbOIfGDyjxpN$kK:Om#\v,L9*B{ٞE;tm.YY+Ocz|#OoR1訁êichxh잋įf$( %̇ǟ]mw-[tKט`EUONm zo#yId꩗XI~M:^6jԇz N>TpQ$` Te B/mȄY(RF+X xxٮhx)Pew";yɡx_\^ ơ\ߊ@w׏?2ٸq9'k؞o#I!UsU$tѦxgN /bJXx6VkQ;1V`G0eFg*S3%(YjK}8nF ݯfyV$ٚ 91ӧיřc&(r`۟ݸrW޾yWra}h!MD[;16YݶpR%,>~p:B1'p[ b%a LW>Hh1W\0tኲ.l>'MB}>Gx>KF aX\j3Y3'r?1J`|w&|='1hA9 l?Ád'@ A"ĿIg/ 񱠓S_W, Dz)%dj-eA H"9M G@ajvK(CeQ$ LrZn0Oܖշ[]ŞgF̜kTjofwѯ7 &S`O 0s`v2"dj|ȄEY -&7QNa- ծjnx˲Z<+ >^'_j/?tQLw&Gbv"rpqO^ݭ<CGD(9^hSNp<3"Ncjɤb2X8ESp@1VTӺH PyjpY;Ûe1Xep;3ELLHLZ,2{%/@fcخҭBcPnơ p &mV(vxm9n^sf1 Q.emrUi>*j^Yim3/Jp`^[2>d+C? ղh)J0gFЛDpX""ϲgPjNX bkhDh ǂ01)Njpcq퉓\s9eנ 4%_+Ճ{m^tۏ; cs,?>vk܀iiW<3I< f7(ئ\s fOvOC]vELn/tGbM=kGUU"ǎ28DE[D9ns҅ pSÌu Ԕ'[BRJX d/G⋱ٹ1u+#Gnj\Ǡ/tt! U걏Wޥ&+f RI?[ītʀ[A:[m} 0gn? ¿S^0diG&F,3D(DUf[:5.dOg2`J%^ua# >mAU shGo6Na(kr[ix&O S7`Z&Z}9KԎ1/ٿ=EW(qڟGjsk u@=.&FC5 IթӃ'UhC!XjHY;-Y̓/:8Ou>30s(^3AJr\ʋr1'%Ke. ?tFp*)fEt%v8]A7l"v(4io'd=܏8,:U3aKZ9a-ǐ6] Ѵ9No<=%Ai7reƜ*KK̦\5,WӢ4s$hǎۊBB%`̭Vcy(XtS7On]y4hD~zm&rJ؅]LV*Glp#ktj9,'D+1(pIM.ұkxLZr ]q杣 |~^GGuUeγ&u޼B>p\ܺYI{@a Ň;Zd`s/WǦz/}%X;Ŏ D5>z`paEǏn |ұ F ?c֦!s%ByQyIum<.a@PPC$e3.YU178ٻ+WWCy wNjjpu+M1D p Md1O6Y<&bH0TˁmGc~۾1aa0^%s1wj5ŝZMj\o%+fek4!i0fB/P r<4Kuʁj4Kd`^'fQM Z9ITtIeBc0n=81plՉ@< dUoH[Chn:9wBIi&B >N:{uY̠srZ<у#8%rUG5.} )ͨ4LIS̃0_B˄pPO=g^`f(Œ6kmJ !Ӹ5;+7ŋH FՏ Re&zqV(g=&XZb25phf8g^X\s󅓱 3bwf$/z(n';Ѥ= p]s+訯,-tX߿^^M)r{^3QWLΒ04̚H1zZR;b(zmh=8wsMOhGB7p}bFLb ȲPd2{ ).ܨʋySϲ֪E>ei+_01m pEZ_j3N2V=!oXFYBOnE߬oaeL[W#5q|ңg2d~ e<듪j38/A鋋"PiNSJ35/Ih o 蒵;/H .=as^)$k[}-ׇtt0`Ԝ%ԣ*j,Q{<&Z !ecp/*F>Ty#X<}K~滷nS5v]nK ߾,Hdn!ed7><5d9XYF%DbYO|m|ADۻ\_MRʥBi``^97u-c5OxmLs4mi3h6u/36+vT%M$2g'g:ƻȵ0+2B,v(+&А=-l9x> p<3@!!ӫ# | qNf5\HIK1Q犙঵sEpg0r'Un5_p8>L '^ o bEnprO㕳o3q!|5B-%63'7?:bVzݡ<;NØ4 |P{ }ѧH,.@#jBuN+@y6>988 hL|ct[![ =2 7B0l)ѿKB.Y/B<ٜ9?,H@JNZIfͬORk BҴl֩Ţ)KGYS14߻Cs,MXEN,wZ`IRĊP:D^ÿL ,q,;U87eF7q""r.KʰSk|SN ۰HXA]Z=ς@/zy-DMEގPo勰=Ld`_&l9zm/dy#PW,!`p5d3d݈s]χ'xXE8 <ʶ_]kuMvw&fvff%n"jQb/TP[F,}QA]"__<=r#ivf~3fN| RͣLgRZk6E3 5[CeRN#!tyWZD-zE\s5{|JCZfdE RA,l 󉱗3k% Q̡LJ\DעVNyuSyĚy3b ~iC_D> HsMǕ o;5#&o&ӽt2%Wkm֠gUXYX$!aTDx1#BIj5"g#"b~: v4,ԙluܕ:aiGD!fdU;y}{ϟCօJpgO%|V xpEƑ C;иz.O]z-4E[-0k=L٨V&;S&tLU2϶WCӍ:I> =r>^ ɘK8&-l A]`gq:-nkFp*;P߾~: vn id#dY;9epHQ[SdB^M]0B]F:X0HqkPji_)%;Rn' ?sp#NKKi5pF4@A> q}T/uvL[zάSLIm\j:aT oʢhn(I?gFt/N: \G)-VR)-CB(*N MrufYR4ܞAb.8ίEt1a0:*i綺j{>PIJڮ]gE,PQ"OuVńXiKGJ:;cF:s;֕(o E\9Յ-49 ]~THIi&sceEm(6%¥Qku+V .&0κwPYx蹤v3upM=Tӊ[ 8~5xpBƺt:e5og.Cll0xW U\2T5 nFjZ⏭Br8" d@D1h!?%ɩ%u4Oo6 <{k ƻ#X8!E.Q̛.~O4\0܂)JF# CA8C,$%dEչkBեH8y*U%.Y"xh|E'k:vٖv%}gGDqඎJ;8+'vʶPَ],=*oMB>@)"~+!]fM@R)+~KUGOLÛIƃ"sa$`ǷkUa٩$lozihJّyvo-еߛNKT a9tL;Cة#7Sﵞİf͋.̱S8T /8v0 Na$ fa"x ` H.E93!pKJ$$t]GHDž([ a= &={r5h@x{k;PkE: %"DMױlgY@:Oh&:'g,dpNP6Fpm)2τ=B 1kADK]иĐ,  Scq;]O ]Ǻ_O@դ~׻A 7cHx9_41~iapjI^ 8LUa^u%GN@n']ʀYPRҌ؀(/62V8YK[L^o1e=jlLW.,78nT$c(I@/)WlBz.gȖ&ܫ/?9'K($ OE ]oط4Xl;ZViBIPb?aT1%HMǰ %Vw*<I.RꎍJCĚ*z[x P"cI7ym\vWgh Av 9!CRk?,PE'.Lϱ̈́ژ;$ake^(:dԄ:A:} Za(I.'%mKޠpYgN.9R'b4fM?|wiJso{g P1:eAQy)Jh{ :P-o} oPY5h, Os j{ۢTR_|8Lq8 5S9}")m$.ƍ1%Ns2zH:qMҪSn箠ݷVdՑ]/x~VQ؂H%Z'(&<]55[^3[Z[k?lgJ]߃ܧ"D]:`˜잤.ԁ V-擣1%NNVIGJ[D KߘDyPD#Ѽ>ȁWbB;>˜ =&I]WުcP7͆c iR!e?)t筲ܜׂF#(Iq:'ǎ(w޷(O$Xc-`1 mc +ˮaCMԞ{ ?4:nsUG~ޚ7[ E+w&<下ۺQW Mr?,*mrnIFPL\ [CM m-~9v&9ȁ(Mbt)u+K'7IuU)aqȵW4~R6PļI}NA]hvp @(Ǒ V:cƱ41$nvԂDB΄7_cK|o>f$G[sVEid'rձc񵌯y(;{^ᙍ&ta O9w{LO6R:]ӏ͕ +Z\d"vLFW{lR)f ?)[tׄmU] P\&7',J(p/IY}- wDW ,HM>bՊߪ?{hI4܏:Etdku=a|XPyexEQ KٓO0H[D|3!=z ?ǘ?`Өy <ȓa|GJ55B^ кp*3MJ; ~{G=4 bىá 0fE6r1e\Hk/fi흈^Ys HJl[H13<\!67St+5N\fզjvmvn2x7UߌveG~mVU7MmvWI"g5:R5 ZOTd'`XN2.xAaQYnR'/W-0ɩ?WkAm# w%\GK!~PϾsvVݝSn}pUTLOO7A߹,{3[z@Ғ븾c v7rcp);FK3!`?r1NAw1챿?ŵ2 \#ƅ9h 9_^æn W܂ 7~ ~^,m+PBqSW]I}ҮlL qrn:yJd vDX2/B+2&W+kS~S06Hq:DL|B$9h" xo6VT+cG^ߧJPxIb7~v~oVyjIPxIc㋕,^nXXieyw#{Mw55 [M(&)dV7Lv>YŇ$żxl=rnp{W& soYa` (XE*\j Օ,\KxVYz`ݸr6:RW[~CZb.xf.#jŐ6 ,Y)qyNFL{Shr' 0.p K4lmA0NQ8leὌ = ""VM Rī341וږi?2?.Wh=.$t58\xQB_A^8l F/G9#*NDpkEᇙ=:;8 qLjB^4WSiY~Fn@?e36y[na)Ԩ#k켞?<> %h3 V F%ntK5_~|HEbrGg6'OHoH҂<1ܒQS74dOlL s 8w9`( b@sҼ| Y΅6&UPS}XJ,*]_\iga#aũfzW5>%ih*GHR7fb;]V{ ʲͥcOw%GNtLI"ȸexp\[br970&A.lc^9#&a %tBf|K =TC\Wլ|cznY%_xR)w~%ۭjf4Ѕt.|1QO]ʿIL, ՝mR9edFZ+ "f+0%? Iv[P~?ddtca (qc7+Lʒ+N=VW{/&1~1͵b=q>`4 ۀs|+cG2Jo rJM%+ ) ҵɺkutpX1~M/ $|F-a7<; A'j qH/LÉ0-,C͗"xFc3 Iõ Y^O.k-yY51Ro*cV}lYgV| #> 7pq) O~Eg0M#F$'q3> n Kj7ubCF"|(l7^;}Ccw:Umfd$`e])Wxž0ʝpuXE \љaquم_qē :oƮ:fE"Z!n]by=:oI}Ǿ*06 Eh-tb]LUքr-:ً89 JkG5 Nd4G+-4TF&vLxyg0`8==qf&is(8}+aRÞw5Z`#M{}/S= 5:כǎPN#v=S6a[EN .|Y>>`psO(0N9dXBIv*) @"5j2}Yq5h^B,C[ m*@O\E6)g2YBZ *BH{AO:$vvS6L2F_V8b>u![%/izs-GȸR-y3)x٘ݍOltor>L[-.%? veQ<\sal]{\K{d l/=Yʒ"HxPByy@^93~c,{g|gٗE糧;rky-t7݆0 Q a0IR\"/f9&ovYNRBT˟ Z;$k+۸67&`pD0Gb^g^rq. (0~t]71s$CU65(ߵ8ҶJᜍSZu$20DD}%vuq jY G@Cr<ꂃ wQZoqUgGx1尙ˣA9;~Yqz v~:(|}'cS{2VxQv޷Ʋ ;(0?>ԐNzT-2Y|u_Hc H>f8p]f.?8d(N`3-:75UÈ6v OP N YʬR0OE[:#Զ/TDyYEwߔ?:]-x#]#~gaod1רyHuΎ?:PSSs;P85`nF6VJNhAjrN*ɥ0Q(A $A R\AmZ}Tg . *Gluzf:T&YJ-)}9׫ L9|bk"mLӢ%t0L+ud4c0en]3zSʋ<(Ex?eP[!!j%I?=~1͟ : eN6g_ڬu zKsN"mn.%B# BU,;D :rjtͰ~*-!W"M?׀ک%$;IFo4N^~^ge>6w tr4zɮקroNn*EK,UJiq2baG4 7Շ_qy JtEq0$uTqI3-4G ck*S G\T.1Zxft>`@xwLZ% @R"Wf}Kiq7'h{ahd E ^G4W)`\S(;.TQӔJH0-NtUjH9 64}(&%,o wFc!}!kwy®;5D!|IƄK/ywɣPMa~pʻ a?W969=>ޮ*)쫨ku5\b&w%X8PP+MGW@޹`ZC݃ÁoKO&^>gA P&_u:ؤ0*AR‚ ,""HOifjW 0y]= "Ǥ"w+iŰlv[荣|vxqr]ƭ8;2XGV8 !ಃw0t-[Š4fDQ :\]A.She``Q –`8h%/Y8jpOq(YpQ6MTK';N8r ؞7Oބ9(?`r#+[֘ )a5vD2:%,7 \$V@Jy)vˎkgsF@qqu}}iA\Y _L^,O,$}l=30| ll{f8Ix/q4cq ޫt`Mh @G ZOS*i==V3v5ļ@y+FvWsNl pVAB̩ ˆR86֮\]S( PBC^kUYn`ѺIqAatrBWzM۷/_lfm| SBf2 :*Ah*|jeIH@I܋\6,􂚱 q6qv+=kipp7k;> P*ҌIBN2f0C IMGaDqbʵZ?3\-1)n$wT#s<)dD[3\~$?Ӕ9Ef5& ȎVXF Ыݼcݞ9%βjqym XQL!)Vq@jfK[APt@LI޳i`u #D*dyAąⵆGkT6A"uKTۇ;sյܢnvir jV!âMU)]kGHm/qVIVD}LG%]uㆡFHBԆC99ߡ:9rIi 4Y4ӼHӘ XKѼ*u+@YV_T?-ŀWCWħB^|*Km-c"rm0]'X^0F2N OlgYcޝ̑).݅}AQB J)4FǨv-$V1| m9k򔾕78}v*QdK7je꘭>ZIb3o2Z s +|sTy%N79bLCqQ:]!*Pf݇1LՅA:)AYĺ5] :ϙRj(س簠61`eA1:}E^'8aGQ_6I],@,DEZ(HjMGV4aimZ.H EhΡLe(4LM b3…jĂI+3$㕅m5v{KC1cwk;g8lhL *-K3e AmVC~+( EveʊL7Sôs[1g+qCz+ŗժ\2`:)s$dc3uLš4DOأV"Er1OT8S0&VHw4Iw`YmXI.t`/q^?1OGV;Cw8-R%֎tviMT*(Q+e:] Ѳ@>xt03'<}vd,_큸 =bΠóNI.V\M-ƻ3RJK&b"4s0W#"Ao(/%xsC:I{^w'ȃKMͺ6>"e8R9{i8bՒbT0M|G+uch%aeHWy87>j6'_fȎet*#;6x:9-,}O|Z΍FŗDW3RO%iOxDiC<i'izϪ 6r 6^p1^lOO1m[]ww%rU(N3xzg{=?s$XLdHJLf3o1)UКlq,kՓhZvS1*l fTW8]¶+ذsב°Vnu3BZHKd 4UHN @£ůS.;mt׽~ qES2#3q\VT̥U0M裯[YxJ'Ӷu8*On JlVVZ/_|<;I]rlYmXEod9 Uїyp8^V9"+n ha{IP8mT_(>f5x9g>73ϻ/Zb (SߓtלMcW0*He IX)TVpz6U;R1G?(Qd|{\OB>c, ZIo$S˜N9ΫCrJ9i0LG[Lu[,z0v  8JΩ Pn)$e..U)UqpJ~KS=GKٗ́Jٯ%1Fwlr`Pd' Q'ˮMA1B1/@dHKqz zФFb7T0xI/}/b$|I4μ"Vy(q_\L To9 *rmK-z2WsmzP/k2E/B[p7m{#Q7'E(AY?(IyIs*/qrEn*?%?<$BWiTǒҬW+b6oW@3y ^x* ~JS}.j^џG2:.LBT@髯<!NE^Q& NCFܤŴt)1<$m9*J G?7¹~Q $X݈C+SG<ü ˪\!UsS*1NU'^y!S9&EC8B8#X:O'r((*߃iP+N:А<&6;ܷ 5QOZ֖cLV1BtUJM:{4:M6UjȡO]T9ҌN߯R*ԌCXWh) ]"_nG,/A`H40kcpDOv:PUMz^dOjpVѫaV:TuP=(iR$8PG>>* u*Ʒ+GBs;e(]|Y蹬 uw,s?]@OU-)iR-RPד fY#Z߽y(n PRzᅮ&y;aujո 1̨+Ŕ=SQn{8_,/AtNät~KuH[Y$.tcU`eZWү)g+Y %tioD8J>k,Dr:I0/={Z Z.SK̈JCpĒb]D4@?I^J즜2zXl Li\aXRZYJ%X!vܢ: UP jӍy&I?t.eY"kw 3Y\ޖUB4>"j69^D7wǩ*0mƾ4+D3H %^U*nǶ)a鿞_|bm"U[ .LL*;rMMԂ]**LVHVNf*;"BN}Z(pwmg%87 I$'=WiU~^:|5\;L5@C,d\(`Cp^+Iy=zX"5KWI|Ȗ"&J2-$91LB!;h@W>I*Om]ok 6{V.4LR!|:bAc IC*.J=:AV. O˕л}+WKs0kRA6{鄟N af&~pi20 !CDd]j;t1v./0(?NWQIs罆6'%kf%9l$܌EUE* 7#^M@zwQPȖWPAyt1|%o>nCҤP&n"v)8MKٷbYk(Њ^P,ޣ}`y)P"=.hr\A|V -&Tp?NU\xu(*=i/WflPar]UISaŜ=`AV?ӑ 댏ӠfzVE<5TpZh`GKPJT2;s@Ac5<`z@X31C+ x堓/_7;/(ݫ"5W؋^[hˊ sfOP;2}-f=ZtI8kѾG祸y45]nѯ9Y8xy6M Ҫ_sH{lh$ʠ 5j) r%^U *-ժ 0G:=7mY)it1Zup/'G* CQ#r!LBtm`.,rëG~=? Q3̟?)Se96 ԏ{uA{zs6ag`ː4mos2M;dlӬ39A`9ӿukCP6͵?t;s]$wvl$-NW9n"j' ϰS^=DNE{xXnA[W_G GICO=&yxS}C}~:9fHׇާ5#sntd5V /n,]UMmmF7Sk,i9pY/)iw$TYdzmPBQ@X+ιû^,H3K{l& Pie^}ذoGDKض\E6._}("62FUe5hhhUGPԃDY Dn%5n`mag[e|eTu(:8a^k|vf` (^ w^.;3Vd3jdR%þ4Zl\cP;0a*ܹ[ʔuD(t^V"+y;6}SP9i<8Iʱ^iVмEfĔ(`Un|Z9ϰqoYPSOQ#٤hfq8*aIRnBTZ]o7Urh ]o*ר9G!NA}cO̊Vg$4XQ0cl(p eyYϬb$qemq ꜏cW]oMY$tHM:I.x)užn[hWjj haRlhLB}B3E@Gۆϧ^y{xd[$%E`a_ݔ\Sw#Ax(%axǭ}?G5۴f/TG 5EtJtvyQ77_ˢkɩ]$ dxy^8 3)~6TK0 P. |8.d_aYAqitW`C,֏NcMzPXME袹(28`&(SӇ v@1{_H^L*lu.Ҍ\2 8*2y%2FHAc+6q(Llp%IA TI0N(Ca\w< t+]=o$EI)Ѧ+'!9/8SB ##."HAz]z*CB5r}wOQ}l*;.!WQvٟ:jKdGleT;WY'"UYe+OǹyuxĚWp9Exۇ"88ZOT%g'"8)!Z9!Մ7-^cv+'X>JNdjlĠ:W^ٯ> Tii6K'зDp8oZͱ}4X~]o^֖[K  ^,F$%!>IDfR!JaU)R;%u I8)*uN<|]H[wKܶAG8q^ ZpJIв  2(V-q "/b12*VbAXP !>QI/1 X-CJ>` 0`hú/~}O8EKs0 ALܪz.-X#}nf0dI?+ڂ;W@z+׺W>7 M" J؊b^( kn Dj_ڳd8p_o4 99^  ]""\<{}||Oiy(5TSNpq“*@z9rSym* O'҅ F[5oH׿pH*Gu2zGQ+Hk!%_pᢋfvG`tb{w` uがI箈M~0W!F&7bJ] B6"vP/K$hXE[ef+R~8/_>O]¯nU>R~eW&$ 5Ă?6wCʻi8wϛ-e}_'/фXzGLKUqB/Yo "G,ϡ_pu>7nӿY3{hvwcpy8l,!d sݢ#'7YE#9'v@!>" p]4O֓O EW_MK2SrFߞZHYDVI t>:U/9#1c笷>|6WO [pDi\M3ۀjǫ\ifѮƅ5Ұ&0!'YkRY#ֵ_rRu}DUƔN5ӃwHV\!;.ǻciHJ:4R%HB[cԭ w6Zo&#b=oh'Ne[b*r|j5hu߫k!~f>'. fÎ!"J0{u7ՂQXPii۰^`y8Y2'd͐RdG+Y醖pH Y̪BgCbY:R%PŐ_4-M/r&S׏B*Gu\V[A>%̌ 4 7 oM=}8,۳ P{AՈe^|l.&zu@)ު9܊P[W U3> `oL޼ 0r r y_ I[M25^I㎊+Lma%G6 ?Es ]dWQB>Iy̑ 9dbK),ĤT@ CpMBGԁY_Ic]8(1f 6/ qLӍ.{W^ 'WSOZeʶ%ަ$sQIENDB`PKwL\ƀOKOK;limit-login-attempts-reloaded/assets/img/features/icon4.pngnu[PNG  IHDR:l)PLTER\kR[jS[kz[es{ۧy𤩱ꇋYcpޮXaomuչۅ|T^mblyаī~^hvfq~tt}=J/IDATxڬn1;٪"TB UErztdLٵc`ϟ􋥘x1?R&_EIaN&QMU3NaUC#bE兩^ &c_0 2[J|F/D aRl*rѝj-܏^n|$YVTѱ/6" 2 Ξ/ GmDR͏iy1)[K! v030wQ9"> {Oa6)`m5ʥKxMMHE6<:G$]0A5LqDw? $pVZg$qR@ H*:S^uN`IB!efj0.dQ믿R^[X65ҹ!g|}C|B} ]$wd1cXvTV/CF2SKsz c䙢eD T:`};l3]eJ,ģ~\rb=(݇ڜH^[ L$%ڀe+9v];S ni5rlT~,^\`$X, `Bkݦ_f,G)C!Bo`Q (JzތB1q!!XaC0F&[zL+LTΤ0ϒ,f&@1Rl!GqQ"D/B= to\!.H4bdQ^@.Ma48kܰ[^*F$EwTKY^H$(Fk%Z4@mb$e ԬzlJx ,c;웸[̄f UD?;>T _cnB﷬ӡP*m`RCkQ1A(7)Ur`h01l1&z=\7TTi: ާ6܁@0J$U~/ElLfV'6U,r ;2*@M>c4M,uAS=*qAC*¬;n}=SQs=E3Hjnbppn)Ğ0W̧B 俯{@(BɅ]q_p͍b~8IřAࡠi$lsw tt%!9K Ol xfWuhG%!6[  \S (B3',wnr; ԛ՜<7?{|Ō=ۦ~JeWa9zWURK1B0)pHFcÉq{(F/fj(~n֊vs,G׷=䁃aܣ>\Ao83+T'uWY 2Lb9F/{0EhSZ(BCC 5+\1LwS@t&Q)u[V>JbP$ߥ<3ʨndz$1my.0V%&2.P szWwz#lO!qaQdX-TJ ;,C^G;e8oڎQ=HӣQ< ?0٫{A_T"CF%\=Lg !i :95?#k+@˂j EqE-VgR) ,w)mg*ctA5qm Ҕj/eO4 Lb ňfްʩ ,OcBS[qK_6T Kɽ?3ʗ6|c2Ċ+'L})0 f3vM #Þj CtG.m/2KFnUpcu]% udSRx^u-w^nE _Pj/2?8v,0-xw4ҍTn: wQuzys40,~!!'rp8o)U?hYBqn JR`ڕwT8]~_ݱ " ]kϕWD ֌MoTk,x7alCS"e $BG5+y%#ӱӢO-Ч%6u4%c:" {L1Mdԃ>*2ng:QUXX|Z. C3PWjuW b 1 \RX&}LU=}Gr$/:#KOl %g 3ڠtտSM5 @ 58"eT/{l4;寕X|۝)6x=B$~6QO?ۡӁ5>OX*:ŏbk퍳o~2{N|^P;'"Fo^5pqoE~8ElDZ,價 @j %`Ǖ::JIѤ~ݲ2czPVȪb4С&tkbktn!}m'}n }ڸ~dX&F4%GQ5O뭈b!Yc_^in A2P>߱`ݘYe:Oj8> YORQ5ֱ00,#(<8_NGd-x DW1fb"¯ 7̯&cڮVbu3}'Z+TP\Oø8Dž"IFL!xc$ݳII9EjC#~-o+_qA`K_EL2a\Qf:I?X{^ne29PX"A\P;up,fFop2ޅ%%(T$1P|O2lE?p8vz^nogse$^ ΕnV^S⊷ 0.WR ,ƤAb>rXpN6->kV g K w-@%Vux]^hc=}mJA^W=v͟$nڤCy$wm0V:5t=Ś^9?]_j} "Z2 w;ox*8$DN,hso9_愢qd'}LjDisibXQD;>h05oiNP}/׏_?}=J50"hIU$ձF5I`1dͳ QwVa%6̗eD'WUK:CiB}: L8_ Gglk]aVpq G( Yz&TZrchm Da0 Ziq~ ELԳs-ӌI?Zu[ 6]ؐD-'`m+rB-@ 47dJbbTl$&qsRFAqd$* 4mp&ʘ9EVmIMdii1^.[O3\%kY7yc. +C'aX<;# n6>$Xq4-t0 tNMjpOI~9< j$*-x{ԕ35ז'LOx&Zt4u(L[P9i6\%ȆLSOSәA>jDQ A]("\q9dڹC&ziS>{-#ak p]TsKqV)fLڮObHyNK2##b2!&e)-! qn|7w*x$ܑE#[=#=jDITeL=Xhd"D Er#)?^> ꈵO(Dyvw$R&ǧh0ޚdk  |bhUZ7@dkG2DfOoI~g>^Tj\wV(b[vGIm ˰:(@XH!DnJe]L^mTCgRkkpQތ[=%`4W'7W>{yz!xZ[(,_Z Rԡi5!zÕeŝD>x6`M-b3I.'g]24&I.$W+!xa5,CZg^Mqڨi;no. AV' eephK;%L7$"ĆԩnvjݷF). 1/NrVFؙ\&Bt8PKԣJ} ^\% 1 @ Oo^@>k*S=䪠T^Ȏ,'xxP X0+x-in={(x )O/wYw%RPgyvLgK4x!iKcAe8Zz|ӪyI29SE ѸQ}Q#09[f\l fF).H*~4ŶpATN%ni]S-̏\(-lYCI+]ci>9\]R]=V/@2HT+2 |xkԨX2^B) Ac'77H6#<#LO_ L㷧l6s/KatjTW~s]|w27/:1['nșScCD"_1"C"f1B7*`Sudyt?, 7v]&`P編Dh FX~t6G 7,'k= :  3AZ͌jE6Ϛ!ҝ'j7pOp:y79}mXw?Uu]V=vp\L@ꨂ<sDH`>IC R鏡-ED*لN K~mHh4_-) #fCF)^Pg^C1k.NuŽ|>YX}Gbǔ'buv+;jΖf24hQQ雃R^P@d 0fj-IV8׀:{ftSPNt} &Pg֓5Wi]Q!%3f`!g?0]'U+mrB"93 O-sFH=n/lƇF}7'R >mW'^gȲ"(`R|7m2ſ \Y``rB)lmFx3&lSbTFӭF!*aS1f9)!֥lDo@Ckq;Ɉe DL%4WcPQ CUk=Sޟ' U`W6Ӵq >~~쾡OLlsQ1ǾBc `|݉6.`Rm|oU"?<\׳9JSnؾ E̫D=5BOR1 HokB+B;4hX oͳ>`2rqNRA7N.oQNq5jê p,f=50LhF VUT+,UF)d(D{YJQ)7XWLW&\`Ro+ p>2(Zr)s#EP+hwI3 JFe2Z"M$BU3ZBiEFm6j !tVHIYEZ($;|q ]AUYDkF7np:i@K,mJ|+xKITS0+pӱ?۪M;÷xy^\ޙ< axU*W<@/2M Of23{̾:oK+FOqCzZ@!QZ%M9 {Y/b=7SzuEޤ&4%o#WC0 )!=1 þ:qQtKSN 21Q dB?*A"Ӝ{"|RX˗{F48tLh )n uT !0X–I,4 >b$ܧן?tsf iMp& 2IHeX;r|xƂѨZިjKth%U,Q")$:]Y)}f 8>d%p_u`gZMJPDNa½b%™K|OHr4g<:nwX)7Dfw40(+L9=F5 " s{n=ߟ',1tlhFuтtփ ;f7~vI-8Q >?'zl0͗AvEmF(BN7h>@N3:T'ƍ_޳jtO!J) oT2`O'dޡ"Ԓ㔠XLSN-43#ӌz3dFfuSV)72 bqdijڵ,"Ӕ"eUXLĴHRv,4"PV4RuzLv}XiE]lLv!:}i&b8rAFk!ӠYm?9ti8kAFWϖ'2+S֎a!pL3?2uwA:'5,82ME{-43#V>rd?dZYgB갰 RP>8UfNdJrqiN"uJ<p?!Y^iF!n\cL! YQ FXT6lW4usWAo,aAR~x o-Md&e"ݕbZdj}K ̌LxtE4<}ΠXk՚i{S-4! ;W;kD ,xV:SY~zi֧ϞY;̛ ̆L3‡ԓ]zqquo_l^\zp#9o/4!4=ׁu v͹  "x4}`&TY;ej b+R:= BQ]uIsֹH{[k7F)I= 5}!؁lB<)Mp} Fnxʋ6A3K N<geM"B QothVm Z$J3e2eG$. gێ'#yRZ׃S]ۭ')BE|*9Ivq>"̺S(ӠPLwХMEa܁̄ʾjQԼ+쁾=;j@dA"s`*}رmt*HAz,xNUuOZޫlIaK&7J .JЛr|ԩNw)jDi*U:.8ʸq2q;-'ej#hH+(O`$>*:*0,c ,jvԘסh'_?cygͫTDEr>OCH_!h0bg^Nˢ|f{N5=/4b9ټ-uҹ^y\%ʇn{䙖{%fՑz'KgNy%PqJp:2Uѥ~ocȺ;8d˹i' F %[C7y - L T?^AҷB-Jf1*ŪF 5h۶`ۂ[Xe۰sB-^@?|T*LSv(Q̧-x1Lc#?|%ny%n qBF)ߟ7cm;5|{>pH6m̬P0ow$}HT_=}JrP/^vu4bB +i;,+r+::њ*V0eG/t{'=ݜ;Ҳyr BMȾ&b Y(J4fS jWLC%6*f$sU!Yvyf\t\2xf9ix*EWT%dpnt uGV/ƔYJ&qhk 4= "FV"JR5 GF a/{\!t+_v+!5>vYjX"[f޺%E M^.{*5Da$DEqY t(:Ì cHu險Wwbӭb9ַ0Y< g>Yի=1Ǘi1^ [ w xKLSrX):♬J\z{CZ&pO(4J]apJe- SA'mdh\IuS@s ǝo,o"{X)TnNh6K̇PQ9"]ȎBSCHA ҥq΂G~6f5ϙ-•o,T(7(hP{Py :zq&C?dpɅ7WƖJtdåBkF@J G5>;yyy{xz`f!o.7)nb=|d\Za b YҟxmZ%ӗOO?11)Nf1e}X iX]Lni?>967dA蚚UsiЮG@!uU"DrYN'm4Ē)\ '.}~}egf8v'FCNB~̡jzV] U@5|UZPV~[76AE"}S%XFӵ^bZVӰ446 0 K":AA¯-cяwVBZK=j/Լ("K1g:j]S6  Ū=␡A¾ie@\ WKmɾ Ǐ@; 2]^plsh a7W7h Wn{rCҴҭwY2Yڮ<5w-R\B o4}(Z&Rv2es>ru+U'"e(X3M6 ;"D8{9ޯ/ѓi:xО<۳]"%\Lxgu;(hq~ԅ)ۨ#Nɏ94d BD$s52yj&mw1+eu -aDڍ(.")m*_MWnud-:N!. E= ZI'1uo^9E\er Fi'PBiVT[dC (emEuALt!j{WM-rRM#VJ|+T:{2h> x~px/9d.wms8b  HwMQg" @8;㪛ԔX1肓% (dCOrҫiDPbrrez}OF>T5ۋÖ|8_[(|.Any m(F;) s:`W=t%)m am]$ "J^}C\jl &(R2{ͷl\c ؈ ~^aN'S" n:`9;̃YNhtC E{&nOh_g"r3ƃv:7u2ׂP” rc0QIZGeDpO8n~X•Q~Ă qu3L|U&CKpɸgỷU WQʧ>^:ˉu`ҙݠtuTv@&dSq1PF8 <-[?²:f)/@ a-*9,!v-"2tѵV5@!,h yL"4 ϙV'Mr[W3E Fw; 0YTS,n,׶7i3>ndYa3\'<:;uLs'{afC\@4!x49LoNQ-jzXL1}2F琓i h\Jx4ػc ^i ?'sn,DŽ8|2?Q49~2͌LS{9܌RmzVi9 i$jge{@W52DifdU95]6vaVi+8ϩH)G3 n3oPDWr6eJNs 6ii.g0+4KiC4#)~T&%;PIa\>\7s.hƹS(,W9nrV[}^lO;/Wiv^8"J;3:zNO>\H]Vi*ZB$d߉u. 1Rf6&(rcpZ8~qNmmEf2)9fc#A5buNfA2O ,k#&Pq 2!%C׬(,V\t mxfl_}Zm {t  (,VB& $A[zFf2Ӱ2:{4 a:*a(XYni5DA1i&#\'"f8~s.[. r&dRh%1 f)7]f5qЉ]Rr1=@( Ti8bnUQ0˕uD/f03MM,݉;"A_@Gbuj@IsPIЏ%8$f41 Q/Y(Zr+ydܴcZ@PNʴfB* r i3ӔxdS^ۑLPmHԣ.,Œǝ:f03M< jlqLR P+ Dtʨ!JC:EVbL3Z/\R;}>fUܟXN3`fb<36?0rw\|('vf,,bcnUP&ȹ5WdR#Jp:J4Ci ?25tCG#ӅZ@"dUʙIDb} uS^O3`f€ BT6amK[3D@G[7cb$Yіm hO0ELQzi3! JLPR1Ʋp_m8 4x :Mg_sB &ՀdȡibL#R;(fY%\:Hb$E`CY.uxu%QP4-NbLSTd6`Ѹaij[ܯ&x݌ ܗ8bnEq=PPyY榑LtCQL3]_lDznr2`IH.3M1VM~vgPX&nQ:^ed#"kP{pc@_f03M7.4ܯ'񍋚b1S4^8fКmͅss~C;81ՆZsBȹHQ'aIޖdͲimL3Pq(u =4l3MMwk_>ivX8ӪŪl\}*W3ap}xi34g]nhmn %(T@aim2H:g{WY08S1Ȓ.;u=c |/yA e6;$f4_H6aMi 6JRV.L =^ M}/"3`fBr(gRJ1ԝD$ t"n!WFl0uFL3hDžb'WN7~5R &QR.hY1L30;='}fij)`Q:$Ո T=.' aȌGQXf03MGɨG U=IfZI#Rj eӪŒ&֣ mF3`faLSx^g:fibLs}ώ~1Әxbnti3ӔZj ' G3r'rV(_|P0 p8v?WD@ە.3`f&XijI$@'b%[Q@ 4FM@D"lh⠓i1tFߡ, bnؒ]t䠓iw6mAF UCO%!> N%66juL&ӌ^XjX"<_kfmGXɿfǝd@{ts!:L&|^ Kŏ1i*aI dXPF  n<04(M,Z#v㱑idg6ÔOo4뱟:"݈ aײE۟]4~})52MLsaHrb @ \=fO=/暗F4Y2M;;d 'n"}E2R&hLJɂgˎ ɒǾiRd da<N[M!ql!L#hd!t&p#v=&$ly452MLv5&~Qq78Dѕd9 .qL4yidx adwm}؝_]|ni~~L$,VбCR7m#c#$4zFEBGT镒iH÷eD(]ݿȹ9%P &MIGkVO .S&MѯuTPJ==WA(lr;~A#Ӥ4vT`TtS%L?*].fɣfmd4r) D3;J]Ҥܹidl}=w_%Qՙ:\bkaB#d4%0RTܝL..">u. Eos4Y2'$vc5.< $iL%Ӹ5ˢ.V4i2(sSf6Ljl]HW˿idu8 ShX]2*Fۅi""M#Ӥ4E% )l [-x#$4" |qAzL`IWk]dv'Eidڲ5=;Q&LHOt]迩i[FIiOnreϡ&j,'ӸC|R £VFIiT.c*52 Ո2Jl$L#Ӥ4h7B'Q'FRPVind,F.Qz"RNzZC.ocr@FIihZKG҉A6Q2\+]s8_4c}Z;`iw@8[Gl˸ƛBv~ks[drڴNnfo|YF޾e`ɴYXao`MցqGį­Epywgکףֲxĺd`Cı𺲥QqgV؝Ք|΍|żKHh薉T]k؛ԩӆРTDžt~ufo^Jŋ/6]\쥙qؘԠƆ»:}Ekcx͑໶౫ݕޏT|JF|ut^NCpqlrCKIDATxڼ=@`  -bdDȑ@nG ;p95S\cXn,rcX*.}fT]\׽h^ŮsזQ8CCM-J7]W^UW'ulIq0FU~,Ucu.wZ6Au2FD)mOG=I$ȡ!wݬEͺ w$@Cl `@6!XZV4`j&D&):VIep,u4i_Yiiuf\5,78yۖ@́hzuU1q#abkA2x\qU `䌰Ծ>>l@y8j1qEy-k;]}C30իܖ虔6})Vo\ I{kЖc)>z עUh&n|+(L^BA,^Qn s2OҫShfߞ[y{IMىĻѴ`Ċigh<xRD$p 31rA~#xno 380niGJ){q[өRqR}'U,¨zAgU"s0H:ne[ګdgqC,85ӞHvQ!2ւM b#+wQ(Yp V-YNN۟QςƳp3D(Ys&[:LA=ff Xxl]Cs欬J!Jp_SqsUO7]M&6K<<!+wr_S@P>Y4(WG 8-Bc8 b0z@u}#4!v~:2J0>:2(#{) A"LKԼ}s4߻ ~@ēyȒO/­=ÉekFƯjcw :K(T?}bۗ_m1@2tsf(#Llw=2<~F*1A5a~3l#pBYTA*s:ew`ga&YWfR<)jGJNµҎ{ǃŋ\/D` -ޏ.[E:,'0$1HJ+lU\bau= RFe%$ЗoJ#K_ }}G=.ED#ו[ΡzҰ[\?ױyb8<x:ú"yͅ+3C RŹUD%ѐv{i_yq4<Xⓞ?,ۥ]4`u"wiy8*qS7)TS2mʹ7r3ds5ǕKZ)&&Mp(1kW˰2rD$$#5d{Jۓa7FJ󯵷 1 *b4M`nR F|N} %=pqSrbȮm8P);_OmwXtP΀!>~Tzyj1,.CgKD.\Si0X'0)/+jȣ${n*Ig_jmt͊(ḅ0\N&TdY;˷o~zN9^@lC f8:!4.PȰw$ PXDD\gzs^.{'TBV"PVMY'<~'_$pï(ɵ:c?^k>*[^,j*}H$V޶6~+t\wIjױM\o9znAD[v X!%F!SɒO j, tHX+% @sjKV#[[`Nj~;󙫩=|"YElc om +a_JuMp8E9ՠ[CaWV)ILn=5ț3XY&Aqŋ엯~y7޽NkW?~ycVN3N4W8EDKz[lo0 B)h&ișd7A;U&[4*dN5ј4_[̛ɚ[&vqO}MxIhZyۥps"`[;1$sKf+Y l`O]ԛSX=84䎔VW^w:ͱF\é/e9R$ALG.6D+4V ^=/=)۹; Ȟa e.›؃*>fF|勭$qrg9Lԇ>cJKvif6{/4Ƴ}H Xy.\ߘa3G?]h2p9!c.I g?-pqƱ )ӌұ=ISGV-ٯ>[Nty~J*-1%yBwwH5RK^,dr=`֔2M-GX`K!ۖn8m'qtB0k˞:zfM/.L(A'b,/.=kR`^{W@%J\k v1snr9{!EGp1u5=ں$f&ˑH-ojĸĻ6y^Vhk6`> rz v7V6^bi„f@kfn3Va')"ͫ4Dw'~seHENy[%U~vqCa@G2֣#Чv3GCA ؂ d މ ioe1-y:6`+c4VL T U]n, ub]ɕ4zQblR@ N h8wckV&qr8o)ne)&@ m2d?}RXR|+rH~M7.loU P09>b1$ϗ$0Mҁu$Gc&A!lSQ:I)i2d <$FP4I[q1^_>ϖ }G/J)&&\ԕ0?j 6u89_kB[:R@E@ znj wKt0**|k3օKgù* <ʲwSΈ=fC@/{kA A-ϱ|X<aƽ*bB/CmlrhOg\Z`…,dKsϋIc4?)",Sx%ebu֋zNYjL]9yJD'b0jw4F" ;4?vzq〳D6lVTdʡExr$!(G1Q(maԨ㇉1Q/{յo^?gu]xLMOwUuL|z_ )Fc+Sx> 0{>mZ`,$_%iGwTT4W^8If^x"y !l]ZG.|% !vu5S/f;%C3X7˕(0!.x)|߸{ʤ ;(N \Btrc9)]Uy #x2e15'tU)yL5~Ag }8iS@T]k f4>'gS r_F#>I5TJ6$"g ϳN6w#x7Z jL0sujL_?$QoÔrF߱z TY.6ڻWtmp0Q-#UJ_e4 [¾"0&*v}f JF6ףɸWVw !bN)J`i9!& t=低%XadoFW˺ n04*9;ɽ\ҜJgكUy:\6-HzO[;|N D&h;5]M'*i_rܽ^ތitͣ ذcީ] B4Nr(0hQ}Qi5dCC{6x(\'A UONyLd .4`[ ŒA7j@6:\I Ru2͡ ~vHȀLb\f csU3)GE9N.)u90qfAg R%`@5*P! y!TذI;16ٿ?$>Z?,uI* ΝaHɴY)MC6ZJc."#ZWRe|WV@lH ȻЂC 8c{^ `J(827y"2n@Մf DCBʈjh:2V{#> _j 4:6i h3p|Й*B"jxy bJbPC.s6rwFfBۘnlҢ!~`#(sKGhEYT/Bg^sU6.R 4S$y>䍛1s _€W0R m?b}ƒ,S#ŷZ)n^X%r]6XQ6x`c>4N:d: r:2oHI=9xCpɅS8>!a@.ϼoi YU <p8ᡄv1@C m mDXM<_V!/ch*Y~xp"REBE*NsYtdtl;_" Slg`8aE@ua' LoyiRFh,d*`q%˥'LmgƏaŒa: Ei(!Ba)@!Fe#t GuTV\ršhl﯄LTxҋ.` ɪ!YG9vا_kΞ d6˳a2?L#9^,uV5ͅa\wQ2B  J tb=@ 5`zRGぬfTZ=Oƒ+Zju4iSPN Ǩ(1}:V?DZ¨A8cNyiJbKS/UM++I%#gJ%$"8T%\&N*›B|#2q;UrG_La0L#HyEιd&M0̐WnGxqi~ÜM1o9io,h&Z!5Om02zB]Gߣ4 D[<r(:H@!(W$a }9a}6&:磌mܣsd:Wͨ䍖'rt|"&G)H-\N<q8̩3#4@qIb`ե0LA)D+sV2@B4i LnY@0liwN%!hS؈@`VYIK'I\ޑ YdskǃMTny ުTd_tB< D!-vq+{a"}5Y r&Qlo.~=|}WϏsP T)C ղֺ*Lύ+; 8Gj>zN?R7< me,H}D2.d-8f*c''{+A $ F%z鞹tyt&K IӀ _2 OdvߝS 02r׮w=/=j@2 ۻR~36m 2'.nCr4hV]P1C/k"!PN|E+Va#P+bك#+o\~NA ^zT:&)ssDX醴>:Ogx1wśj|$iדRR x #BkPNZ_YBVDt-~}˖-fue. afءmܵ?28^2)R\.8†35o|d>᮳&NeCO}laV'0D&Mr_L#߽6ejhF~P5ߪ3)K(+l(/4!iCv)jgk|pɽ.<.A3 P5Ċ5 YC]Aޕ YջUbX?lctAyM^dX3P#Ϫ|3\+8ZYHC<ͅv釶X}ck$I7#"jT\dI왵i@:~Y&Djv/pc (g9m; Kv.qάu%Bho|=b4&Lx=BvztCD"@RiR$x7#beHU)4G&,\V.Oa;M9PPlY58aO@H'R/xS <S*J ^MY7箿6Ӗ锖?L9ʛ[@{^=qɓ=S'>HHu)%&tQQWwj:T~n%IpM5%'$ĿNͯXx:5l0gbx T:@~CɃ% s"\3d읬Hjsp6"?mםw.'HokVOc {im p'ND$++{ƘZ:)23Q:yK|JI:KU5eU:\99P2 ьNW@8 ̖]L Xx= 1//0WU6M}+=K㦞bןt-–Գ ܭzσF}ħ :<\M4A)9 &ه9aFC/(N׾1=GZg!̺.Ͷ*1C̣*䩐k*2w5$m$>WN̛&M>jc'x2N9df%!4[P2is E6GY`ܔTl&"\9씉5"@' ׸4L< ,({"|u|_W`H8%NRA6髗[CcHAB=!R4FƒlD%,^Xae^anØ`8o=W/a1yeeI" I4F頙pyL3kIor9ݎ/ND%&N3~Zz㧥$[NGIS ahL}G?;LaҡPTBQ󂯧1S5a- ^flG͇(Ui|4XJ .4PG%f9Ш΀*ӠL320SB֤8ŷe3p&LyD`0%̱`\wm] FK aHi ]+q@Ecbw8Ai԰=zv^i]צK :0M|]aYcN q.=4aH0 d0(6L}Ӈ;]ΡJConLG;L^Ӆir1 fi(Ơ(ǂzfXyy`0H_vc2uh9`,SIl<;0 磼K+f|d}q\g ͉iuDŁih.vDFOR ,[nv d8>gm?L,\؁iiDn/d<\it;Pideg´}h0 4Q:4L;]HfޙQipj_t4n`0M;Txaܙs5'f)*]qVi*`2י$0 %{GLAeCLۙ&qʉ4SE&hgQ&dK r2L8A>研gL‡;ӔYΑ'4iDT gyXbx Y4(~ di*,g24+xϑ-%4^i,+g!4N3;WVo>\ZQi:Ӥ nWL| qHKl;@L!㭫LљFeJB8 vA>iKN&D`hnȦBsWxtQt8Ho`Na2]*zNm׺(4ix7,ę$4[C!D׫Z QtL  }i\8Lb:|޴i0xlobU$)LmUoZvB`?0YV94t8%SlU=e9gސlL0M@VoUkQi<4RJ#,UG#rgAp:9)LC#x(Api4eKAs5z(4`##-KH64`k!>7_G4LAPkŎ#"*ٮA)QfohL 1jG9oy;...Æ4q_ȈeCE7g #4E-?z޹H q10MFܓȸ+Zpԃz/u&xś( 'O.ɻJ⏚r, fNkC 5.?޽IqDjˠ(9 L"m㓬gSO=EI2͟]9f4I#\nbߗc䒙Xftљ*#C `9x^cbiDiֈLC`"˓_Edk `uʁ.]VjKO־{ fL5s2iLrX/fv!t7ٽ/gbSmT[L>i/}qr4Ja(/}"EȊ\d\cKf(&ިkgDEdܦh#T4UIӯ߽xpի>yIMuc,^~,t[<YF:gr1OR;L/h;:\ PԪ3DaЛ[r]FH؎D4DT(ZA_(Nvt-sOu}W'e4i֜LrI.+3O2{, 82OZ[agj_j#Tr 2du3MtsmZJ >i 2N϶TO :P!#K:-TJY. )JTT?ij7{ ^@MaCגR\e?r V?NA9c*vR7s UuG,ONJݭ. AYZjKI8ϟ\(!~J&U$_6߶v^o;% y Уqp f^k M壱_298̳#>T +pƓ `%&EZP5jϷV-`3G@j[V/1옮,2GN:#0LbG&jW(i(E _2 Z[~V4rLؙVdypMo<>7N~28D3ticJiH62qg%Z "  cJ\ãCvRrKԻ[8с:-ϝ4q0Ol16Ww=w*L@{G$pF;A7晛Bga G "5zq>\l**x;ӳ{yͩ{ %zmzG?~4rP͊LCCpNtrP҂}Y2tj^3ߙf4ME~gCH_υ^*Q_ m4혃׎ 8:5'G+vm30I+ ) 7m݀Bڪ2)T/Cc'f\b^8!M FNɴEQJG<-,<G""$ ! x%KVl`qzQJ̝vν`DCkuډ\.抃/򐩁SwN4JJJCɠQ[*'ߩ3pW%a/66mMSN QL>%7wbCOzM3VyKa&R#_VqsbCFQ Nf%he2B2eMX- ]M-A;q6 *.vB+bqVϧ_7dtiq Pb ʺr̼ު7LBlDti4uiG"0MW4r"w^fa,;9Nq:@ 80M4_>Ɣ 1Vkdxp=fqf #03,XZdt,Lӥ0(2 p[Hw8tִ4_ͺ i!09,h<N4gTCOF t5LӺ GDdhbĆvx`qH!# t3L'QҤSϲ|q:;$banid"tq_3IX[W8XaQ֚A#1Q?&A]O?!砅izQyGuqAL]s 8L:ӒO:O_|D{۰q'ha^i{X`5z"?eF kب8i4 eu'ca^ibO\KNz>J̲S5oiz mf'Mk&1ظh0M4Bsg<,9D1zW-L0%wjg̅bt  ;0Mkks.tPk4 L#4$ih!/Xְ+:L##ceȮ-p'uϓѨؕizi 7Wٹc]$ixP{q]qE cI8W-;3~̕4IwT194wiR4O<2_aBSb[A{VQ(r2L3b/kN9ouԔ3e;#갰baT0MRw`z8 [b1CݢӺ5hGA1j|`u'(M;*6<Ó֠}j;LcPF0L*vsV{wI&GKq}C_␠$ʼnOEc t[ȝMTc/ JmOe oG}.Ea,ԳXR U |fa0 cn&'Qh() 0Ht.p ) \ ˝+mQHjHC߹#ޝ 2Aq6(dwfv_iQ; OyʋGh&QstU#8ҁX]/i L>3[5 Wfotbqu`*bA}aJ4 LW`DOu3+4%rOqӟ]Q 'W WVvՒ҂6w)n`('#lGiOY#QॷSdת~ؾ|o)U 10A4zCaclt Z"ZksJD\IH3)4 h 9˒R *ZgLM͑Ch"} mzIGqTuvBzwR3諕IX~9`Qk#f-]hu E &G!jI.#ydkCHgLL3GɆO "6Riƒ'y64LOOЦ8xYduM"2i#&p%N^xJϤ-0j2iYX_/]YzșG)79ڕ"1 )jf3i"ghKϮ؀1 w.MեdcU) p:] &HZu:3MR`_ ΧK5``i'oXk4f1G4Z8D;fJaX4E:G{w Ca+&D^o2]7͋< 8ʚLcieL14Z20r54>FQri04BF42 i0Li%gxa)G4^FQ?0q34fFQ^Li4% i*%:44E2 1(w44u41_ri4%Ӕ9 LS(`0 LӀi4`0 LӀi4ƿ<$IENDB`PKwL\}73'^'^;limit-login-attempts-reloaded/assets/img/features/icon6.pngnu[PNG  IHDR:l)PLTE{+*zz*+zS\kXR[jZ܅{YY*R[k܄S[jzۅ*-=܄8Sˡ?ޖ0V-¯ZO4TRKֆ/̔^67=톍FdqDA9hU_ms1:3¶dХymHވOZcq~s{ڋ}IمdmzLψ^guQB}js>vӥjŒӇڳzݻɴƋПˉŭɽ߭鷻˜ߘn "[IDATx][oGJVZֶJ 45D$D$-JJBD[)Ryھ *7\fS,x`bΞsn3yVRyŜd%Z3L8ւ%l9R.r9>PLL܁ZAI>SE PȲJFpwPj<ٴ+"(ԃ6c kq$JFᑍ@z:[B*nË\aV!Am'BDT钯NSa"<2#'U9 v\fq`ueyX)Fo<{}Eov x"c,l9,M\V,nH=X<MC@6:JCC|'=rhW2ƦGGGt.ygVsO G;@v]}{5 qbmtp䡹8j_2i(JfmECJd (^VWn^8= A8Ot3 gvjk񭕠A'Qfj$4)nrrRVxv1S9  zjjR'Å߾CQ@Fb!(suQP u_!3,F"y'EE2[-VC@Uwf֬1^/P~:Fچz+N9[(LٔȡH񃧯DBc|V˴߹ׯzt|wB"< wf )h _8w+}4ϋۅJQx0&ngZ9lX-4V?t蔘 h+$,"ei4K9ErPA3Lzf49k^-OAmdS_$ 'O=<?ɘ(C# J妲q5~aJ ϵ(f2 &C焝vkXv;e~u!C'Yp9-̢J P+7IoJ'(Ї Ûo ^jbE}5LкzJ$VNՑIÆ j6aRl`;G!L0`Q]rYxD uEt 5,r$ISoNZ3@3(VDxףuC IHBzTJ#V}ܝ1T5Mܜe)3[b-I:(u RkZr eFWQx%/YqQELa?P+/Lf@UdW7VPHy['Bx?(3D)Zށ- 5K NSb-jrjRLՠ߈J(٦ϩfÈQL_Q_h0{-S ԓ8,~{hNI$q2,#jNVI^Q5Hm6HCE~G< < N=JG;*1oxopْntR`3r֍5 \uHmT!ǶfYf&Hc:SKXBRU{T!Igk3 ;G0J?cj"*)7O<-N2( 1zAסLQ>8py*[oC)0(QT .)e#ѹ#%B,'' ffN:b:M*RX%@ĩe2!BNΪissbyhCGN%6QGwjCݼ2":C@%gQ\S' dM#Ss4O=œYi6r? S<(^0GNeBEpXX5T"1Wg Ї/B?lfJBMG/t5?dB8s0 "98aiuqw~ScjN{^iL!1dB=+mQbxHX[9|ϟ H9cmX0)٩m Kc {ƦƦzsdT8o< }茯E "|OpGB2(nStiԙP3OФѱCX VWVLO>}gͼXY\\][n T;S6-$4ƽGhpF,Kvŏɯ1 p h0&;!J@uk3iCiU5kҬr4{5I"fSk_o/T:;#PiӢ9~V[ >A`+NaJM$4C{>\ [3ֵo:saN# x/q'TY S?IGfUvrgAZT~%-vlKXi UYi,fvq]qQmTQ~kǐv%1T/ -qI[l붔-`o0;%ja45UUQgi-53GGy<7mu.pC]CYI=3ru&.ztXaIob[%‰hAKnɤգ[ h5`γ5(8\ =B2ѷan#hxE̚ Aza@-sŤ8V~*$EoztFv3r2p;WQGI\6͕ Z- ÅL0kPe49=kȀ !aH:,6DG4S"jQaLl؞DbHA9%´n㖶1tt!-S Գ#q>e켡C%܇020# .է|[7/-݆39:KUdT:H :6/}󅨐Քc&K fjX01.RHT6H蔂Hm4]+`&kxzG]*Ȍ}5X:A'e"q7.ujEW9LM)t0˓tS_z* .t.cȣ<*gmF#l| "PRDA"a~? u>NKa0_s2ne.܍Ű dSI"t:,pb pa6Pa'\ K=}VYId7:"6qhU)P 2(]fE%Z匡 S8)SYх̌_Xu噦sO"9J3t.&C8!tO= 0fq]aDѨ fp2{{!|t$r$&:Ciߐﲒ|'iu,w}\L'D[Mk`I|6<eە(ka?4P=OPˤĻ[ni9@azzA .z$p 4ӛ8iF h f ZOYh.Ȕ| >9+ܫq`\xmY4Lh/#jR 'v LVzF6 )5΃2`M:<@fl{jz bä c۵-,D6`V+ɺT{w>e\eQ%{'Jn; ,ftSdΣ;U^ :֑]^ڡF;U oUURtoʥy`@%@]P/Ir@@!le )퓽93ҵ,D<,|88~K38% ~n?qlMV',eVwU.{MCWOhe }t}K%Ϯ1 _]i0X# hT&<!dzΆS'U L'90KR; z4up3e>(ˑ;[\^mL\}>o={/ܟm"nJtA2k Vy&KDX*\Ѧ豼5E8 LUK&mNNjN}b8u䄼F7sk/V‰NQ 1#f j]Huݠe}C DTqt{]vZhFGi6G\?0n[=-dM\Ds :S2JH}m ̹<}@Ď3p \3ߏ$Q}t%^c_a `=)]{ƷWWV`>XiERpCljUd8Gv}Awws va+o凉5DN¶i]|Rv^O+]94DGtPqrÓ$Ս=K<*H:(׻F3jW}H=y6ӰS Hp A` } .}Ւ7ǽlG!.-J*_=vv8,U/]}zl}c7x%8\Āp7̘ޚJ7 3pJu(tvmy:f8q6z}Y9ڬ~!KPaB8 H]D!S|Ҏ"0tR_~f D84I^E9Haq 0df|1ip*W@GKs֑;7F\nv+݈_`A"B֍ɺb=̴6vӟ!$(g9 fyZg.À1Brݐz5Z="s6ep-([N,_͈)UI+cǿc{͞MDÊBۖTAu tN5_aE__ՀB\:߲@f=k?]Q*6LqD۔b FOtYm}fN+{[~l`嚵.:q;̀6g*p}Zttdg:i#[kTԣJ`B?ea=*ZNVXB5MYX} ̔[5žWC\c] Sfy_v7g5~;^ߔmI>RC7&Us/C:k@C?q0 Dݮ:gQGV D6ͦ+㑒 d59}V!nV9Wf-JH9M ^+s_}26nL=psFnAs8f!^Q'L:gz+ l@Kn:q3Q4mp;l|i# Mg؎i3cJ=^sOgQt]ofػ"Qg%pC(БLPA<\[8, fQQKXfQ _Q:8D6,$ߕE&_eĚA&:?Q"rp-h0?| oFvMf\kғ+#}aydzo ,{eJe晱><݁Re~cڿQv@,N@@P;7t&^oy6KܮǑ i:qMN 8p;ʬV"63v\褬l)˾n1ʾ/Fͯpepau6^#!qŌ0$~->Zla8gKkk&d&w@xxK|PAG}EDDD%""("^xC/ZU~[uFxd;ٙޞo>,q-pSl:Q,TpiՔXW{,*h15EeD%uo8I*IrI fQ2QHhs^a\2˥<|?!9ҁ/}j/&M^AZv4bE-7i!ĉ.CK]ҊB+A`Li@a9 JcQTy0:$Kg[{4*d\oURX%\za.SFxtXJA%^ugúyG ]sYz0@1IHSbЉ\}o^}%-/+ĬJWe|72pLFV7u-00\{ICaht$ :v^MZ1)jrXϯ-pY!(N@ <KkXt܇46;|4sViԡC'f᪰dh tM.=N2m\=#0>u,d0LSC2Cg$3P:fΡ [ii M`| ~N':$@$dqtF,:La!qɽ" !$P . N9LCC2 lqd3 :#(<NJV`EB`딕UDD Ӡd:4MH:J~&l]ɊL3L:)bK0R?LC2Y\3LS:O16%[5Wddh@<t#4&/iGq2 : 8* Б" #HaӠ#|0&:LX2 c4:J)ـe" p ։D:LH96L9Tsp%Dzs?L3LC 3'8Vg4ƥN"i2NjRUU ,nGNDgIMN*aLOii=X9R; oҺ=RrECŏC#Ek@Mqj*:}α38t\BDb@?.{\?M]2yX*7Kd"ʄ&T:YDtЉQ~1Ol4`lEaxnzXVY wxE~T ǑZ"m((/r-G5ӣOe*m-H*k51P\kdh\+Lv>i &|#ބ؁gR·p `kH"b\K-cұZ*R[C# q::qWX^{h,cXF, CҨƣVIN -$umb-K3w`2N@Ax͖b@ $ |O @ZUk-Y\vߙ,Jޱi{|xC^ C*ʊR;dcAچ!BC3*CU2?c3,ln%Z߸^A!!0b ;89R{@QGf+b>:Y'a+b,R2Mj- OI-oZ%M_K"NY㪉RSoZwq mAN]۶n 6W5~]A[X^b}/~~wM'2 ݬJجYiF˥nbXxZxٷa0DFD0N}: @M][4E(N5W M7=UMgkXb&.\I' %wJ:D4ӎ|Ǖ]]'n[TVk(T%GҮ  +;AygSXwsrb2BdeUma:5׭ܣ"hP:,PndcdN|ޜpA7MfB"=Nhت<%jywbm<rKtn3sq1}dfxʲ\{Pl屄R]It 9ʘŗpSK6{݊'dw]duπI8F%E[zZ\I&FJP &ꠜ}R$AlJk:S0X@6 93~:jAs;̛%EJ;;:Ή*B\%GU2oG+rZ0>/BR@sg4)gɟ4(JR˩*2rhJ*YԶijijr1t+ S^Tb" u 5׋)q5s)Fjemj^^t,OU ld~u\ԞuK@fr8/RJleF)^EꯁX7E# 1 az8A#+A*{8J'wbELtˢyjfkO$3;)yZaYr BA`(K'5ЮadpDE@Atl ßZqcO#f!dk!OC3ۚ4efH=ĐA< R1biPd!xIwNM@ ฏ/Kf_HmdQɎcU$&u~=Rl\.5>̦L!d)Cm^V{dD3LH/Yl*&1C $2VNfaJ?z2m T`䖾I4@SW\/(2VInH44k}dĕLSL#~_ Ӫ/r+\?Dx2XN(ʊpTEv" (XiNL#Dmwʹ T-/j`uj-iBAaXWxp %qagB!Rrٔ\iNL ]"'tRJZ* )5;!JNӔ+\PL$k:B(r"Ӝ FJ ѣ!eAe#txQ`Lsbd.NF=Hx#KraKGYqՊLs2d:he@P+d7[$~:qswE92NT7he:U[4λqJ {wV40LTepb?leD Vd#ga[H]ZS3:d'_|ڝ{;/͏?d@(^: d"ӜF4e:Se`|{{;;{;;X2Q=tFy4'Ea-=:leHH1dўCf۠j,2M)Wd 9 ) Ӛ N 4_q}novmFi"  04LL|3_vR%8L_6Ԙmk"kiϾQJ`e(H&oVdFNz[z{{鳫L$0^6%ٱmM}@40Lsys{m"8KN<vI6 (F>z֪VD/hWԇo }>wΙU djw6TL9sl~{<|hZ4DGmɁv}8=V'v 79QS"U<0e4Q~98vGOn޶%*a4slҡm>ؒO{[~4XمQ'M@Fcqo^T6MJ0F`%rp?ubJ&QvM{U96Pd:t  iVz&i4[(r.pŒ*lZwg Ӡ:U*ޚk&S~xw* h}`N(LS]4hpnұ u- _?Giɪc 6($\hU4C4ݛr?ݓTL^F { T#Z Ly_Ztlmq8&_N 4[1B=OF]e#93:6Ȓ`(L8/ZjB;@*N_%g ?sbT4(h%L3 LK:G8FQ0kfVvb؍4 TCawokdK5k}ZOQt>Ąqÿ.-Jwtq4Jf(}ё3öLn3{Wغ&1 ihܴë_0*5Im'&9 ׎c%L3 Loϝ*ʎ٩$I&NE<k2!mL(Heǝ4iԹCE $ϟ&;>HYԃ]iiRw&A'eI"jb#*2۝io.)H-Oj+Ӡ6Dž#d$H6~#Mbߊiv9q\QOGddEff7Z1Z[xݕ\C5b[V ~sViHgǔPϾ=OggGAIM ēc@B8"d|؉~i>ש6BawX%~GBma݇s"tdQNuxFw FZ44V 313F#2[յNtP4#L_W<48K bAHgCӼٷf"W ìiI-yyjl|‹tNm%כ9|`"Hu*AN1dF;Gi5iWZ_ L#|fǯ v#,Y*vfjPqXR l $%L3LӊnmwtldЍkָUQνiPUL:Z Lg.d-fG,?COfW$8um "=4Z447YM 7uD6u{z;'3 +0PUhkPUhr`%'fL&5|{Z#ӓ"s:vii趭8?)?d)&=aFp45j >I04K>$L#1LQ@:i8Lt D9hSwYbFEbN8L#[cMo iLy{T)YJ]5S)xH cAJ^Zt,tc['|Tql L=4 L,wVbX3M:쎈/htH Ӡ>ZY1gA6RvS/{" N(Lc~v|]LcM80QG^:l^:SqrGJf%fU^{dU1L-Xؔؤ;'L,ѻd㒴C_)rn1@D:.NL"ÄU44Qt$87e>:v~ I_vƌJ4?4M, Lc%pj,;%YI2l4 bn(a!`TձNX>0WvɅ&4PO5(3s̘Fq.qE8}E .  zЃAQzЯ޳,kZgdLotTP0 ?4aqljLf< o'Yuqx.t9pF"AISѻRgN) h03N#TGwP`^ 4If8Jv̢gd{0XNFg0 f Yr%sX8# :WnG&׺Hbb %?iAvc|[ݖH!f3J}Lo)0MG`cDL_L6L* ndO|h=#~ 4-8RV ih>*ywu c9 oY1HA$C O|S;T/ $tmCa%M\";cu?<'(3D*V>Rے(U$OL>CFEBwxb܇G& oثu\.ӕJ0M)d ziwM*S͓OgNF* І=RgZeFxD%#u2p)$(K:"ZRA3RjF^U0);auELcaC L1jۗ*d >dȳ ȣ$(I'/΍UXUb=iNiP eӰh E)d],ցc L)]"蜤5f3,@sIC0Mx0`^iD@ a4uƂrLb0O ,ac3ָPՐkK1ɨLT5L4HK8?e) 䉽$jES͍C.Dŧ5f `*ك˱H=8d~3X[rUk1Qҳ}.Uܤر9B,$ʄ?F"&x)ghj%v̇``hL ?'D+#^]q+C^/V4Dvz=fmtHS3b1 /A,B,P2L%TUM\zY:ޙ*FFKuU7fhs~&~o92TB8ւULl8˧]}(ȏcW~±؛r*;kQSX[n BRG ;}~Ǥ3|%pI,IHb+J Dc+0HLbl.~t岸@RJbvspCk'=V6e٧_—i6YD&sZm+$UsŞ}إ`4 02ͲKLмh02x7 /?]$KVk@epwlQ"uf %\F )uE!P9F2 ؃_yvԑ)e<:sVrϷ7cL6P]w[Wa*_Q2=U]1$V{ERa`>2;OyDf\8B1ϫPr `F΋Q>`9j]rAq+w G<•guKDsT@ lOygj({RQqۡS<]lcg'ZtjtV&T(0G@<Ñ7lDUsb%2r5)sc԰1oYr.ZφΜ[J05bv5f=eԻ4VƱF@i5SۑiӈQ0M{zd;2~ I4]Lcix:l_oG|v4x6#X| H`'4b5PʴϻͶKf`WRŖEAMF/'.aN-JYIHC8:W|CF |XR&&2Wao:` ڭ)| Jr&[vԩokV-5 ]ԝytOݟ4ÔGD@;X'S6K\1mI uX¢ zΣ3Ș[e޲7W%=GRK vK,&1;^USB+@UݿWըޓU2?I+ǫ1cnApo~Lr1-ęJ=-,j uUޜ }eRiw.2QOsiV-Ťxo#AbeA"bx#!!$DD"bX`ac9])j=~ܮtկ%ῆo< D~ѭ=Lnh:y]2LӸ8r%Lzs[..Hi2w=PJ|%a(VF{\z2I\X ڻ}!M"'"H[!ǔӢ d]+-ӭ!wx7FxgDF(fXfmw.:vU8h7|_ߛ,kVMvK'  V9s̎[cGYEzYXz|e -($g0aWFyLYf#L΋+?Q?aN0oAF+LSl[Bby-n|:4E({ Lc4|^1 g]+a0 dfa]LCڅ5L|3^i7Rz|9L#s*>|a_ixC_+sɂ W`Շo*IF1@X_0ͯ4.^,ڼ*&-9bڲ@CzM{D.06VA3mR /Ǥ˹Ӈ/\04_3 sԇ`j(N^(_3+Ž01١0 K _J۬0M2feK7N)iL\G#vLcUcfP+FHǞi ٓaT0M589=Fs^Z3'zA#+JSgYW3L YwZ1RFN*؈, > qF-gih7-689FC0")V>r~1wo1)t3L jsi2yWqW@:|} c#aѾLkC7}Q0VwcG ,+8nPDM@Q*& $ixd?X1ڌY!w2pchg8 q0y(6#XFѸbB K5'=lHIaD0 oTP Ў~ε9&ٲ:-,GȖ("aY!LD4<M1ܹrt<!] k 6zaD0IǚPhMGQ0MxK{1%LA8 v)4NiR4U:iL.||}?%i 9݁t2L Qз"Oppea=(!Lcҁr80M2ҡgiLV};l SKW?rLSO2L 84ub`0|XF)oF{ho8J d&L34 H(l&?P/⟯Yd&L\i`aE4_ȏepXy6'Iӈtfiq0 sVtxKz QBƤIiR44εxe[hSH(<9Zo0M"Ƥ<ӠLQzagtzi?.V_ $iT:ևT_ 2A?Lb^ ɌG6&LaT0IǺu&?mzq&^cdQ`e&L1d ҉L㌦?pQnHH'4`WiO<ӄ5~k8wAWNIXf84/EO(Vu=0M2!L3EySS]n_% 3 K[3L3 Cf癦h8 ɐNL`y&l4w Z\g|wvu/]04.k@:U&sh1#H@J3L0MQiV9i.!*3 ERuCZ8${Q(Q:jD8Mʩ`iUDxzq_3?i8 >@-kH'4 ޺qXH>q\Й3]~gS,ܿ_C7#;4EeaJ\7Ysrt)g0͠^uƋlgEqoQ,~dd`0w/\X!Ә7=Vdiw<\i* WՃں긱_uu>0/4ц;rP@`WFgFå0lD Ҩx(4˸'1FQOU_4_;&( 3t`CXvjBUj5Ml&!^XҊ4?_ ^??}ϙDěջ9릛"g|眙 !?r44 i'4d{_,Iy (3L9n->W2a6wL`i2(Dʗ%LA:,dYmaΏcb}l PBd vL0y7#I0 Ɵf>Q':r?;Yi y(˒2N:0 [% V]aG< ppW/D:9Tih;!FR?/Wm `14΍i•Us9LS 1]kCY_'ڨ+|ƿc7A%i 0M$M_vL`J0 +}`b kN$vMmY+ܨLߍ"Ftc1ଏGLS شYqhӛGGy;h(֍!Lc:祥EXw8~$mmf 6^ʹh&M(9^c1ܽrq`ܼk_5&4U`|~y$))._q]Gis6LcӴ̫8‰މ!f l9y$ Lqɜ[`W7&ڶ;6L4fetZ5_vnڇVi40 Rra>d g6 SƝilWk|XO ]?bܓ2OW[&4`lV+9aF 0ܨlS?rLIqA9_]i_Ti 0rZcK["sӄ:F,Ȼ5iZԒ8Q9EJ~.GYnuLSM>øVs 9/L7ݙ; i= Hg2҄~:'Lc4t])9sUOri6n s zZC *kOLS y^CLk3B8E))~f07D:E)zo% Lc3misJ'ga݃Ɋ/9ù9sS3;PPhEM1H˱NK0M%ư9EAp#O![)䫚4:5C8S?NK`*01Y.5c&fZ%wl 6(@b9G8O܃p,LLSEƼ F\y:LZh⦗֘ќʒa2N`-+%O;4T{og[\^O0M&^5B\'hG-kw~&wG ^0yCQ^hBKӅnWLS11gXZٱ.NyMK,LchԱf>Z w qadLWLS1Oqnjr cECWn*(tZ'C`GcfsGJs` 0 lIHCùBtџXν]!LL3"ff]&4U`Sn4"stJsvN?Xy!Lm)Ct9hI0MQgvt0kÉv|Qr_%AguӘ3\\G۳r('>%A,+I0MU mk''ZwֳQCia"5}$43uѾC I0M%H%YlaF ڻlLb_14&;)J~?=*Ge# `*0 c6^H~4.&Iۆ[4}eibU 7?0ǗK @::g Ʋ5'B0 F;tpkRYJUbY8ߠIAJhRD(b䡁".iCC Y2yN/2]_x;Id\f.yyѰD; Qdp0U/@$t"pw. Z6mX\.ǚ)`)K¤kD2M72-uiY9r=2܍%!>h1f>>4W!ii0]&I趯Ly hc=LþÙ6(41{ >dd4Mx-Lۑ(+kf LCQj')ڷ D ,1izi솉:N~s7!i` "z^OgD2Mg2gBM%n7#R@da7"ߩ&V4$Ӡl~YiJO~Ṡ"T ۡ\N?E$ӼL#[-ͯ8LU>{+z;75#' 'pd]F"#f$"Ӽ_a@^[dE܇G2M/2Ly%n! izi6!$mL/MO"4}4C&ova(MP螼] ']4*ddQ',fA+o448߂|?9N0 hQL3LC d84U0$3&JoJ!LSE|فi` I#L8i`Fq]kLƟ}W Ls%=2l)0in8:!yԼ(pi`Q*iF0 Յ4GF43F14׉bdk`LSwW=7 aXӌ`Z`50af&3LszyT.Z===feeNϸ(eS@wѧ35ld*Hy"eK Q7DwG%oNjSX)sV}ṳ:q8Sx Ar[E<& qmjdNlЖ0ržXmb LiMlPOP"f?9Yp!밋3+f9ytnз208hqVË# ;>Ҹ|nY31 @lFU# *؆n2((<չciNu^Lqn|y,:dN{<2 iT0cˀM ô8 bT 6p\DiOslqd4-n>K$H8&I#4%潹Q qb M,A3#⃵{kG]rWb@T.@=[,/;K"Y(9]M-6젏@D9aEJ.yi rv#xJ3u,1'ޭAepE.=0+M's\R'1ys'eB Wm&R)k`:L.nsBAHk0:zm*`Stiiݛ2+]t:dU&b58`mB8'foe4!"[= f9ohH S!RV%=[:zniLObg-[83 #.Vh}4`<jw_18Awf2See8;v/vZl^l'VRs74<: 5=+#V.6OE N@ҸYh.KR~$z4au Z_/:kfώ>Syɬ+ ܭgzR/58bZ~պYР;saːEe6AKT vOhp?84`Uv38 I hpVUֺ,L6VĎ ,q]c&;Z^hPWYn^U|RT>ՆV\(V@Z!M *Gĥ-TYȧ&zI OZ@N19+#Gdi HS*ʨ‰559({W̮ ?qz)C޸9 [aF/#~kFc^2̠P؉'l9Bxw1d1yncPէl V֐S*{O|y'Gm;ߓs:+\i.*BZgޕ`Ѭ,ZV^1KQ5..2+Mة"2lbiD6YEmp+X`XYڵoO-W Cp/;]4z!a ]rЊ]6EyW&vm! U_Oղ 5g~ #r|1IOiۣ#?yg9 [ 2`/Mk@"\hF^63<{,kT[1P+Г )@d}M0԰{GpIB5acw Yx5`z! lr\-CRmҪOg Yߊ#^//88>z0ƋtuNTjםfU}&@ HM ,X5@3!kM ^Y\dBHQvivq7ڱ*]VDx x#Mh@M9xY]KWc L%@ $ch|be%j?̯ V|-١sCqɕgFpT3Ru8PGrsR>%?z#O[od-|_[כ8}"xbZ8N0'2bRȬ$m>5先s9aQdk3 :ʛ}LY(!s86u uֿ,MvX)k0 Ѽ>#pؠA^*SUH&MRH,80LD6E::' dWС^ĵPu$fΆz(;[1.IW3\6{Jau[)${wr2FoAlg ܒ 2xkehTQ:C pJ- uF{ѓ R5݅ڛi㋚!VIڠP Y xmwu?IDqW,{*N -Yد0"b2EPYයi_$dcMqS`]6Y6_dO ?,LN?>G"0?yZ?6ګyNv$Ua|2B@ 4\J*9ltBeIZM 37yYթ[~sؤnjA}wvڦ[7 {X^dI&a{򨑪|zKL/M^CNipuB!Q|MŰ+T'зQE&P.9_l&xˁU Z1?6 %r\FQ{+W*fT#5)pyc"n$Sff+dm6kP;-mXΟ6&os72 } O0I +??/Y+v#oViZΚ`S)r0(%5ɥLA|]NP=۳NXs"%sK S9E<ƈ s)P) Me8@Cbkz,(KӾ&).|S >!4.:GDYJepW6wT#v6QH.CrjaJ]Oa^0]|O[`ABD 63rF)_P8oG6k,_ݯ!ΏΪCrRViNV 4tWmu\"RrP+RHZNcQZj΍&8ȩ͉HOa6V t飘b5M7wL0A'ٙDa‡nX rşA8J b͟ls"D&SSߙ+oU$)a(37Td%QPuבJ\y[@3*b{*)q+F=d‘KFVA:#n#$Y- K_|[-EA[Ҟ)%߹aGV-   |PF(JLD=Ԣ8 gxE}.[=N8iU}u[Qɓ*Ͻ}-M)gS_ַ!> \~BhɂIF,o93iP닩RE z5wTƇ{Jߞ41(L|N=tH`t'_-_8xU) 1&H1;+%?fᘒJwC 7Kn׋:b5h Ma =i\ܗx8?~>Ù{d#y jqm :Og(_] nf"EJCyU2ݧdbQb9ځ"0M.9#4KBEFX"'tצ쥔1@S?BPd/Ds ==Tڰ oAl7_{ŷJ٢avy!_qQt4p {-a;b)WCÀ 볶؀@ҸR|uCo ImUW1sU"Kt. 0AHV}R餌+²V͟<]Jv:m-|gƭ UXr ңO t5-lD!w[Ė.>`*!FGUs5# (am껑߽8fSL r˧2hx.b.EPpM/(ܕ8Su~XmOjkD| N`?а瀎K#+Q9+H |UbOaC{vY?Ty\BoDؽ5 0(N1*#RsВ4Tb@'KR uGKgӸN ;gB᣶MA3mg:4›V/[C_nC`>'EPJ!b?'e=}R,x>B jӾB'Yc2_$o7)tҮ5dWVHq`o?()J qNEu4PFPOcdF0NF:CQF[ goL)$m:o+O@Q}g<H&4UM|RI<$bؑ;Fod#QFbgtIת.zgU|B?dIX.Ɗ9 ʋ4xq hZyJOJ&> RGEiܨj8MKTg{_ȼn ) @,*cE(}ǙV*;0s.bX5r{fNEa!]r?z/] `+bsvU +>4P4]UJ};F4ܠ%&wKGԺ'|Tdfnwn^=sl2Y=Y6r;Oߋ6}zѺā%m!?ΘV˳~]| ^rH((rI3j0$߽>xBa}!;3tNR?%2\xlR? ˎyU=p'MxN/X!l)N3nCUcmax͉TqKɥݦ^ѶB mO H3:ANHA5d'yFHm%ll ɊճՑX=rR21j71-l_S~4D3pp7u3s˺=7n@D']Bp%3O3HБw tnj!W5;gMvlf &q"cudQ󧎠#̴qEݳw_g!§fXOEd?8_>+"om%\}HEE4շh=B1ou45Nx33@6{pEGr Mdά`cbŲe WXL&r"lVرJp|;_Tz| 582=dOn*lIj;K @hf 2ӝm)7ܨawN:> f:+&+fArV^f;* ӗ(:"t$ %&43*b0 PI%.mBk1aQaviEQ{X\2y3gPI%h t2̏{;P7-[)VOVI2A+. {XKfz(s1#&/d𢡄FX:ۢj`^9g鞗a.>$!|8g@s0m@Mh%j:5p4ST(secF-3žH(0*G!6, Rv47:z:1a N_ @}TN<͘4q{`کbSD ӌOE`^S|:ꄥ0B : aO73gYsfH,jVUENE5mlvJ/Б3:aCg6:@OaiRێ&w66LNLg#)JÒRP@K]AV2Tr'ggc5Ę6MhNzdq2#8(>%q1Q4 1AGxtZY}Itϙvgw}?*+ÑQ5ߴUkL,+.>{Bi[_)(î1AtOwȴ_33@xSƩ9#u>Lؚr<8:׎o8 R6-n0.O#ǥ*aن;ϪͰcږm[ris :Npǖ%b "V:1e p&Oĥ'ĴⓡYKk\P/.푪:͂HH."Æ(\g1xrה"QѪlYX*<5.n(3pontΙ:cr.4[:ވLA4`Y%P%I CŤ;4E{[?&7FV:,Q#)u:^k[ͪ1+>0%iN gLR6u.'h/tш,x%*(#iJAؤ_( k븼 k6'$q?\]TFk&ܴn6sz"Rom:G+(kxc2΋3O.ӂp,(L29Z7]K +VS^ÊLy|"=\|7(a 8B `ѽ pZAwEuD 3.tb~~' =S'AW2n;MbNuQ-zFu9jT9ЯCg‡sT'{[?3,i,]9r8K[ډ&^=X[wYu|U־>-\L1aSsx)65{cs}?|LhFE)}p6pKQN zy+uP_8^x\ȡb}gw/n臭Y[ůu(9sO;sr9 r-Cʏ@-o:ONBPdKgalKv(e x8ymJ?/xA¶jAmpqa}.w9yCN@A)àAwFg:0 R 4q"6\e ƴx6نe$ ԝ4IK֞}XŅ*ߨXUS2K/]Ó.ǵNe/ɠ:0@$B x/K rTh9}O'ΉN,\I r\ 2|$1J!#fYŸwfMr޿ Ón+]ueUӭސ Cpum7:ʾ ]/Ú#ŗ ܟVr>Dǘ玘5 7؜^8Y"jPH2@3WLBd k"<7~IL/,*qC?-ѶK=cEm(v0e;}ުE%F⯥_N1.Ξ9:&_|hXIIҊ̤4<붼n[MXu5^sI02'I!"\WKaҰbJ8"daDYը'BvߛuEe[b5!=/UcoK Xa ]i O&Aj1ZMH>$ [~Wɨ?Rs\WM'ʵu0YpXcLBuR]q3DST[NY꽪)nG[}׹tuUŧ^K_8V19)bu6a]HX WI x6#Ȕk*/A8 VELZ샹͇GeolL(Vadd>")NoUi 5yMfn`{"'V6y"&eu xwx*Ha4t!\뼕r:vWFt7_#"q2 e[b͜djseQ iB5qZcNfaiX̉Nq'lTs>JٞڦmKQ09a[`$l@LA!\Zc4/SncL/qUV;Cvtg# a~ü_|$!4(!A+" 5T'Z/ K_`*u"?rËH>K*LOSBTgtDtҰrI*x˝ȝyȈE幬S800C[9R%–_84u3.;VzuQzv}cY3S2aI^NQvgB(M]'IG$[uZ9A''(1ɍ!;.|OI7gmo0NrNЩ,;+n8=n"53g0NS=:r{:PQ9781)##.46/g/ptgĖx3E>8 qc d iB|4gD1sv:o)3܋oVaxjl񼬰[#cKΣuJ; ϭsdtvW_~l~+ͣb|1͌G37IB&c(*)h >۰C9,W =m2 `\/3As`{B-|QXWNuӞʪʶAn89QgNk~S2 f#˲uяD=~L5E$=1Ŏ :I4Ft]2ñ=+Ĭ!E^Dg06`u"}ߡ#A+ex]UC$c{fQo_K?]lLYbk((qղ"yUmqJh;jr|k LUM3CH8 榦؍r>: lUTN_Υ7#vVae!f)kN>X C2.@F \BH||ԣT".o?ץ)C61qql%bGDž mrѯLnvށFOj.a_k|hr1]-K~E|EBSr!Pu+I:_'b1{?p&DF2‘Lפc|{~-o z@xxA cpZI8*r(v`[t؁*2XcNSRsț%<"8~b#I{?L|PkUfS2ȡ\˘?Yf8&h == t\oYhwwG9 4] =.%yNb|bg%\cTNhRKȊMZ[t~* Q,^PMrou/W)[fTR\_*"s[>d"NP'(s8#l>P=~.+s#S;AewQi.ބsf wZ}f8|Ⅵ[iӲتDZ^gѳgB44kqro'n1 ٩A{;͗ls&Mʷi蕽ʄ=%4MC=Vv5vy&9)V%zuyS3.eR-I!X|0P$W~pXYFAƾs{གྷNJ^||$ strchpKXXx༔sWzye2=np †e+SNmr8xİOޚEФ0\nvHֽ]>;SK@&8kl7tY#C.iFV^S "i1EZP⬸Mv ur$}He2@KnnHod䠱']Hp/_"Ȋ1&.\ʠ5" >V3 if[kp z**d)OecqԦzO{̃MCbM䅑!=%/cH[#XlD,DBY\Oza˽.Fݓ|gEt pn =dA)L&Wl&]\;mxd+m^K=ju`3;uD>̦sɽџo8 ɕzV+ tV\r6w@%""$C%ؙp )1ZO{6"[UV@~=0)]XJYm%Фc[{5 N2y٤\I¹3Ǔc%]φg947KX?4EمsI )9]8O>bՐ Ibr@Tf zeye$J/ Vc-P ڷ&y'|8JF9fdNwmc;&Nn:C]y2|y^7n,sڠpX}_$G;c TqNm*IA#H?#Wŀ*7CUϳ_YrOo~A`Zν7xPe* ~ʁĞWnD3( ؕ z`j) WآQ_ z ?VyyCI:Cv!-x\8]T_ŕA #};/A"lc ZCv%xä6.4P zb^GuRPQ\@鞩/VdE.yt1,w:ыu<ȭy]8eiLҕvjhvG~n]ʺS aikN~\*l; *V0#(AJ]Nf ĀìqQ-95.mSu݀q:"<G'S{bMw`"7#/xDxNżޣI89^,l-{yf_%"1K_!o!4WYJԨτɩWԕ'ThZ6N\?$/$:rЅ&)~g> 7wN|["C;U+4rgteBb|+x氪t$!.Y*W"OP1bih[قbf'd[{i ųv+B!}0? 54$0hl} `RZ#-2VwB7ZRPW "rQ#HM+T~3u$XιؒQRnywvٻ;7]:0eB:]AXTQ[琢UCp]Hi"EH0EUB] ,sZXqWqXV߫Â58WKU|!aE GD8\'m]|JZFm m![3E**Dqr^jAg9u:IYÝ @o:?c ֕>!n\6ZZS_LhScЈ$A N̟[0k4.O5k9=8)&-Or^aYr(xxr t2TmQ :/)6P0tte<7y ZXTѤ_"6M(uExAdX^D*0L* ߪ_EQsK"6Yù4ܣ-#e+nN<;IHR 5_.tI(hő4+Q?9ρz@ê턈gd~W6xj^"hK]X 9S'*Oᚢ$ cuv8e*ێv`X :>Jϧ!:X?Үs:=yn,n{cD"}_O -[I+$/S[,H=fmHeێ6UZ"ARVb6M7g=>W1>gO}gg/\]+?>K;?ؠbpIAXPG\H y֣b0Ѱn=@>MN&fFCfTʡJFJ:(?+wKI?5w3f?:ߴ]{:W=Qh1Vj@FNh\?STL,WœX}oHN7HD˸gذ {n.^-.SŴn0BHuFL.HS\2j̤QM7'J]CKeG5R6nYzJ>RQmUI; ^]biD 2V9ϹЬ*^mZˊωfP j\-:y+ җ6?dI  L-OS$@K3X7͵лU $AfLJ9" h{Doƿhi_Sa]R QMqp2>Y;Ѷ#qes65s7#O(u<}+($!I2֜Ӏ,*QC4,%Q_^Nn &!':0]֥<}hv ъSUW/٠uJC-T,}em)4)tnYC Q%n^`M&gӬ+wK~sQ E Xj"MT9D֦^vJ ]h$9Uk1(Bwgtؿ!*8ݶ&}q I<#w'cܖ;i%d5_9EO>2ٜ෋Rm]dy!$.j10H6iةAUyoSW(`ExY06 I\V@42#6)w¯RV9jN|Bb;wG?!+~_Fx4GR\~5WގWT̑oJv msP0,5}yz+X6r/tB#\XKbz^QeNiaVj]V|9X[.q:XN([0 b YTzuu׸zq2`u5kJ*3?I %pe@'1&EFKǣm(5ztA:,.sw%|9lP$~Rv/NDDZ"ᰄF+ $ [@GG8 dGi(8q0tnSΈ2f\bcK ShG%Λ`iB;[șkkT҉,98Rsmҝ= !Z\%:' ;#{F((C%\G*/*Jm?`f,80T.@\K1cBL߈Y%n% 4#fO`K3ʰZ8^U>~eH*_e`s§} @5`ےj[i! 0H)xTx5)l/r4̟ĐC,1S$TΓ7 ~-Vgwq&wr/{I{s5o!w>1!p/‹c5Z)~Nc).P6hYL-+ZIk:4CAMۣ$: h|(y)Lڧ,eBֹe~rJ!Pm?|98uTz=Jf`>TpS[g;:X>BƎ Kt9l R e ljHJ&1V,4=>{/wXBL!ĶF%xu_^]"ق(\NAQ *^n;$맚W~D?BxD9$X N @9/Zƺ𼷱aתl>=(Pzg~G(n凥zR_2lz}wBD>7̤h*nH/d$znBB>_zϰko+i"%ݶwo tmٟK_a6 `)V@RdGmPT4 I;Y'%pg&b%VKNZt=Q m4K?TD'+΄I59I=&>^xT hٺ3v;tJII,.aDbhOξ8 voVZ (FNj퇧d8X\dMCoӾCս{Qљ" f3iZt3R WHAsPQmw:Bt@ ݘd# 1/HH8`pd(Rc0dE"20PYOÀOF׼@Bj`R'x=-!9W|v ^>U$#i$1QPbrXKW"MlY9619FD~yM^% $ 4O? )mu\vfho 0z g! Bk/29jZ8A_ }}ހ,'6x  -C_L6 t=+=f 6!Y!A 7,Jy)l!1DFMS@M|F F1\O3^h&-5]s%Cz\uB/<:Ģ5NygkE C]HPP( =X +a\9%\&$slg^&S&d\@8q-R3rNw :栶 f$cRk_א=Ùrd) l0䙜< /@e(^N7lIzT\kd!)S ,Zr`!9OM?6ך|j-/kWs y8?"-]ɝdĬqmn 44CLJ$$lq{/=ҋ'/HN+`UYvUўhLj;@C*A;|Z|k9ƹoM*In'!kE2B֊U5F*}Y=)t)QSل/@m;A_ӱs,1oBJbl}{5,yÙ"nBXΦʭGfw/!=g3֡j7lgpFY`QHs`Ʃ(l6/أ.x Nي67XEnR`PbӉZ*XG9C|k,ITVǁN43qX Fф%D%Ҧ*r =ዊ Bw瞚#z04zSb.EOu.Κ3.i'6xk^59N۹Ţ$S[Qu|ž}98@z(vb`G8)cVUF%,k0(\#;@ՕG X&'F0*ZEgLu@KD1e!u)tL%~ÚwߩbMLM,!W2bˈ^0W ~u8g!= C>SС5EDfF$T~ k'4{E"0Ec$O 8'>ۧ7m=rFw+b 50&wcbVWE(ޠ8!LI]@ 05MW{p֔:;w+5 )V(&@R.<-=)$OO[ :rv{f<ړ>^חxtU djdS 5(sea*vU?wOǟA)X='Hǽ[D[pxP@(N%m|v`u 'HŇvt[G-P)y{oQ$>BHg}Lu;vn!CǠ-yTL׾#7} )QCO:貽Z#GqѨލ0z:@e>"m>p`hÑnm_t^ lɠc_ѽ+ĎO)vJ+qFPqSg-O;\$ n;S3H S|B@F u3$r+A -(%}WK 1|yNz>A#wXli}<:}26edKr%nVmVE~xMKy[_l,tٙi^v+^yeHڐ9;df]Oi5PlJPo=@zRFp߾=!Q5?0g|>W\\`!L Π9=x˛~3'{[jKg 'i(Oɑ;{xO686z3O.@.rԴ][ AYe *6DlUx{[i=qy[@-I)B^';9A˳d烚sOΗ/yrh$(iEA3,h{Z=6(P]5K9*QD&mDxBsZnNӻ*JM#-؈eew|p|y"DCa^bIqQpF 1ʲ}}[Q7Ht-pGx]gy`sRO;DWVˠQ:2|Ї{gA3< ZŐ*T L0e(_(4/uRXۍCESSC)[~a.h59fͷXX9%[zj2'2j[©5 'sZV)1/U-gCqTn'Jf(羘*;-bd)OFHJ``u3N& 12@CHO B97Wj =TڸKΥ-ю, Ak{ȠDnjSSm5i~r > Ub#s+hK+`wlŔ; #wP,ZCCo;$I;$ !*1d !!HzBT;,?ѽP(E\^vda( ui * lcBأ~8䩁8ƩY/]WE QTςȲ8\Av:XQM㥚Joj6C/ݸ5պd2~j-땊1W= h0n?G&?#Yk _w AIv&>7[6Cw'aJ2 O_%<TZ͒:{,D}m-Ѫ: .0ůNG J?\7 [S9ffm'/Wu%^Zw^"sqAcTX{Y] 呃hWt8203qT3Ld@K&O>Y_1HRa=X3fe9zw,ۇI4gKJyEͪl͆D9H&hrDfe"$?-}jy.}ѐj[<ꪫmEf5MtxTb[?a( BzxRXbj ŌQQ`jgJ?evpT o@ggw݂F38'Wx *1:jZ&~_]Þx5s|OJKx7^8T"oMZTz{P"* zŋzTek3”K0 5HQ8{GT%*?Zlh4+RC')`[,}xv,gtk~V9xD=Hjb rֿmJLXbȈk1PÄ*۷͎-U#Jvjet.%Q2O0oj%40^0-g^18)ek`y%YL)&TQTSm"fD IENDB`PKwL\&}fuu5limit-login-attempts-reloaded/assets/img/flags/ad.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE: <*3\[ JXièW̺[I %wVuyi%ūcu+ *̬2rβEiKsKphdںmܼ"i>X>stϬ)esۺ,d]vԉxwuƱ}ԊĤ>o&g/y)£EӼK޿'y«sRҵ;tzӗArɶֹ:j;ԴD3qq𥮹~Uj 89ex r<yqֹ5zX˄Gk  lzb} aټ3Kڿ?¬zį|I5tt4wm`NּAhs~m'r|ẋx£JʊOwωE{FtՄ3ֽ.ȧ2ΣGO|tOp8%*29O Ͳptؚߣ+풊Ą]U/ָ2`}ݲ0ض?QvQNpǧ9p$%oh|2͟FЫM9ͮ9Ւ~ӳ.ËfTj`LHƧA˰N֚"q|}ldd4hEɄE憄U%ZL*-/ZLiCI_֋"Cԧ;Ӿ^ؒ D|Ye^'В4'e;Զ7Ur+z:21Si5 |\JDiEkfX|lɆw!,Y&Q0{ֹ^jXҵHZ@\08'}"iH`geZL%,z1Wr=1w &SW(ueK+J.W7w|OGW&H[h Q' v/Zzۺ_xyyxE|B^''<9}Oxhh)"-Bz/UqWW=s"8]v~B,/#]6B?,aU7c3ڷ&\R+N%~܂eS'u1Wq'jP) 3SWW N۱^J.zbމS'J핚65׼f뛆NRXNG?ިoSLufБRh-tѴ舘a"i(:>azce)Q3C|~yNZj^fFe$gddKJ_aҠG֊o9:eg^ନ'D VCKD`ߟ2 }3\:"fעYR>,֣a'HO^\q<-seBB̨ю%Z2jɨ%XK pEjIENDB`PKwL\|'5limit-login-attempts-reloaded/assets/img/flags/ae.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<HPLTEs/ w5q,tt?z2r>xAx/~8p~gIDATx͇ @7glZp2S !!!!!!!z$$^\* KHzF.!sKH'/ o`GIENDB`PKwL\I:=LL5limit-login-attempts-reloaded/assets/img/flags/af.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEq$ᢈdJꫩR:܍t칲؆f E;YLFGnLࣄ߉ْkuk{t棛C3v[dS\D9+كj((m\!㲐 sR -ރ|ۄqYYىh7C, 걬--ٌj؍eޔz56bFދz9$jj氝 ZAʬTTѻ⊋"!ׄb䐑ff㧏<< 1%ߡ:!R6챲NM33㭎UEK.BBaa2,$#ߘ"ᓌ' me}fű ܛvۑpܖvߝ~J5aA"ɳ柛B@zYޙz˹uN~n믰䘕PP_\S@ww黦W<ƻ6*994/=3쳴0 M@ޡpUI3 ۏo/))褢ۋoܑuL700뵯~Y]ݝ{JJjS6%XHe=iC_`꿪abi`vb⠍紡翠鴧禠鯧樚3"ּSSCD׏c㫐W ڕo cd਄JF]Y2(`Ppqonwrؓfx\;sa#}iƧ1=3f&zz'!^}}>>UЯ*WIx q^m(k*oJJ?5{ MA |ä}& +ji&) ~=d}ڶ;1󔔶&-# +@u|r&CG%`c:vv&|}+q:&'gγݽ(h_P̻&.&wb,3&T=RR__ ^&e:f0( t/IDATxwXguweI $&QQQd(JAZqխ8Pk{/;N$.OI^{rp.kIo`A^xs8ߒ/A$G[2-1HtUr 81zc+xWuqnKwn3O|iL 5:{cڸsVv!ken ʟFx9JЇ$F|x{: %ш)460wlH0YU@VS,t|˖CtHuo}Pz%f熃r_8|LHCe) ceST0 >ǢD [2JgȁA>%N:!ĹT  RD.E]&qJY?O5en7)1'::Pt"Td g(?s{uFPM0YxWC(lh[8%kY3J;-˜zi au4?RZA|nJ=AĈe;qw Vro"ʺAQ=[AT#Rz\NG* rnkM|Kz6"m;-3 ۻ$qe]2b-u_g<`nCX؞l9xD:;5NF݉:]'7%%u,o')2IJBQ_OR H~ PO!=C~\ @ &о0#ԬH"Q;"y#ɁJFTM1zŒeJ,^-%ī,& pA,RY,9K/ ]9A^CFˢz1V 򑆿D#b7K6]w)W^}0 BΛ]ƍz|Gz#"|>űz&Xn^A'|tpb#Ў)c}w>s Rڲ q L܌G7Gexcs la?%x`wǚ#~uزqwuL2R Vq$M 6eDc",P<י%M0mIs8A@}qh\P}[ 0_ཏ#0NJIENDB`PKwL\p@iv v 5limit-login-attempts-reloaded/assets/img/flags/ai.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE!i.Wk5wcwu3HQ#$@~`ヒ}1tg *aI^$j"jtM6aq80Fg..&,qd 2 "nG f X J "L  V !# px!d -irT wD |H # 9!#0= Z 8R 7"/.F  %kN O !q'(!$!#!s"H y #_ ^ _ 1 #! D W g }{ o1 ] Y "v.^ !` 6ΐIDATxgXgwU;rGi* =ҋ -v]Wb]ILH^vܷwg~;3;3^z;a\J>qˡD8Yq _ɗ'$E0(Em$ *\Ƃ"V3T4aTۇ+7,7LZG遄]H9M!"ML"֍\c+ eZC/Ry-|:~v R pE7RR*-Z,Wȟ&+:T C^u⸝9+Y$Cllj0[a9{A5#&Fj E ːdpQi,\50vA*^a.3=|%ӯ!Ap KڜcW$ymN^*sLbP TkBXn Q]xt\T͎:-77dmݒ00♫l]X5p:MKPtHmB]Fk኶OAENJNo 8hoas)gOp:ԃ` 2{e:! ı>uK)T"v׾! wj mgam>\iM`B!텭 p\{·;X^AGqyZym9XXzvT,om@jڍHɀF=DZ·K =L]ru)^idoY/|MY˝\[K&S)־}bVL ڿU»Jّt"_fBue!%:t5If(Ka+Y?"foLTUvɻTuxU٠c^zm1`%5V&{I[o=t)B I$sdb2 ts$R "I-<^uwb(_듂nՓǸet;37Q OLhݗOTB{~b ᓐDeǷؑ))nKjБvb).amDVÕ~Zfs{!1{o |^Q]&sC;I8l/!/UOv\<AE띭yL&9i{Q:)f o5F+1@;:TfsuC-IPDQ*!SEM\T~\J^z8_^X>A߻IENDB`PKwL\2R5limit-login-attempts-reloaded/assets/img/flags/am.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE  HeAIDATx .v4[ @"H$dxr d)H$D" c$}õIENDB`PKwL\y45limit-login-attempts-reloaded/assets/img/flags/ao.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEvmWQ%51ż ezrB=2u[T#!q Lqj!GC)&6}'QKxKE_Y=9lû=ȿ9%#52ph0-74G),oi@;ne,)2/`[w fb63Ƹx~v^Wxc^пd^D?ȸ@`||U\b[ƷMHSNjb83;7AAHH  s`Y{5IDATxb``Q0 F @YME3V|JKKZDExEڳhiA[M3 Q;vv>h#-S0]T>mwD M0ap#,*0NVBY*[ kjͣdgbNR%&Z,,,*6ES/ځ%;]XW p?rqR=JRYx"\(npڥcv\Dr G3MorSwp/[/l3DC̤&5limit-login-attempts-reloaded/assets/img/flags/aq.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+_U WV'\UUm*^1My9jm򍝵9T~#YPiʥ#Cq=mA\*^z .aLe"Xh~)^R͸}(]Yre|!X(\2d+_!Wߡ .a=l$ZTtڕ)]Jd*_ȶ,_%Dr.Lx-Jw&[Lf,`%ZbyTHc0c5Q|4fV'\>Z􄖰 )^r]t"Y2P{*HuC^&[_v:VFa7T~%[)GtOp$Z5g ,`8iAZE`#Yvaw%ZOg|6hݗ\r @n9jo '\cz V%[%Z)^'\$BqSϐRk;k$YXp)]y%Z(]"Y'FtP5P{k,`>%%ZH)"l<34ٯlӿ]iD#6 W.FHDŔb'F8F 3 e{Vz PQ_"{ቼgGB <ݾ4qL/ &5BHF/#AMp#l8v*L3w9>MOIgŒ.iMo-9 NGJJԎO,4L&́awadŶ#k14Ef Eu"7$_M.zs cQ<4g`IGu[qm937/b\Xhdt |OP8Oxô/yJ YÓi ;UaF\mkay1H@1VrG?JU> Bƣ![u3X-yA/LzLRp/v5!ޚzQw~lK|FFϋA*D$}:q o QaQ'ё [vV]qM 2ca t*tpU(8wydbr-H;b:LI#{RnLF/z md3 (bgāEZf-U8)1hbXA`X*N 7ך)jf$ѪfS4s ~2DHdXNJ qG6MeX _o/hSeZE~4)bPN}*r& r۝p2E+k)DA upJ&uWE5Kj<-fZ]?{+ޓȶiˍ@ң\ NeooϮ$Ǹc/5!}cTF>HܕO >$c=S7\Nmu-̉z02bac$k`ADN]r.zӖ៴Svn#M歙ӣo'l? w5I;E0'OMZ0=8?0oHE*qwWX ?5ґѹ(! \J2I"E*lYrQxQ8Nx xXD&MRHr p5Z)xIP:M}zVDѯ9:> Oj&m$UΟUr/?6!k[yn/W$>"$+&cݯ2ɷ*f~׼PwQ̦]7{Tȝ3c Q qmVaIbzC󊀜-DaY#맩GDxMU:W[pslЩ MubeFcQ YƳՉ7hk̿Q)!zӋ>6Z5`,՛^d_0|vSN:pprQVFDd٪UO@m7PD)rW\jZJ _vh.Fx B~fΡJ[9/DCg՘Qg͹e{R3%!tAȄr,rBwg>Ry:2dTr^!m8E%@(䬜ѴHݛlޥj¸n *s+t<5rp A$/jd kL6ތIE>J!E yA_<֫a[-;D CZ)A Sfƭ$@ژb;). Io!m@B^W5Y hA'MީzY'_%'WS=>~ufM}nBcE uv8{-ynRX}{goEq B G;iUM&>s\Q4N¬6Xi<ӬNIsk>p,T kvl|cksN(,h̀ub!jD )&0#ߵNlK rdjvQ6zIu!LJⵉKxKV-6,𪋯hߤ:77aEM (sOh&Ko@HR?8$kО7/53 ۟]/&bv |JdXT.S= ꏰ$; 1gY]BnVbbSŖw?|o493B*縴v[/A;6L:k&w1>2l|Kgy ˎi0_FF)۠Mxebɸ oijhufP˱)n(wF2':{,wƐnw ĩgkMr<'Y*:h# {^IENDB`PKwL\GN5limit-login-attempts-reloaded/assets/img/flags/ar.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEtprxݹ̸ٮs ڰuƙ֨jѬڲ{ݺԦkx*߷{͖NƊ: ߺŬܶ۵۴ױݺy0j޵xڹ޵u ʐBٰ|џY٪fܵ}ȐIཋm߽›Վ ˩߹ ɏC/Ɂ ݶqt$׫oݗ ǡՏ Ӣ_߼ɣӍ ֪ͦq׳ϚTϴ۽⿉ƎK׬s͕J˗RĢć7״ڵѿoqۭeڲ}ҡ]Ӫ{w yÇ?͘Qۻǰ ֐ oÔܴyܴ{ԣ^޶y߹Ӌ ҢdȪͫ۸ߺиĩݻæԮݸ޹Ɵϯ׮wŴo"ȍ>ͧťɁ̈́ ͬΜ]˓GǼz*ѵԷճy.nڳ~Ѡ\ҡ_ؿs%l޾oноʔMӿܴ~޷~⽆ກ߼ɝ֩lە ݗ ڭjۯox z ٶٷnn;ڴt Ԍ ݴtݴvཌྷྏ⿍Ժֹֻ˓J $IDATxb``Q0 F(,t t lss00f Fjk8Bn nFCRֹB&/ rSa.’mq7Z+H |PQ-HOsL}-3pQ5dbǢ6ա'lXdy?~&4㡶%<_J=VVeGJF +"M4'dI1*L(rSْK$Rьڝ*PbJ2*[-hډ{b4U.$l̦%2$[yG<웳i۳ '"xD+vyޣ7}{Ǽ G<)u=6:I: ʮ;uD^o+u/Z‰/՚qWUxu4)E~?ᣣP[Xmjls5zyqic #cϻ`?Q4lH@v[+bb$ja```qQ0 F(`0 -IENDB`PKwL\G 5limit-login-attempts-reloaded/assets/img/flags/as.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEf!ѧ0U5|nG)"2j|Ë3\""ӓ 1x;1.b$٢humiœ.9ʳƬiƼJLi& xm(yYGt* tXq)굗Eu͚-y,ڥ}-»{::f8u_:fVFvfO1d+ &Big%fs![h;$֫ވcn 䝤N[ZEg A ~8:RWXY ǦPљx ;tx-,̜dP_e1?")RП8h(s#bD4Am"i̛ɝ34 |%[*ܢ"'1@աӣƚZ!ޮzg.=v+y(Y~H`es0 Ĕu=k96C%%bLۦ:{S=|- _5h1j2j.d'‘ ΝA+ΡާmFёrFwRp^h$ ;C~-FS6&ѤhU$"l_?qH2Ȗ=TIDATxڴ\ǯ5rC&9_3p'QR@-suH֍Ngu kN(q j&ㇴP*3٘S\u7)V}MDq kj XbYeWx).LYrfW GkDPRtR{`pQZ8D>q^DdXiCTHh E& Wkp{^uFpkhVq; ޜ(L134DA4"V/9Ez^Ғ"Kk9FdH6fx%<r%*ZEOLq.H!(FXX`FE,zS!$E4Sb$"@ʢ6eυnDtQ9:XR 㬨%soY&Oh 1 %pXR1,͊*%c|Σ4'xu[oi=oygH''pXE4$f_!y1*RQ@V2DٸV5fH~ y|(MoAwAg_1`Ti9;}a} B,$] nbw T {V]yV(C0`[՝V|A3'L00y# kq g0NE;VGg/? B=<0G#טV6:5s0 ,hU{<|}zPtheT f`(c8a Ѥ&wvZȶڣmvskVCUQ$C({<W2{>BGk|m~AoNR_kalKx{A}㮦8XWUX;G:B?@)Ԅ!th00 [oR 1XM(E@9e^0*xt3]]ЬEmղRCRWêXxvrTyH$carej;ĜH{ L6/&+t7'lw:WyK9ٿ>/,Q+]GPeĨ3Ue//T CS}(g{ΧV'E֮AcKQ 7dP*lw=aIH_іRno~ߖ0_8qmāeF9*[`_w%m;;%b%.6b dtO'/KW..Y~pibJ3fGlRA-{5nM\ř;:FJ[Ǭ['Wc߶8+Ŕpŋ}ȘG{suxY*c#6˵)bڴ͍I]3ֶ̒tD{YT;6ffM͒꫅=Ϗ@/K -t87ˏgGw>1EL2hXAa%>1؅W!̻Aq]sJ*e.b·^[PMP_Z*ܲ̑Lr;);]t5T-i<r1xsqһt-2f ^JxAbhT4M%3HI K 2'ɜK JNBW$4ݽLΊtnbsƛOhI`fWKXqIENDB`PKwL\~D!5limit-login-attempts-reloaded/assets/img/flags/at.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE)9.>, +nnLLFF=Uv *ggccOPl4Ip}88!#|"');U/Ijj񏙖WWLM `.b22~!"{##yf&xV揞$d/11dw._sstsn~4k;TD MC$3S˲C;ff\Y}>3w}k@ t8Nbh|Ժ9qMo{zX1Xz˴aYvϴ iR`0\ Njxʚ 4'+ w V78ZCK.AYJ  W$ga/[ "tg*``L֗zwXS'ˋn%Ͼ]oɘΖиiTLɎ{ {в{`*4ܴ9q /~Q\ pdD5`Q OYO+"Gu6/r:GA:;+Q%;&W:xy7N^|ʹvn?8X.L7^o5:qR!nNRTu_.(u-b4Y0"I1 FyNUIm-ƶR?-bm׉]8b G4(jK)TA" 4hcUb d&}PoO~1W. S2No#080ҋCD9XSj|'hQ֋8ָK! taz2离H xQG/p1EMCl7\t =VWfuJnYJ@1ͶTPiV[?o^iPt4XJp< }lޭeڂ>5&nJhȁ9fuX)Jw'cU: 2GH״nl`={t߁@:Xr dsԕ(0R?l8RBAb}\0hF!vH93= ?dY};I$.^As 73,sGb JC0Ʋ2P4V.z!a G-DL;Z~pMㄙ^ƹ-Ojo/0#+ P떭к_37AIENDB`PKwL\pp5limit-login-attempts-reloaded/assets/img/flags/aw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE3*91ϩV'ثT'h12/'-+,)*6((0b8 **'<96')לH(.0.2̪UR՟K54z{1.la`ȸ-(@=,)J&"kjQIGT̨XW՛rGǭ\[fe~?:z{ןQڪWFD7Ȥ>6ԜDZ˪tuKI(۔}'}~d浿,ڑХ˸Uݟۡ5IJϝj'74feյ!943 ߀ѧNӲ(.'.ҧ܏hhXxߑ~.+݈ (ɔB?`uuyҐVTŧ5ؑ1 vp-jGE耋IDATxb`Cs["s#s/-Y:N4Dhz 54 hkɪfލ$gx>DSKD/ឰ"M--vC(oR}YvV?Ex#!z>!Ayrےyglh|'Ol. givh76_>E'HP+r/k;. /;" <<Y] \X?Gf7"i7Wު㣂%3߮ưDTpTH®QZ;ݖOfk T@jcwiR` ؎[T*rJ7ԖV3*%☝,mG9XpRb'e`[3?ҸҊUM㖄tNSa7$^Ӹ!a|fݫZ7>OfjH]BD#v 3H~YQ0 Fp,t t \t tN:&:dF6:v:|B%t t( X߯ʀkIENDB`PKwL\{zz5limit-login-attempts-reloaded/assets/img/flags/ax.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTES4 5 64* 0CvYLL77z TQP\a456* 64!/ D1&.UsZv[H 5!0 6MMROvZ>I|}V;7[I5*$/{J2V9IDATxWo0$0B)tQ6]N?@ 8lUΒW>A|:c,kS+Q_"y " "M$ZF1ip~z^g4 {1'cfX2%\B,骾$#2eۉ*: e mTў!f7mCŜȍ!Uz{t"Zϯ|bY}"1=SE<.;m[Hco]/W4ˆ " "K`"2|fbIENDB`PKwL\7UuQ5limit-login-attempts-reloaded/assets/img/flags/az.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE?5)9:5U6;N-9(9%4A7*9(8-'7&6/0.&7$4%5*:,.>"3'8*98G#4AO@N%6 0'4/$5/?2As} 1ES+`l.BUb(9&5"2T5#3=K 1-=S`U5)itKXam1E0DT4 -hs6E 05D;J9HXez/>_l@Ooz0 @OP^[ffrvU8/3B&4\h1A!3?MCQ+;+7(5KYVc!. .Zf"1Vbjv;NTabnXd&%/C,88LBP,<,9.9MZ!1]i2"/<7&31@gr)/D0E+;q{dn7F0?'7K1@!2*.s}+:[g.!2{JY,DR1;I+PljIDATxs0`6VwafNM1)33333333{gN%? T!E(BP"SQM^Үג?T0GYWx% ~rUjSu |ϨRDK/6}2f~DB1J; 4 'J?1^VS2u_ГA|l\-kfn= \ܭm2؎]OHtAɸ=DXmN몏d q6Ŭ]Z"=ђО XEƿ,Cd \scAb}ZXi:mV6v:aR~t~:I+T8Qv 1,2!v MJ[tBFo4OP$o3~BNʁ]&5~!^!oؙso8v<ު{)͡Bg9/u=T0AVꀳRAP"E(Bo9nIENDB`PKwL\Z"` ` 5limit-login-attempts-reloaded/assets/img/flags/ba.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE.RRhh   aannžLL-&&:: /uu﯍0 Ѿ'EEɣ ̦(ٲ.NN﨨˥ 熆--) FFTT %*+ "" 즦^^KKŠ"55@@**:: $$..zz>>CC}} ]]qqÞ$33 Ǣ!YY&ß#77% 넄γuu xxDD00ddff00HH&ơ"ff++ ii×RR##ϰdd+//$$zzVV.. ##**\\HH__lH "jjğ#԰ǡ!244__llllâFF22ee¡8 ڢ''*IDATxڬwxE]FgݻpRBHCLBJLhШ1" @ Л A)= {PDQFgvG+3|_?ydASFG/uף^zsvu!Y?  at͈Xg>DC%j#a y,sVZgz]ܓ̤O N<Zː2vd)-2X \8E҂k)]2 9q܋?Y"x5( =_'sz^WNCxV0xAir' /2%tV>h|>󔐫e( rFqЊHa=$2ZeD tbM9O*ۮ \Ro֤ n"EA(m"_"Mf[k+m#;9 #@ W>}*au!2f͊FlF^0!E7{P؁)!Cౌ+%>Fʢ)pL06& 9SN*B)lw9P=kPAtq!gċV#~èʿS|A* W&1rU:d黵AGV|BpX2T=svo~*>!Jy-4m߮,Q#.JE>1U.W˄}bƩ9ts2]-櫜ѱϧ>* eNv;U6³AaT/f[lg>RͪK,~"t~@9v_b!;WBq >;D,uk7Bѝ֫FM*B Lw`Vdρ+Y>qM&cebJL;x\.c1*:}sZl}&1B+9"E*!_+Jƾ>M6#Rj4*"#Ͳ\WީFO"9C?_bD,]TE 11%LM.b _և#ڤg-%P$?AHAB)2*a|ʎBS7Wɡ}0M60١#O4?_K=<aK@OE",I,z!Kn p.f5C^:NnNf>P՝dyPrP$"]q*|H/Mj1o7֖@k+=C#R{Rc_F*Sۙ6FxG.;pqejJIENDB`PKwL\.5limit-login-attempts-reloaded/assets/img/flags/bb.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<LPLTE&&%!=J"!&('(C4 UB &'(''(('&')":- n0%+!!*((SA u$vsZ&nU7+ѣ#%#% "Уk&3YT(UZܭYV/@r!i&;Ind?D ehD#шF4zM̔#^Sj^~_>NinzP9ȕYcqIy3`D^ x6[$Nʑ3\_ri@ɼ(Ån#=I{bDUs`K$Zl;- Ȫ.w%յ>ֽ!ɺ/+a(aAlFh0v9P}ѐDoT!4!KT9Į2#WFLQ!Dbnf95oR  | 䵋]`$ a'Asp v%#*Ŧ$K&Gdzx妐G1|ҿ'#PLR ŭI͸ s#m ^]h<;-_N+vᜲe8 ~;|$#K)WĀBaEZwb>6:m D.6#~ G${WիiCw`jĚZ^' ShD#шF4m] *IENDB`PKwL\v%%5limit-login-attempts-reloaded/assets/img/flags/bd.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEjN*AnO&@mOkN'@lOlN*A*A)A)A)A(A+A'A(A+_LjNMVJHG(A'A6]K'A-B)`L=ZKrLH)A-_L(A-BjN.B/BjN,BZSIEG*A5C%`LdMAF*AwLH5C%@8D;[K;D:DCFXSIuKH4ChOHEFsLHfMeM>E7D:DFF hNCF?EYSI@EqMH0_L?E$aLfOIcM2C2C6\KLVJSUJ(A*AdPIwKH9D/^LfM^QIgNAEEGFG*_L3^L8D"aLPUJiNjN%aM|JHIGJWJ5\K6C/B(@TUJ8D,_L hNxKH7D2CSTJ;E-B4CeMfMFG?E#cM=EIGcM~IG[KJkIDATxrA ڎ` Mi34W{^=IP@@@@Cn2p(k`1q|Ұ2®Zז_U!1mĶ\%nl.;{>_a|9h:ܗ` R-]>8y,5662SºD7dAd:) u7^__)O;a0,]YM T 1+Ve1' 刖 az2g7$ h-$l d+YUw>4$Ns$aQ.Q,1V949F!Id7]hϊHmT^WEM$Y: \r(S 0 LkCk=9ˆYef*$NP,8afaӨБ٥^F[b{QiJ,]u3eN~0)F>#;/e k< 1eѿGgE Jw좘Gs9i_]/4C¬%2۹'?/t2 @ жQ?IENDB`PKwL\a5limit-login-attempts-reloaded/assets/img/flags/be.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE0 03  iͭ?IDATx 0? 0[EꥳhH$D"H$D"H$D"H$o+N$U݁#IENDB`PKwL\$*F[[5limit-login-attempts-reloaded/assets/img/flags/bf.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE5,?4;(4)2-/0,*1.ud3*+IOR63u2:^ABY~XLS@HM"*+I*M(50>af1YO'.}Z 8_*C E7Xz ;oDE<%q=@?FCF/nSmf+xA,n;a|7+lQ5"=IDATxeP`e,I }`@ 67{3/ɏp= A|!>@n`%Gح0ɑ2b#X+1nSI]Ցxh#LRkK}VRGh=iե'xf{LBh*E VBkfABK,I$CBLJ`{5%C,0av!~fa @fX]n=E4 sLИ)jO6L"JߋoKIW3 >spNNnݙL})U4<>|R'&-e|aۆI.̅ 9z13~)Kwؙ\+Ds! ě1F-ǕEޅ?HN`˹q ="W ?T7(19=&̨Q$p']JRz_N&>ć#1VUlIENDB`PKwL\2;c5limit-login-attempts-reloaded/assets/img/flags/bg.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&n j#ko4EIDATx́ ~> gAfAFD"H$M wAނD"H$N>)eIENDB`PKwL\Q.F))5limit-login-attempts-reloaded/assets/img/flags/bh.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&$ "&% ! (uP`M\p}3E%ﯶꗠ  #9K'#7"5Sb菙Xg镞23o|7I=N':#xq~L\$8뜥(;偌erꚣ)u !]IDATxE@a:B5>d {+SA3.!{ :s(u49BTILb zw(Sj9B4*} w^厔K"7c0UetwY/~.cYf*~?l^PA=ԃzPA=ԃzPA=^fu[/^eS`%0 8IENDB`PKwL\E|65limit-login-attempts-reloaded/assets/img/flags/bi.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEv,uukk8 N M="" **\\**|Yqq{j w 99::33e]33~~}}SSd%% MM|y [[@@ZZ!!҃tɊbbEE݄v IIVVffjxx<<__tt..CCggRRwKJJ8YYOO&&uTGG//~``qjjp 3EEcDmhb-a%U(zf}yLP틲k]I../@=enKvyy}_Wc>LBFYT lqo@@p veztjM3A>n7~qnnppthn zz/y[IDATxڴXV_C@8%r`XBY"@E:*CD(ElmK{O+a[Kr?3${.C#UnԘ!!TP%b. aXM#hJ8SFfXBJf!]-Yef5TW!wE̕j!.Muw̰؂d (oJǜ"v=@S[B7!1 O9m`OG4d L&0SdƮ 5=-ψ9sMMDn:J?b'_$:ٛTPkuM E0D#'K8;o:q}wW_NVNO] ;k`g$(1v:ή_;&$MQz57 ] g w8lf=[H3 MKw>;u_e5%`gTcO/3魲Άŝ9{"F˙!YXV<ܲ'  ﳴqfD3^Ա)aFB;/ȱ)D{n)B}G`SBS2>9-LٴbK롏F&`̨> joL9`g='l4NmM97@2#Bxr*C(B]+'7EUև^Afq)qIG2[:7i&(}+Gz4\~b[RU9B(}N4J"aORrH!Q=6u3x@y\$,<猅6A&Q!(H4q)LuS(R}#?aSl,85Akɚ%Yap0Ii L1eOvgi9LX`,Zbdt% R%G#;vW3b+* NK\럌&= 2($&JKLAjJ˃+Wov‡[2G.HoZ 3VQfRq)ՓWg_{]u>b!ԎbHDh~VgVHKVkZe3"-W2YLVӠz!H]BIENDB`PKwL\xM5limit-login-attempts-reloaded/assets/img/flags/bj.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<HPLTE1!+,FK %IF+K+4W]IDATxPv4RB5iE"H$D"H$ǧI &۴`үH&XI$D"H$'[&@PZiIENDB`PKwL\J5limit-login-attempts-reloaded/assets/img/flags/bl.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&0/x*t!>IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\$ LL5limit-login-attempts-reloaded/assets/img/flags/bm.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+ +i9mzhЩ4x!$}RP5jky8ɒav%uER힧+"%nE)(ڼs +k221E^Ѻs4IӇuV$Aq;kGYϫl))px#8dE(L%ohU5Selk(!v(JQG͚I*'\+ ${:k~ͷǘͽI$\h$ݵue@g9C]˨°F:Vgⰷ "ƸZֹQRV-XX+5PԳ9D뒜 *(8LĬT6I5M {՛,j/,B#}+B֢1/ӽR,Ǚ6Y( )1qwﯷ{ onQb`EA_[nsK=7<&/<!#ķpa۬.5ᯯ,  ڸ'IVͬ@RFB:_i /=C3/"L`%~Ή,Ó苗?nGGpb>W " $,!&?7*zELMqTIDATxb0cfdd=Pe-,D႓;|3QTpz Rq[֭áOQtKlتѬl|"nI2}tk,AbǤ7V$[/KЭ%ѭEX"n?wY`XDf{W`Vpe(l-v߬bPKfQXx6)Z2,Iid;d=AF掎@,˗ W>J%pp;D^ %pe'X"v9$ I)bc@;#G%X8}$I8X +,O B=mmmV0.$=) K-{ a9^X|دhT`(D-9~3ňdŏ6>pU0PǬD%GQX{.X@^fQ)RfU5* 1GO1!Ò%V`Ԍ@k!YSZ3`h YϏGU>jƅ V S K6A-9k|l?GIw_1o -,9~=<<9R9C8>lZX$EE&LYę"T5TU<5 !պ/kjkL%KKle9?S(pRݗ/S8,ba(N6P`M2%|-Y\Z!U1Q<*[$ѭx㜴 +9 K4ͣzp>E[K QAKlwE.{JJB{+ftE:j[r1ZH\hQyF[O ^U鎸 5SNbkYWRu5 03BSbk99ԴF\=gLZoNN̟]Nb-zzo߾@f.? ;Wʽ\1 +7ΕP4@eS'ٮh+WnbZ9*GThm(`Q0 F"06IENDB`PKwL\:F  5limit-login-attempts-reloaded/assets/img/flags/bn.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEXg iwJZ,,,8 A<ȸ(yE 'i" Y!E"V#b&_!]'9% BSz/b %K"))$뙣RT!># u(.@  &%;)!$ 芔(<" 'q$%쟩 +'' 51 &H$0$!5#e=N2D.\#'k )_"#h'PI@LY50 '% (t 6HoDDDSSS 777&恍f귧#9#q~ !ppp_V )&nd 鑛" }r N 1%} f&>Eq %&'o8-0eNPR_P_ 6Pabb(&E1aE!&ٟ*-%3!XFHﯶW$,:K%lppG`o))) #tivBIDATx{\Ze(,r-83NclD*^6q! [S79ljMJ-n꺫[vI7=ͭu.JVA.}}ysH3ik\qyf/&B&tg9.rȣ+oX>{ޥBzۍbx=LD4F hJ@Ɨ#ЙS k:790Ő F0TSSot >F0pI\6k:03 ߥe|;ᝩ鵘%}5afZ{kiK*co|$DHbbveN`mr+➳wG &7ͦui^_Ni<. lC88Xp( ˟ 4A^ZYN.4@ɟ4zU42AIGZ13MD#6zEl) h*o+`av4֡XŽi4xN!|]>o %9f\8XD\#1|5c1ٕbM[y!mB0gvQGtS1F覎N0oaFFf6@93bG ֘Ec_>Imk{7DuFېvG;Y݇y34';ON{Iz{T]@R~AOFp }23ʆ6c=n҇ZD,j8śV5> !dhA7nB"s'2[a fyG_Tp"}µLja~#8-S D )2}oFA80$ ҙ=S,dbӵGA!فƻe>ĀtF0B56[> H-6(,q?7|+J98NR2.},i-ǖPxn׵!g$U 5RKA),%C|¸E=^@em<*9xe) o2Q@*uv`GXQHHe$Gn#\pb8qIh)Y#`?vY.֫bZ (,:=3ФYW׃ܜdQe-P$bbz@vI+ /)pH.;k)FV 3VV. ;s(,UGԒ7%0 /d_doܠjJlשׂ2e`ODOvAm6c͆LB 7-TL=tէek2qt!lmHPTq:V*IU __,:y*̉!6Jf CHZ\ؾl=+/H7݇ f2!-c( J+FI}+ YF>^\,3Z7"ujԛۀڣwiU3(`_=wAH:/Gm!j&^GAH!hqG'%U$P.W+~^gCel~[J.jXat+Li^`>#=dǤ ?<̵ޥ 1c},u4ɐ $K &Wo407W/ 9q5'̦/s}TwriegbbW^K>,aWVRgByheI3/Sv^>>hZX`$i^Ջ8n Xff&:YrPa VKUεËyy88g GXlyۧ 8^Z&<;[,z>99ڟ/;2IjW7YY"YߖjQ縕9i QN*[l4>o CՈةgQ>Ujw?s|["A]K2)q]Q-{0Sgrw}Ե療 w5mmEyS7x\j]≓q6}C2 ydP xo]"[ZZ>@q-.R'wM r9+6=+ƕX(x/RjR ZWSݭ^4{ {C: 侮UTlSp.z&hєEr N _p tDt%#"VK貋2h`!-,<*\+3#%Z2jɨ%Z2j M=9IENDB`PKwL\t5limit-login-attempts-reloaded/assets/img/flags/bq.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE(!F#/%<]A%@+BIDATx  ?[x$ $`d+S H$DryddH$D"ܝ !'KfNIENDB`PKwL\/ 5limit-login-attempts-reloaded/assets/img/flags/br.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE"E +IH*C"B}ffvwcyB\Thә:?FʇH9U *HB!@#$ F 6R6R?.LR 59%D*H A ?X߮ݛ %A'F"͔~Ɓ!԰ώ#Ediʮ*I١ݨư?,லை^P:#Cc88`ₕȸ㷍9T&oĆ=T׷o/(Gpwڟ֞<y/L+j5IDATxb``g{g[ѭ+lOK;*TDz\ if@x.2#2 }ahﺆMؒ4&  o@;w=c8Y# MdgtbQ;s b휔ƈ6hP !.to@@9d!Uk@،2>O5:)az3s9}k%&.nBHLY$Ĺ2;5SҠ(ݽv;7su@<$OA9\i3$`2t}ذ"bwL*Yvg$@Lb076g`RɄ h/ 3̐Rog2`pca9Izi, gJݙL1޵}d3°Z22f536 3a_{& Yw9 ja8uj&VzR KԜ\ C'6elEڕYzըIV-\y0[S7r9#T2 L0;jI˲o2~P92>[2QsmTTxֳ?cÛf~-1HE.I9LLYyY-; [Kb Vy8 kAnX{Zs0δ8adcXz{}`cIAՕ-8"@ YxJzwaD.6o4 mXˑ 4{>":)}ܓwϣb[ڍUZX9j@̚K !!!"""$$$###8: $%%/1z~ f_ Y]vmvnskFA#$13&"F@h dhGJ@CI~?%!ilZ]TWÝ PSpt!"y}UX35.0{rFI*,@BLO(*X[ GJ >hl$&MGFTMty?:_b~nf')mqSVhմ?>MPNHVYY *& C=50cgfƹ̽#˴ ;֬;>Zʿ"ĀXFR{$T'3:Wf$#.f;pUZ6dpTwɂASU^@y!!HFs)u)$ ?뿅b#)1:7ŋh(?y~Øy.$EJ1wds6] P"w'p!70$DP[k{tƘǛ%9o 4C2ԓN^O"1&pD"م- 7&kJ5D [CEU&Qu o(6De-re /~ә=1(|ekޮ4 ,%4}:C&,i J_ n"հjKaчU2F)5!`AnAl^bf 7VIENDB`PKwL\'2 5limit-login-attempts-reloaded/assets/img/flags/bt.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE N։uΧe7\;8ܨEY%ʐ#f7zWsJ!VJ띂F۳~*9lHNJ 峛tIH nܸiSԫםM]*颊㴤ASrLv쪔#Z&[ݝĹ京) ʽL뮚*J ﹦뻪FuۓNW"L!z~cKUƺj?KcI㩕Wm@].{גF w⿲Ǹr2Z xNO!ȿ$tem܊yQNG CCK`1I%`.%PO㧒֞ia1ONςO >uuuߌpɷkCLR!"ΰh6. IDATxڴ\piBrx@xgxBSxV*`Xj=8]8DPE"mK+3mu[n]n:M֟/y|繻nCt8峄rn@SWw!TZ]ݎ3cN>n"wq0O*JԨHAH^pt30q{<3:,S=jKEϐ9lSfF)q/(7ջP}+\h>RMPV9" 2zNպ&4Fi;atu[uYڜ)e/|dӕqi3P*6D&L S]4'%eCr>E BHU;,4H:&Zd9!l^1 1z7#Ή>ٴw` D4!xWAq%LHGCd3| ,4 P_p*01cҪWhH}F͛fƢ8%s ajo_g)-mr%XCUWF>"kO Xų뎢^nC>>6]<]DXѩ@N톔_oW ,Zoś:M{3R3OFPQՁ9OoAsN,*0#SJY Gl\ѫrA+n`|*L ` WpGYbow@r6o*Шmޠw)+sfs7BjR*.Yo3v3\QM9C:yc%+ZU]ݞ' sJ9(mˌ..PtIE$8ӥ$8D?$'3m%dPV7r̎Խv{vmk%.1(VB F l֫*jH\=vlPTj;: 2k졧_/0D|NsV55*pAQW}IAYgaL0rd+2<(Mǘs?8Wkc1}.t:>`̹6O S?u'&" R"Z &*)h}uQOu Sū|ꂯZJ&?Oj1"6n!ƽH$+3|2joyAͰS%aGGO?'Qn Tg p#B+A  oiL=p8F8yОO CX"g|]L W擂xtM_ߚUBԐ!%*74Bi ˁ4"d^]5zCx1 ltĉn&`zr/ièWD5]5Ȫ9>c}x1 W%Zo]Db%RIB!GRb/N IENDB`PKwL\;E5limit-login-attempts-reloaded/assets/img/flags/bw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<$PLTE+++ Q:`-IIDATx 0@4`W$I(.UDEPH"EFn`! x|@$ m!~'IENDB`PKwL\{  5limit-login-attempts-reloaded/assets/img/flags/by.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEBEAjj➞貲%%qq^^vv>>޲鷷䥥VVԼ!!ff鴴JJ00;ޑ99깹22  ܋aaB娨YY길((㠠99Wʮ{{:--簰 DDTTBB""ۇޒߓ+3II**箮檪KKllPPcc ܌䣣 GG77MM=ڂ||--<<&BB((RRڅ00wwܮooLLܪ뻻>@@NNFF궶 55PPSS@@44ᙙCC44߸%%ـ쾾.. ::ۈtFmm33ޏNN||֤ZZݍUUܽ..lsDMk=붸^^ڨYa08 ꩭ!)鸸Bݐ--))yy✜EE:piU'mmnnڃBJIDATxڴ_SgF!\ L!b#( e%A(T(2*APEPT\U C[ҡtPk缹s9ϽHHM*!\ `ly:`@$;>E@Vz;`w1RAH"5uq"lrkl- Hy0\d,0ڬ"`<rK d3zb@ޥC5g "s = ΊPƩMګ )͔ dQA$\XzS*(.vgM/ᇠ4#8EbɘrnYr%y(0'h.b@J@3}h{S!4FN쳶&Wי; w<Vt Fh%0w)(1\]@ K>vN |*i ig knݧ&0 MCV(*sSOg`T\ 0RFphapbpyζo6K%R|2Y64MA\~,4SȌf;VxA8e_EE9 0\ ͌ƺ1l4 t@x/O)oWLjqƏɆcB)a]H2,*\ϗD9Lm *E)v?^}<(/:'jVR HDQc'iVuw8Ϗ#@Z<@v%/!@tnb|m\}3~etL rÅ«-]>yHϽ稟=%'wMU, V_E tGb=׾f,}Ļ%lcreD6Aƀ@>" ƺ߸Yy&%h5s#Ar΋\u?|Fγ cW2K@I.^ a(' hkHҌAwN b@=>;8'#_‚e5n.kKKFo|v C.]p +Q%_JZ` ۾AsI=yIENDB`PKwL\z995limit-login-attempts-reloaded/assets/img/flags/bz.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE?&!m{IG+DZRM6sUHpwZ+]'mhڹٸkA{iMxR ēL<Ʈf7ɯIyw4ordQ8:gO$%y1,5ú<2kƔS ڽD԰Ė($&R2vvvXp0R)iΤqZKpݷ6č֪_`ig$@ą6g9%ZǓJsQ4YOM}a\1Gwg*+ƽ4۶ceG87 X%c^0 D׽ϴtI9~n\+zdʈh?kq 7şⳎS_/aapMZ zE noIͰ:O G>Ӯ>Ay(uu=عǫ3DEʞNA¬_ | ;Ѯg5*~$~Ldm`em |͵U% SXIC9?G"y~wӞx,~z̕V./T/0C&d& һht IDATxY{\S@C5 h@0KeqG RpE H-x#P(6 Q]mNX5\gUG,r8/sgr.e𫦩 JSEfʛ3$4ƞ,P,,Ǥ9_{\TsR*$С>u\VL\}Lk@ÆyUKhvmEbg-Gn ޜ_Dнa)!@ W[MH$$zǖiNY uYJٲxY/F%候Fi8\݅tk,PWI`s% 2,+l4֤X7`-%yy '{RvȢ2#+"z@ZQ"8DUbA[u BK ϬtlmdA5dI1/"YyND~M 'ګļ 2dS/H0%9#p Lɘ{8jfRC KT 4$\K9zr:p+ HWg%ð~XBZ$Rrv (#k 8>,]p܈PgWc*\n~ u|~,J5H8Fm>>UѤlowB/@rY%oXynz>40~'\ԏKUjfV+Ays=)-D].`VdGNM#msmn|mX %[#B!!&̑9)@GbJImGȎO}WAT f˛4~I_ Aq{-^(Uzv8ZC?U+Oó| ӥիCn72_£/3}gM0Z~Zllpu7k2Y=B\:NSscTj^"K$>]v߷߶&C|\nfhuMPF}˅ιc{ڳk׶+큁ۿr?T"02CC>zs'{hgA{lgjW9VgRnZ{lW|7Br[:~v_?BI*' !a;X$ EI(=g>]}c^| r7#I#ȗiZZ+-It.U7:xy+3Jpy1a#(4A unrXloh<{22``@6K򎖦U ' sMsph $_ƪM4ӼM"/8N`zVߏWK@P!)zaַB ]wr.7,4;[xP4< EUЕxMn|7>b B)Z>2T.,6K:vm֩MC: 7Q>$DIDm,}07.-1 hߑ؍:L Qz4]GghVKka;mT'IA·_Ly<$s4jQ-TfiN |؀c )r *ʙ@x0!H|_ߪgT?<0 E\q칐9(Q(&Pc=1nSccM=ߟy1hZaxub —x4iƠC8;᠍9pf,G8fe&H('n|< Yœ20숯n9EQ\*\a@>eïudsY:Zؘ͐"#:'#0666԰5RhSkL(ھ c Bk>yc eOQ\U|5S'OF_Gk #ya^{sAqܣzAtm4_ E,4T4%#2Eh HUšˆm@ Cܛ[xʐ $6=p7yV@J=MۖI (5:oѼc+P8\]!r&(1\rdI{R64n;f$wlknW{xԔϓ'O`-b> NGN^Bt)×+(Msl&j5!X7T6`yJJ|M,gCAK^7"ŧQܥ""=<$պM1k(*)AlZ{TUҭl3iwVD,N*YЫX:-IrGV'Dy = iB $D`AYfL(5(D #M0NzIǨ4 ^Y#u=i'<-:!.~H}sIԔ{+{/z_$Cr4;#Jȏ;#YǓGVTGGw#%+rH3 z+)IENDB`PKwL\z!"5limit-login-attempts-reloaded/assets/img/flags/cc.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE~}{|zyxU X~xa$v!jv;F(,\Y2JpAfn*} 7|"E9` ZD; l=3M!OQ&e1 's~ t/'u|Hܱ~l%tƒƏ~n@A զ}!ȈYV?}{џ7"vri^k,i$C8,p^|gъXy  ziNf4>ttsmIDATxWgXTGͼyof^uaAR^BG T% Pc;Kz=1cLLGve7=3;n x^!`\鿦 @N_eY#x') 9seXDY%JP\@쿅bʉTh\Lvo+ɮm}]0wQLL.; :ݛ9[Kxʉq>} v6SN1"'8STR pb|!u "09!r.Jo42s)'Dž_7_Xd(9\r"_aWF.sK}#[qqG!H01bqOq/(=/M=zlF)zn.zᓭDa3l>}s/s{ ^WcG&Ӧ"`єϑ]b#^t DvIC/VYCKOJ=;&2J̍H|J\H9u|#X!"dc޹ =Z^1Jb|VN 9x%Tl*MHN) k$sA^\in%snqe YTΞ˛J] J-rd#dE榧Ʊ3om0O0f̲ z2Irk_hno5Q=<@ '䧳ʠ[Sv3"Uc;N2JHP0|h- Y.Ѻȥ)Ҫʸ]IC_x*c/*Y7ŮP%!8/dUh=#! z@˓31o-Bh#b~(rjR̯R]Z֞I ZZ˶x{^\o`9"quNY{1;"Hw]5%}5y&@!,Ez(8rHO}WɢcA5fԜ֔O<5춐ЇJW xM9R꛷JSPbWmy|qBgj^`nvKc~ŻIENDB`PKwL\%MM5limit-login-attempts-reloaded/assets/img/flags/cd.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE!z}|~ ! !" {!! !8.[@e `"!- 6 !y5U" ZyP "Y5 # P!6- yV6"!"zU5 !aAL5=E.L 2z!~NR S""wn~fvH~dl .!3"'5` &K5}kx+-FU[8] RXB$ޓu!D; t,(0]b[S8i GD/ԍ{6 T}c~Q%(' py}$41~  !zIDATxu\qLj""Pq(nb`+("bwwwvwwwwwܶ~羿-+a]8svX(ڴ^Ѿxy 1HE *Xb*v @@CZb,<s 4FR붐@J'Fj_ s ԓb,AV<TPQCtATeg dD> l)TkAKUYQr0™qL`שa8 v:ѧ/)}ɣ\T0rᔌCqHuy*gܨIdfy%?QBf{=ÖTWFRTs?]bk qoSeq::Wd&支l$}M/2$1ÀH[gwtÊXe(wO*W4Gq\/ƙG7EK?sjP%Z6C$jtcR%IRW ȷatDŽ;RH 0Kfc܍nL*  $ZZ1QF7$ՐUQZR:x|0Lzdwg2duze7j8Mt~hׅFI#E}>Sx0~cWS3ՒfrbԠm(WuH̐a7=N*$Kp3vz rp^ 8~r,2! pgnF'g*<)*of3R .K[#%х'ULٲ2:l{Ggct;:Ywt6F绣1:rk\3eQF'_&ѩĆjtM<46ft}2aHF78FR"ѭat+%BJ FR"ѭat+%r@FT"͗ht(BڷFRT l,)2l=hIENDB`PKwL\MX5limit-login-attempts-reloaded/assets/img/flags/cf.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<ePLTEUUtTJntJS1++%)~р~Ӂ\\+F}))zz88~~T550hVVWɢDDEkklQuoSK5Z!  l(**3B:ii-^^eeu==<.mqFPPoXDl?j+LL@[ TFIDATxUOQ᯴V)NwPݽ! ¤dh.ȼ+ə<9Y3KY,><^8@c/,H~<|ա(:#"c!"|:"JH7h;^x"rGF1/Nok`FQoD#|G),0!q4IENDB`PKwL\F9  5limit-login-attempts-reloaded/assets/img/flags/ch.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+%(5)ﬧ苄J?,)'=1똒xo}t&K@+쟙舀节<04(3'#ZO$me$@4﫦;/\S.! ?3'NC 뜖)H= 鑊ퟙ&E9%*Fi*IDATxط0EQ8 ms9gɭDcw-Ψٝ!HNR;.t~8 @pL%HL4BQ @+Y_|(samTD$)[F1¤EL烮= R@xI&H+zBqRh|j.J~6_!o`0ˋIENDB`PKwL\sxn5limit-login-attempts-reloaded/assets/img/flags/ci.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEܨ5=IDATx yG6HF,"H$D"H$D"H$D"H$&O{!gPJIENDB`PKwL\a  5limit-login-attempts-reloaded/assets/img/flags/ck.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEf.eb]dc#'"cw_Ԓ55=U22dx/MO]!#|"'.` `v$ȅb_OPqq.;U.H4I)&33`p}!"{""y\揞,,z~4k_sdwrvawnnstxV;T!7qnHJ,sMZֶ^1?S(ə'\ :(.=ORh6_8?VPD‰k%'\1ͷ} -q931<U=%IVD{ | KyW݈?WґΏ ԗjΜ=K!{>Rڕv!}wZwy`[ې fwe5$\ ocgw8ћ[pZK~ 6Q6J7Tgl^ZKn9;]op݆Kjq)(ʲн+*EFQlG(?Pb/ ƞY~̢GsP@|Xchٴ"bTV5W,lYݞF%l?uumzĄqNm6r ®`Z;{1)5,&@$"Oa4HC,1 nc RBYjh0 X !]Brai֎P0\Xl"ى\;B`e ;R!?c"ֆ-ٴ6O BUPR 858nB )b,&'7eR ˴4AA3jRwRW|GÍ^ A`om`{a:.Z# \n%Q|M2(WWTe|"Fᖜ>0 (Uv;َ!DQ5M$-HHRii@' ^.E5:i.Hv1I4fG8Ƶ cFD[gj"\"w 1Ԅ%Mg^IO46f3^1ߑ'ץF=^ >h6um/MTw:v>څ f]TUM+Z {nCM[<c38t(T }ORIENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/cl.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<kPLTE+9-*:lZ3m87.14602,:9e513/8cMLhuσ&=nAeAhf`ힴ;f'#P6+,Gao@g%b(pKq4bdq7wi <7H4,\Z,j~5tw(S%V>\a>IDATxUk@̵[ٍvuwww74B =0g D "wG0~$6bGxaGxV9rAM)ÊZ ƙM='}Mpj`rC?.W\faCU GE0"quWKMub}'`3^xhVlfs˄#/; +}=3h#EIXy ? 5Xr3rVG;])EF$Ӆ.ln=2\[MD"B!B~!sF7-țIENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/cm.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<2PLTEz^&' #?AK(a& '&8#'' ''A" %% '& &% &?"& 'q'&S!R!I!~`6#l ':#+$cB"D"!%4#(K!)$%&%$7# &&(,$] 'U m'{(IDATxR0`ɽ{'{+.Yto$j(e.Mm @b?@J^urDcK~b< af,~Z}l,y/ELH. a۪*|w>SYOӜ!7CrwBP2Fli+:+՚4愕Sy)^pN!rrt0v%27r(lj97F.+2# @ _ ?HIENDB`PKwL\r @@08e V | Q -L #u l )p g y v 1| Ct 7$/Y s AA|IDATxU@3I ,tݽkuwwwwwwwwYeҫy&r=I&E e&kleMߺn]uțo.Gw Vݭŧ^sT<ob0n%"#ewROJ8ac^)|zMG*6B3c7MU؝Xi\?WqdmnQb ؼ S\! ,l̕=;-UFuђf"N5EZ(%Kiqei-_ 1??AC]LN\ϻ,i36ѤxeYo;O%{э(Q#d*c f"3bKS=T~-(ЏPu8*nTEAOLͭJn~ss\%{ UؘrY)(זӕ l=Ln enRpX?اԫ ȃIIǗܧYR7?ZZeennO I9R5TKK H{FFSl-%%@?zR%pAL8K9CCSWWOON#33 &*OQjVYQ((_B;?= c$kTTL.K7PP553A=nL $vX>9;;Pп4@@hh .q-Bd0@}@1=v*}R5??P5@ NRRUUl-e3+-AS%EА!c!F.BǞT%%"", LLT€{IDATxڴu\Ao8h<w&14җr2M궣bKh=| p ~3Cx9[̬ q˻4Zb+V6699o/)Ȕf )Laq-t]rXxf*dEZt뱡R\1٢]zYFr|&0r6SwT2dMA\ /gxY)bH7u)eG*`LRӐ]ŭbq+<e{ɱL *͗$p]wn62 i0 ^顚Ғ#lEZKݺ3bW]$ )&R*4h8IENDB`PKwL\#5limit-login-attempts-reloaded/assets/img/flags/cv.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEs9)sEQ/-om xtr)}á"9<^w tRMTW{t!nv="laHtΩ-2dy:3/t"+h {W\qy16bsxuq]XNl|mA<uEVQReg zU=xr$lr ANMJVw lE%w o%-g}7)EEYv=AB[O}8v s'ٲ k s. /$f]JsH9.ӕ67'[49`pr?1y r r n)i(/fuiD*o q n$#m h^JrfF ro3[ݶBDZuѮ+!vp8) #ǬtnduLX+.񨡢0#-CPDQs;(SHGXKGXM(+޺ %k- - p r=?]t>. k$z!x!y yz±sxǦ ƨ5rxp@u.y.(j ȱU |s]aZLe )IDATxbadԒQKF-dԒQKF-NHY[(J]&+Hf! `[j //vM4z jNg>*e}yeYYTW!7iC@ OߜMKLSS~0W'=O)O}c~[R13x#b]F VFz҅S$+ϣVpI/04TEXޣ7 Wǻ)JZq"|^lu_}Gʫn JGuyL b0Fzv(IL, 7_T&s (R1 `ؼ7ؠDB006 BK҂+=~gVĩB*Rϩ7؏Kj&}m_J-adXǗaOʼnE|NRX"e EƎΌYbiT,s!lK8AE=TG0ܹqS`(f9ؒU[LȎDXr+nP!s/Xv2VBaJxmoɁ( fMs8o.`ΌN^Q3;NZW,EAr|~||(+V9:ī@؟2K&1{gI5'N`׎V%3g 'p:;NPI,H W̸@(oT2LIl8@VfKߜAKdunukCZuA0A-1R/Q l2L7m7%!Zz[78SM @Al ҜvZS!*V3C`,/HPz&"@Ukn8{n o\妄s'j8P\؈'ZwˋV3|-*& # *_eIUl}C,o0[`❨c_ M%Kq BMsp]pw[$GB򓉒弪o`Q--zAAij `R@~N+eFIENDB`PKwL\o5limit-login-attempts-reloaded/assets/img/flags/cw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+) 1|"wLx)~!y&|*'}]x*~"z xw(}${ y,Pn%|HgQo(~%{>, 26Bb 3c~a|r\sq91T;w<]8Z6XF\/`xj*Fa`{ .`{|75Tj8S+!z"y7u${KfUrsB?\p1P9[pf_wNl@],-#zPg11>)~ 2u8nFf3Ro 2Aav'K.R<;Ql.Ki!F U|IDATxnC1E]$/XfffffffffI>+ sM`FW%:=ǙTNЗ""͔,@Lf{$P܈%!KjV9ALtK7/|;&ÔhFgs$!G[R T[_!5z0"vaZwRιT18BW\$W%IRlU8BK!&װa\88#)3k䑤91fxDG,@$œ/eڎ'TFAMVIz˥}\333001K$$$p8!BW;1IENDB`PKwL\O# # 5limit-login-attempts-reloaded/assets/img/flags/cx.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE!B9999 9;@ B=B5CdiBBE]!B92I*F6A:bvdc C )8B\?C,J^#B51<B<3Be?9Bc?2 C{qu&#"djE@U@6 K<;Tn?:ݽ:B K=BAC>i-%<<Ǹ;8=CUk9:6Px>~>>B$9=%"<#?8h?>BC3= &gz{>,BG:X '44Ja )\q˯]?6 B7.HBټV9eh8>,2C3BϪM̤RݳGc: sWvU\[C= G!B枯;GO0A٭KRh9!&M@%= )1_IDATxڴw\g穩H mCH0$$Z5VaE@ mq@ PX.(vڽ.mV.$|>/|_>zs5w(!`؈ c~FsQ\Cl+@:\C@߽fe!6q`L aeI 5˼_8p иdL\Bq%%͡4, >ĿE. {Džh`>kPU˶xeԼE4rE1 <ģ/oرDT|@. Q\&*e %1Me%wީ#"ݲ(t]@]\*I2 C ̨ٲB!Sv!>S J-ֶ1qx Cƍ07VQf8>-ɘRiesZ4c+P!Q3ћLjrcHY i-n^le >q=r&ыL9ZIܿ AKHlÙ2/^ղO>1kal)(0h9; YҪKRi-CH/kh;'fPY 7Unjg&hqÁ!PDli D:G~uCxc<$(*DF3]珤Ԯ=*"bk7hٛ42:KjFj\[W'p]?}{3b랥3ҹ cK2b9uN ˬޫƚlIZO3/AK"ȓZ!\$MT2yk|UMN4>vE0w0.r@o}Ay>q:LO ,j\k}qbUdŲj[Ha2AaJa\,'n ZBHdz?b.lae'3ffo$j[{cvhh'&]XmxYZ'ᄍ~e1՝+d+U'Cީ0zU*'%@j 2e^ <-Vp°PQu\/.=٫4:5E\ s\,ϬKF;~'ڝ뮟o:wC'MOdљ 5I+W.1}'6Q|@k^K?"޳|vG^|w΁V\ 2y2Uڶ,^/SDV߿(g#,Rz]ѪCf*U1\jEz0USyoL}1ޘ`ȇ&B@U8Js?G*Csq!*Nos !֕6&p>~?~M0[ IENDB`PKwL\]$""5limit-login-attempts-reloaded/assets/img/flags/cy.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEvsunorqpt굺ŶtCQ$مxaΤGT)~ډ%˽ŕkKX.kqႋmfqN~VʝHV+OYe>ۻԯ9H^ye؃܎/ݓ6mی(xjuS껀q|ZĒxb׀ن 뱷ǹڈ"y^jDɻˠ@N"Q؂wޓ:ES'ݐ3v`j[st뾅ٻ~ w+; 뿉wP]4iów؁؃L\ř[Ӭܾr̿MZ0>M|³}hv ܏1ل״ط| ô{ۋ-ی-܍+;JvS$[ Mw ؎5?oZKHP 2;c (^9ý[AewH ?NS#W0< 0oD_֌kb*ҭ&0YYTDQ0 Fq2۸IENDB`PKwL\֍5limit-login-attempts-reloaded/assets/img/flags/cz.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEE~ =yD}H{+I(W ?zHf9v+D}FE~>:g>:h F+E}f:v@9g3Y ?z?:g|*H(<{,[G[ ܕD{.IDATxڴR@ a&p{nęɤV]rW<]qG#D!!c3Gh2,.h@rCk].f6c}L1Px1-P cgAl^3#1 $@%ě!RbHJ h|N#F41rdY.{*ė;i~*wPdt,̐#uy2d?˸QfHA} \D|rDqb$5xeAF QD`!f툷hEROx|#}bu]$cMo#2VX"'BO<_cxo"_،`Z0xnIENDB`PKwL\q5limit-login-attempts-reloaded/assets/img/flags/de.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE3DIDATxͱ WTbvHH@,(S@"H$< *H$D"w |'IENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/dj.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEfkE]^c6688b~~ƀlok倾mđ65RR||^QQO87CCmyyGG}}}}Cn~kIIYY>=PPmm94n??77]~~u44..pXX##kk mzz[i77jDD~} WWWIDATxڴew@ͽ LJ@-RU(wwwww+#²FO'yLė/L6KH&nWV]#LSJ5e@V{,?s*r416fʝZ3EX1gtj+jbD0Wm)bD0CUƀLI)bĊYtʆb:5•U@6j+Ď(7y٤FƸ_ͬh*CrvH7ro1v6*b˨uJG`(bGcUo197`SccPSތ^?8ҕMX2ƾ ӜZup| G?Cnvi,1tD36c >G鮅纶Gϱyu+Z dzˉc;olFYFE 7lH@}%Gp!PYzog,6Íѯ@b#w*FDwČψpB! A<\##;#b]BQA(ETe!p 9X6G l-+R!AxujTfx!< 73gxZ<Á=3b_ 5E9]F1*BA3,:C km@Jwg#g^ӓ*IENDB`PKwL\YREE5limit-login-attempts-reloaded/assets/img/flags/dk.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<QPLTE.- +7 * )' *436 (&,$?jNIDATxI @ Qgϙ4tF!CZv_"j!KQOHP d-j|˶kES ӻr$ӡ"ǐlIT@hw-%GIENDB`PKwL\   5limit-login-attempts-reloaded/assets/img/flags/dm.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE) 0#*QiF )0\M#iGIG( +' ItQI,XXz{,;1 V)% xFeTei y{,{I)F "$%%+\T%J UU l+)3*iS)j, klGټ: % < *. Èf%H $'E08{ !5 4 2t- m! 6 0P Q(ErJ 6 (vvb芺wg'<= (< g*>( Y  \ )* `6 W _'(& 8 ' GKH(JIO T')a)1eTFU2h }I4Y}@=!zB9@]r<&?R r q {!d5NUM`hG=WD? ֟;&3kep<]wx: +/ wM *` cC?IDATxb` 賰X3#(3PZ2jɨ%Z2- [lɟ4D{cV$Xb=gUU-V>{]D}KKKI>35-Y8_Y?`kv^O-+f-&UeT+[$J\&e_f%eb@;~l J[*,>V8:_\G^Ns'z}b[)l k>,{H(Zqrp?BF0f¾לt" d@< -Ꭶ!#7bR"R/5@f0k\k2^޽, ]7 LG#` ~g% %E`վ-- "wNHjIԄ\AWۖK)O2o\r&$"|q30/)[$/%M%KZ=9!j@}OU2l~o >mBR`P:q)p{ 4n+!K5A/h֪cC@ⲪcKWVk ^T 󉄋YܢT3h#^SXb̬l -D9)0D3078K3%^S-0 ph ,xSNaPYRKᲷT7xmz7(K%o\[33敽g}y9?ns&\k7"'Y::Ҝ{U.yTHx~ l1 xi.˷mQSQ-ft\R!^SX4펧xM+3rΟrz5C*oĒ-;sG36xOu R&QS)s^X̜ߨq7iܾ;L)Du3s" +xyXE@E̮NPf `${s{)Եc(d sT538F5Z<aִn41 $f0p[̈́w'mj b|hm|[ I\]+kMe1rh %\,.nJ#_h V=9Dvb*5x)CjG߹;KrElmИEGUvK+7zuT䗖i`;V)K0Yɚ™TiiXW\_TJw[Icєޏן=ApYSSS@{S4XXF{eleԒQKF-dԒg @DIENDB`PKwL\Tf5limit-login-attempts-reloaded/assets/img/flags/do.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE1)F'**/%8(2-SH,Jw i#C4%n㹍㔾o|Yֶךꔆ㉀vĿϕǪ͓Uo_|C5xKj@߿!#EmV?M&|]Vzc\tT/,pʯrhݕ?td)Q~nS|rngƼ]w$"QGdܳ᪒󜸯t&ࠡ}-`wH*WQHnԴԡ(}[䒆oFԱȆlyOYzIkYsBmlT5\ނ`kMϢۭ|otYzŽN; F =-B2ASwsAR͍mW~ˎєqƂnN+,V̑pBXxq_Mzؠurš_uL@銀tYqG٠Ҷ̌yyIDATxb` |`B ["bINb)X""H,dԒQKF-dԒQKF-dԒh ?`"3%n ˣX/X|-hr>%؈ L˛lΟYrIHdZMLL5<%_|9Ē54Ĭ̥|qb22^ݬiC ]4I+(L[ r4DYk[L򳗦%Z[WFOwطJJ,m,9tUf@ {'o;&xﱞ4#̟;j r|NʚzWVxLHPٸdFjwBR,a%U(:2Rtvb yb|b^qK= DWI>dԒQKF-dԒQKF-dX`:d9CIENDB`PKwL\;5limit-login-attempts-reloaded/assets/img/flags/dz.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEb34`1g9g3c3 4f3e344 44( 4h3u4 4d3 4(3 443$T35 0e|l9' 04s644 /8N3+4 4 48V,{ 4-`3!\3GG3 .4拾444 m?JK7용 ^3΍-4tꎟ%4(4:K3!4UA3듣f8)]39c1 0QC3c3-e;4m744a=34g~+4`3Y3 4#.4Aax,43Q脖4 44!B72)%4*c3,-R3D`EH3j_0섘,ꏠQkܤ'Hꑡ 3&.W8ݬ4Yr ]347 o@/4X3ME34'Gk84'+%2엧 3`y 2|Wpn[?36M3희czSB4"D20P3B^BH3?\)40Od1p74VA3v44&4wv~14Vo鉛-Ox34x44)*J(;>?Kg/Na1&'j9(S3DbFaj<;Y 4yUB3 /Oi444\uU2z5Sk<6FbHdkjmIDATxb`$02 F-dԒQKF-<3%l?f:w%\ls/;|㑨)S7%lKorHɛU%gp1mV=˸LCZꨝBrjsQ%l6_y!VWfĪ2Y¶LXl7G.E$,a VcC(U,s!Ʌ㫭` ;W4ر+:[vLl ';Z LΧ|]HRB+ O8u! aZdRH4XC,"'DK=!ɗc >qyh%@%K8C+] fI5W-m᧒%lg!%<Z8x$~fr%#*Y ן ugĔj"U,Y"Ĥ/ ~L8)1$%lȖFo K7/xL%PĨ{.P\qr9N%^г_O8 M]*efi,R.Ip>a7/-W(gK|"j`ikSAFB*N-+Cu^VlC@7o;4N:]NuPv H+h!VXRŶ8 ׌7 HW[u"*/*!UJ ^_-9zě*x1)-vg,PFd Ņͳ>7`%li[ yh0*Y=_6V=szVA}U'lyZ<kZ6e%\|<@9K+)UӠ%$ɻ6Q-uz\l\se&m?bǨ%Z2jɨ%!SIENDB`PKwL\E 5limit-login-attempts-reloaded/assets/img/flags/ec.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEsfQan*;ԗkXDufJ0ʒS-*JqW'Jv* Th3Ctɷv%% /6oebį{q7D9z) PA Jvmv2դ-Ƿ$:-3ηaS!w1 v{*Q)"~(6zI WL,Ee-lƫ3b!C@ǧHP*vj̖_;JGDND&/FH#*;B !G8 -7ekԼ %E! y WUHIY @_8>e]1! {D#E>C`E3sO \_z~ȳZb4&Zæ \IDATx@ 1`zQE Hx <8" +NQ*(PU(*biVW ׹^?}@kD$/r!:ha I2R8EԄe (bP. gQVVS0.7M*Y%+y$C\RE1+|R"K@x'Y59`ܑ\n,73eNNC2)A=pOXuYKC\ `d Bj4BrA8J3CƗ'P'(Ir@+3 쭓Q $P '0{ &GAKmLHэh Q P:1y$qId%Pr0=BR]vxG@''u8Z#kBXta"s;D§:Oa\֣佨{ZoPl^F"̔DU˷µr}H,ĴSRzH(I'20H~qyjk#38a0)I( |vצ>%{{ ^ƠFw z,bZ^!<6}zU=rs_2ҋ`ǽ:=gA>22-Y|Go075N+xo2#@qdԹ ^I*g~ރ2Y<"zς~ {mgMkٸr y-ȻD@CDL.c D>ꆭ۳`bۥo[~*Oo]0@R{WtYpdžH~t۪o.UUyYű4Wv#j_> ^;{Od;,!6 sH1\Է`^|&sFӅ{&Ndͮ0<H Jz#ʐ;)%dTUVHZֽ}5lw_svkvw %xg葠ɣ˯?@9bx6mZEMvtY3c7YٌCfOJW}٬5v)CAF77[ЙHcDl fS!WTF:9Al Mrc#8DCAet@PSȵ q5F"֫FZZŃa(DAt|ƐGFLHD6?I,޷O|e m..>Cfd=lp'pzPі@C)>5[-m?H&LgbTԀ"^plL+xE:_"+ؤ>x!* L3C,JF-?><ͮ| -ChSTFEvkViei7y cqTA- GTd|k+}squ P*~ rQR=t5k_ ]2 hex -0Ңl _G@&%%8?I]gW GWiPBuw ?o%Gã;~߮{j#!vQ[tΝsՖ@V֊[VVmV1mu$d$`鄑:DY56%YqB ]ɦ?u9] 'S8 /(OZ419_qmJ: 5"o_tf NLDuS y)G ^OH{&&B`Њ6h>ɅIzD>淮E]=F@ˮX&`{o^\3!? bGq1OTxf" v*H/ {6hRF)乢HYz/g^M X}'RzOR}W?X"|Z֥(n/+UoA*C~- zOҷ.>pp.QZ^^y%D }(( ::Cٸq~9yy{SApcyk4%;+@@E.MM &&/2 .st15s{0033cf }6=7YHIDATxUXQpYkn)%$UJADT[1;H.7-P_Rv^̠s@!;q@r@ `ߖ#K=#' iY A2ˈPnP\( li*}xQFA :)WYk)SZ!Hws=Eh U[ !HBb\RI!ȪQb؅xi[B"=1FiO=E#R=RIH#,H~ĺ4<-b_դ IENDB`PKwL\] ] 5limit-login-attempts-reloaded/assets/img/flags/er.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE'#F"F&%╼"$ #!&E%UPq^)E(QN'E&aV%8%Fxb -!6܂fݒAF5A,꺁=Dr1>'Ԏ)ڑ5LL'.H͋+;2yЌŇc@ G߾% )Jk`a:)/~HsN6&ߊj1ކh$G2T& 0>ANs>}!FGH%H0D!DH&F& 2x†꼃t_-7oSR5 s'EmLސvNAg8?G}x {6Vb)&iƦts:g60u`dW@:֢zyzŦ[rp5OWVPXiîg^h:u/J:Qx+!Ŭ߮Ci{>אr~ٸ0SP,jy^Nj{1@!oRٕ-SAMY\_"{CGzzh~?t}*xiSzK8<_6w!tln&]Xr%)|/|3>SWJnmUL攆!SZΩ1HD5>ɏs'bbbֱ>\A; YE-Y4J^hk&xHoZBdzl 6+TuUԋX>r9KAeV.q!x?&f _0.Vݺw Pe(vZ ^ZBҴ eTKJ:n8`E U6CCӴ E ]>@݂fYٹB<)Xwԭ8}^ߐc;hކ?U2W+\>|_jyŽSt!I">-nҴaGų"kvZcK]5r+رbmF&?K悶9O .j,ٔ9%7exj BQ0}X;zCG  V.՚c~P?f 籇@iz3xr9C$YJmX C_2ǒ|!"@. 0OMK3]HIҳq~ \M;B` {ԉDr,,4 'ohUX2t!A5GWa/?;jt)Z&]jezFuJ}Ѧ"jϤ ^M!s:uӴ Mׁ~Wӻ{ 0x?MIENDB`PKwL\t8limit-login-attempts-reloaded/assets/img/flags/es-ca.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<BPLTE Hf  +     V.rIDATx Pa k[G5e" hT2hwvEk2&3SFM/0p )3¶#=jgqBd))2ҿM5ZrQ-u1 -;kzwd҅e;M%LS3Giawc'OVM%_+ew{KIqu Yu%gWI̟a'˨c'Kdxy3ORUU}ػR2~,*'MhY`(_UU}w뾮KcɺK&'5Z&TPPMN3fY2%6!M<8H+ℱaə X[ ,biV} Kj~ֺYRXtrqW(sH!ض\``jœ;OZ$hBsYFœ,M :h4-Ͳ Տ-{^xɧP'aiiiLDEk1͒4MDKDR&pc#sN 2$I#> :v:6:ђQ0 F(C}<#IENDB`PKwL\cp-5limit-login-attempts-reloaded/assets/img/flags/et.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE)!!kƑ#`"jkfghieٻ5##vKj)TigtƳE nWQj s m:|v h m/bڹ8ֹ:dnŃrQR+imdf>oh ıG2p2}msHtpfl:;YKl#r*Piɑh^b=u{OZVfn(yӷ<\W *C~i kquxy&IkǥZkjca5~iˤ\j3wm$xjBAPoO͵@? o lkƷ3B,r*z 1GʳDc>lIik5"x.{7_fdԡ]j*.1) meȽDm1&JRD|߾0`Y) X:| ijǝ;TkwOTAW)xw0japaS=ͷ=ywYP-4p"i~X,8O1`#[jq!#i-|!Jii( D*./^RTQRg)+ko~r}L''˳C!b˴C#'bdiҞ`fLi:IDATxb``Q0 F(I&&I۟.QIִJ2/*VMϫ658M„l)k/2}HΨ6Un xz ;| [  sdf[Y"ſى Lo}*MffjQ+vH{VTD l^:?3wJd.nٲKKz_K%K4Dky@Ӣm$(UU*mL$N:  K K¶ 2 15X ʍ偽><`!.o=QjXȚZSςݷ-2n~c&4?:/5,,Q.P9Hd6jPX˚ \tXJe#`Hs 6PX( W\izN 5ʙ- {ZʩR@2%# sl Dވ /ԩO4T$AyBP)TKZX .4WeTf3L/\Kp&YDVGzjnY&{bgXKI` ltgp5`K NqX ;/t 2[_ Ҹsuۻ+pe373 :Fq0*,qjmej&HuKulnt4vmB##-,&fdd%QKF-dԒQKF-]-sZIENDB`PKwL\'AA5limit-login-attempts-reloaded/assets/img/flags/eu.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE32103/.21,&6-*+#$=ksY"H()?YtmuX}~O7eo] 4*L2B@ֳJRdhE(;VvC 2/N~/z|Q"an_4/BRcj< 9!6@(D F1P|DvyTlsZH^n' :-K%,8~~Nٶ\jb+5Sz33ʬ E)-hq[88%JJ_mWhe0;7M-߼AZrM\r' : K$I%F:(Tci3I6A0?: 9LalI;6E\p8;<1rwU>5A3̰[jc#I 2_laAB/!DJ]o*H'8/ 76,+K|}O0'ۺ߹ܻĩ$ǯ"?3R{CXuHYuJ\q,&J<'K&5 7 7 6 *EWv7O74L5,BL.94L=$%io_ͮ<<=<>>?=J89 Pdi2O~12HIpIDATxb``L&.6adSL/ ~JEsTLL+7Y*w^`X+PF.-`Y ƨ|?SJv\L<o|l5>,&_374Gϰ(LhuVOX0J (_IWZs*kZL`s IKB1gK4jbc%ˊ+%X]_Sn>8ZX0Åm"% =C(F̌T6gD2i U%%HuN4SHDEaD^G_nlWw3:gA|t_7>|+Cm^B$YOndR`#A 3p˓nffnv12e!;ÀnF(Kb,^ēZ4fa!&ʞH&a #֭7Z]_LOEJS2.rmP0%+\"¹KzI$ 4uxS-QzΪF6W0:jEFٍ՘H l zpK(3p-v I8H ę,}Qěɘ47wM-kMhkH!¥6l.B"vzJvK]/8cBkgw1r}ocZb.KYKr[[`U9r2g":7` tm9zڔ ylzKԱQ.ᇲL`gLy=R+1{!=YŐ~p?$XM4qFj]Sp(\J0}u4Bg}q2aUg'@-BjW\ǺpQ4MͦmM7I01r0{Ѹ71(``@c2IENDB`PKwL\^?5limit-login-attempts-reloaded/assets/img/flags/fi.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<~PLTE5-{*y5_Y{0})xJ|}~|46`63~4.{KY|:3]J1~Tx6(x+z1}Z|3,X <{IDATxGB1 EQ7z7+BFI$ĽcgDْ)2tA@@>lOY>Tz/ =ҜB  HoEfO on.̙'<F:)ȏ#CKmK`e- IENDB`PKwL\5mha-BR/&_'mKnףആY*18B!2QC HsAA}nn oja&v|H-`e UN@$:"B[lAtCuFlO֪G|6CHs/]An èmk0peO@jQ1a֧L|2lTgV,UDc!U?Vg?q))&YD BWu켡UXa::S TY,`"Dи!ʭBkkՃձ-#IV$ZB>Mn fu!D(@Bpbee&E7elA(C" t:؄!dJTEHQd$nUX3A4ͨJrHFuv *I+TJA4flbUC4T4j@4&()dCF J>n8JeVr7# i.Vyw{pKޯZ LM4 M֡qߞԸ~ WTo 30@`XDHl-Pڇ<1i!RYɗ#ۉY_ܪ9+idYV1='R!1 _Ͱ1v<_THm2[ +VBD Ϗ{>6L.elID8١&Sct*CLbcڿ>qEߣF ![ TMJl\A"'>}8'7PC6qOl$ǭjRU%KƟ#%)C M|}:)z(@a`V]J2^NC(Er7ILO=DWֽUQzr{ 5{\9 VP+ 0E)wįg;|*tҴ>wP `oZEKnY⌒XPY,V+XXxHڝVOnP. `iVLwat-lU5s%ML\:ҋqMYջFQw8**P+*UhY)M95Ӌ;=뭏gu(YcXe劳*+Vb\@`ހe 0 yV=Ṱ7Js6j;νXbD=P3Y.xv})-z-!+ o8mZ\j@&mw B0spL s 8sNpAEo ;f bW:fח w3I4C?ʵˋ ssی0<ț*\PRvnrX:^z[3 % ;o* AXΣ6w7 ud{;yEAogXn? +,dMأ32T̻\eBe1s>P#LDA&L:?LD)MiJw'$)?IENDB`PKwL\g 5limit-login-attempts-reloaded/assets/img/flags/fk.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE!i.ا̔PWtfh}k~l.v!:yȓojUvI'lcw!tM0rq`WlxG°LZ&O/P2WÉݥ5x$@~51K5KOGustFjspfxK{eeHY戗*F+뚦 $kXkszEY (o4ydn>'3Ӳn8ФL߽pKGLbq!^H̴%hвlCk\)k/rJXaxm` { h?wUFrU <oʩTl)Ѯ/ruɬ!k i 9S,@\#Z%C"i!iw (m"m"i^pGwHa+qsb@ۃN=Mbs6b=Qzbv-߈n:_x iČ4/0i#m"j}#j=r#~A "ig)[RrB= aI3mH!= ƆcZ}lv΋3 .xu!b=-S/-N4k4BnF7rǎ-FH` p8|ԙ>CJT'Pvc>=}-s0ύEa3 ,C H viC$ ;Bv w ݌Fw< aD ݦz2Ine̬[tj>&!h\D*"ց\ 0uLV`Bm9I IJ2^ڶf8Fŧ/.a+I<97yR>VZWŨ B,_9|cR*U(a4d}RW8+^v!>#VJLHNXR9 Ѐ:D5@E l3VD+9ͨ !.ؑ܈6Vʱ/NpM+beԽgzǓՑ;wɹ=7HZ̄}NYҊ& rǷim?;WQU ]ޭSV} ˞"|p`/Tk|t"]?zA7ԛ'?e_1 h2ﯫfWTSSK.ïpTw&I9;OG ^t@/8}v @x̑uSg[xpuJٳgԞ2 U 0~To[P(\g2x*Uʗ>aȑ@HZ%0Ir6% bFDF"`4ђ,Xvl?aDatɓ;m~Ou "]dJbӆ ni/JVANvRE艤&UGv =? ǐ=M?5U#l%ŭ-m.|e|FgíŭV#mrs9IIPA- (nU~fૠM05)\Č{ͫK [s[۱$$ƪݸzQ[F^FBI}VxM|b b9\_m" Y`x1R#C'9Kq~)S>H'\}`D:We5<T4p*!eJ Q%I *%M8$x 7[IK,'\hB IENDB`PKwL\>65limit-login-attempts-reloaded/assets/img/flags/fo.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<8PLTE((8'"'#,E/U992/#SCl($+:988,E5pX2j[1h'"fh""('76(&T2l'!$TJqEm)/q)PDm4($Br!9 Q(%)-!/V/UOk8m3D'"=h9i|&@/X9:((:CmedFq+;#Ns32(&Ch3fe),G,E,B+;y;c9+9Bk8:9504)IDATxn@k;P:iJᔙ ڸV仸.οͷ;3D\h4JںT2M @ ?D=@U=71:${;DgaDϾ%QDL^ 6ҽۗ 呍FGh`+lDEC5h"C>d'l/c/vNBlgV^C¨|}C]jLrTDw{QJ39Y/EpĽIKARɧ lF69kOIENDB`PKwL\J5limit-login-attempts-reloaded/assets/img/flags/fr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&0/x*t!>IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\+ݚ5limit-login-attempts-reloaded/assets/img/flags/ga.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE6m<4j |.iJIDATx 0PhfUU wA΂M#[y (w`)*TIENDB`PKwL\E>==9limit-login-attempts-reloaded/assets/img/flags/gb-eng.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<TPLTE$vꛢ! ,/@"1B뛣# !0r~-"4'iu牒)閞2YIDATx7059O4_Z[D_%*NsGD0Rs#5Y*"XXI$ÇvJ ố~ y&ц%|sMʛdԻDzʵeeEPhgkk 'l ŽTڛU% ɺǦɦ##++ppyg-vit3潞66쎓OOccjj퓓mmů mm_۬11|n6& w Zv!fmJJs--44̳<[FB~8MMȧ'hilu ^= eki$&w~mX c ((u!ɥl1 aa jj "HHyyAj~"^]``[0V88i**}~DD@@BK ??2IDATxb` p01"&.ZQKȱO+3ѹ4$9 k" >3y@JqM,)~pQVEEVG_iaa[[L2xmQݎwx6 W8JuKvXbj,ZQ$KORtYJ&H,~!))/J}I w5Yp |߳p3}W  EY~S2㣨v]L$|ThmEĘ,;qL f*hiWbl7 ./Jtm;S-3mkKyvHy^#h;!0}?IQ 4I< O~= [,4&Rpr>&00|RK>xH<|D@%ʌJG&G-7%|SZHJJ2KMWY$q0C.i2/9jXBvW{?$L a+\r&Ѳݥl 2[e>(3f GLՄ?x(Jxu-aLNGAvH+cʣ£Z2jɨ% _K /yCrIENDB`PKwL\A'ĸ 5limit-login-attempts-reloaded/assets/img/flags/gb.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE.!i-% (Kb$&.Qggec ib (n <|G^ ."i!` )_/auBWNbh면!=Ҏ",q[m7}%ビ#!ifj}{ar!9z'*Er` * *c [.H-#b,\q3u@X43I-C09R!i h21K + ,d +Uj$鞪蚦ꢮj|fy95N產"iabsf륱=U ))@~;Rg 'm撠)?}搞&AVi& ,"a$e%=|!Qe)ndH_BZ $kn =|gE]7x߻׉OeLcge痤m~x!卛䈗:O3MZn %l (] +րcu]o?Xf$;{Pfb0JTg/shy ( 7xc6O0F7M.H\G[)n'ֻI`/x0NIDATxYy\TE r(" K +"*"7}b♘mYZQfVvZ.GkwF5]˖J} ګN΍־ KC=W&YгCS  ]B˕n0eH473Q$(uq؍bS,#KfIڞaB˿($Pze=0mGqº|J%]Ǭy9K_oCxHlZ*yK*Ye7HD^aMdFZ9]hb=b8/Rq* >'sD-T R5 e:?~*5$ЁXTb\{cj}pMܔ'QxC FRHĻ ݐdTzm,HnxXߣi&_@ܓ,maS׾ /t:W`FzD:9J@P6,8per, P*X6e) l1aH$.T.Ru`5gK`Ʉ-\å'Io/5.ǃ DР%?@&d_$LqgMĘ &=v5+O$IަHŜߋ%Rٽ$&6l~ 6-AabNnoI=ZUE?;'LĘD>x^c\H*$]B1Tw l#4i L/"j ƑPv)%VV'Z" Cwd1K4 ,j+u'>5^׈[oR*L`sQ)xۤiY3͒M} &^_0}leCL;^[2Չ3͐tfd 5(1ѐ$@ꇑjDWi<`K&3!Y\'ɳ"odT/H`jJZzxN9D- BG[ވH F-,^#y4}|Hdms$Jl562{9#͑$&CDBn'j8$p4DLϬ\rfgAo#k )pHz;GQXg'Sp;BF 0it8mD<}l:퀥J=ɀ$Dv9JZ56g6զabL*<J%aJZK8't3L I$ wA Ms}QC>R.BIe˷oEKul7.oTj`dhG\E>I¹rN$aZ{(T&e/-DTP^'ioTcb=3A?&ɜ9g٤[)-Yz.֕g{"/*! [؉RQh,]͋[,z"itwg MB* JNRm/%6LI(8,i?ηҭ*杲h]Mt ?Ǻ4lt1=xd =nd> !|Iq _XbBYC'hG/Y1YξIRЋO'7׫rY1JoK{@{L BEwch#D/6:NIR}p`ϱ$ G LLݎFUgZ2rSr=&:kaR*BdQZ%PlM8g WY&$^Oh[sXK6_v a_bIENDB`PKwL\||9limit-login-attempts-reloaded/assets/img/flags/gb-sct.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<>PLTEe[^\cd`]ab.~ hrÂLвtg|bE`4ʹ_ոfj{_acjKв3F4jbj hruFUNzjtfZ0O<Yam)~X ulx܆FhIDATxڬy[@wmPE("(x_*hէͳٷJgi*|p`Z9J􈒿O4DGwSȟDk)]D~ȢdO[!3'M%WdnCӚ8#g Tu|Z߿ɞJpc<3e^ȢFG_j#PTϫ !q?1dK &{^.qUyWd)qvŷƜ ҪCTwL >U |5ET ypT`Dke?#:edS[1Q0YףeI2V E?*T) e:e)2T2T͛/Δ#sTV':2e2Ou!NG6kEV"B$$)Fժ׻w*2Gpߏ%v2Ywt, *cz.LP1?˭˭[DZ.6eY6> խ;u&'9!04v#&3 *ɬ )Ѯ=R|%(ו$6 - , '04^>*68 + 4 ( . 46 .5t)'&QM,j) ; ,+ ,W"Y 2Mo{7 1N_!7_o)ț.;׼85 %55p8W}% $IDATx{TwI` @ca@q" 5D* *ŅZuU@[ph[6vוU۵}PZg!}_(ţxCC?Nf6!I0 dݺ3gߢhw\ wKc爩k>FGcBvd1Xb!!pR߉}֟:?.?;{v>uڜ4.+OL)Y~OyA*E›;gH";a!v@e;2BŠ*ScjIu3lCx)[pyeAl{cW=qk:dHJ2n$4LY/ Rb JfT.?=◇W~qkԁQ[4.-Pqj]H0!.gHAa" {7<(xu 3u9se/hFub?`NR Ƶc7R(89Hr`T:]%jA*z)H0⤃%(gBT$n$SnFC6lF_Y:nS6#`)5f,Z)pw14;-Z(J3 #v?w}\ǃ;'㐱 0aRbFiqF'xƩH~w܁!L}?Ǘ\4F{}p vH4mI7zhvЄ!kJ^}Ti;%m:3o gB=#']RY |vOQ]V*g^4gKԬd|RlEzWFM^(f)5kIaAtC"F{cD;n`OFn1sӌ[>e`.!'76T4Qvz<̻嗋}#64X6\2șkB[D)Z'aaQ3ڠa dz<).L{r8{8|F<,ÿS:ՂHqW_'%.@agؼQ8çf#~zaxU$f$:G|WGm@޾-Z.%n RȀgO :nS!kdILٛzBЛf(#E2jexXdd[2WNwifXL ȊA}e#gu&] .:HѧK(6NYa<{?9%C[;$*CTZRm6њvQVc% lIFFI4xԁr{ qV+J) `-:^JVLzҶEYu;N rIڐ =@q-w|~:Q3]S$˸pJiFr*܅ˤ;%^4}OEJ#c1|x'{4鿽.jl BL6.v`w03Q4K{C'~>ߋ:bIn_WIupl8 O(\D-`KK!^rƲ? ,4=4=; vSo &N*Vv 1LJ.ւR(P_)~}!#_)-o&%%MXUw,G bv*8)gb$w ^)5֗r b&>P-M(svŰxm8fB(I! ea+`ϳSZ@3,L-D~P~ɡv-La2h%40<]VCZ)y*p4 BQ~?ti Q L]dUIkSE[pN=\or0TGĤ,A^Z\ IFiĵP) l,VF/p罴Kc9uq>p]"2`#*8ZVU*pћ˹К6p7ՏͷCC-KEV04G`#Ij׹hIpG"!ADXSZGp &,8LL}ZxQ#TrcrT`5%lp:R?H )&нÂ+.PCzhk TG|듖pc*@+6+뛷ljRԊ+E o@"dZik zst՟#zwٴU+^Ԟ`X;x^CcZ2Co?"W mmzXKGjb"i=R{+[1[iܬ!M)\; 09~h{lC 'E_F>ƖCxnƔ6Z>2N\0x7,vj1*04 n_ض3a1F~D _fν;TD Os5 ˱ל͹1Yb2\A '#:.tM2qM~jإ6(6-^+>ߵM,{h*M \ `}MCΧ+~۰nGz!)\4YoL= 3e͉D&=fU-R\ Iq905؃G9j MZY6H]zq͹:H>&󫃼?bDR=KnǚZJޟ-AI†u1rE~ΈUM4H(//4.uVLĮajA1Q$vCA a {̨B 9p=E0Cjt>6@C0H_!#### ċ)::~[IENDB`PKwL\ 5limit-login-attempts-reloaded/assets/img/flags/gd.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&z^a #''c"WNFw=>2#&&y_{;' &+"Vx`K!KI4tcubZ % 't&vb6uc81!%waу#!y&%3Q]:O#&="&'~[',¾&9*dS(*,'va %-:UF*$b{e:#r>.6XA"'T! ' 'y_"23, u[Q! '0.$hA'b"~a`"nEK%$w`cCW*$]E$ !k_|_ }\.2G"-SqZ &}d)TX Yh[KF {^x_{^y^{^}\ &z_{_8&mY #&NQImAA #{f'( % '- Y(QHe$!!"/&$ #;P% #@ !$m@+$h!]Ve 4zO&Tn7b0RRH{_@MD'x=>PHTF0,6#/TVNFwa*v>>U;I3Zy_ &|]$ mIDATxڬw\ww^GrB`b.&&*&F%s F$e-Kl hi(-v8Z]VݶڽrI_xd~{biuߑN> T.?:G("%j-qX#Je2%iʲ'2Grya ˳o[- cJ|fMDL`8dj178]c%87wv,5RcG=PYZ< m|ؠY.3u=ujzH5Dbr5hg6꩛:z AfpȮJVg*t+HђF=eq_$TӔjEIs,a JbM_կ䬾CVܼ‡@#GzoWq]k_?.{}bR-{doކ~/$L,*b2oz}]إ@ HֻU#qF Ěk7&KzA 3V2Ҹ KИ.uKΨf/O|h6* ƜYn0@A;:t_3!@(7(gNz fJ]>Yڤ2O{Fʙ+pӘ!nP00T[{e^L!@4]cMj(:cLw4ZhZ3q9 Oaq##J,8;fޛ9x2ۺ#Cn` 5.⎙D}G1ߪ@0NuR {z5~ĩ_,$5e}8|7B~>.u&*V! q"> KQD\# r|eM.M"b6JXkTzO$FYZ-EďMDKEʆC,H)=Ks */WTdNvg:u`LbvY-\bCNɈUdl8%b"#Zxk2F2DsCK ?y# Z#G]69rA %D PEiuȑ+NT܊ G88785T4-3z;{_pE#-sK'O$IENDB`PKwL\J5limit-login-attempts-reloaded/assets/img/flags/gf.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&0/x*t!>IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\Q6MM5limit-login-attempts-reloaded/assets/img/flags/gg.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE- u.. .4.G* ' .B')* --a$C'- .s" . -/.#+X% '+../. _$<(!,y!" 0I-0.;(Z% */z!,-,9(,!D'f#s" +f$u"8i{F']%e$,K& +/+.c$G' + .~! */Y% 1E' s-"<- '.-ar5!IDATxb`  1~AaeR=2%v9rpSH KYW8KxqHSb-@KpIx䉵DUЀءS*q(؈aN.XnÁ4B;AZ8iWaI&e}u?AK4))ԛ# ŒR'J*B535# āt:>+Hi G-dԒQKF-%ưNdZUJs=p;M_ د%fz)0b<;m&iD= =J)LLi#)@Y`cOQ IENDB`PKwL\575limit-login-attempts-reloaded/assets/img/flags/gh.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&k?&h@&x:i@&};B7C8#{:w:ve   3)ģ %~j I=3*iW B5 x: iX ţȥڹ %q o\ y ן\L&ZK&WH ze ud ʔ۸u:ڸ~ z r ' $gZͪm ӱ%ܺ&ϯ QC!j ~i t:p] iV9/| .&<IDATxb``Q0 F(,t $R0p2IJ"\UJ&bz4HD\/SƖ433' >fJ4DLYFd3aZX"q KxB2ԲOiV/k,/6N㣖O ;f3cr| .zy,vR3Ebѭ0Mn AC1_IXLaEФdZ{wm%:v"ɌpKi,GKD#,!FK}OkQ4?hvx a!GKB]}Q̬,NK % Y&މYb&H2,bJH4DH] H*઩N%V+'@T?``dԒQKF-dԒQKF-ܖdX1IENDB`PKwL\s۲5limit-login-attempts-reloaded/assets/img/flags/gi.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE U]  k,EI EI  L) { r; 꽸 \dlfi4:J  ƹ *(+49R ԪV^ b5: ə Fk {XKI  |av g ̭ux jCiX eM R &+ QU  $ɾ ͻ dc"' Ѣ+2ok  6  ,+uw$ ' ߰j osU -08~  EG]BQQLP p w  ʿ loPRWZ9   ghOQ4 M?CW_wz{}{})X` q4=ZK"_b5 s/  ԸIDATxwxeKiŻb$]mhs ]MK% $cHJKK 2 bÞ )4l((B=p+qV8}.-$w#|z]~{AЍ!5S554FlĨ*h\PPu}PziNut_](-u^=\?l^?|đEMz(S+y9;:=簝4`G)9˲$T^>U`Y"90k $v1jڝep.Y=XX, .Yd'BD.{<O, ZgOBC,#QDt#8 20e"BAS e7Ae9;|~F 梑#$*XA%^eu YI ]XG HuFR2ݙLЬ_H!},U[>dz]X=|TdL (  ZGf4_f<ٹyA=˝{9Z.d֙yEx>_Y ?! :ATd1/~;idc_#n7n bAqMZ b6x7.3X ઐS4u,iSYW)?5M\U4 * 2,C0H΃E:._HNKa!Ա){t!SFqcDh$~5sy>|4!L# <7`TS?{2L8 1O2E= |sirXkVE !o%`De @ IBzdq2H !ycqЈĢ]#gDclxDr5kvW<:x͝rJoūxˡBʜ2_/wϩEZ%$Ri*4LD?3ĉAfu=s"7%zI'1OUP%YE'GGBՖ fҥ??k=ږеg\),)'q@0m{*"|.DlKpP\\) O'|6{hB fQ8Tj\쉯{!>=qAjާDxAa-UDHޓm##kn /ā<-ٻ/WPҭa9ۡ9^>$KI 9ޓ vkrlS~ Fm:8x[oX}T߷UIENDB`PKwL\ gA)5limit-login-attempts-reloaded/assets/img/flags/gl.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<"PLTE 3's뙩 2.- 1)&*(%)' 4, 30 1* 0 37.ꐢ+;9/鉜A烗#F0ꓤ꒣\v-.Olﭺꏡxy윬3TSn,MRnc|54U(J6視9z膚;[ 5Toaz;]v웫艛흭:Z>]lꓥoi읭땦i]Y, CȖhctF.\#vAokVS7'*zǂEԗO6xE CY!sny/[aݪ$f P 6b\DH-6` dG o Vcej#QKkg/rH|!6ݎ@mX } `X ; LeXy qo>G*c> H'ϡH3,#W- U_?W}qYEZ~M4lK~s1՛(4RIDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\105limit-login-attempts-reloaded/assets/img/flags/gq.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE>!s<D<5AզxΆsعrv< <^.q)*ќq yj2( ]8tltBo@:c ynKuq|溻%RҖ̹ޣ8Kd=5m kpu5 u𖖖]D׸ԽE߸ŶyĖv2+rΎ0ܽp|ș'Oֺ'Er!<.'K'SaOutу_H >ʶ|Fj7qoPz7^̨˶߷ƴntL4qc0͊ixlޭ׼?M ¨h6CKmП DQob?АMK?*ɟ()8$Dm"ݵPC@L3bA#Y4F`u,h( D1D1 "iD4 A<h4 RC wH=!'^Dd'#8>X y+IENDB`PKwL\oMDD5limit-login-attempts-reloaded/assets/img/flags/gr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE[RWW oTSYfK`DECVOL[ iv llCD>TcͿ[RXR>ɵ2 oa-DvL_]O|܉O~Y1ʽ#IǝqgJY 9*sKY*E~tIENDB`PKwL\k5limit-login-attempts-reloaded/assets/img/flags/gs.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEfmN)2Ц_1 6_E/rrix] 鐏g, 22遊lc}}F}A.'I9;<WYY&ZLM}(((j^/OJJϗfN8 Ԯ^^AEECݷpRyʷeff45N 4pbO \c~6jUDҗ0u@`G''|S Q-_eJ:(Z?$,\;mU3(Se\FE58rIt AXW'K^w}HQo9]Ɨḩc[_e?@:WaHiiZHEb__E0)Snsy<={94LAARjoqYY k=)<<=c꾷) >tS.H0fg0 { _J7390'r<z_]~mA!$i=VI9c0o477SD7 Zׅ*> MQU bIJDd;f:,-]x~[x3frao001 NVQPK VQRQQb"!&NO@~랟j vF/^B HQPKJK`_e |ʜҞ#==㠛(ipkvppfJs}]K~;֦B[*'0`1M;8 ' HRc9MW!n ҷ&53 ]lfpߩG 3=[J7@Jesp\w2{Qus^s22II54nnJ 7I[I0ewKC6G ,T@+f@c~B85-E?đkGA<}èq/([zZH)CA@ѭOZ8Q}crG|vɜ'N`׉#Hŧ6A Nhß֬ To؆jrc&s\} 1!kqg禽 ޮ].;wx˫1o|U=@ Yz?/`ӿ4's{%|DwI׵19Ysw㲨 }BϪh քx1o*1avB?B<G˨5S{G3>Lxbt!Xi=0.~zLߛo\;!=pOW9|> lVάI8j?(g]Cp8Baso5 9abm1[- oަ*t7Ot3 %!l6\gs NDVR l{um qLJz[W(ZxНa b4ӵْiD'/)RoG -QIVSOZ7@qʧױAEl1Nt68 U6@I5bQ%2󀪋Zէ4xCyرcv琐?`#2–dIe]a1]Awb3IƐExD =lPnnw 5P6%2,ΨyU1j麶g~%=$F,eF%$e붑WQ2K*u:sIeưf3/ u+.GGKgqZzYcT1w:"H磗˅ˣckıSW,2 쵁Kw l#Is_z,-gz(mE|A(p(pIX߯ tz 1y@xE,? Q( >w>].|S'ZE%hFɇ οy{]`Y8`{4,F0aF3  [ֲu)ah(FŒMM/MKFU!{ '"z;9U-0}W/X Q=G5 cL'W_Nd|RsrbN&Up*@e;W.~!?_Kؓ}9xM| IENDB`PKwL\^^5limit-login-attempts-reloaded/assets/img/flags/gt.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEIHD?ͦ۵󬽞}}dƢu\^~BcFֽه⋦w̶ѼrY£s[ȆsڸƬՃڊڋLp,yaى[D`<v`Mзέ|pԾ|DʼnOmlP̓tǩ~\y%݌Vگ7쇚n^أ㼧e?-18q;2î Q~F@*iUƦjFDd*[P8KvpRQNLu-I0f&km- ]Z"(p&:0Jnp)Rg;{ɕW?q7Q"[1t /oŢWk3%Dl NJ+mt32Zcא%r*IAL6:)LRY1@˼ܸDRt;y~Fƌg|4 Uݺkc-bKyҢڴKa4y"ԅ8hS3r?fOtxʨ%Z2jɨ%Z2jɨ%CS•%IENDB`PKwL\E 5limit-login-attempts-reloaded/assets/img/flags/gu.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE;Z'!4_6]Ii;xfɚRN:[ԋ#E&[Ij7]%qv"LOt`A9[+̺tg|(0U68\ǩQKEGz6hrl^ +g >X)ͧ>!O몲]Dm8t) ";ZAe*IQEԿ 16^2!S"Gc3_:[=^/Qό8[ҿ&p6rß/*`ԱPҹ,`Aʯ1 XF$*нwF7]%o/5Wr4oʮPpޯvﯸp~m#ϣξ֡&!ao($ؾ'&{a0<߃g(³'Ͳs[qUH`Ký|Ql:C`-IDATxb``^0,XX̀9+++ %RB 4Xʒ@cK&^bKCKxRv31mh%B{+"tt$~OC#K"Wͪ77+h:₌TKX&TE b׷g%,RL:чØO*Z)KmK"AvNofjwH^ZªTopR)Ffh܈"?+Z;Hhр0ƤhY=VԴdJ#tɤG?'/׍չ5%z5E^r$A05>Q jjYP-a&Prh!+``͖,`vM*^T{5Ƣa;+RR!Sa,zjީm EkER+hĴĎ4ŀ>ڋm,5I K&OmT?}:~A&Eu,԰׎SKgx{qM \P`["D%s˽7Vy.Y䪱FhbS\+D6K϶/ev cCQ;AqX [<'OK%mrvǩ%&5LO *]/i*Vo29dI`}wE3A0="!)XR%$u)(;Y4Q^U3Y{)%^}8E5nSS\g*ZbW`0'09~Õ gǾOCOf̬i䳓KgKf%A=Q,Y›0q30EkX"f|{Z<{4-!'z:uK}f ԏ(ZI%*α@;?wsn;&& 2/(  +s=*nn@3ΜA K@gbWr]v'ȒԱUWŞ]Yuye7n@,yM%8at++|~U^\}YaaaKaK(Nf ̡0u1TCSsR`s̡ AWO6޽8Yes(F`9htI2ƕ9,ɒ>^b]$e:aKc/I4ׇi2[SeI: PS9eńs))i+_w\ -I6-e; T@?oMj;~O 񷉈diJ>@pI~#CW+9V::f*++'7䴫1c^?`J@!v gBIw #6Pb UV'ؕ%AݱNuѴ#`+jYFRǻ"U5RRnKHU/Gլ^[[kSym1v>)4W  z : $/ | R "' N( )n)$S w ) )$ wIDATxr04*Va2333333^IgN?H#H32K^qAkADAD@=!pD Hµ,0/r#PX&`?][ut'Ug[TP1*JmmY-@H(R ǎ^ˣPQ>yH ^[9.Bf9["gXsݿFeOib7O,L DADADQ[0MHJEnIENDB`PKwL\\  5limit-login-attempts-reloaded/assets/img/flags/gy.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE9! '">=>d>ʅ6-u$|+%FFG/ !4,e#VKy*gZ.8hC7s%# 2D D;V Y1+K #1(rtS퉈 T*Ւ¬IKA78m'! =jDӼ0[M!Uک޳5- ٟ w&qN<3٭әD:΢͌`J3lH}^' 3ɳҖb 22#zN#ݛ |l5 X/m : `^6 G ܮNףm`R'rdwhABA ?GD: 8Ĺo'%GBZU\ɺ`V% > >@ xWzYإ٦m+ 203U(?aaae-&В rW"IDATxڴ_TU-3Ҩ8fdM}b@ ŖJ"i*T.eEBXɤ[Rhھھgfys~;9dG|O-+D6eS`eI f?ʞH30[9o !O_,͝\>=n"+-dSѼ9OrAq΂lȤ٭sE |2w#ke΢ |o1kQĂIBQ=T.㑜FiKQv_ 2PM9] ;bx6+`ySHXBBacw3'}-`?NW)#9Gjړc(rn0Wz?v( xcVwiQNRc)ZO9iԃ<-eHS4hZ vltG}xsEOsK;=@Q!6~IQw>QQ't OVӴZrZj,D~Qh9HΏ@QL";܍䂢"GBq25'ֵxDXԦG"&[뾨lt!-9bPԕFEצ@9}--s!9 rZjꂡ!ѷ_C@6P2}T~QN6oL Rw _ .N7_&VeQBcd\l"CS;ZNmBq+3 aZ-C0a^q~c*CewMˉ)̂)qME}A"ʞY 8{Z7XJ(E ,{Cf">` ;UBKQFh)噳"jMBس7*xABfԡo|$* ;^[5!v,0ku!ĎS۱B"2DWCQ.wRWxm% "n̝aT_x DFi@n^>,i "̽6p+sRPk!YX$ w$o@G"K^G߻U,! u Ď>>>,,,,䚚]]OIDATxWctQ0nl7M4McMڶm۶m۶m۶lsqggwt4hР%LAP{XTM0ir\LU D\eT, iꑐV$?T9'R+=?'f םYGcZtg4.kq0„0# i0" K(Tъ fRΚH)MQ|)sOnH`QeUj7C5um0IpڶAԚHdS4 !y"-Lޞ6܇o tv .8gkߕSP\Fo/<)V:f3\q\~7P tQB\JFK⾃"WZ _JbY?\K~vS8C%a$mZ^~ԤN(}Ju@79[SBBW*K +$eY 9Iqf+=%;=س]6*1DfqĜ^ab; ~a>@"wݭ/cm6KzD̶cAODx<2%u^SxNI"<VS./#i Ǣx@8"w=wd I.TO:Ř5B`(dbمzut bnWf ;]_ rOcƿ@,0"+@ 7M.V|w=SY~*zz8aFN"\$ eײ Uёc0tv &-'oIHh.^BxVLwn͊F ja#ǽ7[fObŨ*Ư1 %k0'B/ܿkbwWTPz,U5": 4hРA?P3PIENDB`PKwL\h' 5limit-login-attempts-reloaded/assets/img/flags/hm.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEf^eFF22]_dcQQ{|!!ꓓb*ABjjTUUPn`뜜f\iaSS jTˎ-Pqwj mnnYKK]^JJxyJG??9:gr ""vddzz[[lrrІ>=..ˬqq))}..gꕕMMgp1166--55ꅃ l愄dnn** e钒kgg33CCx''`vvfv鎎dbأ%%|``爈11嘘)){YY[[svZ\btl::czﰰȬ__44 qh_ipp@e;U﹆-:ߟp$jZO`;WfX.]AaV9i82Χ wlPXq`՞3З^Yjӱ04(0&5_G噩}:Z(W^/MM+bBy)7{uuuo΄X½ޗh i !>vK({ҹLOQWRX.Lq,vwON'F39i5ywI`A@Wo,H5iavq@?p2U舃 w|IP۳LБ9^YD+(l$Ŋt*҆p|!"N@jj-E"8GG)OfFIENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/hn.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEsqow mg˦=nΪp irRwbqΑ1}3~ӞkӘ-ؗC>ux{0ذyY߻1z-ع|} nͬ$,e{K+hNg~df]b}4,Ohtv(։)֚+c|G yQ wЍMS߽)׼7R޵SqMj̃TIDATxEs0F$mh6Tffffffffffжǎ:F'hwqcb!!K 1 goRNb=1&|X8o܆PH\ oCV1ӊCci5!IIc\aDF'Ql!>,¢$4?3J%q >rX{QR?PÈstv,uD㔫mv%&VG9aB,NWPKܱh I,IthN'WQ@eB^[;v:Ҁك`rE*.Dkt=nԓOGx_Yk{C|$H$MY<H&sc`I];IENDB`PKwL\://5limit-login-attempts-reloaded/assets/img/flags/hr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE44n7-]]٤ZͱP]Un J7gFUT*WAqDD=C^%c] sޱ 7gf--Gx0v22iz;|{7[JXdSF (:: $R~Yf II ڇьglG(8l{"y6~)JG "  [\'݈G Jg[ ΘL銖5tq{ T4;  @Iwn-/ SZ))36,=?D%"/t҅ .KzCbs0/.0욤{H΄ï(/IDATxb``,Bڣp î.旁T=go &5WTPm[D7cw㷛{8DxLRpIkؗ&dˠk<vT鉈ԏ[JHgF~V ׻R<]=2 G_KJxcAuOW+Npv)ӻTG+N$ZGg 7W,yl>bK+S43nKUXle"YV]jA)d_3d5zG >pmx}<&ߊ*+E~u*ĉcHeI17x$$,O&j\v1">ɒ׈(7)KN[v.+uQ# TFZ~09Qj֊[R| `Ci^Ýuu;J7DX)U)R'wM@+/ wGExc awZG ЙԲd'̎^S %^3,F+V,O%KZqZ2ZXX*=pH%u# LV` lDdi\M@ f8oR ̳,03z 30Z4k5t.dLn!J;qm82ʞHMKY\25k #xu&H1Noa% kJó*+324RI%j$K`f*$QF-dԒQKF-UE:IENDB`PKwL\mGS5limit-login-attempts-reloaded/assets/img/flags/ht.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE 4!Yr.4 0D}F2W(IIUyƏ:y<%-*s5ji1 24y38d 7Vv&-dXVn2t+V&U9Mnh gͪH\if:͞[ewɺrƣlt`g*j74ǼqzKQkd&_lMjQF4bʞ'Yz DzwFLğʅfk*$m/BngjGx] 45 .Œ¨W49Θ a#5uA4RRL> [˳r_h5ʙjORӮ 0bԲvSDgÝWg{q,',bj| ws}f-GWwBy/Eʷk 7krlcFおÚԯ33 );l_zHQ_XGOXnX9w{D&|$h.s ^fZ4Yq]v +ɞ|| +Eo#Bql_3эk<̫]յ_X@&'f~鲳ڳjwre>Rm@LcoUGRaɵԭжοҽ}KLi$va0N|1/ؼYrмi"aXѪt׷nsx^YDk|4o!YuאK.]=qT}J@pCT'_ =U#_LMIDATxb``Q0 F(@ +C+/?HA@efP"6*Zr .}BEKfz%؆Vt:3 ,FK%L= ee6q=Ly0IJ||aed@K 7~l1H 3 ,yG?$تS,a&E[393W8\TdCv@!sg`!<[Ws\|ƈIhnb3rgJu{yLًdwÃ=zPtIbiL/&+Jx^=IENDB`PKwL\z5limit-login-attempts-reloaded/assets/img/flags/id.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe< PLTElu4IDATx {ȓ@3H$D"H$~z IENDB`PKwL\E5limit-login-attempts-reloaded/assets/img/flags/ie.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEyI?ܼuֵOx=IDATx _#aT`N%D"H$D"H$D"H$DmW!g}R?|IENDB`PKwL\ 5limit-login-attempts-reloaded/assets/img/flags/il.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE**Ԇ盛&&99667744 %%(( ,,XX5533IIEEFFUUݼ LL;;؃yyUU 00)) ""//22SS##''̷ddzz徾{{峳uu䱱2244 $$ KKͅ::NN << **ՐAAccJJ||TTBBڴxx䣣핕 ϪѰee??ٶpp !!gg88ןQQ%% ~~椤++kkCCڵffϝ88ذШ̇``33MMЧ__jj[[IDATxS1I$p;(Pܡ4 oL:g}y6fsq# n IܒUx($垝kn|;K.@Sw< KG2' ÅJ!:q_oVR𞳚d0T3y!G}u8p4GQ3BC/ nO֘X#lXR>b;wT& 0y՛K[~zr#gHv_%)g%[Ju~H >a<+f~Uk=:L،&yIY4h1 "84>ERч,֓aei %犼㝮Ѣ|pSQ^4m!$ J0m 踉lc4`5YQI{+Rki9m!+1HBcU' i+)LR`9w-X#[ @nSyiO|'ۗ~j^4ApIr ^p7@>腮G(!'?<~k%^ ξ~.#wTWRIK26^@@|ޫyKklAQ1ZxIOLz =5qf2潶SVXZhN1}_J8)?0;[,DoX'{̒3Lٝ<FB%UbZk|+m[Dg^bY>ij\b:2oe߃WO~"T?eٴ~;W~oIJg]*Zzg!b5M*f? n-6 ?WuY[ a<M #"{M_+&3Qw.ÐL&!ҷꄫ#&S";IRqۀ߃Μo(m[]QǂZ) eV8OOݺc^Q{r1H5Bqj?0qRK5FidG .GrگHLm`:  A"u$0p"$qI/O?e.3k$[8ZGcv.eѤXB p0O¶Sā\JM Y \#idh6Pzbէr牮P$VNfH¨"\ eWm*ق>s`i(0ݨF3Ssx!U oʙZ\\&+pIsd#\Usĥ_OMNFEf&ITh"&0)!KM5bq`ݣwHÐ @Kʀ?)i!Աi$V=.#0SQΣFt8$0i?ZrJIENDB`PKwL\^@RR5limit-login-attempts-reloaded/assets/img/flags/in.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE319/& ddyy^^ww纺qqXXTTꢢԆǸ޼ppssܽ䵵ܣ㰰222277::WW载//--ӡԛЬjj }}ìddyyxxmmccGGiiܗnn~PP(( gg''tt&&MM zzɖ553300``;;**rrhhYYff__nn``툈II--{{rrœͻ퐐VVvvbb]]77llLL[[oohh ,, NN>>]]##vv __~~íUKIDATxb``Q0 F(t ,t t LtZrfFZ6VCSheI6[cY hc~=]<<g^keuwVXH19DK:_*/R❬%yԣ;naAqBJĸnɌ[m";<]%.ȉ+|6;!{񺠡8IIn*["]t{,g̞8H qR EI\##yx)+ۗSnI%{;[ e?mp}qr#41^dJ+^qGmKR'9s;zŘ %|6 _SX:KZcs9ܸxy<;_p,y^#WƤS̙T#.{ꊮrL-OVWV5Еk|m.d%@k4&NDۆy6:v::F:QKF-dԒQKF-dԒm @Lũ1=pIENDB`PKwL\3Ee5limit-login-attempts-reloaded/assets/img/flags/io.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEcz44\XXZ]δlhiccq︷ꋉҕw`maҚDD))++{ j[ƔUb]]99VW744˲hga{{((vtNN KxHѹɂRRKIuuְh˧mz""v fuu؅3erHyJIŢe%%x1CTCE.IW;opmI[ZiRQ==[hiJeu m &&hwyiW4XBx~,*'#*S74LSX~ޙ p?hQ//~ p ȅ+4bcu2=ikb~le_ @@VV`Rct^^ nXXjo;?dblQOsr,+vFFnbȕ⦫rzIQq<;@@ |*ٿh2+z2. f y~5e2 ;H:B('{gITMPN_aCOF’.־|qV]ZYŕXWC DIDATxڤ \St3cBm^rΟw ⮓_Wٵ+mPD#n5`lg\ޟ23!7%> U鑭OqhPCc@Jִw F jISX3 vnz],~5G2Rp߾''/?~nt@0}d-޹"^OR%偔>0_ϵthJ?I~"9P S^^ 3j畹^Wm5ߐ6! xAurRKatX $0ͯ6@n*:$fZҶv.h>EYłhYC#r 5yس/^wfψNdHPNfMKwH,<Ζ֠r5k^6G%>,VCi25hH#:][GQL+bʦJ1z7?~A6eq‘NڲfԐS]~Mm*nUn"%p:QСSUi[/w \Ag^*m5sI[F۞Z 4!ݗ>3;7c9nG/Ek1 Y̔7â)~d?.e֒gzlp!3xc`YXhs6GjI<ۏbSLlPJ8M.g00 ҋzy'2SBMwe#cdo,8kӴikf_Dl'bؕ UdEykoжCVFc+q3OT:M;ű챏j g]C]ä ٘=ͥU"v2 W2ڧf#OQ޼>_ <σx xoٟ2/&cs3c2}pP_ !qP0+G }RJ: ^~ԠƦ!T#(H,w*nf JzcU2oߚ kIe  qZlG@ L@> _ާSWL),sm+nn;v,w蛮 ٬5ma[ 砌QL,ɘ#+@oMgk/MESZ Vd:f+e(Ԓ5647dƙqGqVrPI]Q*V>^^Yn#mgnZQU*$s : V!%Dh[=jvm1hj'3 xo]A,Twsj$-](HkZJGtB^[{H}.MD1*uR2 A%(:7I5q4'@GF<&|RhhZz1+&>( p=W@ĢpvNxY v^ׇোVrVĂ",ߑJ2EqOjk,E.@,8a\-0J@]ɝbF0#GÞʜ.O^}Z{:Uƨ6 QN90'՛D8'KC,/ K@dpoS뜔Vs9+}} Rx2H݊"F@=s[n+=+]JJ_\+W~y]M٩*(2PEP~ʧ忿Ϟ~zAќ<}R0s%aք J^Z$*ZhQ,2bɅ,t04L&p_$<e!3`. R<=neGh,YDB49׃xjuS >CH]+*Cig^5b:X$CW0/c4hlb}f+RszJTQ9Cbh-F/FJBJWz2L]ZR!$ dUU-uTI&֨U!a*Tݘ8;]P~xW xz7Ukec(Y+}Hx0:0=2O kZIENDB`PKwL\sZ5limit-login-attempts-reloaded/assets/img/flags/iq.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&-# %Yr1q0ӿq/*]3du65fIus3s2ӝ̴u5o,ӿp.t4ɰ:i Vo.ѻk'v75e7e Mg¦s&Pz=eŪdg l))XѻкV~S|?ĨĩʲnҾUiQy!VT}n,PzOypL)\կ·l("R%PlѼv8;j DMXM|@cx9,_,Yrʲg!LwӾIR|;h'[ Jz=ҽŪ D Uh˹x;¥։r8hpS{ȮfʱȾηًçb KҼ%Y)YCpr0iBo8gX|w8{.`|V}BKt57gU~-`Erǂ_LWIDATxb``dԒQKF-dԒQKF-ܖ00000ZBkK4@$-ə3DX -7;$m,@-K}AtTĤq* akdIp=!?*{S7u,nD!T h U, % P ]?f?dIvVo:05,Y<)Pi)(.T$>]0Z}e\T$V|t\I,+X`@ żD%'ɷ( o¡:QX6$y~c-^YҧE%*.0! j7,d=ݟsv3ŇVVJ\Ź@Ln61`NGL_LJX\("K%~'vr"̴ F뙘]4mIu(,3( L U2- R5n V5@XFN0 F(`Q0  $cIENDB`PKwL\  5limit-login-attempts-reloaded/assets/img/flags/ir.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE#@ >"?7Qgg$AkkmmuuxĊF^ooey3M*Fʖ$$BBԩhhɔZZݼtÇNeʕΝ&BOO\\==̙s…Ȓ``ffJJav.Ijj%B**cc''GG ]rzzdd킂EEo6Qȑ((%%UUvÈQQll҇˗TTPPLL^^ {Ōɔ22$A55ppرٲ!>6PVVRiRR77=V##bb::˘,,q}}XXZZȒʕbbh|}Ǝ~Ǐ8800..rrs†i}Ѥ˖j~͛nXnDDJbǐ󭭒Сʖhh۷ʔ|ƍr…p!?jjߘҦܸvvNNѢVlr&Cװ7R[pNNC\m Pg>XլlAZϠZpʖyŋcccxTTxĉr„_sggll@Xϟ^^##"?LdPPQhUk k˖44ʕUU&C229S'C:TH_@@o[IDATxgXSWO悀@!H  B!, CVD[lY!uϺ5*ҩtj[jq'?{9ɽ9 $&Ib$&IdǤIOX;d\W낤"/ @o+ދ (-y-Hov2y3ue#.`ytOE c'iyc$SM" _`u%=\}˚=p'DO${b;n,{SYz+$:\'%X"_ʃLMn@Ģ+dJɐ irTY,LH % r{9 CA>cAjaD1J.TZ)a کD]('[,e3GSeRJ(VycRyZ||jQ."{l_dZ!yEY-~,t'Z֒oaYjԟʲB|f3=5P(ҚP(䱴4NާgU$s,CZ؜I1unڨe:k.9UP( rSZI3u6k aKp|T.jT(k.$5a&|8TT Wxie(R$&gyZR$QuWeՆJZwUV%v EƤ+(*| %+YQd1@G<8dᱫ ׳E15n\זӗ @N/H2"/|k) 31";\@͈Y n4W $!&kr#MV.!@cGBDOȐT:wV2o1V?X m-F$Tz1u_g @"@9LIENDB`PKwL\,]5limit-login-attempts-reloaded/assets/img/flags/it.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEF+7%1*6Ӵ;O=>IDATx sol?PY)1[$D"H$D"H$D"H$ 0x"͜IENDB`PKwL\~5limit-login-attempts-reloaded/assets/img/flags/je.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+,*&ڐ $S'-$ !2 jw0+?'(&:p|7' $q,!|意|Wfmܧ:L+ߋb?PW,젨)猖蚣- ,wxZ!:") "P_ 4#W+P`&q #4>&#& {2$;茖,!V,% $ 련6%KRD/.?P.Bݚ"5 H3:J %DU䫫%+Xv $f&Ȳ(!5#AQZh[iScBA# ! "͇ߞlLSHﯵ)"?#ei8A3F`npb]B:L:KS7k<ķpdmk:Z . YUZy*$"'ȌZKE=zcT%0R.0*҂ k -?﷣<AVdSX_0^IJYEDDMe}+Yf~q?5TEU=1PR)-0P S٣j⟼t<ߟAwvvPaIe4*,AFFN| [RrFŽ~#Ha *ہcy:LRYLLbNډA\V s0jT5 rO Z$+*҃ WRSdxk@⿚ Cb)sdD4 C $IUxDH얓H 6AQ,-HoS3Lez. ?uZD։)d_ScC ȨԱW=CBYF> C-)n_RT`$a> >!YYBBrr=TT11zz .0*% -~~h\%% #rj5IDATxڼUSPJPhB wwwwww3 DvݛoNN&8<̓ʑ:f7PuQa!* 6&/cp2cp ``"Lz,mr&HU$)!Jo} iGH!XBfnIRHs&%K$4{:-DD+ eR!! +EA!  4I-Nѹ hDfn$"77 mpmmpmmpmmpmQ1D?h/I)O6XIENDB`PKwL\H++5limit-login-attempts-reloaded/assets/img/flags/jp.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE..//MMhhII@@ GG^^))<<ꄄ00픔XX55ffDDEE3300댌>>VV~~ꆆ **ꇇ襤jj쐐 [[SSqq늊__``aa%%뉉QQTT;;MMcczzꃃ'']]%%(( ||((JJ닋,,kkSS쏏&IDATxiSA$BTQC<8<@A9DAElRTwNe'?gu+չF\vnM'\}J\S(}8T-zpO8 t2D$~Ҍݲ HMVjƛݱ;j?I'0_(S@ a>!w ! K##/yh\ЁQ! s %GX 9SaM$ۀ$$)U\$!i^CB*RV"MD_7~F/А1o߮"+"2NUl)cD;rЫp$ JUNwUJsjaPQCYkӭé, Ա5f--q~~{齐qaXy[VSmazڹ\\8fWKW \ƹaLLLLteWm4 tIENDB`PKwL\QM5limit-login-attempts-reloaded/assets/img/flags/ke.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEf22UUlll]gee +hdCፍUU<buuu\\KKKᏏEEZ""NNuuhh$$daa,,,:::b}QQLzL4.^UcccffiiikV^Zɰ圜㓓%>>jj⑑ݓ䘘 \s%mmIuul+l2n2sstv`!q␐###l Á W8v00M᷷::WW222//gy_e//츸祥)e)UU c X00UUٿ 662222XXTTREE33 c__^ss䗗giR99c懇o}Zɣ?D--l522͛߇W Y ohH19$S=E ]kvdu-8Zn $ҿW{ĶQB W_>pq`Km /3}>bVsmtx qOpᓭiJH<]3(饐=N;uBZPHXYa[; *Z1W)&b0EROˡTR1 LAtmdS+ ϢeT)= !B YNC =o==!ƺ!|b4H9ۛ8r<:FsA݈< ;i~f+e8G^}́FR (d:gwKO K[{@HMDӫ|2ChJEDe nsԋ]EeSʫkd+B}|z A7&Bw 5V9RQTj7'#_aw|qze>c§{^ݵnEK.Nck?}Whnұ7CvM>'ue&oƧ>*0Ƚ2Qy?4#^5D2Idfpݔa>k0q)<|vUY8HheN˚byk̺)ϚtŎ\~)8o"8%cNK ]t.b*fn#Z2n\EN͞d\6> X2bKֿy' WTx ls1g(Eڿ["3fD8)q@` $I@Eȿ 6ErIENDB`PKwL\  5limit-login-attempts-reloaded/assets/img/flags/kg.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE'(()(+**+)'),߀ wq&  ,]RBmOz""$ &!%# 'MH&bU6Z &( $"} ( (!!" %i8$ 2 =/ L %uE V#3 >*%$!kX +!5T '$YL$?# & @ ,!"$(:'($'heo% ', f' & rD.! ("i"#s(;'5''' &a'^_A%_&% &#k$#' %'Jc'!" %%(=#% ) I %9]37 %Q&+v S߃B' &&KZms&& %& " " # ;#";ZbIDATxiX3D$$0$!r.("x JU W,.nek"AO/n<$w 6WąU$qͱ:ޫT>:wὌy^~9I)}@[dgaK)h;  ,f"IaV.GAH[fYUw`W :T)Rju *_Xnbjt5:V}\'d@߿y bm͆fB0S& F"Oi)D_O^--YIB#;: 3Oe~&qZ=r_߼'E6#|4!⧾n$HR~Jb~M _4wi,d=J`-9q7ϴ!qV1hGf`M\ O^^A[Z sWPQMAQVy8:1r2ϴɺ{5̑J n3cmIQWRZul ~2`zVI%.Uu3~v ӽ%&m9{r+|Mq$SUgQs&'JFWxӏoh࿽c,F69kvfRfHixgʡS]J4|wR6_[ϷPO2(K}^>g "2jtwӏB`VO)Y:IjT7 ^!ֳ{Ui-}\نxIۗRSe;|߯2 ⃓]E^ze)m_{t}TRFTqi._H$dn'H^ Er˙ Hc4HBUN2D=pcق{@RjWO.(kLPΥݮ= ,2^m*'_}6]%k{ٳ3{Ыܮ A2AdaڮKB&zR,WNٗH纬I֌jIWKv2NRgjFǜV]7eۨ]H l" sׇ% /ׅ0J]ӯmR6  {~?B(e%Ѱ*s,XD WGW-07dVw+|aK9Dgַ(r9'D\ IENDB`PKwL\Z5limit-login-attempts-reloaded/assets/img/flags/kh.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE.%$.%Lx10Nacq %ģ똇%#󳾼:M#vdg" ©-A/F%FUž~}}ȣ%ƨ{3em.$!!ɛ+=ʩӾ!ΐ"3 &ˬ_k?K *%޴EVpxXdNaƒS]+ѹK]z|..Ȝ0^fGY"-?(#$ޤI[%,϶-<ҹ qwNa=RR[ &訍4E&Ѹ^h+9/@ks&2C@M&ϡ;Lӈԩ\d7#%M`ژ#$$#6ɺǠƹ(.ʃwyswsx&)@#5*zIDATxb``Q0 ````` ْLID` G-i6ԜƖ8]9Ɩ[^}^.lNSK;u% LޏX(` IrzUbQdkmPU#w”Ȓ^/1sX[zу0O["g|Ce?`rYn[ed)Iܷ`S_tH tƜNȵwFh4(SjSBنhi,iX9hve/qvq9 ۄ7-tJU?%%xA(䫼T$NlWt;(P/C3OB ,)|"9ρS222UKZiIr'V1*x%,u4 ٮ@LLlJd;'?rkt0rH%ODyTX7=6zV`;)awa5u{SbyeE@HDMFU5W ^+cPo!,9JR+-'cWZK+:|h]YYMIۯEW( ;-q-YJOP[򔊌i ]"l;-EHGVd\2>W@/RXsUk5LII/jB:}QHD4thz}ڈMBXQ0ZSTѭ:,C=JMQF8,Jb4:,5yB=TEPKQB6+cVG?@KN:)3 :.v`A?QWM=dJL6,z9E.N[U1Fx5#[MK _Jm6&p7%r7<(rC.8'Bjf2v=ɐ^X>-<*FU9,:,IxFIUN02+?-JIJS|8K<,hZ1IKG[P0PZRVfVD.fHRVGO0W2+u.!,scJw8?`?R |IDATxV{\W d0N(($@x*DBxAP jQ)Uh}bQhź}wi.>vL_ݟdf{wϹ|S~!TUdQ "g*e>M+$>$lRYMlD\A~QSr|0/rUO2Uܷ_WF)FSVs#V"z?v喹iz޿`H.ViӞ޼z3{"^::O,Ni x]lT'Jk\').ogUl &|RЊJF*28QCd7@Ri[^h$g8"C$ ߿Wz㕻9$\AM.Nx^V*HY:ZO5)ڥl*\|mdO@^3TleE&D TIdOI%9{p4?5լ`+Cm{}wgO {.ƊKJhy&p٬{HNcqnK&='@q jY1i %ݜd`H*+Jp p$h\pbϑW>۝g-IL%&<eSycɹ'IDp {$lQv`K|`lOhxwM䵹&X" &ъ$ Wy+Q[сBpzyvNi&ʃ 7o{"Oݰċor,`̓[ܗ+]64;tep7ǗN'ɑ$.]qmǚ΅>>kN%)?%N3·Myxlo]t$.Yxhs6ք%OtSfXNLBЖQ\,} +m/fE,)|Ξ jk >=4h.] 3Ś5|ж:O.[`_;COb̨w& !E;"(/T#w$hdof-Q!AU$D8Q4 $ R# ؀F4HHWuR7$8F-S QNr:+ǯ,w`ASͱVL;A?$sy P&<`ىՈov\,vuSՆA٠8!mD͉@6ؼQq,TN`ȒEN}!E1&w#EӶc"3:AX%NݿMg& c]Nv{Gq3w29YI>]CAЦ'K*L,NRn Ci"@ֱ0yy7e=WrC D%(JB:A8%H#D?!G*E)\*Jg6Vӫ1w|xĎ1R$HɆ'n}ƒ$G|+H@Nj=U@^$IԬ.P==Fc,Do#F΢I&I8Wۺܼ?"@I̝ G˛%;<2SH7شe} ڸA8d"Eٷ)^Kh+tŠ0P4TԮM9ʙH=V%G 3BA(a8!Ǖ0>ȕ\v+6g6p͟ѧ~C4B9i0)f&|$J"Gh;z.p5yc|"QRۼ C>"B?䕤$E9Zݾ@;[PkEJk<͠I:*_)]Up 1 2"Gv,Qo=qvÌ@A?K$H$IcCzIDATxڴy\eqzߗwnsp26]n18PT IR@MhYI*bZjaQVXt}e%]tI<6qg{?g zAG# Qs,GCü8u7:c=N 3#(fuƼr-˨#0f2@Ln&u3.:cI1Dc8u?y$2DqFu9X)Ʋc2b9yD~s|I{6gXˆY%6'(fյ/'ueGХZDWv#s5Ѕz4y[VAL|j}|Yc8|U+|NR!㬐+2>śZ L8$x8n݌[a9Nfvm1^DQ2%#*0Y *X n[ZnO r ÷=Đl#%Ģd;4JsŏbqK.܌VqAO357tD۸nV`(V?Vu ̟_9?0R$"Doz|TW_g@ݼ#њhG)#a $FJvn=\42"T5uJCB 6qc9ߦU*xƯfxFc>wE)!Ã*aQ,沚E2"dxN8| ?UJֶ<-۶OE2KG2$yR#p5f \z3V~L׬"+$g @gkR>TTiHF )5Ss?2_hAY%1@jHe#pp'W):IIENDB`PKwL\!  5limit-login-attempts-reloaded/assets/img/flags/kn.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE597  ,)MMMaY24TTT<<<***H.CCC)Fsj(e\Ulll !JD)%3:5555*|r1-;me,ɼ&"s y{[C!!!l+S;cbbb+?#000 KZ q7ƹ1 (~OH/ ~ZZZP iaC=RLGA xo>8tggg¶728UN'''E? 9w |||# " %"A;G=IDATxڴyXeƿqڝeXv!@XģDD!2M<$#o (D+K+I젻H;oۋaveggg~o]p7DSqX$b}IwC[ %-39:D<|}ZgU xD&?0M6@*HӼ) =5@*HdUJ950RA~[PkRAR}RQe vS\; =C2^3w:RAJ+n+C!H{LoRAmT  ~pE $1gu9 Wd,RAP,7(*'cl+ҕoUL0=!1~#ܜľ$5e D3~V &C 2\Pը>ԏ"q$RG 0:)wRX?5Ee\r#iif~Jޭ9F]R?ƚpdRE#Sk+Ո 5Ԑ"-[?ڴ",)i( ꙯_\ W/’G:Sxd֦A`BRɩJ6gcqqdSJ3 $LH~jM"BI'I'N"Vi`APd̴ Ӕrw;-a매9~,fEijA`BPIDW6l jqjxp+25Ô/V2N# 0![+k}ye &! AҴ`S'ciAP2i5s$0!~pEqm5FV 0!~hS=&͢կA <\5#hAJ_Ӌ/!W^N+NP#0y\4FC"<:qg361T?}Egán6@-A+v^5%'AqG%[?ci 'kC'͂]㠆jѦS}ժ$d((2ai U. j8W8N{89S@q]X,O"fRe#z檬\ O`E2Oנ5XǴRcf烡9C TZ+5X-" ){89),{B[F&XB3옘c/jGY -^imO:I:D^BE/vyu`hJZu^X})jrWi}W}? 52SV5 ;k/0Wi ! d!vJG8P QHțA yiA zRh?2M $4_7$ iS],S!r:9r@T ϭ( 0_n,IENDB`PKwL\,;::5limit-login-attempts-reloaded/assets/img/flags/kp.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE>V>W͖z>""88=T叏00掎BB//&&䅅蛛3M33''22gg︸뤤剉RRuu㈈ꥥ鞞쭭 {韟ꡡAA5N AATT55((44++44MMGGEE00[[hh1133^^虙 iiee=T]]""nn !!ttwwJJAAꤤ kkHH搐kk((!!pphhooﺺ릦厎ii// hh雛捍$$ !!@@쫫畕``xx顡,,擓 RR咒((\\GG~~RRIIR|IDATxw0=kWJ+]ie3333s̼aJ ?Tޚ|~>OIg ŵ*#^W %W?%:HH!$ a@1~3nߴ;Ě@\1=Sfć WS0DdVu8;2\!aZ5rVƻw@^06J3cϪ!5E!\koЌjuYh,I\ δaqyv\vvi'm!D."R OMۊh4sss"^Jpם^/zX@l=+?vE cc% 2'0E^tdvO . "aK󭽬mڡ!lM-̐J=:)K&ޣXż\T0Wͮ<-JLƚ]y3%bm3?okZOLBM]Jzme@XhSH0Nz;J4YNkY7CxK(aA"/8Dޚ"þD\~G#d_&ک#LAl$wI.09ƅs:J=r|t;A']{v-Y7$ Y7T?<qfhrO_uAf@|Jqާ[KB`kr-#$<$$A :H(9ަ: H򝱘WOEIENDB`PKwL\$ b b 5limit-login-attempts-reloaded/assets/img/flags/kr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE=X***VH{6]쩩EEE44422YYYQQQAVv!9}}}qqq4^TfGGKbbbbMMM;Z?W:VUUUiii111+IgzHQs}eeeD[뒒888==="0M|1S&&&8[JJJRRס"""^^^uuuY]t3xxxBBB2P1N<Oi|&ֶ.7q `}A5 >x yƔhf0q>cW/~QN҅cC9N1ha?'d ZYkj`0.y7 lf5%!&W)7?)%;g2y,#ƹ?=Ymi>lŴ}dre'rV1|Ǻ{~z-?s`:t lev&(XZ48J> k 0`i pûTp#5ڲe&;Lm-ͭj$^+!լB9=Wa0{n:z8m!8桂S͗GSr6?lAscV4FY:T,^;X2;WY.u{Y4XzVL{f3%mbWO>})#˶m2NCRK|P@lm*;^>4pGXl*VP$H]v&.`:泵:d%V-xq,40RXvJR\ID| "ڛH"mRR+ S WUwa9G"%h6n(xtqD!p5e!k&ĂfzrVCcQ]ccIōTjJFA4ʱ6$kL9skԗ"5lY M kMؿ HGzU`IENDB`PKwL\gJ5limit-login-attempts-reloaded/assets/img/flags/kw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<}PLTEA0?4I+GAED23C1<,N3C0+Q 0 *sss)1)11+D)O}}}ooonnnpppuuuF,@ P1/G H=Lzuv+ROLi<'"{̫ elP}++ؾRm/=@2}J21vL?8:-ZMhD9IB }LgEM94 e80c9+0+Z՜#22-,fkpLWNa#o /1\] `_m ^@@gc"==l?{àP\/ƽeyqnº46BD;8D褋Lڑ=fCgڗQQOOW`75jigd)6e)BW%Xv ]IDATx{\CoH"'A)/r35P%\Z((HʄU)H^@b Ev[ם74 ٞ99;қ=%=&C(: F8Vf偢G$tH?ϾN`|DCΌ鍢&M=7[ 89x dOwT 2='>T;3%3 2U?\Hxw6E#Qgpf)(rZhDX(JFD 0,$NQO䌇>?tڴⱁ<X rY&vww[@š[[d³$̚%5F)7{r$z 䆭_EQfmͣɍ]Z@NL'.{Х7@axiᢘٝÛ&2vaSBPO7~ g>q~_ڜhZ,i^^shՇ$mX@H?DC zȦ@W,p<">}9K@ȒuⲇZ5$)g̘ y͝K_tF'bުW;NdKYڠ:52K,A*wDd0LT™> F6]&d{mRPzZ@dۡ;w ]s[fGu#6Gۏn/”.EːЂ3FXa2)A}=CtaZ-rwGwc0A'ʏˏl}>4q`]v3| aUϟ X1=s*ȁR C^RaQ1>Ņ|~M||E<_Q(-=\Yxbyrz䋇%}Zn1K}Fp!]]JLvkhuYՒF2qbaHo/"ZpgI[f: .ɮ"2 n[?r񜓓S)*fVF01)S@OΙLR"},-$8;:Ҭ`gv%N֖.&80'Z|FʮZL=jNһ!\]a4mFp>[^D,\eGUgubAm]@^vĬ 3il!Hpdu{"SbNC۞D0с-$X ˞dVH4m{&ŊhHYv!X#(4i[@mIl%mI{MxakFۗYfG/I)7sBP(m+0i/ӇD V7>rh{bׇ?K8,$y')폯|*Ó|pg#K?zQ?h4 %vv bFh4q8C/ƺT&ةmφ6/"""&"|K`>5?*(0왼9y?C&W9銪b|=޺׺lRقPN{.YyɸQu}E9kڊz2x7mj\j8R"vo㵤UR"R)kc>=˘!]&$1A$MP"|U)3?v3cפ\[܇mQlMho;c.Sd3_'֎=À/vHI3]r7Z0i`Zn.U-~_?4Υ(.U<^P~4 8ᒹ6]ѥRp"1 "9b/g0z^:5DIENDB`PKwL\B ᴙ5limit-login-attempts-reloaded/assets/img/flags/kz.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEonjflmhgik ~V}um5-~eߵ&bٴ߫߳uhrڥߞdߺk!ߠzBp ޶ߣEp߯N޽]RLߤrp`{ķv0wH:m`btT_r޹><s`xPsߩ(xȀd}2ru~vK߱z߽|qɵYnx^ypn|tlаmn+]ʨߛpoiߙ}ߨ߬ߦnn8v̏üx׆W!ox[Z{߭\܃gfkG޺wJߔ޻zߧ#߷n$߯~?ߦqYZɶ<ߣlj\k޸ʍ޿g߼߲X^k̄ԅwhߖ6Wcr޳޶XIemSbAefa: /IDATxڴY TSgNBXay @}d TQ;LmEpP**cZ[:3u٧Y_О s 缗ޟ-ԭ%v[!yfV ͉zsG3b HgvhG%OA yBÝO&5+noܕsR&>Ϲ+ Ӿ^AR2΄trA]¤Sϛ9Kg2d(GoKm|,ޕO.My"kP]^ O`QNsyPx8)4Z"[?+se.XxS_hhhA\k# jֿ2*V(9V ϧ /g _t̂Ⱥ0.so" y@Qe頋y(-_Q5Ejs(3 /H^8w.MQZfib`u c 4$TULdE~ev)"e3 C?ʊȘ6B$P1]gw[T 9荄(Y*au%t;n652&%}y*?uJΪ`\\`AadpQdm#.bWAʣ{#_G 4g-@DY$074 LsDn/_Y Pqeۑ{KlEh*_,~!CS;z,Km$` 7Dz2)C9 L:fZjӣt&X^RU O>Y<VZؕUڵ0 QaxO_q^Z?/|$sS`T[ HC'$G}1f`d׼*b&"ݕL\j{ cOfڤxN1m!xPBRwJB~k B5y}{{}!S@* iN> zqф+}}brt>\:[ z8<78E2SQR}ЖTA1- zO60b -[nbn bJU-fxXBPj*OTIPN*גbtBQo;Tx,o"[6\. (M^3[L0"=B(r^j, .umډCLzyD]Iu}CH0q_5į=y*5AL gҢ0uVv1\V9iOBDHAffDU]VBrD1z%5V)MSlEYdbO,u1aUSxe";VWYm>=CRZ/.AJ{Trt[[`K4}U9о%)zWWU, q|ot{<{"y&8xɁHc` %QR:7^8w `_UuF=B[z(/5^*B7` T~Im;p%&^|J~a%8U='k,ua)5$ a@ 0 ׷@j4("YT:C[<KM6DM֮s^^CM:w>$Pqa0rЯ/GRue3>6؁We?fѼXx /]}gMy17xmQ6% R44UiGx,e < I=-aD0+A#!K/=$ni;.=1Tnr=%$-8 J[ 뺻٢''\YNI^ps }b3Y[cD$Tr&'ITR|}Գ;&槄\,i\;~@O!nU ov:_lk.=U7K-"ᐜќ"yg Zt r]w'\ղǾGgAi"G25P`CM^ <& %V4εUo};y.i @&-n͊'"W{aѬ[\bi2dÐ`(E"*$]Fсj]r^Pi=Xva*KPT[t)4/sx\Kwh_xq--vWOsbl:K ^H=N{1onb x<;rZb"UJ>yi(4>P'H* { n\Թ[dCp#s\F^E8KV{X{brfGK&\G6u$*RW}+ u#(i}By^xINh̆;z̎< :Zubapu9b; c=JX3(+並/<9C`tI aO}IENDB`PKwL\A45limit-login-attempts-reloaded/assets/img/flags/la.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&(h"#9)l)ktC_%f!cb`'g`)ha"d_ c$f#e#d b'h0n&g$eԄ 4p?x Bzܽe}'I%H~﫸 /m6RUoj,k(h 1n4q4p&fPlq .l۾IcD_ ,k&gg}Az,In)i_v#Az^w?]4q .m3R C{0n>wµ"dWo$F} 2oxEbo(h(HKg/O7Vë:X9Xw֑2o9t>YE@IDATxS1B-npw*MTĊ  ]XcAi" R`8v3=|JH$DL>Ő\bhhӬŽaayǔbbz | ض{հ|qq ~ ddj~<<lzz h$$22zrr̞YY&&--ZZ33 z zz""""y;;ϡ11x$$ }fxx//״))wGG[[x5577ii[h ~ ǕHHں˚¡ΡCCWYSQ,,wo__PPѩz66  kmmnnO[ǖNNjl''ffvvƒ|߸OOܻ~ LBww } ;H|  Х6:y{{{++jj ~ 8=AA33BBUU̠kkXYWWKK//23hhֆŒƑث||~~BB;$|y\\]]EEFF7D11zӫֱײvQN}}ÐȘ܆<<:!MM}MM??))JJ##ppIIA1ǎM"IDATxgtU6l HH%!Ak(zPPQD@bWf=g}W/ͣ舎舎u aEUżmRgK{)l~Sz${\sOo(rSU!Z^bk޻ݴȑ'iSͩ6Ar?j>'5-xFHB.Ð(jD-G#Be¸Y‘ ݍ߲n&q녷_osOF/n3Fme;F舎舎ȵ IENDB`PKwL\kyy5limit-login-attempts-reloaded/assets/img/flags/lc.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEe\[d\[]^c_`ba~xy |mKKKvvvUC222φjhρs\ vҩr&bЄv޲τi!!!rrr_^^_G9999+"FFFcۑQ0's쒁|||ڲ???un***zb QQQmWWWWȣ !.gk<_Mρ]VN(qơͧϩ\...fӬķ/C3N?ِ$$$ r[liYz찳aaa;/`zgҋSSSht;z}666ZZZx⬱υe~kfff}iiimmm{VPiIDATxwtTE3smzKdAI"- B {&MzGi *E)  V@쀊Rf޾&$os<'_7'?HbaeUabGS%Qn@4c]0"ҚTZ`"5k1H=>R^/ I#6d-&V{)-ƺ/)f~ @)X%|BhZC{YbũJuuMW3=!X2edɑ@%ڋj!RY!s.KZeMqX2E  ]+MŻZ^;d>0Ux탆{ $]_Xh6Fqw 7= n= z^栅Xwu}b*?g25;j^L+]6zθ[ܕiX t^#]*)Iڛk: +Y 』<7D 宁ԙw * K!"-BՙEDz!w) @uu,WbVHbbR1 .ؽkmؓ_k[xg'y>v/7)%D7dc^箮zod70g$ 9p|^U`)=0ڧ4zgJGO.C- !}$_n/,`Հnd+/Dܥg3\f'ѹ"ym6.pNwr B2.{S m<Ҋ}`)W ]JЦ2D']Q2y9g?!$1*~m+p`@}jA$l-?)9+,n'y (*'$(v93>E*-AYkd7sh0έ+;2 (*Z%MCnc,t!,&ݻ5'ڸ-%7UPD* ;ˬ2ͮ1aR}k 7x"~m$!~VS5;&+ط4-{".m_$o6ERٻ5+?'ڷ1ve!l!&(($:[ )f 1bæ/а2-sb~%gW+~ַ4Ҷ3* ,jo`!r$6<':%(+"s()&.ZM]Nwe+ֵ3*|-+xf;< v%~+*)zVI,+o]{#"REzi"+qK@2f$<7+T5]$pie:&!$_S+$e^Pm"ϱ*{>8a)}yi&7$y 2h&YV@!4q h])*]Y5[V.vp>tb (j )n(i *q),}#|%}#s#s&(9O7eZ+t#S`ƍ7# @ 0 RF:Pw%V(L.ryClmٲt*+&­xe l!^{yfy:Y56D=F14B =/b.k@d#2!cȓ@ؑuqq#^&T-EQBN\~1tiWikZiFu $kYpq]mZ҈giN^.IZ,^SI]/C |.u^bG0d(?wbAfGh٥!N!\H_2YE "x(-jak%k9Tb#%oi(mJDQ"HNNZWaO es#sE QZ_SQ6m=xmn\HpXdט Oh+<{4 oFx[$3^k.[g>6*) n1 W3VH!WQnsKa롬KB!C{HIGhSJ_U48$#F[)KɌ 5n+b5FcN5G#E IHXp9 =lu:?N] 楚pݔAJ^E\ G-4aMN+5U=^D bo+|<%`\3)DjIu%.Nhe*~juJ!p+% Ueh`|Hf0/TyJ*B0~_w9z;M~dkF]pkLN`i0Ź'PבA-Z>Lo%%xIB PʢrH?q B=H 9,-6'ggh.H 6Ԍx |ZwDxWֈli \zq1UBP|)]B=%T a>LԮk$ ||zX7Lc,v(c⛌ KVPˠ"9E,OfNd7]ea,T46چwgh1n{d,4in@fEiM)`@Ieis'r(QBBܤQRB|ݫQ>Q՜r+5Ԫr߾\s*Gf^C>rC$>W`5*1"b/>:Q a@nm>Wv\k߿}Ȇi7>{Jٟ.2~Tq巟UkZ.IOAz:Vר8By_؀x' IENDB`PKwL\<<5limit-login-attempts-reloaded/assets/img/flags/lr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEf1133ꖖeTTqq&&ggcd\br`^]a_uf""{GGEEwߨ no,,qiMM n\\筭]] v󕕿p""xp諫q(({jkssjog؉AAgcFF..WWww{{GYřk h==MM'&hhloh[rdTTsr"5xxfnn55,,~||^qOO++} i k l kek'IDATxb`"DE$) ~Kxx-`[3ߏ͒r! % |VK!@D"DKr4Q-%R Shkz|X" 8)q[I%KZmL @B5``L-7vvX1ǎr 0h!Ό*VdQ+Vz%?az2- H )0;T}$hS KD,e!( tY(H@W"8BdxE DPXQQg`hIQk a`H֔I٥P0}{)ZXma%ERX"cj+~FNVOdd@\.\TV G! ݕI8L%)8Qn0!U$@!`#p0000 #KF Q@CM@8Z@>KXF Q@CI0Z ZB;`[ߌTQIENDB`PKwL\MhoMM5limit-login-attempts-reloaded/assets/img/flags/ls.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEC 8l~ȓҰxxx FFF qqq %%%珏ֳҰggg vvvttt lll,,,{{{uuuCCChhh|||ٷ߽DDD((("""666zzz蛛###ܺ333𴴴ҝܹfffiiiQQQpӰ111޻ɂ󈈈III}}}qHHHkkk߼EEE)))펎+++***ٽAAAcccNNN[[[ٶú]]];;;VVVДӱ¹sssjjj޼444```~~~JJJ:::ڬIDATxSUQ ?srN"v]a ((%!3 ę9>03>0o8p#DNx +;]GZn2˲]ƩuȘNiYܚMz MAm4%92CG/4og![~>>QQQHHHqqq sssyyy[[[WWWSSSwww***BBBeeevvv¬000iIDATxEs0`_ۆuiZ%_݃>[%3]!B!@f0 B!F\9IR| ޲FITRFK n TY1lNU'x.>Γ3UyvԝDK#G憬XaYP^7]@{ߟ(Q%n35 \{gTa$O˂1u ( hSѺZ?;r%{AP<CzQչwYLQ>R9LºO׻Aښ}g|.MAX,OxbL%/bE0bD0*.:/BN1AO1\2Z2SI1*-VH0c3a3WH0-.c3HL1 `3..Y2cD0%-0T2,V24R22T26R1 _36Q1,.4.q@0!-4/7/d3o@06/,-"X2b3*-RI11.!-[2[2)-v>/5/:/+V2)-(-6/a3[20.)-UH0%W2/. ^3e4\2..t?0[2^2XG0"-/.a3 -2.GL15/ `3c3]2>O1_E0LK1b3,-*U2$-GM18Q1+-6/%-2.(-b3 _3'-1.'zIDATxS1`tg߹bcL!k(&@( J tB02d'E;it:B!>"| CyK ^$uHr[HX(flS_](“h/yic]t*iI̕˻amQJlBB-F(p0u?bc|ۥl7[n$yzxћW~O5B' 7`I˖dcnuby$R U9i\_MZ*¢&pTΤpd**{ 0frFx%_vJ FtIN&$$:|ZxU S@5Y{^~G_՗vV >%׿B!_ 06&NIENDB`PKwL\䰛5limit-login-attempts-reloaded/assets/img/flags/mc.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe< PLTE0 #z|w*4IDATx {ȓ@3H$D"H$~z IENDB`PKwL\Iq,z z 5limit-login-attempts-reloaded/assets/img/flags/md.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE!1'|[,;*\k3TKy:Twn+Axji3|< x ELnw:RlH)җeK$KqNE^,um2e2%d*XU& 8"^W鎃 <=eçiU=Zy8Zeh;{2B_7 p4"3'4oR'xV%\Vd_NM&;f<"?83mf^b%p&LDDn.m0d05``>z`3yw9^Nb_e)~ $!IDATx}TSe9.wCbಗPH^`B(Bͩ0'NDCd+dYI!F4^@(9s=|=!h͸n9Ӷ-V+g {yf1E"8ГӦM[8)g4g;s|dfTiM>FŦ3# wzDKH&[I0RU$C*ȓBÅtuƛ.s:ƊDͰ]tnwh$-qٴ^KJWшvBVgz.^˓@Vf _rtaUM[&FKf u+2!t0_F4᭪نsꤻru2a}~~ͯ-Zp*pcxhʧ\=OʻOc4$1ܝ]% `z "wϺi;b.({ 䋁Gy*k+eV9W-1$-՝@{}⌑'zGp=iLUBVz(9N_@MGl6`"!)x}[J˭Շ|ic<~j>_{Rq+,VUXXx3̐רV?d0g}K__|b/m1|DK$G:i$x\VE#83c#}KD.z }6"zb~ט\7:(R8Z`CA^"rqcufYz0_ῃЍ1u*Х8Df{̚5ͤ8MPd%["С6ћ33Zs+j>U!Ϣ72bd96ɍ1 #԰:zMN&] Ē3 W͑2Ә/ʖ4|-Ɓ.MΟ6ԭ9<պ=Ѥ7Ǎ1˘4Jlrc UjqȐ2Ɖ0u*b?eoge%\"7i&Ʉ/},ņ0;"Ҩ8}MӬ9}y[̜5ʊ0Ɂ.Ώ-Ξ6^lj ϒ2:Cɔ3-Ȓ3~,-̞6Ч8 Gr|ҩ9)Ε3q)n)|TӰ$Ъ9A AXxw^Ϝ5Ats^Ω9>ҵ<ک3@v~by+Η43^ִ;՟0ė: ̠79Ұ;ϣ7{,|E&`$ҭ:1!}+n(8.ɞ6΍1"!ɘ5ʚ5ː2͇.g'<"V!PԷ< z**յ<̜6Ү:`%FGȚ5;5˓3Ï2Gѫ9Э:i'6ү:o#ޱ5 ̡8)И3 ӯ;ɛ6CЮ::=Ќ13ϓ/Ћ1ղ;t)[,<_plQ Ԫ7ئ3ִDqnwGU1 ~ Χ ໖C"pH.݆܆|)6=^_L s7AmdxN,-.jCNn@b@0.w]p1-羝F@!ܿys=*۽`>k(4U-X|͔;}6~8wRqzݽ0HF}t3 `8&dPNX6|CgR4= cV U3$9YUfð]IK--UIyg V,s \f r 8>ȐH{ BǙaI3CsY 1S ?zCOsh>:~(,8<3$L EuEjBFdAAN pLKoN,GdȲ d7 G5PF>WHiA(6@eP#.F "tHWC2ifW%Ѻ㷏>(ֹAf4k" 7."铯CP2N"sgH]x<++pa51z0R4ß$?wr$gO8e(CO|qNQKw|Y+^c_VR?2bR驒+%E%-_*zJ#F ig$<9NYԔj{}eŽU_nuҊ>L$z0Y~u0֖Ƶ_^]2j_e|!䌾 DvB}醗lٳlIzp=Ϥ2BՇ^A]oE2 E}c>Zvh_M35^!řr SfD]{w,6ڔt -mGZmr p)Fj bf܎HK-k^YoL+^KBJ!~۴Qh\fX#ˣ>Д2F*ٝĄͤhTnH+ u *utMft s+rFAѨowvww-RXB UGW[pyޯKuA][DUDR9!*rVVsDV:&ҲFTʴp<9*4,cχo-"D76}/Ai7y{/*ZgO 6K ob{_PΙ~})I …׳X1AoeL< kr#l|BtNgԪr %b+1y?fzM ^I?Z+ޖY|Lf$A=ya{4xxg`DޣE fCt*lEH{h#|EQdf{Y=#n 6B#?4c)r]Ă_xƁdB1sfڰńpJQ3]nFM>~XacCܷf Fj#Ȑ$2u}g᛭D:\R-|(p 'w_q{y >=YH1ϴ"*Q9c-_IENDB`PKwL\J5limit-login-attempts-reloaded/assets/img/flags/mf.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&0/x*t!>IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/mg.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<0PLTE3(t*)~p'  k~òg釿1RIDATx0 0!-#"21TD"H$D"Hmʓ眪_KUX%H$D"H$O&^"nIENDB`PKwL\_]  5limit-login-attempts-reloaded/assets/img/flags/mh.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE;ZW:Y=[9Y0QL0UB`݊Ԧb6V֫Xʢcnt4WZj/Pj9XKbTR9Y8W4T-NV3S1R8XԪe2Rʑ3Vaz}{ن7WON.OSe~R۴VT>]}TrDb1Qisn2StVq:Z5UtJgğe7Xx&H7V#FmV<[ƉNjIfip=[mW\@^Sn=\3TPlvÂZt|PeLh-R[u0P+O䙩To3SQm5UFc6U둢h7W?]VWXsys߭Y:Y{bnnIqة\u}N_xg֨]Ҧ_c{߼rv(J͘˟ҝwA]ӧJh|HeMl]wџ?\Tgq1QNE_Pk+Mwx1U4Uڪ[ݫZ}9YSoXbxʐͤ`k=^NeΠNVUgsryUp|{D_5T6YoDdHeN3T IDATxڴ{@[W HظnK2hu@`,PDqVʳ)+++lLtk2@Al-uZ:]|k7{on/=~9}>m|cd+sEZFm~>8?Ѽ91Om3L/ofդ,+ "$wžUx䘢/d|BAsD' A}7$(UyVX? %dqۋI,'V#\:LD胀Oű|CW!ةftVjz &-iQ3T]LNɼ\ClF3f%L~IF2BhG3v0t\5M,շr%+R~WZS?퓉~hKrJw9ud= {^nlBdžMw@>Z 1fw˥*e^04F_",lftHa&* KP'ǧ;W Bv3b_ -;xBH@,նqҡ Wx tɕ+*'=ԷP#%3p é&U3'RmVFDY xH '=o@xbԱ0jRct-*|T {'dHbN"4 )D1&e#w>N[=up6cbh)Ud7G9\RmEꍊϙc(ϳHɑяy'Z1yDCWB.Y}q΁XTBfЯXFe`œ;P.N-|/CfurDz{hd*k*-<DZRLȑqT-V1CEZ2wtFiw%- !vA, #oIDATxڬw`Ewݷy%&H=O0FBbf@$@ MҤ{C)wQΊb%z+zEؽ^wvevwMw3of~?noCwqE=hm> g RCâJMƴN2sb =$}6]߲v3qf,yVEC"T૒J\FxKDy =(b"_+m [oۣTg;|ΠPlDV5S_(ѠP1,}WX*B-BB k76,b[W)*2[sx$WuVe>:pȌV;zϔ+'JAE!qWhgz!rhdcfUT%Z`/PuAF&ͨXk3h=Ie{C*YD[plT!+K ,oIzB>*62?!,nbw]B𴓴pn'vfڋ*he}ԧ0`zF7dڏ* */C/q|V*˃ 73+VŴ2DRzy`vZYvMJaTdsq+hgPe9 fb5fLŚWUkUY4*:gBG^iBt09ch颲Py1QȰ k 39`P!/0pZ9]~r4F1O=RC\czG'9]X/1vydg'xwuدqӇZ`X.}ԢGWeک_ &_x'0\{{ߢHX&#*2'"R6'KEG"hzm`,5j?%>8}82I5emhH 5 Z6¥sBnwa  $ԍ鈈eG5H1:+P܈O$(Ks'' cT@C>J*Dl2>6{}^hNк eץq,؎]|9UЎrQ~혏|n2w%a7EL4) bI!]Ƈ5M?8skwCA*,0r?q}\ w+'[L'R򖅀~TQ8;c Z 5W C;gZ@'e[1|.{wo~šHр*p)qTgӭYx;qhD1O8{{CDȄ3j͔UadUc$ a.*DmxiPd ę:R *Ŏ>fփ~Z2v"sPP'[ G f)Fʄ=TII̭d95f[+f~P<gfO?-8yf9ᘝ㌅̱*2{6ZK[r>E!*V82czعt'̢JԤ *^ӋfE>ֱeO8HdvXo0r6ؕ aSJ2C+.!gF?ͬq3o6TDiSovؕ&ŭQVEM~0!QVE4" 7EUu*@ʪL,W}ݫiE6zjsn"G%չx`md]SXR;Y'-v("C 3ۉ>EMqRvD`y)Zjwn' IENDB`PKwL\%\b'5limit-login-attempts-reloaded/assets/img/flags/ml.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE.Gpp?>F&ٚ+HGܤ.4g#5{ZZ%+؏Տam BBo{ 􋔶;:ʳ768H=L˧ަ.?ؘ,ӋTTBA][5.OIJI+'(12"30/ji+</l"'$#5476}_lwv oP$5.//521 Տ!3/.jvmxvu^]/>7ԋ71'%ӋGFVUR`@O98%7 1P^ 2ۢܢ&8ମ0..,ӻ IDATxb``ti!ڮ#Jv.v7`vuh03{K M`~@JۨYAӨ_}d m @˨Ԩg#y1CW XHgmaD$E+.é$hd`'\; x LDK\5I%HJj4擔pBPOVOSYQDKdy?Խ5){jGȖ0WTeߎ~+JYf Ig*UHQua&t- ٯc&BOvX0tcExI .ynCr1 Ŏ5i~2Rlvk'+ +gk>3#1v$R(r,F!;r".-Oq?XPvxTMUZJ`ĻEjȽ=#Njf@4.I%DqYbu'8 O_DEذgfp .9f000Hj-.GK6Kk -hOW%`FN(ܖbP@ )ĢnXU,E!3/01 )g e`(k)lXNQ, } (i2C U۸Qa*'03 Qyk) P$1,W#o I&8+^ uZ!24+2>)1wy55@)42 <)0,?)}4,tG')/a O$^IDATxEwa`:Bd8H4iw{B iwܮ]n3wϝ@K w#8#8#?q8 Q8= ay(2+dBt:("+)2ՠ+l __JI KR iMW{D !HOAA.CcAFz'ފ%PjEfiR@$B i7¥*""yc{ecD}zӽEEX㉯|5/(lAv8?δ$Eb(xy̸kނM-$š}Ȝx'dͣnH!*ȻȦ@ ;y0J|wy4ypM=䂲ر@]v5}!9B v.͈Trn`Hs r8<\xqX,rB\"מJ[F JG4˕18$)ir,?|]D ]V)w( vBJ\}>R[_ƗV,?ќe u*IS\Ipt[nok|\dzw ƻx[R Fۧ?<Y2aTf/b0<^*] B5 p_i4zra0wT6'& /tadBXF%T%Sw_y^Ƚ1m)y_N{[ThgiXźw_#ttbx^ȼsXEUCppx^t>Nw`Xw]0{#V&U¶"?MrX^0X?-}rdhE~ѕIDATxb``Q@%D;6Z3+&K3{|+LjI2 |:s8X*i.M&yzJ_\8MF|)S|?^:k~}$@?P11' CRk|1$x81.rL^I pdd<d) z%ͭ+Ȩm,c:ˆaRC+ bh;cc=#{)8fxSX+6e9 KWI -9w= "몐 v0Jb ʻ&^0NW4BƘ%6ܐܺQBC)Jtx0|(χ{pE?Bct ZLHGg0,no<Tm8^Ѓ?O=<3#3<`}r~Vzկx#G~ZGXq(cq9bEsEϋBR_߲fi\V!3HA韽xa+n~Qף|/P9MptPlK32]E돞 guOrCq.7& 7nn47cn; >(hw7m4I5_p^A[ϸt1.Q{*~qUcR[oMd(MF5'׼yb%Rk7aw߽7{]W<….~sS9,e,q<˒]CT::D %A vO\rq\hWlW^?P=gMJ3XhÝvs]Ryos}cCX0aBXTLdauHi ,ě @f9wW1i0 rWy gDp)}u@&UFu^XMx{ "t`ZfԪ_pbJ% yݭU3؟٢ Z_nzk]~M+DT˗@>QL,K{,cBT{uοax  ʒr^9`n2}kCy]/t|t4=,7jh-XezrLA6%0 ^AC77"aHvU@PrqfҒ$DRA JzkSHBT }Xc3 C(H 2pBSD0\%;wH|Y.Tj uplVhF(jO?)9^YY@!b,!"}0HSe'Dnh8d !0f dx˖b&S,!jie>͕AZ.*u6mG|ur/4S! KJI ӶQ'ć+F1aDm #V'g1dm6̤/;ܸNHիZk n2e~҂, j)1DְRcwGԺ$>PdS>^w2&]$RKa&"8EVvDz;,ƹŻFۭ`qT']$|3=L5(jfϸ̺D2ZAxZS=qYmj<4(x -]5XEOe˟3b*jaW$dI~L4PAOe*僺]oYC$˯7jd;.r^%Zܾz7hҦ|҉I CRgkHZ&̭ape5hb,YCu0LQ4"Iw=vP%Vq, -pOJRIDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\-_5limit-login-attempts-reloaded/assets/img/flags/mr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEb3*>DP7e2d3'?*>*>(W5\6`4]6^5_5a4_4a3[7d2F}%c3 f1]5­ Z!m.M$oO#Y8"m-;y' g1+s+ϳ X"a4 c3` ʱ [6i/i0]!k/k.jye+q+g0%o-Į #p,¬ b3`46w(d2e2b3W")r+c3^6޷ j/ B{&uǰ г !o-R#b 8w(lR$׶"o,3v) c3߸n-ҳ tgO$Z!7u)A{& J$S#!o,9w(>y'p\7 e1W" e2۸Ư j/`5h0 d2!m-U"+s*bi/® 5t)&q+T#a4Y!d2sW"¬ ޸޹_4߸E{&ӳ ڶF|%f1g1f1?z'b3Q#R#@y'g0߹Ե ִ(q+*r+i/S=~ Gv,d`NEo‚"LLLnOLa'a>&0u&8`g&k=] lGR0?AD6.%\ϵ0ӢGF0ߏ KkHϣ<& ߹%בKn*ӸWx-Yu#ڷ&ʒ^p KCץ)_\`fw/&}Q#0\q@IضAs\7r,Y-xb?C&k%-@z<͹BpYtH!yei[nOs._D&}(Xrq֚K 0p *yΫqS|6&& Etj\fR$Jn;(EVYϭ$ҷ-Dȫ #l2d @% %LL|-jkA&&QCr[0Bׁ~i(t%F N򼲠vUƪ.>PJAS7T\ݚ5Grcd~!^k֋h -W|\Ǹy?BP$+|Q 4l z<ܼ@B{ZP0Dc^[ xxuT>.hLYƼ:FLP &%,, $Db\&S\K ]C8"جʎRN{ٌ3[Z@[\\|p s>O>*?"E^s}Kn0/MbGMU 4BʐQ@,`````FdԒAb @73IENDB`PKwL\>d 2 2 5limit-login-attempts-reloaded/assets/img/flags/ms.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE!i.1Ie Zcw{!br!YnxHQ=|{ 5-4:1K6z ;|=uIOL3e戗qUn뚦AzYa4 $k (z2aۭU)3Rf&@~hM \NGRwV?rMC~Bmb&)rkj"!\|'% f\)t0)nyomF1/.(#GV NfKYg+beSa sIDATx}\SUwa¸w0,@N|6,Qy5e3^*N0! riEYejQZi%45:mm>_p}v{~w4F7A5T4ޜ Dpը^ ]4K6$E1""O,bB4wx8 vF-TJ @pM+mB>,1J;ǀ بVH;@ b;]\"@Z:rQ*X,Ae*v MT gAQAŨ\)Dd9KЬB"w'vʮ$.,*ЬDncpIPhXAV~]IҍG<88fpSSSS%wS lb(*\^GrZ0?h$g26htW_˵|3RܢfǏ$IldjLb7'-%vT}Ku_c*ȑdߝ|ndƙI1k \Pb@1E7C^sHΕԴvWG1[tߏc}/Fߛm9\8DRa < ISXğ#NB 4dS339$6cp8{);~`p(I>~90EHQ# T5_PG+ȅDK o|Imx7;6v֐DeP;9@ӒH͌ЊɠQJ`3Fݢb%ãr*wbF˱vDr%$)-Ni&)!:GUfe~ɦAa%W܊M 'T {G걢V]'f= nMTA<^@]pe,ɼ%,O1D5K=wpK2NKqW%l[p!ٗ:A-~Pd˩%#MJdw__WϭhvMMhyCuyu7xA«ی " *JLq +^Ό`3SI$q){DydsK ҆]71Ƭ89|g(M 5]a ImU qglĉE[LZKh5i˖-u>K{o]~>7z M$ιoT˒rG/Qe˂c)dOF0zI"25!9 ,@XwDRt./R9Ԓ thwwokd΁YY:MZ- sͶy.')^&Qcu,,5fc]9I!e2I$,ީEG4#B8IU!SvG=ݗYU!*'1c1}mJIENDB`PKwL\B.-5limit-login-attempts-reloaded/assets/img/flags/mt.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE ǮSCܖ\}֔P?l̑IכOm\ĘG~ĿǭʓI˒KpL񹧞rKVq˕ڿE߯챍ҴyIJ˿V޾vvſkV<Ѩk@}`٤g8ԇ9Ќ֒MɛⶶǮ{H۔FѝߟMךN琢R&đɯןדKෟ˩TƬrrɱ=݊B󽫮]=G֜Pկȷ}y&ܔU{{׾M륦ݏPa03/$ߑ_14( F\;E VwXeQ4(~kx~Da,ZaED+$(!a!M@H (DwyeD @-"2jEJouG@"#D' _/gd 14,!"o(^c#Zv$*`o-lvߑc#QXq{ݯtoN]uwjBslSGl>HO;c~~jin3n=boƀۻ8r;}4!2x2WֳCZ.I;<G8p#G8_!$ȦIENDB`PKwL\cZ'5limit-login-attempts-reloaded/assets/img/flags/mu.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<*PLTEM'7m'5U4%Btxh?mQn QIDATx͇ 0[F'PPQܑV?IPRRRRh %%%%%ONC@$`9EjHIENDB`PKwL\g5limit-login-attempts-reloaded/assets/img/flags/mv.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE4~:: 4 4%546:{5y2z4~;|6w/|7}8::4x0x1w.y3u,~:v-~:4&5v.564{6~94w0϶ǩ$V~:$Vʮʭ BG&5£|8V}Ĥ&WFδx2v/ԧӻվd;:AŻ/[BO*[)Y=fLE{@l}9 466~:Tzǩ3`dJBkI6b/_4"P46 C5MvI;}9Z66H2a Pw C @ȪиD<϶z3.\KQt 4H'5cIDATxׅR@a(E[H[<0[ 2aX,{ (*c!""@{_A*@LK~!: ޅ~TeupU'ለw? Yk%^z\yNk }{|M#e%oa+DD@ 7Hn0aTjmJ‚zH;` q£"@&7DT>$+2*K* {DtXTO^$-k}dRDE̽{woIyPڰ J_DJE9w %,Ýфw(q3 ]G/$aNrr5U9A,'1{i2W;G:z Ũ(UbXovDeaIENDB`PKwL\h75limit-login-attempts-reloaded/assets/img/flags/mw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE!;<;y5  #   % 1e R: 0  7I/(?A + @ r CG 9i  FV\ L6j P;f X H     Q .l ,* m  Tb  _< Zy  D'8   ay ?=  n   !  S23)*   U  C( ]B  Ep  *N} &{ > U 'D t   %&B  ()- [   ~  " K   g    Ek @@s b]QIDATxb`` EH.~7cY򴰄I\3cz7 8*c%b)BE~a- V6K |<>G&,ȔMHwMRZ;^sΠ%J설f; s/t+6y6W΂b~RÒI5 %|˞~9Sm]Ǝ+`?1*Bum)$>M  nqJ%fJCVem*,ty8]KW(f9 r:*e]yƗM%{[r{| me~xXDFYyBYyǼ]mU7C{k&}ʅ]jR|&-0wW'L%>Bm"DN2K`UnI%FOl+saBdt8?sIllPrV| {jyE" m B,Kpm|2,x#(Uԙc h ]]oEhʎŗs=HDUɴ0DU, úڦ\HV`"`4񹚄t8XeFO4-8X [Ugm.4` }'wwwy-1PRUYi]Ԁq]5T>mN&sIER h-\X>qNU_gUd`InF7@5Q\8@:(55OHjE*oSdb4P+tx|L%C*]2\5l>!ÓY-|C̭cy9j8I?|jO܊?zǞsPnF"Q+\hߔX&ھt@̼Lsыa5üp<%ZB,Ŧ?5P]N~k`@dH}R/}{~ʮfs屶ArE)͕؃xM/ѷQžťȾ駧m6tcy^ᵷѐG|xp^Qυڜ`/n9V;X2T*[+ۿE(gH(K/ȥЭix]ؒxO2V& {>:sj̳U(mW;ʷl4vž٩Jϼ^q}^{\Dl@}BнI;IDATxb` XfvFaԒQKF-dԒQKF-dԒlcKPЂ[`cȿZ3ZY!SX]vO%N\'u8.N%>EWq԰zHK:Iv 6:c1}f6mkk/"[rbeh;,fixAp%leZ&ehSy{ -7IΫům\r-磲%M[HQ3Kgb keL=hZevIZf=gGpV4-^pQW8sg]\·Rђw|Lrz#|*LwJL?$ /]'wv^~hi\DM=\W6=_&u-a }񅉧D.C0Cݜ]LNT')ܦQ oP_I #Qs;/?\Hx,{/VrE}QW)%e,Mz>?SoԦ(EЪ**OQ?46$V3Z"@vז%Z2jɨ%Z2j [.7IENDB`PKwL\O5limit-login-attempts-reloaded/assets/img/flags/my.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEfhFG\]^j|| ll鐐<=)*fkilg`m g b]JB8-P aq.eD5K%%X֫ c#XnX;iU=pg]]qZ:_g 6,Qny*fI:IXFCΥr]:"{b5WEF_\Цg35)R( Xf#Y"cO?za5) W+"W|*r].%U1&T d ^bO?GȠ(WǢ!Өt\8PAF(Xĝ _F8JeϦ[e>1NL||v+!,#U[ ll[HE~d4d ƞ w`8<2(R baO@TCEw_7۸*)Kk:.OYICK%nP`:!-μd6Kibw$>[֋++ME0ܔPm۷THbwe>]uh0ə^dgdadq@!` 6"%EttK? ](b֫$b=3 ,aǧl)7Qd s \(Y||:m 0tuɑ%n&g+Q+>/f̫.jB_}%{H (&[$#EHΧ ;ZTT۬tZ(!pKbtSR<ή^KEOS&2>_D] OH' 4n$D>0TM ˵[`OA03rnKWqTX§bbS-%((#bDAxٙ||1.˳SR +Yb)\r(١$y('(>49k䓹}QJԌ8idGĉQϋO#I[!{xӁ+7S0_}(ON=r>QRϞO- H;z!0ǫG +=6jѽT^dpCH\vˮFg~VfjEAjkջH5JabF)v#"V<[]?<֡."rS alr_`}LڡYk^܆fT5A'*ML@OKx8F oŤJ*XYCΛ %%pcc.>1ʖS&0|Uq|ՅcmmmŞDtԧܾ@ ܽ?{һbppp.08j_̢-.{|bUUUL|+++)@ !$ ˨lZwT9ЈȘmIDATxڴeXSQp9ذ)l18Dz آ݅ lp{?w[WmɃGpQ2DER$5$ Wg>AIWkܕFe9,`bs顎Qh:?["KeZ w|)j%LXrijհwz%}' Gzej[w9 唲0ėt>-ٱG/m99]Ʈ30D۷=ޝ{A8'8zx}h+:\(4crBھcѰ-NW;4|!-JDG}w4#9FIyaؚib X+Y&MM^39*b,+Fb%Av֥m%Y<Ҽ6SB!Qш|e#6`#Z|.F|*JF 0"p7B00!"`ST# B͌#AJU"F0P#婎㈏DGc;p9[IENDB`PKwL\* * 5limit-login-attempts-reloaded/assets/img/flags/na.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE86b78c=:e>ﳳ5b 22Ꞟzzも勋jCjj𺺻ߩccf즦UUTv[[[ݤy)X-/],Z;e$Vԋ4a*Y+R&VEl4a1_2_)Zd<<S .fqsD/\KK--tt1@ A{Y.䶣Jh4Pw5> iyOs藗[{EE776Kp}j/۝7b&"Z瑑))?imvHpd>8dlwn`~W-,vS: ЁqL9d-\;7c19M 7YOS'+Z6ba=^\/^s%Woo8c75 b68APP;f(EH8? Y";;h`IDATxڴ\ucW&Bg@8mj*?̈f54˄`` 4-&aah(ai!O˲_Eem97O^wnyĹJ(g?)ʜjrfeed`jQz掽 6%1lSǾ0U68Pa{MN&0"cB^=S~}"iڴﱉDV%<4b,(0; iA9U%SlbVrar":˔S;SzKgNsk#a"tUhJka:K16?X"1y 2uEwӦEb `Gvӥgt;#4]{!CZj~9I&3D9i1vTk4ڙ-1SȕfK &:UKP i] #6?[atAzrGdh o7?[Pi1`FtSblOOj΂rZ`~BU`Z~*e\465}'~D-bgqO2\4B5YLT#/Q1F"xD*}L}τz` K$Y]#2D SH9o goc`g8ABGr80ϻʘw}uwd%֜'U0DzT6#⠌l+cY/xdNǫ" q}&BcKq_H_J(1n'󛕼xvK<E(>R~~[DEM?!Y|E",#1^b> e,1J2G&UMgnCoFz??@fc|4)Exu5Ue$-A#,1{,Z6L[ SƯ`*aے_Y *2TgfqP\^;1^@lEx3d }Sq2B8Bdx^ 0B[Bq".2 !\e82E!lk]bHGG?C2B".3$"$9ex.XDET*?pC$B!ƺ [Xߏn!ZxE]ۛ'yn;0~0+FǹZ\#q?q҆¬^<IENDB`PKwL\KT5limit-login-attempts-reloaded/assets/img/flags/nc.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE5CA5C5A5D5A2@5@DzD8RLEx|2G  V%+ Pjlc|q%|{8=j3Y+,uD% !4-Z:48]ZHYR95!&A#FutC76bSGŴ61/ qeEATS5,)D8vC56ͽ$(~l )q5C9 tj.^Vf\(%5ɺ=5A5LF%"60 |IB=5 4 6оC6-.B6= =$F= !%>-1" !B 87= ](@7B5A6C6:r^DG63` B6D7>?2de@=E;C8wmDH46 rp~ vmIDATxb``4M0qAi 5*'Tk*44[_ MR}B&U}]Ra=UyԳ&pGQ`Q^&¦ML˯lפ7&3e%l3$xM#Q3>7?~|'0GXMLY \^Ƙ78wZz}uvoCӘ!"'[A->D&2Y D~;K_4#! eC 2H. $Z^[\Hb @q 7]Ms[3<~%LrM5q6b$o>4mWf ͸sq|.%&fE@oC-C`Bg>= F |mfkT.32XÇ ;X}((bI~#̫ȭ["u'>$mM&O[һ'~1Hdi>I)9@;v7.fBJKIzh 2aYSy&s&n"ՒVs]E Zbg?E!Ik<$d5l-)Ȗ|ȴ ?b8O#t),u*=+U+編V aR@i/閄j`Zȩ@bXq !ݒ(,&Y瓖^L*YkVΜ:`&ٖ ekH'ԅiIlwJj׳ETI]^zM1 }k"1SQGkm{0DQͿIX3 Erew>ݎ ,,ݦKXy^z)l2aͮleXIɬyhde"hmi #4?fK0&N&`N^|2@1+}㹑#PRD68:oM`DB#7Wzt["e8 ^@6M8 s`I|\XQJZ+j&;s#KDF4 mP͇yŖWfx?AIEiD KX%yz Qt ܘplKo͢2oBYa??lrgFq=Ц tzsl&l/Q&`45L -a_4UPx= b +&0SaV ./HK)4hr-iԱ-tKX:6K32R5[= UGdX5ҬZuV9U  &. IdF:QKF-d$Y`"AUqlIENDB`PKwL\*5limit-login-attempts-reloaded/assets/img/flags/ne.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<SPLTER +PW+E%GJFOIMLRHHNQQRK_éMg%KQ|Kfy?x=L\l*ҾEKR̵WdV u{Ch'^Yhf%^Ŭӿv[n.}CU Mg$k,[obm/d p4QΚJIDATxES1@$[oiqwB? %3/; 0 0 8m"R.YmffWvP3|S1nzمeH I]{oVGٌ)@&J]N#Qa>82iw= Q ڋHX0Hh 9@,0RBǞt#{ӝsHdu> =;NP@GZ) \.F{DYÓ1,S˱կZO~$#J\5$ ">D|DADA# ,@>vIENDB`PKwL\Nv5limit-login-attempts-reloaded/assets/img/flags/nf.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE z |xП})}MA^RdZja.z D5jbUtk$Ͻ| N>ªmc[S#{VJ;~-ƬsB2f[MB~|rzs y5{$w u8%YJ˹REG;ʶpf~*u>1C}5:(.~u~ }Ο$v 1VIè&}(=.s 5)yi^qhxOBzJ>)|}.}r|'{oemi6$.e^RESFriZOXL=+zs~v9);)|ka-#|z|rme-xn}5#la>+/>.G9/{$8& ~VMF5҉vnѻ?-yqʲH9K=I9-RC"F56&5#vk^D3L;wl }0xVH{f`@0{J=v zyprl)n |xz2u'7{(-H78*9*{tq *;,:/=-LADZM@L=¢=+{zQ@QDUFrltl+{*~aU(}) y$C22"3'3 6A#IDATxb`X QKF-d[RNKUAhoIO-R(%1hmɢsSM|y&6NZZ"ŅmDcZZ63YbdtڠC,pf,wt%6Uܜ JWϽlH+Ki64{*}KV_naJ9hd 2鹂%:1wu{3ffy&deTh9OI51\$C KJZ?n ))=3Q^t6 yld^Z[GJ@Xs:o3nɂ:OUEj&'wZSk:~TeK!Y{--~7 mzOTOrĒʖy'k lP?W]Dy VdK@2io"1uTtt-@n9Z:+EϽj`EESiqPv(gk:]o-1YƉW%ӜCf [<dvҖ*NPN4J娅TNUg7:%b܎tY@XYYTıA5CB?Ԉz2϶-M%ݟl63tj U->M9+fI`MkRㇷ*L-73Ic˿#׋{YZ&Lؤ2w',QB1jr]71ԲRE6f̞P2IR*Tn:UѴ8A1!tj䟄h; >|DubfL7 ST ĿIQjKzVXgqXR>$#d#J/')*203lqog*ʼnpV쀵;C}P9Wָ%q}r3B-NfӷLתͱёjIx顃֢q( h>˵_\ _'-:͈DN8GsK _| !QKF-d`-0`9KiIENDB`PKwL\F695limit-login-attempts-reloaded/assets/img/flags/ng.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTESMιIm4?IDATx70 w ʁ[N"qw5ʔD"H$D"H$D"H$D"|<G {TIENDB`PKwL\L5limit-login-attempts-reloaded/assets/img/flags/ni.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEglec zޡФޢ㱇ܝYumqܜ㯙5qwMѻ϶ȩ'[GάТ}Qbg٭oӝ8YZ zEጿ,˛1ھ迚B`u~jΞLj~r긽aoҭǜZ~n2Ȃ]S.:춇DӡZ廷㤉]hOtҮʂBAҐmߥϮXqrhJۘZP=ᬹڢN$B9cIDATxb``Q0 F(t Lt l^^6Il?yIH"H-Z4=$Ym/,t;Y`͸/#Gt M,Vgd| G-Ml\nK5@,Aj[bm/?!K>*[[DF6w\bs|%o}Ywz|a9 j蚈³rU.r7v^4uj'^1dY:9u&m]~GV] sR?Ǘ=ܱζOz,FFM>O긍Ԥ3Kʖq24{^$jgF.Y] \<~؆kR켦5St_4;vL@07-@0% b( 'ՃOiqh߭%.H8&c%TbhsЪ!Ș93%'[+E]V<<$ic`%Ԑ`1 F(`Q`򅘚@IENDB`PKwL\t5limit-login-attempts-reloaded/assets/img/flags/nl.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE(!F#/%<]A%@+BIDATx  ?[x$ $`d+S H$DryddH$D"ܝ !'KfNIENDB`PKwL\?5limit-login-attempts-reloaded/assets/img/flags/no.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE)9&d$b*g^%5&6(83B_2A$c0? `/>"2)f$4!1#3)f'7%c=K)gbhIDATx 0t/GO-H!A HX4=2n9!}4 @ C"a $czĄ& kT!PLIψ^Zdxf;<Ȗ45ndI*[t# Wđ_nJ41vun׾ݮcW#C慯²a!ŶG0VoC7   @D?(>u`~]IENDB`PKwL\/I~5limit-login-attempts-reloaded/assets/img/flags/np.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEe _ f Ta`\]dm ^cc5炂@D**z_CCa웛SS^>EBCEB錌!!R=rr~~KK..55";;﫫11膆7JZZzzZTUkddttNNYr.]z*uu>>3M ܕFF떖bHH꒒``cف@@zzqbb `l0񶶅% 22mm::YYmmRRe~'Z9bY/O w,V33ff$$vDD%S** &`=G sd _ f` h bn.Q*Q"SZZԤd"U!Uppc ``jL?u+[hh_llpp !TÞņ$]]hhjj$$b!!LA=EeR"IDATxbl@s )8 -#GcK$%̗HgVe *+hj r_4[$JTxiZh^pGZȭ(`M-adY$4m.M-adϬ$^I[Kx^KSKys#Y!4]d_Qa|ZLbVԲg&pc`(ׂ]w`hZ5?l5fi&%\(va+gͦ[gh6As-,ZyA̢-KvXrMe LB]K~4F$<#Ґ vdre2q`(vdxDz$%_<\2,gV}-S'^Z޽Pdp"R&!JrE BQ[GuGSo$XwPJy@:p9{bO N<3;VS'Nl{QEu]"9@MU,*ZZld7-E½ZlSB,//x_甚]*I)%ő\TPũk5H+e, ra$(Å ŖBY+93z2Ci|K-в:$;'*tRLW9C7C _mmB͔ž^Wuj CJ-i6_9fgp5cgZdRu>F.lmA>\x]pty(op1bԖ%ق݅ӖgLuTfHF\p5}̘+0zK`@Y|mk/C]qnok't$@m̘* +w[o1L`o -xom ,w#q喢_sD]\q9=LAZ#q㰻l p;T_G_ pg{!p'tm &sOg9Pl~|&sLT)IDATxb``Q0 F(`XXi%l8ilT ؁ `#8}AbK8W4Z΄rYkiY1k>%V6`SLcn8ϲM\Էd>[At3yxEjUb{&j&BV>e4SJLD0עPT/%ٌ6a8uAD 8mD>iG;`Xx#IENDB`PKwL\\S S 5limit-login-attempts-reloaded/assets/img/flags/nu.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEfgg]d 愄ajc :H77g'TTqii33Gll ̵ 7HHBB*+Zs j^X; ++rrmdsST zrr뜜d6iZZm(մ*V&&znf9 d}}铓igee}},,~`99$$ץr.yt=MM _m ꍍH@ lYzzni QNKԁ& koﰰ``== fV]YGEELL.\KGeeFCOd犊` dhhb!!xIHG %4fﰪ﨨poYy vgghgpk@\hpiQJf FGmm@=R5892PPghbbg`trwxvwyrco?t`j&Q0IDATx}\w2˝; BrUEwy`/| BDm0$Tcjbےi6mjԶIgf_[#^f>3>RVAkF"v=25L0/..Z--]]NcyZzbNK;Owz z6aP?-0s{R3Bܞ {"kЋ쨙40pHb #3N1 tG%_!ˌGŦ΂ f[:V?(J | i0;:c$* jW2m)8Y-ao ՆBbQ< skJ0BD-5|H~ G0"֚(dI. #w|}jY炇c]wZNbU:{[VGlNEbzG97Ɯ0¶ۧ[yC *M6ׄGJ6 "̓~iY{gYL0&A\ 3s0Jي7´悛xAWlAxċ*4bӲs7, Ln UHCqR⅄ F`O 9x,4 ;U ^0pċξhxR\<؏jX gيl&XY͟5DH;EKҲH/&LӟAluvv&$44ݛ+zKށ?"b5A$:Kؐ +hӦMN@3Ė.z|J o wӃ.u=O}!ן@L=tNz dIqFf /3rvM Yn8ӥrJ {1vhQ B;&9yh׸B7.7.`,JLay+&ќq EC=$sj=C7yhX6} /~x .O: h1p{N{}8S=ʱcr3)Y8pio..,jpp dUoo )w9f3#hUdZ2L7jZkZ(>Mec_֣=虒U(i%7oG)a pj加sSR?>9[r9 le_;+%G\!sx%'I:h~1R#-J ET>yf%ά'Inȝ a5!8E]'i')*N 4%32PL֛ ='anѮzvfGt+.ʎI5}^yDG&J3+BbVDͶG V~d9P`%bN " /m"ƔtW##cJR57|dSEje=/ bOUF!%f朧l8B> 7$j*OW=sN}t@nU ] ҍJLFB*J z2qhpx_5NBuT` M gHAʇ7EUޭ !!r5j.$4t-*9VP=D F5imr-o?=th5=;t&~ ");H#|!}etl ,v-~璝&A#7児y2EsDVq/AS"|拖 ">P2z'-(>'9R%~6VW_mBfu$}# {'0 ~"&N +*H o #x zI` 't&)x + #T=z+C!yQY =0hyiw~͹ZFMi%}%~HY'}䦱 ({?av$B*<ơ!{>4IDATxyTGwbY%\ k(KPiT"ՊPT,bET񈢂x T x_UhimmER;F^/}|f7@=z y`(d {;prfz픮ӤPbrdJD/7kKO#$qd[N|t6Gs,ziHўq@~m3Ba^ݣ $vxvsXg7 /oN: 'ҋK$[aqB015 Vj $y8?5l`PX+D J+=Lb!2fֳ֔w1u\5q58dI1`d{ipc(+3hCwc,rm)sgo14`Vw)'seButDOv;$`UOz֔9gxඁZY+h%XSq8dRxAe<^m'DS0Qd|k/%BO2!B-=~/R54o.,Q̈́d[xӅG'{S]\2oWh hJ /DFjDž>!]OAn1iB'ό֙ɺ,uYT?Dj;ݻw![a*=l>:,³&jhRnz#aGd5f2x6md-R\fU˰JvLf$p`Bߠ 0Țh8I8fHPCRaÆ4'f RѐiݹHkI MBJYR(V ^iS[-Jhv~i\ ʊFN[uO>f>t'&]ߏ fQWJV]!I'Ulذa? H-#7IENDB`PKwL\|WW5limit-login-attempts-reloaded/assets/img/flags/om.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE-)%a^()O(%$ Wl'()%#+'"'#,(&")%($*&##$ !.*:6%!spmj$OL95(#40^[EA% ]ZD@B>!.)-(fc/+C@2.JFb_84pm>:>:LHMJ1-|zroZV51b_liurYUB?*%kh96 ') 0-NKROhe0,?; KH%+&'"nkgdPo'#pmec}z*)ljTPC?`\XU6362)$SP-*rpYV}HD˺C(TQ+)~;7\YޛQ(PM!c_t>IDATxb` xePᡩ%@,' dĒ\Sc׎?&CK-32(k* 0N'dD%~脮ѣ+F|-*ʢ Dmjq jib #| ^%ƥ D|NPBBvXuGi |.'XiJw 뚮rnzzAkV=-2:oͫŨl d=BcmP$đx\Q6(#s#_ݑQ, S6w1>zN0D*O[C=2m+MDG#:%`c``Q0 F(`Q u;ΝyJ)]lx,bdԒQKF-dԒQKF- :5yFxIENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/pa.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<@PLTEKKppЄ88CCEEzz&&%%++@@쁁 QQqqmmppqqllttwwllxx((ttjoooMMIIEE샃__>>22##CC@@22 __ńbbkkJJ((dd~~ՖyJJ񟟝++RR00XX//aa˜>>iiRR;;%%**jj11""AA`` OO  IDATxb` 4IJHa%+3 KxHZ`Iw,YHsKqܒ..O[RGcKꍅ9hddrAFFA@0ab*[\&(@;X,jT.,.!FK8QYRF8aڥ.KuiX pВP%,,fC3K.d.YE3KXXrf30]eK3Ke:~+YRJRg1$w/mZ2,Lz'4PYF"``! , <.QKF-dP["MK#`ɾy4DT| -IsKY')( RْUUeX LfȚQ; ,awjH8i ]4v)4K]{ vZA$lH /0V@f`ߔ $ifIV9W̒I:v ZB]^F8@idIQj!1jɨ%#zqiIENDB`PKwL\Xmww5limit-login-attempts-reloaded/assets/img/flags/pe.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE#" ۵ƤjFg:փeWsA4S{9$>e;\ IszӘ 9ܩcLjZҗLا#TӤOKD+DPRq $Kމyǹ횁}ɖkѴ̇Qe֤ۮ(YxUx{c##$AA#:٪ʸԍ͖1Y7&lҖuɍ yűTcE:6:r|TaăiJ^ @t⼤جuʂ\-$A"]Dž+MylҫƟDjȎΐvh}ѝ ?Ӹן Ig]ɦLeɅ;pڭlx"9r?kT7uAјC}u`TƭwרĄӯ[Ua,u#]_Tƻş#|hIwĻ %J~4IMlmgxpjr~o˔?P\=LMI̘G܃[u/@vhŁ3 _y†(cnjݨ١e`AAYKׁĻ~3{Ǽ"hk IDATxb` ؘ V& %Z2jɨ%Z2jɨ%h*+wv*wN% ihBaeoD `^RU(^9U3[[ie ]~~hQq:k\ǧM0%HҦ$.2o| [ɒ"154hZ[sZUͧC3M][.Nc\Z5Z̦V%Z2jɨ%Z2j IwjIENDB`PKwL\pV5limit-login-attempts-reloaded/assets/img/flags/pf.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE K>j_oKju5eË/01v&vwZ bʖڷSx7bKLNꆐ4AjytQX}FYV} B8Ԥyyz緳,Y)Mq\Tduݙ,+l|!P6z5" ,կƢvRrsX}BKKKVMI{z|TUUɪS%TSN')d"Hma > ˗[λ/\1 ,Ho'%#.:sϜXvyɲ oƲL}%Y |-6ḧ+A<% "ēԑ= Bݵ}ޛVV1MMћoa*WҺ AAS¸Urn4/t/>@GtPwK|`aЯűRhhhwcqټ!ԦЪ7[u l(й7022mos)ܘF?hϜd¿>:O\XIDATxb``Q0 ````` Cf9yj49ЧbD KY n)e,Q!ʖĉ*O1} }Q@Z('n5U-M;"$[߇N(f!!Zk-Tc[xvPM6,Yʥ={]rn,_p..BKWSɒ88d0ّ K+p暆q:,2%BB._+D8;_ӄZd '0ޙ$+I-_9mGHDu,1}8{n%r#ejX ˩^/l-B E֜FKazLNyͣI{!,xmRNLljXb,$ݾ7+'vvW⤂%넌vg?wQqxy}]O6UۄkSnRN;=Q`k=|lV'nScfeD%Ftwy/R*A 0Bp ZۻhLOU}\Pdݶ3Ή[R䘘dSۯ *Ϊ-)} h!UpP|5555 Ln:,9#,9۷edo+՛XU,Xqhb^6~Q?K㞍W!Pr#5,Yp®oooz**ԭU^;y9(:M+%T UU'<.+[ 7S / Z$X,Pl,o*1Xf:ɒr ^o̬?vjo@@@dWxb괞RuJ%$$|\NV])1|U,adlsOI+e߬.r])%s$r`o``⒉=TdieA  ʨf [L ; DM:kV"5i% JTGGɩ-,^B.Z]%rV%4Hϙ0$`_6Z $&Xj>JN00Q0 F(2 2lݩZIENDB`PKwL\d}AA5limit-login-attempts-reloaded/assets/img/flags/pg.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTERRRLLLVVVGGGXXXNNNPPPIII,SJ***999xSSSMMM]UUUnY%%%WKKK WWW "TTT#1+/)'FQQQ(vU$b777 OOOjQ=* & PYEEEHHHJJJa$BVFFFT~~~---Q.O%z Zt{{{&000g) "!!!r`;T ccc###OBBB???mmmYYhhh\\\7 OXXE'!)///#555HIDATxڼy\ewvfֽ#Yέ[ 0i[T4P T,H5LK2<2o2!Wwfٙwwg?yO>v@0?^qeQpdz}F";sV#`enDv #ldZIvY#q]Gׯ(-))Rq]eSԬ+N""`4Bdڂag,40sJX.K QU*\A!#{& J9Pe8w,u,tv BGA" M266 l١&.,$%զvMhK;!> <%Ljc )$3 pDt~{usb 2EHn8 '6.֫/? 90%*i|gZGK yF]_Ru)-NO }Uz{S,s&)oFD^y= wmZĕ,+4* ˩g 2g=@#[ih尟[M 0lJeZ]W7.jlW!ዹ)t2$%Mb'P !دZc~<$p}a4kAڊ J;Ju3\\υ(2N#lӫVV`%q4o,)g̿P=XAR{;d7䳻ǚ[yȸcdUn2M`^/tybdpĔϭ$ǚÈzVNdv: E $b'ωyuȐkSu6 ٺS, ?50 Z]k-XM x#4x?II/N-7iHv:3es/!΍ȕ|@],~y?n-IENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/ph.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE8&:W(qEkN^.)4|,`Yp= "%犔z =T02$-egy2D[|6b2%QhrmN- w)K%Qk  @D5_뜥Nr-惍:y cH7iv钜JE!5&:+>Ö9JGW)2Yg!N50 !Bt^#^l_:9n{@iVx`o9X#n7h0Z+W'q-@&.X/TwĹesUeq}pͮsh?Q #(T"AR8`oC]6ޜeFjXȝ%Rg yӖL6-&#gg0 d-rddmaLSc&].3{l9j}St6O--]9V )MenwvMm hOF[~f&S_\ b1J Eġ`Ҧ;vW8ME+}g2я?cs7%+gOǠ1w6XB\q ,v92Ba*DRTWӰSRr+d.Ve^}靓B$t24XQ\gv 0YYSy]vjG~ЁIМDcNIJq9IsFQoB׆y_TNqpH JГ}c_aAfBeXY|'JdABa :qIqA(vUE_,+STzX8q9Qcɜ[%;ZAyca>_ f~~~)}@[-pP6^Mbsɠn 9qHzV 6t&EnR)1\uG8q6>̫.MM> @do,K/Ӫ}=r ZV]5i.}tYF|Qm*H@x~dH@-eo!@}B6UЉCnXR" ZHxN}~E E" qO@*D܀D\oLd_}J_gB>+D't,H=nѴ^Ap 6-iе 5?=*j \G/-0 A7BA ټCu*zP !KglCc LűoIENDB`PKwL\!Ҩ[[5limit-login-attempts-reloaded/assets/img/flags/pk.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<XPLTE Y VZ !h O W X X P Y UQTSRVNQ_TSҽ Z [ZT Y ηji W MEDlkR]¥FE7w6U^QSxxW6v5Se1r0>{>+n*5u4EEɋꊯ[[_^srҼƫ[ihrq~ݘFE"h!T,p,͵4u4RFFː\\Rf>{=C~BV:y9UT$j#rr?|>gf^*n){{ WRRQӿcff&k%ULKFfe#i##h"={=={<~~*n*(l(f\TT̵̵]\dc WZZ:x9[爮7v6NNlkQPbJmlܬƬSR)m(ĨUHGY g(l'`-p,`_Ӿ Y ŪSރ2ܝIDATx@\M ~pnWwwwww!pT&0l¡D֡AAAA"ڈ{K'B̈́KBCxhϹ̲J-n^X8 `"n !d.BG' K׮g}w}_ @nU;^a\j)GEc$tٖU%X JNM8t qgUїZd76DugH"+R-7C4ևArl ! t5hRKlVCj"ѤƶqB.|S>ՠA7(E8H( Ld# r7WD|m;E{w+ͻ9oGJbD8&s$nSbڶ|!t5;Q˝1O;qG:ICKG{6uo[mU(u-px@7b/t2ȕ9/PjV:kB+}԰Ӿ5U{ < dS'Q+A`up`n},.nu9@ڎ}>(OZ~&>|r?d]8D=309x)p [IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\Xf?f f 5limit-login-attempts-reloaded/assets/img/flags/pn.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE$}+ϲcX(l~+x'6Jk4 4U1_ !Pz$Y.f+f3s)e$$:mm|y9QV2%G(i~RhgsRDGK7K[3s!N$kKw1E7g"慒rkiD^&ZgH,p*r!0pVgXN!sNYK ]*#r0% e!|*dou0m:T{sP+Qm #t$=h{A>#4i0Fe?Wvik3$5rKO %h-D+:r+{똢8`48B:M$H.Ҩ +1mzid;rbvpˤn6wwj Z'i9f^mw;#;'yxfw,oqz(9z=P)q`,K}:h".+ ) o s>v3 0_5L^* #q֏x h ?Aw zQe-)t'o!A)r?i^V5w_l[+~=&wIh8TTg>"* "1G';"=[,$#%%& *+_\?G(1D9u 8w>s$,gcpjTUIDATx\!098HB!#I$"(/ ԪsG T((UbRXQY'l?fu[eX] ._}J.=ol* %d(JdsIXPоҕՌX%V͆iԘ1Q453*2QdFA 3pPXbl"b+1H9љiJM۰5&)5Oh 3ؠPbe𾦴}B1#i]sQ$p\0v "$rz!RN3lU-vgA-AmȡAd-A3lɇ}4(Ж MA4;E拾G~U>qyeTWyǣ$c뻛]ADnD&2W7?qnHл<< L7ʳ>vmy+yT*~$Ȗ ֞]]OLǟ|kF76JrVBB>FM%+U!;>.5wM7;ӍFGFIqiB=r!,+=2 Mf<㤁nn%b4|ia^>[.:q:H9ﺹo bICRw:`8J<^Ư}@w$W)-vvL |}',mͅ0fˎ)]'˗V ~|҆ӷ `&Nx1 raсnɰ&NuH by? bOu;58dH%m̼Ņw^}M+YIӐONZ"O]5i |90ťg܅]D,YSE2>.KHS)gqq3G 65pUFF)˗,]}xML^ʎöʽRX7bX WM<%$rۥZh4 P:,8@uQR/;eJ zrI*k.qe)*髯v,VE,,Sҙ׿tt.J&1 s" {-J.iD/?e/杼Ӛxi:3C@갾W;\'GW8.r8=fiFX|?1p ryݑU;seLUEEEǭL Q@(:2xUؙn䥇%$Z d j7--"6ߜ]ƆƆ{ӛ핋I}$Q#ΡHP"JQF^D =ͅf̼Ƌ-)Q#F *J&؉=CUG8tǒF@HZ'w}nhиzUX'S! {YڿH)(0kSMCR,#C r6S0~B;:waB >{wpE B=1dſV%4 S91[@Ўr]ʪ-tz RdybюAk4 4N òbON1ʲ7:= -MiRRWT2ᤞ\ !:NX`ԫ;IP+)5QXz=\. vR6r+.n+D6rv*}afH1@ye+nR S Wy)z]c"h XH6 MHh6#i!@N$  PHAR`c1ovIL \ (QZcaQO&qOMRL? N.pDXb_5@QJG֗FIZ,k$.%o!cNp}'vPMU5]2Z3RO7 UM/gv{&  OVO`1f/'Ek-(hQQ6u8 IDATxڴe@Q5ȓ@NANPPTPQveg~܏q߽gjv6fË]FAdzTƺ. ?we;[\@4մlx22 D[g 2\OJ;-.).".x*o1|r?wA$x{ ;?LaU mzEpx\6!Q 5[d#dT*`!ifPaεkعHumI `0$mW;_PIPۘĶi'{bE]6q&"^0SdBӏA;a͐U"%~/Fv$k:?\w"&BDUPxSuM_SWy{IW(Gٝ*7Gr1=RH3 *&~ԏc/Y-]7\p}c "rǹj"ZwQXjIAH,-!~6V/V tI*͊"/}tzSUrNhS?P('#KNvc2)̟ʿ;ATw$eVP55M`Hl4u8D%KWz`y2 >ĝHx-wydvYB`Jwηɨ ^uS[!Rg 7" S='uJZ w.\k w֣>z7U1-Sc W#q5NˋT-&J[qkO{F!CL%;IENDB`PKwL\( dd5limit-login-attempts-reloaded/assets/img/flags/ps.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE~OY4433&$QuS ~y LL-;; Y:IDATxN@Faл qh;VBeF\yOv.6IbhYzjVqP`@P`@P`@ވwfn^/;q-tb?Gûsa$o/HI^.HׅCr7q&#mxht&op1&WvG}Kp#EILAJ +D$0 NEo$ ~"BwDBO$>L3iD69'J$M#.B:J6IENDB`PKwL\0%Ĥ5limit-login-attempts-reloaded/assets/img/flags/pt.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEfJLDx}} cꗙg:/lWXKaӽ~xXJEOPFgMӭShi68VˤVnRE i^T,p0yjN$l1m򶶥#\J%&֚#MhFvdJ3rb27*cγG(S2(D[bQ=YԤ{zLd={춶wQ8uTgalv̛[bL  ݍ~ƛ5]l""{“i쮶͉/eFG _գ Vx^(,3P qɠLz3o 1rRMmcՃϏUnKs z\!DX℘ = 냆 쐑tӾcRvH7FkXK0~ PF gb oqY =IhVbȶ2ʒP Wϧ:IDATxb`$ p1PF-dԒQKF-d2,i%q"2ihACM⛺x?5્57E] (`\[gP٨.U`U}Q'TD]Z@ <8'Pԓ9x ,Nm8o޼//9yhI>S70 ^=8Qz,<% Ru3c>~CZ4u?O*c?jN"6QJ7B| Tl Q:UCyJ/g'TkH4sjWH%pvִ-:b^=8,2`inV-yi[eZkw^hKz{A ? /&yW"=G 7ܖEF+`>mcuI*NZr Էذ}ZP>FMߓ,+iʼnd@. (t=jɨ%Z2jɨ%CF&|CIENDB`PKwL\*fl15limit-login-attempts-reloaded/assets/img/flags/pw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe< PLTEJ??IAGIBHFCJBD@E@RDޝtCkgKHH٤lzGE@7XGZÃxESSEqpeptM uOjbCgfsBhOrDu [j+UɸUhPAmmbDFr3}\DYS̐81VMӺR\\d dMoTRl21Kei>FN* qkjyPМu!:nP~ aR.#3.AH͂ZIDATxՒ0@-2'Nb,3w&LY[#i}3{(D"M%EXo .KMtq# E|3>k+^%t#PaWg[Yjn" %VDr5!(sGl) m.QQgv3G:3ۗ|KS6A/p^" mS]::C'Pk]Rו ErmEj E(xu% &pa_j0gŻ C}-p},bз~"Gz>g"W]r֧*+)Q j~,-)дR'W~nkT4[(b19-_l;FuE8zCܘ:̱[}s%rzSW$D"W`9K()IENDB`PKwL\R5limit-login-attempts-reloaded/assets/img/flags/py.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+8 Q3(2%浵칵ɾuuu|||ϼ常?dddKK=lllwvwz(Ky-쒏x)Sn?vuu N˜rւHh򪦩mkkkٻټģԄ(G瓐1R>ӪPmooo킺˭̅ʟϭurpqȼĜ?aڀIOs~^~[~%Q߈ȠCvDdH?QPQؼߖˠӳ跷xxxfefֽҘflIDATxb``Q0 F(lt t t LtZb"*--DSKDϨJA& "j\2LJIBHBXWRS{tasĹh`.Wa )sJGp2jԇ7/a}I%ꖘɦ]i;v]+TD[ "6mq%:]2^\Ǵxkh UA*[©"4DD.Zm.{|ͨNKs¼L`*KpXj$ ,FmKTT fjڲyQ'DDY;1h@MlQG2JnI$)IqeUJU&s(ߴϯ>ïEbEPJRVS&пwNxQk24 X ()KZJЦ>᷼#)c --DK8E4xeS$/"Gۆy:f:V:F:QKF-dԒQKF-dԒm @1IENDB`PKwL\Cy5limit-login-attempts-reloaded/assets/img/flags/qa.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE= 1<2;:864;5<752 .`x!B3<9ƍ~72QٲFbd{5=QkMg9xxVo#DР)Iʋ9\t@]ϟٞ[>ѕ*J>Voʉ648Vլ'G*JܸÝ:W̙e|?ĉZrȑSlҫWpԩ 03}*IDATxRPh /Kqww}X.v/s'3cap9|]R\E&GKszm$&!Dk_ol58Cŷ?<;K½|Cߣ'1Nձ1.!6{@1N*zct9l'x~jV $E#ij" 8|**J IqR&A;Lz-ƀ;I֙(ƀ;ɨ+ ցwR>R)/)tKktLrF`nG Y!HĶ^ߢZY ƊvNFwc{40k"Xܱfm]h܍[\OoÏB,K1x!IENDB`PKwL\J5limit-login-attempts-reloaded/assets/img/flags/re.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&0/x*t!>IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\gJ5limit-login-attempts-reloaded/assets/img/flags/ro.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE1! A '6@IDATx aB"l5Y%D"H$D"H$D"H$DmrV&X IENDB`PKwL\ ?ŝ 5limit-login-attempts-reloaded/assets/img/flags/rs.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE6< @vʃMVe鳵xzYU-3ݴا+Ԩ+ >tS7G5cge*Ȥ7>BŮx]d[òvs-q-d6>LQw6;ǖ+xyDI\_#?oFz@x|*ԅUXNT:CѕU,񼵇4:ʪEI+u^37,ʻS5igL͸)+v1 CzN[W[v+wC=uOSL)+3fih1xz&DJw>˒֫aknrɡ)ܩd+06i:ȵЬ9ǒrڍUx{-8žصguȢ18΍.|4:J3:19UXb1LP]_ȩ\3=:11¤%4=@ӷ_3=ɜ(/'-2Ӻ4ٶGי/ǜ0<-pt͎ͧz4I H75<ӟл>:AI3<*:>̔ٽI-==55<6*:_۵YMOZfS`]b\}1HKPS^H_o>~F><|a٪vu"Du碉6ȴ#;m«Yѫ@?BӬSBl)1<@G@F|%{j:3IDATxyPW XBXj ؐE@ (Z@@D@)`TۈCY,zڃ[[z+6:?p_;{& 俈tW?-.jg{w`rܑ(ЏGqA!˂,ZtD\ >cŊ۷|bǞHT "rpu}Vw+CR~XǏS@D~Ga,U|VNѬw IrSaﭚbn]y/6&bSqkYkw(wg&ns&Ĭٛ%/UUkoQ9ȇ&"GƣX>V"l5k;bcG_z`QK $/, صyNZ|9#RX >"椔-]̯{UX0Fr;F5/uX) kc0m M"1>I*سKyŻ,~Ad.fDwzYc8q1^##^}_<_:90DedYv,-|; '?k`ގG:hY@pV7mWX~^ڼ&hTg¡JG4DPUlTW=[А)JPQY/A~DJҸ;],HpoH|Am%﹞=3 <EV?(V5;``ӫmury-A h8=TbM 0$.w$4QRQU\wЯԩ-@Cb1PMI箃[F3 Rڌ5}Zw})DdhbP:DJOݮ8 (厔at98R#9umR@xWm"u(9Fbu4hA[-,OaeƠmqw~LMMElDP '0?|У\!dd$|k)к 0fהr@ Ng?,%0v qYvۿ0k% _Np1!s3&pqjx 0)stJdq%xZR4|xl-5ťҌԱ9uVҢ3Hz]xXMEӇwY[A.+ P ]pw>=րVu"Ҟv#,5͡!zRl-%qE~MkNZRkU]P "~M948;ĕ@bTZdNcX9ͦ}ڴӲCCrsa bo3#KX錶tp&r',WI5o%1PXL5!z )S@BHM '8rY.t%a]q J\oئZZF$D.iզ>5m9459&ho%e 'nQ>IENDB`PKwL\~F05limit-login-attempts-reloaded/assets/img/flags/ru.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+99 R+94-/2k)EIDATx́ ~> OAFD"H$M wAނD"H$N>y)ťKIENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/rw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE `=h)Z@jL]2HS. 'Nny4N ۉ[LV.8$ Z Ӆ^HE~d臨=V:.K#@ࢶBYRsv;=ƭ9WA+:5%Ga}fyjE_IU0A giyjx=Cune}%6 ҕQUA G4>$묷<ŏTi~7NFUos߽7<лRV\PU3kwEhaԼͻ[ow9K?V>wk4K6!up(\@BX"DcWwl"#ͥ?b)Q*a`b9lvnuqp@,5;izd~557f}X5S  ӐU:TcIDATxb``NC[{8dkxKx8heES]=BQ4s`MCHqf3"^Z8כfLEc9573 䦈?ʶpnh"P@.U|Եg;ū\7 dJiAT /'>qq)/(TvNpP3}E[Joos{U.P5.SvTwK6Sn^7y?,nnMeןWnċu >kHz&( dO e[pRrԮrut)ʞIԥѮ5oxyvl|sbUmaP[mjqu򷭤<.[ S8n{<#NM%@KMgṺD*Ĝu%މ}{襭VujÍr3S=)yL@#̋ƙOdXK^B&x9j\4Sa*qcE tNڴYx8J+|o {rѲUlsTrR;`mߍJ3;%Z2jɨ%:V:6:F:QKF-dԒQKF-0VFкIENDB`PKwL\Ѿ 5limit-login-attempts-reloaded/assets/img/flags/sa.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE ~prbTAA-)xi I5чީ}fUE0҉ԏ&P>ςzl/ڞٜЅuZI$ ٚՒx庀swugQ@O<>)5"# L99$D6MBXFjeA5ۡј+k[!ח߬ ⴱݣ-8#1VDܤ^MՑz举n_}odS`Oݧl] 㵬ܣ<'A0;%]JK8N:aQؙӌ7! D22ݥiXsdm^uh֔WE(-1̇}=.|hWXI' ݨYLۢ-|oЂWH_QWHo`oeF</"`T <4סؗDŽ߫ k^C.9(ы @*1 {r ,-ߤі.n^YJTIDATxgTSgޝ2IEQ A!2`-YE"BAEŪD)m֖.kwGq{ν?={w{xy/E"' aSa(E(%5l&ARL#XO-!q4?!37Ԥ l ,ڙBSFhQʤ#g35U 3:&|lry:8ϬCڑ1dA I\k9v 웥EWI׭VfM 0a%]{B1긬|fV]|$^@*p\np#\8ZɿpEyz} Z@58 *<@t|MǙڙm Q;?5 BPt@ N RY<B6 K# T,t 6g9QE-Ӄ^~zc|)0tt,Fl|@ƨ"F1\^eVh7Xۣ!}Yga8<ۃP,9S8(Vtn8_o$"+юz4edgyH``4. :c4d0F[U>w/${O^ċx[G't*`f벙Lh(d1J'Xq[@xu+wkٺ7bxdO։I namhY73GG='D4BS^Y[Jo7eJcBeоRȼ'=;MǐO>aaBB ؐ펎 ,,ݖ{Z ׊qd v_$__y\' **EEffrcOO$$&&33޴1155(!w^ ==}X^^媪k RR%vvڕz[ yy )!ddTTtallWWsa}}ccܿXXnhzz;;e 'qq"" c—|Y//# ӻ-- v_y[rdpf( ( ׼w^Ø|Y66ߘ|XzZ886-msIDATxڴg`E oMnY\DIbfs &cWVlc?0ƲBO$n\*>ލ_$` >!/}˭t s}ݱrNz)hfڬH%g~s~(L+ # |!oسh1ycQɚ[}Lġ`R_N{L_}!Mc͙*uHzdmf PKBazrAuvVNN7KrzᅹG)|rr>B4K 22M׏6iq!BE0H}`@9̖X*wMYwW2%SJVgn^ob~Mf]D󵱞HYK̜u8kNY}/27-BNsN=!ڴ=% Սd? *-~ږl7dlV*JKn/c,t6i[d qfUiS\Dn..+6"4A-μx[1ͰID|`IۛT7ahpI) n$,Y*!D: 8p*8B\r"C>̊7a]ͱ$8d]]بslSΐ^e}FA94wJMl.(~߯G@nLEl_X`|JeB{ As6s{ܰI_ZUOި61zvg`oik6;60z>8t~vMyqztü$wngVDVWIDATxڬ[SQ?=EucT,leSa`wvbbw'bwwww'vw{=q}{AB'`Jr "4`cӜQĹ7gb: bxvI ̹7d` ,<QD795#oJP32>avEZG[K"d tNb\ P1~xvFA1RR PTyt=2kSP[:*R@ķbc,P^8!z_M ~ nbo*Y-%Ċ LDW,X@0 xRY*Xᓦ {Sf+L7tDAb%uA@0$ k$B7rs DBbR+@Α@,sU,azHW/Z\\!_.81 ZbiD(/jQC\Z4bPXh*6X . -X E/VAijR7"M VfHjC9zB+,VKw}B 'VڐɑO}ix\usO҅Fk)+|miۆ/(Z.b%6z=n V*.`mvVCLp+6$?`q?agKZb%Y:~<[$zejε-mc! -XENlZ2Do6l`&^/$M'"Dmtf 9sY|XĪx?>r>q ;TʤIENDB`PKwL\@--5limit-login-attempts-reloaded/assets/img/flags/sd.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE Pr.4}h]:GG:}}hhg]٠p55΀  8{ث٫`bPPh\ͱ5} *$*-55hhڠ4$IDATxڴV@a X`A{m(Ґyn;L& /K-] w 2“ 8B/G 2R 8NFC2LVAɨzd6LH2;JFC$s SD8~'sEwD$ODy#oR|N5٢"Qނf4P9{ G kdHUIt^mb EaIDATxI@ Qw2lBH"j&r^67V91զk<ܘj~1$ջ$& I>vICdƤPϭo0&ZwGUV@@@@@@@@@֊0$(]IENDB`PKwL\=n5limit-login-attempts-reloaded/assets/img/flags/sg.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe< PLTEll((00--)) &&SS||XXrr33  <<11""PP CCDD44ggKKCCNN''dd..$$%%++7788jjhh22wwxxyyEEMMDDtt@@WW..QQ99ii##~~\\ ==uu::,,{{ ?? 77yy<>ffHHdd""sTDIDATxeo@gc @Ü4XfffffffffsWW'k@d@!C-o!(?&9LoF fgºB@샤dv|!u1<ӯYD17X7G U6VZ^b|6Mf%ڻ%&;ܒ*5lAl`Wg Y ][() ,J e[ʱPj6 `(_Jw*xJ;H>HXA*$߳@*u`Q@z)#X CUK;2=|#'țk<Չ=b-Z5."RSUe9%?e ymߴ]hbkS RQ:iQ!$(tv朹*mqE֒DN|U;pB.j p~~_Sȑ\aE _eDF2OgiSpL *Nx:p̀`XZZZZZZZZZZZZZZRS2ӃyIENDB`PKwL\!d 5limit-login-attempts-reloaded/assets/img/flags/sh.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEf.'U&jw''|PK66 &d&8v Cwv*oΑ]knWX2_VFL+̇XRK "af2#IvۮbPLvv\Na{xrFVy詩%u7I#m:* domgIIikrpO)['L3S z &dd#SNqQ AAqmMkη鈓MoUy\}c\\Ow`@tYL,Sb'qr3nJ#k,p40b8p意 k.Y쵬J~~ sRɨ-RZYF[,bpH2#eDfg_*6@ji4hꔝ01gh:w݂9=ppqRx OO Qa=^_c84C dhebizr">"Ux! dw2sG PdQLfN`S@3Acrnx)0-Z!gp\eC3R>AG[BLԏsd"E;IDATx̖{\C $H} o@2­0`&*VY*((,wA'RADֱ}غ:];Wu׮w9I ҄?|0}Z"q;w)4422\?psshyφҢ1ۇsmW`Ҭ)ĉ}ǟ{3z5QeA\cog뭾}D;A.9QQ @ #S;ý pdRȍFrͰs {!\S3jvSrQBn9nOUs_v3\T Q@KYӏpaApxZNX/;<V)/']zuFyG&wR(0Hh8moB/(BI*I$#SJVwv(EXlCh/  1ɷ,GF ×֬A"4@50=y/Hٟ3d1$Pd:۫KC8²?\,ѨX,>/2A_WL}[#:eoR,%²vQ\R8v3 LNMdDn/=m)ju2xiX |-lU/VVU·Ji(}T*>v\@߱ TUy&O.9ϤhNzZSȫGP%x9wʣ-(2F#IENDB`PKwL\*ͥa5limit-login-attempts-reloaded/assets/img/flags/si.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE qq,7vv ¼@'.:8/)ל6|uX胃K~~{{(}Oy41Ȣ"c]1/qL`Xxxݖ.VrROcglo߸vE,43PfjaoNp?źF CH=B1?u]^@@{ndUGNj1nn'112N{Oyh{.'60slBE?GZ?΂V,T X5v΢']{t/)unp+HxLS0#Uq.&n9@3ҳu3ɉܻm$0=.896:8.>4\dF9;fu?9ˌb ofU"U(p1? ^e-5W3{G'ONQK9˸ 8`!*klsRT%*:Gnyco3\ݍ0Ct 7v|# ޏ="+v*#=T[" ]^׀?տwSq}F;77Ï8R@HO@ID  !HA[NeQTf@eRWT: !AB$c# ao{fIENDB`PKwL\xT5limit-login-attempts-reloaded/assets/img/flags/sj.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+-(h&g b,k')(**,57+j"d$&13!c24&(46ƞ+j'g)+#%+k>@%'.pdIDATx 0tֽS$ !R1s n(K @9$U6/^ O#X2nq(Vȏ.E\jIENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/sk.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE% N""4MO)dI$#" M-C]d ELbh OH T[ M}J!&$%. NEQG#Z&<"H ].6=D(0u1:v{*2CC%:L!*(HNyQ5=JQ,MN Ng{B,P1X,5EM8@ MIJz6f#5 / Mlr"PO. #$'EA|AN+3R&ZK@'#6,9E$`Lw\ώ G!VOV)_N%Q{GFsE}:k/i;lSER#(7 N HR?FܘB']B L anLS} X_[3!IDATxb``dԒQKF-dԒmIf,ʞE֬%A)0'*!r؅Q@5.</=:`f^%0GKD*~\<Ա$'b L]xY"Q$[‰ fW.)« ̨)!AWDlMٜ$vL`Fd]II>8q:_W>pZ80 @ d [ d]["jNI sLX␅w h1YW Nje;g/ c[?1 $lO%`K\&/atsHtq M[Ҡ8dU7Y8KT)DQ7ؒ ¼V2 hHh.e-az7dD O̅nt?(VȖ3԰$.,>{ŖH +$ x *R}b<&MbLVTȗG ~Eʃk8k83R^} Y_W0QlO}NK6_wD2*DX"wi>p\,bq._η,b[/`WWYtTB2Ia?XZtam&ET/Jj.oDKwVcX`c:-.?P%L>o=^R ! Z֓pY'0kZ:T(}"d*u,arsd<%JbEj-a tOaƫnu X֑hvGn8d̸nyJ 9 Z.B2``&~K />GYL:` œG@ȋX^F@S-㞴 PFѫH\Im;$pOgl?gq 5x2~Q7/1%j %.O>2ӗg) a9f`Q0 xͫA4IENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/sl.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE007CAIDATx .v4 OD"H$-)*H$D" g$pIENDB`PKwL\opo 5limit-login-attempts-reloaded/assets/img/flags/sm.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE粶FaؠȪVg!O[vǍjPRovjPʯ/Ss- ֧\WͷjƳ, sTqV ;.F~?ڠL$nҋ@,Vu2i>(Y)E%JX#V(m3:* [ t$hPb%0:9% ,gMB4_u RZ JNyXN4e6)Qv bVJz:pao!i+heUgAvO) @Bx0ge(}z9m; tL[XpT0<;6G 7!l b@P6> <~W z},l⺫#bdh\0ԫ uڛ2S%UYN E"Cͺ CaK+NgTجYpC_["Ñ\ZaYX6MR4p""4B^zG6a&Vpfhyu 1cNHK r \Fgv+@zqZ<֫sKx!зT):It<rX.$CFB8ՠn(G- ՃzxT/O<5%*ܮxAjB(ܡ;D./ߕ:%,mJ@sq!]t29D*.a溺:=Ftڞ<uI3<ްhj^k5?DZB햓jС_D*~E|lxJIpgDju5[D*'=DaaM@!9x'.+rv;/J$0NH`W`Tϓ{ M>D ZUήX]:\2؝{l4ܿ,lVSO?+4D QD{u "y!7^L"p2"QFD)zKF:VJ+"DQATG5M6'IENDB`PKwL\a05limit-login-attempts-reloaded/assets/img/flags/sn.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE r&j(k(No' q&l( r&m'p'i)h)n' r&u%w% Oi(9mg= s&f)o'z$L+!l(m(jg)y$-! kx$|#k(Pv%n'l(t&w% q&tu%Sc*  }u&6kMXEG6p' m( IyOo'`+?Y|#Up'!#8}# > EK0 Z{$A-@IDATxES@-i롳iLJ6A(BQI*1!.B! !ABCtQ@_ #EȔAQ܅y]iȚQd`$Bw#!W~z 1Bܛ B]癐֊ Uڳ5 X(NeJVO:yVuKx^ȼXց}KsI1kq쓕gYXڶ Tg!%M*qĸIF]|z0ȴrKAU6 JgȣFQ䊡sBkȘ};!٪nwV*b>dzY#?_yh| !AB)IIENDB`PKwL\RP3D!!5limit-login-attempts-reloaded/assets/img/flags/so.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE@A=?>54DXxW=\&b쬖Yd<~"$0&c^޶ytH.ą 8p!PX)pz'ZyA:]˗uYIdQ+a}q⾻F|Zhyu2j9>׶~߰ڸQw<X֦ ggY,Dk lX>"d]ϐޘo}Ql">ƧSQw"\nz@3KYC"~Uz]UWb"zG9owRu̕$&¯AfaxQT~7!dfd u%}(D! QȆe5J:IENDB`PKwL\|XX5limit-login-attempts-reloaded/assets/img/flags/sr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE7~? - 5}=PW=E2{:qߘ. 09A#-.- -.-- -.X'ߘ1*..$׀#%++#+ߜ!h%k%!5),p[&ܒ"8)I(;),,,t$N'M'ڌ"j%"+ڋ"ܑ"-,م"ۏ"Z& -|$-- n%܏" S' ߚ!{$ݓ"?Gׁ#s$,ޙ!QX- :)J(O'p$ -ݔ!,*,<)x$c% ޗ!7?-r 9),4}< -ڈ")*/R'!~#ڊ"r!+_&ߙ!{\0IDATxS@E O\WND{W콂(6P靠L2Ffff$!G8‘<^rn1~HREY)J.p;,uS(%KH.F`ۧa2 Z2Ȉtܧ]> "C1!"Hb:DG+w(mn~6$g՛WrCkWok-YnovǎIsєܨftZfU= ѿbҙp]Uz+%-1.]ޜfAr'2m쫺B@ZZOJ;/#V F}(@A}RUv}wu D<5϶АD@$uBNϗ vs?x$U}m9u͕9"]5|9F] ~dɎG掛\ ?-s?Ɵ۝,ٳ?dp~2G8`vIENDB`PKwL\Oil335limit-login-attempts-reloaded/assets/img/flags/ss.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEG0#lllͨaf@F  E)W 1z.PCN;c>JC( FE* U.E"TG?HJc|tBI 5 H[@ԫ ft jl <#J,4 ]TJFJFVt~D {L> Ztro!S KHLCze +jHQC>  H s[)FDi K~FG%U E D IL Cɽ-=FJ4_DE(A9< E?"B'Ul/kA>@%O N7@G $@:]3vI; C HE uW%\ D D T,@fU5| E;=9t-f=G (c4j [xy@ :|+_F 9FF@ @@3ШFp `^9g]] -p$F#I9* L.y q`ߧD&(M(Vs#;G\AAB xR<B 7Ps`/_b1V*i"_$THk b|.?{+` nd 8]@ Oº1;60jxIDATxڴwXak*Hm BڰNm83,m{o{ڲ]_L}* }_Ү ^ӓ#E͐#X?@jDn r{KT/p-{tXѸ؛!G}ۊdԈf;k5i#iM#09sh:@_<,~FJf rDsҥF p_^[ yg-{JLd%]")h|sȏ֓ ֒ /w]Sh#~ MMJnpbAkw'#%iRF/E28]Ns&zPE8 E2MEJ L]<6+"MDP=*hHQ)*>D; R2~ l9p9ttS >o?t5M/fI!!ኵW&8esJBkZM1Uzg*7Fl(Fr{7 /C8 .qѤ21"RgA\/w]Bٽ"npwU MۙQ=qDJH/ z Ώ?H .c[l5x0`Ev]u2WXᄑ\!:ar2 H[8ȱBeQ!NOFEDF8Wh='ؙ&|y2 r]q[A4iɢ9.=2׭ 9VF&X 4G;u_)!ӫ^L|dlW7-b*6`Nn,$-$xpI;w +J<N+ʣ̩n+K=xbЧG:-U!@3J;4ş"}x.cP=1\JF8~5m6y5ӯ޳zpIDATxڼWPM^eX i 10|g*I@rNnz}/Mjg&J\1E炂 A`Cq#}APO RCA/( ˅7 ]lP]C A~bq iʰPF VTBӌԠTD3Rb.ΩhHu b8WgquΟL]OSy$˴DMqLƸr貥r+}[iϙt?qHj@Jrgc7$93t^1^c[FDS###+6 6ajM;ܣ+? o,\% UN)>4ՈkXO8;Т%WVĥ|~vn%]ӿ Z$Rf͹|t<I9ҁ<|UجIyfYR 5limit-login-attempts-reloaded/assets/img/flags/sv.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEG-^ BM EzrjwZF5vڢ-̸&źItF!ZDtBݲZnعd咬V}QyO%maImB1g+ꎱ姢rޙ͎RjYx엳؛/Y'(W1e|X'DPq:Ofy騪)w+P0Hy$^ ؠ|w*Q-EyZiSupztϕϙۆݷ4.rzn߼^sm"M#& -qauqUUDv<ӿ0 ^q뭺·؂}fO䗥IuI9n1z&F:J55>3_"Q%ymnapgekk|np8bSYmfzAe:Fm;Ll6esj-Sw(=їڑz1]6}KzL)if{sw7^/rss!ܧ,${p:n;dv%NIDATxb``Q0 F(t ,t $KKWWW I.FzH!]W7DK]f*zK(:-=O@Z!H[)J=N+0 "]Lh`fy@ -ђQhmlqBjUBq*[Yx~S/F3TD^w%=S'}zi>@Z"#"[ZC69">>"F U-٘a/~~2WA/',ZaUӞkgܔ{ٽ^qEu*'a KoXݼ|Y# [EqTg1]s:R;*ʤl54m5quS˯W|JI 帅I*ocO{wu-1z|t_'N߾")S>]=ϧ;U7$FrJRڲ|I< uq&aIJ=FW-ݿDchRJe,!{#M,a.$5$H,b3hcQ0 F( bi_h}IENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/sx.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE)9#s`VVSxu)3#&`T 2AuuʂGN39m{ttt(Fݶj+5umî ,FF[{#*99s09+/LjEku #!ͤL(-~Ɖh}v󫚅$5 $zbϊ(8Ui{֪/m$"pS`7q s^('ĖF)U_$ńRccyӸz*9({Z~ijk# &@y`2UxWPȗO smQX;0.˰1lz0%_令 $̓ե=CUUUxcjxkc&lkwλr|KNC$euq̠Igsu!qxR(d)kIDATxb3f9`)1Τ%L1. 4)Y̅<:ȘAAdShm %JeLh&An M Z2&,AVKʘp.Kd8-f1T 2 )rYѬkwR]ن!V9fS1Ȑ>޼yQW8d021u8:/5uCQ:TJe0K"L.hj '% iުR,kUP+@$PCTǃx.2HH;6 T*)eMlݢ+ _} RƄb߲in=.=YL2\̓T*pD}Kڏy% P,!]rۂ-gz}=2 B kׁr:_wLU#[RQ+ g U~fb 6-xB[Ww[q`z g:ҢG[YI[[\mwϮTCV$%Nr)j{kPRZt[{pINv*' @ZMWmvVQ=x,Yd;5RI `X2E,ξ/8iD˘t\䕌,DFF,ntIU" ̒sgG0nA[FF2-|J+IHDA`]ٛYe]=Op1<T0K |>0ի^L?lv3~EUXMY!c.Nfz4ۧcFC nlAUB,+V##ϣI[2;T "MV=0?˴2zndʂ n 䠹y"u@S80=&wc}/;BcM̀X,awJ筩itкAl  NӏziO)*TKm웾tDK?u3Q!-VeuutD@U 5 t@"d U %T *P+YBm  % *\P5[Bj %T*LKhT"-IPZBBVAl ͂ a n - f M b l-#@ +.IENDB`PKwL\>>5limit-login-attempts-reloaded/assets/img/flags/sy.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<zPLTE NNUUMMCC~~߮iikkχNNTTӑכ--]]}}##濯߯VV٠ՖppDD**OOۦ""ڢ;; ..Օ--\\ZZ$$ "" [[XX SSы?? PPllLL&&=,ZIDATxUo0pfI];fffffffK=n,MᒟvB0 `0\!$CC+  IgܝӮ):c FjecCTyxFHo{$N~_;$ץJ Ry/->Ejy{A֪ݯ=YNNr?''6xT%|ff~:ԝU*Y Yy jG<*Kr~0`7()R@fSu Yjd?dsbDADADl_ gD-?woIENDB`PKwL\bZLf f 5limit-login-attempts-reloaded/assets/img/flags/sz.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE>^ V2W 6Yó: J' III q1Wk6aYYYOO+++7g/13 zzy  YD{UJ5T8:۲ 777C;ky*ӤG?_02Sedd,?qZ 2###śJ]/( Ƥ@v!!nw QF e0zy< (PeAdȨ狊FvY`(=Ԙ0ѧnxGW0KJ$M"$7eWI#[eM4"Vm .b3tĎI< $ * '*;֯[ʎ+X<ΏS&$H(I @-(Cvs\nZ^%M;NAeل(`Vu Ɉ [J/ӨԲ_IJdN2XC$_LRl4$@@ʵ37%l5dMأE_ +)bCi>a_mg~/0#7 [5Y'kZ> suWw=Ϭu:rwi??Q`4U{it. K vQ=u$%)g0LotAr!!fW.QD4 ^B s|Z'OijD4s ?ꀃZKFΥ`gfBU])g_Aw0IDATx\egweYeqdUHx̐K, ꎀ?BXE<<0# C-M$~e;N,ʻ{g]ů<{w_g|%Pu((N2N)ISȆWRN{ a.W CT,NCqJՈRoPrW̴M;$KhD;I!A6)ʬx)* '@8{6.+mFQ?{G} =cΰ %N;| gt| S>?ިI䳑ݒ/`Hsùd |[UQVMG|e(~ wZTS#J  `S "Ąo*[x$ɪ3] XcCɏ=D]jw H!p:Cz6,UJc /+K7ձ}5} ~%EJB[sef9]'ؐb1){Q1ҷzޯ[<qR ɡXs*Uf/APkx9t^[sD9l5?kZ]?l|im\QՇb6z3!:%ʗ'ܛCVki6@.V_Ǟ[G)T2Ĩl_:n6e FIq}G7d1C*l bE?i_ބC#IENDB`PKwL\[5limit-login-attempts-reloaded/assets/img/flags/td.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEgn||5IY'!^muqRj9T/쪶=*F4Bkyވ $4 *:Zq4P᢯B],֡)Lez"?RIc(5;y#B$"$%o96A%Ci~6R+I4=V3:ez˝5'2O'&Jc 2Wo9'1FM()B˽տSj2>AP %>˹w#5!> (N^ 9?Z ,.Ks/`v&Q[/$k{Iaͽ˹ k1 +2,=X!y +,E#A'D!?l{Ә\t\sf{PaHZ7#<7O Vm()~A[7Tl .,xIDATxb`@,\Ȁ 9X(Z2jɨ%Z2jɨ%Z28,aAh,ĎkȵD XNAP6g}Qd$:1TP0J gWk)SdӶ*F6M"Ȗ}{aȽmZRɕU@̗edKΨ}d.pɸh`-l 22 Q)g w*Ks%q-dC 3)Ofv002uC,̗X1j;vSX KK 3Ĭ+ad [-- /(,"+D+ڛ),] \@40z02;d7#hF\FFy?5Zbfh`T32>F`|C-;X2qFa*YȸX&*):vu"묬.KHH/5mJ󒤒WNBlSpT KPU.=@vVC@;Ԁ᤾%A # 0y~ncSE%p'{e`xն\UPAerK m_$ 2414b#P0*2o?`m| JGHR3uU('z`I%-DMK͢^ցYp%oj9 E1/ef}@MywLne9e&#($V%[EjXhX+o%ih 04azsɤ7[UR| q710@ %krIENDB`PKwL\Kj[""5limit-login-attempts-reloaded/assets/img/flags/tg.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE &iS ~ mm ,, ~$$y WW^^ ??||MM KKKKR]]파55nn&&aa%%__11PP(( XXffss BByypMM쁁#;;xBBTT##g} Z..XIDATxb'NI#0H4t R2 dQKF-p [nCsKdg0WbDWUkFQ'`C[9Dtk2/9%Mޘ^r$XF@K<$i9yNFr%uU3- (V3U˥%Z] يNiP^2Y0607KY*0ʧNDC'9d r$;P,&XE 鲨$,a[Ŀ,%E %pKjh{1dDhRV%q@J֫Y'}>BRdRQ̋PlnL![ =ȒfDv}?:8F[Z2j ɀxR;P F<\? J"00Z2jɨ%#6::v:V:Q0 F(@IDATxb``dԒQKF-dԒQKn +3"4KTY\va)N18W%ЈЄSK]Kt]%$MՐTa`P<\*8T< @)\_yYL6*YQv7h͢xO$aNͻz[VTz_(yswV('OBufX|w00ȷBYR)d̆ꙙ3A O%n,.LذʖW^pz.({P If6eb7`ԒQKF-dԒQKF-%ٟ +IENDB`PKwL\(WW5limit-login-attempts-reloaded/assets/img/flags/tk.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE$}#~ !"|rrF2Feֶ)ɭLe ;5q©".z#}+xڹ7o-J8o -w6p"~ ݺs+AhIUZ"#|kmI2 )?j )&>jū2N 9Ib9nY`Q|y@>O^AP]x}>Xn!:mbgM]cPv {!{= *y.Cf'&~(=M`ѳ;L`"00u$<;'_dO 6ϱ ΰ%:m#*LWYOZWyFR\Q[VT]TywA3! ׺ط5Hc#~ *y '{5(z% z'{2s$~ (,W_S̯$}1BO_djL!|";m&|z?+93FT[vuDm@[4 ,*DS[xӴ3Cg5Ee!8 (8 {Gaܽ)%|#K%}\96P53U(p 0|xJicI"Ԋ]y 3f)F4KGXRʩ- E.J>&mc_FLKÌh~kQ#82ia%־vNF@|5 *7(M; `* 7qz5Y)C[XBj%Fby(y"h] a`$(|#A#'L|jExc  RRR E;syyyw0  D5qX WCttt  gx cccSNNNĠ A 1&4(9,  ::: ]]]y q#---???DBBBV ~b|iJ9} R$IDATxڴyXepuٍB998DE*")KDQ4, "TJ J S˼-oK#ãSKۻffwfٙ}?;ϳϾ}ygyo)ֿ_3Fؿ5:=c?|̔}^zh3*vk~d2jba lGld83q-"c 1*c9v]I7ϣ';RdFU2sDoU?N2oA"EFzFql C/8dJVk!aʧQd42qs/Om2[NܐgfB<!Dex>i!M /W:գDH[E7$[33.*P }K6v Y(hYU.jtnNHĨ]v S⨌{]$܉rPE[uPADQ G8G8+#"IAiT'WۣPFQqDG"j[U)AFlQ]9ADQq] iAkT!!H/E-BQY`B 螩H5]QEFU) y#E#e1#Cj@;+Rܫ 76z%#Ά+۳FǙ_ܣ16`Zj IENDB`PKwL\CI I 5limit-login-attempts-reloaded/assets/img/flags/tm.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE(fs-ﶓ:ֱWNWF҇[[7Elɖ&fLi8D>4D167Dj5Elstwc뚌T^/kGE]ŏ1c驱+R_2hL$ҫ]<,/ۊbl,=E>DBՏ7rkqV6eW)g:rx&d;sWD\hK@2FK[QgGTӫ5u5H-?RV?R>Z=̿,e{jR1ExT^EJ8ES;'\VBIJH?eQ4FĜmlA}3GSz͠EW7Eqy0GsJzVSLfC2¾UEyrR6ETVsy5*fLD}yK5Bg]C#T0YlwҬQvZ)mu>psucsc7O'7y<=kRRЇ%To4xEK8ޙZGtk߷ BBZEցRqxTgHYmZK+K""Oi%o'4%TGm}izhH(r W4j$E`)!x'Sv)6-AGh#MS֍%^Џ!Y}H>>)_lK;7ԩSeEA5qv*<\⟿_~§D0r @c$4${ po)jQɈVRN49 ewz IWwoҋ}#HyJKfq5p4։JJhG?'|ϧ>)'mI/Z) gC{XNKSa9VшI4fIi< r9H@X]H /T1=.vd>7I$ -)Nszƞ6_ۦEwђ D;Ek<<&;:b\,M- '\QDLު躭|o,Dc)\ y$k IΈiąmS e;5~]T5ۆ7zIV0ʌU"+kl@I0f(cΫ0!@Eb.ZQ2f#L1u&Bj{ر7Ϯ:v_9a_U?;gܦhn/W^>s֦: M p0?=n]iiYq_7O8~>3VbXRsұه*gp9p'i- \G5\:?rs 5-pҰ?{  sPr)bQ3'R!.Ց6.Vl@+*jNVN[(5%1 -&S_d: :L s<0 uH|Xg}c9XGv_m i/$k.HU/yZ\u{{y?8[ZcxݵwnݜvwQ 5'їx<<y׍݅k4luE@wW3f|N?3]W kZ(@sD:A݅gFxhi.C0=>w5S|ɨoٵW[b NK9^iwߧGՠn[R# ;E c3fUpR}^Z?k39 ^š[PcϿ[}|ZS+Û#?/ik~iU鷯?as_dddEGr*|*j̷;CY w2CȐK`oQan.)'rܗ>(H-EǠkZI0\`6( &BbD2@t?%z\_! zuBIJB r⵽ذ.>P5(Ȱ6hP"\tX?\ʩ@&FGQ:#A*480T5kaA'i(d) (.'8 (81(Bб * ^IENDB`PKwL\'  5limit-login-attempts-reloaded/assets/img/flags/tn.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE       #4 KX]ihtnydlDR#Q_I% Vd'$/(*lY@gRߍ#l66m8uLt@X19d*1@s)C퐣cbb(]b'SbނvXhB5mQS!7N7 4 gY1%m{vOuxe?۾PTfi[@( fDr#Yl-][*Jxܓ0'Ww?+Gr0b&} :0Ϲx/ez\6~Oִ#z@(//{!D˦?Y}fa®[F^SRCq, oZɛ)]K?Oݿ3R{B5B3Mr_&pV3$h= `!-b@ 1 ȪOWIENDB`PKwL\KR5limit-login-attempts-reloaded/assets/img/flags/to.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE``++蟟,, ..\\??>>//--ccꧧYY jj!!%%颢//)) 66VV螞tt敕盛餤>>++IDATx0abEbdaq 3 fD̼ @D(2{FqCmdM(Qm{)"bHsk33=4N|{r#`)UD#C27FmSVCn$,po'hY,n|9k"rtk=|DErLH$#HGGݵIENDB`PKwL\05limit-login-attempts-reloaded/assets/img/flags/tr.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE       5? '2 &go]f)4bj1<'ow@JYa"iq IS ,9D!-T]S\&1HR#%em$ai +emzNW_gMVcljrFObkYbJS;E#/~ ~ 'clNXu|*CLDM`i*5U^[c ^g xry\d"-W` AK$/V^4>pxFP(4dl甅Sj 2d9GJ斅.z7v5\7 i8}W1e.6? ?Q:ׇ9ʴtu87Hwbnm=B i)i3L"unt}Yn&O )e dWZkŽ"Q[ԬTԍ9JBK 䓯jXr  aVK"H$I$Iyp#O=IENDB`PKwL\W5limit-login-attempts-reloaded/assets/img/flags/tt.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE iiiQQrr..aaa VV...999 AAA}}}WWW 55511199 ((EEE&&&MM###yy!! ww__)))AA JJoootttSSSyyyIII+++=== >>44##Јeee]]][[[22%%&&KKKҭjjOOODD cc}}:::pppCCC333 ]]==ۦ[[++QQQoo>>>wwwFF;;似ee {{{UUU00%%%XXllhhHHMMMaag`/IDATxڬgPUWwŊEPAP{E `Ŏ .ػ&{쉦$$u3:?׏}o]8ȊQ'y:;< D+#0V*"Ѐ, ƸߴK5.2'^bRBX\PJNfp`/}&B+ŵ4],k28LH EO 4Ŝ7 bNdnkO!KJ77/H^)aZ434.Hxs]_f$kQŲ6I5I`r JWIuJzA2FLRJ&ɷXd[P$|L+޸ iK JG{kn\:R.bK/HERr( N9z:b9KY}c$yb:,˸ ;O3X7l7w<.H.d)w<7G[N6Ul*CE]]$쫵ey9NbuKbhd%l9"MAk} iꕡ'<{f"i.產[ozp !FOc h3_I//`흨<!iZ0s)HI^ *a?Y eR0..$ _qh$kez=* (nM: 0r`x_'!iS ) ,卜ѱ]3IDATx̘\sx`fN3: p p*xR,c?(A8J)V`r8Ԁ-*N 7lj_Nnr /k?x>AЍa`H4e~AK:>M23ߚrk؆k!7WCTr u:kN`/}8uȪșH2l'dbǒH 5rH!1ȡ9n}Ϗ/Yʐtll $M$+hMߎ-2$'|chݪh8|!H?KaO;>7u4E'<$zC72W^F!K}c,zokGAv"FTǯe2]PhAϬy;*H,[l*N\$SZvp7ಬz49J닂 Ps񇐛+74`aeI"~"Hs5@jr$c>яԄh11 ח'!=29h@p7tZV;` ]`1 ao.6ۛ} ĞV)fg<L} 4=dF|s24o&8V/9~0tzQlnpRT~nzzz6ݱqa[+[?AW (WK[1fvԿfe/ȉКE/ۻ㞅>\E)8nVhiUyH&oe>4lܝمV9~=Uͺ@mEᣊȾuFfoƜ٨chw{嗗*_{7?QgXɟ mvn[ˌ)G3G;1tg߽48~d;թ{濰Yq&~LOEі*J9>-!h qs~ cJ.Ѩ+1d!uluЊ5N{wdx4Cy\Hha.Zo,c"^S]"m*tS{r?s{*[%6B^R(Qc}ADz1r}"rU@, say/u3H9޹2#SH;{A%ոaɺ}T|5=MM_M@ Ѷ۞]u:k۠Mt 9?xoG/n6-O!$-ߘ?S}'/SS B韼8$}J \{|dܲe o c6h#eRD6SHtU Iy=lV5O@)(B(SvAYEYGz)f:6154{ ɳQ T}:'މCWλͦ+J}~U?,"!+oPi{($chi\^k^"{8X$c hnFH3Wi6[MOG3q紥@ ^ [xogx(6E|(A.pHD_dXEK)Siwԥ -cL JVBb/I‡S::a`<"k”a)^i-*@MR>LMT\p(ޒPP*EkK0#JJ%H4EpUV)(LDR*9a!a_mӧ-7r)6Jhf:,(Z# VeKԧ档'.")X?'2-Jav|yBES(HIlc,6]aVrp*iz Ba; ;%+1WW <|2ђ3`nO+q1KF*Mz vH4(P^9 mҼϷ}&PIENDB`PKwL\K5limit-login-attempts-reloaded/assets/img/flags/tw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEkVlV CC99xx==yy&&((LL రZZ,,hhIIJJ}}QQPPnn))cchhddʀ))ll⒒<<[[᝝ ގXX..TT"">>""3311BB  Ɍ77ϟttƪk[22.. \\ nnMMyy^^aazz77zzWWWW,, 2""||//11%%FFEE䧧;; ::㏏츸==Ү==//33JJ;; HH''CCDD''c[''IIIDATxS%1@nxkǶm۶m۶m۶m_ۃzovޤjr>Nn˰mmp # zPIxD$E' iť4I#EA0 hHyD( c\ZHjh;B2Ls SM$iӅwE$h[Y7 !f۔gQlHs h2ptr- : b%A|`Ҍ^xfPVC+{DE,28_>,^7! |>.\RLAL`IXTd&;ƆfFM'RDVo*t:lZHZ>Uub 7\bϨk.Q$d~bئ0>_;:ʿ=HJHV>DZ[qW CKf9Oϫe$ ^ +4dE6n94l݂Mc"!=ݶ"-eAW42 >/>`T;m[ADw Fj%;Fn Chŝc@p!i[gEMjE|S_Ol,HrYّX[p8p89Œw;ZIENDB`PKwL\?hpp5limit-login-attempts-reloaded/assets/img/flags/tz.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<VPLTE++rr77pp0;=wȈ,,99 A. tNj <88?--?AuNj/66oowȉ>0Ђ~~**vȉuNJ00 {ʄ[[:1Ͽ@xȈ-F11 gg@C0п:IDATxڴW@q ME9+"i(Z)UŴ$K$3+hu?O =Q`$RO8 #`&3$1tE =q/dLDb0qf"b&#o#F"XFHmhXr$fT3K̀Z* c \seaE(0g_[H|(T0 7Gko\0spI0Ν?:ȉoE2Bd KUE-`uH%qUT+T#;,M"R'ψ?Daˌ?g'fI8CFi{N!#ch!#E}Ĉϸ0o>qKoCe^43E*m\OcnODVOdD'-U;zM3db?0J!c='"4.gq ٌ8,,fmD;Cy2D2trJY1g#6cWw (8Kc#K%GpK26Nјp9G5pm4Fo)*~ڗi Ƨ\H<gf"--HDiR"[Lq rf&1^bD>?Omȇ㡿L_v&6IENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/ua.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE[TllP7IDATxA _3 .!i 4 D"H$D"2`%}MIENDB`PKwL\Ʊ""5limit-login-attempts-reloaded/assets/img/flags/ug.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE9.mcO 4=!: [+,+,00BBB4 lmnۭutu=1,͒/,8#}|}u^ """}NMO*_^_JVVVgMnd"5 C6669򈆈P 5 > ђ6967bbb/ 915112'-49;ӱΡO2Ǿ~8<8O+<;4_CowoɄwF4JNJ|{|DMN-cXQEB [ OSZTV_[3FKFzzˎƜ1>>AQ0]&ԣF4u+*#0 =870į:ֆ((K>@.1:OϞSB>C? t[//Qu4/3/Ѝ~Ґ}0/0J0/(YYYqpqQPQ7gJKKKx{}7F'L*lxegfg,%$%!cLGHIA`IDATxuPQǟϾc 8QPAn>PR[P[k;:og}fvfy_$A#ATB%TB%%Dy/SIttJCXKtgmAGE xw Aˆ b(>.f_/iU}`2&}>םxZbKԃ[qsq/J*Ғ"Z`X0: as aIz%p } cd%͗+OoٸstoҁDn΍a/:8K3PU͈dH0?S2r`{~izvۃb,~Zk3#~} C$gkW0#/9klF:4NO#igЀž3o>b}0ɴEN}bŀe`,ѻl|[-a#0ЖD}pHTRJ)eBrAkd O wݖ”%$CwZ;9. !] ]=p: \doZ %\:ϭh"Bhq:<nKd6F pEA4>ɼ[vm#xE:h+9$a ZStRi?*W$1E'V@SUtr#*I[ V܀/IENDB`PKwL\p3 5limit-login-attempts-reloaded/assets/img/flags/um.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE=D/].\uzzޝ187?hn293;af[a海纼8?2:6= "S-[&V0^*Y)X-[!6cXh3`*Y0\/] Q~$9ep~'W,Z#8d(X1_5Iq $U(W #S/]tFX}䁍]m;G=C #T1Enjx.\%U0]&;fM^ $Thv4a1^|>Qw.Bl*>i2` !R1_Rb򇓫 "S3`gu,[5a 5b2_K\)=hetTeCUz썘/](X%:fcrPs0Dm8Ks*ZHZ~ R'r(hV8ug<E $T,BW6Dv` orǘxʏ1-6SRdtcu dzb]#6۞.N!̌J\g!,v7:.qUw~CB4l6#WfԂtLDTTYuӯCyDhaXZ$ sXHhPu5&%ԧVysUUw*B"$:K%S"Ԯn3^-cju~TqV`V=Dh0&4!}{ٟpk ABN72m{JS? nBU&.O Sc iZS*;U&)rN[u[6y$>/N5U5gnN ejuG6yrV7zHeSzLcPP`CGv;lĈ\+9)Jޕ+ݡ$JwGhcB,G;'_v$-Ad1 'eG,~LY7b"9"E7 iA%шᯘ=Bcn( ΀r9b9ZrUA;Q0d408X?:>mI1W7=hw>y^EVFcvT;S"(%EDiI[A6j΢wq)4xN@0v?'Q(s#nNU,%][B9Eiݱ!RzzzqNǧ%4J5L@Sa@hJ/+r;U{kGnG5-.G*;ٙZE 6JH  Tv$UPJsA4aH+z0GH'"1h% \yDEC*lj2E(Odt%w~B ; 5ns+|zpxN ›hy਍BD8x:$rHwqMyպ_"p՗<*ѻ+Ǥ2rT/cJ.$D0{ ~1K%)RﯹWhm_tЀ+LsnvC7=MnpCMn 2\pr kpre/\톀[ݐKh\2M`]M%2ĜIENDB`PKwL\}ᙼ 5limit-login-attempts-reloaded/assets/img/flags/un.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEKIDCJAHEڐ鎻r@EFڸJ{勹耲W]_ߘt畿P܉QmBٍ鏻Xiᅵjv?[ZNM@كGuk∷nL烴疿CbOLۜp6j锿;ؗG~{;ؒxr\ߜTCڄW\߰M܁fd[|yvi`s㑽Fۙ<ٌ鍺^s>=9Bclfx`e79ػ儴IHwzKGۂ擽t}mZfp6GRIDATxexSWsqmxFQO݅jVTԍ(0Ca0t0aҹ;N6f{y'}73?*hA:03GKg,`m>3\֯8.@T((K("GfXB.# &}d5Z۳.lGaet&MLUùh(j2osJ|Bj^يW]Ʈt9 w+{`B2>?/ѧ lIU5 G'ߜ9톃,XAeifA=:cʌ!^.2Lecn:[ZP6eR5HS{W~ad=xr!1f%Ḣ)9Osxoav ʰ{\!#9*CGK`R:1_]z`8wzl ql{on:tr,1koē[^X5o0?!̊Z+ιR)rK<\tkT(ㄒ@?}?^aZEjOmY }%WH%d> jzap^!߼t:7?hn293;af[a海纼8?2:6= "S-[&V0^*Y)X-[!6cXh3`*Y0\/] Q~$9ep~'W,Z#8d(X1_5Iq $U(W #S/]tFX}䁍]m;G=C #T1Enjx.\%U0]&;fM^ $Thv4a1^|>Qw.Bl*>i2` !R1_Rb򇓫 "S3`gu,[5a 5b2_K\)=hetTeCUz썘/](X%:fcrPs0Dm8Ks*ZHZ~ R'r(hV8ug<E $T,BW6Dv` orǘxʏ1-6SRdtcu dzb]#6۞.N!̌J\g!,v7:.qUw~CB4l6#WfԂtLDTTYuӯCyDhaXZ$ sXHhPu5&%ԧVysUUw*B"$:K%S"Ԯn3^-cju~TqV`V=Dh0&4!}{ٟpk ABN72m{JS? nBU&.O Sc iZS*;U&)rN[u[6y$>/N5U5gnN ejuG6yrV7zHeSzLcPP`CGv;lĈ\+9)Jޕ+ݡ$JwGhcB,G;'_v$-Ad1 'eG,~LY7b"9"E7 iA%шᯘ=Bcn( ΀r9b9ZrUA;Q0d408X?:>mI1W7=hw>y^EVFcvT;S"(%EDiI[A6j΢wq)4xN@0v?'Q(s#nNU,%][B9Eiݱ!RzzzqNǧ%4J5L@Sa@hJ/+r;U{kGnG5-.G*;ٙZE 6JH  Tv$UPJsA4aH+z0GH'"1h% \yDEC*lj2E(Odt%w~B ; 5ns+|zpxN ›hy਍BD8x:$rHwqMyպ_"p՗<*ѻ+Ǥ2rT/cJ.$D0{ ~1K%)RﯹWhm_tЀ+LsnvC7=MnpCMn 2\pr kpre/\톀[ݐKh\2M`]M%2ĜIENDB`PKwL\naժ5limit-login-attempts-reloaded/assets/img/flags/uy.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE8Cl/h,7>62- Q3rwtg)ɻwb ~-þJž[K W-<6Աţ ܶs Eɹx=gv kٴvƥu_IЭ༥=Ԋtl |qCOش o\ ͪgdT*Μ>{$vur}vάoY$岕Ϋ ɧ~˩ǩ#} "᱕x @<+Ģ߼z ޹ġlWǗͰnmf˯#Ad-/JͮشƬ=~ G۩ya[@dX!ȣʧ ePfT ˰,A6PCUJCOʨΫãǦǨè/%'1&)/!v2;iX [s}IDATxb`ijaKAd,B#.%k@#ըR2XCB@#e/Pxu71pQ0f% ,Qp}`Ĵƭbjׁ]0sa$ GS-ɼ"KM'!u,aV=vwү@mKf p L%.@MK*2nK{'/y[Td[jA%K*q2NlDA9SrcweR.fr,0lU< ~K5\91\{Qkb0w61 AG]<˚+I-eʹF_&:Nt_5kFw((IY/ɶN5|Dhi 5/pt,t)EDŗv Vp^qˠ1~ f:k4;ԓRd?p8Fpkl!m46 FMNH0j ip0p0py`:V:Ѣ~ZLD0ZQ@ް@AYIENDB`PKwL\qT!l*.rW!Ⲱyjqgjdp^8Y [CM Ht'v 8C kJk2ʹ5E1"r wI.~NS s|M&O㊷KO\6Κڅ{xHi5,Pϻg|`f^VX2f1Q WY w@3{7X_ ChP*6x5y kF}#X6A_^jy;~"Y~cp/r'/LX>?eNc^ڳ-~(w=:OXAj9PCͬ;}ፈ%y'ϡ|*8;5\8na<ۛA!۩[Oc0 x*?g0B@U/DOAK -@ %%%%%%%%,@A -,HHHH~ 0Iڐ~ޥIENDB`PKwL\LB!!5limit-login-attempts-reloaded/assets/img/flags/va.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE´jeMމ̽󹹹hّy 8Ʌh[vwٴ##ͨ;;w}*Ȕֆ+۳p|ͷUVȆʔ,,{qW4ƥԩ,݁zUNNUyӒ3+G3#ࡽXgge*-2Y\=j)ೳ&#\--x+=F󤹤A彽Ӛګ²s"{7Dֺ:90<ЋΆщҎӝߜA =oܺ@(?nq:@ۨ6iqiaiסѾC0*Wl񮱯it]]2kZ24מIDATxb` 013 F-dԒQKF-}%cio.:Wr2-JcK\.wZZ݄O%>Z WW-]D=aau#qWy%]wE99Ue/^ߒ5ަʡZ{k.ՊzNnNn.ƹ_f?Q mRT14Sd-sv j쭛TT\3ncs svG4eUQ6ؤ%"nZa@p8B楦G.x!-j$acKSb2tIyYoʱxcKT͚\~}VEV1krF.`FZbe Kn[:$SuFCκl%1,aaF%K8`'IU26-)w6x; ed䍳`aqXJ ܋\u>:/h>tx#B%zAW9vR%3Nx^zn] KX|ڒ%UcI,>_]PR=C|_%K (Sjb[{t. Ex $$Lj;dW)M4b7M}?^ꉕ;-Q% wwZ2jɨ% NK 8ԷIENDB`PKwL\#5limit-login-attempts-reloaded/assets/img/flags/vc.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<+PLTEX vXN '6"n =(DcPdaIj)?Y_Ch*!2S8l<> 5N{)ED]VuWB!+Fst#Mx$-G_IDATx{0i&K) mڔ۵+3ܮ4ffffffff8-7={uI;qc&^0e<76ĆbCl HN)d!l! s%.9ɨ<@UM[!e2}โDm n)q~j:ײ~DH+:oB_4S {Mk>bJ9ȟ2orZ}У :$9t , a8wQe69;iwBͤ/0yc~ڪYx{4OФ!P:9'5I1d3\3ʝ]i@۲ܲ{˹#q|Gd U-Ee0l_=QYK]XKOꐮ=? }zseBioGeftnw! w;9Kh=-kP{W;p7!?BA7BDn` =Q-(3 EMl!Z@Y.`ҦxBT$^|SRqi>M-S-ad 1QW6('JnG AhK4_O B۾ꞙsa@P"|>̕-LG#{k_t !tAx[gobCl !,f}o2>IENDB`PKwL\'hh5limit-login-attempts-reloaded/assets/img/flags/ve.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE+$} 9n${)5$~#|#}!{"| {!|zw%~&~sv%} zy$}ut)' z%~v'xx:+kzu!{+I5zIb~&.Lt p!@vw3PAZ (D_&D_ty +-K:U02Lx11Pa ,G_*ܺ0>XUm/]uŖ zn_vkף4R4$}7Vk!BE_ |#A'iyy4Zp~"}3,1f{tMc+ , *Pd†6i}-J_u ,1N'FE]*/B!|y /by;WF] '+B;y0J ?3M!|3xi~JdOh#B7pVn6#CG\qBZLfi~wMg )@[cyCX%}yu4QA\.J {= (h}vWo,bgRIDATxS@>tw:cgvum۶m۶m۶EnɤRT,bX*h(A FF/_˘\wI)"Ո qK{^ꈈ G[^>M!7z}-ojwǸq,]1N۽_[Ǥ%+OtE7YrI+ _c1G 3OMϫl J8(J_CNM955z"g%7/g^"FI,Y{8y_?)]>"W9eЋy# zHM=i!5#H<.{@*-ܞq2> $B |a̱ҕ#B%l R R; j́-"ba0 %~mJ{-S/`@:\(t%m_+_(tECge kŻҏ{1g+|{h{i&R ~c}ޯݵ TN$pqfu=ʾ`0FѪ L p))[Zkkadhx] Q,Y#yg,읝,e?1tN˔j&D]IDATx{XS)s@@pB$=@8%གoX jhjmr,D:SswhWЭʹShuK/V@]ϐO`ƃ g4>HØ b&|B턼H]BX8iG3|4wְ"Z0ƛc垘C11-"J;XTï[-^pf  =g{f(iRF Wl9L WyzJp7lb@m۶-oK+mkx4*=-G,uԦn0-`,7h A:;;AEIk8\K*opD5g0,.qt $ZRR*Άh5PtJ0g8bÔw~קH3ʨd&y쵟qblb6&NApSV%2dm!J%aa qKzH+m?Ᲊ1b)iD?NỦu!P 7a?bSz]L~&߻Nptn0f9xglF_F^L./ZỴ ˕#"[,܂~u/, xjFł9aMP3-&ov ˼c3гy(`Dh;t&_QG MTsxywk 1pg hFMx<$^)?-:ٕM3\XݜHd =8 P'195@92g17BPqlY׾R/9Ljj؉0'ǟOտ;IENDB`PKwL\Qq 5limit-login-attempts-reloaded/assets/img/flags/vi.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEsӫ5&gJʣ3^n,nö1ܱ7.Zio:K£KFO֪+-{¹LvR#12QbĶYÜ+-𔓉ɢ9;uib0 \=t"y>Ӝjz'rg=/3M왇RXͣ)+خ5419 d@%jf;z'8AvI=Tav?jG@>OPn*mn$'Y/->0fy- s1:d͝R$Wbwy>+9;ciQƠ1ɺþݯ)1u:ϧ3*槆+$138/۲@>Y 6"F~#`,ß9ڭ9@\y)#Ҹ˯^(™"d8֍v9b"s(;l\6հ) )IDATxX{\W0,+H up4<(F Ș)kR@YV֥8jKi%R`k|,T)ࢎ(Hvwiuk>gPQ@q\s99s/ ʠ ʠ8bi:(›ZebbZ5t {S N|(BKi't֦ia[V[4\3!t뗶KF]*.+W`/B[n\GےfF15aNӃmݬ(S ciuz;ɱ-?A8ƬGoh[{͈l;@vco4űa&P#ʃ_$@,lL55ǜE+v]oƻ ` ,BcYA)P /\_Rx %~y][F܆Sc(0CK4(y:1hAJhL6wlZ6˔9X" ,(LIpdQsQrN!&ގ˙YeAGNMvwO7ժTV(1l]M a62 rVGiqj#a܊&`LPbMi[61iP8?8ꨠ:=Ԙuql7q B4B(eyHH=];Պ1fͰ,^5} :irB ꐌZ6;tr{ 0h7[Q _T<48,1VC9îbqC$$$m+ 1a[2` "5>*IqzB8dxd~!_8 ,fpAIhaz4`H%͓# C!ahS2+rcN#'6cb$Ppޥ2)JrDpa 2&ǻ-Hg2$.H~~ p5V,ZlDdPip`d0%^7N8RZ D͏i*(&a;EP}D@GmtuP+T~|O&(73 }O0>zN୵ [ PuMoeKzu}1 Қ%kUs  ٸ7Йk`>@c9n*Ո>Ź~A*xN9yE{J-et  ՑdH4{yHpmjT| x ,93|Vtt'U&5tk+ MuKVDj>rǖuO͊(*E&_Q2(TQː1͙o} 2Ӯt}˳BTdTk/ DT.]LAާg8$[{D]|y3Ե+U|;jSQTi&d{Irf'vfU~d`;vY(Nx#?>v|bFҝY bP g+Z9~}oT7g?ظÛ-%u#_~re? ;Pw~Yn+F;`v~~ ݡ ,U v=!rX:X&Z'ғYQ+JWҏ}}*%p9 \O,BgL P@v⢥0a=K#dE^oJJJAІ ]HU\_:% ä?z>S:m$Uqآ錩riPI#G/X ]8aEOdj"ϺA4%ÙFu/ubtX' FlI5L9$*40BCxÝwF5L:q9_cnn@1Ɓ: 8Bha,AW/~ [-v9/aLqKH:j%S\jK$WVM| $";|1V܆[)8@ %78y\"P{vo52k(; ӅB[Y'?IWaf"|HRI<%;`SU\FNl0Be {3w8shD#шFĐ"xU#AP$Sr&d^&(FȜb$cQ^P!T"ԧ]U!@A *0RrH9g~,ܼǙ@hھjߕƈA;CQ`Dꖴ#ޯsOU'*\.#r'89e*TļpT>$_vטeGlxjL V{FW".ZA8/@A7@n8j#AeJ 43o]]/!D29&d.=p;r(Qq '.ݟ»b$3 #/J̻aH"8o&ͬdVsf>rBhfDDxxBBAACDD"W"vv>>pp- ~~JJAAaa'e'dd>>R??0~0;;) 'h')m)44K46622mEE8|\  r+%%AGEEM"["V66.y.-r-R  BB$`$::$<<00IHN+q+,u,00ܽqIDATxڴyXTUb `0MM2HA %*`Dj-nidYf{swy͙{hx oᔏ ;/$=3. !d î !QE/'_<'ϼ%y!/H@q7#uI4ψ0<͈%!8I/`'37O/O01E^,PVdnA 0g&w b E\]7c6kmgt`!4;ly{'4{_9EA3M4W1#Nyv!!4S?,,t| M"~&<ДANF';4^נfLЌf۳6Y.ո;+4c?kѵJ`^:R6i[r}MHնPiIlhGAsx_f2y ydlh"cXm P&TI1qn8PLϕM$+b lL2u\JL&VXs=I qLnH6aqFth3s2!VŢieEiٺ8 YGbg 11513-- ,W][L o!ms׊Ir/}B݅$nM|sW:ƁϬ$8:zQL/DR)O\;\.ӮqGIq8q#4*$M;Û4Nk/igpM_!uC p+ۤK̷؁4yk4IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\s995limit-login-attempts-reloaded/assets/img/flags/ws.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&+!W Z-1$*|+*)~*~(}!y"zw,&|,"y#z${W Yx%{(~ x'}u#{v%|C-7&|3U.+ yd~<xEd+E7X'}/RTq\x,1 - 2xr%v4VHgs:XIeFdӘ'K..Lj}A]lDCb1k+,3SSpy F]y2*hg.R<[!j.=)~sPm 3z*Omp1޻݇7Y%-ڂp,"C(~͛8Z,{`yC_F]%-:%|9s${tu> 37 ,[vDd&|-+Gf,;]l@)~@`D` 6i+1u Aȯ$9Z?]$-)MZX7UU,.JIDATxUs1}ۺp1;MÌefffff wuƮ훾nFNZT~_FxLi|/-3Tt,VCx+'"JflÃNHUll#>Ap~q,8(i{蒑s8;|0y5D; IbP%̵K>"Jx+){W åG)/w-.\$6S%4 [wt˙iiVbI'ݴx%^|k;>"DKgK0KW.Aa;$q`$!3:ÿ8SvlwqK"!_ϻT BP( B q"BIENDB`PKwL\=5limit-login-attempts-reloaded/assets/img/flags/xk.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE$JЦP#I"I"H HG#J GCթNEԨNB%JF!GE#IҧO֩M!H!H%KתMDFE GݭJ"IdlѧPDȢT,O:Vtu~Qc۬KI^تLӨO3VṳRsgn#Ja|٫L&LY)M[q+P!IFB^i@7ZmqըN;B[ѦPޕm 5ŸW8UG?ršhDΥQ)N?1Q}zy'Kg߮INmڬK<^'LF\PnSq6TbkDmÚkFơU{ĠVl9U%K5S_t'MGˤS`l\xY^blcIi&KF>`@c~ЦQDE3WϦQتMͥRתLij'LܬJ#I'M~֪MCd9[;]1UE2UثL(L(M%K<.RҜjMIDATxb`` +%J+;mXuT6[X|d?r) 'b#w{c"A')+Ci!33Zer2``ffY|Fzq}g*mM J9UrF#OŔL+0 911N\ .}fP[[c 2h׭q[A*˯^*'hR +,;t3H84; K vyo2ef~``忱 Ja,&bqe8m#ƙ._A Ù[۫)7ʽAYd2+N$Aw%AR⅋ST$?CT]9BI39*&&gD짷 3@5j6t ]ܘfL -m-<(JZuO0z IWϨ%KrFl/OP&iT uFwP-,5J;~nߨ8Kuq{Z%}y1F#;LO2aءdgg{f;-a{̌:LnЩBFdm1AVآ[АGE+ղKUEP,aM\UN,:Xi,HRj׬fڵT]IWQF@qoiL6/#pUĔOLQ4Dj9*XotK5 *5ou۩]9+ۄ [ E[XXlz6h,ϥAcm~ ;mAu#m^HijK6u{jW܎Q0 F(  xoIENDB`PKwL\{5limit-login-attempts-reloaded/assets/img/flags/ye.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE|||YU*~};IDATx [BHkH$D"y;9# @"H$D2 '`JIENDB`PKwL\J5limit-login-attempts-reloaded/assets/img/flags/yt.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE&0/x*t!>IDATx sol?Pž)3[$D"H$D"H$D"H$ 0A"o IENDB`PKwL\5limit-login-attempts-reloaded/assets/img/flags/za.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE320.C''͛Ȥ65fT{e VV$L4E!5hh ,$Kk缼Y*)K,7ܵs1t%( c(SEk&6-{$3&Rr=[K4  5{{21&33ٴ75+DfS+' +2;0$$55/@.6f<a47/,,Լ)::|| 5F:9^DD'/5߾+Ѥ:8.-ܹL>}ʕЫa~uǏ2|#02D. 6oʼnԩׯ%2W-Sֱ65 8, Р6!!@nbBB.H0DA__⋷!+??UE llh„Ӧ`` B68[ mwTIDATxڴ؉_eq"3²Ryywޝ}~veCwkqcPxQc1,+U01܏aAZ1Mm!a^P+c~U T-dJf&t{[T.u&Sn0O4i `}  ,eYKhL1s"_;% 0Xy_1I3(qms~GQ fSf4powX1^14ĘzS)co^1f?4e%* a.0pFxtH1" ;Laa^pG8.,Ƌxngk85#&팤p&AM+`GV-q ?CԊtjďLZ 󅡍,᧎H ]TF0cJ1M̓x[/ jH@"cpϭM<"U"C?y잯hcKyQ-oqAQ\YWRm+eJ\~H©1B'pK>GʢK:ePo±*D 7 fIGb Npqȶc eYW#ƿ {}hmF]`Hlܼfzb+ )2Yb-gı.GbBGȰF F*szb5}1'=ΰFFR*5"wQ 1 'bqzOAb RʰF" g'XH)4 knX܁7XѦ|J#$FZ[xR#O6qO^xRnzjD񳹻#\tZ䪴)\hʺm 0xpbhIENDB`PKwL\Y 5limit-login-attempts-reloaded/assets/img/flags/zm.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTE} !{~ : 9 &~}: $ +-n9 pBua&~4liahagVoYgZx)MkZs$udmc\jRuekc}^.tLiXU WbSi>s"rg\q#jQ_[mpe{\ey_e=xvPV\Ko]ryqmNb[]j%k`2zzwdoz un^ VZg{U}s8 B {Z`sqgffr# 5yVKY| Nv9n ~ "^3JCd@o Km2u}[b} qSk^d7d{?cvTqq[XdVTvNs!~cfqv>Z`peR*`eoqYq]mq% kkz`a^YXjr yXx^}\9| ^d1|^IDATxb`tCHvxwQTDYj(/prj{ck Zr'b SUնKs4lw1]'"OE…RZT.NȒ 5b>z^L>:LM̯.S89Euei 4btn[9Cyl1 kS)֪EhַyZz-KY޴`O˫; K, M0_Ϲ)L^N#{-Cڲtԝ5S&hx)qdВ IyNIʛbWᑣ"eQeNtf}SkȏO"4{FD 8oXWh]N\C5!iiZע:yWMlka]ꚭmCBmMߌ Z| KMiyw_\5;w{ҬLdT;;o A4\'ٜ$Já8ڭZ]NS;@PnA$)E`18|$rN3y/e`MoKD*IJF$8Pd ?3p [ƄZBz>dԒQK֋Z2jD`ԒQKF-dԒD~ԒQKhgI-BP,0ܷBIENDB`PKwL\y5limit-login-attempts-reloaded/assets/img/flags/zw.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<PLTEdg^_=WfP-ڶ WW}fJKt@7R֔iUPIPPQuu3)ҹO~iҬD7nTHaaa889ʣ'b6111***eIͺrjjjEFFœeNNO 11\\v V#$%^^^풒qqqt]fӥ늊۳""ꁁ s̓kjjezzzخ̬ Y` TЧV QZ1P P6?@@`=~$?QWXXy W։ӊaIx$șmgпdQghhPPfۼƓ̬ ܘHHH*ƠǨf#dIDATxbfaQ3.b%pgؙaL[KmXfxO% +2%ekYfF?,s2&YFHƜGQ,atey1TK5X2n7qSYXb)+EUa aŻ1-aLEVm-adf1䢭%,KFƖ5,ZV4d8˸Ll%.y`5KQ,ɫ atFL %l,`|<[!J%zRX17z P0-f +f "̔@,ܵ2sU+-ѼYIlbw'$Y{~jlT*(24KN))bΨKV\6\)Ê^y>*YrpU,krT4dH|$!lKey٬]!pxŒӔ-B^&6۸7Y(6HdxŬJ:X .6D8[)+,hLTTo-rK-Ե `߱NtܧbOk#9o\wE1 M 0ek,N"IoHKKo}^G$ =L~{ˑ}h-#kƼ'q,fRϛ u}/[ Z]GnՋf,yV@$8QLKK}o rE(x-VKnF2p %v"?%܃Zv98?M ly4V3PӒ,/i:Jddt+%Y21|E_"u%N+.RX6DDV3H#ܴAXd8i;pgPK,5|a ]N5A-V44{i  b#!IENDB`PKwL\j 5limit-login-attempts-reloaded/assets/img/flags/zz.pngnu[PNG  IHDRdK҅tEXtSoftwareAdobe ImageReadyqe<3PLTE[[[111OOOBBBxxxoooeeeHIDATxA E x*v,]>NY !aA p+ c3 37&w[Y O #E %e| ƶ[$~_o~ߵڃ9[uR./+,+.0/?O=P+2):N.*;O%:H/=N,;6F7H,8J9F&8J16I:H>R03P:m\j5017M7J!'ϩ|ѬIX#fQ)@|cvĵmѫWpvNOof>PջxBsRn, c9&/jE7#xXVg}\ƹ\+"wLgD ڵ;? :݄LK-'1[ѩmG3GƖP0 kL>pfFJ+3#7{QjwnKF KXA~w0jx*9@3K!읾 x,jrLl~['SuNy!l~X%h9YfVHDFrGߙ܏Iϙ=zP^RpˇǼm%`soh[wA燹P/?DK~ OlG3-1U מW}@t.$>z1n_޷uonN%N=q4^%}@rd,w"ŕ@]cn_NF*u&JQ#|a2CʈM\%t8"ӒiF ﰝ«RKHЩU|Wfhdej^Nm`FSZ*EOl^̳`&jL WB;*!B  RΕ۔]1jÛG$c¶E6Ƅ1e`w4V{=,tҁ2N]`:bkzy{J t>BP.%@ ;:;" Cr+߽K[0!$:8^Am 5'Wꏛgt2ƅ\30Μ9`aR3s0hqwzFH# 3&5Y;i&/8&"D|]-2Ҳ'˻R+?7_¥z*` 8]TXOhU" d> UsHN;rdl䁥xȚds<@%,-0%+KǶձPmQX-7Lvl͊ʥљDA&9[Vc#X62/1P>t-jt[?sK%}ػb pNFiYLѽRZe)ivwdy hjop_0b[@lwB(/mjp &kS?mj(lcIS. 虹Y0Ѐt׏|>kgŲۥFZ~Zv: ̜W QǿeF݆˲^5BGBD ^"Dx؝ufeG/*a9ŋK}s>/C#R0'j&'w/mrR;3he ͯʟLB",MyYV{F2* v&)N?[l/L:u SWj?g?R+pyuNUIxɳyl#&yʊfoB($`58H _yJ+i(ANa'm7j)X?e4tbCvĮ e-ʶ6GnE2@^-t,{7lհdR]}8W*/ny=,H#ȉ~_ ;* m,?cɀELzK`%~֪IO+03 } =I~/Ȁ]Y3]y1=6}aA ȓǕ#'!\r4 S;M*R>u.Kfc_Q~a,d ,"`neCBaWzЫG/*Brmm V, I hx+bP \ʒQboEe6{[jps9OKe <0F 0+ *FFzMހCt'z?] 2,6?~O ZaS5ym-$f143ۂiķn`-C( $3+r{iYM[S@(\0?x9.k wR-sA{"F]B{zkIWm# :d /kjs@i0V@"EJoXA%`-xx+gb"5ߺɌD Y"- #1'cQh 2*ga% oS^BXu$0AAm>z6 ܪ4Y@JmsAq"X{"%m <,d p\m Jqit$Z2z~&ǀOw3 @tTyвfcBaꙺQKӿP_5)nV9@=Ji9p+2SfU0-0AoPM0OlH'+~HBVmjGȷ }:hL?nt %L V!M0x4K\3;.h pU$"_[6[Nm98;qTg4J pСf1@k*@UO=#ֵif݈Z쇚dCe^9i |tS =ܕ[\7iN<2b~8mE t=MjmpjDRr~<4v9R-#QŇN5g . s%!F$7`2N.iZX'V_ͧ}各^U Z B.9$ J7i|  Rِq6~gd j.$a޸lrc;ld~"hdnz%I7',#tu$ ]xI 7U" j!4;QWD LڠSgL5͈|2LF8%X)bS?1?2KO=n7F7JFL?2AS2F TuFE7k{XQT,h,b7D%6V#vEQ`ْnֵDŀ;ɨ3^wez;%-*]j=WH ҁ Dh%:҂c}.ėuWzppULL홱7 4"@`P6ֈRX]1?EHK@,S<߽+uGs a_̚4AK'!X ت.P6[׸_4{>SD@JC1UӠ$P:GC1:]hc5@B`tD0 M'"`DAbd'L h9KLEtz! VyM>n)t b",hOP  X ƣm"ٕ`j"1x380+MOn@X. aـ\&y qMzLa,|Arb",sHm* .p0sk "נl!Xbu \M@`։:ȅ&c.SbeΊˢ< k=uС0͎c6XF~I @! :6- LH\jfAd$!EH| &Ct{@t:;ZbJ2 @=t;sUPA Ci44`тsu]WaPAn;NuЧV'wxu` 1$193Pօc)UxB`Ϋܣ1A1;} fK6)PDz`Rӑ{$@dQ)1R_O9uCv[b2!r7Q]DL;A*Vh3B$ -AGY4d`F~kя=K"o NӎOnfrd9 30 rHh CD]oܼ "FLFa6מּ>^ًĚ}%E!|\6Ks.E`f}-ҴŁQzh!M_[n0 |tf^Ky,^0.~c/V5oq`w&.ՁaέDC^gz땁&i81j#ri^~=Bf*$ uRy6.oo @GYR1!gD|yfD"T$qU| óFT+84{xQ .LL@I{vuF3cJРϬsNz^n$coH Mnl(ayYqpL ΐ62b%P8$wH749AQn[< &" ,HlHD(4t`bCqq$KS LEt3f<FBhƧ3'ɜ {%"Ӱٷ}1J'a0o8v-;93|M;**n>/נ|}A 8>o[RhY5\$إjT5HW$I !IBp+ÀH\! K` ~C5K~elLw[_\yˉrqZhTm zPHqf+@2չb gw@)p{/>mn)lUeqLـ) `XH4&=zJDGUjX,=Q/b";3 r0h[rq)7!mM -k Zq8?!}Zv5nue3xT-f0cUCsp.F=T/ۙU}{P;wg2Skjؗoc&!D$kȞ5KHeO"k!kY>@|!$$qu/}/۽̘!ssX@;7o~?{UIǯ>^?̤`H`XWv":)fMyxӛz7ۂj}xmڻvʷ,xy"+/Gꙇwxwݼw"w靻g6/x']6(˟KJUk;zyS\isǼo4% #A4Md f[ #ž&#<"51`[uQtH ԴJxgJ>$4|x,?t:OiAT 4I d2,w?EvRT`h^1cd<-`r~SZR*G D<~U^2y'jn- F6M&\)oXU29+$}HqΞgNy S}6KeCBnlv/M b򔗯t?C8w86ՠ~w{ԮB+R}ZRO#Ð@R; !\TBѰ$ʆn B$h,#o14Tb@s kפ17A$ 3cAtJJ ;Uyùl#Ha ]{Ѯ.F(.WĚK ]A`׮5"! {@PVd@'haDv$/ T-34N*!;L/JXJPj{rj{jS1t>ij:UJAa6?֟zN00w8`P(U)Ь|/1beUBzF`;r$ qC  0P4Ks5>t jLP99D |(-b}AuЀVۅN03Pf5.QP(Õ !EF aLrٺWK{gTfDϨ')⢃YA]7MvV 72u|D)šP<"h:!Z~hœʴJs2Q@2]հPc:wKR69r'կ*wb4#IC1&䞳lh=PF&zP l|ki?J@8E%DUM{2&jQ(05x )@dy+@!PXњePSTo(D< aeJfe\Q-4Cqļ̀ R1eڟc= C^VQ txˬ\  LhgxFT=+ph@ DYN2y8OI^pMTJA)4.)&Ehœ$#)j(:όXnmUݵ2O霡z`<|,5pѧIsJR34)ku$y va449 4Y)Sg.C .>8ʹĴҜdvPT6+ !ڃǥ d2͓ # \*^| U:5o^B+B +\$}Lq\ϙz@hAa^R*m1gBA9wŰ1ujD۟ߢJ k}lJ  & _M\ރ&b6"#{ ɾT1B0:65~F%#6L?JP#WA,)lIn! د:2҃jl9=H 8ޡg򟕠2yi`^ @ZOf7ݻ7J(.8ݑ#NI S繵 }7js͕V. dԙjl/n%r]L2{z3j:7%P׳[smZnbbW̓ ^QO5$mIENDB`PKwL\O @limit-login-attempts-reloaded/assets/img/icon-logo-menu-dark.pngnu[PNG  IHDRN#tEXtSoftwareAdobe ImageReadyqe<rPLTE=&=%&<=>====3&C9cl,>_I 0gn\eɹAYUgTUTSudx&cT V{:^*6ؾGs6p9U(k0/Qu MA+ .fֶQѐEiMSI@0m%֚fLSUkLy7S9UJݐ SYkFp0mUp6 Y[i[cAQ0ieٱO#,4mjTp@OFjn;2ƈ5iT(B.v;RH)@o(yHӪihF&iJEs5[{ן$Ҝh^!ͺ&(eȻ5 Ta[4i_?4/Ϲ] 檹#bxOJi}I](4Qa*q5\_A`ڈkA=WS4{b5OC@?~aky> P1?/G܈4H -G̷suh$'z h&L@a32plO3S>+i%N]*M-z&M "SfslٗQξȅW/)܋F>ǤAt[i .rl4q琍k$$@Js_ 3/#l|8n`.aiv҄du&JW & SH,M4}iΈEp8D踌hP2pg^eDy^%q㙣9:{qk28ui8~|;$} 4hͫޯNEίK9.2َ\0;4K *XtI!"phL5'ONڝ1'r %4 O^rIMC/it%0J;W.M g1'M8.? 1ߠB;˹UhO|DdMG{d!F5Mzo3 Cdn;HAx@_.GCx"ltqRU^!K/N"H?̊TLw4cVs4V i `EVk}湧$ /(ô̩8IENDB`PKwL\i[i[;limit-login-attempts-reloaded/assets/img/icon-logo-menu.pngnu[PNG  IHDR\rftEXtSoftwareAdobe ImageReadyqe<#iTXtXML:com.adobe.xmp foWIDATx}T}:( ( KK䟨i$FXYR-+v 4AD:i޹R;ewoaΝ{T>sOc=>S/&%]YOԶ-},*z0 +#F@bQhWQi-<,+繼߳kKiupQ/3`ďut CĞy0H>Bu6^㊮R-P?: mB(z' YI]UY C_]Ƣ} 'Uc(U@ぷ&~@q]Ꭓ-F8Pd ڎi뮁ALUzΛ< D+Gύ%Ya8Aw9i>8`Ы|P$œ :lrJ=""rx6!?qu 'BX{˖6[&X]~d~=A@)`$t\fSvފy±HT )!h]=]Зk융9%L*iQ{tOIm%MdX GgfsV+]9Ș3aJk6VoOshYt j07S|7nyeLl%1薂>~.է•@ p:32Svֿzߑd tJb.@u ? 6l[Ld&:=>zݰ'@/StƬlGUӔ׎V|B'25q;׉ cm]և 4/7s~dwj?'owS䜊CUNuVkꄍ=pǟ 32 ЭNg*;׮Hl!O,04mG8L Z.c PzbCw#)rFEEO#0lkȑA4c9_iJB{a G$ j ) {3f+>2[9 AufWL[*[#OA: LJܹ$"&'ذ^ ,B@*]^~{nmaeݒx(Wq5T׃'ϯu7WF7(*%)9rMu*l=_*=Zvhѱ$[7n\ šWՍ$G uҭ~6{j5>^h-!ǒj LqԺv b͗@m\ض3>\hU]O0, ?94 4r]jNB<&粭eD0jG 6eO "[kr#H+ζ%JN9n{/kRhhZ&4H{Jm J+.:BhCM^)?ڻ>=-{ף EaoP +w] TpbٝYy Cu^[}7hN|2I#՗$ [yŋnL|7Ș'V[] __}Mn`O\2`C6O\AsiC x+}gaڰTn}>ev1(ܾf($!SG3 23sÑd#(6> ij*X:}!(h'p9I6Z9hgzFd tʏ-ZS+݀Ph4o5LPW%Waڋ(Hra%7dH5`v-;nE,9Uz=qV{Y˦cib产FmxkԿ@ް 07vʌINztr#~ևfBHMO! 8y.r(=bFmWiaʑzc 8U{ރ(^[Fw`{|@wQl$DǠj+&2om]r! P![?ɔzTS Rw|Zȱ\n_Vة]_ON c ϋSxBYDc>eb1-jrDPWWǦ Q<88zQ o:= ]چewTFwa$gC]|K˫\V$3fD #.ovZ]gKK-hT p,b-Uzs iC.h0нH?Q|ea=\ WB$O" lPg qڒag){!S@F][ (/E`PI~}v bu0IlkgC,v1($\N ~L,e 4 d H'#.*k$_߳IR~XIN7>B<! `~{ )=85h"liH GcrH-e:d҅k5ɶB&u9uʒP':qP3jbD@3a;ᄣ^fT4ja@R.]ݡ:0jͧSP[y`դcwj@4v)$qH1/,qk^㡵wnB/3_mvp/C*pv9ӱ4;ۃ$; Gˬ^qEG\xݧwroF  g@Kn07s*0I?CZNB.nasy5O~P0D/'V>FJ`^Q-fsT`#t4}knZe]aQ2mn v P]lm )Ii )1-RMX){PsiDB5ֲ`jZгev^mi_j2_L~=~M0`>dD ~Fuyc:}DDRhib DamXl B9=_aJ?H>m``f; m np|җ);]ޘ n".G~,PBW854m/K˃VDABҡ# H`4Ui)ˬlS`[ Di;R7S~NKAj~1hM 67XeH4}*bwٝ;C@[#L1FŰv͙3` {SK6aH),M^'\UJNeЃF =pg_ ¨wFi 0fj@?<j|.(,F^Bh]In?G֟+)X z`IB:U@6h=G3i;qiЛ:>[!n$5.kG3"ٮؐ$XkvL5Kml\멢b$hHێ& ϷA[tlMM2淰}1\ 7?Q ܯTa艂?CQ+gfDhrf(h>b7.50?2Zx僟(?m!V$姖Dڿ0"*9X}8^iΓmmQhE_>}lee艂%e:$.PN@eȦ`LA ?phİ!Q?r^js-sx%t Ci}M }qDf;o9>K gMiSx%n [ S6 )?(w%XAc7о O9L?\[Ofe ?%08s 'W-ٶֹ,E kbάB"Ϥln| /7/+Z#f^V8xFcX|_Z{>/ E1=S@iDžs5ؑqd=S۶i2/ /n\Cb(?--9h'=%0?_2﹗8 CaAN^lU8xi8Ӎ]dنr7 zRp@ lMSd m;lN__}%nEh(3/J /p&isWۉe=^&20au)t ((U@gӋ*$sPݡ#A|o?9VeZR W@ˆ@*MANFA@?@,<ϾoI]]&84bnk*IVAM Rh?Xh4z㞰uM1z@Kʏ QX^<we?\Vs_aY^ezwF41>]#|h?8LOD` `ٗCT:ȸ{ IbN>7O.~,ىgd]K"N/JX;>@n=@ @mYWc-.! W@wъ \Ғ-ϵ5~t x̅H`\;Ê hns~ʤ1iRx`432(ϩ֟! W8zV e4Ř'5s` 2W!iޙJӒ^GXcl]Av A>Tع0@2z[ 7U K=,`eXZ]K17rf*‰0Vev@*+|8,5$0%I.q-U7Gr򘙞}?pp9EW~7i؂ƋR]ξ( 4;}Mlҹ;zXE`p?wG=\ߟZx|IVrе!o_{tQi?-N"V~ێ/tnvB 9c'A\ -?%sz(P?D|J2)YBpqaTmmTb ^!t^D7b1w3bWIsAQK3 QiN/ؔM;{6 ! G<`r8n hGw>C;nMh0qCnҮ c~{}Z?f:X2<ߋ?: 7MWs...Q'Cу/a Qgmf讯` DQ.)Ww{zТ݀O)F;tS'!'M W]?︕/oC+ueDo24dKp@b&aP)'E )6+cNGu}N>֒l=F#ڹ܅K..^]3^2}+d5oO:ou Sn 94߮We?+ 0R~'{/̓ COfܥk_~lm}d 'e6, iD?هh8漶KϵW0/~`P1h(P}sO(vc 3fHѪ fۏns 03c.[;Wht=CdM`V ; b;ףmcڄB?ni%X/o_u.}U6n,0}дHh{)ܒ~ї7iwgZ/,1>Fw 0G>[;6jsؕT`c!ԅr_~ҟK1ΤVßgo7Bmz<u0/N}6raC :-?|StH태x[4-ph߯on;wZ#iɘ1c.Y~x̯@Sr:up4%SA 2(!L⟅Fs&bU',2?O jՅ8DJ5BDq(' &+,_|9ȯӲ9ko \[Œlg2{k dDƀU*TS/?#OYqhFQ:R\1c؄J~URPs3n&KX`Z+ }H,[9 bC=m-qd) xޒ5tLjULݍ\6RN >Xa%`B} MYp>ښ{>I y5*$bB}dzU2;rSV^J8 1H݀A JoZV#W뗧!a{t:ir@KZi*i 5hsLUŴ"q.jUzRCp ୍ƈ`'D0zX J_7X)GSMkB$w^fa]p*YܛyX n-fy-/*z;{iBP\NN3>)r5_$AG HA+({вkQ4-:a-N &!J{H Hu8n!2L^^ HbZb-|rʢkDnA^,&P7=W]spZ_bE蟢[Ao։ EK ?](M&^: f#+ԍT73+]Zs#`O|; \L]}e>g4Xɣl[?`jARKit@^2(2I(4yxhܧz#h !aN$GW@xl[F[A-|08#2B t0H0J$=Lr/jsvchiN? &0s {XS' ^ "hJPF);+R|*0e"2տe62BWfN#.쎍Q=^?ޒ5@A.5f|/A$z 4lB&[+L9fU An|Э@XPew?_:ѺZ͕ef'=H~3rq -oߥ+Cf3[ RdȂ6:^pTT˨ /? :#ٺu=p`,8%vj, 7맕ɿ`gD-ݬAe/n(޿)]I>VFu^kL &X,H8uGi5^hLɿ;O|jCK[8:hh97'KGPه_1,Fe㗸eR@V!M0ym7_n讯dwsP7l'3okAņ!CXյdn~B>w >n 7i\D7z* H9& j>U*E.I#Ѿ[b ,J8Es x捽OoSwMimExr˟O,]_C!Y?2BC ˟uBc2w'f ]Gq,d>vȾCuZ#n|Z#ڏ2Z=34%n#}WO8Zקd}9nMjzmu',(xVNA3M/~j:.-RrЯ-1:Jd:P:z=9g'sz4 ̸ Ñ9#̌~.])$V Aĝ[(JBk^_"8XӦ Q41*Dh,q=oϥ>@yW8$)V3l!O:'<,p(@k~|' b8^C+7ߏ?>U0 zI|?mb$2\'bL٥<8ߋ:~~%Nj!;, {RuO A@&n]yro=^L/3bA(.xeģںo[sRQ9g 1ꊎ݋ Z"-dwY|ߟK#%R`>@.C wa\r&Q?If:]Ծ |^|/fN<ŭ]<:,ȣ%jyi9XuQtQkݝz,=|~t6cqQr;/ ,L2*nÖ0:Nޣr0y4-ؗm` ZF+hY@>3޴Hs{ ; G }y8|z{}][rpy&TfFNp@Xv @Ziz (h>H3 Dہp$ ퟡ.n0*Mޑ7h]_C9[z55(Pg`a$[X@T|<[6-96.j\ůBO}xxRfQ~.(p(O7_a:Q~ D_ qr2mRȤޡ=~iabЏxYp95S;/V<B"B{!TAA^A$ ulɝ&ڻ bD{N6 c}F-dк? ˤFZ5uhk=hsD,HC |A So*,h)3́PC᯵Wԟ47Adn0ԓ}w!Q> )`$ r pcXnf~Ls@ "WA+dQG#1 Q[|ŌR7ߟQ/?Em'yqi!>>sm *Z1u\'6.0W 箘N@p$y)Hш~ ʏ&˸q+_b* b rB݀́'pAWl{g"K˹|Ks9q-bA=`VˍbQm]b(r8~(ϻNd"3UϧneP]wR!% @ӄb6;@N NQr~lHk'X M׋ 򴵼 FFdб]F!E $4)lasA P*5 iJ bp`Tꡇewۮ1k>0jD1"naRlH$^E tut[P~M 9j 9E.0؇,G  -AWKL[#-ݽKT~_]&m1rw8m+{}Bo)`S4G֌Q(+ ߿[MMaZ1mDm>\bnK0O]á/hDpbȭp"Vm2 w3&7k~fa}>@8B.#}sA ϾܗI*'w֛Sg_f/OZ3N,Z`̪%2_dS2[} f0_Z^`^~5nBhwu'b{!Jss;̋+(0tunUz2 } HwP|Bƃ E0ug0;9~&U{}g: wLwOtJii,F5߻P dme(L%eƪ(uTw5Z`#Gc6WD-ja@H>U8d|"9aiqɺ6)<9Xc|kmd2eqT|&@A ܷ QJ5\bv#C@*\-̏٦y;&HzY| |u@Qpd<N~T|S"fvh)`,`AATX\Z*Ë^ eS?(#@45L,\;:R@~J,Mgf!mj _pZ^;?u#y\:qc;0f0PkQlCUĽ%wSl@ǯ,mGpA}%f|SW.@Wzux} Rh7W=.R7aeY\6ojP+1FةC u9nt- ^6-rR嗤`D )mĺr 򅋼,1tA_bLœF"ϔ\qN0ji-Amںg9y~A[ MvR*:)=T}L].:+ Ewq2Ds3us)b`w"_GC0~TC^Cs sho^X "r崏aP q'- 𰟒"*Srۀ4 WT ZU<%x@pNL <:y42UС0GVmtL\"2 A3g݅@{eA*$C; fzi`j\ȵѪ Bm)"Lߟ@(uŗNb#ik4aTkwpo@ ݀fc^S'8ؤNIo\-lյA4tq㓶|coρ+%%s:؄ k/=1![. V8h% /@ & 6 >]#?A~'_.F{|cq;oݟJ-8J}wTTE8jܩ^ uy $i\v;/k; Uןs $]wu"8j;@[xK$!q4ƂYk + r1R %n)2aPabWfA)2Q&t˩`IA4r::/f\+FUxy$&C )7+.r5ĩt W DykațA׊+$\>XhdB)yAm% Y@\0ʌ^AV key^ O=@ŋ{cDoD@X B R|kưo)ǟƯـ %?<(1'R{푈m͗_qI~Tc Ĥb.ȹ :wzTt"oD Z&)6maElP`[] EiMG[ ` Tk~C,B]W ˽Bs Xۋu"`YBnCL緁5C%0/еQVPnE@&W8r^A{[>bg6Pw|{ˍ-wA'=hZkV@֗x5OV; J!s>!:[G\4Cli N=8DR6cK]Xy 2:X+@K_ )+*@:t<'{tacC=NFdnC kpm̠)PtSСo$rxFcƆK@h/C~9ZNW[?(5OQRc,+!_Z BDkkuPS7>L7ݼ/,7ī[:û ]Mδ0@ј,l?hNJ1kk]x ma>b-c`w8i jj6Ê-c {2vW#sxQe]k!EÿI:={Ɠᄣ^f\_ǞOlr;X`[C 0OcG#nA}k3@M#(}пǘDwlΈ22 MA0mƔ'Gˍ^c.{E0bhZ3;ReXAw33aEbj\Ht hIVS}A\4Q)SgP*Vk5s(H @MxbмbYL:XuZpe.:~;jQF n$H%N;rN.uyvܭ@=.av1Hia(řbZC<wn(bQK˩~GIpݚr3w@z`G0ةF+D9&U+q`sGTO@wy۾| x0ZyEءdK ؓ`ۖ+#-˜΂U#O'Ϝx!*:XJwpOHgKo{p'z$QY͙TtZR}hCQ(BY0'Ԇ&-[yLSzVsDVOr hHMjr_ZkntUUogxyIPϧIT(ߥǗX- R&mgWnnQВ; Żf! LZ^>`Lf2($*9 t"X-vCW!B^8Ho+ fPAr1W~{a͍'TÈ |DB,>0rD ǜ9َcI.t^9&i?"!)롹.Yp,?P@o@21=^SLٝc#[H2;DeXE$A͌e|3y$w:1V @}d0x h}:O$ga145Z956 ^w;yS.‘uI>4M f@q+q>7Uxk=0՗5gJBl ՅM>n]k/=d[s6shddQxF%(WN)8[ǮH;.=D. a@ȡ?'G٘]Qnz0@-1W(iz7XC!j@KhuA\3Х|2xKY|u^]a@ dBdf> Hhl];;岮t& thdQ"˴%@?z eF ('0l i`80v?\9 9?%/׍墥oݼ|7gDk>C-cg;ӏX Y$.ˌ/ˡ?j Q#}($[. FwY 9Q^wǎ?>|eϟ1w".ue& |JI'{Hlm;᧴)f!Q_^^_N&$K{LZ` Jh$) qsorK%.-pX 5 Uvd]<tds6t[{YS@}|IpLkaInP‚Lr1hݱ?F[N%BMҡ{^kj[ۻ1PAA~AH>2z=kǬ7,A/`./hlMUXLMrܑQ6Y'i 0^&`...5MNoo\.sf" ]]1MOjB*yr)0=ȹöo( _K#-~I@V[-"?øKʜ0  pːVN@840qR-[ɭVP/Ckz1c#m-CU8b'n> A5 [Gp]P ҈uBeN!2ϭ][ ˖| B?+@Y]&1cb}1 K/Y U0.; gV{ingkiEt Thnh  ݗR~$@@<Q3ݺ@͆]+%ԽTz@kOmڹ1jMxc-GW m[]]0q rӟ11޾{W{vp+<0Bls_B!g7m7Mv FӉ "VrIs gE:xixͩ}&Xc*@cvJ3~wir|V⬊{U?D$GO+}]1 6x`^MWјhN+K>;wȡ=XkW?,\$S8NW%O3O&ZqCـibzO*n!C{-+1mc~Sٍ i/c= 2#uJp&Aϰx LUH}fgWgݺĊ C=.o2Yj7rnh3.;; 9(B.gV9>Z}9})Hm4= O?MW}q{Lwxu}&Y<OB{,bwܻgͭ{j%>R}/[_d$1\)D HiPx c.Vʤ(`W{eb@[;5:G )@/2{={ Oǝ.ʀrϠdHrLfN|ޥV$$/hcx@RQOjPO=[Y{3^ޙԀ_hĀ8lH8 ).#Z^}˗U}@qI<5q>[װ9cͺ_>'nHn2#T1<#bF.TCs>ygAA{D}۲/e>ps gBG4sWc{#PERD*x潟S1@:x6g~Z3޾ikeK>3 k `z &}dt'b{άmtznalÜz Ll%_6$bSo?xBaˮfTgG9<2@H ~z73Cm#Y"Y@ӗ+\rsqZ4f{\8 nro{R蟒z6=}~[qh <8NΎ}oiD|zqJw\Ʊ elvL2H2^.sk}([ۇM~ kv=/ S>}Og' m@OYjlʀ J#4/u_e/s?"woYvH~L;h0Q*B7;_g(s>|gs}WLpbvulľSCJ[;TCkM#r5S0ׇ:9?$:A:>+U:_'ci3!.9sCcT__xo&9[qw%|g ޾%~;1K^5o΀dagr!"tx9XgX~SoHj=9#Gw*_弽}@#}q^m1o_DžKg={p0x|ǼrbDs/k,Nڤ%E˺@A(W=}SK ]6*g\B $+B>6G$=)sn,NIjz)]?N9\O9%=ٮ2(jpT~=Mf99޼GzMPPpwǓ sn,NHzm?P8 5>SkI_xIiZw*6[<@$=!TRi nΏ±4tbPv={J$ N<ñkttuzXX]׽Mm|,i9vXqKvub _B|r>6= ~D6xw;X̂H/7x lϡV)Voj>tI/\dpuF}V/A+ë]9/?va01 N=o#+qH8ܜ= ?hwky7 ow&4hd\lO-Q}ވWH~3|cXËdyRcmLqW=R,(OJ@ ]PNz~ nϡz"w7\dQPLem鷘R>Lwh#S>_msiw!=r>b9d勒|x@Jy_']Yrv34}|k;  L{[~NoѦX<ZnV}6< Eb5XՃ/DlМ(e>{9.`=7|ΐ8P+0QH RRQɽs"VLV* a[ײ@πt0 -=~qϾs.Pj&<؈oB ծDã{=}x"xϩxXP)HH!DP3n>*Hku5'b&5 ~ٜiR^}Qc- Ѐֱ?As.mq$^ DF\kG<} bCsONyȂbأט,,U$yG$yX fL:[;,_ӐgV$L{?Egz~%Z[:46xrZSjhzom3<?Ck(ٚHc"߫*{Wl !8{Mƞ W7ɸ{%g^%vRc־9 |ktRdl ]vU*Y󍨞{=އMs&DRg轟ܜfjйd1yO[@G(Z4W대¼h7!"OX:|0H1O_h)l=oNWjwe݆ڕ¢!2J#] TDw^R#5q6,e%s}&{imqUn撧jmB R:[r}WCԩ٤*Xٍ:׍Jn*min,f] oY2QsTU4MP$!F6=v;3A/QTAcmK[xC.쵀^w.uݞZ߫woF.ّSgUl\Rkh' =ckY-ʐ=J/K~HR@ZKa%dtiryfϹ Ɍk7j&=M9?Hr@ ~OSр 4ˇ3XuNRCzNlϯQճf(uZ]$[wsրژ~δ1vV@rZ`}r}KzkNrF Fo?u|(NMG7*P[fM{" և kу<^>]^}_wZ[cf?4{;W(q&Da{΃(a_Ƙtr۟v 4:(({,-]|e?E~Id] <X^(ϝqx=6{~@ -+[Ag U~+yF! ś<ن`/uS6Zz3 ^;]SʈH0A>nm1I%ϡo?i* eâ>p*+XL m(5 P|N1ץI>&@br]s$'>w'̀- t~% @y/)m 998 \l~G[{(տ;ƢA]Ώ\) Y=@cğLTts[.89S3콢!8k"|w;;n%B=Q5*&`\ٌwhz<NXϘĭh-$'1d<-W ycxD3]=O٠y*P 4p"L]юv2DzNfau65l$c4^ntEAYl%cMц   kHhhjMA %@ a 'tnvt۵G]/ Jj*Ȟ ӧ,}@l 65- k.EOEJ*TSRۀPpGAlx=~la6*Jo,P@Cc.Jn+xn qܵ l3jHaP " Gl[=TH@> NevFv<1Ff?cɎ;jh i4vr@elTz=][gsr=LHg0 ^:V6}648қChmI xX-K%hX,`Tk-Hfѿ{@'Pz :XEjF;@oHL@(P @@E 1HvZv3Erׯa7*P.5dpy<O'ٌ*@@ * ΁J @pڀ6x90 t9d<,(s-(ӏ@91 d'H1p2 ?1`/j "Y1,IX?V 1Q !ART"02@Uaq#3P`BSbr4s$5CDcdp%?|Fb͖VpΑc͈.Nz8My-PG5uK}:%?utpݭ(4w)XZpЦ9b*(z/0 e5GOUnu(ȾQJspzȦEka@8CҰy@[gت ҡC*je9(?'IeQ0 @2.ТPo?˶Byr\ PRYR#0ò0-Z*uy.jZ9OmBC zGQ@@jv'2,9:;*ud2IFM3\lZ@ΜQ1J9,&條ޒje5t^`@ln:Eb;v^Nl"9*cijZt_(2uњA&ù[RΕ&%XVzƔ2e¦‡Rۍ:*mpwr|_Y*gn@)|9 .f,UWJ>xd<Cf#0\alJֆ \%12VJBjH=c-C I5vËg7`s(NOL t94lm!( 7 h7mVؗpĕQz<ʡk+pd/ަzA<Ƈ& rU?,=̞d^^wbg~|!5 v"2c*nflfo19 p9G4Blg|%SMYqjBw@{9uv\[ikV*gnڍy u{d,Ca!)oRΪ"@7G5F8m6^{I Yrl;NQmyfšOrоL6} 2cz1>7yS΅sEZX )tqݒYeKVV{SvzN_쓈h1ɃsX>oqXo@ @J@  `I<v%d~T+dF;@%jy[b?a9y5 fޕsPjioIRrUݹoWϚź%/p(*QM_XKma)wGoqgFdB3cQJmi BJAXƫlia~; ֚r}yֱ͉̯Gv]\Ts}JJdV Og}{lŖ*iƶ$x {Ux#q=6h M6i@Б2 h@3S9wz~fj'p:hCR5&:Ì+X>@#kY̨Um>lƑi} `8.xnYm߯ +uENy:C8FHJGe&Č/~ UZ龄.8] rwغثgbkք!`) WY?yY_~ӊ־+v:98Akk6|&S1,!&N vZ7є@)zҞaaM9-o؝O][.P%9w'"ŗa-J$p8;BaKW25t"22tfTخBiv\֕~2!C Dq|;k2^o+zjU{&V+X|+tO8}|ÍyŶkV=H W%ۄWb yB@'D7M$=3e,6)*YQ}zxr[["zt֢EI[Ψ%"ma1WM\獲YIU[5į/1C"3^2#52^\* MQl#_i0Mpf9)_-7 ll0:׫ᵱ1'^1F6{Ǡ lNs.Ojm '_,_"XVs, IJA)5j1t1:)ͧ5\e+q%;9/:i R H$j24Y}bA`$9I&whZ>T @ J@ >9o}(ؙSo N83Rk&Q QӡydKfxa禿$]27#^X 4 HzV ""L'P km43'3REjdvAZAm|3Σ[b_ @\2*|Co[TN5 Bߧ.Rtx;Ăf)`:Nig٭TI'2I:LA GMxsK˭ZM0} BRb vVsSm%$@(FFzXkΉ O*m+NG' @D_}uۭ݀|C C/'#N¸YC X ًݡ,xBǐypfq[9!Y}hm4|W-D eG ķo׷ȃⴎ9ԸR!<%ATN°O+( j)7+TdqXnhw} !ޚYgfj7>AR>K*Nu+M(@O`"OZx$U6X#8-49U1DL</tfM[6Gaf~ ݁B\223w+cFlĕY ^+^Gܾ̾+3C~9zx]A~{jJ鍓]ǫUMQ顲k>_W2/&Ds_Ȟ{(lկw "\_V=J׻⿉}Z|W2/^%kCd{+ ?CdAsdغY<{V"w ޝɈ̷[nMu,,ZƁ'ba(3bSVZVd njk:vCqk24XyŻs1Ϻ(:x]aCԃΚZ%/9;V!y-o7ϖ>{.O;bV #:K/&C㮨k:I4.}XA[(%)I:+ ٚZUίs[Vwƶ-L5a :\I IQi462{T}ɯ޵Gܚf2ͥ%ZTۋmi!H$tahjt[2^,WLMR57ꭽѸh4*̍fbE ZZȫj2nIxRzӘٙ{^@ROWtq8$ 9 cDo^pcf?UliayhځFJ voX2'%'ѽb9S*7xRbI  ڸS9qyX.Y/ NcKGMf|&eX[/ -|8x#7ls`IfSjZ,-.ܫ#|Ŗ}*[1SX>;~>nB=i[j J q*}h"Oټ6fε/"Ţ*b1k嵱\nF3r\Fvv6owz ^CE뿰%HԅskbC>l:J+>Fsbh~|10Mw? ۘ[YdCMgz4=owbj@ZpE+XFCf!MRyq3%ڜcf5@[łƷG 6)DD(NV/ܧ(:EZ-ڭB2m9"qd *o;5F<'7|_ACAq]-PP*(ZuM:\Kh!IP~E$>J?!^";/8}d~ύR7x=y.d/c5;ku=RfB\7s_V+7;3tx(iO5^Vdkq>YKqՄ!J:˿x'R67<(M<-1# &o56??#]vмG譬MO$?) J\>ptU"MۀI^Pصե+8>an'3-"Hdžr=N !x+-|i!) <}m,v5ޛv"HyBeE_I;[>/7 \YrZRe-ZV&KpJPmu'5lY,O+{ֳobQ֮lPP.tJ{8 kMKH5#ݘƒ+ִ+[,Rf3tZ>Vvfg~s2B:j:NKQR2y-@JFuVej6㼽j[,7u)coc6HWƖ{43kcOƲ AU{˓̨(~Ƭ6.y'ޱBuC())*<5/[j٬\@Wd\Eyˆ{;[wo,{U|mXs$ԫoڳH)>bQI^xOI^QfkRPFdjǛ#$ [Zi!)6Aijr6/2Pr+$U-SRr]uv\Y)X\KҴ'|ѐkb 9_ #Fi >ϥO6D^/)ysՆ&N[Hj$faj4t2BR<OA+o 5aj5Fl'ss9#6N^FwIV^E{A Bd6.H{V)tnIȈ~Uq{GȠ<=s%7KkE*˄.)C݊ @m!p)4Ʊ(eUl:V(e-~fpg3ܟ͔(OJYIRϰV!?|?9 96Be2P ^'>S7RR{6L36Ҟíax`5GMmӉ Bp+oVIXoIZ \wqlºD[=E@q4ҜuiBʥ(cDsQ%[ۖͮlXB=o_3>_>OeLE,q I'kX<+vrQH:kWᛚ?N=ԧH@"/GyC5kbE(\_;X-w;>BJgX7.d?-+_R':dp[tN=*s}o߮Y~ǭf_n}o߮Y~ǭf_n}o߮IBy+yE}Ϯ}+7zH[`apb? taFRŝ'3gdb,'ei}^#ֺy}o:%JQI15yU͞&4 ft|oMZ{Aئ؞nsؚSwez)e mE*IQ=SR#J BƐEa7#3[9漎T2S-@bn݊q=\7Vg+خbnpWՙ q?v+ء0ड)@FacQ_ٜ"OII J9$i5qp ~lk`"xdԍ~][gJE`gٻWb*XG"D[Xxy&)'JNT#ݝM =P3 F>wNs M*qV' Ǯ;M_-ix9ZEF+ QCĜt4+RŔX?vOb^Reֆkؕ}tEk}~m҄$%)$ /}oyIpkcxK ?^\vev; iԔV";e TVO1#ߤL^ڏHxPywtAbYnB#y/v:k-[hZp-R@EYoϱ/~RsU|~Bvbh~|5ȞuM\?r?6Zo<iPJ@I+cE__17'k;M%=1^$ SDH V✝eY9E=6Ot,rδe۴iP &b)n8x6LJR 7)m7?o\ zyDբR̎䕍~Jb%+O}xLQ8<{ϕWR5|ڏ8Z>mI6#7{C=󝭍,o2vAoq垘A[kքv;#X8urwRW\#eWI9{E[0hHҵsX]oc<E[+S2dN+F#[{&b:Cбj6M\Yֲqu BrRT2  ) e{6ܤu1 ϫs${{J(s^㑬9+.'WE1V3ҫ0]\E\us /[XjO% گe9}EĘfݿmy9/Ky2t j9˄<4!JY v+G& {6$P_o$c+Ѿb7䃜t|X,րds']l<>.9%%ܹ[7e#Z#~$- B@LO񭏱^nhcKCgHXgkG$ aou bMg6, ]~zdd^UZ3۷цzPU;̈́ }{O@J~zOxY58.woW~_7k<+|3%z ~TFOMk<$fQYn2C\lfVѮ1*WA AX[623<Նl M0e 4АhV/ňeF"r`wFܢ9Z"cKTd'm)yˈSMBORE_{!u6>WBT RZmj=1[۫m}W775#m 2Wx~#nkPڕ6>@^3 ?CxQSl#7GD% vٝ⌥8kL„+i(ԇbS \6 [ٵۘd󓷲2A^Ua&YkF)Wa΅ qb6[ؓ4DY!ؒHdE||֔6VH$&[d\V/no'Ry'›^u[ԑ_Ti(u?ʠi(u4 .䶝+iCm`qz }SCдK6^7*ۇm Mg5|O *_9W0l>>~P5]`nHݓ4v ե؎T4Vأv PY߲uZX[kHRT4t'e{adyϝß{˔QNd?M)C_5xw; {(XB;⍒Urt_ÖiƎN6JN[Y͝+4Ro~1BަCk6E>3o+/Tj)ZTBk _ZZ`I@jVq^c'KFVo\f_M]2gwfCU4 T{$~ɱ_7qS[\$RZ VN*]'y^쩰_Ne̴KN\'?Rf M^K7Em[* e0^C /{~ƙxyzfbUm=d>|~9W˜9_.pO9PƸs=PX{h.*ъObn|z/~Rؽk_)l^߯/Z[b-ֱ{XOc^|z/~Rؽk_)l^߯/Zʋ#wE֑HQcn|z/~Sؽi_)^ߡ~߯vOZCYk^zߦh?Q׆%b˻Aޣ#fj"r./-ϡ!(k9u4+! mĔ'@q7,wu^ZtGbOU;ER !Q&Hb?Tɯ2+#L!S&Hb?Tɯ2+#L!S&Hb?Tɯ2+#L!S&Hb?Tɯ2(a G5CM #Q&G/Tɯ2k#L!S&~~Ğw z`ܹͪ( a;P9 ӫ i5;Qbi#6-o}—!Zؽu}9Jn>bIA ŠB<@@VKmj@ϜQD2a'=raEO>4?]>ñ-R<NX~/.S~{cˇ&͵$Pashe,#1X/Rb8IQ  Xi Sznbq.9C0~JDly4V o8=$ %%;|03"3IQ5nraJI:(qT2?1[\ 8YG\x<~ ;{Ö::3>m IJ R9C6Σ#MLϓ-[hI$x!ڱqc?ӝOpˉqDUr4jP(A(3?4);b $#4SxvDopF}GA82إms^Ca&1Cw@܅ v:H}Ǝm I f?‡x,[n:NQ;NNkYa.FhOpx<7_zleS.bfxpDh6:j5"Kw%ոH~Vj50b7H[>0'9j}y!b D@tSIP'if?iϽ|ڸ ƌWQ$f#1V-IhA9yDdFn*\BiFWRdTA \'@}R72ў =eOsx$;̴Ơ ht^r] tdM_;q_+_s_;_s_+_s_+_s_+_s_+_s_;_s_;_sCd+_sCص`qRF4_31 :5%Q+YbMGK-b [k>}_72:떞}u ZU/ߋ:jMLM[:PߊtSVLe>aξwg0YjaSm Ia;j|%{tp476mƏu֜ޝJPJTV| V_s  Bs;tbT|52KjWI1nsW{ycs竫[R?Rwwhh?:*X8CSmҡR79 .+j7g[!mt)'#VQb=eNϖ%\<\BXBT5 xIPa:[!xkkUu-y̮ $~f<5>kd9xnoȿt;YJ$MP[umJAspޤ"#0u=H*`eO ԀsyCR[[+BU V䟍 VkB ^fHjS yntVyW I,st-  >.yOuMz{珸s$y3)/3vV`8d<Ɍ`)Qu~`mޮF˷D&deg{a :d-݂`;+W*aIPaéߢޮFE"qO:]QZץD퓒Ir,PXY[9ySQd-ah#۵ٛj2't2S)留?C0k45ҺcS/7M8'm[i%N)ɩ3E;*l]9 TX?;#7(n,F  B < ,6 2wX ?@̌In;YN_^5‹hc+|?IUZ\Zt?>́j/6 &T3[{ l[DZe/&e:lQfG94 7(=mi>q!ZEeQv;+(PndtTYlJFǦλC뀫SWG)7ڣJ%DNdObwRII!*H"_uC2Fu4 BikCmn(%)TrV( Vŝh/T˔.)ǝVkW)'+k#(׭Ib!fKy@|9$6r_D9jÖ?-I)L k9Q}ӥfYZF:k653Xz~spa>5"ufNpW՚ :]\'Vk+DwpY5"ufNpW՚ :]\'Vk+DwpY5"ufNpW՚ :]\'Vk+DwpYC@pEt(P [ A\'Vk+Cwp}Y5!f>pW՚ ]\Vk+Cwp}Y5!f>pW՚ ]\Vk+Cwp}Y5!f>pW՚ ]\Vk+Cwp}Y5!f>pW՚ 1:][/j5 pWuf5"ufNpP|_ņ3@j~iV՚KYKH mJ2y i8"ܵP ObȥB*3 RJbYoҥ4*ɠ@ hAX&dJaH|n{\Uk+]^՚ t>pWf5}YCwx:Vk+]^՚ t>pWf5}YCwx:Vk=0"zszI<<`Pf()\ࡶ368;[ q=9ִvCY_ D^T._[dVJNؕ2[l{a5%dq\y-gI'jX(E)yv2;RmaƚzaG+ƿޙ1℆< J9-+ 9,:y2lm`+hlsd,7lńkKAyK %d 1wic9- uU-*Bԅ$F/JFS.J mi J~@m5j5 lny6kz:{M>0}r`0P^W0j텯v|i^bA?Q`s% %D9.NI Ws3ڪ7}Lvm4d>iC0\djڅƤvpg_jkeh?j4xp it5}<ߋ f ZcI~*me|YNy4!.3m:k÷[޼;w+Ul2c|¼MD.&i-8QeJ³)ji 6+'.Ʒ~7wwCb[_5ivq ڊtVC`4?.ӽkZrV7"W!HBe]_ m/NCiE4ya R7 M/,ކ&_|k;URGC݄s*Ӎ*mr^rR$* txLa !GFIL١u*ۃVak^FrkOwGXE}n\,`6N${VG~>iG kZc K=q9Ɇ }Jw_tWBt> :?x)in.CA(IRq]&s59 ObK$Rߵ+D2t !rt PjRBig7!M?RY[ %$Y ;V7!׏ѕ;ryM砥Ai8Fkym> yf;tmБSÐ/?~ 2-4Bj9LiNk2Yi#W+ s4q>h*1Ehk<|V=ʤΘ6Sxi7ktJ_ǖ}s\t4(ugB [a\\FgSh̪&FP@s`Dˍa"s@Ql)Y, kGQ{% U,- ϋd{;?_!h76$%E!*DjFٜEq/v4{US'W%%~om\SncJT2""jj+t9*49E}m/ZEA79$IOuUdr? hA]݆|+FY"/32{—&8FC!)=XW!]L6, 0q4BFdbK[$jZ*/D{pcdӓ{rS58ik454=V\[d`tdYRZBPRO s V{AUr&0'O~\+,Iw{ 9gyT\%olxEF.\3Ma#?!s>lUNkoWYe;k'$+_x]L"}_}$ndz=ƮZTb\Luy4H*ez|sΘjCUYP_FXanldIHJC:3*>*l_7$Ri/fꝎ+aROtnzJ~#c$Dž/.=#&4}4p~1.Wt/x^FxGIKa֤d)%R@{}Є>O J߭esS/JVBURfAiC 3Ng:Iw̐Eer$64rr:]I-v'#7_$u䜎|5QtӘVJ[%/6 $CXf_% 9!V^NZ'S4RIEnZnծծkZ|VVk|V[ UVBӨPp[k|o٭tGG4|oQ5'Q>>[c]ok|Mo5Fݣ]nѮh[FYt/.3ui)M|I=Xz"NHϔ.Y=А9T3#I4)-ͺKAРELs?\F67&53sQϐW/vݩݪ*54P}Rϟ"GٴTBFHHBFe{Y!'jW>{Vo8?Na}&;RqBF|5{IE^+BO~3-}>bnHWE_B=\F3PH?1 !0A@PR2Q`"3q#$apBc?.j.Z ? ;{ODgr.%ou}rރB NrEīv@ܓj~)kBi#sW+d??PNH{{%sS&k}..=Ž2r 8 J .7Ӵ;_?"I+zM{suZH?=%9l[aQ S)ۮ,mL8c5= Q/pI&.ŧ뱻nC4/&)#e4=,-h*H78]I09o>؍z/ RI=i:I.|q$ѻUZLޭZ՟$;<2?6 I ʷ`8i:޹9.H,?VC*y%b&it 籠MUrz&RKcrM<eHi]4Gfv4Nm _ 33~c.?'}b\-9]gu ǣgRi`{Gb0rT󊘃ۑ@vv kg;s CrZm}Fٵ ok2_[=0rS?rDdeQ^Nͩ,vKEWu$eo}ϱ7@\hjz:˚cS]v"Fv_T$?ЯI zwV? ەrUƲbF\t5-qZb*LJ39wd!kv!t~_qܞq==T"pz4I&J@3t9cnkBU_Q03# KMRsPfE1V0(co'u&VKJ 1S<KGn7 '0QςwktC j$K7OH8 0_7E ic+n7My];kl8+]iJG 3w$7)}vtA蝑Wn;|3W:RQ|G%) O檨mOy^f}׳o}׳o}׳o}׳o}׳}q?/^?^Ϳ^Ϳ^Ϳ^Ϳ^f}_TZ2=W.i´Yn`6Xo H*_d2-Y! Ҫ]wvFrZFKtE0^mQBKuLyLymy="|ݹ,ͭek:3z&R*byAVYo48pauڇˎ8=ӕşۏYV7DU{: !ǯm,%i]3ݞE=؉:5n )|9{mP4g&4vrv {9*j$s-1]֦=z:qB*vR¡P#g}-bƦL#!FoNӯK Z`vGU1W6ǣN GJk V4992P7-ni&6x,މ4=h "I<9lL/vAU:S#}6M:mhJPΉل$~{T{#sUuRf-קP:a G #ӵ &:کij]/*ZM {y(&l1JCfqmW @[_׃@]߲_o2h>H mZ#O]Yd8vkIuHcu܍rxO`]1T5B6^֗-#Xj/oF5l+Siݶ ]"ߘjg=98/~KIVuˆ\^^}mhzK6Cd Zvuvv i W88[ih--T:s:m3z@Yh*QBxlM'GO!3Д 0 ܪ"a#r{ @Ncw%zܹ*M y䧔!yZ7I;[0rT ~Jm=^C'%UᦌOyyz;M|SˋtmGC+5rq4i (eUT¢DUM$pCfE,W~e ܇Uᐲa߉Nj֌+ ֋p\5 n`va"Wຼux+]^? WWº^ux+B#X̂l!NC}#c*^x5fJѵl\`9p5pϚo,8u}_dPz+rt#Tgy],SL;y)zB@_ϒ{\|zS6:oFxJ¢e\!;S bqF+Y[Uʊk=px;d`mܴa.J>v:6|xZ"K@(+8}ᨛ T8˦too?⢜gvnCTȫwGq =BYJZ 3~a\c1r `Nyy}coIvږDerS)/9à_Z}K9H-@HܐJM#lbܺ[*U 06@3*I1!ǥu {o;'V5 ʼn[buק:[]]t{6CvPJ݁˸EKKVuj{s9v( {5?ʨ~#&zwSIevYi^%hnl>hJ 0H| Slõ<'PM\FVZbT,jm,"&G֝l/6-Gթ?3՝jk7 BaOr;4@Rڈļx޹jp,7=.79vY *C{Y5RsW`9bi x0{ MVxM@SFAWt2tNȦŧo=ςς߂FC>Sܓ:lډv-h}$צcf'O16=Kd:upUε;H7 Cup KOWY]ЦЯI v\)%ߑm!3 MCy_EBdfi󓖼yj/)n룲(ϹAS3۲lK!hj ,ȷ5hN!4NوrNyv$ʂ3Mprˊ\5#9(Pᜓ8W&˕Njfw-Va(pl쭲symJɃK<tyD0 F,熋$.;m8nd'bE>J_|/1n0Xw<eiy+nZt.dvMNZߣǰP2@m{X+ꆌs{ߘua8Qܷot.PqN}i'}њY0tKdBFyp+{ 6Mhh[Á!>`V+I0gK=mEU7vi<gSӶ")=w"ĽĽA7g+Bz{=PWB~zoG2hcr؆2s\:cnNpjuMO3LˉPVOfupo4\֣;LýMgJ(Ϻޑ pY/wzޅk4@Dk,GU9S&c%] f )q}e=ZVk%c{kV[4ú{ETtzˋ<8r@jOf4r[]2 +-eݳEw#2Ɔ çmu g>쓢-Dj& ` @Nh0n[y56aa౽!,Qˋq줦NaoɵMuXyc ͓5[m ,;mEkYh}qJSES:cE>GrkCE Eu9".S`.5boA!*w[M ,=W@8D3&| UC&:yW[ Q3=^42݂۸94C-C#20ܕK(qis:2i I}22p\,x8DۊeeU6m]#H,{9>l)9&@96%7ť̡ wq73]_]ʹ[n ]b+XV"Eb+XV"Eb+XV"Eb+XV"Eb͚%7Nae55Ə'DI߃DAk e5hP=@-SPEJXhբ;8ËUv5ThGkM gn}c `6GR9(]rk9ץMfdf7vjfj,/$Wn)TOMƜUw lqW7RVYZ6y'jtCaoL=UAZ+3O$+,ͫ@yTmRxClTNEEFNl~?~*:ѷI6ޜpTva6SQecq;@zSMSu^[#O7h:!cf;0# jW)쩚ڃz'5d6hwQU?o&Y=~dyq;F(Nn.xD,vO Bj>bUc4!7<F-$ 9&g7PH7=^%i7hrpӎ A|֗YxCˣr=Q`X§&y%I1*z8# PӤWkp佡 覈!ax clbw訰r(l{^Ng$U~CG^>^!Z>KkácScXjY5cXbƳVjYf՘miE= h0_㢢ch bYk-e7l N0ߗYD<& kSw\t lMCerJN7wvUBpR䉻"9F[3r*pB䎻Y SwdMpG~Sۅ[czI!&&4W mN=[0o<[c8'rFƄ7e7] ze df9>&]@RSFQЫ鵳V~?nNۖ3?=]d9Pzd>>sDy% a@N t?%8ԓu-#]w^q86<13BOYjp8$1<8&nL OriC)~v2V*׏EzK89ãX*jǡpNAA (ZYjSe+U#:µxz#jo<{M9r߇7M 1U8QU#nFDº8bBRYƳ,Ab X kX kƪB ,mXرSp'(HEWxE.Vl8|ډ$&ꆊAI)ĠKBſ|\>uLuaٍUWmB\Wq\WqUU\WqUUUU\Wq\W@֓97Y7xY:`yz ji:n&öSZ9CthU,o]|ZEhM*=EU4U܊'J-V{e*+406eC8ž. HP.4 iEO &(EiJulǸ≥5By2Wڜ}D8Nh= 7ܛ+3Th4.V; ,̠T,Co أ3Vg~r?(.F2 8E# U%Vq -˻dG~7?GMP/48zQ946Jy#-{]S1ݳ'@<|TqBn+[w2c5/FT*vu,{Ul}Wċ1fŚbY1f,Ś58^V_Fh7.˾ =ȠcF 5AcNXԩ ^Oיr<:2|%1؂': VSs cHD1UwY EFUTENmk{[pۯF])e*;_D# *"!:]3mjUW"]q$v즇D4.#Vp#|C}? ous:uݖ7)OKJDǦ. ?\4 1}<mo0-/Sڛff3+DHdv1~]69/iiYo?E +GxW4q<.%ZmNxmr>|(U;1Z&Gv:M7l#1vDhrm?UqBZ ߓ $~_Kykjm6dM4F-n@vڤw?G^m#`)G+&n(R5mGe|Jy;\r#V=J(,o #Dd*{Cq*{LUrGeۛ{&W49pc.RZ?[xkvͶq\lj5Ŧ^i ~A>G?9Ǜ{#a{G.]+dwҟX/pr}{/t-}E$GEm/M?:AsÎ| ]vg7lvqY<(= yEf4M[I5ɺsoϰoAt"?N9on&$Us=ٸ QZ.'J U~ <:o8Pa1G0ܡX]eY{~a{$ 9/cN 0tn}]MXh N].}U ĭ7DC}l]yEnhdefӠX"X"_*,nX܅Z19^\lS;,vYL척e3ge)S;,vYL척e3ge)S;,vYL척e3ge)WFcccccccccccccccccccccccccccccclXYŖŕʍeFYQL}L}L}L}S;,vB&,1uF0lEmc[L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}L}P*,+ U7_Yee0e+ V6:![T#T_QQS|&|@K19BL))0*ynԴW`STtYiN({VjNuP<%+5{-9oC‡UǑUTTe,cOT1䖢?PKwL\Hf9limit-login-attempts-reloaded/assets/img/llar-video-2.jpgnu[JFIFC    %!'&$!$#).;2),8,#$3F48=?BCB(1HMH@M;AB?C  ?*$*?????????????????????????????????????????????????? f@C:l2w 4zPٿD 9~6nPf3" s7YN2" Y[[=q1 9d. KB*2ܵ'Z]cj"@yM6)N\hHP&/"@ 齢@\f[B @c3'qpD)1bLP"^ s nWtY |@ eX@)D9doX2wZehY) P-LH\K+"b9Jxz-%zT.@yGTLs \iDnZ&/ S%.-eS&%stgeZtL1!J@'+AnR-¡Xs `񓸸I)DY6􋖳D=")H=8-E6\arظ"s ]_1g bĵ/J3 @ gW+hZK BrJe2ԦV.ʀ&''9ndʵԵ/ȀygW)hfV$'. @8MNL[p@&''2.)HO$[bJHY\"S(l@B9nd{Ym(J)h["N@KBjJR. brprzśi֘ ['|' D[rbr`HZ)@"T/ 幐3'qD,x@ @@(RBR,ʅ998[K+}J,H^$IJ%zU% 8vU*r fU"LH[ rR+9ndϮ*@ BԨz (BH%p2WIFҀĸͱhL^6< @"ND199@-̀tfzuuO. %rlPDY0&''P2`񓸸I-+j(ʥTDG }T*$Js %ە>#p@X)@.r 'p  s g[sm=:KrpRHV*)Ps q&{# +9nd Ԑl#@.2uH6@"" D H @9nd Ԑl#X&UcmʟA1>ԫ6uݦ{ֶt.>ZQS$33īȸϷMAs,=li|Y1^26MeǩS8&askƛ^hn]ScmoAH:oASM֖$YYuƜl=.[ucr3<>s{}U}n<靽Q}CljZ+o/)uUs880 >[TgUXky_eKKAǒc][T:ZYN h(r ) sש G9q978UsG75֦eBgU{S<6w5':{mz@ܴB4ea<[i+鵚ޓqP, ʣƑzyQ>7ujJfT=CuU#aԍ:gmU3u0G>_:~vVPc2zV4uڕ7gH^cb[mʦs¦kj~\Svz7~n ?Aŝm0!bfl"@NUBB1̀!z s+ʗzzLW4{o]UsGpELso WOyljOK4u#> ]h?E嶅5i O^ySq¶ƤWg^`7鳪.A:zUmÃc*+yU[Mͦ4G;BX[Tlvu}TƭƥC>i 1HfS\{\i;sgӕ6z|N\ mmOVYa;xr"i?(Gv1&fCNȪ̜A$$ @9d Ԑl#Xt;ևb+uU[,|q ]h?E嶅5iN^QsWK Myljn1٦?AˮƤ޴>TPvo|m󾦶,>]n6γ'nS>^ZWtS·zz-Oo'mIuEVYc3aYmw_e,edY}O"dqgA\}^%axQz \BBPcC:$"V5.'.clBenb3p Sm9*.ڎ;}OnZymMuDߞ_2?gңvP=weQˉ5qқMgk^Xu1voz /# YA—, uM>[!(]aU2H=~x;;;:b+ANY_t?mIL)*6o>3g099\I)6{fVdѧJ5*Ǯ; JUwӖl0)651>k mU}϶Q~"Iq4x1dy{p*?S^hؤ.|;搬cipL@lD幐3RAr%as A30%kjgdKCc\6M̥" `rdIE)LND%,HNN-̀!z s.'bW|^~=}0Avll:ŗn4.uִ4weWUbl'Yx ߧ7>~gPf-%2V*幐3RAr%c[Yss3I;s>y^i^yVykkZmwۖ^.|ҧ);i_y8A6I~ cO*sFt m}>_nl; o k+ssϦ56&ͧ͐͠!))Y tV''幐3RAr%c[YS oJOn݆*/Oulg]Tq!.U]Rm;ܒ4]oEKfWkJW_?cW]4Χ¦K]A-6ےL2ރ{Gz/s$s`Zʤ[C:$"V5.cY•Klzێ~FVgoy2ckJ~->zk*lƫxP]mkLƵuϙMIp9֫ߪ$7~{jS_a1eg>ذm7=Ysnնn/Q5ifR$'*2!HH[C:$"V5.:mlPls(V>֟ߪmaO-*m6t^zN&T17|mkS~ocRbj;=)o 5w>.ޞ:{/ص:^ID& ۠B19L+幐AYl Ԑl#Xֶt2S]RmZk̶%?O#UJqϫt}\_5]R\D}Swnn-;k).;il{>>YYٹ=$q=+M~ :ڟُ"8ΪՖVIfFuVyasDz//×p)}<2SMn;h5[Nn:/AqJ3c85'7H)ERbD@ c&צWL\]9rDOlש G9JzrϡZb`xp-0i|#&B0.- ??~,%*ma3k)OgrdqIJ\>Da.-pIRm{ 8@@P s c^ad`ƶiΓ+G^uH6D0gIf fl%jll%#rc2bC"Ykl%E2k665ilZ"W.ͨe "@NU[0o&L^-3RAr"W[C:3Ɲ2v˹vtdDνI9ȱ0i鞙l`y+ F=C0+2#\25@x)f & HY9d kQfŸgi1qrxɱH` r zl~} 2cb9\tdΐαd0ηu(P+IɉJ 9dçbίv(gt{Ek0'* @BBܘ3̀!wys gMǾmw47xKzC:l2w/ 6b -\@9dèM晑6okFVzDl[0rۤbΉdQ*ay9(S^Y"c]9g\i ~fezI21cKc1 1;Fw ˮ*3u˾+lhqltyM61* ɉ9nd_7%9wb{iϲbxjzś֐f~~Wn>Ly=\Ds g0LiVCKXknC:l.2w 4c C:=yyujYwWvbbp! gMnkZ hq::%@n8Xm/:nUm:sgӝN~Y>> ɉS)9d"A&c3 ѥzog`~y6}yڴ9Hvubbpd3̀tke?rFG 2 XxWM rbpd@J4i,k>؎DS) /L!7Yfi̱fٯ.H-,@2!T&V  !1A"2QTq 045@BRSars#36P`bCDc%d$ptU&?cfu9s:*8F=LZWkOs*:kwc0@U{5tP/RD%jNk2oi^(-)RNE ?T*rpŸBk͓U\:7N\;i_/Z(i@yEv \@]n.ea*MZW9i~wRTMܩCeG*RFh ͹H \[3 JJa t!IU $ =\} 6r$Йrk2zRAL{&W48Qx`kM˺waRiE@KE>q,ܧ! s~?Ӎ>;E(- P̬ L8c)J慺)M Gʮ/c"#Q%9!"ӓ.\HNU9Djb JFӥ9dHzLdiyEvl *)'Hj-Jj=+C;(S H*+5fTT%2BJwr>ޘ`td@b\pISv9KE۷).a"sev+R4c9D<ήSJe݄$$!K jRE)D"NkjuU$&H BUJWSu$^.ܢ.-浻@m#Gܞ[3 gm9_4֪/dV؎S.j{A%DptƱqiDWc4^܊r5Yn/ Mx!n6ɓ<R3wVoi)J@zcSͦjFp2_R$溵IEevwkuJm%I'82¬e:>Ieg|v%I̡X0 @":R2˗ruW!qZANPI)a HBnpܸgbIL԰c . !zJTUEh@,ЖP)QyIz:g?[2SwTJJvb %7 ͥE%YFՔ/l/eˢVTnK9sx)UQgO`e:"hBAel[%;m0ÈIQ'`31򄪥WPfu0$P ;4~ 鵊wrɖuH!9(tFNU40ړB6JOJIۻ*E)h fE2oRZS.53BdV 93LW/Сk+P9`%Ĕ,TnBupE9|Q4f^HZ_m%ʀ6C^')nܽ mP!Td*NSO ݬL>dmvv((wLك!3έ_>2җ^Nnr{L0ԲAUj E|_#-U&6 BD6h5&RN,6]=?))4EIt9tΘq匛\%lᧆD]0g$2Ӎ<@9DS-U͛4nT7XN]t!ex"2ITr-[: Lj/W!3VMNkB܅^l R`R{`qT7@ @ sM魁Al٣V2A ǴNMJ*NՍD$\MԼc.a I%bG37'1ٹSo\ UR`%Uq (kD]݋IsÊH-M7#R%9rTe64t ip|N4{EXZPFjভ s5`{6US.|g"]xa %"Px ))E`-t{%2f!>a) WwL#QsP8هe/# ^U)'-Is>- Z֪QxWb3Fq¥l]FDs?-3LYuQ'/(G>- Rk[CeSDMۓ/dc3WZ%U:7Hjuy;FLRTpg- ӏj @Vy蔪]ϋG|G=V̴_ȥe،sG>- <ϋG|CK m+DMʺp`[ [V|2T)`-Yh7O$srC8A4BgQVΓEiNi-wO$1j }sF`m Z[ARIy={ Yw̪CVY$}Xhy,>bǦ Iv-@ :ė\%xF,%o#3IK3..SWe 2BFAMx%UúFҳr_]0m{~)b1׋m/}~-# +QZҐ5Gk51œgs\KgrhgNj>PoܢoVm}~$,3+:h VLHld!wS;ven,(f<-n/}~rQIFTND튩~.利IU޻gJ!v%,n ir0aIitU0sB P(f<SMV[҃%*%Z=X:+\g΂3F&6W]NVn iӪ^:e~Žc1%Uwp3 -^fO~#Kȸ4*@XpϪyc>*esry*c $[ʧ>HqkWZUpS/N{nӗO7cˡw9%FSń5ₒR0aʺp­ lxOx%UaM!,g'Pk\2:+\g!͒'ʞHPRIJJpqJZr/j_,HZ "ȡ'GMu/2?SGT1☒_*;Gs9뢼0/_n&28xZr>yvIЪAlpcGY;I,J4֫HSms-VԪ;L'$XS_4 🫚"K弪x=s,Yf鼋W,J1(t\I5X q-%?wY.jV 4bizan` Y&\# z#c&Cc1#"̓W'Inu VY9>^s盩 ժsLf49=->kW 0xzE@ۂ8O&0LIu|O<%o1YlI(=JfqM߲(%E#mj,W-;ƈ:\mU} 9ۣPT$ œx9fDŽ\׉]_-Sǎώcz$x<'Wz뜰bj7QBдIa)r@Ei̖H[?aGS3 `tZ_:ϥq-ۻ}`^4qh~=v IZҁFLVn iV{pG :TPRMAz#ֆ>t/YlI(?L'ĐOO5I<Τk:N{MbM% xzcŤ[ww^eG9 u~H_`C2÷5#>jnja]@o+oE+ Ac.R(y.1bș|yO@^GeO'*a@E+(d ĥ3'{e3kM̠jHAVYnkĉ.IDy!b~#!. B"DZiUDoF26ҲpF 3~u{ńm_/b=Ym}́F%L3cnkĉ.yu_awIbӝ/ P(? ~`Qw AmŴsE1d3ڬ{ߓy;#0pqF0Anu++roѭLKs;T $-K+Ys ~hL|y'WhRAmE':"ղh^rݬkhgƶ?ێ%Fj5-).nuKkZV5xkPiBkA^v+4ۼzBrQ4s*~_64ʸnklgş-rHbiM1?bsd拕s+ NisEs64KO,&ݥ:#w$kk߳[G~{?5w߳ʳST*5) BTDzYz8oNWn8O$1zL2lBR4 s\U wi$#fO(9hoОHE>%~2$m:CsIh^OJ]!$ թ*)v nmoS2KA"2pPIJsuC)SK `*È[K-( ŤOhV\1f.Qۚ4WWN^e% dJtL6M-;d4.ܞR)y S%FHUF僚W;\f0s@#LaJ>1fu['gŜkgK0V(ؤ`W0{IF5vѿݢ,wu UF z4 oGbzf-;8R0Wo5q?N0W<ߣm70Ӗ۶JY3x!vOz Ϋ;>(Ĉ:άzPFuYrb´ y?V 8Q,xFm澠Os(;UnŞLMo6I4+ndSҋ./ s\.rM0s@#LaJrKbrLbfIB:8sDŅ9/%)Ю"ܝCZ*A9Q·tfZA)f<3FYR|*1oukHeT*h?ZbNF^N3IS97|q[F#,՗ zջ ce_AYHiڅ=gt0I\8dײ0LIu|O[ڽxmr^GRVݬh9[up <)f<МذVRX:vf+}VӸ?D:LwJże/u{ BZ`gHݸc@w8qm-LǏ# A,g1 5'/,N@T8mףC-)Ś%"t󎜗U6An?cNOVvvfr7ӏzTsh}SEӤt ͍4Mb_ۥ,%UC_-^aD&{uC)>KyT/&'XYYГ,eP{E4+nbej^*6~qv(qRNQQx'[C|TE}10oiţ$ghvUUPÖ@%F&0vD-ѕB݌&~2M6v! 3B)5]ˆz_09?O!J*QRQ9ɋAS/>Eq[wsCn)7V3Ts|${ꗼsSW3r|ȣ)Cs4%*qa 9*K;s\8Oh ,0 *dQwY7aaSJL-{ԏۈu7ZV7Rk a-$&YĔ&0Q~6HvQ0ϧB1 aO8ʯ4wRiG>ix}X– .Q̠֔~}س/ iW_]nFl5'5fQ<[7Mzy~ybضGPZ4EV%Yi@SV|^iw S,{jZչRobѝE"JϞ[7MzzٽkO,k^yz [=N itĚ,Ka}Yq-2!w3,ucI4GS0vie|Uz$gee]'hfIKYEizٽkO,Y6ޗ HJ?{ʚ% ),HaLr4[ˊ K*h10"X׭&DXae/>׎HEWb׭&Dŝ:BEL.=1Z3W6QB)[5fQ<[7MzzٽkO,ZC)eM%R`,k^yc^ox{רX-}T˶u*mk^yc^ox{רX[$Q4T|ƥ% *Y HtDY.7Ä_('Yh‰) %]iw rŏmKZ3!T'a[37c1IdOqX6f%bfYWS ) g̮/l~ ~h&ƨkkyTr =!b\vcF`՛w#vnDsh}ٻϻ7}- (|ݏ_Ig8G#{X_z&i jz0 fω_awщC&fZPvZǕڭyx4"dŅS<̓νȖvL@q u6TPLM:{YO 3NF0!$auCi>18B0Cf~F5u9JYrіV?,<>@{ʌ@ɉ!WPs~Jz~ŅF&|bo1ѧSt8i{3vT:%<:#<`|n1]P^+ ptGCZv#\ }%>ǂ?F%=?|Ʌو_aӨqdD0u-/1=h Cm5ī0SXEiCX6?Co91W,D? OzF}=_z0 ո[Ó[y>D|c~Jz~LJic| )b:=S~~^I?uQR#:O$kB]U?(t{uq*S@%&MRa^TX6:'1E^?9( _ȣ~HB(,Iw,KW ł?F%=?|~1sKX+bXci ^uu`x40VE OO+AQ5o3SW,kbœrбٛzZ[0,D?i.8>=Ϻ!A`Y>x#bSawљCLG[={_aO ͣ, |{c)v#DM#Cih "-ZSHsB# ptGC0]?2ͼBjc6o+ c CC2(J.R(6?]bo$YVm+%奫2N{ LJHL3,I&|$~G;+^MiWt+7n8N0M'qcS4E2s,R8# f۲'?=)L ݘCT"VB]۶Fu =Eeכ[ -()E#͚* x#bS,.17{,6OSriv'=OpZBI&ol:a:E%.K@xZ73XK`ȟ~Qh`~dNZ]Կ|X#bSaWY_+SӞ]|q}d{˟u1BO|'8Għb˕hC)I"B%)3eYuZnt]T$S*cF`ʴiB@c_Lؓ.ӟY8D&ҞNi1)s+Wq\é}FiEfٙB{9{ ptGC0G<X]o?0ߡH,˃>_7|ϛ/ Pqa̖ S6(p-ikRX- R6- NRhe4Z&԰^C;40VDW]R~1k Y } ݢ{( I(~+#>~w1lj6ߐ(G@+-X(Xxi5|x:ϐ>zczq,^ح=FWdRil+ANmċb̸?w 0)e~m/lT safZq. 5Ro0 [Eta1+ |:![m-)F4Għa${kzm: U5p.eN')&&{,1\+*G Oc>t&0zYB튝a)( R1bIY)U>+gs `\&fZiZvk%U,!(5me@ۃ{uQUsFHcZOoz'=XcbX^L>|*K9=B򞟸qawyC=(~: noXm4HR(t0jfA.Y_<8mn!)j:*clJ{&]tFusr*Um|D|͸1yuqjq[51``/b}Y Mps{0=^~NccKU*tPHł˿rGy׶|׷ s6;ۯ: noQ?FOg|eqlr}Sۣv]ˏ4(S;>JbŒUd1(_Z+R8kSb*e/uK_C̺ÅSkҡH[/nkE7j8. .dIv%dQ !A`Y>JʞPU{jlCM6bz?пxoԧmsgЈ՛w#VnDsh}ٻϻ7}- (|S#(Ҭie#M1.2;OgvJ U{A͏.`=(URnYP5Gly&Y&BkKG$fQ7&PT r#VnDsh}Yϫ7}9fG>^m]Y]PD5"jÙtuOw=UrƺuOwU\/꫖5=ޥUrƺԿXTzURc]S_W,k{KuOwU\/꫖5=ޥUrƺԿXTzURc]S_W,k{KuOwU\/꫖5=ޥUrƺԿXTzURc]S_W,k{KuOwU\/꫖5=ޥUrƺԿXTzURc]S_W,k{KuOwU\/꫖5=ޥUrƺԿXTzURc]S_W,k{KuOwU\/꫖5=ޥUrƺԿXTzURc]S_W,k{KuOwU\/꫖5=ޥUrƺԿXTzURc]S_W,k{KuOwU\/꫖5=ޥS%Zb*b*b*b*b*b*b*b*b*b*bfT {N]ȡ0E:]a2jϢ`Y(fbGEPM07Y[BIfi(BЕ {e슁/ntE ]*Bsƭ]|+ Qq>L% N y[NwNwyo?old2ӭ47"Q ?R(ri5iD\ZE9 tf~TO4@)T5s\d#k`~NTBb܊D%5: ;HPMJF !P$*݂ɻK){x([W)[j!E&f0Ff9 zۑRqV672%ոSMID-_x7"Nl $'"GeM|kã~j/wޗƠ{_(P~>eg|v%I̡Q򘻻4EN"@L%еkŒ)ShmRrS HJ E~}S&yEv bCxh@LjPj3䇔rpՕ]@5RrpGg3ky)]Ȏ}Z;qϫG}.9h>y.93!3rulΌ=s@1H3ƬM5U^MO -n\5 C]~o/kB&Q(r u4u)4'!58i.ʕ䦖ôV|ʹ Adb1HREI0 y›F~jj &Arr(+Z T?Ԙ5d}5q{Je-'l/1!rl>]7PH# 3 E50{&s1$#eSLӞ l\  n}N!Cc2@-K~sDh4_|Mlڅ❷67U(%#4a> 8*O\<E|o.\ѕtC4M YAbw[_4/dkū}-D 'QlnjK#ZȵeTL>Ⱦeg|v'1 %WJNœJUBFjh)Pu<UQ#NHQNVFk?k泿E4Q٭Rl![Jtn#Ah (h݇v+vEw Lwv`^TҀXM̶|aHqT&Jl'biiXR-IA%h;.\^Tܞ[㭵 j/ as[hS*YIMnrīJmG`$Pe˻ 2IS9ՏEq<ό# [0"DOa/_}t}|N2{EPZPylT Rޢ !Q@>wqկW^,1b-KI Zsr5/\fDL'(m!1~}_&yEv ZFk?k泿Fl̢rukqTx/37'h>SflueJ|:Z}  ThSE\{aX5gXߋ^vINΝ|ʹ JEDzݨ&ڠȄ- NNcn ZV6 .޳^͝TIP9u?f0jglk``n>[uZ#HHri3pdWRcEIPD V`O MԞRcϢgQe?d;l!;1WO9N,$lW]t!~˘ `td mX墑HHvm3EUAƠ9FST5Ӹ!НP5WzZyPtà-TNJbqim%#91n𞼏FDr bQ%.%$`v0^~dl?ēZq(BOtCo:>H(;u'u XAN q$'v0.eZ0܋ϰUZEI"A4"&4K/MZS]P7?lIR4#1-m0SMqNSg湢Evl >UtBI /ٽ۞(L*eg6JFZTL7" 7g6Q Aoc?IS>`8ʹQ6QHnI8J HRPI"j2Ӎ>;EPZPVʵe Pt/(Ln}iQ]{$ Ґ[wNLRԚ49.Q(2nĥL/nvE Pct6KT806jUS%ކ3 n?,!1QAaq 0@`Pp?޲Xı+ pz`}Riss,r_+[b/Modè B5UxXuu.xW$KNkmZ71R] ikqԺ ,O0,P7](g!4ˈht Z3x0Z;MVj([V3 B W曗k K=t7 gy6FdҺ*)2V}/cO!if0\@W)—ܺymXЅë؀ꞵշeWrq1˰; pRTkFJF.`2so9qL9"dL|( t@P -Q1d֭vz_99=8zTt/<1T}Б:L t7MK m*˂)V.ym`Xb7o'!~EK-wZ<@?wQ,O:w*OJؼBCH7+taSĵq<+$N? 7aELV/Ah ֈ{1e畠A$^ h(K9{DƉM]BCVû Nŕ3ieis4W@q0?[{uC \ AvMcRj+^AFY)`j1fgUm~A"4uuɕ^`o`KZ!ڀx4rhg@%|k R.-PSVIv9TZR`/x…asPc^Mr%P]>TU9bS(47jhhƍ-(ds2U,bbn%RT5-V}\ xn % t & INy3fnep?ɇ`T]^E|]#kb{S]5Z9CM~D2=^hZoStg9w?.Xާ*a0W @=r+'֯jԶgQ@(Q(!6rHB |}evwjt73ҝ f5F]a*h5q0RܥUai`ps, jȦ>cEA.b y}fg9]g*ϿzI,Of[#cr%jXͷcmfÔuYDvLеC9ɀ4| *{J/9GfũS:!%u^I/ Ղ4kF7c`fʵyoKv+׍A5wn \Ģ©e  U-r:]at(>󚕶%ޜ#>ц ʚ{43\W;h,Z,Y,Sޯ"Uj!hKjvraQ\W.D;; $R6++̮B O$;{&UkFSꎋs Th6Њ-sKjhybH,:z/$ޏe,ǿSHl 3Pj*4(#bhX. Dm{u j@ҧx_Qeuݱ26[x8jW"PqF*ҵӦhZ.(:-=2^SMVWY>6/Brb;/G#cǿ@9 VsMCQ$zlUM4 JLk-*[m"ٔziلvÂӒuBkDo+NWZ\УTG]"ƴgRd)C+ȳ$Z:} `CCz'qP瞐4/K^M̲,$w)~8iVYrm`< CiMZldlצx%r/. [y0Qi/HtD3 @Js[befZ.UM5$h،[W]ߢS c>#1[ p@-aq /3 3@?wЭɟ%V1.P;ysP(,'it0 " &Eˑ ڽVG_f^9U@ 5X2l]?M u{*Psfy'?o]딗Us4_Qc#I[K4ly9OP'#cXUuq\_`>j5`^^ą`4 -Bz@2N%D \FT_IـU;WV]M4l .|M=@ glZ CEUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU \CFBl-v)(~t톼nVgMkTE8C8݅jR+Ht,Fh rOMaf g& 87/ aŕƸ]J_=o)J܊v P=?<%|%oA'oVn^:2y||W>\>/>f~)ggٚ3 U`oG !moO03 O{f,]ཌྷ;n9X}ol4!3A8>FAwj=h1"{o4:WwuY1NGyKQh}8/tdSdL;by`|S}m좽 Fӄp?p2m5+Β]َ:\SauSjY.n q9톑{QSܢI?gy cߔԛ2;s09qv:Rdr+Kcnr;ZlCXqx{aFO9VJY_NoX}'u9~Rt}I~)gOfhw6n|pgSZ෡'tB2mJգqwmϛMV.>0'q:5E븺iYzyɞ?HldC ʇ1YGe$i'B{:.t{\=x"V: uKh =!M3;}Lz+cp)Qbhk 2y=x}_cWˀg~ꏽI~)8gOfhw5/Q7-&?.{BHX~`a[oMԢs&Ɯx_p3yGŚgq4ZO!sCqGյӤ09?HQ:6) [ ejU{}p9v-}Ԕ&'|8{ kt3m?ꦋZ.< ?2vhk7mrYI~[nnŲÜc1wq*B3"\>OkOs>)B\jfh9!8K,eEy}8rgXLCkP)3 ֤Y8cû0I"RMC:^dX`3hD^(89 17;z13bøҖO)niӯ?SY34=7VĿV8Ox-8jHܽD&O;; U{,g'FRQ^RG1`(8@Ԟ~nobPA?r&5jz:'Uz S[m5*AWχ]I'wMأ,Kq,O'DƵH&KOY#Gxu8_% mfC5iBr1Z<VB9-:[1BTk٣SCjF헵//%NoA7ZFPMr ]>j"C̓hޚ_ }&_>pBN=LC,A@@ R ϩ,AAv=MQL W1 k%+yUls18l)qZjoojvX==FB =-d6*恿_:>Co=`"gθ:xԻE%HF ж. #^4 _8 66rڀ&k 5X!ݵu:f!>ShRC:E@Cv]R>I`tH^|3ԈJD'DKQr& 8&AMnё?orwmT,~'c*Iмr˩i<2d܀ UJ ֦HKWpi+Ey [b }BhưφlzO+fiTzta.:2 ʉ̇a^LΜ"Ev⚹J9&dHV>~`_F4>Xkh!; D?5ҥEY/Z!UmWU !=T~Tź~g<ġw/ W^ӞwVc~f8Re \'Bg|=dєQ]t}5# a8.dMImkxxMYBp+ϑjr}MNZgppwٖi]kBwnV;%k0 Gd$̹=\ 9\}EWhT :f8gwqOC(/@.*716 3ܘ $4Bˆg܆?bk/l;Ŏr-|Z{WQg4x6rigaTw83w`=}!Z@>Ql0ψL_o;>~$<5ǜ& mm^[H| O;W9]OnͲlUMطLPs^ V 4C<~|&hm!=Xx_^؊ /6}$ډ=XqyְK:+ aY \G %ɒeTZ6ՠKȂaچQ̶;W}*wꔮ ANekUzhlѩe>& _Dr+S{a7WZɛy O-}oCܿ0\gn/(7%Z""@Q)or99 : zfGI;@ufvO%Xqc#ÿ9s3T:Z=\^G:v M;MsDCiOC J˃0͞/CTuM 3Pn -=`#wӇaV$n"Ҥj &r:@>=A9V鿗SXg[kxć ß/DR{E DPWb{t&{Ah&\h#Փ:ٯ$ CA 1X=/iQ5dbk^Ƹc@T&?`}?p5--_:< T1I %/.wO}a*T8ӯ`2?kdz`7z芧Wd1}~5?Ks>g9 u󱙮@`_r xR xRDvRSw0Jx(u2oyrݳ~xs}n%9?XwyeKlݖN?N&qȱ,,Ƅ5DQg1zd9:IȾg?Wf5Nvpi5x8Z;{ U鱗D1^]g7\?7۫d=(Fkb.-f[3Ra>x@~)}S 2 <00ӟayPmE$TS{<7_8O<%uޓצ.~{?|^ sâ#|e},o\#:"GQ, 0O5fTf\5竏ec ;q^][ϯ./>~G[8uc3۴U}f'z0Wx}Z쐎xec ;p 7Ùoy۲_{}8%|fjq^1?@|&\! (+c f#~?BZPS;B{Tf4wa♫ӫdDN9:WH{%WRl=uk4R"$^9 ô݊]yq{XO {6Lw?3f᭏<ȑ~g49|0@N =;vKtfwT>-8ŗ'Ѡkj~vNkX D xgk#g:"kgu<- Q3WW}bBnO=<8ny]yOx狯gLV%ߥg{?o.h[^\;2LB:˦wejZ8`",6gr ?3v14< (DA5˒}ZJC}tt}ֲCTGu`lxw+ygRbhx ]&~Dfu~9@ crS=`C~t;<ϲQU9yq kr|}oX2kg4ejz_eY zsGP BsUvhz>YO`>x3~\zV%iӾҭux?`”S{J~;JD/YQژ׀AnE-AIvXXq,42ʨghqP-c,4tazR$-[Ybt@d;UAдDմeXJƿeeݱ6}z@2 *yE7A)v݀UhUGB@[&4Z4r\'6 PǏS}{{|ÊkQ{Ky)vBu: jӿ7^L؍h@хnTg5(M'qzOT9{Df?<""N4:öfY}\*6[،Q ,*V+SnNCbNk::H 8iò.o'~BA?n>٥#8f4+WĻʶݬ "IM}*J5%p#9R'3Uo(eׅ8Nyk;]Z\7/$KrCM#/$ΚlnСFRi5 .xn&KThU|:˯n:.ūnp6x%I}D KGX Fыrk݃c8\^nsl.73<\^Kj(t;Ԭv K.6e[ʽ~ŶgՉ!e%rUFr4eQRY {XquG# ߍ_+35sțd4ܣTT2$j< ւ!& _第v&#u՗Z]h|ZwJk] `#p=Τ2 Whl)ƿ׭޼QDDM*z-8BrcLA~6n2 $Wg~0/[k/oCfeDA(H6uBz ܌NuF;N/5zcoAeyUUf:bH;墎^fOt`_E/+"oue3)?}Ҕ`[\fjy% 9.-/EbP iEFڠ9sqWO*1ei@%V_o\͓yʵQm"X܋g?PԺ=I.R=Um(Rr?6A^U&4Qn6+ zPZϤι_[B+_&xzώϤ̭KWazK:@[B+_ʵ/VDK!)Ζ t}"]JHz2혛<@t"Ta(e rWB#Y]̋'@ ^ҿUM:5|(E4" Лi/!1A23` "@BPp#Qa0R?$ !|h~{KߩdH_/?Pc$?* gRB?J ?!~PTA< ?^k>r7 p7 p7 p7 p7 p7 p7 p7 p7 p7 p7 p7 p7 vȓ?OiජV`·rڞ#TZdDl+HYaBEkhƛgD[ө^ޝ86jq.gxjKhm8"e"^1qG<<bvZΫ+g1[]BTG/kBbU ْڄj.d"8-g 0ܑ8\(,䅥'vb6EkI*Qm5vi ΑuF 6iKB8.YbD%X)\+8UPRڜfHhYF] 'OoB! ֗xZ?hhQF>vدkiߋX |l^*Βl|h/E 7ۅQ#$d\%<4dI=X m;^BÜF C߃Nq|lA vZzr})!K5O>I/]-AkseߨP"e$h+CKee#$X*KHQhAd\Opy6#] R-EYE8ob̫LvZYJ+F_U˯UmWmFTN8~{;%#gTe:D,d̵Qu>6{!] P] ^ULܥ#Ⱥyo^ d.b僻.}VYyY_X.ޚx-O"D!j%(JSx)C^4Xc>l|hzhNSVZy[KYpIc8p2*w4^НMB-}n^ARO ki+?P~B>fOW)^1/)W_E^o闾_EкEdb^)>1B\FY4 Uuˏ#cнYiWCq>62'F#S(PcՏ򲿑M̳)8NY^,] p _[ת`}yy̨O~ӿȰYO*9kThJe+|e)bhBZzeQxt]S|mVb_r((]oI.tEnÎJ s[|oSm*QN-Wt&HYE琄fQIr TE:=k|lWKm|Iڟ:eQ552)?QMx&I|6n# K_ :zb;XIh.ciߊGW%:(QDե_r(䘯'Wvy)]mK;VݏO Ǐ v+RkQ;Rs w LkΦP] kXJR\p'˧޶2,7 շKC.́GZQeͱQt,C<50e/R*,Ē8Eg-媞KwaՓRxx.]z& c5fHc"?XG"KyUyPؒ&}Nŏr^Re9Qd /9RG]z`ӒS_-}$\o_i''M+k+/R.]cK3A;=yJvv,z~R|A%'PMafH}K_Uu~s)A&RQ_-}$\o ~ӿbWk=3RbTIgP[OLX/!(g ":)ayEeʉ,-)wʊQʋM&OKmI%{y\R?i.<܆Kj R'vYgɱ/b1 ^eX٤Ĵ"Eq̩/%"%}CB.cܵ()G m6EJ*mdTcMHS[X7p:(2Ţ*^n#%*cؓIJ+x;_i?<;$Id*8c:mU?iFtN#t7xurBYC AM}wйnp?i\E<7~*|B' p2*BXEK_ik`)j٠i6ٶkڸ>OBX7xgy)X}&2R$2Yw5Y`ly!{sBlq l,{^:5֯k&X/ɌJDS|ƅ h(PI+SJD ب4G:"qI> ŸQ*:$OHDe?4qT2B!,HARCiD9F:Qpk ?tJ58r2K)X61!23AQ`p @"PR#q0Ba?$nm ?0G6~Nja7M6u lTf9 4 ~xD.{oQ6toXQ~_M Fn>|> M"cZKIi-%ZKIi-%ZKIi-%ZKIi-%ZKIi-%ZKIi-%@!ʍ oR|>ޤ6쫪UO.P9*\\{*GG!xGJotQW+v*AuED5D\ٝIB_U>hU<ѫRJd<ʢG46\kdfq7%GY#<5@`vVTmDQW:1U\G"eTx `Y vkd)*=ʩLd<{Ndw(VM\S;׌k1BQdy^Ե2kM}ЬyfsŊ$/(BRwQ?Q qlTuo̦UI75s?uҳsuS'$*RWy75rL]HT!w)2YSV  ."AxP6["97T\H~h/<j~J*NU:a<9lӿAvMpTڏQFeu=s*h͊S 3AUӘH[).J7bsbfl7EvUj(e2:B8/ (꧄Ms{h. _OvSDbucs!|59Tw -GX!|eԹQƫ;`]qya#,6Pb}–Ҹ Ћn!QPu-nKcz]ACa;c ^UIÈ!qދ=oHU]ARwKUsdWvS;,%lsn{07*yTm[d@(4 8qEU䠓M0po%17TԌ!\G T]aTeP.Vv ;*pp\E `7Qtvnr!]ƒx ƼخNW?7 ;.%=C0^B fdy ą;+e53* ;*K+vĈpxWp7*URpdH$25q⋬ 4[˚07QmR(DܪVCpܮ#Q_QU=҅6#2}U "u)N(n7x#̆B4dbaA¶U/AXMHm\G({ 8laK 0T 榎6(:TRA%8WaÇlpÇ0?qʔ@<$'ӽaC wE*nyB=7.o -/AVDOkF渗q >(zʦH#CQE{.!)tpc)sz0\(!qM)LAL"NU(;8JHt[s'ep)[ԆؕzÈvgR Z-—U'x`TePw>vÇv)2" *嘄 QI,({Aq({_T,U\gA>򐅊qEL%3q}!QuS < .!RPL"{+ҭUݜ(;8sUe*o2`HmZM*$8nAq⋬]TwTM0U-  1y~6E2W3eT#UiBVd7*+UFa HMIƒK%Qup{R+aPQݑJ%P33U{?E_+z.#liT]aTe5(UKS(\@YsEdrfx !K.!ɼne8Ç譮}'{S$p+TrHm澜UxqX {QM*C+t( ^9=SRIRǪPǡRP:FoAHbO_N?}8jm4-FUQ u)nРz̭UW@Z #4ESщpWӍL q;Z}j* j^4eM)ek4RN~8kS8q'u=)me%B11OnqdxsU<: Tsndk5zQZXGA'QHmwDF5lwVu+Ðdq5k}z*X/75r$@) k \ޫ꠨u[+UJN鄹jjtEJP{7Mu&%>R_tf`+WcFoTOP% \ޫT%^.b: A\A~y +rnT ސ˲ |Q $xg2Sf}wNnB!No.o;kй,6*) nn`* /2D[-즦tB @nOy7 +PMR-+B )!P;)+PrA+a@^k0ˇą渎 b* ;NYAYtٓ=I @[Ԇؕz#Y3[yA̟SzFT&.$6((O08CuM yitʵLH .!䂏Wv?8\;*?t{ɽHm\K&M:-d1F'G f&bq-G08Cu(qTuJL >GU}( 1JA?rwU}*~Vɯw෩ +XUapFBސo"P"W 9Fc-CoԆ̌LM-CoԆEhM-CoׅfYe7?oR|֠./෩ oR)E AT~CoԆȲ魲xG64+p5fj 7MrZQj-EZQj-EZQj-EZQj-EZQj-EZQj-EZQj-EZQj'JdV`!H?eeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVUeYVU8(F7 j#}Ǧ04_0u̦ ˞RFod1\-@Bt_ بDZM8e *'5;PzZYk&u# M:a>Ћ1:oR,!_~@e&oR++.Kʧ0lTfرdZQ6[9NNjaV!*-E*ʛ MuZIYeP}HYD9FtfG،CeF+Մ؛9gZjj$ WTNd dtELV{VNja8dҤ cPnm111EF%e3v}Y&:H _M9[*B#RF{^oop64@ۅt^RبQ)ҧN&y6Hy#e/6dJ/.P* 6*3q6R90+YL} Myt@8Ƅ\c܄2"?wZN^aE9l^6$"yȲcoln~M#fbo€بc/PKwL\D1limit-login-attempts-reloaded/assets/img/logo.pngnu[PNG  IHDR,OfPLTE":";';$<!:$<%=$;$<#;$<$; 6"9#;4"7%<6#;":3BP$<#:$;$;$= 8#<$=#<!8$='?#;#:$<$=#;$<$<$<#;7";22#;"9#;":#;&=";%>!81*@-$=7$=2#:4.%>' !'@!8&?"9%= 7&%>')C&@$<"9 7#*,(A,36 2,9K, 8./G()+)8J9K+""'+F++9K9K3;K+!602K-}#*F+/(/G,+%,*%%*E3#2H/4&$#;(A-'=)C0;L-+/,H2)>=O6"96BT?S=XtRNS90 aOiwّ# ʯ>p,Z5ྉC(&JrӚe%߽{^R3+6' ŸxmĩC@3Ͷ}dVPNkT̿x>-'̉cY;:#Dz}ttdHD4ʻyZW60ҽ~qph^QOL>%ʸo~~p^B7!ôyg #OIDATxXGM^" "EETF@ ѨklF[,{{Iv;{W|H>|͛݃hS4lܰxòC f,(7VBg-vb'?Z4dUFfe "'O@:i]>F5xق6> M.[fPV,ɿ.r5kA}ת+Lt2T5kf}+-ZY}jQD蓏ָUi;hъ֯Xl>tkZF2~S*(7T=1dį9PgwM=uXWQ< ɟoN"} \=nkrgf dX߷Ψ>ѥ+%f< J[Wh|ˮs&_pACÍˊW!6߮e{&AW:)R_)ԅ t˥YzO5uQCLT}cJ.pOU(ڳ=*!u{.{~#lz_ 51F%qEM5SpQAYgVGx[[s*`'=?B|K @m[BWKXFyZcFAw4} 8.hS}it=`1Tt_N&F~ :޵kSӛ^/P_}_X#nnv]4>d AFL ʨ +j d8bq)[j5 9ă3'Bek umo>)e _Juz݂9(*JX˚VUpfQ0D(L) <;5|s`)>u0c7Vq&b#,l wʲ2>hʭÉW?qyeaVڲM/o[{Xaj`V&J}`B454nz@/֞ԺtŽYe;v'v(Z qE^khUΎjaELC4ܭR4XV}4T`AJ)2S'+1E7%[ `h`C:߸i|{bbe_Iŵ~uۏH yF9D>QE un9k,$Z=CkJJ׏m/}F:ƙȪV`Ȳ͢r|kAF:tQ3R!sͱ&N$ I`Jɲڟi1KfG¾lJx>`}JMG?:ZkUX^? m ,vö@}y#_F(cm^zSi[nwۼǺܴ~3Gi[=#7WLDAW- ۮ|;M]&QNwd/;4buĶ댆 Ny&I=h Y9z9>hBAEXwUgF]pvMruU[$tEZjTHhA^N.E?Vtzz4tPqT7tO-QRn~}EfڋD.;5sAҲ6^} ]|L N1&1q@WY&Zmz/ 3S6c"Kcz۪gm.4^(cz j7۷m@0cp8@+1&$+!_R߀t Ot\Jh滰+B-w~EPF?XRM+/%`QҁRb[SuX 7CS&x3[ə"GD+5 %/c)CISa%L>6:0A^/3[̴:6+ϏaY}F6s c,̀[^,݋fl8&\WK1p(q [GX}pN93+oXdǡ i *1>3$LFՃe25`ϣPWè\@ɨܧ8K6iZwHi07(khl X;p&&IYD-8ΝG}V!\9ap>݋$ԡ:,R0Ҟ>",r9:`xz3 ; lbI Rg ̀.i[upE%!Bqq͐ΰǸ8`a]v(FeV pynV%a&d䜌y KXSkls:֌AN9j#v\#roca&鰆GL0|Rd`gLxV; XTXWLO i#=["Թ:{DGs6`ᖣJR+NƤ3$xc 9]GvSO#ym^a]"sg ΰdɄat\Fu lLl kuE5E˸h ~XoX$y`)憚r X%j(gt7"a b`/0h4ׁ: t"y 'ZT|ɳM &G,+p\1XC V&vLe(EӍ,f+KqHVE9"9N9"6Kk:d=ON  XU߻kv`j( .kme\>T / NX,h"t~a1"5 Y'ƹc\9(BvNe9& _(;[ƺ5s~ĉ_`g'ԛ)3IENDB`PKwL\G< < 1limit-login-attempts-reloaded/assets/img/logo.svgnu[ Layer 1 PKwL\ E!E!4limit-login-attempts-reloaded/assets/js/chart.umd.jsnu[/*! * Chart.js v4.4.1 * https://www.chartjs.org * (c) 2023 Chart.js Contributors * Released under the MIT License */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Go},get Decimation(){return Qo},get Filler(){return ma},get Legend(){return ya},get SubTitle(){return ka},get Title(){return Ma},get Tooltip(){return Ba}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)t-e)).pop(),e}function N(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return nt[s][e]et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const ht="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>"start"===t?"left":"end"===t?"right":"center",ft=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,l,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class bt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var xt=new bt; /*! * @kurkle/color v0.3.2 * https://github.com/kurkle/color#readme * (c) 2023 Jukka Kurkela * Released under the MIT License */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return"r"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Kt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=["x","y","borderWidth","radius","tension"],ie=["color","borderColor","backgroundColor"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):""}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r="_"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:ie},numbers:{type:"number",properties:ee}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function fe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function be(t,e){return me(t).getPropertyValue(e)}const xe=["top","right","bottom","left"];function _e(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=xe[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ye=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ve(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o="border-box"===n.boxSizing,a=_e(n,"padding"),r=_e(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ye(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const Me=t=>Math.round(10*t)/10;function we(t,e,i,s){const n=me(t),o=_e(n,"margin"),a=pe(n.maxWidth,t,"clientWidth")||T,r=pe(n.maxHeight,t,"clientHeight")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,"border","width"),l=_e(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,"clientWidth"),n=pe(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=_e(n,"border","width"),e=_e(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=Me(Math.min(h,a,l.maxWidth)),c=Me(Math.min(c,r,l.maxHeight)),h&&!c&&(c=Me(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=Me(Math.floor(c*s))),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};fe()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(t){}return t}();function Pe(t,e){const i=be(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Ce(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Oe(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Re(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),s(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;ct[0])){const o=i||t;void 0===s&&(s=ti("_fallback",t));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>je([i,...t],e,o,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>qe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=ti(Ue(o,t),i),void 0!==n)return Xe(t,n)?Je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ei(t).includes(e),ownKeys:t=>ei(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function $e(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ye(t,s),setContext:e=>$e(t,e,i,s),override:n=>$e(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>qe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(o,a||s);r.delete(t),Xe(t,l)&&(l=Je(n._scopes,n,t,l));return l}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(void 0!==a.index&&s(t))return e[a.index%e.length];if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Je(s,n,t,o);e.push($e(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Xe(e,h)&&(h=$e(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ye(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ue=(t,e)=>t?t+w(e):e,Xe=(t,e)=>o(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function Ke(t,e,i){return S(t)?t(e,i):t}const Ge=(t,e)=>!0===t?e:"string"==typeof t?M(e,t):void 0;function Ze(t,e,i,s,n){for(const o of e){const e=Ge(i,o);if(e){t.add(e);const o=Ke(e._fallback,i,n);if(void 0!==o&&o!==i&&o!==s)return o}else if(!1===e&&void 0!==s&&i!==s)return null}return!1}function Je(t,e,i,s){const a=e._rootScopes,r=Ke(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Qe(h,l,i,r||i,s);return null!==c&&((void 0===r||r===i||(c=Qe(h,l,r,c,s),null!==c))&&je(Array.from(h),[""],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Qe(t,e,i,s,n){for(;i;)i=Ze(t,e,i,s,n);return i}function ti(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function ei(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ii(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function ai(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ri(t,e="x"){const i=oi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ni(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ri(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,di=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ui=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,fi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ci(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ci(t)?t:di(t,.075,.3),easeOutElastic:t=>ci(t)?t:ui(t,.075,.3),easeInOutElastic(t){const e=.1125;return ci(t)?t:t<.5?.5*di(2*t,e,.45):.5+.5*ui(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-fi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*fi.easeInBounce(2*t):.5*fi.easeOutBounce(2*t-1)+.5};function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function pi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function mi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=gi(t,n,i),r=gi(n,o,i),l=gi(o,e,i),h=gi(a,r,i),c=gi(r,l,i);return gi(h,c,i)}const bi=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,xi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function _i(t,e){const i=(""+t).match(bi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const yi=t=>+t||0;function vi(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=yi(a(t));return i}function Mi(t){return vi(t,{top:"y",right:"x",bottom:"y",left:"x"})}function wi(t){return vi(t,["topLeft","topRight","bottomLeft","bottomRight"])}function ki(t){const e=Mi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Si(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(""+s).match(xi)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:_i(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:""};return n.string=De(n),n}function Pi(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ci(t,e){return Object.assign(Object.create(t),e)}function Oi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function Ti(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Li(t){return"angle"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Ri(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Li(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Li(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hx||l(n,b,p)&&0!==r(n,b),v=()=>!x||0===r(o,p)||l(o,b,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function Ii(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Fi(t,[{start:a,end:r,loop:o}],i,e);return Fi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Xi={evaluateInteractionItems:Hi,modes:{index(t,e,i,s){const n=ve(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tji(t,ve(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return Yi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>Ui(t,ve(e,t),"x",i.intersect,s),y:(t,e,i,s)=>Ui(t,ve(e,t),"y",i.intersect,s)}};const qi=["left","top","right","bottom"];function Ki(t,e){return t.filter((t=>t.pos===e))}function Gi(t,e){return t.filter((t=>-1===qi.indexOf(t.pos)&&t.box.axis===e))}function Zi(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ji(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!qi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ss(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Zi(Ki(e,"left"),!0),n=Zi(Ki(e,"right")),o=Zi(Ki(e,"top"),!0),a=Zi(Ki(e,"bottom")),r=Gi(e,"x"),l=Gi(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ki(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);ts(f,ki(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Ji(l.concat(h),d);ss(r.fullSize,g,d,p),ss(l,g,d,p),ss(h,g,d,p)&&ss(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),os(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,os(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class rs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class ls extends rs{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const hs="$chartjs",cs={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ds=t=>null===t||""===t;const us=!!Se&&{passive:!0};function fs(t,e,i){t.canvas.removeEventListener(e,i,us)}function gs(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function ps(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.addedNodes,s),e=e&&!gs(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ms(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.removedNodes,s),e=e&&!gs(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const bs=new Map;let xs=0;function _s(){const t=window.devicePixelRatio;t!==xs&&(xs=t,bs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ys(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){bs.size||window.addEventListener("resize",_s),bs.set(t,e)}(t,o),a}function vs(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){bs.delete(t),bs.size||window.removeEventListener("resize",_s)}(t)}function Ms(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=cs[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,us)}(s,e,n),n}class ws extends rs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[hs]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ds(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(ds(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[hs])return!1;const i=e[hs].initial;["height","width"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[hs],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:ps,detach:ms,resize:ys}[e]||Ms;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:vs,detach:vs,resize:vs}[e]||fs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return we(t,e,i,s)}isAttached(t){const e=ge(t);return!(!e||!e.isConnected)}}function ks(t){return!fe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ls:ws}var Ss=Object.freeze({__proto__:null,BasePlatform:rs,BasicPlatform:ls,DomPlatform:ws,_detectPlatform:ks});const Ps="transparent",Ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||Ps),n=s.valid&&Qt(e||Ps);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Cs{constructor(t,e,i,s){const n=e[i];s=Pi([t.to,s,n,t.from]);const o=Pi([t.from,n,s]);this._active=!0,this._fn=t.fn||Ds[t.type||typeof o],this._easing=fi[t.easing]||fi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Pi([t.to,e,s,t.from]),this._from=Pi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Cs(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(xt.add(this._chart,i),!0):void 0}}function As(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Ts(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function zs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Vs(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Bs=t=>"reset"===t||"none"===t,Ws=(t,e)=>e?t:Object.assign({},t);class Ns{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Es(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Vs(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=l(i.xAxisID,Fs(t,"x")),o=e.yAxisID=l(i.yAxisID,Fs(t,"y")),a=e.rAxisID=l(i.rAxisID,Fs(t,"r")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Vs(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:Ts(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ws(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Os(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Bs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Bs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Bs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function js(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;io)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for($s(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t"top"===e||"left"===e?t[e]+i:t[e]-i,Us=(t,e)=>Math.min(e||t,t);function Xs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Ks(t){return t.drawTicks?t.tickLength:0}function Gs(t,e){if(!t.display)return 0;const i=Si(t.font,e),s=ki(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function Zs(t,e,i){let s=ut(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class Js extends Hs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Di(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ks(t.grid)-e.padding-Gs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Gs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ks(n)+o):(t.height=this.maxHeight,t.width=Ks(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Ae(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Ks(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(t){return Ae(i,t,p)};let x,_,y,v,M,w,k,S,P,D,C,O;if("top"===a)x=b(this.bottom),w=this.bottom-u,S=x-m,D=b(t.top)+m,O=t.bottom;else if("bottom"===a)x=b(this.top),D=t.top,O=b(t.bottom)-m,w=x+m,S=this.top+u;else if("left"===a)x=b(this.right),M=this.right-u,k=x-m,P=b(t.left)+m,C=t.right;else if("right"===a)x=b(this.left),P=t.left,C=b(t.right)-m,M=x+m,k=this.left+u;else if("x"===e){if("center"===a)x=b((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=x+m,S=w+u}else if("y"===e){if("center"===a)x=b((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}M=x-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_0&&(o-=s/2)}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}b.push({label:v,font:P,textOffset:O,options:{rotation:m,color:i,strokeColor:o,strokeWidth:h,textAlign:f,textBaseline:A,translation:[M,w],backdrop:d}})}return b}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-$(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return"left"===e?s?(l=this.right+n,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l+=a)):(l=this.right-o,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l=this.left)):"right"===e?s?(l=this.left+n,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l-=a)):(l=this.left+o,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l=this.right)):r="right",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class tn{constructor(){this.controllers=new Qs(Ns,"datasets",!0),this.elements=new Qs(Hs,"elements"),this.plugins=new Qs(Object,"plugins"),this.scales=new Qs(Js,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i["before"+s],[],i),e[t](i),d(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function nn(t,e){return e||!1!==t?!0===t?{}:t:null}function on(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function an(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function rn(t){if("x"===t||"y"===t||"r"===t)return t}function ln(t,...e){if(rn(t))return t;for(const s of e){const e=s.axis||("top"===(i=s.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&rn(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function hn(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function cn(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=an(t.type,e),a=Object.create(null);return Object.keys(s).forEach((e=>{const r=s[e];if(!o(r))return console.error(`Invalid scale configuration for scale: ${e}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=ln(e,r,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return hn(t,"x",i[0])||hn(t,"y",i[0])}return{}}(e,t),ue.scales[r.type]),h=function(t,e){return t===e?"_index_":"_value_"}(l,n),c=i.scales||{};a[e]=x(Object.create(null),[{axis:l},r,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||an(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),x(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];x(e,[ue.scales[e.type],ue.scale])})),a}function dn(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=cn(t,e)}function un(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const fn=new Map,gn=new Set;function pn(t,e){let i=fn.get(t);return i||(i=e(),fn.set(t,i),gn.add(i)),i}const mn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class bn{constructor(t){this._config=function(t){return(t=t||{}).data=un(t.data),dn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=un(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),dn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return pn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return pn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return pn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>mn(r,t,e)))),e.forEach((t=>mn(r,s,t))),e.forEach((t=>mn(r,re[n]||{},t))),e.forEach((t=>mn(r,ue,t))),e.forEach((t=>mn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),gn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=xn(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=Ye(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||_n(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=$e(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:n}=xn(this._resolverCache,t,i);return o(e)?$e(n,e,void 0,s):n}}function xn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:je(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const _n=t=>o(t)&&Object.getOwnPropertyNames(t).some((e=>S(t[e])));const yn=["top","bottom","left","right","chartArea"];function vn(t,e){return"top"===t||"bottom"===t||-1===yn.indexOf(t)&&"x"===e}function Mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function wn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),d(i&&i.onComplete,[t],e)}function kn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function Sn(t){return fe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Pn={},Dn=t=>{const e=Sn(t);return Object.values(Pn).filter((t=>t.canvas===e)).pop()};function Cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}function On(t,e,i){return t.options.clip?t[i]:e[i]}class An{static defaults=ue;static instances=Pn;static overrides=re;static registry=en;static version="4.4.1";static getChart=Dn;static register(...t){en.add(...t),Tn()}static unregister(...t){en.remove(...t),Tn()}constructor(t,e){const s=this.config=new bn(e),n=Sn(t),o=Dn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ks(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new sn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],Pn[this.id]=this,r&&l?(xt.listen(this,"complete",wn),xt.listen(this,"progress",kn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return en}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Te(this.canvas,this.ctx),this}stop(){return xt.stop(this),this}resize(t,e){xt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=ln(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),u(n,(e=>{const n=e.options,o=n.id,a=ln(o,n),r=l(n.type,e.dtype);void 0!==n.position&&vn(n.position,a)===vn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(en.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{as.configure(this,t,t.options),as.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Mn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{as.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;as.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t,e){const{xScale:i,yScale:s}=t;return i&&s?{left:On(i,e,"left"),right:On(i,e,"right"),top:On(s,e,"top"),bottom:On(s,e,"bottom")}:e}(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Ie(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&ze(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Re(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Xi.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ci(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),xt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function Tn(){return u(An.instances,(t=>t._plugins.invalidate()))}function Ln(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class En{static override(t){Object.assign(En.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Ln()}parse(){return Ln()}format(){return Ln()}add(){return Ln()}diff(){return Ln()}startOf(){return Ln()}endOf(){return Ln()}}var Rn={_date:En};function In(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Fn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t="value"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;nZ(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),b=g(C,h,d),x=g(C+E,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Yn=Object.freeze({__proto__:null,BarController:class extends Ns{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Fn(t,e,i,s)}parseArrayData(t,e,i,s){return Fn(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;dt.controller.options.grouped)),o=i.options.stacked,a=[],r=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(u,e,r)*a,f===r&&(b-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);b=Math.max(Math.min(b,h),o),d=b+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(b))}if(b===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;b+=t,u-=t}return{size:u,base:b,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=b?g:{};if(i=x){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?"active":n)),b||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends jn{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:$n,RadarController:class extends Ns{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(i[f]-_[f])>b,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),x||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Un(t,e,i,s){const n=vi(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Xn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function qn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=Un(e,u,d,b-m),M=d-x,w=d-_,k=m+x/M,S=b-_/w,P=u+y,D=u+v,O=m+y/P,A=b-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Xn(w,S,a,r);t.arc(e.x,e.y,_,S,b+E)}const i=Xn(D,b,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Xn(D,A,a,r);t.arc(e.x,e.y,v,b+E,A+Math.PI)}const s=(b-v/u+(m+y/u))/2;if(t.arc(a,r,u,b-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Xn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Xn(M,m,a,r);if(t.lineTo(n.x,n.y),x>0){const e=Xn(M,k,a,r);t.arc(e.x,e.y,x,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Kn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c,borderDash:d,borderDashOffset:u}=l,f="inner"===l.borderAlign;if(!h)return;t.setLineDash(d||[]),t.lineDashOffset=u,f?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let g=e.endAngle;if(o){qn(t,e,i,s,g,n);for(let e=0;en?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,g),o||(qn(t,e,i,s,g,n),t.stroke())}function Gn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function Zn(t,e,i){t.lineTo(i.x,i.y)}function Jn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function eo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?to:Qn}const io="function"==typeof Path2D;function so(t,e,i,s){io&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Gn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=eo(e);for(const r of n)Gn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class no extends Hs{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;hi(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=zi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ii(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?pi:t.tension||"monotone"===t.cubicInterpolationMode?mi:gi}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,f=l(d,r-a)>=O||Z(n,a,r),g=tt(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){qn(t,e,i,s,l,n);for(let e=0;e("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function po(t){const e=this.getLabels();return t>=0&&ts=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,b=!s(a),x=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!b&&!x)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),b&&x&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=b?a:M,w=x?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(b&&(u&&M!==a?(i.push({value:a}),Mr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&V(i[i.length-1].value,r,mo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&j(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class xo extends bo{static id="linear";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const _o=t=>Math.floor(z(t)),yo=(t,e)=>Math.pow(10,_o(t)+e);function vo(t){return 1===t/Math.pow(10,_o(t))}function Mo(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function wo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=_o(e);let o=function(t,e){let i=_o(e-t);for(;Mo(t,e,i)>10;)i++;for(;Mo(t,e,i)<10;)i--;return Math.min(i,_o(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:vo(g),significand:u}),s}class ko extends Js{static id="logarithmic";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=bo.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===yo(this.min,0)?yo(this.min,-1):yo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(yo(i,-1)),o(yo(s,1)))),i<=0&&n(yo(s,-1)),s<=0&&o(yo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=wo({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&j(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function So(t){const e=t.ticks;if(e.display&&t.display){const t=ki(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function Po(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Do(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Oo(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Y(G(l.angle+E))),c=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,r.h,h),d=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(h),u=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Ao(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t;return!(Re({x:i,y:s},e)||Re({x:i,y:o},e)||Re({x:n,y:s},e)||Re({x:n,y:o},e))}function To(t,e,i){const{left:n,top:o,right:a,bottom:r}=i,{backdropColor:l}=e;if(!s(l)){const i=wi(e.borderRadius),s=ki(e.backdropPadding);t.fillStyle=l;const h=n-s.left,c=o-s.top,d=a-n+s.width,u=r-o+s.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),He(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function Lo(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;ot,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=ki(So(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/So(this.options))}generateTickLabels(t){bo.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?Do(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));To(i,o,e);const a=Si(o.font),{x:r,y:l,textAlign:h}=e;Ne(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:"middle"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),Lo(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Si(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=ki(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ne(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})})),t.restore()}drawTitle(){}}const Ro={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Io=Object.keys(Ro);function zo(t,e){return t-e}function Fo(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),a(l)||(l="string"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l="week"!==o||!N(r)&&!0!==r?i.startOf(l,o):i.startOf(l,"isoWeek",r)),+l)}function Vo(t,e,i,s){const n=Io.length;for(let o=Io.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function Wo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class No extends Js{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Rn._date(t.adapters.date);s.init(e),x(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Fo(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?Vo(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Io.length-1;o>=Io.indexOf(i);o--){const i=Io[o];if(Ro[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Io[i?Io.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Io.indexOf(t)+1,i=Io.length;e+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||Vo(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,h=N(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",r)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var jo=Object.freeze({__proto__:null,CategoryScale:class extends Js{static id="category";static defaults={ticks:{callback:po}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:go(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return po.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:xo,LogarithmicScale:ko,RadialLinearScale:Eo,TimeScale:No,TimeSeriesScale:class extends No{static id="timeseries";static defaults=No.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Ho(e,this.min),this._tableRange=Ho(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;ot-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Ho(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Ho(this._table,i*this._tableRange+this._minPos,!0)}}});const $o=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Yo=$o.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Uo(t){return $o[t%$o.length]}function Xo(t){return Yo[t%Yo.length]}function qo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof jn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Uo(e++))),e}(i,e):n instanceof $n?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xo(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Uo(e),t.backgroundColor=Xo(e),++e}(i,e))}}function Ko(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Go={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ko(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ko(o)))return;var a;const r=qo(t);s.forEach(r)}};function Zo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Jo(t){t.data.datasets.forEach((t=>{Zo(t)}))}var Qo={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===Pi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void Zo(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case"min-max":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const b=[],x=e+i-1,_=t[e].x,y=t[x].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&b.push({...t[e],x:p}),s!==u&&s!==i&&b.push({...t[s],x:p})}o>0&&i!==u&&b.push(t[i]),b.push(a),h=e,m=0,f=g=l,c=d=u=o}}return b}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Jo(t)}};function ta(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function ea(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function ia(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function sa(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=ea(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new no({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function na(t){return t&&!1!==t.fill}function oa(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function aa(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ra(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&da(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;na(i)&&da(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;na(s)&&"beforeDatasetDraw"===i.drawTime&&da(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const ba=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class xa extends Hs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Si(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=ba(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;"string"!=typeof e.text&&(s=_a(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Oi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ie(t,this),this._draw(),ze(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Oi(t.rtl,this.left,this.width),h=Si(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=ba(o,d),b=this.isHorizontal(),x=this._computeTitleHeight();f=b?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:ft(n,this.top+x+c,this.bottom-e[0].height),line:0},Ai(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),b?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+x+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,"butt"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Ee(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=wi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?He(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,b?S+k:this.right,t.rtl),function(t,e,i){Ne(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),b)f.x+=k+c;else if("string"!=typeof y.text){const t=h.lineHeight;f.y+=_a(y,t)+c}else f.y+=_})),Ti(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Si(e.font),s=ki(e.padding);if(!e.display)return;const n=Oi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ne(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Si(t.font),i=ki(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=ki(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class va extends Hs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=ki(i.padding);const o=s*Si(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Si(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ne(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:"middle",translation:[n,o]})}}var Ma={id:"title",_element:va,start(t,e,i){!function(t,e){const i=new va({ctx:t.ctx,options:e,chart:t});as.configure(t,i,e),as.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;as.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const wa=new WeakMap;var ka={id:"subtitle",start(t,e,i){const s=new va({ctx:t.ctx,options:i,chart:t});as.configure(t,s,i),as.addBox(t,s),wa.set(t,s)},stop(t){as.removeBox(t,wa.get(t)),wa.delete(t)},beforeUpdate(t,e,i){const s=wa.get(t);as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Sa={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function Ca(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Oa(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Si(e.bodyFont),h=Si(e.titleFont),c=Si(e.footerFont),d=o.length,f=n.length,g=s.length,p=ki(e.padding);let m=p.height,b=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-g)*l.lineHeight+(x-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){b=Math.max(b,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),b+=p.width,{width:b,height:m}}function Aa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Ta(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Aa(t,e,i,s),yAlign:s}}function La(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Ea(t,e,i){const s=ki(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ra(t){return Pa([],Da(t))}function Ia(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const za={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=Ia(i,t);Pa(e.before,Da(Fa(n,"beforeLabel",this,t))),Pa(e.lines,Fa(n,"label",this,t)),Pa(e.after,Da(Fa(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ra(Fa(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fa(i,"beforeFooter",this,t),n=Fa(i,"footer",this,t),o=Fa(i,"afterFooter",this,t);let a=[];return a=Pa(a,Da(s)),a=Pa(a,Da(n)),a=Pa(a,Da(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ia(t.callbacks,e);s.push(Fa(i,"labelColor",this,e)),n.push(Fa(i,"labelPointStyle",this,e)),o.push(Fa(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Sa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Oa(this,i),a=Object.assign({},t,e),r=Ta(this.chart,i,a),l=La(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=wi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Oi(i.rtl,this.x,this.width);for(t.x=Ea(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Si(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,He(t,{x:e,y:g,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),He(t,{x:i,y:g+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,h,l),t.strokeRect(e,g,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Si(i.bodyFont);let d=c.lineHeight,f=0;const g=Oi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let b,x,_,y,v,M,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Ea(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,M=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Sa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Oa(this,t),a=Object.assign({},i,this._size),r=Ta(e,t,a),l=La(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=ki(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ai(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ti(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e.filter((t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index)));const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Sa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Ba={id:"tooltip",_element:Va,positioners:Sa,afterInit(t,e,i){i&&(t.tooltip=new Va({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:za},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return An.register(Yn,jo,fo,t),An.helpers={...Wi},An._adapters=Rn,An.Animation=Cs,An.Animations=Os,An.animator=xt,An.controllers=en.controllers.items,An.DatasetController=Ns,An.Element=Hs,An.elements=fo,An.Interaction=Xi,An.layouts=as,An.platforms=Ss,An.Scale=Js,An.Ticks=ae,Object.assign(An,Yn,jo,fo,t,Ss),An.Chart=An,"undefined"!=typeof window&&(window.Chart=An),An})); //# sourceMappingURL=chart.umd.js.map PKwL\݇4>n>n=limit-login-attempts-reloaded/assets/js/jquery-confirm.min.jsnu[/*! * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) * Author: Boniface Pereira * Website: www.craftpip.com * Contact: hey@craftpip.com * * Copyright 2013-2019 jquery-confirm * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) */ (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory);}else{if(typeof module==="object"&&module.exports){module.exports=function(root,jQuery){if(jQuery===undefined){if(typeof window!=="undefined"){jQuery=require("jquery");}else{jQuery=require("jquery")(root);}}factory(jQuery);return jQuery;};}else{factory(jQuery);}}}(function($){var w=window;$.fn.confirm=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}$(this).each(function(){var $this=$(this);if($this.attr("jc-attached")){console.warn("jConfirm has already been attached to this element ",$this[0]);return;}$this.on("click",function(e){e.preventDefault();var jcOption=$.extend({},options);if($this.attr("data-title")){jcOption.title=$this.attr("data-title");}if($this.attr("data-content")){jcOption.content=$this.attr("data-content");}if(typeof jcOption.buttons==="undefined"){jcOption.buttons={};}jcOption["$target"]=$this;if($this.attr("href")&&Object.keys(jcOption.buttons).length===0){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});var firstBtn=Object.keys(buttons)[0];jcOption.buttons=buttons;jcOption.buttons[firstBtn].action=function(){location.href=$this.attr("href");};}jcOption.closeIcon=false;var instance=$.confirm(jcOption);});$this.attr("jc-attached",true);});return $(this);};$.confirm=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}var putDefaultButtons=!(options.buttons===false);if(typeof options.buttons!=="object"){options.buttons={};}if(Object.keys(options.buttons).length===0&&putDefaultButtons){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});options.buttons=buttons;}return w.jconfirm(options);};$.alert=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}var putDefaultButtons=!(options.buttons===false);if(typeof options.buttons!=="object"){options.buttons={};}if(Object.keys(options.buttons).length===0&&putDefaultButtons){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});var firstBtn=Object.keys(buttons)[0];options.buttons[firstBtn]=buttons[firstBtn];}return w.jconfirm(options);};$.dialog=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false,closeIcon:function(){}};}options.buttons={};if(typeof options.closeIcon==="undefined"){options.closeIcon=function(){};}options.confirmKeys=[13];return w.jconfirm(options);};w.jconfirm=function(options){if(typeof options==="undefined"){options={};}var pluginOptions=$.extend(true,{},w.jconfirm.pluginDefaults);if(w.jconfirm.defaults){pluginOptions=$.extend(true,pluginOptions,w.jconfirm.defaults);}pluginOptions=$.extend(true,{},pluginOptions,options);var instance=new w.Jconfirm(pluginOptions);w.jconfirm.instances.push(instance);return instance;};w.Jconfirm=function(options){$.extend(this,options);this._init();};w.Jconfirm.prototype={_init:function(){var that=this;if(!w.jconfirm.instances.length){w.jconfirm.lastFocused=$("body").find(":focus");}this._id=Math.round(Math.random()*99999);this.contentParsed=$(document.createElement("div"));if(!this.lazyOpen){setTimeout(function(){that.open();},0);}},_buildHTML:function(){var that=this;this._parseAnimation(this.animation,"o");this._parseAnimation(this.closeAnimation,"c");this._parseBgDismissAnimation(this.backgroundDismissAnimation);this._parseColumnClass(this.columnClass);this._parseTheme(this.theme);this._parseType(this.type);var template=$(this.template);template.find(".jconfirm-box").addClass(this.animationParsed).addClass(this.backgroundDismissAnimationParsed).addClass(this.typeParsed);if(this.typeAnimated){template.find(".jconfirm-box").addClass("jconfirm-type-animated");}if(this.useBootstrap){template.find(".jc-bs3-row").addClass(this.bootstrapClasses.row);template.find(".jc-bs3-row").addClass("justify-content-md-center justify-content-sm-center justify-content-xs-center justify-content-lg-center");template.find(".jconfirm-box-container").addClass(this.columnClassParsed);if(this.containerFluid){template.find(".jc-bs3-container").addClass(this.bootstrapClasses.containerFluid);}else{template.find(".jc-bs3-container").addClass(this.bootstrapClasses.container);}}else{template.find(".jconfirm-box").css("width",this.boxWidth);}if(this.titleClass){template.find(".jconfirm-title-c").addClass(this.titleClass);}template.addClass(this.themeParsed);var ariaLabel="jconfirm-box"+this._id;template.find(".jconfirm-box").attr("aria-labelledby",ariaLabel).attr("tabindex",-1);template.find(".jconfirm-content").attr("id",ariaLabel);if(this.bgOpacity!==null){template.find(".jconfirm-bg").css("opacity",this.bgOpacity);}if(this.rtl){template.addClass("jconfirm-rtl");}this.$el=template.appendTo(this.container);this.$jconfirmBoxContainer=this.$el.find(".jconfirm-box-container");this.$jconfirmBox=this.$body=this.$el.find(".jconfirm-box");this.$jconfirmBg=this.$el.find(".jconfirm-bg");this.$title=this.$el.find(".jconfirm-title");this.$titleContainer=this.$el.find(".jconfirm-title-c");this.$content=this.$el.find("div.jconfirm-content");this.$contentPane=this.$el.find(".jconfirm-content-pane");this.$icon=this.$el.find(".jconfirm-icon-c");this.$closeIcon=this.$el.find(".jconfirm-closeIcon");this.$holder=this.$el.find(".jconfirm-holder");this.$btnc=this.$el.find(".jconfirm-buttons");this.$scrollPane=this.$el.find(".jconfirm-scrollpane");that.setStartingPoint();this._contentReady=$.Deferred();this._modalReady=$.Deferred();this.$holder.css({"padding-top":this.offsetTop,"padding-bottom":this.offsetBottom,});this.setTitle();this.setIcon();this._setButtons();this._parseContent();this.initDraggable();if(this.isAjax){this.showLoading(false);}$.when(this._contentReady,this._modalReady).then(function(){if(that.isAjaxLoading){setTimeout(function(){that.isAjaxLoading=false;that.setContent();that.setTitle();that.setIcon();setTimeout(function(){that.hideLoading(false);that._updateContentMaxHeight();},100);if(typeof that.onContentReady==="function"){that.onContentReady();}},50);}else{that._updateContentMaxHeight();that.setTitle();that.setIcon();if(typeof that.onContentReady==="function"){that.onContentReady();}}if(that.autoClose){that._startCountDown();}}).then(function(){that._watchContent();});if(this.animation==="none"){this.animationSpeed=1;this.animationBounce=1;}this.$body.css(this._getCSS(this.animationSpeed,this.animationBounce));this.$contentPane.css(this._getCSS(this.animationSpeed,1));this.$jconfirmBg.css(this._getCSS(this.animationSpeed,1));this.$jconfirmBoxContainer.css(this._getCSS(this.animationSpeed,1));},_typePrefix:"jconfirm-type-",typeParsed:"",_parseType:function(type){this.typeParsed=this._typePrefix+type;},setType:function(type){var oldClass=this.typeParsed;this._parseType(type);this.$jconfirmBox.removeClass(oldClass).addClass(this.typeParsed);},themeParsed:"",_themePrefix:"jconfirm-",setTheme:function(theme){var previous=this.theme;this.theme=theme||this.theme;this._parseTheme(this.theme);if(previous){this.$el.removeClass(previous);}this.$el.addClass(this.themeParsed);this.theme=theme;},_parseTheme:function(theme){var that=this;theme=theme.split(",");$.each(theme,function(k,a){if(a.indexOf(that._themePrefix)===-1){theme[k]=that._themePrefix+$.trim(a);}});this.themeParsed=theme.join(" ").toLowerCase();},backgroundDismissAnimationParsed:"",_bgDismissPrefix:"jconfirm-hilight-",_parseBgDismissAnimation:function(bgDismissAnimation){var animation=bgDismissAnimation.split(",");var that=this;$.each(animation,function(k,a){if(a.indexOf(that._bgDismissPrefix)===-1){animation[k]=that._bgDismissPrefix+$.trim(a);}});this.backgroundDismissAnimationParsed=animation.join(" ").toLowerCase();},animationParsed:"",closeAnimationParsed:"",_animationPrefix:"jconfirm-animation-",setAnimation:function(animation){this.animation=animation||this.animation;this._parseAnimation(this.animation,"o");},_parseAnimation:function(animation,which){which=which||"o";var animations=animation.split(",");var that=this;$.each(animations,function(k,a){if(a.indexOf(that._animationPrefix)===-1){animations[k]=that._animationPrefix+$.trim(a);}});var a_string=animations.join(" ").toLowerCase();if(which==="o"){this.animationParsed=a_string;}else{this.closeAnimationParsed=a_string;}return a_string;},setCloseAnimation:function(closeAnimation){this.closeAnimation=closeAnimation||this.closeAnimation;this._parseAnimation(this.closeAnimation,"c");},setAnimationSpeed:function(speed){this.animationSpeed=speed||this.animationSpeed;},columnClassParsed:"",setColumnClass:function(colClass){if(!this.useBootstrap){console.warn("cannot set columnClass, useBootstrap is set to false");return;}this.columnClass=colClass||this.columnClass;this._parseColumnClass(this.columnClass);this.$jconfirmBoxContainer.addClass(this.columnClassParsed);},_updateContentMaxHeight:function(){var height=$(window).height()-(this.$jconfirmBox.outerHeight()-this.$contentPane.outerHeight())-(this.offsetTop+this.offsetBottom);this.$contentPane.css({"max-height":height+"px"});},setBoxWidth:function(width){if(this.useBootstrap){console.warn("cannot set boxWidth, useBootstrap is set to true");return;}this.boxWidth=width;this.$jconfirmBox.css("width",width);},_parseColumnClass:function(colClass){colClass=colClass.toLowerCase();var p;switch(colClass){case"xl":case"xlarge":p="col-md-12";break;case"l":case"large":p="col-md-8 col-md-offset-2";break;case"m":case"medium":p="col-md-6 col-md-offset-3";break;case"s":case"small":p="col-md-4 col-md-offset-4";break;case"xs":case"xsmall":p="col-md-2 col-md-offset-5";break;default:p=colClass;}this.columnClassParsed=p;},initDraggable:function(){var that=this;var $t=this.$titleContainer;this.resetDrag();if(this.draggable){$t.on("mousedown",function(e){$t.addClass("jconfirm-hand");that.mouseX=e.clientX;that.mouseY=e.clientY;that.isDrag=true;});$(window).on("mousemove."+this._id,function(e){if(that.isDrag){that.movingX=e.clientX-that.mouseX+that.initialX;that.movingY=e.clientY-that.mouseY+that.initialY;that.setDrag();}});$(window).on("mouseup."+this._id,function(){$t.removeClass("jconfirm-hand");if(that.isDrag){that.isDrag=false;that.initialX=that.movingX;that.initialY=that.movingY;}});}},resetDrag:function(){this.isDrag=false;this.initialX=0;this.initialY=0;this.movingX=0;this.movingY=0;this.mouseX=0;this.mouseY=0;this.$jconfirmBoxContainer.css("transform","translate("+0+"px, "+0+"px)");},setDrag:function(){if(!this.draggable){return;}this.alignMiddle=false;var boxWidth=this.$jconfirmBox.outerWidth();var boxHeight=this.$jconfirmBox.outerHeight();var windowWidth=$(window).width();var windowHeight=$(window).height();var that=this;var dragUpdate=1;if(that.movingX%dragUpdate===0||that.movingY%dragUpdate===0){if(that.dragWindowBorder){var leftDistance=(windowWidth/2)-boxWidth/2;var topDistance=(windowHeight/2)-boxHeight/2;topDistance-=that.dragWindowGap;leftDistance-=that.dragWindowGap;if(leftDistance+that.movingX<0){that.movingX=-leftDistance;}else{if(leftDistance-that.movingX<0){that.movingX=leftDistance;}}if(topDistance+that.movingY<0){that.movingY=-topDistance;}else{if(topDistance-that.movingY<0){that.movingY=topDistance;}}}that.$jconfirmBoxContainer.css("transform","translate("+that.movingX+"px, "+that.movingY+"px)");}},_scrollTop:function(){if(typeof pageYOffset!=="undefined"){return pageYOffset;}else{var B=document.body;var D=document.documentElement;D=(D.clientHeight)?D:B;return D.scrollTop;}},_watchContent:function(){var that=this;if(this._timer){clearInterval(this._timer);}var prevContentHeight=0;this._timer=setInterval(function(){if(that.smoothContent){var contentHeight=that.$content.outerHeight()||0;if(contentHeight!==prevContentHeight){prevContentHeight=contentHeight;}var wh=$(window).height();var total=that.offsetTop+that.offsetBottom+that.$jconfirmBox.height()-that.$contentPane.height()+that.$content.height();if(total').html(that.buttons[key].text).addClass(that.buttons[key].btnClass).prop("disabled",that.buttons[key].isDisabled).css("display",that.buttons[key].isHidden?"none":"").click(function(e){e.preventDefault();var res=that.buttons[key].action.apply(that,[that.buttons[key]]);that.onAction.apply(that,[key,that.buttons[key]]);that._stopCountDown();if(typeof res==="undefined"||res){that.close();}});that.buttons[key].el=button_element;that.buttons[key].setText=function(text){button_element.html(text);};that.buttons[key].addClass=function(className){button_element.addClass(className);};that.buttons[key].removeClass=function(className){button_element.removeClass(className);};that.buttons[key].disable=function(){that.buttons[key].isDisabled=true;button_element.prop("disabled",true);};that.buttons[key].enable=function(){that.buttons[key].isDisabled=false;button_element.prop("disabled",false);};that.buttons[key].show=function(){that.buttons[key].isHidden=false;button_element.css("display","");};that.buttons[key].hide=function(){that.buttons[key].isHidden=true;button_element.css("display","none");};that["$_"+key]=that["$$"+key]=button_element;that.$btnc.append(button_element);});if(total_buttons===0){this.$btnc.hide();}if(this.closeIcon===null&&total_buttons===0){this.closeIcon=true;}if(this.closeIcon){if(this.closeIconClass){var closeHtml='';this.$closeIcon.html(closeHtml);}this.$closeIcon.click(function(e){e.preventDefault();var buttonName=false;var shouldClose=false;var str;if(typeof that.closeIcon==="function"){str=that.closeIcon();}else{str=that.closeIcon;}if(typeof str==="string"&&typeof that.buttons[str]!=="undefined"){buttonName=str;shouldClose=false;}else{if(typeof str==="undefined"||!!(str)===true){shouldClose=true;}else{shouldClose=false;}}if(buttonName){var btnResponse=that.buttons[buttonName].action.apply(that);shouldClose=(typeof btnResponse==="undefined")||!!(btnResponse);}if(shouldClose){that.close();}});this.$closeIcon.show();}else{this.$closeIcon.hide();}},setTitle:function(string,force){force=force||false;if(typeof string!=="undefined"){if(typeof string==="string"){this.title=string;}else{if(typeof string==="function"){if(typeof string.promise==="function"){console.error("Promise was returned from title function, this is not supported.");}var response=string();if(typeof response==="string"){this.title=response;}else{this.title=false;}}else{this.title=false;}}}if(this.isAjaxLoading&&!force){return;}this.$title.html(this.title||"");this.updateTitleContainer();},setIcon:function(iconClass,force){force=force||false;if(typeof iconClass!=="undefined"){if(typeof iconClass==="string"){this.icon=iconClass;}else{if(typeof iconClass==="function"){var response=iconClass();if(typeof response==="string"){this.icon=response;}else{this.icon=false;}}else{this.icon=false;}}}if(this.isAjaxLoading&&!force){return;}this.$icon.html(this.icon?'':"");this.updateTitleContainer();},updateTitleContainer:function(){if(!this.title&&!this.icon){this.$titleContainer.hide();}else{this.$titleContainer.show();}},setContentPrepend:function(content,force){if(!content){return;}this.contentParsed.prepend(content);},setContentAppend:function(content){if(!content){return;}this.contentParsed.append(content);},setContent:function(content,force){force=!!force;var that=this;if(content){this.contentParsed.html("").append(content);}if(this.isAjaxLoading&&!force){return;}this.$content.html("");this.$content.append(this.contentParsed);setTimeout(function(){that.$body.find("input[autofocus]:visible:first").focus();},100);},loadingSpinner:false,showLoading:function(disableButtons){this.loadingSpinner=true;this.$jconfirmBox.addClass("loading");if(disableButtons){this.$btnc.find("button").prop("disabled",true);}},hideLoading:function(enableButtons){this.loadingSpinner=false;this.$jconfirmBox.removeClass("loading");if(enableButtons){this.$btnc.find("button").prop("disabled",false);}},ajaxResponse:false,contentParsed:"",isAjax:false,isAjaxLoading:false,_parseContent:function(){var that=this;var e=" ";if(typeof this.content==="function"){var res=this.content.apply(this);if(typeof res==="string"){this.content=res;}else{if(typeof res==="object"&&typeof res.always==="function"){this.isAjax=true;this.isAjaxLoading=true;res.always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});this.content=e;}else{this.content=e;}}}if(typeof this.content==="string"&&this.content.substr(0,4).toLowerCase()==="url:"){this.isAjax=true;this.isAjaxLoading=true;var u=this.content.substring(4,this.content.length);$.get(u).done(function(html){that.contentParsed.html(html);}).always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});}if(!this.content){this.content=e;}if(!this.isAjax){this.contentParsed.html(this.content);this.setContent();that._contentReady.resolve();}},_stopCountDown:function(){clearInterval(this.autoCloseInterval);if(this.$cd){this.$cd.remove();}},_startCountDown:function(){var that=this;var opt=this.autoClose.split("|");if(opt.length!==2){console.error("Invalid option for autoClose. example 'close|10000'");return false;}var button_key=opt[0];var time=parseInt(opt[1]);if(typeof this.buttons[button_key]==="undefined"){console.error("Invalid button key '"+button_key+"' for autoClose");return false;}var seconds=Math.ceil(time/1000);this.$cd=$(' ('+seconds+")").appendTo(this["$_"+button_key]);this.autoCloseInterval=setInterval(function(){that.$cd.html(" ("+(seconds-=1)+") ");if(seconds<=0){that["$$"+button_key].trigger("click");that._stopCountDown();}},1000);},_getKey:function(key){switch(key){case 192:return"tilde";case 13:return"enter";case 16:return"shift";case 9:return"tab";case 20:return"capslock";case 17:return"ctrl";case 91:return"win";case 18:return"alt";case 27:return"esc";case 32:return"space";}var initial=String.fromCharCode(key);if(/^[A-z0-9]+$/.test(initial)){return initial.toLowerCase();}else{return false;}},reactOnKey:function(e){var that=this;var a=$(".jconfirm");if(a.eq(a.length-1)[0]!==this.$el[0]){return false;}var key=e.which;if(this.$content.find(":input").is(":focus")&&/13|32/.test(key)){return false;}var keyChar=this._getKey(key);if(keyChar==="esc"&&this.escapeKey){if(this.escapeKey===true){this.$scrollPane.trigger("click");}else{if(typeof this.escapeKey==="string"||typeof this.escapeKey==="function"){var buttonKey;if(typeof this.escapeKey==="function"){buttonKey=this.escapeKey();}else{buttonKey=this.escapeKey;}if(buttonKey){if(typeof this.buttons[buttonKey]==="undefined"){console.warn("Invalid escapeKey, no buttons found with key "+buttonKey);}else{this["$_"+buttonKey].trigger("click");}}}}}$.each(this.buttons,function(key,button){if(button.keys.indexOf(keyChar)!==-1){that["$_"+key].trigger("click");}});},setDialogCenter:function(){console.info("setDialogCenter is deprecated, dialogs are centered with CSS3 tables");},_unwatchContent:function(){clearInterval(this._timer);},close:function(onClosePayload){var that=this;if(typeof this.onClose==="function"){this.onClose(onClosePayload);}this._unwatchContent();$(window).unbind("resize."+this._id);$(window).unbind("keyup."+this._id);$(window).unbind("jcKeyDown."+this._id);if(this.draggable){$(window).unbind("mousemove."+this._id);$(window).unbind("mouseup."+this._id);this.$titleContainer.unbind("mousedown");}that.$el.removeClass(that.loadedClass);$("body").removeClass("jconfirm-no-scroll-"+that._id);that.$jconfirmBoxContainer.removeClass("jconfirm-no-transition");setTimeout(function(){that.$body.addClass(that.closeAnimationParsed);that.$jconfirmBg.addClass("jconfirm-bg-h");var closeTimer=(that.closeAnimation==="none")?1:that.animationSpeed;setTimeout(function(){that.$el.remove();var l=w.jconfirm.instances;var i=w.jconfirm.instances.length-1;for(i;i>=0;i--){if(w.jconfirm.instances[i]._id===that._id){w.jconfirm.instances.splice(i,1);}}if(!w.jconfirm.instances.length){if(that.scrollToPreviousElement&&w.jconfirm.lastFocused&&w.jconfirm.lastFocused.length&&$.contains(document,w.jconfirm.lastFocused[0])){var $lf=w.jconfirm.lastFocused;if(that.scrollToPreviousElementAnimate){var st=$(window).scrollTop();var ot=w.jconfirm.lastFocused.offset().top;var wh=$(window).height();if(!(ot>st&&ot<(st+wh))){var scrollTo=(ot-Math.round((wh/3)));$("html, body").animate({scrollTop:scrollTo},that.animationSpeed,"swing",function(){$lf.focus();});}else{$lf.focus();}}else{$lf.focus();}w.jconfirm.lastFocused=false;}}if(typeof that.onDestroy==="function"){that.onDestroy();}},closeTimer*0.4);},50);return true;},open:function(){if(this.isOpen()){return false;}this._buildHTML();this._bindEvents();this._open();return true;},setStartingPoint:function(){var el=false;if(this.animateFromElement!==true&&this.animateFromElement){el=this.animateFromElement;w.jconfirm.lastClicked=false;}else{if(w.jconfirm.lastClicked&&this.animateFromElement===true){el=w.jconfirm.lastClicked;w.jconfirm.lastClicked=false;}else{return false;}}if(!el){return false;}var offset=el.offset();var iTop=el.outerHeight()/2;var iLeft=el.outerWidth()/2;iTop-=this.$jconfirmBox.outerHeight()/2;iLeft-=this.$jconfirmBox.outerWidth()/2;var sourceTop=offset.top+iTop;sourceTop=sourceTop-this._scrollTop();var sourceLeft=offset.left+iLeft;var wh=$(window).height()/2;var ww=$(window).width()/2;var targetH=wh-this.$jconfirmBox.outerHeight()/2;var targetW=ww-this.$jconfirmBox.outerWidth()/2;sourceTop-=targetH;sourceLeft-=targetW;if(Math.abs(sourceTop)>wh||Math.abs(sourceLeft)>ww){return false;}this.$jconfirmBoxContainer.css("transform","translate("+sourceLeft+"px, "+sourceTop+"px)");},_open:function(){var that=this;if(typeof that.onOpenBefore==="function"){that.onOpenBefore();}this.$body.removeClass(this.animationParsed);this.$jconfirmBg.removeClass("jconfirm-bg-h");this.$body.focus();that.$jconfirmBoxContainer.css("transform","translate("+0+"px, "+0+"px)");setTimeout(function(){that.$body.css(that._getCSS(that.animationSpeed,1));that.$body.css({"transition-property":that.$body.css("transition-property")+", margin"});that.$jconfirmBoxContainer.addClass("jconfirm-no-transition");that._modalReady.resolve();if(typeof that.onOpen==="function"){that.onOpen();}that.$el.addClass(that.loadedClass);},this.animationSpeed);},loadedClass:"jconfirm-open",isClosed:function(){return !this.$el||this.$el.parent().length===0;},isOpen:function(){return !this.isClosed();},toggle:function(){if(!this.isOpen()){this.open();}else{this.close();}}};w.jconfirm.instances=[];w.jconfirm.lastFocused=false;w.jconfirm.pluginDefaults={template:'

',title:"Hello",titleClass:"",type:"default",typeAnimated:true,draggable:true,dragWindowGap:15,dragWindowBorder:true,animateFromElement:true,alignMiddle:true,smoothContent:true,content:"Are you sure to continue?",buttons:{},defaultButtons:{ok:{action:function(){}},close:{action:function(){}}},contentLoaded:function(){},icon:"",lazyOpen:false,bgOpacity:null,theme:"light",animation:"scale",closeAnimation:"scale",animationSpeed:400,animationBounce:1,escapeKey:true,rtl:false,container:"body",containerFluid:false,backgroundDismiss:false,backgroundDismissAnimation:"shake",autoClose:false,closeIcon:null,closeIconClass:false,watchInterval:100,columnClass:"col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1",boxWidth:"50%",scrollToPreviousElement:true,scrollToPreviousElementAnimate:true,useBootstrap:true,offsetTop:40,offsetBottom:40,bootstrapClasses:{container:"container",containerFluid:"container-fluid",row:"row"},onContentReady:function(){},onOpenBefore:function(){},onOpen:function(){},onClose:function(){},onDestroy:function(){},onAction:function(){}};var keyDown=false;$(window).on("keydown",function(e){if(!keyDown){var $target=$(e.target);var pass=false;if($target.closest(".jconfirm-box").length){pass=true;}if(pass){$(window).trigger("jcKeyDown");}keyDown=true;}});$(window).on("keyup",function(){keyDown=false;});w.jconfirm.lastClicked=false;$(document).on("mousedown","button, a, [jc-source]",function(){w.jconfirm.lastClicked=$(this);});}));PKwL\ʝ8F?limit-login-attempts-reloaded/assets/js/limit-login-attempts.jsnu[function llar_activate_micro_cloud( email ) { let data = { action: 'activate_micro_cloud', email: email, sec: llar_vars.nonce_activate_micro_cloud, } return llar_ajax_callback_post( ajaxurl, data ) } function llar_activate_license_key( $setup_code ) { let data = { action: 'app_setup', code: $setup_code, sec: llar_vars.nonce_app_setup, } return llar_ajax_callback_post( ajaxurl, data ) } function llar_is_valid_email( email ) { // Allow empty email if ( email === null || email === '' ) { return true; } let email_regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return email_regex.test( email ); } function llar_ajax_callback_post( ajaxurl = null, data ) { return new Promise(function( resolve, reject ) { jQuery.post( ajaxurl, data, function ( response ) { if ( ( response && ( 'success' in response ) && response.success === false ) ) { reject( response ); } else if ( response.error ) { reject( response ); } else { resolve( response ); } }); }); } ( function( $ ) { $( document ).ready(function() { const poster = '#video-poster'; $( document ).on( 'click', poster, function () { $( poster ).css( 'display', 'none' ); } ) const $account_policies = $( 'input[name="strong_account_policies"]' ); const $checkbox_block_by_country = $( 'input[name="block_by_country"]' ); const $checkbox_auto_update_choice = $( 'input[name="auto_update_choice"]' ); const $auto_update_choice = $( 'a[href="#llar_auto_update_choice"]' ); const $auto_update_notice = $( '.llar-auto-update-notice' ); const content_html = $( '#llar_popup_error_content' ).html(); const $upgrade_premium_message = $( '#llar-header-upgrade-premium-message' ); $account_policies.on( 'change', function () { $is_checklist = !! $( this ).prop( 'checked' ); let data = { action: 'strong_account_policies', is_checklist: $is_checklist, sec: llar_vars.nonce_account_policies } llar_ajax_callback_post( ajaxurl, data ) .catch( function () { $account_policies.prop( 'checked', false ); } ) } ) $checkbox_block_by_country.on( 'change', function () { $is_checklist = !! $( this ).prop( 'checked' ); let data = { action: 'block_by_country', is_checklist: $is_checklist, sec: llar_vars.nonce_block_by_country } llar_ajax_callback_post( ajaxurl, data ) .catch( function () { $account_policies.prop( 'checked', false ); } ) } ) $upgrade_premium_message.on( 'click', '.close', function () { $upgrade_premium_message.addClass( 'llar-display-none' ); let data = { action: 'close_premium_message', sec: llar_vars.nonce_close_premium_message } llar_ajax_callback_post( ajaxurl, data ) .catch( function () { $upgrade_premium_message.addClass( 'llar-display-none' ); } ) } ) $auto_update_choice.on( 'click', function ( e ) { e.preventDefault(); let checked = 'no'; if ( ! $checkbox_auto_update_choice.is( 'checked' ) ) { checked = 'yes'; } toggle_auto_update( checked, content_html ); } ) $auto_update_notice.on( 'click', ' .auto-enable-update-option', function( e ) { e.preventDefault(); let value = $( this ).data( 'val' ); toggle_auto_update( value, content_html ) ; }) function toggle_auto_update( value, content ) { let data = { action: 'toggle_auto_update', value: value, sec: llar_vars.nonce_auto_update } llar_ajax_callback_post( ajaxurl, data ) .then( function () { hide_auto_update_option( value ); } ) .catch( function ( response ) { notice_popup_error_update.content = content; notice_popup_error_update.msg = response.data.msg; notice_popup_error_update.open(); } ) } function hide_auto_update_option( value ) { if ( $auto_update_notice.length > 0 && $auto_update_notice.css( 'display' ) !== 'none' ) { $auto_update_notice.remove(); } if ( value === 'yes' && ! $checkbox_auto_update_choice.is('checked') ) { let link_text = $auto_update_choice.text(); $checkbox_auto_update_choice.prop( 'checked', true ); $auto_update_choice.replaceWith( link_text ); } } const notice_popup_error_update = $.dialog({ title: false, content: this.content, lazyOpen: true, type: 'default', typeAnimated: true, draggable: false, animation: 'top', animationBounce: 1, boxWidth: '20%', bgOpacity: 0.9, useBootstrap: false, closeIcon: true, buttons: {}, onOpenBefore: function () { const $card_body = $( '.card-body' ); $card_body.text( this.msg ); } } ); const $onboarding_reset = $( '#llar_onboarding_reset' ); $onboarding_reset.on( 'click', function ( e ) { e.preventDefault(); let data = { action: 'onboarding_reset', sec: llar_vars.nonce_onboarding_reset } llar_ajax_callback_post( ajaxurl, data ) .then( function () { let clear_url = window.location.protocol + "//" + window.location.host + window.location.pathname; window.location = clear_url + '?page=limit-login-attempts&tab=dashboard'; } ) } ) } ); } )(jQuery) PKwL\w/ / Glimit-login-attempts-reloaded/assets/sass/_admin-dashboard-widgets.scssnu[#llar-admin-dashboard-widgets { .widget-title { padding-bottom: 15px; border-bottom: 1px solid #e4e4e4; font-size: 14px; text-align: left; } .widget-content { font-family: $font-primary, $font-secondary; .llar-attempts-chart-legend { margin-bottom: 10px; } } .llar-widget { margin-bottom: 20px; background-color: #fff; text-align: center; .section-title__new { font-size: 12px; line-height: 150%; display: flex; flex-wrap: nowrap; justify-content: space-between; text-align: left; .llar { &-label { color: #2A2F40; min-width: fit-content; padding: 0.125rem .75rem; border-radius: 8px; background-color: rgba(10, 172, 208, 0.08); &-group { display: flex; column-gap: 30px; } &__circle-blue { font-size: 44px; vertical-align: middle; color: #58C3FF; } &__circle-grey { font-size: 44px; vertical-align: middle; color: rgba(174, 174, 174, 0.6980392157); } .hint_tooltip { @extend .llar_hint_tooltip; } .hint_tooltip-content { @extend .llar_hint_tooltip-content; } .hint_tooltip-parent { @extend .llar_hint_tooltip-parent; } .hint_tooltip { left: -100%; &:before { right: 82%; } } } &-premium-label { .dashicons { width: unset; height: unset; background-color: $primary-colors__aero_blue; border-radius: $border-radius__min * .5; color: $background-body; margin-right: 5px; margin-top: 3px; font-size: inherit; &.disabled { background-color: $state-color__error; } @include _1199 { margin-right: 2px; } } } } } .chart { max-width: 300px; position: relative; margin: 15px auto; //margin-bottom: 15px; //margin-left: auto; //margin-right: auto; .doughnut-chart-wrap { position: relative; width: 200px; height: auto; margin: 0 auto; } .llar-retries-count { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 28px; font-weight: bold; } } .title { font-weight: 600; font-size: 16px; line-height: 1.5; margin-bottom: 10px; } .desc { font-size: 15px; } .actions { margin-top: 5px; } &.widget-2 { .llar-chart-wrap { width: 100%; margin: 0 auto; clear: both; canvas { height: 300px; } } .chart-stats-legend { text-align: center; margin-top: 10px; } } } }PKwL\S褍<<>limit-login-attempts-reloaded/assets/sass/_dashboard-page.scssnu[#llar-dashboard-page { font-family: $font-primary, $font-secondary; margin-top: 40px; * { box-sizing: border-box; } ul, ol { @extend .llar_list; margin-left: 0; padding-left: 32px; li { font-size: 16px; color: $typography-secondary; padding-left: 16px; margin-bottom: 10px; &::before { color: $color-marker; margin-left: -20px; } } } .section-title__new { display: flex; flex-wrap: nowrap; justify-content: space-between; gap: 20px; font-size: 16px; text-align: left; @include _1799 { gap: 10px; } @include _1599 { font-size: 14px; } .llar-label { color: $typography-primary; min-width: fit-content; text-wrap: nowrap; padding: 2px 16px; border-radius: $border-radius__min; background-color: rgba(10, 172, 208, 0.08); @include _1599 { padding: 2px 5px; } &-group { display: flex; column-gap: 20px; } &__url { color: $typography-additional; font-size: 87.5%; margin-right: 18px; overflow: hidden; @include _1599 { margin-right: 4px; } } &__circle-blue { font-size: 64px; vertical-align: middle; color: #58C3FF; } &__circle-grey { font-size: 64px; vertical-align: middle; color: #AEAEAEB2; } .dashicons { @extend .dashicons-secondary; font-size: 140%; width: 14px; height: 14px; } &.exhausted { color: $state-color__error; background-color: $state-color__error_back; } &.request { background-color: unset; } } } .section-content { margin-top: 16px; overflow: hidden; } .dashboard-section-1 { margin-bottom: 20px; display: flex; flex-wrap: nowrap; gap: 16px; @include _1399 { flex-wrap: wrap; gap: 8px; } > [class^="info-box-"] { position: relative; text-align: center; flex: 0 0 auto; width: calc(33.3% - 16px); padding: 32px 30px 24px; border-radius: $border-radius; background: $background-body; box-shadow: 4px 4px 18px 0 $box-shadow__light_transparent_gray; @include _1799 { padding: 30px 16px 16px; } @include _1599 { padding: 30px 16px; } @include _1399 { width: calc(40% - 8px / 2); min-height: 272px; } @include _1199 { width: 100%; min-height: 294px; } &:last-child { border: 0; } .title { font-weight: 500; color: $typography-secondary; font-size: 16px; line-height: 1.5; &-big { font-size: 20px; } } } .info-box-1 { .section-title__new { .llar-premium-label { float: right; margin-right: 18px; padding-top: 2px; color: $typography-secondary; text-wrap: nowrap; .dashicons { width: unset; height: unset; background-color: $primary-colors__aero_blue; border-radius: $border-radius__min * .5; color: $background-body; margin-right: 5px; font-size: inherit; &.disabled { background-color: $state-color__error; } @include _1599 { margin-top: 2px; } @include _1199 { margin-right: 2px; } } } } .section-content { clear: both; margin-top: 24px; margin-bottom: 16px; } .chart { max-width: 300px; position: relative; margin-bottom: 15px; margin-left: auto; margin-right: auto; .doughnut-chart-wrap { position: relative; width: 200px; height: auto; margin: 0 auto; } .llar-retries-count { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 28px; font-weight: bold; } } .desc { margin-top: 10px; color: $typography-additional; font-size: 14px; } .actions { margin-top: 5px; } } .info-box-2 { @include _1399 { width: calc(60% - 4px); } @include _1199 { width: 100%; } .section-content { overflow: visible; } .llar-chart-wrap { width: 100%; margin: 0 auto; clear: both; canvas { height: 300px; } } .chart-stats-legend { text-align: center; margin-top: 10px; } } .info-box-3 { text-align: left; @include _1399 { width: 100%; } .section-content { overflow: unset; .list-unstyled { padding-left: 5px; font-size: 14px; line-height: 1.5; } } .desc { color: $typography-secondary; font-size: 16px; line-height: 1.5; margin-bottom: 20px; } .title { color: $typography-primary; font-size: 18px; } .actions { position: relative; width: fit-content; left: 50%; transform: translateX(-50%); &__buttons { display: flex; flex-direction: row; column-gap: 16px; a { text-transform: uppercase; font-size: 16px; margin-bottom: 5px; &.button.menu__item { text-transform: none; text-align: center; } } .menu__item { min-width: 200px; max-width: 235px; padding: 7px 8px; font-size: 16px; border-radius: $border-radius__min; margin: 0 auto; @include _1599 { min-width: 160px; } &.button__transparent_orange { color: #FF7C06 !important; border: 1px solid; background: transparent; &:hover { background: $primary-colors__orange-back; border: 1px solid $primary-colors__orange; } } &.button__orange { color: $background-body !important; background: $primary-colors__orange; border: 1px solid $primary-colors__orange; //box-shadow: 0 0.312rem 0.625rem 0 rgba(255, 124, 6, 0.5); box-shadow: 0 5px 10px 0 $primary-colors__orange-semi_back; &:hover { background: $secondary-colors__dark-orange; } } &:focus { outline: none!important; box-shadow: unset!important; } } } } .remark { font-size: 14px; color: $typography-secondary; margin: 15px 16px 0; } } &.custom { .info-box-2 { flex: 0 0 calc(66.666% - 16px); width: calc(66.666% - 16px); @include _1399 { flex: 1 0 calc(50% - 8px / 2); width: calc(50% - 8px / 2); @include _991 { flex: 1 0 100%; width: 100%; min-height: 126px; } } } } } .dashboard-section-2 { display: flex; flex-wrap: wrap; justify-content: space-between; margin-bottom: 20px; > [class^="info-box-"] { flex: 0 0 calc(50% - 10px); min-height: 100px; background: $background-body; border: 1px solid #e4e4e4; padding: 15px; &:last-child { margin-right: 0; } } .info-box-1 { padding: 0; .notifications-list { padding: 0; margin: 0; li { margin: 0; border-bottom: 1px solid #e4e4e4; &:last-child { border: 0; } a { text-decoration: none; padding: 15px; font-size: 15px; display: block; &:hover { background-color: #f9f9f9; } } } } } .info-box-2 { display: flex; flex-wrap: wrap; .info-box-icon { flex: 0 0 100px; display: flex; justify-content: center; align-items: center; margin-right: 15px; .dashicons { color: #0073a0; font-size: 50px; width: auto; height: auto; } } .info-box-content { flex: 1; .title { font-size: 20px; font-weight: bold; margin-bottom: 10px; line-height: 1.5; } .desc { font-size: 15px; margin-bottom: 15px; } .actions { display: flex; justify-content: space-between; } } } } .dashboard-section-3 { display: flex; flex-wrap: nowrap; margin-bottom: 20px; column-gap: 16px; @include _1399 { gap: 8px; } @include _575 { flex-wrap: wrap; } > [class^="info-box-"] { position: relative; display: flex; flex-wrap: wrap; flex: 0 0 auto; width: calc(33.33333333% - 16px); padding: 20px 90px 26px 28px; border-radius: $border-radius; background: $background-body; box-shadow: 4px 4px 18px 0 $box-shadow__light_transparent_gray; @include _1399 { padding: 16px 25px 30px; width: calc(33.33333333% - 10px / 2); } @include _767 { padding: 16px 10px 16px; } @include _575 { flex: 0 0 100%; } .info-box-icon { flex: 0 0 auto; display: flex; justify-content: center; align-items: start; img { width: 50px; height: 50px; vertical-align: middle; margin-right: 16px; @include _1399 { width: 40px; height: 40px; margin-right: 8px; } @include _767 { width: 35px; height: 35px; margin-right: 4px; } } } .info-box-content { flex: 1; .title { color: $typography-primary; font-size: 20px; font-weight: 500; margin-bottom: 4px; line-height: 1.3; @include _767 { font-size: 16px; } a { text-decoration: none; } } .desc { font-size: 14px; } .actions { display: flex; justify-content: space-between; } } } } .dashboard-section-4 { display: flex; flex-wrap: wrap; margin-bottom: 20px; column-gap: 1rem; @include _1399 { gap: 8px; } > [class^="info-box-"] { flex: 0 0 auto; width: calc(50% - 16px); min-height: 100px; max-height: 600px; padding: 32px 23px 24px 30px; border-radius: $border-radius; background: $background-body; box-shadow: 4px 4px 18px 0 $box-shadow__light_transparent_gray; overflow: hidden; @include _1599 { max-height: 515px; padding: 27px 18px 20px 22px; } @include _1399 { width: 100%; } @include _991 { padding: 27px 16px 16px 18px; } &:last-child { margin-right: 0; } } .hint_tooltip { box-sizing: content-box; &:before { right: 25px; } &-content { font-size: 14px; color: white; @include _767 { font-size: 12px; } ul { padding-left: 16px; padding-right: 10px; li { font-size: inherit; color: inherit; margin-bottom: 0; padding-left: 10px; min-width: 120px; &::before { color: white; font-size: 12px; margin-left: -15px; } } } } &-parent { display: inline-block; position: relative; span { color: $primary-colors__orange; font-weight: 500; } .dashicons { color: $typography-additional; @include _1599 { line-height: unset; font-size: 14px; width: 12px; } @include _767 { font-size: 12px; } } } } .info-box-1 { position: relative; .section { &-title__new { .title { color: $typography-primary; font-size: 20px; font-weight: 500; } .desc { color: $typography-secondary; font-size: 16px; line-height: 1.5; margin: 40px; text-align: center; } } &-content { height: 100%; overflow: auto; scrollbar-width: thin; scrollbar-gutter: stable; padding-bottom: 30px; } } } .info-box-2 { line-height: 1.5; padding-left: 30px; @include _1599 { padding-left: 25px; } @include _991 { padding-left: 22px; } .section { &-title__new { .title { color: $typography-primary; font-size: 20px; font-weight: 500; } .desc { color: $typography-secondary; font-size: 16px; line-height: 2; @include _1599 { line-height: 1.8; } } } &-content { margin-top: 0; padding-top: 5px; .list { color: $typography-primary; font-size: 16px; font-weight: 500; margin-top: 27px; @include _1599 { font-size: 14px; margin-top: 20px; } @include _1399 { margin-top: 15px; } @include _991 { margin-top: 12px; } input { box-sizing: content-box; &:disabled, &:before { opacity: 1; pointer-events: none; } &:checked { + span { text-decoration: line-through; } } } &-add { display: none; color: $primary-colors__orange; margin-left: 10px; font-weight: 400; } input[type="checkbox"]:checked ~ .list-add { display: none; } input[type="checkbox"]:not(:checked) ~ .list-add { display: inline; } .desc { color: $typography-secondary; font-weight: 400; margin: 5px 25px; } } } } } } }PKwL\c9limit-login-attempts-reloaded/assets/sass/_help-page.scssnu[.llar-help-page { font-family: inherit; line-height: 1.5; .section-1 { display: flex; padding-top: 45px; padding-bottom: 50px; margin-bottom: 20px; border-radius: $border-radius; background-color: $background-body; box-shadow: 3px 5px 23px 0 rgba(162, 180, 189, 0.2); .block { text-align: center; flex: 1; border-right: 1px solid $typography-additional__light; &:last-child { border: 0; } .title { color: $typography-primary; font-weight: 500; font-size: 20px; } .text { color: $typography-secondary; font-size: 18px; max-width: 80%; margin: 10px auto; } .actions { text-align: center; .button { text-transform: uppercase; font-size: 18px; line-height: 1.4; padding: 4px 20px; span { text-transform: none; display: block; font-size: 12px; line-height: 13px; margin-bottom: 2px; } &.button-secondary { min-height: 40px; line-height: 40px; } } } } } .description-page { font-weight: 500; color: $typography-primary; } .documentation-section { display: flex; flex-wrap: wrap; .questions { display: flex; flex: 1 1 calc(100% - 550px); flex-direction: column; &__block { display: flex; flex: 1 1 auto; flex-direction: column; @include _1399 { flex: 1 1 100%; } .question { display: block; flex: 1 0 auto; margin-bottom: 20px; padding: 30px 40px; background-color: $background-body; border-radius: $border-radius; text-decoration: none; box-shadow: 2px 2px 9px 0 $box-shadow__light-transparent-gray; &:last-child { margin-bottom: 0; } &:hover { box-shadow: 4px 4px 18px 0 $box-shadow__light-transparent-gray; } .title { font-size: 18px; font-weight: 500; color: $typography-primary; } .desc { font-size: 16px; margin-top: 5px; color: $typography-secondary; } } } } .top-list { flex: 0 0 500px; margin-left: 20px; @include _1399 { flex: 0 0 100%; } .list__block { padding: 30px 35px; border-radius: $border-radius; background-color: $background-body; box-shadow: 4px 4px 18px 0 $box-shadow__light-transparent-gray; } ol { margin: 0; margin-left: 35px; color: $secondary-colors__blue; list-style: none; counter-reset: my-counter; li { position: relative; font-size: 16px; margin-bottom: 15px; padding: 3px; border-radius: $border-radius__min; counter-increment: my-counter; &:before { content: counter(my-counter) "."; position: absolute; left: -45px; top: 0; width: 100%; height: 100%; font-size: inherit; background-color: $background__sky-blue; border-radius: $border-radius__normal; padding: 3px 20px; } a { position: relative; color: inherit; text-decoration: none; &:hover { text-decoration: underline; } } } } } } }PKwL\"JppClimit-login-attempts-reloaded/assets/sass/limit-login-attempts.scssnu[@import "settings"; .toplevel_page_limit-login-attempts { // top level css #wpwrap { background-color: $background__sky-blue; } #wpcontent { background-color: $background__sky-blue; font-family: $font-primary, $font-secondary; font-style: $text-font-style; font-weight: $text-font-weight; color: $typography-primary; } } .limit-login-page-settings { margin: 8px 50px; @include _1799 { margin: 8px 16px 8px 0; } &__logo_block { display: flex; flex-wrap: nowrap; justify-content: space-between; align-items: baseline; font-size: 18px; margin-right: 20px; .info-box-icon { display: inline-block; margin-left: 5px; img { width: 15px; vertical-align: middle; } } } &__logo { margin-top: 21px; margin-left: 4px; max-width: 172px; } .nav-tab-wrapper { position: relative; border-bottom: unset; margin-top: 20px; .nav-tab { border: unset; background-color: unset; font-size: 16px; color: $typography-primary; font-weight: $text-font-weight; margin-left: 0; margin-right: 35px; padding: 4px 5px 6px; .llar-alert-icon { display: inline-block; vertical-align: middle; box-sizing: border-box; margin: -2px 0 0; padding: 0 1px 4px 2px; min-width: 18px; height: 18px; border-radius: 9px; background-color: #d63638; color: white; font-size: 14px; line-height: 1.4; text-align: center; } &-active { border-bottom: 4px solid $primary-colors__turquoise; } @include _991 { margin-right: 20px; } @include _767 { font-size: 14px; margin-right: .87em; } @include _575 { font-size: 12px; margin-right: .5em; } } .llar-failover-link { color: $primary-colors__turquoise; font-size: 14px; float: right; padding: 7px 15px; .llar-tooltip { &:before { right: 0; left: auto; } } } } .field-col { display: inline-block; margin-right: 20px; } .limit-login-log { table { background-color: #fff; th, td { padding: 10px; } tr:nth-child(even) { background-color: rgba(#000, .09); } } } #limit-login-app-setup-code { width: 85%; } .llar-app-notice { background-color: #fff; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1); padding: 15px; border-radius: 3px; margin-top: 20px; margin-bottom: 20px; font-size: 14px; border-left: 5px solid #ffba00; &.success { border-color: #46b450; } p { font-size: inherit; margin: 0 0 20px; &:last-child { margin-bottom: 0; } } } input[name="admin_notify_email"] { min-width: 243px; } input[name="lla_trusted_ip_origins"] { min-width: 400px; } .llar-test-email-notification-btn { text-decoration: none; margin-left: 16px; font-weight: 400; } .llar-test-email-notification-loader { .llar-app-ajax-spinner { float: none; margin: -2px 5px 0; display: none; } &.loading { .llar-app-ajax-spinner { display: inline-block; visibility: visible; } } .msg { margin-left: 5px; &.success { color: #71c21b; } } } .llar-protect-notice { font-size: 15px; color: #848484; margin-left: 10px; a { color: #222222; text-decoration: none; border-bottom: 1px dashed; } } .llar-toggle-setup-field { color: #2271b1; text-decoration-style: dashed; &:hover { color: #222; } } .setup-code-wrap { display: none; &.active { display: block; } } .app-form-field { display: none; &.active { display: table-row; } } .llar-app-field { display: none; &.active { display: table-row; } } } #llar-setting-page { color: $typography-primary; margin-top: 40px; line-height: 1.5; .title_page { margin-top: 40px; margin-bottom: 15px; color: inherit; font-size: 20px; font-weight: 500; @include _1599 { font-size: 18px; } img { width: 36px; height: 36px; vertical-align: middle; margin-right: 8px; } } .description-page { position: relative; font-size: 18px; color: $typography-secondary; padding: 30px 44px; border-radius: $border-radius; background: rgb(232 253 255 / 2%); box-shadow: 4px 4px 18px 0 $box-shadow__light-transparent-gray; @include _1599 { font-size: 16px; } } .llar-settings-wrap { margin-top: 20px; .llar-form-table { color: $typography-primary; font-size: 18px; border-collapse: separate; border-spacing: 0 18px; border-color: unset; margin-top: -18px; margin-bottom: -18px; tr { position: relative; font-size: 18px; border-radius: $border-radius; color: $typography-secondary; background: $background-body; box-shadow: 4px 4px 18px 0 $box-shadow__light-transparent-gray; @include _1599 { font-size: 16px; } th, td { font-size: inherit; line-height: inherit; border-radius: $border-radius; background-color: unset; padding: 29px 5px 32px 44px; @include _1599 { padding: 12px 5px 12px 25px; } @include _1399 { padding-left: 15px; } } th { color: $typography-primary; font-weight: 400; border-top-right-radius: unset; border-bottom-right-radius: unset; width: 300px; @include _1399 { width: 260px; } .dashicons { @extend .dashicons-secondary; font-size: 140%; width: 12px; height: 12px; margin-left: 2px; @include _1599 { font-size: 20px; } } .hint_tooltip { right: -140px; top: 30px; width: 200px; &:before { right: 142px; } } } td { color: $typography-secondary; font-size: 16px; line-height: 1.5; border-top-left-radius: unset; border-bottom-left-radius: unset; @include _1599 { font-size: 14px; } .textarea_border, .input_border { @extend .llar_input_border; &.full_area { min-width: 720px; @include _1599 { min-width: 70%; } } textarea { font-family: inherit; font-size: 16px; color: $typography-secondary; background-color: $background-body; padding-right: 24px; border: unset; scrollbar-width: thin; @include _1599 { padding-right: 18px; font-size: 14px; } &::-webkit-scrollbar { width: 8px; } &::-webkit-scrollbar-track { background-color: $typography-additional; border-radius: $border-radius__min; } &::-webkit-scrollbar-thumb { background-color: $typography-secondary; border-radius: $border-radius__min; } &:hover, &:focus { border: unset; box-shadow: unset; outline: unset; } } } select { font-family: inherit; background: $background-body url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234ACAD8FF'%3e%3cpath d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") no-repeat right 5px top 55%; background-size: 16px 16px; &.input_border { padding: 6px 64px 6px 16px; @include _1599 { padding-right: 35px; } } } input[type="checkbox"] { @extend .llar_input_checkbox; } .input_border { border-radius: $border-radius__min; &:hover, &:focus { box-shadow: unset; outline: unset; } } a.unlink { @extend .llar_turquoise; font-weight: 500; &:hover { border-bottom: unset; } } .description-additional, .description-secondary, .llar-protect-notice { font-size: 16px; line-height: inherit; color: $typography-additional; padding: 16px 8px 8px 24px; max-width: 740px; @include _1599 { font-size: 14px; } } .description-secondary, .llar-protect-notice { color: $typography-secondary; } .llar-protect-notice { font-size: inherit; color: inherit; a { text-decoration: none; border-bottom: unset; &:hover { border-bottom: 1px solid currentColor; } } } } } } } .add_block__under_table { margin: 8px 0; padding: 24px 48px; background-color: $background__sky-blue; border-radius: $border-radius; @include _1199 { padding: 16px; } .description { color: $typography-primary; font-size: 18px; line-height: 1.5; font-weight: 500; @include _1599 { font-size: 16px; } } .add_block__list { display: flex; margin-top: 16px; margin-bottom: 8px; color: $typography-secondary; font-size: 16px; flex-wrap: nowrap; justify-content: space-between; @include _1599 { flex-wrap: wrap; } .item { flex: 0 0 16%; display: flex; flex-direction: row; flex-wrap: nowrap; align-items: flex-start; @include _1599 { flex: 0 0 32%; } .icon { width: 50px; height: 50px; vertical-align: middle; margin-right: 8px; } .name { width: 80%; padding-bottom: 17px; } } } &.image_plus { .row__list { display: flex; .add_block__title { flex: 0 0 14%; margin-right: 20px; } } .add_block__list { gap: 16px; @include _1599 { column-gap: 10px; } .item { flex: 0 0 15%; flex-direction: column; align-items: start; border-radius: $border-radius; border: 1px solid $primary-colors__turquoise; @include _1599 { flex: 0 0 30%; } .name { width: unset; margin: 10px 23px 17px; } img { width: 120px; align-self: center; } } } } } .button { @extend .llar_button; } .gdpr-information-link { display: block; text-decoration: none; position: relative; &:after { content: "\f345"; font-family: dashicons; line-height: 1; font-weight: 400; font-style: normal; text-transform: none; text-rendering: auto; font-size: 22px; text-align: center; position: absolute; right: 40px; top: 50%; color: $typography-primary; transform: translateY(-50%); } } .button_block { margin-top: 24px; display: flex; flex-wrap: nowrap; column-gap: 16px; a { &.button.menu__item { text-align: center; } } } .llar-accordion { font-family: inherit; font-size: inherit; font-weight: inherit; line-height: inherit; border-radius: $border-radius; background-color: $background__sky-blue; .ui-accordion-header { color: $typography-primary; font-weight: 500; font-size: 18px; margin-top: 20px; padding: 31px 40px 31px; border: 1px solid $primary-colors__turquoise; border-bottom: 0; border-top-right-radius: $border-radius; border-top-left-radius: $border-radius; background-color: $background-body; @include _1599 { font-size: 16px; } &-collapsed { border: 0; border-radius: $border-radius; background: unset; box-shadow: 4px 4px 18px 0 $box-shadow__light-transparent-gray; } &.ui-accordion-header-active { background: white; } } .ui-accordion-content { padding-top: 0; margin-bottom: 16px; color: $typography-primary; border-bottom-right-radius: $border-radius; border-bottom-left-radius: $border-radius; border: 1px solid $primary-colors__turquoise; border-top: 0; background-color: $background-body; overflow: hidden; a { color: inherit; } .llar-form-table { margin-top: 0; border-spacing: 0; font-weight: 400; tr { box-shadow: unset; th, td { padding-top: 0; } th { padding-left: 0; } } } } } } #llar-setting-page-help { @extend #llar-setting-page; } #llar-setting-page-premium { @extend #llar-setting-page; } #llar-setting-page-debug { @extend #llar-setting-page; .llar-settings-wrap { .llar-form-table { tr { td { .textarea_border, .input_border { textarea { color: $typography-additional; } } .description-secondary { padding-left: 0; } } } } } } #llar-setting-page-logs { @extend #llar-setting-page; .add_block__under_table { margin-top: 20px; &.image_plus { box-shadow: 3px 5px 23px 0 $box-shadow__light-transparent-gray; .row__list { display: flex; .add_block__title { flex: 0 0 14%; margin-right: 20px; } } .add_block__list { gap: 18px; @include _1599 { column-gap: 10px; } .item { flex: 0 0 23%; @include _1599 { flex: 0 0 49%; } .name { margin: 10px 33px 37px; } img { margin-top: 23px; width: 154px; } } } } } .description-page { .description-secondary { a.unlink { @extend .llar_turquoise; font-weight: 500; &:hover { border-bottom: unset; } } } } } #llar-setting-page-logs__active { @extend #llar-setting-page-logs; .llar-table-header { display: flex; justify-content: space-between; align-items: flex-start; margin: 40px 0 5px; .title_page { margin-top: 0; } .right-link { font-size: 16px; line-height: 1.625; margin-right: 5px; text-align: center; .dashicons-image-rotate { font-size: 16px; vertical-align: middle; } .dashicons-editor-help { vertical-align: middle; } } } .llar-table-scroll-wrap { max-height: 400px; padding: 0 20px 30px; border-radius: $border-radius__normal; background-color: white; box-shadow: 4px 4px 18px 0 $box-shadow__light-transparent-gray; overflow-y: auto; scrollbar-width: thin; @include _1599 { padding: 0 15px 20px; } @include _1399 { padding: 0 10px 10px; } &::-webkit-scrollbar { width: 4px; } .llar-form-table { position: relative; border-collapse: separate; border-spacing: 0 3px; &.llar-preloader { &:before { content: ""; display: block; width: 100%; height: 100%; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+'); background-color: rgba(255, 255, 255, 0.7); background-repeat: no-repeat; background-position: center center; z-index: 999; position: absolute; top: 0; left: 0; } } thead { tr { th { color: $typography-primary; font-size: 16px; font-weight: 500; padding: 20px 18px; @include _1599 { font-size: 15px; padding: 15px; } @include _1399 { font-size: 12px; } } } } tbody { color: $typography-secondary; tr { &.empty-row { border-radius: $border-radius__normal; background-color: $background__sky-blue; td { &:first-child { border-top-left-radius: $border-radius__normal; border-bottom-left-radius: $border-radius__normal; } &:last-child { border-top-right-radius: $border-radius__normal; border-bottom-right-radius: $border-radius__normal; } } } td { font-size: 16px; font-weight: 400; padding: 18px; @include _1599 { font-size: 14px; padding: 14px; } @include _1399 { font-size: 14px; padding: 12px; } &.llar-col-nowrap { white-space: nowrap; } &.llar-app-log-actions { display: flex; justify-content: center; } input, select { &.input_border { @extend .llar_input_border; color: $typography-additional; border: 1px solid $typography-additional; } } select { font-family: inherit; min-width: 150px; margin-right: 25px; background-size: 16px 16px; } .llar-log-country-flag { display: flex; align-items: center; white-space: nowrap; gap: 3px; .hint_tooltip { width: fit-content; top: 33px; &:before { right: 20%; } &-content { font-size: 14px; } } .llar-tooltip { &:before { width: auto !important; } } img { width: 34px; height: auto; border-radius: $border-radius__min * .5; vertical-align: middle; margin-right: 5px; @include _1599 { width: 30px; } @include _1399 { width: 25px; } } } .button { line-height: 1; margin-right: 5px; border-radius: $border-radius__min; &:last-child { margin-right: 0; } .dashicons { vertical-align: middle; } &.llar-app-log-action-btn { min-width: 35px; text-align: center; display: inline-block; line-height: 20px; cursor: pointer; i { vertical-align: middle; } &:hover { i { color: #3c8dbc; } } } } } &:nth-child(odd) { @extend .empty-row; } } } .table-inline-preloader { text-align: center; &.hidden { display: none; } tr { td { padding: 5px; .load-more-button { a { padding-bottom: 1px; text-decoration: unset; border-bottom: 1px dashed; } } .preloader-row { display: none; align-items: center; .preloader-icon { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+'); background-size: 100%; background-repeat: no-repeat; width: 30px; height: 30px; display: inline-block; } .preloader-text { color: #999; } } } } &.loading { //display: table-footer-group; tr { td { .load-more-button { display: none; } .preloader-row { display: inline-flex; } } } } } } @extend .llar-table-app-login; } &.limit-login-app-dashboard { .llar-preloader-wrap { position: relative; &.loading { &:before { content: ""; display: block; width: 100%; height: 100%; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+'); background-color: rgba(255, 255, 255, 0.7); background-repeat: no-repeat; background-position: center center; z-index: 999; position: absolute; top: 0; left: 0; } } } .llar-app-log-pagination { > a { font-size: 16px; line-height: 1.625; } .spinner { float: none; } } .llar-app-acl-rules { display: flex; justify-content: space-between; flex-wrap: wrap; column-gap: 15px; .app-rules-col { flex: 1 0 49%; min-width: 590px; .help-link { color: $primary-colors__turquoise; font-size: 16px; padding: 10px; } .llar-form-table { thead { td { font-size: 16px; @include _1599 { font-size: 15px; } @include _1399 { font-size: 14px; } } .llar-app-acl-action-col { text-align: center; } } tbody { td { font-size: 16px; padding-right: 5px; @include _1599 { font-size: 15px; } @include _1399 { font-size: 14px; } input { min-width: 195px; } select { min-width: 200px; margin-right: 0; } .button { min-width: 20px; margin-right: 20px; border-radius: $border-radius__min; } } [class^="llar-app-rule"] { margin-top: 10px; border-radius: $border-radius__normal; td { padding-left: 45px; &:first-child { border-top-left-radius: $border-radius__normal; border-bottom-left-radius: $border-radius__normal; } &:last-child { border-top-right-radius: $border-radius__normal; border-bottom-right-radius: $border-radius__normal; } } } .llar-app-acl-action-col { padding: 10px 25px 10px 15px; text-align: center; .llar-app-acl-add-rule { min-width: 100%; } } .llar-app-rule-pass { background-color: #cffbe8; } .llar-app-rule-allow { background-color: $primary-colors__turquoise_back; } .llar-app-rule-deny { background-color: $state-color__red_back; } .llar-app-acl-remove { color: $state-color__error; border-color: $state-color__error; background-color: $state-color__red_back; } } .origin { float: right; opacity: 0.5; } } } } .llar-block-country-section { padding: 30px; background-color: white; border-radius: $border-radius__normal; box-shadow: 4px 4px 18px 0 $box-shadow__light-transparent-gray; .llar-block-country-mode { font-size: 16px; color: $typography-secondary; display: inline-block; vertical-align: middle; select { font-family: inherit; min-width: 150px; margin-right: 25px; background: $background-body url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234ACAD8FF'%3e%3cpath d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") no-repeat right 5px top 55%; background-size: 16px 16px; &.input_border { @extend .llar_input_border; } } } .llar-toggle-countries-list { font-size: 16px; color: $primary-colors__turquoise; text-decoration: none; vertical-align: middle; border-bottom: 1px solid currentColor; } .llar-block-country-list { font-size: 16px; color: $typography-primary; display: flex; flex-wrap: wrap; max-height: 400px; overflow-y: auto; &:first-child { margin-top: 0; } .llar-country { flex: 0 0 10%; label { padding-bottom: 10px; display: inline-block; } } &.llar-all-countries-selected { display: inline; margin-left: 20px; vertical-align: middle; overflow: hidden; .llar-country { margin-bottom: 0; display: inline-block; margin-right: 20px; padding-right: 20px; border-right: 1px solid $border-element__ghostly-white; label { color: $typography-primary; padding-bottom: 0; white-space: nowrap; } input[type="checkbox"] { @extend .llar_input_checkbox; } &:last-child { border-right: unset; } } } &.llar-all-countries-list { font-size: 14px; display: none; margin: 10px 0; &.visible { display: flex; border-top: 1px solid #dddada; padding-top: 10px; } } } } } } .llar-blur-block { position: absolute; top: 0; bottom: 0; left: 0; right: 0; backdrop-filter: blur(1.5px); background-color: $typography-additional__light-two; &-text { position: absolute; top: 45%; left: 50%; max-width: 46rem; width: 80%; font-size: 18px; line-height: 1.3; color: $typography-secondary; text-align: center; padding: 1.5rem 2rem; background-color: $secondary-colors-light-blue; border-radius: $border-radius; border: 1px solid $primary-colors__turquoise; transform: translate(-50%, -50%); @include _1599 { top: 40%; font-size: 16px; } @include _1399 { top: 45%; font-size: 14px; } img { max-width: 5rem; @include _1599 { max-width: 4rem; } } .title { margin-top: 1rem; font-size: 26px; font-weight: 500; @include _1599 { margin-top: .75rem; font-size: 24px; } @include _1399 { margin-top: .5rem; } } .description { margin-top: 1rem; @include _1599 { margin-top: .75rem; } @include _1399 { margin-top: .5rem; } } .footer { border-top: 1px solid $primary-colors__turquoise; padding-top: .75rem; margin-top: 1rem; font-weight: 500; @include _1599 { margin-top: .75rem; } @include _1399 { padding-top: .5rem; margin-top: .5rem; } } } &-cell { filter: blur(7px); } } .llar-table-app-login, .llar-table-no_app-login { position: relative; border-collapse: separate; border-spacing: 0 3px; &.llar-preloader { &:before { content: ""; display: block; width: 100%; height: 100%; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+'); background-color: rgba(255, 255, 255, 0.7); background-repeat: no-repeat; background-position: center center; z-index: 999; position: absolute; top: 0; left: 0; } } tr { th, td { font-size: 16px; font-weight: 400; width: fit-content; padding: 20px 2px 20px 14px; @include _1599 { font-size: 14px; padding: 15px 2px 15px 12px; } @include _1399 { padding: 12px 2px 12px 14px; } @include _767 { display: table-cell; width: fit-content; font-size: 12px; } } } thead { tr { th { color: $typography-primary; font-weight: 500; } } } tbody.login-attempts { tr { border-radius: $border-radius__normal; background-color: unset; &:nth-child(4n+1) { @extend .empty-row; background-color: $background__sky-blue; } &:nth-child(4n+3) { background-color: unset; } &:nth-child(4n+2), &:nth-child(4n+4) { background-color: $typography-additional__light-two; } td { color: $typography-secondary; &:first-child { border-top-left-radius: $border-radius__normal; border-bottom-left-radius: $border-radius__normal; } &:last-child { border-top-right-radius: $border-radius__normal; border-bottom-right-radius: $border-radius__normal; } &.llar-col-nowrap { white-space: nowrap; } select { font-family: inherit; min-width: 150px; margin-right: 25px; background-size: 16px 16px; } .hint_tooltip { box-sizing: content-box; right: 0; top: 30px; &:before { right: 25px; } &-content { font-size: 14px; color: white; @include _767 { font-size: 12px; } ul { padding-left: 16px; padding-right: 10px; li { font-size: inherit; color: inherit; margin-bottom: 0; padding-left: 10px; min-width: 120px; &::before { content: "✧"; color: white; font-size: 12px; margin-left: -15px; padding-right: 3px; } } } } &-parent { display: inline-block; position: relative; span { color: $primary-colors__orange; font-weight: 500; } .dashicons { color: $typography-additional; @include _1599 { line-height: unset; font-size: 14px; } @include _767 { font-size: 12px; } } } } .llar-log-country-flag { display: flex; align-items: center; white-space: nowrap; gap: 3px; .llar-tooltip { &:before { width: auto !important; } } .hint_tooltip { width: fit-content; right: 0; top: 35px; } img { width: 34px; height: auto; border-radius: $border-radius__min * .5; vertical-align: middle; margin-right: 4px; @include _1599 { width: 30px; } @include _1399 { width: 25px; } } } .button { line-height: 1; margin-right: 5px; border-radius: $border-radius__min; &:last-child { margin-right: 0; } .dashicons { vertical-align: middle; } &.llar-add-login-open { display: inline-block; width: 30px; min-width: unset; min-height: 30px; padding: 0; text-align: center; line-height: 20px; cursor: pointer; color: $typography-additional; border-color: currentColor; @include _767 { width: 25px; min-height: 25px; .dashicons { font-size: 14px; height: 16px; } } &:focus { outline: unset; box-shadow: unset; } &:hover { color: $primary-colors__turquoise; } } } &.button-open { padding: 0 2px; } &.cell-login { max-width: 9ch; a { display: inline-block; max-width: 9ch; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } } } .cell-id { display: inline-block; .id { font-size: 15px; max-width: 14ch; display: inline-block; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @include _1599 { font-size: 90% } } .hint_tooltip { top: 30px !important; } } .cell-role { .hint_tooltip { right: -25px; } } &.hidden-row { display: none; &.table-row-open { display: table-row; td { font-size: 16px; @include _1399 { font-size: 14px; } span { font-weight: 600; } a { white-space: nowrap; } .open_street_map { border: unset; } } } } } } .table-inline-preloader { text-align: center; &.hidden { display: none; } tr { td { padding: 5px; .load-more-button { a { padding-bottom: 1px; text-decoration: unset; border-bottom: 1px dashed; } } .preloader-row { display: none; align-items: center; .preloader-icon { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGRpc3BsYXk9ImJsb2NrIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlM2UzZTMiIHN0cm9rZS13aWR0aD0iNSIgcj0iMzIiIHN0cm9rZS1kYXNoYXJyYXk9IjE1MC43OTY0NDczNzIzMTAwNyA1Mi4yNjU0ODI0NTc0MzY2OSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0LjAxIDUwIDUwKSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+'); background-size: 100%; background-repeat: no-repeat; width: 30px; height: 30px; display: inline-block; } .preloader-text { color: #999; } } } } &.loading { tr { td { .load-more-button { display: none; } .preloader-row { display: inline-flex; } } } } } } .llar-table-no_app-login { } .llar-notice-review, .llar-notice-notify { display: flex; padding: 15px 20px 0 !important; border-left: 4px solid #333 !important; .llar-review-image { img { margin-top: 10px; margin-bottom: 20px; } span { font-size: 80px; color: orange; width: 80px; height: auto; margin-bottom: 20px; } } .llar-review-info { flex: 1; margin-left: 30px; .llar-buttons { display: flex; align-items: center; li { margin-right: 10px; .dashicons { margin-right: 5px; } } } } } .custom-app-tab { position: relative; .spinner { float: none; } .llar-app-ajax-msg { font-size: 13px; margin-top: 5px; display: block; &.error { color: red; } &.success { color: green; } } .llar-delete-app { color: #dc3232; position: absolute; bottom: 15px; right: 15px; &:hover { opacity: 0.8; } } .llar-why-use-premium-text { margin-top: 20px; .title { font-weight: bold; font-size: 16px; color: #4d4d4d; } } } #llar-progress-bar { position: fixed; top: 0; height: 6px; left: 0; width: 100%; z-index: 999999; background-color: #eee; span { height: 100%; position: absolute; display: block; width: 0; background-color: #00b357; transition: width 0.4s; } } // new design .header_massage { margin-right: 20px; #llar-header-upgrade-mc-message, #llar-header-upgrade-premium-message { position: relative; margin: 20px auto; width: fit-content; color: $primary-colors__orange_light; font-weight: $text-font-weight-bold; padding: 14px 32px; text-align: center; border-radius: $border-radius__max; border: 1px solid $border-element__red_sand; background-color: $background-element__almond; box-shadow: 0 4px 18px 0 $box-shadow__semi_transparent_gray; @include _991 { padding: 5px 14px; font-size: 11px; } @include _767 { margin-left: 16px; margin-right: 16px; } p { font-size: 16px; margin: 0; .dashicons { width: 32px; height: 32px; font-size: 32px; color: inherit; vertical-align: middle; margin-right: 5px; @include _991 { width: 16px; height: 16px; font-size: 16px; } } } &.exhausted { color: $state-color__error; font-weight: 400; margin-left: auto; margin-right: auto; padding: 12px 25px; background-color: $state-color__error_back; border: 1px solid currentColor; } .close { position: absolute; top: -6px; right: -9px; cursor: pointer; .dashicons { width: 16px; height: 24px; font-size: 24px; @include _991 { width: 16px; height: 18px; font-size: 18px; } } } } } #llar-header-login-custom-message { position: relative; margin: 20px auto; width: fit-content; color: $primary-colors__orange_light; font-weight: $text-font-weight-bold; padding: 14px 32px; text-align: center; border-radius: $border-radius__max; border: 1px solid $border-element__red_sand; background-color: $background-element__almond; box-shadow: 0 4px 18px 0 $box-shadow__semi_transparent_gray; width: 900px; font-size: 16px; border-radius: $border-radius; @include _1799 { margin-right: auto; } @include _1199 { width: 795px; } @include _991 { width: 710px; font-size: 95% } @include _767 { font-size: 90%; width: 100%; margin-right: auto; margin-left: auto; } @include _575 { width: 400px; } .message-flex { display: flex; .col-first { img { width: 150px; @include _1199 { width: 130px; } @include _767 { width: 100px; } } } .col-second { width: 30%; line-height: 1.7; color: $typography-primary; margin: 16px 25px; text-align: left; @include _1199 { margin: 16px 10px; } } .col-third { width: 45%; margin: 16px 25px; font-size: 87.5%; @include _1199 { margin: 16px 10px; } .row-first { color: $typography-secondary; font-weight: 400; } .row-second { position: relative; margin: 5px 10px; color: $typography-additional; hr { background-color: $primary-colors__orange-back; display: inline-block; width: calc(100% / 2 - 50px); border: 0; height: 2px; vertical-align: middle; } span { display: inline-flex; width: 50px; justify-content: center; } } .row-third { font-weight: 500; margin: 10px; padding: 5px 10px; background-color: $primary-colors__orange-back; border-radius: 10px; } } } } .settings_page_limit-login-attempts { .update-nag { display: none; } } #llar-welcome-page { padding: 50px 0; img { max-width: 100%; height: auto; } .llar-welcome-page-container { width: 100%; max-width: 760px; margin: 0 auto 30px; background-color: #fff; border-radius: 4px; box-shadow: 0 0 4px rgba(#000, 0.1); &.llar-premium { border-top: 5px solid #50c1cd; } .llar-welcome-page-section { padding: 20px; text-align: center; .llar-logo { text-align: center; margin-top: 20px; margin-bottom: 30px; } h2 { font-size: 2.4em; line-height: 1.4; } h3 { font-size: 1.5em; line-height: 1.4; } p { font-size: 17px; color: #444; } } .llar-welcome-page-video-wrap { img { width: 100%; height: auto; cursor: pointer; } } } .llar-welcome-page-features { display: flex; flex-wrap: wrap; justify-content: space-between; padding: 0 15px; counter-reset: cnt1; .llar-feature-item { flex: 0 0 24%; text-align: center; margin-bottom: 40px; position: relative; padding-bottom: 60px; &:before { content: counter(cnt1); counter-increment: cnt1; position: absolute; left: 50%; transform: translatex(-50%); bottom: 0; font-size: 1em; font-weight: 600; width: 40px; height: 40px; line-height: 40px; text-align: center; border-radius: 50%; background-color: #ecedef; color: #979aaa; } &:after { position: absolute; content: ''; left: -39%; width: 69%; height: 1px; bottom: 1.4em; background-color: #ecedef; } &:nth-child(4n+1) { &:after { display: none; } } .llar-feature-image { margin-bottom: 15px; } .llar-feature-info { .llar-feature-title { font-weight: bold; margin-bottom: 15px; } .llar-feature-desc { color: #979aaa; } } } @media (max-width: 768px) { display: block; } } .llar-why-recommend { text-align: left; font-size: 17px; ul { li { span { margin-right: 5px; width: auto; height: auto; font-size: 25px; vertical-align: middle; color: green; } } } } .llar-welcome-list { font-size: 17px; text-align: left; line-height: 1.4; list-style: none; li { span { margin-right: 10px; width: auto; height: auto; font-size: 22px; vertical-align: top; color: orange; } } } .llar-upgrade-btn-wrap { padding: 20px; a { display: inline-block; background-color: #e27800; color: #fff; font-size: 22px; padding: 20px; text-decoration: none; font-weight: 600; &:hover { background-color: darken(#e27800, 10%); } } } .llar-upgrade-questions { font-size: 17px; } } .dashboard_page_llar-welcome, .toplevel_page_limit-login-attempts { .update-nag, .notice:not(.llar-notice-review) { margin-top: 15px; display: none; p { margin-left: 10px; } } .video-container { position: relative; padding-bottom: 56.1%; height: 0; overflow: hidden; iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } } } #wp-admin-bar-llar-root { #wp-admin-bar-llar-root-premium { a { color: orange; } } } #toplevel_page_limit-login-attempts { .wp-menu-image.svg { background-size: 25px auto !important; margin-top: 7px; } .llar-submenu-premium-item { a { color: orange; } } } #menu-settings { li { position: relative; .llar-alert-icon { position: absolute; right: 5px; top: 7px; min-width: 15px; line-height: 15px; height: 15px; } } } #wpadminbar { li { .llar-alert-icon { .plugin-count { vertical-align: middle; margin-top: -3px; } } } } .llar-auto-update-notice { display: block !important; } .llar-attempts-chart-legend { > div { margin-right: 10px; color: #60666d; display: inline-block; &:last-child { margin-right: 0; } &:before { content: ""; display: inline-block; width: 37px; height: 9px; border: 3px solid; margin-right: 5px; vertical-align: middle; } &.legend-1 { &:before { border-color: rgba(54, 162, 235, 1); background-color: rgba(54, 162, 235, 0.3) } } &.legend-2 { &:before { border-color: rgba(174, 174, 174, 0.7); background-color: rgba(174, 174, 174, 0.2) } .llar-tooltip { &:before { left: auto; right: 0; } } } } } @import "dashboard-page"; @import "admin-dashboard-widgets"; @import "onboarding-popup"; @import "premium-tab"; @import "help-page"; @import "micro-cloud-modal"; PKwL\+۩33@limit-login-attempts-reloaded/assets/sass/login-page-styles.scssnu[#llar-login-page-gdpr { position: fixed; padding: 15px; background-color: rgba(#000,0.9); width: 100%; bottom: 0; left: 0; right: 0; color: #fff; display: block; text-align: center; box-sizing: border-box; .llar-login-page-gdpr__message { font-size: 14px; color: #fff; } }PKwL\Alimit-login-attempts-reloaded/assets/sass/_micro-cloud-modal.scssnu[.toplevel_page_limit-login-attempts { font-family: $font-primary, $font-secondary; .jconfirm { .jconfirm-box { padding: 0 !important; background-color: transparent; .jconfirm-content-pane { display: block; margin-bottom: 0; border-radius: $border-radius__normal; scrollbar-width: none; &::-webkit-scrollbar { width: 0px; } } .jconfirm-closeIcon { top: 17px !important; } .jconfirm-buttons { padding-right: 15px; } .button { @extend .llar_button; } .preloader-wrapper { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(white, 0.3); align-items: center; justify-content: center; .spinner { display: block; position: relative; float: none; visibility: hidden; top: 50%; transform: translateY(-50%); margin: 0 auto; } } .llar-disabled { .preloader-wrapper { display: block; } } .input_border { @extend .llar_input_border; font-size: 16px; min-width: 420px; padding: 15px 30px; } .popup_error_content { &__content { padding: 15px; border-radius: $border-radius__normal; background-color: $background-body; } &__body { font-size: 16px; font-weight: 400; line-height: 1.5; color: $typography-primary; padding: 0 15px; .card { padding: 0; border: unset; box-shadow: unset; &-header { color: $state-color__error; } &-body { margin-top: 10px; } } } } .micro_cloud_modal { &__content { padding: 15px; border-radius: $border-radius__normal; background: url("./images/micro-cloud-bg.webp") no-repeat center top; background-size: 100%; background-color: $background-body; } &__body { font-size: 18px; font-weight: 400; line-height: 1.5; color: $typography-primary; padding: 55px 60px; &_header { display: flex; flex-direction: row; .left_side { width: 60%; } .right_side { width: 40%; img { display: block; width: 306px; margin: 0 auto; } } .title { font-size: 44px; font-weight: 500; margin-right: 70px; text-align: left; } .description { margin-top: 10px; color: $typography-secondary; &-add { font-size: 14px; font-weight: 500; color: $typography-secondary; margin-top: 10px; padding: 10px 20px; background-color: $secondary-colors-light-blue; border-radius: $border-radius__normal; } } } .card { min-width: 100%; text-align: center; margin-top: 15px; padding: 0; border: unset; background-color: $background__sky-blue; border-radius: $border-radius; box-shadow: 2px 2px 9px 0 $box-shadow__light-transparent-gray; &-header { color: $primary-colors__orange; padding: 15px 63px; margin-bottom: 0; background-color: $primary-colors__orange-back; border-bottom: 1px solid $primary-colors__orange; border-top-left-radius: $border-radius__normal; border-top-right-radius: $border-radius__normal; .title { font-size: 20px; font-weight: 500; text-align: left; img { width: 22px; vertical-align: middle; margin-right: 15px; } } } &-body { padding: 10px 63px; text-align: left; .description { font-size: 16px; color: $typography-secondary; margin-top: 20px; } .field { &-email { margin-top: 20px; } &-checkbox { color: $typography-secondary; font-size: 16px; margin-top: 20px; } &-desc { color: $typography-secondary; font-size: 16px; margin-top: 20px; } &-image { width: 240px; margin: 0 auto; } } .button_block-single { text-align: left; margin-bottom: 30px; .description_add { font-size: 14px; color: $typography-additional; margin-top: 15px; } .llar-disabled { } } &.step-second { text-align: center; .button_block-single { text-align: center; } } .llar-upgrade-subscribe_notification { font-size: 18px; margin: 5px auto 0; .field-image img { width: 220px; margin: 0 auto; } &__error { color: $state-color__error; padding: 9px 70px; width: fit-content; border-radius: $border-radius__min; background-color: $state-color__error_back; } img { display: inline-block; width: 12.5px; margin-right: 2px; } } } } } } } } }PKwL\hbWW6limit-login-attempts-reloaded/assets/sass/_mixins.scssnu[@mixin _1799 { @media screen and (max-width: 1799.5px) { @content; } } @mixin _1599 { @media screen and (max-width: 1599.5px) { @content; } } @mixin _1399 { @media screen and (max-width: 1399.5px) { @content; } } @mixin _1199 { @media screen and (max-width: 1199.5px) { @content; } } @mixin _991 { @media screen and (max-width: 991.5px) { @content; } } @mixin _767 { @media screen and (max-width: 767.5px) { @content; } } @mixin _575 { @media screen and (max-width: 575.5px) { @content; } } @mixin _600 { @media screen and (max-width: 600px) { @content; } } @mixin _428 { @media screen and (max-width: 428px) { @content; } } @mixin _414 { @media screen and (max-width: 414px) { @content; } } @mixin _390 { @media screen and (max-width: 390px) { @content; } } @mixin _375 { @media screen and (max-width: 375px) { @content; } } @mixin _360 { @media screen and (max-width: 360px) { @content; } } @mixin _320 { @media screen and (max-width: 320px) { @content; } } @mixin _320min { @media screen and (min-width: 320px) { @content; } } @mixin _360min { @media screen and (min-width: 360px) { @content; } } @mixin _375min { @media screen and (min-width: 375px) { @content; } } @mixin _414min { @media screen and (min-width: 414px) { @content; } } @mixin _428min { @media screen and (min-width: 428px) { @content; } } @mixin _576min { @media screen and (min-width: 576px) { @content; } } @mixin _768min { @media screen and (min-width: 768px) { @content; } } @mixin _992min { @media screen and (min-width: 992px) { @content; } } @mixin _1200min { @media screen and (min-width: 1200px) { @content; } } @mixin _1400min { @media screen and (min-width: 1400px) { @content; } }PKwL\cJ~g)g)@limit-login-attempts-reloaded/assets/sass/_onboarding-popup.scssnu[.toplevel_page_limit-login-attempts { font-family: $font-primary, $font-secondary; .jconfirm { .jconfirm-box { padding: 0 !important; background-color: transparent; .jconfirm-content-pane { display: block; margin-bottom: 0; border-radius: $border-radius__normal; overflow-y: auto; scrollbar-width: none; } .jconfirm-closeIcon { top: 17px !important; } .jconfirm-buttons { padding-right: 15px; } .button { @extend .llar_button; } .button_block { margin-top: 24px; display: flex; flex-wrap: wrap; justify-content: center; column-gap: 16px; .button { font-size: 18px; margin-top: 20px; padding: 11px 60px; width: 70%; } &-horizon { display: flex; justify-content: center; margin-top: 20px; gap: 10px; .button { font-size: 18px; padding: 11px 60px; } } &-single { margin-top: 20px; .button { font-size: 18px; padding: 11px 60px; width: fit-content; } } } .llar-onboarding-popup__content { min-height: 930px; padding: 15px; background: url("./images/onboarding-bg-big.webp") center top; background-size: 100%; border-radius: $border-radius__normal; .logo { width: 90px; margin: 100px auto 50px; img { background: $background-body__transparent; border-radius: $border-radius__min; padding: 20px; } } .llar-onboarding__line { position: relative; height: 2px; width: 50%; margin: 10px auto 60px; background-color: $primary-colors__steel_blue; .point__block { position: absolute; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; left: 0; top: -30px; width: 60px; height: 60px; border-radius: 50%; background-color: transparent; .point { position: absolute; top: 22px; width: 18px; height: 18px; border-radius: 50%; background-color: $primary-colors__steel_blue; } .description { position: absolute; top: 60px; font-size: 16px; color: $typography-secondary; width: max-content; } &.active { position: absolute; background-color: $primary-colors__turquoise_semi_back; .description { color: $typography-primary; } } &.visited { .point { background-color: $primary-colors__turquoise; } } &[data-step="1"] { left: 0; transform: translateX(-50%); } &[data-step="2"] { left: 100% / 3 * 1; transform: translateX(-50%); } &[data-step="3"] { left: 100% / 3 * 2; transform: translateX(-50%); } &[data-step="4"] { left: 100%; transform: translateX(-50%); } } } .title { font-size: 32px; font-weight: 500; color: $primary-colors__orange; text-align: center; padding-top: 40px; img { width: 36px; vertical-align: text-top; } } .preloader-wrapper { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(white, 0.3); align-items: center; justify-content: center; .spinner { display: block; position: relative; float: none; visibility: hidden; top: 50%; transform: translateY(-50%); margin: 0 auto; } } .llar-disabled { .preloader-wrapper { display: block; } } .card { min-width: 768px; text-align: center; margin-top: 37px; padding: 23px 63px 60px; border: unset; background-color: $background__sky-blue; border-radius: $border-radius; box-shadow: 2px 2px 9px 0 $box-shadow__light-transparent-gray; .explanations { font-size: 14px; color: $typography-secondary; margin-top: 15px; padding: 0 35px; } .llar-upgrade-subscribe_notification, .llar-upgrade-subscribe_notification__error { display: none; color: $typography-secondary; font-size: 20px; line-height: 1.5; margin: 15px auto 0; padding: 9px 70px; width: fit-content; border-radius: $border-radius__min; background-color: white; img { display: inline-block; width: 12.5px; margin-right: 2px; } } .llar-upgrade-subscribe_notification__error { color: $state-color__error; background-color: $state-color__error_back; } } .field { &-wrap { margin-top: 23px; } &-title { color: $typography-primary; font-size: 20px; font-weight: 500; &-add { color: $typography-secondary; font-size: 18px; font-weight: 400; } } &-key, &-email { display: inline-block; line-height: 25px; margin-top: 11px; width: 100%; .input_border { @extend .llar_input_border; font-size: 16px; min-width: 420px; padding: 15px 30px; } .button { position: relative; display: inline-block; font-size: 18px; padding: 14px 30px 15px; margin-left: -25px; .dashicons { margin-left: 15px; line-height: inherit; } } } &-error { display: none; color: red; margin-top: 15px; } &-email { .input_border { min-width: 100%; } } &-desc { color: $typography-secondary; font-size: 16px; line-height: 1.5; text-align: center; margin-top: 22px; padding: 0 25px; &-add { @extend .field-desc; font-size: 18px; color: $typography-primary; } &-additional { color: $typography-additional; font-size: 16px; line-height: 1.5; text-align: left; margin-top: 12px; } } &-list { @extend .llar_list; line-height: 1.5; .item { font-size: 18px; color: $typography-secondary; &:before { color: $color-marker; } } } &-video { position: relative; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; margin-top: 24px; border-radius: $border-radius__normal; .video-container { position: relative; } #video-poster, #video-frame { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: $border-radius; } #video-poster { cursor: pointer; z-index: 1; } //.video__iframe { // display: none; // position: relative; // padding-bottom: 56.25%; // height: 0; // overflow: hidden; // border-radius: $border-radius__normal; // // &.play { // display: block; // } //} } &-checkbox { display: inline-block; color: $typography-secondary; font-size: 14px; margin-top: 10px; margin-left: 25px; text-align: left; input { margin-top: 15px; margin-left: -25px; vertical-align: top; } span { display: inline-block; margin-left: 15px; margin-top: 10px; } } &-image { width: 240px; margin: 0 auto; } } .security-alerts-options { display: flex; .info { font-size: 16px; line-height: 22px; } .buttons { display: flex; padding-left: 15px; align-items: center; span { text-transform: uppercase; cursor: pointer; width: 45px; text-align: center; vertical-align: middle; display: block; height: 34px; line-height: 34px; &.llar-act { background-color: #0A75B5; color: #fff; } &:first-child { border: 1px solid #ccc; border-radius: 4px 0 0 4px; } &:last-child { border: 1px solid #ccc; border-radius: 0 4px 4px 0; border-left: 0; } } } } } } } input[type="checkbox"] { @extend .llar_input_checkbox; } }PKwL\0'@@;limit-login-attempts-reloaded/assets/sass/_premium-tab.scssnu[#llar-setting-page-premium { font-family: inherit; line-height: 1.5; .llar-premium-page-promo { padding: 43px 80px 60px; margin-bottom: 20px; border-radius: $border-radius; background-color: $background-body; box-shadow: 3px 5px 23px 0 $box-shadow__light-transparent-gray; .section-1 { display: flex; align-items: flex-end; .text { .title { font-size: 31px; font-weight: 500; color: $primary-colors__orange; line-height: 1.4; margin-bottom: 5px; } .links { font-size: 12px; list-style: none; margin: 0; li { display: inline-block; margin-right: 20px; a { position: relative; vertical-align: middle; &.gdpr-information-link { &:after { position: relative; font-size: inherit; line-height: inherit; right: 0; vertical-align: middle; color: $typography-additional; } } } } } } .action { margin-left: auto; text-align: center; a.button { font-size: 16px; padding: 7px 35px; min-width: 250px; text-align: center; } .label { font-size: 14px; color: $typography-additional; margin-top: 9px; .dashicons { font-size: 18px; } } } &__internal { font-size: 16px; text-align: center; margin-top: 40px; color: $typography-secondary; border-radius: $border-radius; background-color: $background__sky-blue; padding: 27px 0; .llar_turquoise { display: block; } } } } .text-block-1 { margin-bottom: 20px; p { font-size: 15px; } } .llar-premium-plans-table { margin-top: 3.75rem; .content { border-radius: $border-radius__normal; background-color: $background__sky-blue; padding-right: 15px; padding-bottom: 15px; overflow-x: auto; .table_background { font-size: 16px; font-weight: 400; line-height: 1.4; width: 100%; border-collapse: inherit; border-spacing: 0; border-radius: $border-radius__normal; box-shadow: 3px 5px 23px 0 $box-shadow__light-transparent-gray; @include _1599 { font-size: 14px; } thead { tr { td { font-size: 20px; font-weight: 500; text-align: left; color: $primary-colors__turquoise; //width: 15%; min-width: 150px; padding: 16px 29px; border-top-left-radius: $border-radius__normal; border-top-right-radius: $border-radius__normal; border: 1px solid $primary-colors__turquoise_back; background-color: $primary-colors__turquoise_back; &:first-child { width: 25%; min-width: 300px; } @include _1799 { min-width: 100px; } @include _1599 { font-size: 18px; font-weight: 400; } } } } tbody { text-align: left; background-color: white; border-bottom-right-radius: $border-radius__normal; border-bottom-left-radius: $border-radius__normal; tr { position: relative; &:nth-child(even) { &::after { content: ''; position: absolute; top: 5px; bottom: 5px; left: 0; right: 0; border-radius: $border-radius__normal; background-color: $background-body; } } &:last-child { td { &:first-child { border-bottom-left-radius: $border-radius__normal; } &:last-child { border-bottom-right-radius: $border-radius__normal; } } } td { position: relative; padding: 16px 29px; border-right: 1px solid $background__sky-blue; border-bottom: 1px solid $background__sky-blue; z-index: 1; @include _1799 { padding: 12px 10px; } @include _991 { font-size: 14px; } &:last-child { border-right: unset; } .icon-lock { color: $typography-primary; width: 24px; height: 24px; } button { margin: 40px auto; padding-top: 12px; padding-bottom: 12px; width: 100%; @include _1799 { width: auto; } @include _1599 { min-width: 120px; } } .category { font-weight: 500; } .description { display: block; margin-top: 5px; color: $typography-secondary; a { color: $secondary-colors__blue; text-decoration: none; border-bottom: 1px solid currentColor; } } &.inner_fields { text-align: center; } } } } } } } } .llar-premium-plans-table { table { //width: 100%; //background-color: #fff; //table-layout: fixed; //position: relative; //border-collapse: collapse; tr { th { //text-align: center; //padding: 25px 15px; img { //width: 50px; //height: auto; //margin-bottom: 15px; } .plan-name { //font-weight: normal; //font-size: 18px; } } td { //padding: 15px; //text-align: center; .dashicons-yes { //color: #00be00; //font-size: 28px; //display: inline-block; //line-height: 1; //height: auto; //width: auto; //vertical-align: middle; } .dashicons-no-alt { //color: #e80000; //font-size: 28px; //display: inline-block; //line-height: 1; //height: auto; //width: auto; //vertical-align: middle; } .feature-value { //color: #a9a9a9; //line-height: 1.1; } } th, td { //border-left: 1px solid $border-element__ghostly-white; //border-right: 1px solid $border-element__ghostly-white; &:last-child { //border-right: 0; } &.feature { //text-align: center; //width: 30%; .name { //font-size: 16px; //font-weight: 600; } } } &:nth-child(even) { td { //background-color: #f8f8f8; } } &.table-actions { .installed-label { //color: green; } } } } }PKwL\'Q&Q&8limit-login-attempts-reloaded/assets/sass/_settings.scssnu[@import "../css/fonts/stylesheet.css"; $background-body: #FDFDFD; $background-body__transparent: #FDFDFD66; //rgba(253, 253, 253, 0.4); $background__sky-blue: #F6FBFF; $background-element__almond: #FFEFD6; $border-element__red-sand: #EBB35A; $border-element__ghostly-white: #E8E9EC; $primary-colors__orange: #FF7C06; $primary-colors__orange_light: #FF9800; $primary-colors__orange-back: #FF7C0619; //rgba(255, 124, 6, 0.1);; $primary-colors__orange-semi_back: #FF7C067F; //rgba(255, 124, 6, 0.50); $secondary-colors__dark-orange: #F07200; $state-color__error: #EC4652; $state-color__error_back: #EC46521A; //rgba(236, 70, 82, 0.1); $state-color__red_back: #FF969B26; //rgba(255, 150, 155, 0.15); $typography-primary: #2A2F40; $typography-secondary: #666D84; $typography-additional: #A4A8B7; $typography-additional__light: #A4A8B74C; //rgba(164, 168, 183, 0.3); $typography-additional__light-two: #A4A8B714; //rgba(164, 168, 183, 0.08); $primary-colors__steel_blue: #ABBFC1; $primary-colors__turquoise: #4ACAD8; $secondary-colors__blue: #5C8FDC; $secondary-colors-light-blue: #ECFAFB; $primary-colors__turquoise_semi_back: #4ACAD84D; //rgba(74, 202, 216, 0.3); $primary-colors__turquoise_back: #4ACAD819; //rgba(74, 202, 216, 0.1); $primary-colors__aero-blue: #97F6C8; $color-marker: #9762EF; $box-shadow__semi-transparent-gray: #72757B33; // rgba(114, 117, 123, 0.20); $box-shadow__light-transparent-gray: #A2B4BD33; //rgba(162, 180, 189, 0.20); @import "mixins"; $font-primary: CoFo Sans; $font-secondary: arial; $text-font: 16px; @include _1599 { $text-font: 14px; } $text-font-style: normal; $text-font-weight: 400; $text-font-weight-bold: 500; $border-radius: $text-font * 1.25; $border-radius__normal: $text-font; $border-radius__min: $border-radius__normal * .5; $border-radius__max: $border-radius * 2; .llar_hint_tooltip { display: none; position: absolute; background-color: $primary-colors__turquoise; color: white; padding: 12px 20px; width: 180px; border-radius: $border-radius; top: 26px; right: -20px; z-index: 955; &-content { @extend .llar_list; font-size: 12px; white-space: initial; text-align: left; margin-top: 0; margin-bottom: 0; } &::before { content: ""; position: absolute; top: -12px; right: 12%; border-width: 6px; border-style: solid; border-color: transparent transparent $primary-colors__turquoise transparent; } &-parent { position: relative; &:hover .hint_tooltip { display: block; } } } .toplevel_page_limit-login-attempts { * { margin: 0; padding: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .p-0 { padding: 0!important; } .pt-0_5 { padding-top: $text-font * .5 !important; } .pt-1_5 { padding-top: $text-font * 1.5 !important; } .mt-0_5 { margin-top: $text-font * .5 !important; } .mt-1_5 { margin-top: $text-font * 1.5 !important; } .mx-0_5 { margin-left: $text-font * .5 !important; margin-right: $text-font * .5 !important; } .button_micro_cloud { cursor: pointer; } .hint_tooltip { @extend .llar_hint_tooltip; } .hint_tooltip-content { @extend .llar_hint_tooltip-content; } .hint_tooltip-parent { @extend .llar_hint_tooltip-parent; } } .link__style_unlink, .link__style_color_inherit { text-decoration: none; color: inherit; position: relative; } .link__style_unlink:hover, .link__style_color_inherit:hover { color: inherit; } .link__style_color_inherit { text-decoration: none; border-bottom: 1px solid currentColor; } .no_href_link { cursor: default; } .llar_typography-secondary { color: $typography-secondary; } .llar_orange { color: $primary-colors__orange; &:hover { color: $secondary-colors__dark-orange; } } .llar_turquoise { color: $primary-colors__turquoise; } a.llar_turquoise { text-decoration: none; &:hover { text-decoration: none; color: $primary-colors__turquoise; border-bottom: 1px solid currentColor; } } .llar-label { @extend .link__style_unlink; border-radius: $border-radius__min; background-color: $primary-colors__turquoise_back; padding: .125rem 1.125rem; } .llar_bold { font-weight: bold; } .llar-display-none { display: none!important; } .llar-display-block { display: block!important; } .llar-visibility { visibility: visible!important; } .llar-hidden { visibility: hidden!important; } .mx-auto { margin-left: auto; margin-right: auto; } .llar-disabled { cursor: default !important; pointer-events: none; } .dashicons-secondary { margin-left: 8px; font-size: 170%; line-height: inherit; position: relative; z-index: 1; color: $border-element__ghostly-white; width: 15px; height: 15px; border-radius: 20px; vertical-align: middle; background: $typography-secondary; @include _767 { font-size: 1.4rem; } &:before { position: absolute; top: 50%; left: 50%; font-size: inherit; font-weight: inherit; line-height: inherit; transform: translate(-50%, -50%); } } .llar-auto-update-notice { display: block !important; } .llar_input_border { font-family: inherit; font-size: 16px; line-height: inherit; padding: 6px 8px 6px 16px; color: $primary-colors__turquoise; border-radius: $border-radius__normal; border: 1px solid $primary-colors__turquoise; width: fit-content; @include _1599 { padding: 6px 8px 6px 12px; font-size: 14px; } &:focus { box-shadow: unset; outline: none; } &::placeholder { color:inherit; opacity: 0.5; } } .llar_input_checkbox { background-color: $background-body; border: 1.5px solid $primary-colors__steel_blue; box-sizing: content-box; margin: -0.25rem 0.25rem 0 0; &:checked { background-color: $primary-colors__orange; border: 1.5px solid $primary-colors__orange; &::before { content: "\2714"; font-size: 14px; line-height: 1.1; width: 100%; height: 100%; margin: 0; color: $background-body; } } &:focus { box-shadow: unset; } } ul.llar_list { list-style: none; li { position: relative; list-style: none; font-size: 12px; white-space: initial; &::before { position: absolute; box-sizing: inherit; content: "\2727"; color: $background-body; margin-left: -18px; top: 50%; transform: translateY(-50%); } } } button.llar_button { font-family: inherit; background: $background-body; border: 1px solid $typography-primary; cursor: pointer; white-space: nowrap; vertical-align: baseline; &.menu__item { border-radius: $border-radius * .5; font-size: 16px; line-height: 1.45; padding: 6px 18px; text-align: center; @include _1599 { font-size: 14px; } @include _991 { padding: 5px 16px; } @include _428 { padding: 5px 14px; } } &:focus { outline: none!important; box-shadow: unset!important; } } .llar_button { @extend button; position: relative; min-width: 175px; text-transform: inherit; text-decoration: none; &.button { &__orange { color: white!important; background: $primary-colors__orange!important; border: 1px solid $primary-colors__orange!important; box-shadow: 0 6px 12px 0 $primary-colors__orange-semi_back!important; &:hover { background: $secondary-colors__dark-orange!important; } &:disabled { border: 1px solid $primary-colors__orange-semi_back!important; background: $primary-colors__orange-semi_back!important; cursor: auto; } } &__transparent_orange, &__transparent_grey { color: $primary-colors__orange!important; border: 1px solid currentColor!important; background: transparent!important; &.orange-back { background: $primary-colors__orange-back!important; } &:hover { background: $primary-colors__orange-back!important; border: 1px solid currentColor!important; } &:disabled { background: transparent; cursor: auto; } } &__transparent_grey { color: $typography-additional!important; &.gray-back { background: $typography-additional__light!important; } &:hover { background: $typography-additional__light!important; } } &:focus { outline: none!important; box-shadow: unset!important; } } &.tags { font-size: 16px; font-weight: 400; line-height: 1.7; border-radius: $border-radius__min; border: 1px solid $primary-colors__orange; width: fit-content; padding: 0 20px; z-index: 50; &_basic { color: $primary-colors__orange; background: $primary-colors__orange-back; &.active, &:hover { color: $background-body; background: $primary-colors__orange; } &_add { color: $primary-colors__turquoise; min-width: fit-content; border: 1px solid currentColor; background: $primary-colors__turquoise_back; a { vertical-align: middle; } &:hover { background: $primary-colors__orange-back; } } } &_add { color: $typography-additional; border: 1px solid $typography-additional; background: $typography-additional__light-two; a { vertical-align: middle; } &:hover { background: $primary-colors__orange-back; } } } &:focus { outline: none!important; box-shadow: unset!important; } } .llar-form-table { width: 100%; }PKwL\.w//*limit-login-attempts-reloaded/autoload.phpnu[ $log[ $ip ][ $user_login ], ); } $log[ $ip ][ $user_login ]['unlocked'] = true; Config::update( 'logged', $log ); } header( 'Content-Type: application/json' ); echo 'true'; exit; } public function dismiss_review_notice_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-dismiss-review', 'sec' ); $type = isset( $_POST['type'] ) ? sanitize_text_field( $_POST['type'] ) : false; if ( $type === 'dismiss' ) { Config::update( 'review_notice_shown', true ); } if ( $type === 'later' ) { Config::update( 'activation_timestamp', time() ); } wp_send_json_success( array() ); } public function dismiss_notify_notice_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-dismiss-notify-notice', 'sec' ); $type = isset( $_POST['type'] ) ? sanitize_text_field( $_POST['type'] ) : false; if ( $type === 'dismiss' ) { Config::update( 'enable_notify_notice_shown', true ); } if ( $type === 'later' ) { Config::update( 'notice_enable_notify_timestamp', time() ); } wp_send_json_success( array() ); } public function enable_notify_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-enable-notify', 'sec' ); $notify_methods = explode( ',', Config::get( 'lockout_notify' ) ); if ( ! in_array( 'email', $notify_methods ) ) { $notify_methods[] = 'email'; } Config::update( 'lockout_notify', implode( ',', $notify_methods ) ); Config::update( 'enable_notify_notice_shown', true ); wp_send_json_success( array() ); } public function app_setup_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-setup', 'sec' ); if ( ! empty( $_POST['code'] ) ) { $setup_code = sanitize_text_field( $_POST['code'] ); if ( $key_result = CloudApp::activate_license_key( $setup_code ) ) { if ( $key_result['success'] ) { wp_send_json_success( array( 'msg' => ( $key_result['app_config']['messages']['setup_success'] ) ) ); } else { wp_send_json_error( array( 'msg' => ( $key_result['error'] ) ) ); } } else { wp_send_json_error( array( 'msg' => $key_result['error'] ) ); } } wp_send_json_error( array( 'msg' => __( 'Please specify the Setup Code', 'limit-login-attempts-reloaded' ) ) ); } public function app_log_action_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-log', 'sec' ); if ( ! empty( $_POST['method'] ) && ! empty( $_POST['params'] ) ) { $method = sanitize_text_field( $_POST['method'] ); $params = (array) $_POST['params']; if ( ! in_array( $method, array( 'lockout/delete', 'acl/create', 'acl/delete' ) ) ) { wp_send_json_error( array( 'msg' => 'Wrong method.' ) ); } if ( $response = LimitLoginAttempts::$cloud_app->request( $method, 'post', $params ) ) { wp_send_json_success( array( 'msg' => $response['message'] ) ); } else { wp_send_json_error( array( 'msg' => 'The endpoint is not responding. Please contact your app provider to settle that.' ) ); } } wp_send_json_error( array( 'msg' => 'Wrong App id.' ) ); } public function app_acl_add_rule_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-acl-add-rule', 'sec' ); if ( ! empty( $_POST['pattern'] ) && ! empty( $_POST['rule'] ) && ! empty( $_POST['type'] ) ) { $pattern = sanitize_text_field( $_POST['pattern'] ); $rule = sanitize_text_field( $_POST['rule'] ); $type = sanitize_text_field( $_POST['type'] ); if ( ! in_array( $rule, array( 'pass', 'allow', 'deny' ) ) ) { wp_send_json_error( array( 'msg' => 'Wrong rule.' ) ); } if ( $response = LimitLoginAttempts::$cloud_app->acl_create( array( 'pattern' => $pattern, 'rule' => $rule, 'type' => ( $type === 'ip' ) ? 'ip' : 'login', ) ) ) { wp_send_json_success( array( 'msg' => $response['message'] ) ); } else { wp_send_json_error( array( 'msg' => 'The endpoint is not responding. Please contact your app provider to settle that.' ) ); } } wp_send_json_error( array( 'msg' => 'Wrong input data.' ) ); } public function app_acl_remove_rule_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-acl-remove-rule', 'sec' ); if ( ! empty( $_POST['pattern'] ) && ! empty( $_POST['type'] ) ) { $pattern = sanitize_text_field( $_POST['pattern'] ); $type = sanitize_text_field( $_POST['type'] ); if ( $response = LimitLoginAttempts::$cloud_app->acl_delete( array( 'pattern' => $pattern, 'type' => ( $type === 'ip' ) ? 'ip' : 'login', ) ) ) { wp_send_json_success( array( 'msg' => $response['message'] ) ); } else { wp_send_json_error( array( 'msg' => 'The endpoint is not responding. Please contact your app provider to settle that.' ) ); } } wp_send_json_error( array( 'msg' => 'Wrong input data.' ) ); } public function app_load_log_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-load-log', 'sec' ); $offset = sanitize_text_field( $_POST['offset'] ); $limit = sanitize_text_field( $_POST['limit'] ); $log = LimitLoginAttempts::$cloud_app->log( $limit, $offset ); if ( $log ) { $date_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' ); $countries_list = Helpers::get_countries_list(); ob_start(); if ( empty( $log['items'] ) && ! empty( $log['offset'] ) ) : ?>
'; } } else { echo '-'; } ?> ob_get_clean(), 'offset' => $log['offset'], 'total_items' => count( $log['items'] ) ) ); } else { wp_send_json_error( array( 'msg' => 'The endpoint is not responding. Please contact your app provider to settle that.' ) ); } } public function app_load_successful_login_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-load-login', 'sec' ); if ( empty( $_POST['limit'] ) && empty( $_POST['custom'] ) && ! $_POST['offset'] && ! $_POST['url_premium'] ) { wp_send_json_error( array() ); } $offset = sanitize_text_field( $_POST['offset'] ); $limit = sanitize_text_field( $_POST['limit'] ); $custom = sanitize_text_field( $_POST['custom'] ); $upgrade_premium_url = sanitize_text_field( $_POST['url_premium'] ); if ( $custom === 'true') { $data = LimitLoginAttempts::$cloud_app->get_login( $limit, $offset ); } else { $local_data = ['at' => time() - 60, 'login' => 'admin', 'ip' => '11.22.33.44', 'location' => ['country_code' => 'US'], 'roles' => ['administrator']]; $data['items'] = array_fill(0, 5, $local_data); $data['offset'] = ''; } if ( $data ) { $date_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' ); $current_date = date('Y-m-d'); $current_year = date('Y'); $countries_list = Helpers::get_countries_list(); $continent_list = Helpers::get_continent_list(); ob_start(); if ( empty( $data['items'] ) && ! empty( $data['offset'] ) ) : elseif ( $data['items'] ) : ?> 10; $long_ip = strlen( $ip ) > 15; $login_url = !empty( $item['user_id'] ) ? get_edit_user_link( $item['user_id'] ) : ''; $latitude = !empty( $item['location']['latitude'] ) ? $item['location']['latitude'] : false; $longitude = !empty( $item['location']['longitude'] ) ? $item['location']['longitude'] : false; $log_date_gmt = date('Y-m-d H:i:s', $item['at']); $log_local_date = get_date_from_gmt($log_date_gmt, 'Y-m-d'); $log_local_time = get_date_from_gmt($log_date_gmt, get_option('time_format')); $log_year = get_date_from_gmt($log_date_gmt, 'Y'); if ($log_local_date === $current_date) { $correct_date = __('Today at ', 'limit-login-attempts-reloaded') . $log_local_time; } elseif ($log_year === $current_year) { $log_local_month_day = get_date_from_gmt($log_date_gmt, 'M j'); $correct_date = $log_local_month_day . ' at ' . $log_local_time; } else { $correct_date = get_date_from_gmt($log_date_gmt, $date_format); } ?>
' . esc_html( $role ) . ''; endforeach; if ( ! empty ( $list_roles ) ) : ?>
Please upgrade to Premium to access this data.', 'limit-login-attempts-reloaded' ), $upgrade_premium_url ); ?>
0 ? '+' . $item['location']['timezone_offset'] : $item['location']['timezone_offset']; } ?>
ob_get_clean(), 'offset' => $data['offset'], 'total_items' => count( $data['items'] ) ) ); } else { wp_send_json_error( array( 'msg' => 'The endpoint is not responding. Please contact your app provider to settle that.' ) ); } } public function app_load_lockouts_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-load-lockouts', 'sec' ); $offset = sanitize_text_field( $_POST['offset'] ); $limit = sanitize_text_field( $_POST['limit'] ); $lockouts = LimitLoginAttempts::$cloud_app->get_lockouts( $limit, $offset ); if ( $lockouts ) { ob_start(); ?> ob_get_clean(), 'offset' => $lockouts['offset'] ) ); } elseif ( intval( LimitLoginAttempts::$cloud_app->last_response_code ) >= 400 && intval( LimitLoginAttempts::$cloud_app->last_response_code ) < 500 ) { $app_config = Config::get( 'app_config' ); wp_send_json_error( array( 'error_notice' => '

' . $app_config['messages']['sync_error'] . '

' . sprintf( __( 'Meanwhile, the app falls over to the default functionality.', 'limit-login-attempts-reloaded' ), admin_url( 'options-general.php?page=limit-login-attempts&tab=logs-local' ) ) . '

' ) ); } else { wp_send_json_error( array( 'msg' => 'The endpoint is not responding. Please contact your app provider to settle that.' ) ); } } public function app_load_acl_rules_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-load-acl-rules', 'sec' ); $type = sanitize_text_field( $_POST['type'] ); $limit = sanitize_text_field( $_POST['limit'] ); $offset = sanitize_text_field( $_POST['offset'] ); $acl_list = LimitLoginAttempts::$cloud_app->acl( array( 'type' => $type, 'limit' => $limit, 'offset' => $offset ) ); if ( $acl_list ) { ob_start(); ?> ' . esc_html( $item['origin'] ) . '
' : ''; ?> ob_get_clean(), 'offset' => $acl_list['offset'] ) ); } else { wp_send_json_error( array( 'msg' => 'The endpoint is not responding. Please contact your app provider to settle that.' ) ); } } public function app_load_country_access_rules_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-load-country-access-rules', 'sec' ); $country_rules = LimitLoginAttempts::$cloud_app->country(); if ( $country_rules ) { wp_send_json_success( $country_rules ); } else { wp_send_json_error( array( 'msg' => 'Something wrong.' ) ); } } public function app_toggle_country_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-toggle-country', 'sec' ); $code = sanitize_text_field( $_POST['code'] ); $action_type = sanitize_text_field( $_POST['type'] ); if ( ! $code ) { wp_send_json_error( array( 'msg' => 'Wrong country code.' ) ); } $result = false; if ( $action_type === 'add' ) { $result = LimitLoginAttempts::$cloud_app->country_add( array( 'code' => $code ) ); } else if ( $action_type === 'remove' ) { $result = LimitLoginAttempts::$cloud_app->country_remove( array( 'code' => $code ) ); } if ( $result ) { wp_send_json_success( array() ); } else { wp_send_json_error( array( 'msg' => 'Something wrong.' ) ); } } public function app_country_rule_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-app-country-rule', 'sec' ); $rule = sanitize_text_field( $_POST['rule'] ); if ( empty( $rule ) || ! in_array( $rule, array( 'allow', 'deny' ) ) ) { wp_send_json_error( array( 'msg' => 'Wrong rule.' ) ); } $result = LimitLoginAttempts::$cloud_app->country_rule( array( 'rule' => $rule ) ); if ( $result ) { wp_send_json_success( array() ); } else { wp_send_json_error( array( 'msg' => 'Something wrong.' ) ); } } public function subscribe_email_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-subscribe-email', 'sec' ); $email = sanitize_text_field( trim( $_POST['email'] ) ); $is_subscribe_yes = sanitize_text_field( $_POST['is_subscribe_yes'] ) === 'true'; $admin_email = ( ! is_multisite() ) ? get_option( 'admin_email' ) : get_site_option( 'admin_email' ); if ( ! empty( $email ) && is_email( $email ) ) { Config::update( 'admin_notify_email', $email ); Config::update( 'lockout_notify', 'email' ); if ( $is_subscribe_yes ) { $response = Http::post( 'https://api.limitloginattempts.com/my/key', array( 'data' => array( 'email' => $email ) ) ); if ( !empty( $response['error'] ) ) { wp_send_json_error( $response['error'] ); } else { $response_body = json_decode( $response['data'], true ); if ( ! empty( $response_body['key'] ) ) { Config::update( 'cloud_key', $response_body['key'] ); } } } wp_send_json_success( array( 'email' => $email, 'is_subscribe_yes' => $is_subscribe_yes ) ); } else if ( empty( $email ) ) { Config::update( 'admin_notify_email', $admin_email ); Config::update( 'lockout_notify', '' ); wp_send_json_success( array( 'email' => $admin_email, 'is_subscribe_yes' => '' ) ); } wp_send_json_error( array( 'email' => $email, 'is_subscribe_yes' => $is_subscribe_yes ) ); } public function strong_account_policies_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-strong-account-policies', 'sec' ); $is_checklist = sanitize_text_field( trim( $_POST['is_checklist'] ) ); Config::update( 'checklist', $is_checklist ); wp_send_json_success(); } public function block_by_country_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-block_by_country', 'sec' ); $is_checklist = sanitize_text_field( trim( $_POST['is_checklist'] ) ); Config::update( 'block_by_country', $is_checklist ); wp_send_json_success(); } public function dismiss_onboarding_popup_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-dismiss-onboarding-popup', 'sec' ); Config::update( 'onboarding_popup_shown', true ); wp_send_json_success(); } public function get_remaining_attempts_message_callback() { check_ajax_referer( 'llar-get-remaining-attempts-message', 'sec' ); if ( ! session_id() ) { session_start(); } $remaining = ! empty( $_SESSION['login_attempts_left'] ) ? intval( $_SESSION['login_attempts_left'] ) : 0; $message = ( ! $remaining ) ? '' : sprintf( _n( "%d attempt remaining.", "%d attempts remaining.", $remaining, 'limit-login-attempts-reloaded' ), $remaining ); wp_send_json_success( $message ); } public function onboarding_reset_callback() { if ( ! current_user_can( 'update_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer( 'llar-action-onboarding-reset', 'sec' ); if ( Config::get( 'active_app' ) !== 'local' || ! empty( Config::get( 'app_setup_code' ) ) ) { wp_send_json_error( array() ); } Config::update( 'onboarding_popup_shown', 0 ); wp_send_json_success(); } public function close_premium_message() { check_ajax_referer( 'llar-close-premium-message', 'sec' ); Config::update( 'notifications_message_shown', strtotime( '+1 day' ) ); wp_send_json_success(); } public function activate_micro_cloud_callback() { if ( ! current_user_can( 'update_plugins' ) ) { wp_send_json_error( array('msg' => 'Wrong country code.') ); } check_ajax_referer( 'llar-activate-micro-cloud', 'sec' ); $email = sanitize_text_field( trim( $_POST['email'] ) ); if ( ! empty( $email ) && is_email( $email ) ) { $url_api = defined( 'LLAR_MC_URL' ) ? LLAR_MC_URL : 'https://api.limitloginattempts.com/checkout/network'; $data = [ 'group' => 'free', 'email' => $email ]; $response = Http::post( $url_api, array( 'data' => $data ) ); if ( ! empty( $response['error'] ) ) { wp_send_json_error( $response['error'] ); } else { $response_body = json_decode( $response['data'], true ); if ( ! empty( $response_body['setup_code'] ) ) { if ( $key_result = CloudApp::activate_license_key( $response_body['setup_code'] ) ) { if ( $key_result['success'] ) { wp_send_json_success( array( 'msg' => ( $key_result ) ) ); } else { wp_send_json_error( array( 'msg' => ( $key_result ) ) ); } } else { wp_send_json_error( array( 'msg' => $key_result['error'] ) ); } } } } wp_send_json_error( array() ); } public function toggle_auto_update_callback() { if ( ! current_user_can( 'update_plugins' ) ) { wp_send_json_error( array() ); } if ( Helpers::is_block_automatic_update_disabled() ) { wp_send_json_error( array( 'msg' => 'Can\'t turn auto-updates on. Please ask your hosting provider or developer for assistance.') ); } check_ajax_referer( 'llar-toggle-auto-update', 'sec' ); $value = sanitize_text_field( $_POST['value'] ); $auto_update_plugins = get_site_option( 'auto_update_plugins', array() ); if( $value === 'yes' ) { $auto_update_plugins[] = LLA_PLUGIN_BASENAME; Config::update( 'auto_update_choice', 1 ); } else if ( $value === 'no' ) { if ( ( $key = array_search( LLA_PLUGIN_BASENAME, $auto_update_plugins ) ) !== false ) { unset($auto_update_plugins[$key]); } Config::update( 'auto_update_choice', 0 ); } update_site_option( 'auto_update_plugins', $auto_update_plugins ); wp_send_json_success(); } public function test_email_notifications_callback() { if ( ! current_user_can( 'activate_plugins' ) ) { wp_send_json_error( array() ); } check_ajax_referer('llar-test-email-notifications', 'sec'); $to = sanitize_email( $_POST['email'] ); if( empty( $to ) || !is_email( $to ) ) { wp_send_json_error( array( 'msg' => __( 'Wrong email format.', 'limit-login-attempts-reloaded' ), ) ); } if( wp_mail( $to, __( 'LLAR Security Notifications [TEST]', 'limit-login-attempts-reloaded' ), __( 'Your email notifications for Limit Login Attempts Reloaded are working correctly. If this email is going to spam, please be sure to add this address to your safelist.', 'limit-login-attempts-reloaded' ) ) ) { wp_send_json_success(); } else { wp_send_json_error(); } } } PKwL\{55/limit-login-attempts-reloaded/core/CloudApp.phpnu[id = 'app_' . $config['id']; $this->api = $config['api']; $this->config = $config; } /** * @param $error * @return bool */ public function add_error( $error ) { if ( ! $error ) { return false; } $this->login_errors[] = $error; } /** * @return array */ public function get_errors() { return $this->login_errors; } /** * @return null|string */ public function get_id() { return $this->id; } /** * @return array */ public function get_config() { return $this->config; } /** * @param $link * @return false[] */ public static function setup( $link ) { $return = array( 'success' => false, ); if ( empty( $link ) ) { return $return; } $link = 'https://' . $link; $domain = parse_url( home_url( '/' ) ); $link = add_query_arg( 'domain', $domain['host'], $link ); $plugin_data = get_plugin_data( LLA_PLUGIN_DIR . 'limit-login-attempts-reloaded.php' ); $link = add_query_arg( 'version', $plugin_data['Version'], $link ); $setup_response = Http::get( $link ); $setup_response_body = json_decode( $setup_response['data'], true ); if ( ! empty( $setup_response['error'] ) ) { $return['error'] = $setup_response['error']; } elseif( $setup_response['status'] === 200 ) { $return['success'] = true; $return['app_config'] = $setup_response_body; } else { $return['error'] = ( ! empty( $setup_response_body['message'] ) ) ? $setup_response_body['message'] : __( 'The endpoint is not responding. Please contact your app provider to settle that.', 'limit-login-attempts-reloaded' ); $return['response_code'] = $setup_response['status']; } return $return; } public static function activate_license_key( $setup_code ) { $link = strrev( $setup_code ); $setup_result = self::setup( $link ); if ( $setup_result['success'] ) { if ( $setup_result['app_config'] ) { Helpers::cloud_app_update_config( $setup_result['app_config'], true ); Config::update( 'active_app', 'custom' ); Config::update( 'app_setup_code', $setup_code ); $setup_result['app_config']['messages']['setup_success'] = ! empty( $setup_result['app_config']['messages']['setup_success'] ) ? $setup_result['app_config']['messages']['setup_success'] : __( 'The app has been successfully imported.', 'limit-login-attempts-reloaded' ); return $setup_result; } } else { return $setup_result; } return $setup_result; } /** * @return bool|mixed * @throws Exception */ public function stats() { if ( empty( $this->stats_cache ) ) { $this->stats_cache = $this->request( 'stats' ); } return $this->stats_cache; } /** * @return bool|mixed */ public static function stats_global() { $response = Http::get( 'https://api.limitloginattempts.com/v1/global-stats' ); if ( $response['status'] !== 200 ) { return false; } return json_decode( $response['data'], true ); } /** * @param $data * * @return bool|mixed * @throws Exception */ public function acl_check( $data ) { $this->prepare_settings( 'acl', $data ); return $this->request( 'acl', 'post', $data ); } /** * @param $data * * @return bool|mixed * @throws Exception */ public function acl( $data ) { return $this->request( 'acl', 'get', $data ); } /** * @return bool|mixed * @throws Exception */ public function info() { return $this->request( 'info' ); } /** * @param $data * * @return bool|mixed * @throws Exception */ public function acl_create( $data ) { return $this->request( 'acl/create', 'post', $data ); } /** * @param $data * * @return bool|mixed * @throws Exception */ public function acl_delete( $data ) { return $this->request( 'acl/delete', 'post', $data ); } /** * @return bool|mixed * @throws Exception */ public function country() { return $this->request( 'country', 'get' ); } /** * @param $data * @return bool|mixed * @throws Exception */ public function country_add( $data ) { return $this->request( 'country/add', 'post', $data ); } /** * @param $data * @return bool|mixed * @throws Exception */ public function country_remove( $data ) { return $this->request( 'country/remove', 'post', $data ); } /** * @param $data * * @return bool|mixed * @throws Exception */ public function country_rule( $data ) { return $this->request( 'country/rule', 'post', $data ); } /** * @param $data * * @return bool|mixed * @throws Exception */ public function lockout_check( $data ) { $this->prepare_settings( 'lockout', $data ); return $this->request( 'lockout', 'post', $data ); } /** * @param int $limit * @param string $offset * * @return bool|mixed * @throws Exception */ public function log($limit = 25, $offset = '') { $data = array(); $data['limit'] = $limit; $data['offset'] = $offset; $data['is_short'] = 1; return $this->request( 'log', 'get', $data ); } /** * @param int $limit * @param string $offset * * @return bool|mixed * @throws Exception */ public function get_login($limit = 25, $offset = '') { $data = array(); $data['limit'] = $limit; $data['offset'] = $offset; $data['is_short'] = 1; return $this->request( 'login', 'get', $data ); } /** * @param int $limit * @param string $offset * * @return bool|mixed * @throws Exception */ public function get_lockouts($limit = 25, $offset = '') { $data = array(); $data['limit'] = $limit; $data['offset'] = $offset; return $this->request( 'lockout', 'get', $data ); } /** * Prepare settings for API request * * @param $method */ public function prepare_settings( $method, &$data ) { $settings = array(); if ( ! empty( $this->config['settings'] ) ) { foreach ( $this->config['settings'] as $setting_name => $setting_data ) { if ( in_array( $method, $setting_data['methods'] ) ) { $settings[$setting_name] = $setting_data['value']; } } } if ( $settings ) { $data['settings'] = $settings; } } /** * @param $method * @param string $type * @param null $data * @return bool|mixed * @throws Exception */ public function request( $method, $type = 'get', $data = null ) { if ( ! $method ) { throw new Exception( 'You must specify API method.' ); } $headers = array(); $headers[] = "{$this->config['header']}: {$this->config['key']}"; $response = Http::$type( $this->api.'/'.$method, array( 'data' => $data, 'headers' => $headers ) ); $this->last_response_code = !empty( $response['status'] ) ? $response['status'] : 0; if ( $response['status'] !== 200 ) { return false; } return Helpers::sanitize_stripslashes_deep( json_decode( $response['data'], true ) ); } } PKwL\=7-limit-login-attempts-reloaded/core/Config.phpnu[ 0, 'gdpr_message' => '', /* Are we behind a proxy? */ 'client_type' => LLA_DIRECT_ADDR, /* Lock out after this many tries */ 'allowed_retries' => 4, /* Lock out for this many seconds */ 'lockout_duration' => 1200, // 20 minutes /* Long lock out after this many lockouts */ 'allowed_lockouts' => 4, /* Long lock out for this many seconds */ 'long_duration' => 86400, // 24 hours, /* Reset failed attempts after this many seconds */ 'valid_duration' => 86400, // 12 hours /* Also limit malformed/forged cookies? */ 'cookies' => true, /* Notify on lockout. Values: '', 'log', 'email', 'log,email' */ 'lockout_notify' => 'email', /* strong account policies */ 'checklist' => false, /* If notify by email, do so after this number of lockouts */ 'notify_email_after' => 3, 'review_notice_shown' => false, 'enable_notify_notice_shown' => false, 'whitelist' => array(), 'whitelist_usernames' => array(), 'blacklist' => array(), 'blacklist_usernames' => array(), 'active_app' => 'local', 'app_config' => '', 'show_top_level_menu_item' => true, 'show_top_bar_menu_item' => true, 'hide_dashboard_widget' => false, 'show_warning_badge' => true, 'onboarding_popup_shown' => false, 'logged' => array(), 'retries_valid' => array(), 'retries' => array(), 'lockouts' => array(), 'auto_update_choice' => null, ); private static $disable_autoload_options = array( 'lockouts', 'logged', 'retries', 'retries_valid', 'retries_stats' ); private static $prefix = 'limit_login_'; private static $use_local_options = true; public static function get_default_options() { return self::$default_options || array(); } public static function use_local_options( $value ) { self::$use_local_options = $value; } public static function init() { self::init_defaults(); self::$use_local_options = Helpers::use_local_options(); } public static function init_defaults() { self::$default_options['gdpr_message'] = __( 'By proceeding you understand and give your consent that your IP address and browser information might be processed by the security plugins installed on this site.', 'limit-login-attempts-reloaded' ); } /** * @param $name * * @return false|string */ private static function format_option_name( $name ) { if ( ! $name ) { return false; } return self::$prefix . $name; } /** * Get option by name * * @param $option_name * * @return null */ public static function get( $option_name ) { $func = self::$use_local_options ? 'get_option' : 'get_site_option'; $value = $func( self::format_option_name( $option_name ), null ); if ( is_null( $value ) && isset( self::$default_options[ $option_name ] ) ) { $value = self::$default_options[ $option_name ]; } return $value; } /** * @param $option_name * @param $value * * @return mixed */ public static function update( $option_name, $value ) { $func = self::$use_local_options ? 'update_option' : 'update_site_option'; return $func( self::format_option_name( $option_name ), $value, self::is_autoload( $option_name ) ); } /** * @param $option_name * @param $value * * @return mixed */ public static function add( $option_name, $value ) { $func = self::$use_local_options ? 'add_option' : 'add_site_option'; return $func( self::format_option_name( $option_name ), $value, '', self::is_autoload( $option_name ) ); } /** * @param $option_name * * @return mixed */ public static function delete( $option_name ) { $func = self::$use_local_options ? 'delete_option' : 'delete_site_option'; return $func( self::format_option_name( $option_name ) ); } /** * Setup main options */ public static function sanitize_options() { $simple_int_options = array( 'allowed_retries', 'lockout_duration', 'valid_duration', 'allowed_lockouts', 'long_duration', 'notify_email_after' ); foreach ( $simple_int_options as $option ) { $val = self::get( $option ); if ( (int) $val != $val || (int) $val <= 0 ) { self::update( $option, 1 ); } } if ( self::get( 'notify_email_after' ) > self::get( 'allowed_lockouts' ) ) { self::update( 'notify_email_after', self::get( 'allowed_lockouts' ) ); } $args = explode( ',', self::get( 'lockout_notify' ) ); $args_allowed = explode( ',', LLA_LOCKOUT_NOTIFY_ALLOWED ); $new_args = array_intersect( $args, $args_allowed ); self::update( 'lockout_notify', implode( ',', $new_args ) ); $client_type = self::get( 'client_type' ); if ( $client_type != LLA_DIRECT_ADDR && $client_type != LLA_PROXY_ADDR ) { self::update( 'client_type', LLA_DIRECT_ADDR ); } } /** * @param $option_name * * @return string */ private static function is_autoload( $option_name ) { return in_array( trim( $option_name ), self::$disable_autoload_options ) ? 'no' : 'yes'; } }PKwL\[ "".limit-login-attempts-reloaded/core/Helpers.phpnu[

' . $msg . '

'; } /** * @param $log * * @return array */ public static function sorted_log_by_date( $log ) { $new_log = array(); if ( ! is_array( $log ) || empty( $log ) ) { return $new_log; } foreach ( $log as $ip => $users ) { if ( ! empty( $users ) ) { foreach ( $users as $user_name => $info ) { if ( is_array( $info ) ) { // For new plugin version $new_log[ $info['date'] ] = array( 'ip' => $ip, 'username' => $user_name, 'counter' => $info['counter'], 'gateway' => ( isset( $info['gateway'] ) ) ? $info['gateway'] : '-', 'unlocked' => ! empty( $info['unlocked'] ), ); } else { // For old plugin version $new_log[0] = array( 'ip' => $ip, 'username' => $user_name, 'counter' => $info, 'gateway' => '-', 'unlocked' => false, ); } } } } krsort( $new_log ); return $new_log; } public static function get_countries_list() { if ( ! ( $countries = require LLA_PLUGIN_DIR . '/resources/countries.php' ) ) { return array(); } asort( $countries ); return $countries; } public static function get_continent_list() { if ( ! ( $continent = require LLA_PLUGIN_DIR . '/resources/continent.php' ) ) { return array(); } asort( $continent ); return $continent; } /** * @param $ip * @param $cidr * * @return bool */ public static function check_ip_cidr( $ip, $cidr ) { if ( ! $ip || ! $cidr ) { return false; } $cidr_checker = new CidrCheck(); return $cidr_checker->match( $ip, $cidr ); } /** * Checks if the plugin is installed as Must Use plugin * * @return bool */ public static function is_mu() { return ( strpos( LLA_PLUGIN_DIR, 'mu-plugins' ) !== false ); } /** * @param $content * * @return string|string[]|null */ public static function deslash( $content ) { $content = preg_replace( "/\\\+'/", "'", $content ); $content = preg_replace( '/\\\+"/', '"', $content ); $content = preg_replace( '/\\\+/', '\\', $content ); return $content; } // Solution prevents double quotes problem in json string public static function sanitize_stripslashes_deep( $value ) { if ( is_array( $value ) ) { return array_map( [self::class, 'sanitize_stripslashes_deep'], $value ); } if ( is_bool( $value ) || is_null( $value ) ) { return $value; } return sanitize_textarea_field( stripslashes( (string)$value ) ); } public static function is_auto_update_enabled() { $auto_update_plugins = get_site_option( 'auto_update_plugins' ); return is_array( $auto_update_plugins ) && in_array( LLA_PLUGIN_BASENAME, $auto_update_plugins ); } public static function is_block_automatic_update_disabled() { if ( ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) || ( defined( 'DOING_CRON' ) && DOING_CRON ) ) { return true; } return apply_filters( 'automatic_updater_disabled', false ) || ! apply_filters( 'auto_update_plugin', true, 10, 2 ); } public static function get_wordpress_version() { global $wp_version; return $wp_version; } /** * @return bool */ public static function is_network_mode() { if ( !is_multisite() ) return false; require_once ABSPATH.'wp-admin/includes/plugin.php'; return is_plugin_active_for_network( 'limit-login-attempts-reloaded/limit-login-attempts-reloaded.php' ); } /** * @return bool */ public static function allow_local_options() { if( !self::is_network_mode() ) return true; return get_site_option( 'limit_login_allow_local_options', false ); } /** * @return bool */ public static function use_local_options() { if( !self::is_network_mode() ) return true; return get_site_option( 'limit_login_allow_local_options', false ) && get_option( 'limit_login_use_local_options', false ); } /** * @param $new_app_config * @param false $update_created_at * * @return false */ public static function cloud_app_update_config( $new_app_config, $update_created_at = false ) { if( !$new_app_config ) return false; if( $active_app_config = Config::get( 'app_config' ) ) { foreach ( $active_app_config['settings'] as $key => $info ) { if( array_key_exists( $key, $new_app_config['settings'] ) ) { if( !empty( $new_app_config['settings'][$key]['options'] ) && !in_array( $info['value'], $new_app_config['settings'][$key]['options'] ) ) { continue; } $new_app_config['settings'][$key]['value'] = $info['value']; } } } if( $update_created_at ) $new_app_config['created_at'] = time(); Config::update( 'app_config', $new_app_config ); } /** * @param $filepath * * @return bool */ public static function is_writable( $filepath ) { return file_exists( $filepath ) && wp_is_writable( $filepath ); } public static function ip_in_range( $ip, $list ) { foreach ( $list as $range ) { $range = array_map('trim', explode('-', $range) ); if ( count( $range ) == 1 ) { // CIDR if( strpos( $range[0], '/' ) !== false && self::check_ip_cidr( $ip, $range[0] ) ) { return true; } // Single IP else if ( (string)$ip === (string)$range[0] ) { return true; } } else { $low = ip2long( $range[0] ); $high = ip2long( $range[1] ); $needle = ip2long( $ip ); if ( $low === false || $high === false || $needle === false ) continue; $low = (float)sprintf("%u",$low); $high = (float)sprintf("%u",$high); $needle = (float)sprintf("%u",$needle); if ( $needle >= $low && $needle <= $high ) return true; } } return false; } public static function detect_ip_address( $trusted_ip_origins ) { if( empty( $trusted_ip_origins ) || !is_array( $trusted_ip_origins ) ) { $trusted_ip_origins = array(); } if( !in_array( 'REMOTE_ADDR', $trusted_ip_origins ) ) { $trusted_ip_origins[] = 'REMOTE_ADDR'; } $ip = ''; foreach ( $trusted_ip_origins as $origin ) { if( isset( $_SERVER[$origin] ) && !empty( $_SERVER[$origin] ) ) { if( strpos( $_SERVER[$origin], ',' ) !== false ) { $origin_ips = explode( ',', $_SERVER[$origin] ); $origin_ips = array_map( 'trim', $origin_ips ); if( $origin_ips ) { foreach ($origin_ips as $check_ip) { if( self::is_ip_valid( $check_ip ) ) { $ip = $check_ip; break 2; } } } } if( self::is_ip_valid( $_SERVER[$origin] ) ) { $ip = $_SERVER[$origin]; break; } } } $ip = preg_replace('/^(\d+\.\d+\.\d+\.\d+):\d+$/', '\1', $ip); return $ip; } public static function get_all_ips() { $ips = array(); foreach ( $_SERVER as $key => $value ) { if( in_array( $key, array( 'SERVER_ADDR' ) ) ) continue; if( $valid_ip = self::is_ip_valid( $value ) ) { $ips[$key] = $valid_ip; } } if( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) && !array_key_exists( 'HTTP_X_FORWARDED_FOR', $ips ) ) { $ips['HTTP_X_FORWARDED_FOR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; } return $ips; } public static function is_ip_valid( $ip ) { if( empty( $ip ) ) return false; return filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ?: filter_var( preg_replace('/^(\d+\.\d+\.\d+\.\d+):\d+$/', '\1', $ip ), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ); } public static function detect_gateway() { $gateway = 'wp_login'; if ( isset( $_POST['woocommerce-login-nonce'] ) ) { $gateway = 'wp_woo_login'; } elseif ( isset( $GLOBALS['wp_xmlrpc_server'] ) && is_object( $GLOBALS['wp_xmlrpc_server'] ) ) { $gateway = 'wp_xmlrpc'; } return $gateway; } public static function short_number($num) { $units = array( '', 'K', 'M', 'B', 'T' ); for ($i = 0; $num >= 1000; $i++) { $num /= 1000; } return round($num, 1) . $units[$i]; } public static function send_mail_with_logo( $to, $subject, $body ) { add_action( 'phpmailer_init', array( 'LLAR\Core\Helpers', 'add_attachments_to_php_mailer' ) ); @wp_mail( $to, $subject, $body, array( 'content-type: text/html' ) ); remove_action( 'phpmailer_init', array( 'LLAR\Core\Helpers', 'add_attachments_to_php_mailer' ) ); } public static function add_attachments_to_php_mailer( &$phpmailer ) { $logo_path = LLA_PLUGIN_DIR . 'assets/img/logo.png'; if( file_exists( $logo_path ) ) { $phpmailer->AddEmbeddedImage( $logo_path, 'logo' ); } } public static function wp_locale() { return str_replace( '_', '-', get_locale() ); } }PKwL\T*qq0limit-login-attempts-reloaded/core/http/Http.phpnu[get( $url, $options ); } /** * @param $url * @param array $options * * @return mixed */ public static function post( $url, $options = array() ) { $options['headers'] = array_merge( array( 'Content-Type: application/json; charset=utf-8' ), !empty( $options['headers'] ) ? $options['headers'] : array() ); return self::$transport->post( $url, $options ); } }PKwL\i/ll=limit-login-attempts-reloaded/core/http/HttpTransportCurl.phpnu[request( $url, 'GET', $headers ); } /** * @param $url * @param array $options * * @return array */ public function post( $url, $options = array() ) { $headers = !empty( $options['headers'] ) ? $options['headers'] : array(); $data = !empty( $options['data'] ) ? $options['data'] : array(); return $this->request( $url, 'POST', $headers, $data ); } /** * @param $url * @param $method * @param array $headers * @param array $data * * @return array */ private function request( $url, $method, $headers = array(), $data = array() ) { $handle = curl_init( $url ); curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true ); if( $method === 'POST' ) { curl_setopt($handle, CURLOPT_POST, true); curl_setopt($handle, CURLOPT_POSTFIELDS, json_encode( $data, JSON_FORCE_OBJECT ) ); } if ( !empty( $headers ) ) { curl_setopt($handle, CURLOPT_HTTPHEADER, $headers); } $response = curl_exec( $handle ); $response_status = curl_getinfo( $handle, CURLINFO_HTTP_CODE ); curl_close( $handle ); return array( 'data' => $response, 'status' => intval( $response_status ), 'error' => !$response ? curl_error( $handle ) : null ); } }PKwL\TOg>limit-login-attempts-reloaded/core/http/HttpTransportFopen.phpnu[request( $url, 'GET', $headers ); } /** * @param $url * @param array $options * * @return array */ public function post( $url, $options = array() ) { $headers = !empty( $options['headers'] ) ? $options['headers'] : array(); $data = !empty( $options['data'] ) ? $options['data'] : array(); return $this->request( $url, 'POST', $headers, $data ); } /** * @param $url * @param $method * @param array $headers * @param array $data * * @return array */ private function request( $url, $method, $headers = array(), $data = array() ) { $method = strtoupper( trim( $method ) ); $request_data = null; if( !empty( $data ) ) { $request_data = json_encode( $data, JSON_FORCE_OBJECT ); } $context = stream_context_create( array( 'http' => array( 'method' => $method, 'header' => implode( "\r\n", $headers ), 'content' => $request_data ) )); $fp = @fopen( $url, 'rb', false, $context ); $error = null; $status = null; $response = null; if ( !$fp ) { if( !empty( $http_response_header[0] ) ) { list(, $code, $message ) = explode( ' ', $http_response_header[0], 3 ); $error = $message; $status = $code; } else { $last_err = error_get_last(); $error = !empty( $last_err['message'] ) ? $last_err['message'] : 'Unknown error!'; } } else { list(, $code ) = explode( ' ', $http_response_header[0], 3 ); $status = $code; $response = stream_get_contents( $fp ); } return array( 'data' => $response, 'status' => intval( $status ), 'error' => $error ); } }PKwL\4@Blimit-login-attempts-reloaded/core/http/HttpTransportInterface.phpnu[ !empty( $options['headers'] ) ? $this->format_headers( $options['headers'] ) : array(), 'body' => !empty( $options['data'] ) ? $options['data'] : array() ) ); return $this->prepare_response( $response ); } /** * @param $url * @param array $options * * @return array */ public function post( $url, $options = array() ) { $response = wp_remote_post( $url, array( 'headers' => !empty( $options['headers'] ) ? $this->format_headers( $options['headers'] ) : array(), 'body' => !empty( $options['data'] ) ? json_encode( $options['data'], JSON_FORCE_OBJECT ) : null ) ); return $this->prepare_response( $response ); } /** * @param $response * * @return array */ private function prepare_response( $response ) { $return = array( 'data' => null, 'status' => 0, 'error' => null ); if( is_wp_error( $response ) ) { $return['error'] = $response->get_error_message(); } else { $return['data'] = wp_remote_retrieve_body( $response ); $return['status'] = intval( wp_remote_retrieve_response_code( $response ) ); } return $return; } /** * @param array $headers * * @return array */ private function format_headers( $headers = array() ) { $formatted_headers = array(); if( !empty( $headers ) ) { foreach ( $headers as $header ) { list( $name, $value ) = explode( ':', $header ); $formatted_headers[ trim( $name ) ] = trim( $value ); } } return $formatted_headers; } }PKwL\R   9limit-login-attempts-reloaded/core/LimitLoginAttempts.phpnu[ array( 'name' => 'Free', 'rate' => 10, ), 'free' => array( 'name' => 'Micro Cloud', 'rate' => 20, ), 'premium' => array( 'name' => 'Premium', 'rate' => 30, ), 'plus' => array( 'name' => 'Premium +', 'rate' => 40, ), 'pro' => array( 'name' => 'Professional', 'rate' => 50, ), 'agency_pro' => array( 'name' => 'Agency', 'rate' => 60, ), ); public function __construct() { Config::init(); Http::init(); $this->hooks_init(); $this->setup(); $this->cloud_app_init(); ( new Shortcodes() )->register(); ( new Ajax() )->register(); } /** * Register wp hooks and filters */ public function hooks_init() { add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) ); add_action( 'login_enqueue_scripts', array( $this, 'login_page_enqueue' ) ); add_filter( 'limit_login_whitelist_ip', array( $this, 'check_whitelist_ips' ), 10, 2 ); add_filter( 'limit_login_whitelist_usernames', array( $this, 'check_whitelist_usernames' ), 10, 2 ); add_filter( 'limit_login_blacklist_ip', array( $this, 'check_blacklist_ips' ), 10, 2 ); add_filter( 'limit_login_blacklist_usernames', array( $this, 'check_blacklist_usernames' ), 10, 2 ); add_filter( 'illegal_user_logins', array( $this, 'register_user_blacklist' ), 999 ); add_filter( 'um_custom_authenticate_error_codes', array( $this, 'ultimate_member_register_error_codes' ) ); // TODO: Temporary turn off the holiday warning. //add_action( 'admin_notices', array( $this, 'show_enable_notify_notice' ) ); add_action( 'admin_notices', array( $this, 'show_leave_review_notice' ) ); add_action( 'admin_print_scripts-toplevel_page_limit-login-attempts', array( $this, 'load_admin_scripts' ) ); add_action( 'admin_print_scripts-settings_page_limit-login-attempts', array( $this, 'load_admin_scripts' ) ); add_action( 'admin_print_scripts-index.php', array( $this, 'load_admin_scripts' ) ); add_action( 'admin_init', array( $this, 'dashboard_page_redirect' ), 9999 ); add_action( 'admin_init', array( $this, 'setup_cookie' ), 10 ); add_action( 'login_footer', array( $this, 'login_page_gdpr_message' ) ); add_action( 'login_footer', array( $this, 'login_page_render_js' ), 9999 ); add_action( 'wp_footer', array( $this, 'login_page_render_js' ), 9999 ); if( !Config::get( 'hide_dashboard_widget' ) ) add_action( 'wp_dashboard_setup', array( $this, 'register_dashboard_widgets' ) ); register_activation_hook( LLA_PLUGIN_FILE, array( $this, 'activation' ) ); } /** * Runs when the plugin is activated */ public function activation() { if ( ! Config::get( 'activation_timestamp' ) ) { set_transient( 'llar_dashboard_redirect', true, 30 ); } } public function setup_cookie() { if ( empty( $_GET['page'] ) || $_GET['page'] !== $this->_options_page_slug ) { return; } $cookie_name = 'llar_menu_alert_icon_shown'; if ( empty( $_COOKIE[$cookie_name] ) ) { setcookie( $cookie_name, '1', strtotime( 'tomorrow' ) ); } } public function register_dashboard_widgets() { if ( ! current_user_can( 'manage_options' ) ) return; wp_add_dashboard_widget( 'llar_stats_widget', __( 'Limit Login Attempts Reloaded', 'limit-login-attempts-reloaded' ), array( $this, 'dashboard_widgets_content' ), null, null, 'normal', 'high' ); } public function dashboard_widgets_content() { include_once( LLA_PLUGIN_DIR . 'views/admin-dashboard-widgets.php' ); } /** * Redirect to dashboard page after installed */ public function dashboard_page_redirect() { if ( ! get_transient( 'llar_dashboard_redirect' ) || isset( $_GET['activate-multi'] ) || is_network_admin() ) { return; } delete_transient( 'llar_dashboard_redirect' ); wp_redirect( admin_url( 'index.php?page=' . $this->_options_page_slug ) ); exit(); } /** * Hook 'plugins_loaded' */ public function setup() { if ( ! ( $activation_timestamp = Config::get( 'activation_timestamp' ) ) ) { // Write time when the plugin is activated Config::update( 'activation_timestamp', time() ); } if ( ! ( $activation_timestamp = Config::get( 'notice_enable_notify_timestamp' ) ) ) { // Write time when the plugin is activated Config::update( 'notice_enable_notify_timestamp', strtotime( '-32 day' ) ); } if ( version_compare( Helpers::get_wordpress_version(), '5.5', '<' ) ) { Config::update( 'auto_update_choice', 0 ); } // Load languages files load_plugin_textdomain( 'limit-login-attempts-reloaded', false, plugin_basename( dirname( __FILE__ ) ) . '/../languages' ); // Check if installed old plugin $this->check_original_installed(); // Setup default plugin options //$this->sanitize_options(); add_action( 'wp_login_failed', array( $this, 'limit_login_failed' ) ); add_filter( 'wp_authenticate_user', array( $this, 'wp_authenticate_user' ), 99999, 2 ); add_action( 'wp_login', array( $this, 'limit_login_success' ), 10, 2 ); add_filter( 'shake_error_codes', array( $this, 'failure_shake' ) ); add_action( 'login_errors', array( $this, 'fixup_error_messages' ) ); if ( Helpers::is_network_mode() ) { add_action( 'network_admin_menu', array( $this, 'network_admin_menu' ) ); if ( Config::get( 'show_warning_badge' ) ) add_action( 'network_admin_menu', array( $this, 'network_setting_menu_alert_icon' ) ); } if ( Helpers::allow_local_options() ) { add_action( 'admin_menu', array( $this, 'admin_menu' ) ); if ( Config::get( 'show_top_bar_menu_item' ) ) add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 999 ); if ( Config::get( 'show_warning_badge' ) ) add_action( 'admin_menu', array( $this, 'setting_menu_alert_icon' ) ); } // Add notices for XMLRPC request add_filter( 'xmlrpc_login_error', array( $this, 'xmlrpc_error_messages' ) ); // Add notices to woocommerce login page add_action( 'wp_head', array( $this, 'add_wc_notices' ) ); /* * This action should really be changed to the 'authenticate' filter as * it will probably be deprecated. That is however only available in * later versions of WP. */ add_action( 'wp_authenticate', array( $this, 'track_credentials' ), 10, 2 ); add_action( 'authenticate', array( $this, 'authenticate_filter' ), 5, 3 ); /** * BuddyPress unactivated user account message fix * Wordfence error message fix */ add_action( 'authenticate', array( $this, 'authenticate_filter_errors_fix' ), 35, 3 ); add_filter( 'plugin_action_links_' . LLA_PLUGIN_BASENAME, array( $this, 'add_action_links' ) ); } public function login_page_gdpr_message() { if ( ! Config::get( 'gdpr' ) || isset( $_REQUEST['interim-login'] ) ) return; ?>
is_limit_login_ok() ) || ( self::$cloud_app && !empty( self::$cloud_app->get_errors() ) ) ) { return; } $is_wp_login_page = isset( $_POST['log'] ); $is_woo_login_page = ( function_exists( 'is_account_page' ) && is_account_page() && isset( $_POST['username'] ) ); $is_um_login_page = ( function_exists( 'um_is_core_page' ) && um_is_core_page( 'login' ) && !empty( $_POST ) ); if ( ( $is_wp_login_page || $is_woo_login_page || $is_um_login_page ) ) : ?> get_options_page_uri() . '">' . __( 'Dashboard', 'limit-login-attempts-reloaded' ) . '', '' . __( 'Settings', 'limit-login-attempts-reloaded' ) . '', ), $actions ); if ( Config::get( 'active_app' ) === 'local' ) { if ( empty( Config::get( 'app_setup_code' ) ) ) { $slug = $this->get_options_page_uri('dashboard#modal_micro_cloud'); $actions = array_merge( array( '' . __( 'Free Upgrade', 'limit-login-attempts-reloaded' ) . '', ), $actions ); } else { $url_site = 'https://www.limitloginattempts.com/info.php?from=plugin-plugins'; $actions = array_merge( array( '' . __( 'Upgrade to Premium', 'limit-login-attempts-reloaded' ) . '', ), $actions ); } } return $actions; } public function cloud_app_init() { if ( Config::get( 'active_app' ) === 'custom' && $config = Config::get( 'app_config' ) ) { self::$cloud_app = new CloudApp( $config ); } } public function load_admin_scripts() { if ( ! empty( $_REQUEST['page'] ) && $_REQUEST['page'] !== $this->_options_page_slug ) { return; } wp_enqueue_script('jquery-ui-accordion'); wp_enqueue_style('llar-jquery-ui', LLA_PLUGIN_URL.'assets/css/jquery-ui.css'); wp_enqueue_script( 'llar-charts', LLA_PLUGIN_URL . 'assets/js/chart.umd.js' ); } public function check_whitelist_ips( $allow, $ip ) { return Helpers::ip_in_range( $ip, ( array ) Config::get( 'whitelist' ) ); } public function check_whitelist_usernames( $allow, $username ) { return in_array( $username, ( array ) Config::get( 'whitelist_usernames' ) ); } public function check_blacklist_ips( $allow, $ip ) { return Helpers::ip_in_range( $ip, ( array ) Config::get( 'blacklist' ) ); } public function check_blacklist_usernames( $allow, $username ) { return in_array( $username, ( array ) Config::get( 'blacklist_usernames' ) ); } /** * @param $blacklist * @return array|null */ public function register_user_blacklist($blacklist) { $black_list_usernames = Config::get( 'blacklist_usernames' ); if ( ! empty( $black_list_usernames ) && is_array( $black_list_usernames ) ) { $blacklist += $black_list_usernames; } return $blacklist; } /** * @param $error IXR_Error * * @return IXR_Error */ public function xmlrpc_error_messages( $error ) { if ( ! class_exists( 'IXR_Error' ) ) { return $error; } if ( $login_error = $this->get_message() ) { return new IXR_Error( 403, strip_tags( $login_error ) ); } return $error; } /** * Errors on WooCommerce account page */ public function add_wc_notices() { global $limit_login_just_lockedout, $limit_login_nonempty_credentials, $limit_login_my_error_shown; if ( ! function_exists( 'is_account_page' ) || ! function_exists( 'wc_add_notice' ) || !$limit_login_nonempty_credentials ) { return; } /* * During lockout we do not want to show any other error messages (like * unknown user or empty password). */ if ( empty( $_POST ) && ! $this->is_limit_login_ok() && ! $limit_login_just_lockedout ) { if ( is_account_page() ) { wc_add_notice( $this->error_msg(), 'error' ); } } } /** * @param $user * @param $username * @param $password * * @return WP_Error | WP_User * @throws Exception */ public function authenticate_filter( $user, $username, $password ) { if ( ! session_id() ) { session_start(); } if ( ! empty( $username ) && ! empty( $password ) ) { if ( self::$cloud_app && $response = self::$cloud_app->acl_check( array( 'ip' => Helpers::get_all_ips(), 'login' => $username, 'gateway' => Helpers::detect_gateway() ) ) ) { if ( $response['result'] === 'deny' ) { unset( $_SESSION['login_attempts_left'] ); remove_filter( 'login_errors', array( $this, 'fixup_error_messages' ) ); remove_filter( 'wp_login_failed', array( $this, 'limit_login_failed' ) ); remove_filter( 'wp_authenticate_user', array( $this, 'wp_authenticate_user' ), 99999 ); // Remove default WP authentication filters remove_filter( 'authenticate', 'wp_authenticate_username_password', 20 ); remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 ); $err = __( 'ERROR: Too many failed login attempts.', 'limit-login-attempts-reloaded' ); $time_left = ( ! empty( $acl_result['time_left'] ) ) ? $acl_result['time_left'] : 0; if ( $time_left ) { if ( $time_left > 60 ) { $time_left = ceil( $time_left / 60 ); $err .= ' ' . sprintf( _n( 'Please try again in %d hour.', 'Please try again in %d hours.', $time_left, 'limit-login-attempts-reloaded' ), $time_left ); } else { $err .= ' ' . sprintf( _n( 'Please try again in %d minute.', 'Please try again in %d minutes.', $time_left, 'limit-login-attempts-reloaded' ), $time_left ); } } self::$cloud_app->add_error( $err ); $user = new WP_Error(); $user->add( 'username_blacklisted', $err ); if ( defined('XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) { header('HTTP/1.0 403 Forbidden' ); exit; } } elseif ( $response['result'] === 'pass' ) { remove_filter( 'login_errors', array( $this, 'fixup_error_messages' ) ); remove_filter( 'wp_login_failed', array( $this, 'limit_login_failed' ) ); remove_filter( 'wp_authenticate_user', array( $this, 'wp_authenticate_user' ), 99999 ); } } else { $ip = $this->get_address(); // Check if username is blacklisted if ( ( ! $this->is_username_whitelisted( $username ) && ! $this->is_ip_whitelisted( $ip ) ) && ( $this->is_username_blacklisted( $username ) || $this->is_ip_blacklisted( $ip ) ) ) { unset( $_SESSION['login_attempts_left'] ); remove_filter( 'login_errors', array( $this, 'fixup_error_messages' ) ); remove_filter( 'wp_login_failed', array( $this, 'limit_login_failed' ) ); remove_filter( 'wp_authenticate_user', array( $this, 'wp_authenticate_user' ), 99999 ); // Remove default WP authentication filters remove_filter( 'authenticate', 'wp_authenticate_username_password', 20 ); remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 ); $user = new WP_Error(); $user->add( 'username_blacklisted', "ERROR: Too many failed login attempts." ); if ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST ) { header('HTTP/1.0 403 Forbidden'); exit; } } elseif ( $this->is_username_whitelisted( $username ) || $this->is_ip_whitelisted( $ip ) ) { remove_filter( 'wp_login_failed', array( $this, 'limit_login_failed' ) ); remove_filter( 'wp_authenticate_user', array( $this, 'wp_authenticate_user' ), 99999 ); remove_filter( 'login_errors', array( $this, 'fixup_error_messages' ) ); } elseif ( self::$cloud_app && self::$cloud_app->last_response_code === 403 ) { add_action('wp_login', array( $this, 'cloud_app_null' ), 999); } } } return $user; } /** * Delete the CloudApp object */ public function cloud_app_null() { self::$cloud_app = null; } /** * Fix displaying the errors of other plugins * * @param $user * @param $username * @param $password * @return mixed */ public function authenticate_filter_errors_fix( $user, $username, $password ) { if ( ! empty( $username ) && ! empty( $password ) ) { if ( is_wp_error( $user ) ) { // BuddyPress errors if ( in_array('bp_account_not_activated', $user->get_error_codes() ) ) { $this->other_login_errors[] = $user->get_error_message('bp_account_not_activated'); } elseif ( in_array('wfls_captcha_verify', $user->get_error_codes() ) ) { // Wordfence errors $this->other_login_errors[] = $user->get_error_message( 'wfls_captcha_verify' ); } } } return $user; } public function ultimate_member_register_error_codes( $codes ) { if ( ! is_array( $codes ) ) { return $codes; } $codes[] = 'too_many_retries'; $codes[] = 'username_blacklisted'; return $codes; } /** * Check if the original plugin is installed */ private function check_original_installed() { require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); if ( is_plugin_active('limit-login-attempts/limit-login-attempts.php') ) { deactivate_plugins( 'limit-login-attempts/limit-login-attempts.php', true ); //add_action('plugins_loaded', 'limit_login_setup', 99999); remove_action( 'plugins_loaded', 'limit_login_setup', 99999 ); } } /** * Enqueue js and css */ public function enqueue() { $plugin_data = get_plugin_data( LLA_PLUGIN_DIR . 'limit-login-attempts-reloaded.php' ); wp_enqueue_style( 'lla-main', LLA_PLUGIN_URL . 'assets/css/limit-login-attempts.css', array(), $plugin_data['Version'] ); if ( ! empty( $_REQUEST['page'] ) && $_REQUEST['page'] === $this->_options_page_slug ) { $auto_update = wp_create_nonce( 'llar-toggle-auto-update' ); $app_setup = wp_create_nonce( 'llar-app-setup' ); $account_policies = wp_create_nonce( 'llar-strong-account-policies' ); $block_country = wp_create_nonce( 'llar-block_by_country' ); $onboarding_reset = wp_create_nonce( 'llar-action-onboarding-reset' ); $dismiss_onboarding_popup = wp_create_nonce( 'llar-dismiss-onboarding-popup' ); $activate_micro_cloud = wp_create_nonce( 'llar-activate-micro-cloud' ); $subscribe_email = wp_create_nonce( 'llar-subscribe-email' ); $close_premium_message = wp_create_nonce( 'llar-close-premium-message' ); wp_enqueue_script( 'lla-main', LLA_PLUGIN_URL . 'assets/js/limit-login-attempts.js', array('jquery'), $plugin_data['Version'], false ); wp_localize_script('lla-main', 'llar_vars', array( 'nonce_auto_update' => $auto_update, 'nonce_app_setup' => $app_setup, 'nonce_account_policies' => $account_policies, 'nonce_block_by_country' => $block_country, 'nonce_onboarding_reset' => $onboarding_reset, 'nonce_dismiss_onboarding_popup' => $dismiss_onboarding_popup, 'nonce_activate_micro_cloud' => $activate_micro_cloud, 'nonce_subscribe_email' => $subscribe_email, 'nonce_close_premium_message' => $close_premium_message, )); wp_enqueue_style( 'lla-jquery-confirm', LLA_PLUGIN_URL . 'assets/css/jquery-confirm.min.css' ); wp_enqueue_script( 'lla-jquery-confirm', LLA_PLUGIN_URL . 'assets/js/jquery-confirm.min.js' ); } } public function login_page_enqueue() { $plugin_data = get_plugin_data( LLA_PLUGIN_DIR . 'limit-login-attempts-reloaded.php' ); wp_enqueue_style( 'llar-login-page-styles', LLA_PLUGIN_URL . 'assets/css/login-page-styles.css', array(), $plugin_data['Version'] ); wp_enqueue_script( 'jquery' ); } /** * Add admin options page */ public function network_admin_menu() { add_submenu_page( 'settings.php', 'Limit Login Attempts', 'Limit Login Attempts' . $this->menu_alert_icon(), 'manage_options', $this->_options_page_slug, array( $this, 'options_page' ) ); } private function get_submenu_items() { $active_app = Config::get( 'active_app' ); $app_setup_code = Config::get( 'app_setup_code' ); $is_cloud_app_enabled = $active_app === 'custom'; $is_local_empty_setup_code = ( $active_app === 'local' && empty( $app_setup_code ) ); $submenu_items = array( array( 'id' => 'dashboard', 'name' => __( 'Dashboard', 'limit-login-attempts-reloaded' ), 'url' => '&tab=dashboard' ), array( 'id' => 'settings', 'name' => __( 'Settings', 'limit-login-attempts-reloaded' ), 'url' => '&tab=settings' ), $is_cloud_app_enabled ? array( 'id' => 'logs-custom', 'name' => __( 'Login Firewall', 'limit-login-attempts-reloaded' ), 'url' => '&tab=logs-custom' ) : array( 'id' => 'logs-local', 'name' => __( 'Logs', 'limit-login-attempts-reloaded' ), 'url' => '&tab=logs-local' ), array( 'id' => 'debug', 'name' => __( 'Debug', 'limit-login-attempts-reloaded' ), 'url' => '&tab=debug' ), array( 'id' => 'help', 'name' => __( 'Help', 'limit-login-attempts-reloaded' ), 'url' => '&tab=help' ) ); if ( ! $is_cloud_app_enabled ) { $slug = '&tab=dashboard#modal_micro_cloud'; $name_item = $is_local_empty_setup_code ? __( 'Free Upgrade', 'limit-login-attempts-reloaded' ) : __( 'Premium', 'limit-login-attempts-reloaded' ); $url_item = $is_local_empty_setup_code ? $slug : '&tab=premium'; $submenu_items[] = array( 'id' => 'premium', 'name' => __( $name_item, 'limit-login-attempts-reloaded' ), 'url' => $url_item, ); } return $submenu_items; } public function admin_menu() { global $submenu; if ( Config::get( 'show_top_level_menu_item' ) ) { add_menu_page( 'Limit Login Attempts', 'Limit Login Attempts' . $this->menu_alert_icon(), 'manage_options', $this->_options_page_slug, array( $this, 'options_page' ), 'data:image/svg+xml;base64,' . base64_encode( $this->get_svg_logo_content() ), 74 ); $is_cloud_app_enabled = Config::get( 'active_app' ) === 'custom'; $submenu_items = $this->get_submenu_items(); $index = 1; foreach ( $submenu_items as $item ) { add_submenu_page( $this->_options_page_slug, $item['name'], $item['name'], 'manage_options', $this->_options_page_slug . $item['url'], array( $this, 'options_page' ) ); if ( ! empty ( $_GET['page'] ) && $_GET['page'] === $this->_options_page_slug && ! empty( $_GET['tab'] ) && $_GET['tab'] === $item['id'] ) { $submenu[$this->_options_page_slug][$index][4] = 'current'; } $index++; } remove_submenu_page( $this->_options_page_slug, $this->_options_page_slug ); if ( ! $is_cloud_app_enabled && isset( $submenu[$this->_options_page_slug] ) ) { $submenu[$this->_options_page_slug][6][4] = ! empty($submenu[$this->_options_page_slug][6][4]) ? $submenu[$this->_options_page_slug][6][4] . ' llar-submenu-premium-item' : 'llar-submenu-premium-item'; } } else { add_options_page( 'Limit Login Attempts', 'Limit Login Attempts' . $this->menu_alert_icon(), 'manage_options', $this->_options_page_slug, array( $this, 'options_page' ) ); } } public function admin_bar_menu( $admin_bar ) { if ( ! current_user_can( 'manage_options' ) ) return; $root_item_id = 'llar-root'; $href = $this->get_options_page_uri(); $admin_bar->add_node( array( 'id' => $root_item_id, 'title' => __( 'LLAR', 'limit-login-attempts-reloaded' ) . $this->menu_alert_icon(), 'href' => $href, ) ); $submenu_items = $this->get_submenu_items(); foreach ( $submenu_items as $item ) { $admin_bar->add_node( array( 'parent' => $root_item_id, 'id' => $root_item_id . '-' . $item['id'], 'title' => $item['name'], 'href' => $href . $item['url'], ) ); } } public function get_svg_logo_content() { return file_get_contents( LLA_PLUGIN_DIR . 'assets/img/logo.svg' ); } private function menu_alert_icon() { if ( ! empty( $_COOKIE['llar_menu_alert_icon_shown'] ) || Config::get( 'active_app' ) !== 'local' || ! Config::get( 'show_warning_badge' ) ) { return ''; } $retries_count = 0; $retries_stats = Config::get( 'retries_stats' ); if ( $retries_stats ) { foreach ( $retries_stats as $key => $count ) { if ( is_numeric( $key ) && $key > strtotime( '-24 hours' ) ) { $retries_count += $count; } elseif ( ! is_numeric( $key ) && date_i18n( 'Y-m-d' ) === $key ) { $retries_count += $count; } } } if ( $retries_count < 100 ) { return ''; } return ' 1'; } public function setting_menu_alert_icon() { global $menu; if ( ! Config::get( 'show_top_level_menu_item' ) && ! empty( $menu[80][0] ) ) { $menu[80][0] .= $this->menu_alert_icon(); } } public function network_setting_menu_alert_icon() { global $menu; if ( ! empty( $menu[25][0] ) ) { $menu[25][0] .= $this->menu_alert_icon(); } } /** * Get the correct options page URI * * @param bool $tab * @return mixed */ public function get_options_page_uri( $tab = false ) { if ( is_network_admin() ) { $uri = network_admin_url( 'settings.php?page=' . $this->_options_page_slug ); } else { $uri = admin_url( 'admin.php?page=' . $this->_options_page_slug ); } if ( ! empty( $tab ) ) { $uri = add_query_arg( 'tab', $tab, $uri ); } return $uri; } /** * Fires after successful login * * @param $username * @param $user * */ public function limit_login_success( $username, $user ) { if ( ! self::$cloud_app ) { return; } if ( ! empty( $username ) ) { $clean_url = ''; if ( isset( $_SERVER['HTTP_REFERER'] ) ) { $referer_url = $_SERVER['HTTP_REFERER']; $referer_parsed = parse_url( $referer_url ); $clean_url = isset( $referer_parsed['path']) ? $referer_parsed['path'] : ''; $clean_url = trim( $clean_url, '/' ); } $user = get_user_by('login', $username); $data = array( 'ip' => Helpers::get_all_ips(), 'login' => $username, 'user_id' => $user->ID, 'gateway' => Helpers::detect_gateway(), 'roles' => $user->roles, 'agent' => $_SERVER['HTTP_USER_AGENT'], 'url' => $clean_url, ); self::$cloud_app->request( 'login', 'post', $data ); } } /** * Check if it is ok to login * * @return bool */ public function is_limit_login_ok() { $ip = $this->get_address(); /* Check external whitelist filter */ if ( $this->is_ip_whitelisted( $ip ) ) { return true; } /* lockout active? */ $lockouts = Config::get( 'lockouts' ); return ( ! is_array( $lockouts ) || ! isset( $lockouts[ $ip ] ) || time() >= $lockouts[ $ip ] ); } /** * Action when login attempt failed * * Increase nr of retries (if necessary). Reset valid value. Setup * lockout if nr of retries are above threshold. And more! * * A note on external whitelist: retries and statistics are still counted and * notifications done as usual, but no lockout is done. * * @param $username */ public function limit_login_failed( $username ) { if ( ! session_id() ) { session_start(); } $_SESSION['login_attempts_left'] = 0; if ( self::$cloud_app && $response = self::$cloud_app->lockout_check( array( 'ip' => Helpers::get_all_ips(), 'login' => $username, 'gateway' => Helpers::detect_gateway() ) ) ) { if ( $response['result'] === 'allow' ) { $_SESSION['login_attempts_left'] = intval( $response['attempts_left'] ); } elseif ( $response['result'] === 'deny' ) { global $limit_login_just_lockedout; $limit_login_just_lockedout = true; $err = __( 'ERROR: Too many failed login attempts.', 'limit-login-attempts-reloaded' ); $time_left = ( ! empty( $response['time_left'] ) ) ? $response['time_left'] : 0; if ( $time_left > 60 ) { $time_left = ceil( $time_left / 60 ); $err .= ' ' . sprintf( _n( 'Please try again in %d hour.', 'Please try again in %d hours.', $time_left, 'limit-login-attempts-reloaded' ), $time_left ); } else { $err .= ' ' . sprintf( _n( 'Please try again in %d minute.', 'Please try again in %d minutes.', $time_left, 'limit-login-attempts-reloaded' ), $time_left ); } self::$cloud_app->add_error( $err ); } } else { $ip = $this->get_address(); /* if currently locked-out, do not add to retries */ $lockouts = Config::get( 'lockouts' ); if ( ! is_array( $lockouts ) ) { $lockouts = array(); } if ( isset( $lockouts[ $ip ] ) && time() < $lockouts[ $ip ] ) { return; } /* Get the arrays with retries and retries-valid information */ $retries = Config::get( 'retries' ); $valid = Config::get( 'retries_valid' ); $retries_stats = Config::get( 'retries_stats' ); if ( ! is_array( $retries ) ) { $retries = array(); Config::add( 'retries', $retries ); } if ( ! is_array( $valid ) ) { $valid = array(); Config::add( 'retries_valid', $valid ); } if ( ! is_array( $retries_stats ) ) { $retries_stats = array(); Config::add( 'retries_stats', $retries_stats ); } $date_key = strtotime( date( 'Y-m-d H:00:00' ) ); if ( ! empty( $retries_stats[ $date_key ] ) ) { $retries_stats[ $date_key ]++; } else { $retries_stats[ $date_key ] = 1; } Config::update( 'retries_stats', $retries_stats ); /* Check validity and add one to retries */ if ( isset( $retries[ $ip ] ) && isset( $valid[ $ip ] ) && time() < $valid[ $ip ] ) { $retries[ $ip ] ++; } else { $retries[ $ip ] = 1; } $valid[ $ip ] = time() + Config::get( 'valid_duration' ); /* lockout? */ if ( $retries[ $ip ] % Config::get( 'allowed_retries' ) != 0 ) { /* * Not lockout (yet!) * Do housecleaning (which also saves retry/valid values). */ $this->cleanup( $retries, null, $valid ); $_SESSION['login_attempts_left'] = $this->calculate_retries_remaining(); return; } /* lockout! */ $whitelisted = $this->is_ip_whitelisted( $ip ); $retries_long = Config::get( 'allowed_retries' ) * Config::get( 'allowed_lockouts' ); /* * Note that retries and statistics are still counted and notifications * done as usual for whitelisted ips , but no lockout is done. */ if ( $whitelisted ) { if ( $retries[ $ip ] >= $retries_long ) { unset( $retries[ $ip ] ); unset( $valid[ $ip ] ); } } else { global $limit_login_just_lockedout; $limit_login_just_lockedout = true; /* setup lockout, reset retries as needed */ if ( ( isset($retries[ $ip ]) ? $retries[ $ip ] : 0 ) >= $retries_long ) { /* long lockout */ $lockouts[ $ip ] = time() + Config::get( 'long_duration' ); unset( $retries[ $ip ] ); unset( $valid[ $ip ] ); } else { /* normal lockout */ $lockouts[ $ip ] = time() + Config::get( 'lockout_duration' ); } } /* do housecleaning and save values */ $this->cleanup( $retries, $lockouts, $valid ); /* do any notification */ $this->notify( $username ); /* increase statistics */ $total = Config::get( 'lockouts_total' ); if ( $total === false || ! is_numeric( $total ) ) { Config::add( 'lockouts_total', 1 ); } else { Config::update( 'lockouts_total', $total + 1 ); } } } /** * Handle notification in event of lockout * * @param $user * @return bool|void */ public function notify( $user ) { if ( is_object( $user ) ) { return false; } $this->notify_log( $user ); $args = explode( ',', Config::get( 'lockout_notify' ) ); if ( empty( $args ) ) { return; } if ( in_array( 'email', $args ) ) { $this->notify_email( $user ); } } /** * Email notification of lockout to admin (if configured) * * @param $user */ public function notify_email( $user ) { $ip = $this->get_address(); $retries = Config::get( 'retries' ); if ( ! is_array( $retries ) ) { $retries = array(); } /* check if we are at the right nr to do notification */ if ( isset( $retries[ $ip ] ) && ( ( (int) $retries[ $ip ] / Config::get( 'allowed_retries' ) ) % Config::get( 'notify_email_after' ) ) != 0 ) { return; } /* Format message. First current lockout duration */ if ( ! isset( $retries[ $ip ] ) ) { /* longer lockout */ $count = Config::get( 'allowed_retries' ) * Config::get( 'allowed_lockouts' ); $lockouts = Config::get( 'allowed_lockouts' ); $time = round( Config::get( 'long_duration' ) / 3600 ); $when = sprintf( _n( '%d hour', '%d hours', $time, 'limit-login-attempts-reloaded' ), $time ); } else { /* normal lockout */ $count = $retries[ $ip ]; $lockouts = floor( ( $count ) / Config::get( 'allowed_retries' ) ); $time = round( Config::get( 'lockout_duration' ) / 60 ); $when = sprintf( _n( '%d minute', '%d minutes', $time, 'limit-login-attempts-reloaded' ), $time ); } if ( $custom_admin_email = Config::get( 'admin_notify_email' ) ) { $admin_email = $custom_admin_email; } else { $admin_email = get_site_option( 'admin_email' ); } $admin_name = ''; global $wpdb; $res = $wpdb->get_col( $wpdb->prepare( " SELECT u.display_name FROM $wpdb->users AS u LEFT JOIN $wpdb->usermeta AS m ON u.ID = m.user_id WHERE u.user_email = %s AND m.meta_key LIKE 'wp_capabilities' AND m.meta_value LIKE '%administrator%'", $admin_email ) ); if ( $res ) { $admin_name = $res[0]; } $site_domain = str_replace( array( 'http://', 'https://' ), '', home_url() ); $blogname = Helpers::use_local_options() ? get_option( 'blogname' ) : get_site_option( 'site_name' ); $blogname = htmlspecialchars_decode( $blogname, ENT_QUOTES ); $plugin_data = get_plugin_data( LLA_PLUGIN_DIR . 'limit-login-attempts-reloaded.php' ); $subject = sprintf( __( "Failed login by IP %s www.limitloginattempts.com", 'limit-login-attempts-reloaded' ), $ip ); ob_start(); include LLA_PLUGIN_DIR . 'views/emails/failed-login.php'; $email_body = ob_get_clean(); $placeholders = array( '{name}' => $admin_name, '{domain}' => $site_domain, '{attempts_count}' => $count, '{lockouts_count}' => $lockouts, '{ip_address}' => $ip, '{username}' => $user, '{blocked_duration}' => $when, '{dashboard_url}' => admin_url( 'options-general.php?page=' . $this->_options_page_slug ), '{premium_url}' => 'https://www.limitloginattempts.com/info.php?from=plugin-lockout-email&v=' . $plugin_data['Version'], '{llar_url}' => 'https://www.limitloginattempts.com/?from=plugin-lockout-email&v=' . $plugin_data['Version'], '{unsubscribe_url}' => admin_url( 'options-general.php?page=' . $this->_options_page_slug . '&tab=settings' ), ); $email_body = str_replace( array_keys( $placeholders ), array_values( $placeholders ), $email_body ); Helpers::send_mail_with_logo( $admin_email, $subject, $email_body ); } /** * Logging of lockout (if configured) * * @param $user_login * * @internal param $user */ public function notify_log( $user_login ) { if ( ! $user_login ) { return; } $log = $option = Config::get( 'logged' ); if ( ! is_array( $log ) ) { $log = array(); } $ip = $this->get_address(); /* can be written much simpler, if you do not mind php warnings */ if ( ! isset( $log[ $ip ] ) ) { $log[ $ip ] = array(); } if ( ! isset( $log[ $ip ][ $user_login ] ) ) { $log[ $ip ][ $user_login ] = array( 'counter' => 0 ); } elseif ( ! is_array( $log[ $ip ][ $user_login ] ) ) { $log[ $ip ][ $user_login ] = array( 'counter' => $log[ $ip ][ $user_login ] ); } $log[ $ip ][ $user_login ]['counter']++; $log[ $ip ][ $user_login ]['date'] = time(); $log[ $ip ][ $user_login ]['gateway'] = Helpers::detect_gateway(); if ( $option === false ) { Config::add( 'logged', $log ); } else { Config::update( 'logged', $log ); } } /** * Check if IP is whitelisted. * * This function allow external ip whitelisting using a filter. Note that it can * be called multiple times during the login process. * * Note that retries and statistics are still counted and notifications * done as usual for whitelisted ips , but no lockout is done. * * Example: * function my_ip_whitelist($allow, $ip) { * return ($ip == 'my-ip') ? true : $allow; * } * add_filter('limit_login_whitelist_ip', 'my_ip_whitelist', 10, 2); * * @param null $ip * * @return bool */ public function is_ip_whitelisted( $ip = null ) { if ( is_null( $ip ) ) { $ip = $this->get_address(); } $whitelisted = apply_filters( 'limit_login_whitelist_ip', false, $ip ); return ( $whitelisted === true ); } public function is_username_whitelisted( $username ) { if ( empty( $username ) ) { return false; } $whitelisted = apply_filters( 'limit_login_whitelist_usernames', false, $username ); return ( $whitelisted === true ); } public function is_ip_blacklisted( $ip = null ) { if ( is_null( $ip ) ) { $ip = $this->get_address(); } $blacklisted = apply_filters( 'limit_login_blacklist_ip', false, $ip ); return ( $blacklisted === true ); } public function is_username_blacklisted( $username ) { if ( empty( $username ) ) { return false; } $whitelisted = apply_filters( 'limit_login_blacklist_usernames', false, $username ); return ( $whitelisted === true ); } /** * Filter: allow login attempt? (called from wp_authenticate()) * * @param $user WP_User * @param $password * * @return WP_Error|WP_User */ public function wp_authenticate_user( $user, $password ) { if ( is_wp_error( $user ) ) { return $user; } $user_login = ''; if ( is_a( $user, 'WP_User' ) ) { $user_login = $user->user_login; } elseif( ! empty( $user ) && !is_wp_error( $user ) ) { $user_login = $user; } if ( $this->check_whitelist_ips( false, $this->get_address() ) || $this->check_whitelist_usernames( false, $user_login ) || $this->is_limit_login_ok() ) { return $user; } $error = new WP_Error(); global $limit_login_my_error_shown; $limit_login_my_error_shown = true; if ( $this->is_username_blacklisted( $user_login ) || $this->is_ip_blacklisted( $this->get_address() ) ) { $error->add( 'username_blacklisted', "ERROR: Too many failed login attempts." ); } else { // This error should be the same as in "shake it" filter below $error->add( 'too_many_retries', $this->error_msg() ); } return $error; } /** * Filter: add this failure to login page "Shake it!" * * @param $error_codes * * @return array */ public function failure_shake( $error_codes ) { $error_codes[] = 'too_many_retries'; $error_codes[] = 'username_blacklisted'; return $error_codes; } /** * Keep track of if user or password are empty, to filter errors correctly * * @param $user * @param $password */ public function track_credentials( $user, $password ) { global $limit_login_nonempty_credentials; $limit_login_nonempty_credentials = ( ! empty( $user ) && ! empty( $password ) ); } /** * Construct informative error message * * @return string */ public function error_msg() { $ip = $this->get_address(); $lockouts = Config::get( 'lockouts' ); $a = $this->checkKey($lockouts, $ip); $b = $this->checkKey($lockouts, $this->getHash($ip)); $msg = __( 'ERROR: Too many failed login attempts.', 'limit-login-attempts-reloaded' ) . ' '; if ( ! is_array( $lockouts ) || ( ! isset( $lockouts[ $ip ] ) && ! isset( $lockouts[ $this->getHash( $ip ) ] ) ) || ( time() >= $a && time() >= $b ) ){ /* Huh? No timeout active? */ $msg .= __( 'Please try again later.', 'limit-login-attempts-reloaded' ); return $msg; } $when = ceil( ( ($a > $b ? $a : $b) - time() ) / 60 ); if ( $when > 60 ) { $when = ceil( $when / 60 ); $msg .= sprintf( _n( 'Please try again in %d hour.', 'Please try again in %d hours.', $when, 'limit-login-attempts-reloaded' ), $when ); } else { $msg .= sprintf( _n( 'Please try again in %d minute.', 'Please try again in %d minutes.', $when, 'limit-login-attempts-reloaded' ), $when ); } return $msg; } /** * Fix up the error message before showing it * * @param $content * * @return string */ public function fixup_error_messages( $content ) { global $limit_login_just_lockedout, $limit_login_nonempty_credentials, $limit_login_my_error_shown; $error_msg = $this->get_message(); if ( $limit_login_nonempty_credentials ) { $content = ''; if ( $this->other_login_errors ) { foreach ( $this->other_login_errors as $msg ) { $content .= $msg . "
\n"; } } elseif ( ! $limit_login_just_lockedout ) { /* Replace error message, including ours if necessary */ if ( ! empty( $_REQUEST['log'] ) && is_email( $_REQUEST['log'] ) ) { $content = __( 'ERROR: Incorrect email address or password.', 'limit-login-attempts-reloaded' ) . "
\n"; } else { $content = __( 'ERROR: Incorrect username or password.', 'limit-login-attempts-reloaded' ) . "
\n"; } } if ( $error_msg ) { $content .= ( !empty( $content ) ) ? "
\n" : ''; $content .= $error_msg . "
\n"; } } return $content; } public function fixup_error_messages_wc( \WP_Error $error ) { $error->add( 1, __( 'WC Error', 'limit-login-attempts-reloaded' ) ); } /** * Return current (error) message to show, if any * * @return string */ public function get_message() { if ( self::$cloud_app ) { $app_errors = self::$cloud_app->get_errors(); return ! empty( $app_errors ) ? implode( '
', $app_errors ) : ''; } /* Check external whitelist */ if ( $this->is_ip_whitelisted() ) { return ''; } /* Is lockout in effect? */ if ( ! $this->is_limit_login_ok() ) { return $this->error_msg(); } return ''; } private function calculate_retries_remaining() { $remaining = 0; $ip = $this->get_address(); $retries = Config::get( 'retries' ); $valid = Config::get( 'retries_valid' ); $a = $this->checkKey($retries, $ip); $b = $this->checkKey($retries, $this->getHash($ip)); $c = $this->checkKey($valid, $ip); $d = $this->checkKey($valid, $this->getHash($ip)); /* Should we show retries remaining? */ if ( ! is_array( $retries ) || ! is_array( $valid ) ) { /* no retries at all */ return $remaining; } if ( ( ! isset( $retries[ $ip ] ) && ! isset( $retries[ $this->getHash($ip) ] )) || ( ! isset( $valid[ $ip ] ) && ! isset( $valid[ $this->getHash($ip) ] )) || ( time() > $c && time() > $d ) ) { /* no: no valid retries */ return $remaining; } if ( ( $a % Config::get( 'allowed_retries' ) ) == 0 && ( $b % Config::get( 'allowed_retries' ) ) == 0 ) { /* no: already been locked out for these retries */ return $remaining; } $remaining = max( ( Config::get( 'allowed_retries' ) - ( ($a + $b) % Config::get( 'allowed_retries' ) ) ), 0 ); return (int) $remaining; } /** * Get correct remote address * * @return string * */ public function get_address() { return Helpers::detect_ip_address( Config::get( 'trusted_ip_origins' ) ); } /** * Clean up old lockouts and retries, and save supplied arrays * * @param null $retries * @param null $lockouts * @param null $valid */ public function cleanup( $retries = null, $lockouts = null, $valid = null ) { $now = time(); $lockouts = ! is_null( $lockouts ) ? $lockouts : Config::get( 'lockouts' ); $log = Config::get( 'logged' ); /* remove old lockouts */ if ( is_array( $lockouts ) ) { foreach ( $lockouts as $ip => $lockout ) { if ( $lockout < $now ) { unset( $lockouts[ $ip ] ); if( is_array( $log ) && isset( $log[ $ip ] ) ) { foreach ( $log[ $ip ] as $user_login => &$data ) { if ( !is_array( $data ) ) { $data = array(); } $data['unlocked'] = true; } } } } Config::update( 'lockouts', $lockouts ); } Config::update( 'logged', $log ); /* remove retries that are no longer valid */ $valid = ! is_null( $valid ) ? $valid : Config::get( 'retries_valid' ); $retries = ! is_null( $retries ) ? $retries : Config::get( 'retries' ); if ( ! is_array( $valid ) || ! is_array( $retries ) ) { return; } foreach ( $valid as $ip => $lockout ) { if ( $lockout < $now ) { unset( $valid[ $ip ] ); unset( $retries[ $ip ] ); } } /* go through retries directly, if for some reason they've gone out of sync */ foreach ( $retries as $ip => $retry ) { if ( ! isset( $valid[ $ip ] ) ) { unset( $retries[ $ip ] ); } } $retries_stats = Config::get( 'retries_stats' ); if($retries_stats) { foreach( $retries_stats as $key => $count ) { if ( ( is_numeric( $key ) && $key < strtotime( '-8 day' ) ) || ( ! is_numeric( $key ) && strtotime( $key ) < strtotime( '-8 day' ) ) ) { unset($retries_stats[$key]); } } Config::update( 'retries_stats', $retries_stats ); } Config::update( 'retries', $retries ); Config::update( 'retries_valid', $valid ); } /** * Render admin options page */ public function options_page() { if ( ! empty( $_GET['tab'] ) && $_GET['tab'] === 'settings' ) { Config::use_local_options( ! is_network_admin() ); } $this->cleanup(); if ( ! empty( $_POST ) ) { check_admin_referer( 'limit-login-attempts-options' ); if ( is_network_admin() ) { Config::update( 'allow_local_options', ! empty( $_POST['allow_local_options'] ) ); } elseif ( Helpers::is_network_mode() ) { Config::update( 'use_local_options', empty( $_POST['use_global_options'] ) ); } /* Should we clear log? */ if ( isset( $_POST[ 'clear_log' ] ) ) { Config::update( 'logged', array() ); $this->show_message( __( 'Cleared IP log', 'limit-login-attempts-reloaded' ) ); } /* Should we reset counter? */ if ( isset( $_POST[ 'reset_total' ] ) ) { Config::update( 'lockouts_total', 0 ); $this->show_message( __( 'Reset lockout count', 'limit-login-attempts-reloaded' ) ); } /* Should we restore current lockouts? */ if ( isset( $_POST[ 'reset_current' ] ) ) { Config::update( 'lockouts', array() ); $this->show_message( __( 'Cleared current lockouts', 'limit-login-attempts-reloaded' ) ); } /* Should we update options? */ if ( isset( $_POST[ 'llar_update_dashboard' ] ) ) { $white_list_ips = ( ! empty( $_POST['lla_whitelist_ips'] ) ) ? explode("\n", str_replace("\r", "", stripslashes( $_POST['lla_whitelist_ips'] ) ) ) : array(); if ( ! empty( $white_list_ips ) ) { foreach( $white_list_ips as $key => $ip ) { if( '' == $ip ) { unset( $white_list_ips[ $key ] ); } } } Config::update('whitelist', $white_list_ips ); $white_list_usernames = ( ! empty( $_POST['lla_whitelist_usernames'] ) ) ? explode("\n", str_replace("\r", "", stripslashes( $_POST['lla_whitelist_usernames'] ) ) ) : array(); if ( ! empty( $white_list_usernames ) ) { foreach( $white_list_usernames as $key => $ip ) { if ( '' == $ip ) { unset( $white_list_usernames[ $key ] ); } } } Config::update('whitelist_usernames', $white_list_usernames ); $black_list_ips = ( ! empty( $_POST['lla_blacklist_ips'] ) ) ? explode("\n", str_replace("\r", "", stripslashes( $_POST['lla_blacklist_ips'] ) ) ) : array(); if ( ! empty( $black_list_ips ) ) { foreach( $black_list_ips as $key => $ip ) { $range = array_map('trim', explode( '-', $ip ) ); if ( count( $range ) > 1 && ( float )sprintf( "%u", ip2long( $range[0] ) ) > ( float )sprintf( "%u",ip2long( $range[1] ) ) ) { $this->show_message( sprintf ( __( 'The %s IP range is invalid', 'limit-login-attempts-reloaded' ), $ip ) ); } if ( '' == $ip ) { unset( $black_list_ips[ $key ] ); } } } Config::update('blacklist', $black_list_ips ); $black_list_usernames = ( ! empty( $_POST['lla_blacklist_usernames'] ) ) ? explode("\n", str_replace("\r", "", stripslashes( $_POST['lla_blacklist_usernames'] ) ) ) : array(); if ( ! empty( $black_list_usernames ) ) { foreach( $black_list_usernames as $key => $ip ) { if ( '' == $ip ) { unset( $black_list_usernames[ $key ] ); } } } Config::update('blacklist_usernames', $black_list_usernames ); Config::sanitize_options(); $this->show_message( __( 'Settings saved.', 'limit-login-attempts-reloaded' ) ); } elseif ( isset( $_POST[ 'llar_update_settings' ] ) ) { /* Should we support GDPR */ if ( isset( $_POST[ 'gdpr' ] ) ) { Config::update( 'gdpr', 1 ); } else { Config::update( 'gdpr', 0 ); } Config::update('show_top_level_menu_item', ( isset( $_POST['show_top_level_menu_item'] ) ? 1 : 0 ) ); Config::update('show_top_bar_menu_item', ( isset( $_POST['show_top_bar_menu_item'] ) ? 1 : 0 ) ); Config::update('hide_dashboard_widget', ( isset( $_POST['hide_dashboard_widget'] ) ? 1 : 0 ) ); Config::update('show_warning_badge', ( isset( $_POST['show_warning_badge'] ) ? 1 : 0 ) ); Config::update('allowed_retries', (int)$_POST['allowed_retries'] ); Config::update('lockout_duration', (int)$_POST['lockout_duration'] * 60 ); Config::update('valid_duration', (int)$_POST['valid_duration'] * 3600 ); Config::update('allowed_lockouts', (int)$_POST['allowed_lockouts'] ); Config::update('long_duration', (int)$_POST['long_duration'] * 3600 ); Config::update('notify_email_after', (int)$_POST['email_after'] ); Config::update('gdpr_message', sanitize_textarea_field( Helpers::deslash( $_POST['gdpr_message'] ) ) ); Config::update('admin_notify_email', sanitize_email( $_POST['admin_notify_email'] ) ); Config::update('active_app', sanitize_text_field( $_POST['active_app'] ) ); $trusted_ip_origins = ( ! empty( $_POST['lla_trusted_ip_origins'] ) ) ? array_map( 'trim', explode( ',', sanitize_text_field( $_POST['lla_trusted_ip_origins'] ) ) ) : array(); if ( ! in_array( 'REMOTE_ADDR', $trusted_ip_origins ) ) { $trusted_ip_origins[] = 'REMOTE_ADDR'; } Config::update('trusted_ip_origins', $trusted_ip_origins ); $notify_methods = array(); if ( isset( $_POST[ 'lockout_notify_email' ] ) ) { $notify_methods[] = 'email'; } Config::update('lockout_notify', implode( ',', $notify_methods ) ); Config::sanitize_options(); if ( ! empty( $_POST['llar_app_settings'] ) && self::$cloud_app ) { if ( ( $app_setup_code = Config::get( 'app_setup_code' ) ) && $setup_result = CloudApp::setup( strrev( $app_setup_code ) ) ) { if ( $setup_result['success'] && $active_app_config = $setup_result['app_config'] ) { foreach ( $_POST['llar_app_settings'] as $key => $value ) { if ( array_key_exists( $key, $active_app_config['settings'] ) ) { if ( ! empty( $active_app_config['settings'][$key]['options'] ) && ! in_array( $value, $active_app_config['settings'][$key]['options'] ) ) { continue; } $active_app_config['settings'][$key]['value'] = $value; } } Config::update( 'app_config', $active_app_config ); } } } $this->show_message( __( 'Settings saved.', 'limit-login-attempts-reloaded' ) ); $this->cloud_app_init(); } } include_once( LLA_PLUGIN_DIR . 'views/options-page.php' ); } /** * Show error message * * @param $msg * @param bool $is_error */ public function show_message( $msg, $is_error = false ) { Helpers::show_message( $msg, $is_error ); } /** * returns IP with its md5 value */ private function getHash( $str ) { return md5( $str ); } /** * @param $arr - array * @param $k - key * @return int array value at given index or zero */ private function checkKey( $arr, $k ) { return isset( $arr[ $k ] ) ? $arr[ $k ] : 0; } private function plan_name_match( $plan = 'default' ) { if ( ! array_key_exists( $plan, $this->plans ) ) { $plan = 'default'; } return $this->plans[ $plan ]['name']; } public function array_name_plans() { $plans = []; foreach ( $this->plans as $plan ) { $plans[ $plan['name'] ] = $plan['rate']; } return $plans; } private function info() { if ( self::$cloud_app ) { $this->info_data = self::$cloud_app->info(); } return $this->info_data; } public function info_is_exhausted() { if ( empty( $this->info_data ) ) { $this->info_data = $this->info(); } return isset( $this->info_data['requests']['exhausted'] ) ? filter_var( $this->info_data['requests']['exhausted'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) : false; } public function info_requests() { if ( empty( $this->info_data ) ) { $this->info_data = $this->info(); } return ( ! empty( $this->info_data ) && ! empty( $this->info_data['requests'] ) ) ? $this->info_data['requests'] : ''; } public function info_sub_group() { if ( empty( $this->info_data ) ) { $this->info_data = $this->info(); } $data = ( ! empty( $this->info_data ) && ! empty( $this->info_data['sub_group'] ) ) ? $this->info_data['sub_group'] : ''; return $this->plan_name_match( $data ); } public function info_upgrade_url() { if ( empty( $this->info_data ) ) { $this->info_data = $this->info(); } return ( ! empty( $this->info_data ) && ! empty( $this->info_data['upgrade_url'] ) ) ? $this->info_data['upgrade_url'] : ''; } public function info_block_by_country() { if ( empty( $this->info_data ) ) { $this->info_data = $this->info(); } return ( ! empty( $this->info_data ) && ! empty( $this->info_data['block_by_country'] ) ) ? $this->info_data['block_by_country'] : ''; } public function show_leave_review_notice() { $screen = get_current_screen(); if ( isset( $_COOKIE['llar_review_notice_shown'] ) ) { Config::update( 'review_notice_shown', true ); @setcookie( 'llar_review_notice_shown', '', time() - 3600, '/' ); } if ( ! current_user_can('manage_options' ) || Config::get( 'review_notice_shown' ) || ! in_array( $screen->base, array( 'dashboard', 'plugins', 'toplevel_page_limit-login-attempts' ) ) ) { return; } $activation_timestamp = Config::get( 'activation_timestamp' ); if ( $activation_timestamp && $activation_timestamp < strtotime("-1 month") ) : ?>
review-logo

Limit Login Attempts Reloaded user!', 'limit-login-attempts-reloaded'); ?>

here. Thank you!', 'limit-login-attempts-reloaded'); ?>

parent_base === 'edit' ) { return; } $activation_timestamp = Config::get('notice_enable_notify_timestamp'); if ( $activation_timestamp && $activation_timestamp < strtotime("-1 month") ) { $review_activation_timestamp = Config::get('activation_timestamp'); if ( $review_activation_timestamp && $review_activation_timestamp < strtotime("-1 month") ) { Config::update( 'activation_timestamp', time() ); } ?>

Limit Login Attempts Reloaded.
' . 'Due to increased security threats around the holidays, we recommend turning on email ' . 'notifications when you receive a failed login attempt.', 'limit-login-attempts-reloaded'); ?>

'#', 'text' => 'Link' ), $attr ); return '' . esc_html( $attr['text'] ) . ''; } }PKwL\fGӐHHIlimit-login-attempts-reloaded/languages/limit-login-attempts-reloaded.potnu[# Copyright (C) 2024 Limit Login Attempts Reloaded # This file is distributed under the same license as the Limit Login Attempts Reloaded plugin. msgid "" msgstr "" "Project-Id-Version: Limit Login Attempts Reloaded 2.26.12\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/limit-login-attempts-reloaded\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2024-07-18T19:32:12+03:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.7.1\n" "X-Domain: limit-login-attempts-reloaded\n" #. Plugin Name of the plugin #. Author of the plugin #: core/LimitLoginAttempts.php:152 msgid "Limit Login Attempts Reloaded" msgstr "" #. Description of the plugin msgid "Block excessive login attempts and protect your site against brute force attacks. Simple, yet powerful tools to improve site performance." msgstr "" #. Author URI of the plugin msgid "https://www.limitloginattempts.com/" msgstr "" #: core/Ajax.php:189 msgid "Please specify the Setup Code" msgstr "" #: core/Ajax.php:385 #: core/Ajax.php:688 msgid "No events yet." msgstr "" #: core/Ajax.php:477 msgid "Today at " msgstr "" #: core/Ajax.php:564 msgid "Login details could not be populated due to insufficient cloud resources.
Please upgrade to Premium to access this data." msgstr "" #: core/Ajax.php:575 msgid "Continent: " msgstr "" #: core/Ajax.php:584 msgid "Country: " msgstr "" #: core/Ajax.php:590 msgid "State/Province: " msgstr "" #: core/Ajax.php:596 msgid "District: " msgstr "" #: core/Ajax.php:602 msgid "City: " msgstr "" #: core/Ajax.php:608 msgid "Zipcode: " msgstr "" #: core/Ajax.php:614 msgid "Latitude, Longitude: " msgstr "" #: core/Ajax.php:633 msgid "Timezone: " msgstr "" #: core/Ajax.php:662 msgid "Internet Provider: " msgstr "" #: core/Ajax.php:669 msgid "Connection Type: " msgstr "" #: core/Ajax.php:740 msgid "No lockouts yet." msgstr "" #: core/Ajax.php:757 msgid "Meanwhile, the app falls over to the default functionality." msgstr "" #: core/Ajax.php:811 msgid "No rules yet." msgstr "" #: core/Ajax.php:1038 msgid "%d attempt remaining." msgid_plural "%d attempts remaining." msgstr[0] "" msgstr[1] "" #: core/Ajax.php:1180 msgid "Wrong email format." msgstr "" #: core/Ajax.php:1186 msgid "LLAR Security Notifications [TEST]" msgstr "" #: core/Ajax.php:1187 msgid "Your email notifications for Limit Login Attempts Reloaded are working correctly. If this email is going to spam, please be sure to add this address to your safelist." msgstr "" #: core/CloudApp.php:132 msgid "The endpoint is not responding. Please contact your app provider to settle that." msgstr "" #: core/CloudApp.php:157 msgid "The app has been successfully imported." msgstr "" #: core/Config.php:96 msgid "By proceeding you understand and give your consent that your IP address and browser information might be processed by the security plugins installed on this site." msgstr "" #: core/LimitLoginAttempts.php:315 #: core/LimitLoginAttempts.php:675 #: views/options-page.php:129 msgid "Dashboard" msgstr "" #: core/LimitLoginAttempts.php:316 #: core/LimitLoginAttempts.php:680 #: views/options-page.php:133 msgid "Settings" msgstr "" #: core/LimitLoginAttempts.php:326 #: core/LimitLoginAttempts.php:709 msgid "Free Upgrade" msgstr "" #: core/LimitLoginAttempts.php:333 #: views/tab-dashboard.php:97 #: views/tab-dashboard.php:253 msgid "Upgrade to Premium" msgstr "" #: core/LimitLoginAttempts.php:474 #: core/LimitLoginAttempts.php:983 #: core/LimitLoginAttempts.php:1451 msgid "ERROR: Too many failed login attempts." msgstr "" #: core/LimitLoginAttempts.php:481 #: core/LimitLoginAttempts.php:990 #: core/LimitLoginAttempts.php:1468 msgid "Please try again in %d hour." msgid_plural "Please try again in %d hours." msgstr[0] "" msgstr[1] "" #: core/LimitLoginAttempts.php:483 #: core/LimitLoginAttempts.php:992 #: core/LimitLoginAttempts.php:1471 msgid "Please try again in %d minute." msgid_plural "Please try again in %d minutes." msgstr[0] "" msgstr[1] "" #: core/LimitLoginAttempts.php:686 #: resources/compare-plans-data.php:64 #: views/options-page.php:139 msgid "Login Firewall" msgstr "" #: core/LimitLoginAttempts.php:691 #: views/options-page.php:145 msgid "Logs" msgstr "" #: core/LimitLoginAttempts.php:696 #: views/options-page.php:151 msgid "Debug" msgstr "" #: core/LimitLoginAttempts.php:701 #: views/options-page.php:155 #: views/tab-dashboard.php:128 msgid "Help" msgstr "" #: core/LimitLoginAttempts.php:709 msgid "Premium" msgstr "" #: core/LimitLoginAttempts.php:789 msgid "LLAR" msgstr "" #: core/LimitLoginAttempts.php:1176 msgid "%d hour" msgid_plural "%d hours" msgstr[0] "" msgstr[1] "" #: core/LimitLoginAttempts.php:1183 msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "" msgstr[1] "" #: core/LimitLoginAttempts.php:1220 msgid "Failed login by IP %s www.limitloginattempts.com" msgstr "" #: core/LimitLoginAttempts.php:1459 msgid "Please try again later." msgstr "" #: core/LimitLoginAttempts.php:1505 msgid "ERROR: Incorrect email address or password." msgstr "" #: core/LimitLoginAttempts.php:1508 msgid "ERROR: Incorrect username or password." msgstr "" #: core/LimitLoginAttempts.php:1524 msgid "WC Error" msgstr "" #: core/LimitLoginAttempts.php:1711 msgid "Cleared IP log" msgstr "" #: core/LimitLoginAttempts.php:1718 msgid "Reset lockout count" msgstr "" #: core/LimitLoginAttempts.php:1725 msgid "Cleared current lockouts" msgstr "" #: core/LimitLoginAttempts.php:1770 msgid "The %s IP range is invalid" msgstr "" #: core/LimitLoginAttempts.php:1797 #: core/LimitLoginAttempts.php:1870 msgid "Settings saved." msgstr "" #: core/LimitLoginAttempts.php:2023 msgid "Hey Limit Login Attempts Reloaded user!" msgstr "" #: core/LimitLoginAttempts.php:2024 msgid "A crazy idea we wanted to share! What if we put an image from YOU on the LLAR page?! (example) A drawing made by you or your child would cheer people up! Send us your drawing by email and we like it, we'll add it in the next release. Let's have some fun!" msgstr "" #: core/LimitLoginAttempts.php:2025 msgid "We would really like to hear your feedback about the plugin! Please take a couple minutes to write a few words here. Thank you!" msgstr "" #: core/LimitLoginAttempts.php:2028 msgid "Don't show again" msgstr "" #: core/LimitLoginAttempts.php:2029 msgid "Maybe later" msgstr "" #: core/LimitLoginAttempts.php:2030 msgid "Leave a review" msgstr "" #: core/LimitLoginAttempts.php:2116 msgid "You have been upgraded to the latest version of Limit Login Attempts Reloaded.
Due to increased security threats around the holidays, we recommend turning on email notifications when you receive a failed login attempt." msgstr "" #: core/LimitLoginAttempts.php:2121 msgid "Yes, turn on email notifications" msgstr "" #: core/LimitLoginAttempts.php:2122 msgid "Remind me a month from now" msgstr "" #: core/LimitLoginAttempts.php:2123 msgid "Don't show this message again" msgstr "" #: resources/compare-plans-data.php:27 msgid "Installed" msgstr "" #: resources/compare-plans-data.php:31 msgid "Get Started (Free)" msgstr "" #: resources/compare-plans-data.php:35 msgid "Upgrade now" msgstr "" #: resources/compare-plans-data.php:50 msgid "Limit Number of Retry Attempts" msgstr "" #: resources/compare-plans-data.php:57 msgid "Configurable Lockout Timing" msgstr "" #: resources/compare-plans-data.php:65 msgid "Secure your login page with our cutting-edge login firewall, defending against unauthorized access attempts and protecting your users' accounts and sensitive information." msgstr "" #: resources/compare-plans-data.php:72 msgid "Performance Optimizer" msgstr "" #: resources/compare-plans-data.php:73 msgid "Absorb failed login attempts from brute force bots in the cloud to keep your website at its optimal performance." msgstr "" #: resources/compare-plans-data.php:75 msgid "1k for first month%s(100 per month after)" msgstr "" #: resources/compare-plans-data.php:76 msgid "100k requests per month" msgstr "" #: resources/compare-plans-data.php:77 msgid "200k requests per month" msgstr "" #: resources/compare-plans-data.php:78 msgid "300k requests per month" msgstr "" #: resources/compare-plans-data.php:80 msgid "Successful Login Logs" msgstr "" #: resources/compare-plans-data.php:81 msgid "Ensure the security and integrity of your website by logging your successful logins." msgstr "" #: resources/compare-plans-data.php:88 msgid "Block By Country" msgstr "" #: resources/compare-plans-data.php:89 msgid "Disable IPs from any region to disable logins." msgstr "" #: resources/compare-plans-data.php:96 msgid "Access Blocklist of Malicious IPs" msgstr "" #: resources/compare-plans-data.php:97 msgid "Add another layer of protection from brute force bots by accessing a global database of known IPs with malicious activity." msgstr "" #: resources/compare-plans-data.php:104 msgid "Auto IP Blocklist" msgstr "" #: resources/compare-plans-data.php:105 msgid "Automatically add malicious IPs to your blocklist when triggered by the system." msgstr "" #: resources/compare-plans-data.php:112 msgid "Access Active Cloud Blocklist" msgstr "" #: resources/compare-plans-data.php:113 msgid "Use system wide data from over 10,000 WordPress websites to identify and block malicious IPs. This is an active list in real-time." msgstr "" #: resources/compare-plans-data.php:120 msgid "Intelligent IP Blocking" msgstr "" #: resources/compare-plans-data.php:121 msgid "Use active IP database via the cloud to automatically block users before they are able to make a failed login." msgstr "" #: resources/compare-plans-data.php:128 msgid "Synchronize Lockouts & Safelists/Blocklists" msgstr "" #: resources/compare-plans-data.php:129 msgid "Lockouts & safelists/blocklists can be shared between multiple domains to enhance protection." msgstr "" #: resources/compare-plans-data.php:136 #: views/tab-help.php:173 msgid "Premium Support" msgstr "" #: resources/compare-plans-data.php:138 msgid "Receive 1 on 1 technical support via email for any issues. Free support availabe in the WordPress support forum." msgstr "" #: resources/continent.php:3 msgid "Asia" msgstr "" #: resources/continent.php:4 #: resources/countries.php:249 msgid "Antarctica" msgstr "" #: resources/continent.php:5 msgid "Africa" msgstr "" #: resources/continent.php:6 msgid "Europe" msgstr "" #: resources/continent.php:7 msgid "North America" msgstr "" #: resources/continent.php:8 msgid "Oceania" msgstr "" #: resources/continent.php:9 msgid "South America" msgstr "" #: resources/continent.php:10 msgid "Intercontinental" msgstr "" #: resources/continent.php:11 #: resources/countries.php:3 msgid "Unknown" msgstr "" #: resources/countries.php:4 msgid "Rwanda" msgstr "" #: resources/countries.php:5 msgid "Somalia" msgstr "" #: resources/countries.php:6 msgid "Yemen" msgstr "" #: resources/countries.php:7 msgid "Iraq" msgstr "" #: resources/countries.php:8 msgid "Saudi Arabia" msgstr "" #: resources/countries.php:9 msgid "Iran" msgstr "" #: resources/countries.php:10 msgid "Cyprus" msgstr "" #: resources/countries.php:11 msgid "Tanzania" msgstr "" #: resources/countries.php:12 msgid "Syria" msgstr "" #: resources/countries.php:13 msgid "Armenia" msgstr "" #: resources/countries.php:14 msgid "Kenya" msgstr "" #: resources/countries.php:15 msgid "DR Congo" msgstr "" #: resources/countries.php:16 msgid "Djibouti" msgstr "" #: resources/countries.php:17 msgid "Uganda" msgstr "" #: resources/countries.php:18 msgid "Central African Republic" msgstr "" #: resources/countries.php:19 msgid "Seychelles" msgstr "" #: resources/countries.php:20 msgid "Jordan" msgstr "" #: resources/countries.php:21 msgid "Lebanon" msgstr "" #: resources/countries.php:22 msgid "Kuwait" msgstr "" #: resources/countries.php:23 msgid "Oman" msgstr "" #: resources/countries.php:24 msgid "Qatar" msgstr "" #: resources/countries.php:25 msgid "Bahrain" msgstr "" #: resources/countries.php:26 msgid "United Arab Emirates" msgstr "" #: resources/countries.php:27 msgid "Israel" msgstr "" #: resources/countries.php:28 msgid "Turkey" msgstr "" #: resources/countries.php:29 msgid "Ethiopia" msgstr "" #: resources/countries.php:30 msgid "Eritrea" msgstr "" #: resources/countries.php:31 msgid "Egypt" msgstr "" #: resources/countries.php:32 msgid "Sudan" msgstr "" #: resources/countries.php:33 msgid "Greece" msgstr "" #: resources/countries.php:34 msgid "Burundi" msgstr "" #: resources/countries.php:35 msgid "Estonia" msgstr "" #: resources/countries.php:36 msgid "Latvia" msgstr "" #: resources/countries.php:37 msgid "Azerbaijan" msgstr "" #: resources/countries.php:38 msgid "Lithuania" msgstr "" #: resources/countries.php:39 msgid "Svalbard and Jan Mayen" msgstr "" #: resources/countries.php:40 msgid "Georgia" msgstr "" #: resources/countries.php:41 msgid "Moldova" msgstr "" #: resources/countries.php:42 msgid "Belarus" msgstr "" #: resources/countries.php:43 msgid "Finland" msgstr "" #: resources/countries.php:44 msgid "Åland" msgstr "" #: resources/countries.php:45 msgid "Ukraine" msgstr "" #: resources/countries.php:46 msgid "North Macedonia" msgstr "" #: resources/countries.php:47 msgid "Hungary" msgstr "" #: resources/countries.php:48 msgid "Bulgaria" msgstr "" #: resources/countries.php:49 msgid "Albania" msgstr "" #: resources/countries.php:50 msgid "Poland" msgstr "" #: resources/countries.php:51 msgid "Romania" msgstr "" #: resources/countries.php:52 msgid "Kosovo" msgstr "" #: resources/countries.php:53 msgid "Zimbabwe" msgstr "" #: resources/countries.php:54 msgid "Zambia" msgstr "" #: resources/countries.php:55 msgid "Comoros" msgstr "" #: resources/countries.php:56 msgid "Malawi" msgstr "" #: resources/countries.php:57 msgid "Lesotho" msgstr "" #: resources/countries.php:58 msgid "Botswana" msgstr "" #: resources/countries.php:59 msgid "Mauritius" msgstr "" #: resources/countries.php:60 msgid "Eswatini" msgstr "" #: resources/countries.php:61 msgid "Réunion" msgstr "" #: resources/countries.php:62 msgid "South Africa" msgstr "" #: resources/countries.php:63 msgid "Mayotte" msgstr "" #: resources/countries.php:64 msgid "Mozambique" msgstr "" #: resources/countries.php:65 msgid "Madagascar" msgstr "" #: resources/countries.php:66 msgid "Afghanistan" msgstr "" #: resources/countries.php:67 msgid "Pakistan" msgstr "" #: resources/countries.php:68 msgid "Bangladesh" msgstr "" #: resources/countries.php:69 msgid "Turkmenistan" msgstr "" #: resources/countries.php:70 msgid "Tajikistan" msgstr "" #: resources/countries.php:71 msgid "Sri Lanka" msgstr "" #: resources/countries.php:72 msgid "Bhutan" msgstr "" #: resources/countries.php:73 msgid "India" msgstr "" #: resources/countries.php:74 msgid "Maldives" msgstr "" #: resources/countries.php:75 msgid "British Indian Ocean Territory" msgstr "" #: resources/countries.php:76 msgid "Nepal" msgstr "" #: resources/countries.php:77 msgid "Myanmar" msgstr "" #: resources/countries.php:78 msgid "Uzbekistan" msgstr "" #: resources/countries.php:79 msgid "Kazakhstan" msgstr "" #: resources/countries.php:80 msgid "Kyrgyzstan" msgstr "" #: resources/countries.php:81 msgid "French Southern Territories" msgstr "" #: resources/countries.php:82 msgid "Heard Island and McDonald Islands" msgstr "" #: resources/countries.php:83 msgid "Cocos [Keeling] Islands" msgstr "" #: resources/countries.php:84 msgid "Palau" msgstr "" #: resources/countries.php:85 msgid "Vietnam" msgstr "" #: resources/countries.php:86 msgid "Thailand" msgstr "" #: resources/countries.php:87 msgid "Indonesia" msgstr "" #: resources/countries.php:88 msgid "Laos" msgstr "" #: resources/countries.php:89 msgid "Taiwan" msgstr "" #: resources/countries.php:90 msgid "Philippines" msgstr "" #: resources/countries.php:91 msgid "Malaysia" msgstr "" #: resources/countries.php:92 msgid "China" msgstr "" #: resources/countries.php:93 msgid "Hong Kong" msgstr "" #: resources/countries.php:94 msgid "Brunei" msgstr "" #: resources/countries.php:95 msgid "Macao" msgstr "" #: resources/countries.php:96 msgid "Cambodia" msgstr "" #: resources/countries.php:97 msgid "South Korea" msgstr "" #: resources/countries.php:98 msgid "Japan" msgstr "" #: resources/countries.php:99 msgid "North Korea" msgstr "" #: resources/countries.php:100 msgid "Singapore" msgstr "" #: resources/countries.php:101 msgid "Cook Islands" msgstr "" #: resources/countries.php:102 msgid "East Timor" msgstr "" #: resources/countries.php:103 msgid "Russia" msgstr "" #: resources/countries.php:104 msgid "Mongolia" msgstr "" #: resources/countries.php:105 msgid "Australia" msgstr "" #: resources/countries.php:106 msgid "Christmas Island" msgstr "" #: resources/countries.php:107 msgid "Marshall Islands" msgstr "" #: resources/countries.php:108 msgid "Federated States of Micronesia" msgstr "" #: resources/countries.php:109 msgid "Papua New Guinea" msgstr "" #: resources/countries.php:110 msgid "Solomon Islands" msgstr "" #: resources/countries.php:111 msgid "Tuvalu" msgstr "" #: resources/countries.php:112 msgid "Nauru" msgstr "" #: resources/countries.php:113 msgid "Vanuatu" msgstr "" #: resources/countries.php:114 msgid "New Caledonia" msgstr "" #: resources/countries.php:115 msgid "Norfolk Island" msgstr "" #: resources/countries.php:116 msgid "New Zealand" msgstr "" #: resources/countries.php:117 msgid "Fiji" msgstr "" #: resources/countries.php:118 msgid "Libya" msgstr "" #: resources/countries.php:119 msgid "Cameroon" msgstr "" #: resources/countries.php:120 msgid "Senegal" msgstr "" #: resources/countries.php:121 msgid "Congo Republic" msgstr "" #: resources/countries.php:122 msgid "Portugal" msgstr "" #: resources/countries.php:123 msgid "Liberia" msgstr "" #: resources/countries.php:124 msgid "Ivory Coast" msgstr "" #: resources/countries.php:125 msgid "Ghana" msgstr "" #: resources/countries.php:126 msgid "Equatorial Guinea" msgstr "" #: resources/countries.php:127 msgid "Nigeria" msgstr "" #: resources/countries.php:128 msgid "Burkina Faso" msgstr "" #: resources/countries.php:129 msgid "Togo" msgstr "" #: resources/countries.php:130 msgid "Guinea-Bissau" msgstr "" #: resources/countries.php:131 msgid "Mauritania" msgstr "" #: resources/countries.php:132 msgid "Benin" msgstr "" #: resources/countries.php:133 msgid "Gabon" msgstr "" #: resources/countries.php:134 msgid "Sierra Leone" msgstr "" #: resources/countries.php:135 msgid "São Tomé and Príncipe" msgstr "" #: resources/countries.php:136 msgid "Gibraltar" msgstr "" #: resources/countries.php:137 msgid "Gambia" msgstr "" #: resources/countries.php:138 msgid "Guinea" msgstr "" #: resources/countries.php:139 msgid "Chad" msgstr "" #: resources/countries.php:140 msgid "Niger" msgstr "" #: resources/countries.php:141 msgid "Mali" msgstr "" #: resources/countries.php:142 msgid "Western Sahara" msgstr "" #: resources/countries.php:143 msgid "Tunisia" msgstr "" #: resources/countries.php:144 msgid "Spain" msgstr "" #: resources/countries.php:145 msgid "Morocco" msgstr "" #: resources/countries.php:146 msgid "Malta" msgstr "" #: resources/countries.php:147 msgid "Algeria" msgstr "" #: resources/countries.php:148 msgid "Faroe Islands" msgstr "" #: resources/countries.php:149 msgid "Denmark" msgstr "" #: resources/countries.php:150 msgid "Iceland" msgstr "" #: resources/countries.php:151 msgid "United Kingdom" msgstr "" #: resources/countries.php:152 msgid "Switzerland" msgstr "" #: resources/countries.php:153 msgid "Sweden" msgstr "" #: resources/countries.php:154 msgid "Netherlands" msgstr "" #: resources/countries.php:155 msgid "Austria" msgstr "" #: resources/countries.php:156 msgid "Belgium" msgstr "" #: resources/countries.php:157 msgid "Germany" msgstr "" #: resources/countries.php:158 msgid "Luxembourg" msgstr "" #: resources/countries.php:159 msgid "Ireland" msgstr "" #: resources/countries.php:160 msgid "Monaco" msgstr "" #: resources/countries.php:161 msgid "France" msgstr "" #: resources/countries.php:162 msgid "Andorra" msgstr "" #: resources/countries.php:163 msgid "Liechtenstein" msgstr "" #: resources/countries.php:164 msgid "Jersey" msgstr "" #: resources/countries.php:165 msgid "Isle of Man" msgstr "" #: resources/countries.php:166 msgid "Guernsey" msgstr "" #: resources/countries.php:167 msgid "Slovakia" msgstr "" #: resources/countries.php:168 msgid "Czechia" msgstr "" #: resources/countries.php:169 msgid "Norway" msgstr "" #: resources/countries.php:170 msgid "Vatican City" msgstr "" #: resources/countries.php:171 msgid "San Marino" msgstr "" #: resources/countries.php:172 msgid "Italy" msgstr "" #: resources/countries.php:173 msgid "Slovenia" msgstr "" #: resources/countries.php:174 msgid "Montenegro" msgstr "" #: resources/countries.php:175 msgid "Croatia" msgstr "" #: resources/countries.php:176 msgid "Bosnia and Herzegovina" msgstr "" #: resources/countries.php:177 msgid "Angola" msgstr "" #: resources/countries.php:178 msgid "Namibia" msgstr "" #: resources/countries.php:179 msgid "Saint Helena" msgstr "" #: resources/countries.php:180 msgid "Bouvet Island" msgstr "" #: resources/countries.php:181 msgid "Barbados" msgstr "" #: resources/countries.php:182 msgid "Cabo Verde" msgstr "" #: resources/countries.php:183 msgid "Guyana" msgstr "" #: resources/countries.php:184 msgid "French Guiana" msgstr "" #: resources/countries.php:185 msgid "Suriname" msgstr "" #: resources/countries.php:186 msgid "Saint Pierre and Miquelon" msgstr "" #: resources/countries.php:187 msgid "Greenland" msgstr "" #: resources/countries.php:188 msgid "Paraguay" msgstr "" #: resources/countries.php:189 msgid "Uruguay" msgstr "" #: resources/countries.php:190 msgid "Brazil" msgstr "" #: resources/countries.php:191 msgid "Falkland Islands" msgstr "" #: resources/countries.php:192 msgid "South Georgia and the South Sandwich Islands" msgstr "" #: resources/countries.php:193 msgid "Jamaica" msgstr "" #: resources/countries.php:194 msgid "Dominican Republic" msgstr "" #: resources/countries.php:195 msgid "Cuba" msgstr "" #: resources/countries.php:196 msgid "Martinique" msgstr "" #: resources/countries.php:197 msgid "Bahamas" msgstr "" #: resources/countries.php:198 msgid "Bermuda" msgstr "" #: resources/countries.php:199 msgid "Anguilla" msgstr "" #: resources/countries.php:200 msgid "Trinidad and Tobago" msgstr "" #: resources/countries.php:201 msgid "St Kitts and Nevis" msgstr "" #: resources/countries.php:202 msgid "Dominica" msgstr "" #: resources/countries.php:203 msgid "Antigua and Barbuda" msgstr "" #: resources/countries.php:204 msgid "Saint Lucia" msgstr "" #: resources/countries.php:205 msgid "Turks and Caicos Islands" msgstr "" #: resources/countries.php:206 msgid "Aruba" msgstr "" #: resources/countries.php:207 msgid "British Virgin Islands" msgstr "" #: resources/countries.php:208 msgid "Saint Vincent and the Grenadines" msgstr "" #: resources/countries.php:209 msgid "Montserrat" msgstr "" #: resources/countries.php:210 msgid "Saint Martin" msgstr "" #: resources/countries.php:211 msgid "Saint Barthélemy" msgstr "" #: resources/countries.php:212 msgid "Guadeloupe" msgstr "" #: resources/countries.php:213 msgid "Grenada" msgstr "" #: resources/countries.php:214 msgid "Cayman Islands" msgstr "" #: resources/countries.php:215 msgid "Belize" msgstr "" #: resources/countries.php:216 msgid "El Salvador" msgstr "" #: resources/countries.php:217 msgid "Guatemala" msgstr "" #: resources/countries.php:218 msgid "Honduras" msgstr "" #: resources/countries.php:219 msgid "Nicaragua" msgstr "" #: resources/countries.php:220 msgid "Costa Rica" msgstr "" #: resources/countries.php:221 msgid "Venezuela" msgstr "" #: resources/countries.php:222 msgid "Ecuador" msgstr "" #: resources/countries.php:223 msgid "Colombia" msgstr "" #: resources/countries.php:224 msgid "Panama" msgstr "" #: resources/countries.php:225 msgid "Haiti" msgstr "" #: resources/countries.php:226 msgid "Argentina" msgstr "" #: resources/countries.php:227 msgid "Chile" msgstr "" #: resources/countries.php:228 msgid "Bolivia" msgstr "" #: resources/countries.php:229 msgid "Peru" msgstr "" #: resources/countries.php:230 msgid "Mexico" msgstr "" #: resources/countries.php:231 msgid "French Polynesia" msgstr "" #: resources/countries.php:232 msgid "Pitcairn Islands" msgstr "" #: resources/countries.php:233 msgid "Kiribati" msgstr "" #: resources/countries.php:234 msgid "Tokelau" msgstr "" #: resources/countries.php:235 msgid "Tonga" msgstr "" #: resources/countries.php:236 msgid "Wallis and Futuna" msgstr "" #: resources/countries.php:237 msgid "Samoa" msgstr "" #: resources/countries.php:238 msgid "Niue" msgstr "" #: resources/countries.php:239 msgid "Northern Mariana Islands" msgstr "" #: resources/countries.php:240 msgid "Guam" msgstr "" #: resources/countries.php:241 msgid "Puerto Rico" msgstr "" #: resources/countries.php:242 msgid "U.S. Virgin Islands" msgstr "" #: resources/countries.php:243 msgid "U.S. Minor Outlying Islands" msgstr "" #: resources/countries.php:244 msgid "American Samoa" msgstr "" #: resources/countries.php:245 msgid "Canada" msgstr "" #: resources/countries.php:246 msgid "United States" msgstr "" #: resources/countries.php:247 msgid "Palestine" msgstr "" #: resources/countries.php:248 msgid "Serbia" msgstr "" #: resources/countries.php:250 msgid "Sint Maarten" msgstr "" #: resources/countries.php:251 msgid "Curaçao" msgstr "" #: resources/countries.php:252 msgid "Bonaire, Sint Eustatius, and Saba" msgstr "" #: resources/countries.php:253 msgid "South Sudan" msgstr "" #: views/app-widgets/acl-rules.php:10 msgid "Login Access Rules" msgstr "" #: views/app-widgets/acl-rules.php:14 #: views/app-widgets/acl-rules.php:63 msgid "Documentation" msgstr "" #: views/app-widgets/acl-rules.php:24 #: views/app-widgets/acl-rules.php:33 #: views/app-widgets/acl-rules.php:73 #: views/app-widgets/acl-rules.php:82 #: views/app-widgets/event-log.php:43 msgid "Pattern" msgstr "" #: views/app-widgets/acl-rules.php:25 #: views/app-widgets/acl-rules.php:74 #: views/app-widgets/event-log.php:41 msgid "Rule" msgstr "" #: views/app-widgets/acl-rules.php:26 #: views/app-widgets/acl-rules.php:75 msgid "Action" msgstr "" #: views/app-widgets/acl-rules.php:37 #: views/app-widgets/acl-rules.php:86 #: views/app-widgets/country-access-rules.php:54 msgid "Deny" msgstr "" #: views/app-widgets/acl-rules.php:38 #: views/app-widgets/acl-rules.php:87 msgid "Allow" msgstr "" #: views/app-widgets/acl-rules.php:39 #: views/app-widgets/acl-rules.php:88 msgid "Pass" msgstr "" #: views/app-widgets/acl-rules.php:44 #: views/app-widgets/acl-rules.php:93 #: views/app-widgets/country-access-rules.php:25 msgid "Add" msgstr "" #: views/app-widgets/acl-rules.php:59 msgid "IP Access Rules" msgstr "" #: views/app-widgets/active-lockouts.php:8 msgid "Active Lockouts" msgstr "" #: views/app-widgets/active-lockouts.php:13 msgid "Reload" msgstr "" #: views/app-widgets/active-lockouts.php:22 #: views/app-widgets/event-log.php:38 #: views/app-widgets/login-attempts.php:51 msgid "IP" msgstr "" #: views/app-widgets/active-lockouts.php:23 #: views/app-widgets/event-log.php:40 #: views/app-widgets/login-attempts.php:50 msgid "Login" msgstr "" #: views/app-widgets/active-lockouts.php:24 msgid "Count" msgstr "" #: views/app-widgets/active-lockouts.php:25 msgid "Expires in (minutes)" msgstr "" #: views/app-widgets/country-access-rules.php:14 msgid "Country Access Rules" msgstr "" #: views/app-widgets/country-access-rules.php:21 msgid "these countries:" msgstr "" #: views/app-widgets/country-access-rules.php:55 msgid "Allow only" msgstr "" #: views/app-widgets/event-log.php:14 msgid "Event Log" msgstr "" #: views/app-widgets/event-log.php:19 msgid "Full Logs" msgstr "" #: views/app-widgets/event-log.php:24 msgid "All attempts blocked by access rules are hidden by default. You can see the full log at this link." msgstr "" #: views/app-widgets/event-log.php:37 #: views/app-widgets/login-attempts.php:49 msgid "Time" msgstr "" #: views/app-widgets/event-log.php:39 #: views/tab-logs-local.php:220 msgid "Gateway" msgstr "" #: views/app-widgets/event-log.php:42 msgid "Reason" msgstr "" #: views/app-widgets/event-log.php:44 msgid "Attempts Left" msgstr "" #: views/app-widgets/event-log.php:45 msgid "Lockout Duration" msgstr "" #: views/app-widgets/event-log.php:46 msgid "Actions" msgstr "" #: views/app-widgets/event-log.php:54 #: views/app-widgets/login-attempts.php:61 msgid "Load older events" msgstr "" #: views/app-widgets/event-log.php:61 msgid "Loading older events, skipping ACL events. Full logs" msgstr "" #: views/app-widgets/login-attempts.php:24 #: views/app-widgets/login-attempts.php:38 msgid "Successful Login Attempts" msgstr "" #: views/app-widgets/login-attempts.php:28 msgid " View more" msgstr "" #: views/app-widgets/login-attempts.php:52 msgid "Role" msgstr "" #: views/app-widgets/login-attempts.php:83 msgid "View a complete history of successful logins for your WordPress account" msgstr "" #: views/app-widgets/login-attempts.php:86 msgid "All logs are stored in the cloud to ensure malicious users are unable to delete or manipulate site login data." msgstr "" #: views/app-widgets/login-attempts.php:90 msgid "This feature is only available for
Premium users." msgstr "" #: views/app-widgets/login-attempts.php:92 msgid "This feature is only available for
Premium and Micro Cloud (FREE!) users." msgstr "" #: views/chart-circle-failed-attempts-today.php:40 #: views/chart-circle-failed-attempts-today.php:75 msgid "Hooray! Zero failed login attempts (past 24 hrs)" msgstr "" #: views/chart-circle-failed-attempts-today.php:45 #: views/chart-circle-failed-attempts-today.php:79 msgid "%d failed login attempt " msgid_plural "%d failed login attempts " msgstr[0] "" msgstr[1] "" #: views/chart-circle-failed-attempts-today.php:46 #: views/chart-circle-failed-attempts-today.php:80 msgid "(past 24 hrs)" msgstr "" #: views/chart-circle-failed-attempts-today.php:47 #: views/chart-circle-failed-attempts-today.php:81 msgid "Your site is currently at a low risk for brute force activity" msgstr "" #: views/chart-circle-failed-attempts-today.php:51 msgid "Warning: Your site has experienced over 100 failed login attempts in the past 24 hours" msgstr "" #: views/chart-circle-failed-attempts-today.php:55 #: views/chart-circle-failed-attempts-today.php:87 msgid "Based on your level of brute force activity, we recommend upgrading to premium to access features to reduce failed logins and improve site performance." msgstr "" #: views/chart-circle-failed-attempts-today.php:59 msgid "Based on your level of brute force activity, we recommend free Micro Cloud upgrade to access features to reduce failed logins and improve site performance." msgstr "" #: views/chart-circle-failed-attempts-today.php:93 msgid "Failed Login Attempts Today" msgstr "" #: views/chart-circle-failed-attempts-today.php:102 #: views/chart-failed-attempts.php:36 #: views/chart-failed-attempts.php:121 #: views/chart-failed-attempts.php:131 msgid "Failed Login Attempts" msgstr "" #: views/chart-circle-failed-attempts-today.php:108 #: views/chart-failed-attempts.php:137 msgid "An IP that hasn't been previously denied by the cloud app, but has made an unsuccessful login attempt on your website." msgstr "" #: views/chart-circle-failed-attempts-today.php:109 #: views/chart-failed-attempts.php:138 msgid "An IP that has made an unsuccessful login attempt on your website." msgstr "" #: views/chart-circle-failed-attempts-today.php:120 msgid "Cloud protection enabled" msgstr "" #: views/chart-failed-attempts.php:44 #: views/chart-failed-attempts.php:147 #: views/chart-failed-attempts.php:244 msgid "Requests" msgstr "" #: views/chart-failed-attempts.php:152 msgid "A request is utilized when the cloud validates whether an IP address is allowed to attempt a login, which also includes denied logins." msgstr "" #: views/chart-failed-attempts.php:162 msgid "Monthly Usage: " msgstr "" #: views/chart-failed-attempts.php:227 msgid "Attempts" msgstr "" #: views/emails/failed-login.php:243 msgid "Hello {name}," msgstr "" #: views/emails/failed-login.php:244 msgid "Hello," msgstr "" #: views/emails/failed-login.php:246 msgid "This notification was sent automatically via Limit Login Attempts Reloaded Plugin." msgstr "" #: views/emails/failed-login.php:248 msgid "This is installed on your {domain} WordPress site." msgstr "" #: views/emails/failed-login.php:250 msgid "The failed login details include:" msgstr "" #: views/emails/failed-login.php:253 msgid "{attempts_count} failed login attempts ({lockouts_count} lockout(s)) from IP {ip_address}" msgstr "" #: views/emails/failed-login.php:256 msgid "Last user attempted: {username}" msgstr "" #: views/emails/failed-login.php:258 msgid "IP was blocked for {blocked_duration}" msgstr "" #: views/emails/failed-login.php:262 msgid "Please visit your WordPress dashboard for additional details, investigation options, and help articles." msgstr "" #: views/emails/failed-login.php:276 msgid "Go to Dashboard" msgstr "" #: views/emails/failed-login.php:292 msgid "Experiencing frequent attacks or degraded performance? You can now receive premium protection for FREE with " msgstr "" #: views/emails/failed-login.php:295 msgid "Micro Cloud©." msgstr "" #: views/emails/failed-login.php:296 msgid " Go to your LLAR dashboard to get starte." msgstr "" #: views/emails/failed-login.php:305 msgid "Frequently Asked Questions" msgstr "" #: views/emails/failed-login.php:307 msgid "What is a failed login attempt?" msgstr "" #: views/emails/failed-login.php:308 msgid "A failed login attempt is when an IP address uses incorrect credentials to log into your website. The IP address could be a human operator, or a program designed to guess your password." msgstr "" #: views/emails/failed-login.php:310 msgid "Why am I getting these emails?" msgstr "" #: views/emails/failed-login.php:311 msgid "You are receiving this email because there was a failed login attempt on your website {domain}. If you'd like to opt out of these notifications, please click the “Unsubscribe” link below." msgstr "" #: views/emails/failed-login.php:313 msgid "How dangerous is this failed login attempt?" msgstr "" #: views/emails/failed-login.php:314 msgid "Unfortunately, we cannot determine the severity of the IP address with the free version of the plugin. If the IP continues to make attempts and is not recognized by your organization, then it's likely to have malicious intent. Depending on how frequent the attacks are, you may experience performance issues. In the plugin dashboard, you can investigate the frequency of the failed login attempts in the logs and take additional steps to protect your website (i.e. adding them to the block list). You can visit the " msgstr "" #: views/emails/failed-login.php:317 msgid "Limit Login Attempts Reloaded website" msgstr "" #: views/emails/failed-login.php:317 msgid " for more information on our premium services, which can automatically block and detect malicious IP addresses." msgstr "" #: views/emails/failed-login.php:327 msgid "This alert was sent by your website where Limit Login Attempts Reloaded free version is installed and you are listed as the admin. If you are a GoDaddy customer, the plugin is installed into a must-use (MU) folder." msgstr "" #: views/emails/failed-login.php:347 msgid "Unsubscribe" msgstr "" #: views/emails/failed-login.php:348 msgid "from these notifications." msgstr "" #: views/micro-cloud-modal.php:26 msgid "Get Started with Micro Cloud for FREE" msgstr "" #: views/micro-cloud-modal.php:29 msgid "Help us secure our network and we’ll provide you with limited access to our premium features including our login firewall, IP Intelligence, and performance optimizer." msgstr "" #: views/micro-cloud-modal.php:32 msgid "Please note that some domains have very high brute force activity, which may cause Micro Cloud to run out of resources in under 24 hours. We will send an email when resources are fully utilized and the app reverts back to the free version. You may upgrade to one of our premium plans to prevent the app from reverting." msgstr "" #: views/micro-cloud-modal.php:43 msgid "How To Activate Micro Cloud" msgstr "" #: views/micro-cloud-modal.php:48 #: views/onboarding-popup.php:187 msgid "Please enter the email that will receive activation confirmation" msgstr "" #: views/micro-cloud-modal.php:53 #: views/onboarding-popup.php:142 #: views/onboarding-popup.php:190 #: views/tab-settings.php:559 #: views/tab-settings.php:583 msgid "Your email" msgstr "" #: views/micro-cloud-modal.php:61 #: views/onboarding-popup.php:196 msgid "I consent to registering my domain name %s with the Limit Login Attempts Reloaded cloud service." msgstr "" #: views/micro-cloud-modal.php:68 #: views/onboarding-popup.php:158 #: views/onboarding-popup.php:230 msgid "Continue" msgstr "" #: views/micro-cloud-modal.php:73 msgid "By signing up you agree to our terms of service and privacy policy." msgstr "" #: views/micro-cloud-modal.php:82 #: views/onboarding-popup.php:223 msgid "The server is not working, try again later" msgstr "" #: views/micro-cloud-modal.php:90 msgid "Micro Cloud has been activated!" msgstr "" #: views/micro-cloud-modal.php:95 #: views/onboarding-popup.php:253 msgid "Go To Dashboard" msgstr "" #: views/onboarding-popup.php:35 #: views/onboarding-popup.php:60 msgid "Welcome" msgstr "" #: views/onboarding-popup.php:41 msgid "Notifications" msgstr "" #: views/onboarding-popup.php:47 msgid "Limited Upgrade" msgstr "" #: views/onboarding-popup.php:53 msgid "Completion" msgstr "" #: views/onboarding-popup.php:65 msgid "Add your Setup Code" msgstr "" #: views/onboarding-popup.php:68 msgid "Your Setup Code" msgstr "" #: views/onboarding-popup.php:70 msgid "Activate" msgstr "" #: views/onboarding-popup.php:77 msgid "The Setup Code can be found in your email if you have subscribed to premium" msgstr "" #: views/onboarding-popup.php:84 msgid "Not A Premium User?" msgstr "" #: views/onboarding-popup.php:87 msgid "We highly recommend upgrading to premium for the best protection against brute force attacks and unauthorized logins" msgstr "" #: views/onboarding-popup.php:91 msgid "Detect, counter, and deny unauthorized logins with IP Intelligence" msgstr "" #: views/onboarding-popup.php:94 msgid "Absorb failed login activity to improve site performance" msgstr "" #: views/onboarding-popup.php:97 msgid "Block IPs by country, premium support, and much more!" msgstr "" #: views/onboarding-popup.php:113 msgid "Yes, show me plan options" msgstr "" #: views/onboarding-popup.php:116 msgid "No, I don’t want advanced protection" msgstr "" #: views/onboarding-popup.php:122 #: views/onboarding-popup.php:162 #: views/onboarding-popup.php:227 msgid "Skip" msgstr "" #: views/onboarding-popup.php:137 msgid "Notification Settings" msgstr "" #: views/onboarding-popup.php:146 msgid "This email will receive notifications of unauthorized access to your website. You may turn this off in your settings." msgstr "" #: views/onboarding-popup.php:151 msgid "Sign me up for the LLAR newsletter to receive important security alerts, plugin updates, and helpful guides." msgstr "" #: views/onboarding-popup.php:176 msgid "Limited Upgrade (Free)" msgstr "" #: views/onboarding-popup.php:181 msgid "Help us secure our network and we’ll provide you with limited access to our premium features including our login firewall, IP intelligence, and performance optimizer (up to 1,000 requests monthly)." msgstr "" #: views/onboarding-popup.php:184 msgid "Would you like to opt-in?" msgstr "" #: views/onboarding-popup.php:206 msgid "Sign Me Up" msgstr "" #: views/onboarding-popup.php:212 msgid "You may opt-out of this program at any time. You accept our terms of service by participating in this program." msgstr "" #: views/onboarding-popup.php:219 msgid "Congrats! Your website is now activated for Micro Cloud. Account information has been emailed to you for your reference." msgstr "" #: views/onboarding-popup.php:245 msgid "Thank you for completing the setup" msgstr "" #: views/options-page.php:57 msgid "You have exhausted your monthly quota of free Micro Cloud requests. The plugin has now reverted to the free version. Upgrade to the premium version today to maintain cloud protection and advanced features." msgstr "" #: views/options-page.php:72 msgid "Enjoying Micro Cloud? To prevent interruption of the cloud app, Upgrade to Premium today" msgstr "" #: views/options-page.php:86 msgid "Do you want Limit Login Attempts Reloaded to provide the latest version automatically?" msgstr "" #: views/options-page.php:88 msgid "Yes, enable auto-update" msgstr "" #: views/options-page.php:92 msgid "No thanks" msgstr "" #: views/options-page.php:116 msgid "Account Login" msgstr "" #: views/options-page.php:159 msgid "Premium / Extensions" msgstr "" #: views/options-page.php:164 msgid "Failover" msgstr "" #: views/options-page.php:169 msgid "Automatic switch to free version when premium stops working (usually due to non-payment or exceeding monthly resource budget)." msgstr "" #: views/tab-dashboard.php:44 msgid "Enable Micro Cloud (FREE)" msgstr "" #: views/tab-dashboard.php:50 msgid "Help us secure our network by providing access to your login IP data." msgstr "" #: views/tab-dashboard.php:53 msgid "In return, receive access to our premium features up to 1,000 requests per month, and 100 for each subsequent month." msgstr "" #: views/tab-dashboard.php:56 msgid "Once the allocated requests are consumed, the premium app will switch back to the free version and reset the following month." msgstr "" #: views/tab-dashboard.php:67 #: views/tab-settings.php:95 msgid "Learn More" msgstr "" #: views/tab-dashboard.php:71 #: views/tab-settings.php:99 #: views/tab-settings.php:304 #: views/tab-settings.php:413 msgid "Get Started" msgstr "" #: views/tab-dashboard.php:75 msgid "* A request is utilized when our cloud app validates an IP before it is able to perform a login attempt." msgstr "" #: views/tab-dashboard.php:83 msgid "Premium Protection Disabled" msgstr "" #: views/tab-dashboard.php:87 msgid "As a free user, your local server is absorbing the traffic brought on by brute force attacks, potentially slowing down your website. Upgrade to Premium today to outsource these attacks through our cloud app, and slow down future attacks with advanced throttling." msgstr "" #: views/tab-dashboard.php:113 msgid "Tools" msgstr "" #: views/tab-dashboard.php:117 msgid "View lockouts logs, block or whitelist usernames or IPs, and more." msgstr "" #: views/tab-dashboard.php:132 msgid "Find the documentation and help you need." msgstr "" #: views/tab-dashboard.php:143 msgid "Global Options" msgstr "" #: views/tab-dashboard.php:147 msgid "Many options such as notifications, alerts, premium status, and more." msgstr "" #: views/tab-dashboard.php:183 msgid "Login Security Checklist" msgstr "" #: views/tab-dashboard.php:186 msgid "Recommended tasks to greatly improve the security of your website." msgstr "" #: views/tab-dashboard.php:193 msgid "Enable Email Notifications" msgstr "" #: views/tab-dashboard.php:197 msgid "Enable email notifications to receive timely alerts and updates via email." msgstr "" #: views/tab-dashboard.php:205 msgid "Implement strong account policies" msgstr "" #: views/tab-dashboard.php:207 #: views/tab-dashboard.php:226 msgid "Check when done." msgstr "" #: views/tab-dashboard.php:210 msgid "Read our guide on implementing and enforcing strong password policies in your organization." msgstr "" #: views/tab-dashboard.php:218 msgid "Deny/Allow countries" msgstr "" #: views/tab-dashboard.php:221 msgid "Deny/Allow countries (Premium+ Users)" msgstr "" #: views/tab-dashboard.php:232 msgid "Allow or Deny countries to ensure only legitimate users login." msgstr "" #: views/tab-dashboard.php:240 msgid "Turn on plugin auto-updates" msgstr "" #: views/tab-dashboard.php:244 msgid "Enable automatic updates to ensure that the plugin stays current with the latest software patches and features." msgstr "" #: views/tab-dashboard.php:246 msgid "Enable automatic updates to ensure that the plugin stays current with the latest software patches and features." msgstr "" #: views/tab-dashboard.php:257 msgid "Upgrade to our premium version for advanced protection." msgstr "" #: views/tab-dashboard.php:263 msgid "Upgrade to our premium version for advanced protection." msgstr "" #: views/tab-debug.php:58 msgid "Debug Info" msgstr "" #: views/tab-debug.php:65 msgid "Copy the contents of the window and provide to support." msgstr "" #: views/tab-debug.php:70 msgid "Version" msgstr "" #: views/tab-debug.php:77 msgid "Start Over" msgstr "" #: views/tab-debug.php:82 msgid "You can start over the onboarding process by clicking this button. All existing data will remain unchanged." msgstr "" #: views/tab-debug.php:90 msgid "Reset" msgstr "" #: views/tab-help.php:20 msgid "Upgrade Now to Access Premium Support" msgstr "" #: views/tab-help.php:23 msgid "Our technical support team is available by email to help
with any questions." msgstr "" #: views/tab-help.php:28 msgid "Upgrade To Premium" msgstr "" #: views/tab-help.php:34 msgid "Free Support" msgstr "" #: views/tab-help.php:37 msgid "Support for free customers is available via our forums page on WordPress.org.
The majority of requests receive an answer within a few days." msgstr "" #: views/tab-help.php:42 msgid "Go To Support Forums" msgstr "" #: views/tab-help.php:51 msgid "GDPR Information" msgstr "" #: views/tab-help.php:55 msgid "Software Documentation" msgstr "" #: views/tab-help.php:62 msgid "All Documentation" msgstr "" #: views/tab-help.php:68 msgid "Cloud Service & Security" msgstr "" #: views/tab-help.php:70 msgid "Questions regarding the cloud service including how to activate, logs and storage, and compliance." msgstr "" #: views/tab-help.php:76 msgid "Technical Questions" msgstr "" #: views/tab-help.php:78 msgid "Popular technical questions about the service including admin blocking, definitions, and email notifications." msgstr "" #: views/tab-help.php:83 msgid "Accounts & Billing" msgstr "" #: views/tab-help.php:85 msgid "Questions regarding updating billing info, cancellation, and expiration." msgstr "" #: views/tab-help.php:91 msgid "Pre-sales Questions" msgstr "" #: views/tab-help.php:93 msgid "Questions regarding premium software sales." msgstr "" #: views/tab-help.php:101 msgid "Top Topics and Questions" msgstr "" #: views/tab-help.php:107 msgid "How do I know if I'm under attack?" msgstr "" #: views/tab-help.php:113 msgid "How can I tell that the premium plugin is working?" msgstr "" #: views/tab-help.php:119 msgid "What do I do if the admin gets blocked?" msgstr "" #: views/tab-help.php:125 msgid "Why am I still seeing login attempts even after the IP got blocked?" msgstr "" #: views/tab-help.php:131 msgid "Could these failed login attempts be fake?" msgstr "" #: views/tab-help.php:137 msgid "How does the login firewall work?" msgstr "" #: views/tab-help.php:143 msgid "What happens if my site exceeds the request limits in the plan?" msgstr "" #: views/tab-help.php:149 msgid "What do I do if all users get blocked?" msgstr "" #: views/tab-help.php:155 msgid "I just installed LLAR and I'm already getting several failed login attempts" msgstr "" #: views/tab-help.php:161 msgid "What URLs are being attacked and protected?" msgstr "" #: views/tab-help.php:176 msgid "Our technical support team is available by email to help with any questions." msgstr "" #: views/tab-help.php:181 msgid "Contact Support" msgstr "" #: views/tab-logs-custom.php:26 msgid "Your Micro Cloud plan has exhausted its requests for the month, which is required to operate the Login Firewall." msgstr "" #: views/tab-logs-custom.php:31 msgid "You can Upgrade to Premium to increase requests." msgstr "" #: views/tab-logs-custom.php:36 msgid "Or" msgstr "" #: views/tab-logs-custom.php:39 msgid "Switch to the failover to access IP management tools with the free version." msgstr "" #: views/tab-logs-local.php:35 msgid "Statistics" msgstr "" #: views/tab-logs-local.php:45 msgid "Total lockouts" msgstr "" #: views/tab-logs-local.php:50 msgid "Reset Counter" msgstr "" #: views/tab-logs-local.php:53 msgid "%d lockout since last reset" msgid_plural "%d lockouts since last reset" msgstr[0] "" msgstr[1] "" #: views/tab-logs-local.php:57 msgid "No lockouts yet" msgstr "" #: views/tab-logs-local.php:64 msgid "Active lockouts" msgstr "" #: views/tab-logs-local.php:68 msgid "Restore Lockouts" msgstr "" #: views/tab-logs-local.php:71 msgid "%d IP is currently blocked from trying to log in" msgstr "" #: views/tab-logs-local.php:88 msgid "Safelist" msgstr "" #: views/tab-logs-local.php:93 #: views/tab-logs-local.php:116 msgid "One IP or IP range (1.2.3.4-5.6.7.8) per line" msgstr "" #: views/tab-logs-local.php:101 #: views/tab-logs-local.php:124 msgid "One Username per line" msgstr "" #: views/tab-logs-local.php:111 msgid "Denylist" msgstr "" #: views/tab-logs-local.php:132 msgid "Automate your denylist with IP intelligence when you upgrade to premium." msgstr "" #: views/tab-logs-local.php:142 #: views/tab-settings.php:464 #: views/tab-settings.php:783 msgid "Save Settings" msgstr "" #: views/tab-logs-local.php:151 msgid "Upgrade To Premium For Our Login Firewall" msgstr "" #: views/tab-logs-local.php:154 #: views/tab-logs-local.php:260 #: views/tab-settings.php:296 #: views/tab-settings.php:405 msgid "Try For FREE" msgstr "" #: views/tab-logs-local.php:161 msgid "Identify & Counter New Threats With IP Intelligence" msgstr "" #: views/tab-logs-local.php:167 msgid "Access Active Databases Of Malicious IPs To Bolster Defenses" msgstr "" #: views/tab-logs-local.php:173 msgid "Unblock The Blocked Admin With Ease" msgstr "" #: views/tab-logs-local.php:179 msgid "Deny IPs By Country" msgstr "" #: views/tab-logs-local.php:194 msgid "Lockout log" msgstr "" #: views/tab-logs-local.php:202 msgid "Clear Log" msgstr "" #: views/tab-logs-local.php:206 msgid "Upgrade today to optimize or unload your DB by moving logs to the cloud." msgstr "" #: views/tab-logs-local.php:217 msgid "Date" msgstr "" #: views/tab-logs-local.php:218 msgctxt "Internet address" msgid "IP" msgstr "" #: views/tab-logs-local.php:219 msgid "Tried to log in as" msgstr "" #: views/tab-logs-local.php:226 msgid "F d, Y H:i" msgstr "" #: views/tab-logs-local.php:231 msgid " lockouts" msgstr "" #: views/tab-logs-local.php:240 msgid "Unlock" msgstr "" #: views/tab-logs-local.php:243 msgid "Unlocked" msgstr "" #: views/tab-logs-local.php:257 msgid "Upgrade Today For Enhanced Logs & IP Intelligence" msgstr "" #: views/tab-logs-local.php:267 msgid "Enhanced Logs Tell You Exactly Which IPs Are Attempting Logins" msgstr "" #: views/tab-logs-local.php:273 msgid "Identify & Counter New Threats With Ease" msgstr "" #: views/tab-logs-local.php:279 msgid "Automatically Add Malicious IPs To Your Deny List" msgstr "" #: views/tab-logs-local.php:285 msgid "Unblock The Blocked Admins Effortlessly" msgstr "" #: views/tab-premium.php:30 msgid "Limit Login Attempts Reloaded Micro Cloud" msgstr "" #: views/tab-premium.php:32 msgid "Limit Login Attempts Reloaded Premium" msgstr "" #: views/tab-premium.php:38 msgid "Full feature list" msgstr "" #: views/tab-premium.php:43 msgid "Pre-sales FAQs" msgstr "" #: views/tab-premium.php:48 msgid "Ask a pre-sales question" msgstr "" #: views/tab-premium.php:53 msgid "Support" msgstr "" #: views/tab-premium.php:61 msgid "Get It Here" msgstr "" #: views/tab-premium.php:68 msgid "You are currently using the free version of Limit Login Attempts Reloaded." msgstr "" #: views/tab-premium.php:70 msgid "If you purchased a premium plan, check your email for setup instructions (Setup Code included)" msgstr "" #: views/tab-premium.php:74 msgid "You are currently using Micro Cloud, which provides access to premium cloud app on a limited basis. To prevent interruption, upgrade to one of our paid plans below." msgstr "" #: views/tab-premium.php:76 msgid "You are currently using the premium version of Limit Login Attempts Reloaded." msgstr "" #: views/tab-premium.php:85 msgid "Why Should I Consider Premium?" msgstr "" #: views/tab-premium.php:88 msgid "Although the free version offers basic protection, the premium version includes an important feature called IP Intelligence. With IP intelligence, your website will be able to identify malicious IPs before they attempt a login, and absorb them into the cloud to save system resources. Your site will not only be more secure, but will operate at its optimal performance." msgstr "" #: views/tab-premium.php:95 msgid "Features comparison" msgstr "" #: views/tab-settings.php:64 msgid "App Settings" msgstr "" #: views/tab-settings.php:67 msgid "The app absorbs the main load caused by brute-force attacks, analyzes login attempts, and blocks unwanted visitors. It provides other service functions as well." msgstr "" #: views/tab-settings.php:73 msgid "Micro Cloud" msgstr "" #: views/tab-settings.php:78 msgid "Micro Cloud is a limited upgrade to our cloud app that provides complimentary access to our premium features" msgstr "" #: views/tab-settings.php:85 msgid "Help us secure our network by sharing your login IP data. In return, receive limited access to our premium features up to 1,000 requests for the first month, and 100 requests each subsequent month. Once requests are exceeded for a given month, the premium app will switch to FREE and reset the following month." msgstr "" #: views/tab-settings.php:88 msgid "* Requests are utilized when the cloud app validates an IP address before it is able to perform a login." msgstr "" #: views/tab-settings.php:107 msgid "Active App" msgstr "" #: views/tab-settings.php:112 msgid "Switches from free version (local) to premium (cloud)." msgstr "" #: views/tab-settings.php:120 msgid "Local (Free version)" msgstr "" #: views/tab-settings.php:125 msgid "Cloud App (Premium version)" msgstr "" #: views/tab-settings.php:132 msgid "Get advanced protection by upgrading to our Cloud App." msgstr "" #: views/tab-settings.php:143 msgid "Local App" msgstr "" #: views/tab-settings.php:147 msgid "Lockout" msgstr "" #: views/tab-settings.php:152 msgid "Set lockout limits based on failed attempts." msgstr "" #: views/tab-settings.php:161 msgid "allowed retries" msgstr "" #: views/tab-settings.php:166 msgid "Number of failed attempts allowed before locking out." msgstr "" #: views/tab-settings.php:174 msgid "minutes lockout" msgstr "" #: views/tab-settings.php:179 msgid "Lockout time in minutes." msgstr "" #: views/tab-settings.php:186 msgid "lockouts increase lockout time to" msgstr "" #: views/tab-settings.php:190 msgid "hours" msgstr "" #: views/tab-settings.php:195 msgid "After the specified number of lockouts the lockout time will increase by specified hours." msgstr "" #: views/tab-settings.php:203 msgid "hours until retries are reset" msgstr "" #: views/tab-settings.php:208 msgid "Time in hours before blocks are removed." msgstr "" #: views/tab-settings.php:214 msgid "After a specific IP address fails to log in %1$s times, a lockout lasting %2$s minutes is activated. If additional failed attempts occur within %3$s hours and lead to another lockout, once their combined total hits %4$s, the %2$s minutes duration is extended to %5$s hours. The lockout will be lifted once %3$s hours have passed since the last lockout incident." msgstr "" #: views/tab-settings.php:225 msgid "Trusted IP Origins" msgstr "" #: views/tab-settings.php:230 msgid "Server variables containing IP addresses." msgstr "" #: views/tab-settings.php:240 msgid "Specify the origins you trust in order of priority, separated by commas. We strongly recommend that you do not use anything other than REMOTE_ADDR since other origins can be easily faked. Examples: HTTP_X_FORWARDED_FOR, HTTP_CF_CONNECTING_IP, HTTP_X_SUCURI_CLIENTIP" msgstr "" #: views/tab-settings.php:249 #: views/tab-settings.php:401 msgid "Why Use Our Premium Cloud App?" msgstr "" #: views/tab-settings.php:255 #: views/tab-settings.php:421 msgid "Absorb site load caused by attacks" msgstr "" #: views/tab-settings.php:261 #: views/tab-settings.php:427 msgid "Use intelligent IP denial/unblocking technology" msgstr "" #: views/tab-settings.php:268 #: views/tab-settings.php:433 msgid "Sync the allow/deny/pass lists between multiple domains" msgstr "" #: views/tab-settings.php:275 #: views/tab-settings.php:439 msgid "Get premium support" msgstr "" #: views/tab-settings.php:282 #: views/tab-settings.php:445 msgid "Run auto backups of access control lists, lockouts and logs" msgstr "" #: views/tab-settings.php:289 #: views/tab-settings.php:451 msgid "No contract - cancel anytime" msgstr "" #: views/tab-settings.php:300 #: views/tab-settings.php:409 msgid "Upgrade" msgstr "" #: views/tab-settings.php:310 msgid "Custom App" msgstr "" #: views/tab-settings.php:314 msgid "Setup Code" msgstr "" #: views/tab-settings.php:319 msgid "This is the code you receive via email once you subscribe to the LLAR premium cloud app. (example xxxxxxxxxxxxx=yek?putes/1v/moc.stpmettanigoltimil.ipa)" msgstr "" #: views/tab-settings.php:327 msgid "Edit" msgstr "" #: views/tab-settings.php:336 msgid "Submit" msgstr "" #: views/tab-settings.php:341 msgid "Add this code to all websites in your network to sync protection (payment required for additional domains unless it's with an Agency plan's first tier)." msgstr "" #: views/tab-settings.php:348 msgid "Configuration" msgstr "" #: views/tab-settings.php:470 msgid "General Settings" msgstr "" #: views/tab-settings.php:473 msgid "These settings are independent of the apps." msgstr "" #: views/tab-settings.php:481 msgid "Let network sites use their own settings" msgstr "" #: views/tab-settings.php:482 msgid "If disabled, the global settings will be forcibly applied to the entire network." msgstr "" #: views/tab-settings.php:487 msgid "Use global settings" msgstr "" #: views/tab-settings.php:511 msgid "GDPR compliance" msgstr "" #: views/tab-settings.php:515 msgid "This makes the plugin GDPR compliant by showing a message on the login page. Read more" msgstr "" #: views/tab-settings.php:522 msgid "GDPR message" msgstr "" #: views/tab-settings.php:527 msgid "This message will appear at the bottom of the login page." msgstr "" #: views/tab-settings.php:537 msgid "You can use a shortcode here to insert links, for example, a link to your Privacy Policy page.
The shortcode is: [llar-link url=\"https://example.com\" text=\"Privacy Policy\"]" msgstr "" #: views/tab-settings.php:544 #: views/tab-settings.php:549 msgid "Weekly Digest" msgstr "" #: views/tab-settings.php:556 #: views/tab-settings.php:580 msgid "Email to" msgstr "" #: views/tab-settings.php:561 msgid "Receive a weekly digest that includes a recap of your failed logins and lockout notifications. Premium users will be able to see additional data such as countries and IPs with most failed logins." msgstr "" #: views/tab-settings.php:568 msgid "Notify on lockout" msgstr "" #: views/tab-settings.php:573 msgid "Email address to which lockout notifications will be sent." msgstr "" #: views/tab-settings.php:583 msgid "after" msgstr "" #: views/tab-settings.php:586 msgid "lockouts" msgstr "" #: views/tab-settings.php:588 msgid "Test Email Notifications" msgstr "" #: views/tab-settings.php:595 msgid "It's not uncommon for web hosts to turn off emails for plugins as a security measure.
We've created an article to troubleshoot common email deliverability issues." msgstr "" #: views/tab-settings.php:603 msgid "Display top menu item" msgstr "" #: views/tab-settings.php:608 msgid "The LLAR plugin displays its item on the top navigation menu, which provides a shortcut to the plugin." msgstr "" #: views/tab-settings.php:615 #: views/tab-settings.php:632 #: views/tab-settings.php:663 msgid "(Save and reload this page to see the changes)" msgstr "" #: views/tab-settings.php:620 msgid "Display left menu item" msgstr "" #: views/tab-settings.php:625 msgid "The LLAR plugin displays its item on the left navigation menu, which provides a shortcut to the plugin." msgstr "" #: views/tab-settings.php:636 msgid "Hide Dashboard Widget" msgstr "" #: views/tab-settings.php:641 msgid "The LLAR dashboard widget provides a quick glance of your daily failed login activity on the main WordPress dashboard. You may hide this widget by checking this box." msgstr "" #: views/tab-settings.php:651 msgid "Display Menu Warning Icon" msgstr "" #: views/tab-settings.php:656 msgid "The warning badge is a red bubble icon displayed next to the LLAR logo on the main vertical navigation menu. It displays a warning if there were more than 100 attempts for a day." msgstr "" #: views/tab-settings.php:770 msgid "Test email has been sent!" msgstr "" PKwL\+nn/limit-login-attempts-reloaded/lib/CidrCheck.phpnu[IPv4Match($ip, $subnet, $mask); } private function IPv4Match($address, $subnetAddress, $subnetMask) { if (!filter_var($subnetAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) || $subnetMask === NULL || $subnetMask === "" || $subnetMask < 0 || $subnetMask > 32) { return false; } $address = ip2long($address); $subnetAddress = ip2long($subnetAddress); $mask = -1 << (32 - $subnetMask); $subnetAddress &= $mask; # nb: in case the supplied subnet wasn't correctly aligned return ($address & $mask) == $subnetAddress; } }PKwL\D[?limit-login-attempts-reloaded/limit-login-attempts-reloaded.phpnu[Limit Login Attempts Reloaded functions as a robust deterrent against brute force attacks, bolstering your website's security measures and optimizing its performance. It achieves this by **restricting the number of login attempts allowed**. This applies not only to the standard login method, but also to XMLRPC, Woocommerce, and custom login pages. With more than 2.5 million active users, this plugin fulfills all your login security requirements. The plugin functions by automatically preventing further attempts from a particular Internet Protocol (IP) address and/or username once a predetermined limit of retries has been surpassed. This significantly weakens the effectiveness of brute force attacks on your website. By default, WordPress permits an unlimited number of login attempts, posing a vulnerability where passwords can be easily deciphered through brute force methods. **Limit Login Attempts Reloaded Premium (Try Free with Micro Cloud)** Upgrade to Limit Login Attempts Reloaded Premium to extend cloud-based protection to the Limit Login Attempts Reloaded plugin, thereby enhancing your login security. The premium version includes a range of highly beneficial features, including IP intelligence to **detect, counter and deny malicious login attempts**. Your failed login attempts will be safely neutralized in the cloud so your website can function at its optimal performance during an attack. https://www.youtube.com/watch?v=JfkvIiQft14 = Features (Free Version): = * **Limit Logins** - Limit the number of retry attempts when logging in (per each IP). * **Configurable Lockout Timings** - Modify the amount of time a user or IP must wait after a lockout. * **Remaining Tries** - Informs the user about the remaining retries or lockout time on the login page. * **Lockout Email Notifications** - Informs the admin via email of lockouts. * **Denied Attempt Logs** - View a log of all denied attempts and lockouts. * **IP & Username Safelist/Denylist** - Control access to usernames and IPs. * **Sucuri** compatibility. * **Wordfence** compatibility. * **Ultimate Member** compatibility. * **XMLRPC** gateway protection. * **Woocommerce** login page protection. * **Multi-site compatibility** with extra MU settings. * **GDPR** compliant. * **Custom IP origins support** (Cloudflare, Sucuri, etc.). = Features (Premium Version): = * **Performance Optimizer** - Offload the burden of excessive failed logins from your server to protect your server resources, resulting in improved speed and efficiency of your website. * **Enhanced IP Intelligence** - Identify repetitive and suspicious login attempts to detect potential brute force attacks. IPs with known malicious activity are stored and used to help prevent and counter future attacks. * **Enhanced Throttling** - Longer lockout intervals each time a malicious IP or username tries to login unsuccessfully. * **Deny By Country** - Block logins by country by simply selecting the countries you want to deny. * **Auto IP Denylist** - Automatically add IP addresses to your active cloud deny list that repeatedly fail login attempts. * **Global Denylist Protection** - Utilize our active cloud IP data from thousands of websites in the LLAR network. * **Synchronized Lockouts** - Lockout IP data can be shared between multiple domains for enhanced protection in your network. * **Synchronized Safelist/Denylist** - Safelist/Denylist IP and username data can be shared between multiple domains. * **Premium Support** - Email support with a security tech. * **Auto Backups of All IP Data** - Store your active IP data in the cloud. * **Successful Logins Log** - Store successful logins in the cloud including IP info, city, state and lat/long. * **Enhanced lockout logs** - Gain valuable insights into the origins of IPs that are attempting logins. * **CSV Download of IP Data** - Download IP data direclty from the cloud. * **Supports IPV6 Ranges For Safelist/Denylist** * **Unlock The Locked Admin** - Easily unlock the locked admin through the cloud. *Some features require higher level plans. = Upgrading from the old Limit Login Attempts plugin? = 1. Go to the Plugins section in your site's backend. 1. Remove the Limit Login Attempts plugin. 1. Install the Limit Login Attempts Reloaded plugin. All your settings will be kept intact! Many languages are currently supported in the Limit Login Attempts Reloaded plugin but we welcome any additional ones. Help us bring Limit Login Attempts Reloaded to even more countries. Translations: Bulgarian, Brazilian Portuguese, Catalan, Chinese (Traditional), Czech, Dutch, Finnish, French, German, Hungarian, Norwegian, Persian, Romanian, Russian, Spanish, Swedish, Turkish Plugin uses standard actions and filters only. Based on the original code from Limit Login Attempts plugin by Johan Eenfeldt. = Branding Guidelines = Limit Login Attempts Reloaded™ is a trademark of Atlantic Silicon Inc. When writing about the plugin, please make sure to use Reloaded after Limit Login Attempts. Limit Login Attempts is the old plugin. * Limit Login Attempts Reloaded (correct) * Limit Login Attempts (incorrect) == Screenshots == 1. Login screen after a failed login with remaining retries 2. Lockout login screen 3. Administration interface in WordPress 5.2.1 == Frequently Asked Questions == = What do I do if all users get blocked? = If you are using contemporary hosting, it's likely your site uses a proxy domain service like CloudFlare, Sucuri, Nginx, etc. They replace your user's IP address with their own. If the server where your site runs is not configured properly (this happens a lot) all users will get the same IP address. This also applies to bots and hackers. Therefore, locking one user will lead to locking everybody else out. If the plugin is not using our Cloud App, this can be adjusted using the Trusted IP Origin setting. The cloud service intelligently recognizes the non-standard IP origins and handles them correctly, even if your hosting provider does not. = How do I know if I'm under attack? = An easy way to check if the attack is legitimate is to copy the IP address from the lockout notification and check its location using a IP locator tool. If the location is not somewhere you recognize and you have received several failed login attempts, then you are likely being attacked. You might notice dozens or hundreds of IPs each day. Visit our website to learn how can you prevent brute force attacks on your website. = How can I tell that the premium plugin is working? = After you upgrade to our premium version, you will see a new dashboard in your WordPress admin that shows all attacks that will now relay through our cloud service. On the graph, you'll see **requests** and **failed login attempts**. Each request will represent the cloud app validating an IP, which also includes denied logins. In some cases, you may notice an increase in speed and efficiency with your website. Also, a reduction in lockout notifications via email. = Could these failed login attempts be fake? = Some users find it hard to believe that they could experience numerous unsuccessful login attempts, particularly when their site has just been established or has minimal human traffic. The plugin is not responsible for generating these failed login attempts. Newly created websites are frequently hosted on shared IP addresses, making it easy for hackers to discover them. Additionally, newly registered domain names are often crawled soon after creation, rendering a WordPress website susceptible to attacks. Such websites are attractive targets as security is not a primary concern for their owners. We've created an article that delves deeper into the issue of fake login attempts in WordPress. = What happens if my site exceeds the request limits in the plan? = The premium plan’s resource limits start from 100,000 requests per month, which should accept almost any heavy brute-force attack. We monitor all of our sites and will alert the user if it appears they are going over their limits. If limits are reached, we will suggest to the user upgrading to the next plan. If you are using the free version, the load caused by brute force attacks will be absorbed by your current hosting bandwidth, which could cause your hosting costs to increase. = What do I do if all users get blocked? = If you are using contemporary hosting, it’s likely your site uses a proxy domain service like CloudFlare, Sucuri, Nginx, etc. They replace your user’s IP address with their own. If your server is not configured properly, all users will get the same IP address. This also applies to bots and hackers. Therefore, locking one user will lead to locking everybody else out. In the free version of the plugin, this can be adjusted using the Trusted IP Origin setting. In the premium version, the cloud service intelligently recognizes the non-standard IP origins and handles them correctly, even if your hosting provider does not. = What URLs are being attacked and protected? = The URLs being protected are your login page (wp-login.php, wp-admin), xmlrpc.php, WooCommerce login page, and any custom login page you have that uses regular WordPress login hooks. = Why is LLAR more popular than other brute-force protection plugins? = Our main focus is protecting your site from brute force attacks. This allows our plugin to be very lean and effective. It doesn’t require a lot of your web hosting resources and keeps your site well-protected. More importantly, it does all of this automatically as our service learns on its own about each IP it encounters. In contrast, a firewall would require manual blocking of IPs. = What to do when an admin gets blocked? = Open the site from another IP. You can do this from your cell phone, or using Opera browser and enabling free VPN there. You can also try turning off your router for a few minutes and then see if you get a different IP address. These will work if your hosting server is configured correctly. If that doesn’t work, connect to the site using FTP or your hosting control panel file manager. Navigate to wp-content/plugins/ and rename the limit-login-attempts-reloaded folder. Log in to the site then rename that folder back and whitelist your IP. By upgrading to our premium app, you will have the unlocking functionality right from the cloud so you’ll never have to deal with this issue. = What settings should I use In the plugin? = The settings are explained within the plugin in great detail. If you are unsure, use the default settings as they are the recommended ones. = Can I share the safelist/denylist throughout all of my sites?= By default, you will need to copy and paste the lists to each site manually. For the premium service, sites are grouped within the same private cloud account. Each site within that group can be configured if it shares its lockouts and access lists with other group members. The setting is located in the plugin's interface. The default options are recommended. == Changelog == = 2.26.12 = * Better displaying IPv6 in successful login attempts block. * Possible intersections in tabs with other plugins fixed. * PHP 8, 9 compatibility updates. * Refactoring. = 2.26.11 = * Fixed possible style conflicts related to tables. * Fixed possible PHP warnings. * Fixed some I18N issues, thanks to alexclassroom! * Better displaying multiple roles in login logs. = 2.26.10 = * Log of successful login attempts implemented for Micro Cloud (Free) and Premium users. * Checklist of recommended actions implemented. * Settings page reorganized. = 2.26.9 = * Chart library updated. = 2.26.8 = * Fixed possible WooCommerce conflict. = 2.26.7 = * Better informing on Micro Cloud. = 2.26.6 = * Micro Cloud API url fix. = 2.26.5 = * Better informing on cloud status. = 2.26.4 = * Added country translation. * Better Micro Cloud API response handling. * A link fixed. = 2.26.3 = * CSS issue fixed on Logs tab. = 2.26.2 = * CSS issue fixed. = 2.26.1 = * Micro Cloud link fixed. = 2.26.0 = * New design. * Free Micro Cloud plan introduced. = 2.25.29 = * A link fixed. = 2.25.28 = * Improved cloud charts. = 2.25.27 = * Security improvement: Better shortcode escaping. * Fixed date formatting on the logs page. * Fixed top menu links on the front-end. * Badge added to the top menu. = 2.25.26 = * Security improvement: Different nonce for each AJAX action. * Security improvement: The toggle_auto_update_callback checks for the update_plugins cap. = 2.25.25 = * PHP 8.2/9 compatibility improved, thanks to Jer Turowetz! * Button size and text typo fixed. = 2.25.24 = * Better loading of translations. * Fixed PHP warning related to menu. = 2.25.23 = * Better side menu. * Fixed I18N issues, thanks to alexclassroom! = 2.25.22 = * Interface changes. * Tested with WP 6.3. = 2.25.21 = * Optimization: autoload for large options turned off. * Interface changes. = 2.25.20 = * Fix against network requests caching removed b/c some misconfigured servers can't handle it. = 2.25.19 = * Better handling of network connection issues. * Fixed responsive formatting on dashboard. * Added fix against network requests caching. = 2.25.18 = * Fixed errors occurring in situations where two versions of the plugin are installed (which should not normally happen). = 2.25.17 = * Refactoring. * Server load reducing optimization. = 2.25.16 = * Double slashes in paths removed. * Better handling of cloud response codes. = 2.25.15 = * Error messages logic fixed. = 2.25.14 = * Multisite support improved. * CSS outside of the plugin issue fixed. * Better number formatting on the dashboard. * Lockout email template updated. = 2.25.13 = * Ultimate Member compatibility. * Fixed conflicting URL parameters in some rare cases. * Updated attempts counter logic. = 2.25.12 = * Fixed IPv4 validation when passed with a port number. * Fixed texts and translations. = 2.25.11 = * PHP 8 compatibility fixed. * Logs loading issue fixed. * Help and Extensions tabs added. * Notification about auto updates added. * Displaying of plugin version added. * Text changes made. = 2.25.10 = * Tested with PHP 8. * Small styles refactoring. * Fixed a rare issue with events log not being displayed correctly. * Chart library updated. = 2.25.9 = * Welcome page replaced with a modal. = 2.25.8 = * Email text, links updated. = 2.25.7 = * Country flags added to log. * Refresh button added to log. * Email text updated. = 2.25.6 = * Email links updated. = 2.25.5 = * Fixed Woocommerce integration. * Updated some interface links. = 2.25.4 = * Fixed session error in rare cases. * Access rules explained. * Improved session behavior on the login page. * Fixed warning on some GoDaddy installations. = 2.25.3 = * Improved compatibility with WordFence. * Better handling of HTTP_X_FORWARDED_FOR on Debug tab. * Added option to hide warning badge. = 2.25.2 = * Security indicator fixed for multisite. = 2.25.1 = * Added setting to turn the dashboard widged off. * The widget is visible to admins only. = 2.25.0 = * Dashboard widged added. * Security indicator added. = 2.24.1 = * Fixed E_ERROR occurring in rare cases when the log table is corrupted. = 2.24.0 = * Protection increased: bots can't parse lockout messages anymore. = 2.23.2 = * Cloud: better unlock UX. * Litle cleanup. = 2.23.1 = * Added infinite scroll for cloud logs. = 2.23.0 = * Reduced plugin size by removing obsolete translations. * Cleaned up the dashboard. * Cloud: added information about auto/manually-blocked IPs. * GDPR: added an option to insert a link to a Privacy Policy page via a shortcode, clarified GDPR compliance. = 2.22.1 = * IP added to the email subject. = 2.22.0 = * Added support of CIDR notation for specifying IP ranges. * Texts updated. * Refactoring. = 2.21.1 = * Fixed: Uncaught Error: Call to a member function stats() * Cloud API: added block by country. * Refactoring. = 2.21.0 = * GDPR compliance: IPs obfuscation replaced with a customizable consent message on the login page. * Cloud API: fixed removing of blocked IPs from the access lists under certain conditions. * Cloud API: domain for Setup Code is taken from the WordPress settings now. = 2.20.6 = * Multisite tab links fixed. = 2.20.5 = * Option to show and hide the top-level menu item. = 2.20.4 = * Sucuri compatibility verified. * Wordfence compatibility verified. * Better menu navigation. * Timezones fixed for the global chart. = 2.20.3 = * More clear wording. * Cloud API: fixed double submit in the settings form. * Better displaying of stats. = 2.20.2 = * Updated email text. = 2.20.1 = * New dashboard more clear stats. = 2.20.0 = * New dashboard with simple stats. = 2.19.2 = * Texts and links updated. = 2.19.1 = * Welcome page. * Image and text updates. = 2.19.0 = * Refactoring. * Feedback message location fixed. * Text changes. = 2.18.0 = * Cloud API: usage chart added. * Text changes. = 2.17.4 = * Missing jQuery images added. * PHP 5 compatibility fixed. * Custom App setup link replaced with setup code. = 2.17.3 = * Plugin pages message. = 2.17.2 = * Lockout notification refactored. = 2.17.1 = * CSS cache issue fixed. * Notification text updated. = 2.17.0 = * Refactoring. * Email text and notification updated. * New links in the list of plugins. = 2.16.0 = * Custom Apps functionality implemented. More details: https://limitloginattempts.com/app/ = 2.15.2 = * Alternative method of closing the feedback message. = 2.15.1 = * Refactoring. = 2.15.0 = * Reset password feature has been removed as unwanted. * Small refactoring. = 2.14.0 = * BuddyPress login error compatibility implemented. * UltimateMember compatibility implemented. * A PHP warning fixed. = 2.13.0 = * Fixed incompatibility with PHP < 5.6. * Settings page layout refactored. = 2.12.3 = * The feedback message is shown for admins only now, and it can also be closed even if the site has issues with AJAX. = 2.12.2 = * Fixed the feedback message not being shown, again. = 2.12.1 = * Fixed the feedback message not being shown. = 2.12.0 = * Small refactoring. * get_message() - fixed error notices. * This is the first time we are asking you for a feedback. = 2.11.0 = * Blacklisted usernames can't be registered anymore. = 2.10.1 = * Fixed: GDPR compliance option could not be selected on the multisite installations. = 2.10.0 = * Debug information has been added for better support. = 2.9.0 = * Trusted IP origins option has been added. = 2.8.1 = * Extra lockout options are back. = 2.8.0 = * The plugin doesn't trust any IP addresses other than _SERVER["REMOTE_ADDR"] anymore. Trusting other IP origins make protection useless b/c they can be easily faked. This new version provides a way of secure IP unlocking for those sites that use a reverse proxy coupled with misconfigurated servers that populate _SERVER["REMOTE_ADDR"] with wrong IPs which leads to mass blocking of users. = 2.7.4 = * The lockout alerts can be sent to a configurable email address now. = 2.7.3 = * Settings page is moved back to "Settings". = 2.7.2 = * Settings are moved to a separate page. * Fixed: login error message. https://wordpress.org/support/topic/how-to-change-login-error-message/ = 2.7.1 = * A security issue inherited from the ancestor plugin Limit Login Attempts has been fixed. = 2.7.0 = * GDPR compliance implemented. * Fixed: ip_in_range() loop $ip overrides itself causing invalid results. https://wordpress.org/support/topic/ip_in_range-loop-ip-overrides-itself-causing-invalid-results/ * Fixed: the plugin was locking out the same IP address multiple times, each with a different port. https://wordpress.org/support/topic/same-ip-different-port/ = 2.6.3 = * Added support of Sucuri Website Firewall. = 2.6.2 = * Fixed the issue with backslashes in usernames. = 2.6.1 = * Plugin returns the 403 Forbidden header after the limit of login attempts via XMLRPC is reached. * Added support of IP ranges in white/black lists. * Lockouts now can be released selectively. * Fixed the issue with encoding of special symbols in email notifications. = 2.5.0 = * Added Multi-site Compatibility and additional MU settings. https://wordpress.org/support/topic/multisite-compatibility-47/ = 2.4.0 = * Usernames and IP addresses can be white-listed and black-listed now. https://wordpress.org/support/topic/banning-specific-usernames/ https://wordpress.org/support/topic/good-831/ * The lockouts log has been inversed. https://wordpress.org/support/topic/inverse-log/ = 2.3.0 = * IP addresses can be white-listed now. https://wordpress.org/support/topic/legal-user/ * A "Gateway" column is added to the lockouts log. It shows what endpoint an attacker was blocked from. https://wordpress.org/support/topic/xmlrpc-7/ * The "Undefined index: client_type" error is fixed. https://wordpress.org/support/topic/php-notice-when-updating-settings-page/ = 2.2.0 = * Removed the "Handle cookie login" setting as they are now obsolete. * Added bruteforce protection against Woocommerce login page attacks. https://wordpress.org/support/topic/how-to-integrate-with-woocommerce-2/ * Added bruteforce protection against XMLRPC attacks. https://wordpress.org/support/topic/xmlrpc-7/ = 2.1.0 = * The site connection settings are now applied automatically and therefore have been removed from the admin interface. * Now compatible with PHP 5.2 to support some older WP installations. = 2.0.0 = * fixed PHP Warning: Illegal offset type in isset or empty https://wordpress.org/support/topic/limit-login-attempts-generating-php-errors * fixed the deprecated functions issue https://wordpress.org/support/topic/using-deprecated-function * Fixed error with function arguments: https://wordpress.org/support/topic/warning-missing-argument-2-5 * added time stamp to unsuccessful tries on the plugin configuration page. * fixed .po translation files issue. * code refactoring and optimization.PKwL\G##>limit-login-attempts-reloaded/resources/compare-plans-data.phpnu[array_name_plans(); $actual_plan = $active_app === 'custom' ? $this->info_sub_group() : $min_plan; $upgrade_url = $active_app === 'custom' ? $this->info_upgrade_url() : 'https://www.limitloginattempts.com/info.php?from=plugin-premium-tab-upgrade'; $attribute = []; foreach ( $plans as $plan => $rate ) { if ( $rate < $plans[$actual_plan] ) { $attribute[$plan]['attr'] = ''; $attribute[$plan]['title'] = ''; } elseif ( $rate === $plans[$actual_plan] ) { $attribute[$plan]['attr'] = 'class="button menu__item button__transparent_orange llar-disabled"'; $attribute[$plan]['title'] = __( 'Installed', 'limit-login-attempts-reloaded' ); } elseif ( $plan === 'Micro Cloud' ) { $attribute[$plan]['attr'] = 'class="button menu__item button__orange button_micro_cloud"'; $attribute[$plan]['title'] = __( 'Get Started (Free)', 'limit-login-attempts-reloaded' ); } else { $attribute[$plan]['attr'] = 'class="button menu__item button__orange" href="' . $upgrade_url . '" target="_blank"'; $attribute[$plan]['title'] = __( 'Upgrade now', 'limit-login-attempts-reloaded' ); } } $lock = ''; $yes = ''; $compare_list = array( 'buttons_header' => array( 'Free' => '' . esc_html__( $attribute['Free']['title'], 'limit-login-attempts-reloaded' ) . '', 'Micro Cloud' => '' . esc_html__( $attribute['Micro Cloud']['title'], 'limit-login-attempts-reloaded' ) . '', 'Premium' => '' . esc_html__( $attribute['Premium']['title'], 'limit-login-attempts-reloaded' ) . '', 'Premium +' => '' . esc_html__( $attribute['Premium +']['title'], 'limit-login-attempts-reloaded' ) . '', 'Professional' => '' . esc_html__( $attribute['Professional']['title'], 'limit-login-attempts-reloaded' ) . '', ), __( 'Limit Number of Retry Attempts', 'limit-login-attempts-reloaded' ) => array( 'Free' => $yes, 'Micro Cloud' => $yes, 'Premium' => $yes, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Configurable Lockout Timing', 'limit-login-attempts-reloaded' ) => array( 'Free' => $yes, 'Micro Cloud' => $yes, 'Premium' => $yes, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Login Firewall', 'limit-login-attempts-reloaded' ) => array( 'description' => __( "Secure your login page with our cutting-edge login firewall, defending against unauthorized access attempts and protecting your users' accounts and sensitive information.", 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes, 'Premium' => $yes, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Performance Optimizer', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Absorb failed login attempts from brute force bots in the cloud to keep your website at its optimal performance.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes . '' . sprintf(esc_html__( '1k for first month%s(100 per month after)', 'limit-login-attempts-reloaded' ),'
') . '
', 'Premium' => $yes . '' . esc_html__( '100k requests per month', 'limit-login-attempts-reloaded' ) . '', 'Premium +' => $yes . '' . esc_html__( '200k requests per month', 'limit-login-attempts-reloaded' ) . '', 'Professional' => $yes . '' . esc_html__( '300k requests per month', 'limit-login-attempts-reloaded' ) . '', ), __( 'Successful Login Logs', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Ensure the security and integrity of your website by logging your successful logins.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes, 'Premium' => $yes, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Block By Country', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Disable IPs from any region to disable logins.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes, 'Premium' => $lock, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Access Blocklist of Malicious IPs', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Add another layer of protection from brute force bots by accessing a global database of known IPs with malicious activity.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes, 'Premium' => $lock, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Auto IP Blocklist', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Automatically add malicious IPs to your blocklist when triggered by the system.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes, 'Premium' => $lock, 'Premium +' => $lock, 'Professional' => $yes, ), __( 'Access Active Cloud Blocklist', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Use system wide data from over 10,000 WordPress websites to identify and block malicious IPs. This is an active list in real-time.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes, 'Premium' => $lock, 'Premium +' => $lock, 'Professional' => $yes, ), __( 'Intelligent IP Blocking', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Use active IP database via the cloud to automatically block users before they are able to make a failed login.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $yes, 'Premium' => $yes, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Synchronize Lockouts & Safelists/Blocklists', 'limit-login-attempts-reloaded' ) => array( 'description' => __( 'Lockouts & safelists/blocklists can be shared between multiple domains to enhance protection.', 'limit-login-attempts-reloaded' ), 'Free' => $lock, 'Micro Cloud' => $lock, 'Premium' => $yes, 'Premium +' => $yes, 'Professional' => $yes, ), __( 'Premium Support', 'limit-login-attempts-reloaded' ) => array( 'description' => sprintf( __( 'Receive 1 on 1 technical support via email for any issues. Free support availabe in the WordPress support forum.', 'limit-login-attempts-reloaded' ), 'https://wordpress.org/support/plugin/limit-login-attempts-reloaded/'), 'Free' => $lock, 'Micro Cloud' => $lock, 'Premium' => $yes, 'Premium +' => $yes, 'Professional' => $yes, ), 'buttons_footer' => array( 'Free' => '' . esc_html__( $attribute['Free']['title'], 'limit-login-attempts-reloaded' ) . '', 'Micro Cloud' => '' . esc_html__( $attribute['Micro Cloud']['title'], 'limit-login-attempts-reloaded' ) . '', 'Premium' => '' . esc_html__( $attribute['Premium']['title'], 'limit-login-attempts-reloaded' ) . '', 'Premium +' => '' . esc_html__( $attribute['Premium +']['title'], 'limit-login-attempts-reloaded' ) . '', 'Professional' => '' . esc_html__( $attribute['Professional']['title'], 'limit-login-attempts-reloaded' ) . '', ), ); return $compare_list; PKwL\]V++5limit-login-attempts-reloaded/resources/continent.phpnu[ __('Asia', 'limit-login-attempts-reloaded'), 'AN' => __('Antarctica', 'limit-login-attempts-reloaded'), 'AF' => __('Africa', 'limit-login-attempts-reloaded'), 'EU' => __('Europe', 'limit-login-attempts-reloaded'), 'NA' => __('North America', 'limit-login-attempts-reloaded'), 'OC' => __('Oceania', 'limit-login-attempts-reloaded'), 'SA' => __('South America', 'limit-login-attempts-reloaded'), 'IC' => __('Intercontinental', 'limit-login-attempts-reloaded'), 'ZZ' => __('Unknown', 'limit-login-attempts-reloaded'), );PKwL\:]::5limit-login-attempts-reloaded/resources/countries.phpnu[ __('Unknown', 'limit-login-attempts-reloaded'), 'RW' => __('Rwanda', 'limit-login-attempts-reloaded'), 'SO' => __('Somalia', 'limit-login-attempts-reloaded'), 'YE' => __('Yemen', 'limit-login-attempts-reloaded'), 'IQ' => __('Iraq', 'limit-login-attempts-reloaded'), 'SA' => __('Saudi Arabia', 'limit-login-attempts-reloaded'), 'IR' => __('Iran', 'limit-login-attempts-reloaded'), 'CY' => __('Cyprus', 'limit-login-attempts-reloaded'), 'TZ' => __('Tanzania', 'limit-login-attempts-reloaded'), 'SY' => __('Syria', 'limit-login-attempts-reloaded'), 'AM' => __('Armenia', 'limit-login-attempts-reloaded'), 'KE' => __('Kenya', 'limit-login-attempts-reloaded'), 'CD' => __('DR Congo', 'limit-login-attempts-reloaded'), 'DJ' => __('Djibouti', 'limit-login-attempts-reloaded'), 'UG' => __('Uganda', 'limit-login-attempts-reloaded'), 'CF' => __('Central African Republic', 'limit-login-attempts-reloaded'), 'SC' => __('Seychelles', 'limit-login-attempts-reloaded'), 'JO' => __('Jordan', 'limit-login-attempts-reloaded'), 'LB' => __('Lebanon', 'limit-login-attempts-reloaded'), 'KW' => __('Kuwait', 'limit-login-attempts-reloaded'), 'OM' => __('Oman', 'limit-login-attempts-reloaded'), 'QA' => __('Qatar', 'limit-login-attempts-reloaded'), 'BH' => __('Bahrain', 'limit-login-attempts-reloaded'), 'AE' => __('United Arab Emirates', 'limit-login-attempts-reloaded'), 'IL' => __('Israel', 'limit-login-attempts-reloaded'), 'TR' => __('Turkey', 'limit-login-attempts-reloaded'), 'ET' => __('Ethiopia', 'limit-login-attempts-reloaded'), 'ER' => __('Eritrea', 'limit-login-attempts-reloaded'), 'EG' => __('Egypt', 'limit-login-attempts-reloaded'), 'SD' => __('Sudan', 'limit-login-attempts-reloaded'), 'GR' => __('Greece', 'limit-login-attempts-reloaded'), 'BI' => __('Burundi', 'limit-login-attempts-reloaded'), 'EE' => __('Estonia', 'limit-login-attempts-reloaded'), 'LV' => __('Latvia', 'limit-login-attempts-reloaded'), 'AZ' => __('Azerbaijan', 'limit-login-attempts-reloaded'), 'LT' => __('Lithuania', 'limit-login-attempts-reloaded'), 'SJ' => __('Svalbard and Jan Mayen', 'limit-login-attempts-reloaded'), 'GE' => __('Georgia', 'limit-login-attempts-reloaded'), 'MD' => __('Moldova', 'limit-login-attempts-reloaded'), 'BY' => __('Belarus', 'limit-login-attempts-reloaded'), 'FI' => __('Finland', 'limit-login-attempts-reloaded'), 'AX' => __('Åland', 'limit-login-attempts-reloaded'), 'UA' => __('Ukraine', 'limit-login-attempts-reloaded'), 'MK' => __('North Macedonia', 'limit-login-attempts-reloaded'), 'HU' => __('Hungary', 'limit-login-attempts-reloaded'), 'BG' => __('Bulgaria', 'limit-login-attempts-reloaded'), 'AL' => __('Albania', 'limit-login-attempts-reloaded'), 'PL' => __('Poland', 'limit-login-attempts-reloaded'), 'RO' => __('Romania', 'limit-login-attempts-reloaded'), 'XK' => __('Kosovo', 'limit-login-attempts-reloaded'), 'ZW' => __('Zimbabwe', 'limit-login-attempts-reloaded'), 'ZM' => __('Zambia', 'limit-login-attempts-reloaded'), 'KM' => __('Comoros', 'limit-login-attempts-reloaded'), 'MW' => __('Malawi', 'limit-login-attempts-reloaded'), 'LS' => __('Lesotho', 'limit-login-attempts-reloaded'), 'BW' => __('Botswana', 'limit-login-attempts-reloaded'), 'MU' => __('Mauritius', 'limit-login-attempts-reloaded'), 'SZ' => __('Eswatini', 'limit-login-attempts-reloaded'), 'RE' => __('Réunion', 'limit-login-attempts-reloaded'), 'ZA' => __('South Africa', 'limit-login-attempts-reloaded'), 'YT' => __('Mayotte', 'limit-login-attempts-reloaded'), 'MZ' => __('Mozambique', 'limit-login-attempts-reloaded'), 'MG' => __('Madagascar', 'limit-login-attempts-reloaded'), 'AF' => __('Afghanistan', 'limit-login-attempts-reloaded'), 'PK' => __('Pakistan', 'limit-login-attempts-reloaded'), 'BD' => __('Bangladesh', 'limit-login-attempts-reloaded'), 'TM' => __('Turkmenistan', 'limit-login-attempts-reloaded'), 'TJ' => __('Tajikistan', 'limit-login-attempts-reloaded'), 'LK' => __('Sri Lanka', 'limit-login-attempts-reloaded'), 'BT' => __('Bhutan', 'limit-login-attempts-reloaded'), 'IN' => __('India', 'limit-login-attempts-reloaded'), 'MV' => __('Maldives', 'limit-login-attempts-reloaded'), 'IO' => __('British Indian Ocean Territory', 'limit-login-attempts-reloaded'), 'NP' => __('Nepal', 'limit-login-attempts-reloaded'), 'MM' => __('Myanmar', 'limit-login-attempts-reloaded'), 'UZ' => __('Uzbekistan', 'limit-login-attempts-reloaded'), 'KZ' => __('Kazakhstan', 'limit-login-attempts-reloaded'), 'KG' => __('Kyrgyzstan', 'limit-login-attempts-reloaded'), 'TF' => __('French Southern Territories', 'limit-login-attempts-reloaded'), 'HM' => __('Heard Island and McDonald Islands', 'limit-login-attempts-reloaded'), 'CC' => __('Cocos [Keeling] Islands', 'limit-login-attempts-reloaded'), 'PW' => __('Palau', 'limit-login-attempts-reloaded'), 'VN' => __('Vietnam', 'limit-login-attempts-reloaded'), 'TH' => __('Thailand', 'limit-login-attempts-reloaded'), 'ID' => __('Indonesia', 'limit-login-attempts-reloaded'), 'LA' => __('Laos', 'limit-login-attempts-reloaded'), 'TW' => __('Taiwan', 'limit-login-attempts-reloaded'), 'PH' => __('Philippines', 'limit-login-attempts-reloaded'), 'MY' => __('Malaysia', 'limit-login-attempts-reloaded'), 'CN' => __('China', 'limit-login-attempts-reloaded'), 'HK' => __('Hong Kong', 'limit-login-attempts-reloaded'), 'BN' => __('Brunei', 'limit-login-attempts-reloaded'), 'MO' => __('Macao', 'limit-login-attempts-reloaded'), 'KH' => __('Cambodia', 'limit-login-attempts-reloaded'), 'KR' => __('South Korea', 'limit-login-attempts-reloaded'), 'JP' => __('Japan', 'limit-login-attempts-reloaded'), 'KP' => __('North Korea', 'limit-login-attempts-reloaded'), 'SG' => __('Singapore', 'limit-login-attempts-reloaded'), 'CK' => __('Cook Islands', 'limit-login-attempts-reloaded'), 'TL' => __('East Timor', 'limit-login-attempts-reloaded'), 'RU' => __('Russia', 'limit-login-attempts-reloaded'), 'MN' => __('Mongolia', 'limit-login-attempts-reloaded'), 'AU' => __('Australia', 'limit-login-attempts-reloaded'), 'CX' => __('Christmas Island', 'limit-login-attempts-reloaded'), 'MH' => __('Marshall Islands', 'limit-login-attempts-reloaded'), 'FM' => __('Federated States of Micronesia', 'limit-login-attempts-reloaded'), 'PG' => __('Papua New Guinea', 'limit-login-attempts-reloaded'), 'SB' => __('Solomon Islands', 'limit-login-attempts-reloaded'), 'TV' => __('Tuvalu', 'limit-login-attempts-reloaded'), 'NR' => __('Nauru', 'limit-login-attempts-reloaded'), 'VU' => __('Vanuatu', 'limit-login-attempts-reloaded'), 'NC' => __('New Caledonia', 'limit-login-attempts-reloaded'), 'NF' => __('Norfolk Island', 'limit-login-attempts-reloaded'), 'NZ' => __('New Zealand', 'limit-login-attempts-reloaded'), 'FJ' => __('Fiji', 'limit-login-attempts-reloaded'), 'LY' => __('Libya', 'limit-login-attempts-reloaded'), 'CM' => __('Cameroon', 'limit-login-attempts-reloaded'), 'SN' => __('Senegal', 'limit-login-attempts-reloaded'), 'CG' => __('Congo Republic', 'limit-login-attempts-reloaded'), 'PT' => __('Portugal', 'limit-login-attempts-reloaded'), 'LR' => __('Liberia', 'limit-login-attempts-reloaded'), 'CI' => __('Ivory Coast', 'limit-login-attempts-reloaded'), 'GH' => __('Ghana', 'limit-login-attempts-reloaded'), 'GQ' => __('Equatorial Guinea', 'limit-login-attempts-reloaded'), 'NG' => __('Nigeria', 'limit-login-attempts-reloaded'), 'BF' => __('Burkina Faso', 'limit-login-attempts-reloaded'), 'TG' => __('Togo', 'limit-login-attempts-reloaded'), 'GW' => __('Guinea-Bissau', 'limit-login-attempts-reloaded'), 'MR' => __('Mauritania', 'limit-login-attempts-reloaded'), 'BJ' => __('Benin', 'limit-login-attempts-reloaded'), 'GA' => __('Gabon', 'limit-login-attempts-reloaded'), 'SL' => __('Sierra Leone', 'limit-login-attempts-reloaded'), 'ST' => __('São Tomé and Príncipe', 'limit-login-attempts-reloaded'), 'GI' => __('Gibraltar', 'limit-login-attempts-reloaded'), 'GM' => __('Gambia', 'limit-login-attempts-reloaded'), 'GN' => __('Guinea', 'limit-login-attempts-reloaded'), 'TD' => __('Chad', 'limit-login-attempts-reloaded'), 'NE' => __('Niger', 'limit-login-attempts-reloaded'), 'ML' => __('Mali', 'limit-login-attempts-reloaded'), 'EH' => __('Western Sahara', 'limit-login-attempts-reloaded'), 'TN' => __('Tunisia', 'limit-login-attempts-reloaded'), 'ES' => __('Spain', 'limit-login-attempts-reloaded'), 'MA' => __('Morocco', 'limit-login-attempts-reloaded'), 'MT' => __('Malta', 'limit-login-attempts-reloaded'), 'DZ' => __('Algeria', 'limit-login-attempts-reloaded'), 'FO' => __('Faroe Islands', 'limit-login-attempts-reloaded'), 'DK' => __('Denmark', 'limit-login-attempts-reloaded'), 'IS' => __('Iceland', 'limit-login-attempts-reloaded'), 'GB' => __('United Kingdom', 'limit-login-attempts-reloaded'), 'CH' => __('Switzerland', 'limit-login-attempts-reloaded'), 'SE' => __('Sweden', 'limit-login-attempts-reloaded'), 'NL' => __('Netherlands', 'limit-login-attempts-reloaded'), 'AT' => __('Austria', 'limit-login-attempts-reloaded'), 'BE' => __('Belgium', 'limit-login-attempts-reloaded'), 'DE' => __('Germany', 'limit-login-attempts-reloaded'), 'LU' => __('Luxembourg', 'limit-login-attempts-reloaded'), 'IE' => __('Ireland', 'limit-login-attempts-reloaded'), 'MC' => __('Monaco', 'limit-login-attempts-reloaded'), 'FR' => __('France', 'limit-login-attempts-reloaded'), 'AD' => __('Andorra', 'limit-login-attempts-reloaded'), 'LI' => __('Liechtenstein', 'limit-login-attempts-reloaded'), 'JE' => __('Jersey', 'limit-login-attempts-reloaded'), 'IM' => __('Isle of Man', 'limit-login-attempts-reloaded'), 'GG' => __('Guernsey', 'limit-login-attempts-reloaded'), 'SK' => __('Slovakia', 'limit-login-attempts-reloaded'), 'CZ' => __('Czechia', 'limit-login-attempts-reloaded'), 'NO' => __('Norway', 'limit-login-attempts-reloaded'), 'VA' => __('Vatican City', 'limit-login-attempts-reloaded'), 'SM' => __('San Marino', 'limit-login-attempts-reloaded'), 'IT' => __('Italy', 'limit-login-attempts-reloaded'), 'SI' => __('Slovenia', 'limit-login-attempts-reloaded'), 'ME' => __('Montenegro', 'limit-login-attempts-reloaded'), 'HR' => __('Croatia', 'limit-login-attempts-reloaded'), 'BA' => __('Bosnia and Herzegovina', 'limit-login-attempts-reloaded'), 'AO' => __('Angola', 'limit-login-attempts-reloaded'), 'NA' => __('Namibia', 'limit-login-attempts-reloaded'), 'SH' => __('Saint Helena', 'limit-login-attempts-reloaded'), 'BV' => __('Bouvet Island', 'limit-login-attempts-reloaded'), 'BB' => __('Barbados', 'limit-login-attempts-reloaded'), 'CV' => __('Cabo Verde', 'limit-login-attempts-reloaded'), 'GY' => __('Guyana', 'limit-login-attempts-reloaded'), 'GF' => __('French Guiana', 'limit-login-attempts-reloaded'), 'SR' => __('Suriname', 'limit-login-attempts-reloaded'), 'PM' => __('Saint Pierre and Miquelon', 'limit-login-attempts-reloaded'), 'GL' => __('Greenland', 'limit-login-attempts-reloaded'), 'PY' => __('Paraguay', 'limit-login-attempts-reloaded'), 'UY' => __('Uruguay', 'limit-login-attempts-reloaded'), 'BR' => __('Brazil', 'limit-login-attempts-reloaded'), 'FK' => __('Falkland Islands', 'limit-login-attempts-reloaded'), 'GS' => __('South Georgia and the South Sandwich Islands', 'limit-login-attempts-reloaded'), 'JM' => __('Jamaica', 'limit-login-attempts-reloaded'), 'DO' => __('Dominican Republic', 'limit-login-attempts-reloaded'), 'CU' => __('Cuba', 'limit-login-attempts-reloaded'), 'MQ' => __('Martinique', 'limit-login-attempts-reloaded'), 'BS' => __('Bahamas', 'limit-login-attempts-reloaded'), 'BM' => __('Bermuda', 'limit-login-attempts-reloaded'), 'AI' => __('Anguilla', 'limit-login-attempts-reloaded'), 'TT' => __('Trinidad and Tobago', 'limit-login-attempts-reloaded'), 'KN' => __('St Kitts and Nevis', 'limit-login-attempts-reloaded'), 'DM' => __('Dominica', 'limit-login-attempts-reloaded'), 'AG' => __('Antigua and Barbuda', 'limit-login-attempts-reloaded'), 'LC' => __('Saint Lucia', 'limit-login-attempts-reloaded'), 'TC' => __('Turks and Caicos Islands', 'limit-login-attempts-reloaded'), 'AW' => __('Aruba', 'limit-login-attempts-reloaded'), 'VG' => __('British Virgin Islands', 'limit-login-attempts-reloaded'), 'VC' => __('Saint Vincent and the Grenadines', 'limit-login-attempts-reloaded'), 'MS' => __('Montserrat', 'limit-login-attempts-reloaded'), 'MF' => __('Saint Martin', 'limit-login-attempts-reloaded'), 'BL' => __('Saint Barthélemy', 'limit-login-attempts-reloaded'), 'GP' => __('Guadeloupe', 'limit-login-attempts-reloaded'), 'GD' => __('Grenada', 'limit-login-attempts-reloaded'), 'KY' => __('Cayman Islands', 'limit-login-attempts-reloaded'), 'BZ' => __('Belize', 'limit-login-attempts-reloaded'), 'SV' => __('El Salvador', 'limit-login-attempts-reloaded'), 'GT' => __('Guatemala', 'limit-login-attempts-reloaded'), 'HN' => __('Honduras', 'limit-login-attempts-reloaded'), 'NI' => __('Nicaragua', 'limit-login-attempts-reloaded'), 'CR' => __('Costa Rica', 'limit-login-attempts-reloaded'), 'VE' => __('Venezuela', 'limit-login-attempts-reloaded'), 'EC' => __('Ecuador', 'limit-login-attempts-reloaded'), 'CO' => __('Colombia', 'limit-login-attempts-reloaded'), 'PA' => __('Panama', 'limit-login-attempts-reloaded'), 'HT' => __('Haiti', 'limit-login-attempts-reloaded'), 'AR' => __('Argentina', 'limit-login-attempts-reloaded'), 'CL' => __('Chile', 'limit-login-attempts-reloaded'), 'BO' => __('Bolivia', 'limit-login-attempts-reloaded'), 'PE' => __('Peru', 'limit-login-attempts-reloaded'), 'MX' => __('Mexico', 'limit-login-attempts-reloaded'), 'PF' => __('French Polynesia', 'limit-login-attempts-reloaded'), 'PN' => __('Pitcairn Islands', 'limit-login-attempts-reloaded'), 'KI' => __('Kiribati', 'limit-login-attempts-reloaded'), 'TK' => __('Tokelau', 'limit-login-attempts-reloaded'), 'TO' => __('Tonga', 'limit-login-attempts-reloaded'), 'WF' => __('Wallis and Futuna', 'limit-login-attempts-reloaded'), 'WS' => __('Samoa', 'limit-login-attempts-reloaded'), 'NU' => __('Niue', 'limit-login-attempts-reloaded'), 'MP' => __('Northern Mariana Islands', 'limit-login-attempts-reloaded'), 'GU' => __('Guam', 'limit-login-attempts-reloaded'), 'PR' => __('Puerto Rico', 'limit-login-attempts-reloaded'), 'VI' => __('U.S. Virgin Islands', 'limit-login-attempts-reloaded'), 'UM' => __('U.S. Minor Outlying Islands', 'limit-login-attempts-reloaded'), 'AS' => __('American Samoa', 'limit-login-attempts-reloaded'), 'CA' => __('Canada', 'limit-login-attempts-reloaded'), 'US' => __('United States', 'limit-login-attempts-reloaded'), 'PS' => __('Palestine', 'limit-login-attempts-reloaded'), 'RS' => __('Serbia', 'limit-login-attempts-reloaded'), 'AQ' => __('Antarctica', 'limit-login-attempts-reloaded'), 'SX' => __('Sint Maarten', 'limit-login-attempts-reloaded'), 'CW' => __('Curaçao', 'limit-login-attempts-reloaded'), 'BQ' => __('Bonaire, Sint Eustatius, and Saba', 'limit-login-attempts-reloaded'), 'SS' => __('South Sudan', 'limit-login-attempts-reloaded'), );PKwL\Dkk?limit-login-attempts-reloaded/views/admin-dashboard-widgets.phpnu[info_is_exhausted(); $block_sub_group = $this->info_sub_group(); $upgrade_premium_url = $this->info_upgrade_url(); } else { $is_exhausted = false; $block_sub_group = ''; $upgrade_premium_url = ''; } $api_stats = $is_active_app_custom ? LimitLoginAttempts::$cloud_app->stats() : false; $setup_code = Config::get( 'app_setup_code' ); ?>
PKwL\p؆55=limit-login-attempts-reloaded/views/app-widgets/acl-rules.phpnu[ PKwL\1NNClimit-login-attempts-reloaded/views/app-widgets/active-lockouts.phpnu[

PKwL\vHlimit-login-attempts-reloaded/views/app-widgets/country-access-rules.phpnu[ PKwL\ w2jj=limit-login-attempts-reloaded/views/app-widgets/event-log.phpnu[
Full logs', 'limit-login-attempts-reloaded' ), $full_log_url); ?>
PKwL\RC'Blimit-login-attempts-reloaded/views/app-widgets/login-attempts.phpnu[

PKwL\n hFFJlimit-login-attempts-reloaded/views/chart-circle-failed-attempts-today.phpnu[ $count ) { if ( is_numeric( $key ) && $key > strtotime( '-24 hours' ) ) { $retries_count += $count; } elseif( !is_numeric( $key ) && date_i18n( 'Y-m-d' ) === $key ) { $retries_count += $count; } } } if ( $retries_count === 0 ) { $retries_chart_title = __( 'Hooray! Zero failed login attempts (past 24 hrs)', 'limit-login-attempts-reloaded' ); $retries_chart_color = '#97F6C8'; } else if ( $retries_count < 100 ) { $retries_chart_title = sprintf( _n( '%d failed login attempt ', '%d failed login attempts ', $retries_count, 'limit-login-attempts-reloaded' ), $retries_count ); $retries_chart_title .= __( '(past 24 hrs)', 'limit-login-attempts-reloaded' ); $retries_chart_desc = __( 'Your site is currently at a low risk for brute force activity', 'limit-login-attempts-reloaded' ); $retries_chart_color = '#FFCC66'; } else { $retries_chart_title = __( 'Warning: Your site has experienced over 100 failed login attempts in the past 24 hours', 'limit-login-attempts-reloaded' ); if ( ! empty( $setup_code ) ) { $retries_chart_desc = sprintf( __( 'Based on your level of brute force activity, we recommend upgrading to premium to access features to reduce failed logins and improve site performance.', 'limit-login-attempts-reloaded' ), $upgrade_premium_url ); } else { $retries_chart_desc = sprintf( __( 'Based on your level of brute force activity, we recommend free Micro Cloud upgrade to access features to reduce failed logins and improve site performance.', 'limit-login-attempts-reloaded' ), 'button_micro_cloud' ); } $retries_chart_color = '#FF6633'; } } else { if ( $api_stats && ! empty( $api_stats['attempts']['count'] ) ) { $retries_count = (int) end( $api_stats['attempts']['count'] ); } if ( $is_exhausted && $block_sub_group === 'Micro Cloud' ) { if ( $retries_count === 0 ) { $retries_chart_title = __( 'Hooray! Zero failed login attempts (past 24 hrs)', 'limit-login-attempts-reloaded' ); $retries_chart_color = '#97F6C8'; } elseif ( $retries_count < 100 ) { $retries_chart_title = sprintf( _n( '%d failed login attempt ', '%d failed login attempts ', $retries_count, 'limit-login-attempts-reloaded' ), $retries_count ); $retries_chart_title .= __( '(past 24 hrs)', 'limit-login-attempts-reloaded' ); $retries_chart_desc = __( 'Your site is currently at a low risk for brute force activity', 'limit-login-attempts-reloaded' ); $retries_chart_color = '#FFCC66'; } else { $upgrade_premium_url = ! empty ( $upgrade_premium_url ) ? $upgrade_premium_url : ''; $retries_chart_desc = sprintf( __( 'Based on your level of brute force activity, we recommend upgrading to premium to access features to reduce failed logins and improve site performance.', 'limit-login-attempts-reloaded' ), $upgrade_premium_url ); $retries_chart_color = '#FF6633'; } } else { $retries_chart_title = __( 'Failed Login Attempts Today', 'limit-login-attempts-reloaded' ); $retries_chart_color = '#97F6C8'; } } ?>
' . __( 'Cloud protection enabled', 'limit-login-attempts-reloaded' ) . '' : ''; ?>
PKwL\6.$$=limit-login-attempts-reloaded/views/chart-failed-attempts.phpnu[ __( 'Failed Login Attempts', 'limit-login-attempts-reloaded' ), 'data' => array(), 'backgroundColor' => $chart2__color_gradient_attempts, 'borderColor' => $chart2__color_attempts, 'fill' => true, ); $requests_dataset = array( 'label' => __( 'Requests', 'limit-login-attempts-reloaded' ), 'data' => array(), 'backgroundColor' => $chart2__color_gradient_requests, 'borderColor' => $chart2__color_requests, 'fill' => true, 'yAxisID' => 'requests', ); if ( $api_stats ) { if ( !empty( $api_stats['attempts'] ) ) { foreach ( $api_stats['attempts']['at'] as $timestamp ) { $stats_dates[] = date( $date_format, $timestamp ); } $chart2_labels = $stats_dates; $attempts_dataset['data'] = $api_stats['attempts']['count']; } if ( !empty( $api_stats['requests'] ) ) { $requests_dataset['data'] = $api_stats['requests']['count']; } if ( !empty( $api_stats['attempts_y'] ) ) $chart2_attempts_scale_max = (int) $api_stats['attempts_y']; if ( !empty( $api_stats['requests_y'] ) ) $chart2_requests_scale_max = (int) $api_stats['requests_y']; } $chart2_datasets[] = $attempts_dataset; $chart2_datasets[] = $requests_dataset; } else { $date_format = trim( get_option( 'date_format' ), ' yY,._:;-/\\' ); $date_format = str_replace( 'F', 'M', $date_format ); $retries_stats = Config::get( 'retries_stats' ); if ( is_array( $retries_stats ) && $retries_stats ) { $key = key( $retries_stats ); $start = is_numeric( $key ) ? date_i18n( 'Y-m-d', $key ) : $key; $daterange = new DatePeriod( new DateTime( $start ), new DateInterval('P1D'), new DateTime('-1 day') ); $retries_per_day = array(); foreach ( $retries_stats as $key => $count ) { $date = is_numeric( $key ) ? date_i18n( 'Y-m-d', $key ) : $key; if( empty( $retries_per_day[$date] ) ) { $retries_per_day[$date] = 0; } $retries_per_day[$date] += $count; } $chart2_data = array(); foreach ( $daterange as $date ) { $chart2_labels[] = $date->format( $date_format ); $chart2_data[] = ( !empty($retries_per_day[ $date->format("Y-m-d")] ) ) ? $retries_per_day[ $date->format("Y-m-d") ] : 0; } } else { $chart2_labels[] = ( new DateTime())->format( $date_format ); $chart2_data[] = 0; } $chart2_datasets[] = array( 'label' => __( 'Failed Login Attempts', 'limit-login-attempts-reloaded' ), 'data' => $chart2_data, ); } ?>
PKwL\ Gcoco;limit-login-attempts-reloaded/views/emails/failed-login.phpnu[


{domain} WordPress site.', 'limit-login-attempts-reloaded' ); ?>


  • {ip_address}', 'limit-login-attempts-reloaded' ); ?>
  • {username}', 'limit-login-attempts-reloaded' ); ?>

Go to Dashboard

Experiencing frequent attacks or degraded performance? You can now receive premium protection for FREE with ', 'limit-login-attempts-reloaded' ); ?>







PKwL\^+*+*9limit-login-attempts-reloaded/views/micro-cloud-modal.phpnu[
%s with the Limit Login Attempts Reloaded cloud service.', 'limit-login-attempts-reloaded' ), $url_site); ?>
terms of service and privacy policy.', 'limit-login-attempts-reloaded' ), 'https://www.limitloginattempts.com/terms/', 'https://www.limitloginattempts.com/privacy-policy/' ); ?>
PKwL\q]]8limit-login-attempts-reloaded/views/onboarding-popup.phpnu[
highly recommend upgrading to premium for the best protection against brute force attacks and unauthorized logins', 'limit-login-attempts-reloaded' ); ?>
Would you like to opt-in?', 'limit-login-attempts-reloaded' ); ?>
%s with the Limit Login Attempts Reloaded cloud service.', 'limit-login-attempts-reloaded' ), $url_site); ?>
terms of service by participating in this program.', 'limit-login-attempts-reloaded' ), 'https://www.limitloginattempts.com/terms/' ); ?>
PKwL\e##4limit-login-attempts-reloaded/views/options-page.phpnu[info_sub_group(); $upgrade_premium_url = $this->info_upgrade_url(); $is_agency = $block_sub_group === 'Agency'; $requests = ! $is_agency ? $this->info_requests() : false; $is_exhausted = ! $is_agency && $this->info_is_exhausted(); } else { $is_exhausted = false; $block_sub_group = ''; $upgrade_premium_url = ''; }?>
info_upgrade_url(); if ( $is_exhausted ) : if ( time() > $notifications_message_shown ) : ?>

Upgrade to the premium version today to maintain cloud protection and advanced features.', 'limit-login-attempts-reloaded' ), $upgrade_premium_url ); ?>

Upgrade to Premium today', 'limit-login-attempts-reloaded' ), $upgrade_premium_url ); ?>

PKwL\cĵ885limit-login-attempts-reloaded/views/tab-dashboard.phpnu[stats() : false; $setup_code = Config::get( 'app_setup_code' ); $wp_locale = str_replace( '_', '-', get_locale() ); $is_tab_dashboard = true; $url_site = is_multisite() ? network_site_url() : site_url(); if ( ! $is_active_app_custom && empty( $setup_code ) ) { require_once( LLA_PLUGIN_DIR . 'views/onboarding-popup.php'); } ?>
array_name_plans(); $upgrade_premium = ( $is_active_app_custom && $plans[$block_sub_group] >= $plans[$min_plan] ) ? ' checked' : ''; $checked_block_by_country = Config::get( 'block_by_country' ) === 'true' ? ' checked disabled' : ''; $block_by_country = $block_sub_group ? $this->info_block_by_country() : false; $block_by_country_disabled = $block_sub_group ? '' : ' disabled'; $is_by_country = $block_by_country ? $checked_block_by_country : $block_by_country_disabled; $is_auto_update_choice = (Helpers::is_auto_update_enabled() && !Helpers::is_block_automatic_update_disabled()) ? ' checked' : ''; $app_config = Config::get( 'app_config' ); $full_log_url = !empty( $app_config['key'] ) ? 'https://my.limitloginattempts.com/logs?key=' . esc_attr( $app_config['key'] ) : false; ?>
/>
Enable email notifications to receive timely alerts and updates via email.', 'limit-login-attempts-reloaded' ), '/wp-admin/admin.php?page=limit-login-attempts&tab=settings#llar_lockout_notify' ); ?>
/>
Read our guide on implementing and enforcing strong password policies in your organization.', 'limit-login-attempts-reloaded' ), 'https://www.limitloginattempts.com/info.php?id=1' ); ?>
/>
Allow or Deny countries to ensure only legitimate users login.', 'limit-login-attempts-reloaded' ), $link__allow_deny ); ?>
disabled />
Enable automatic updates to ensure that the plugin stays current with the latest software patches and features.', 'limit-login-attempts-reloaded' ); endif; ?>
disabled />
= $plans[ $min_plan ] ) ) : ?> info_upgrade_url() : 'https://www.limitloginattempts.com/info.php?id=3' ?> Upgrade to our premium version for advanced protection.', 'limit-login-attempts-reloaded' ), $link__allow_deny ); ?>
PKwL\]c@ @ 1limit-login-attempts-reloaded/views/tab-debug.phpnu[ $value ) { if ( in_array( $key, array( 'SERVER_ADDR' ) ) || is_array( $value ) ) { continue; } $ips_for_check = array_map( 'trim', explode( ',', $value ) ); foreach ( $ips_for_check as $ip ) { if ( Helpers::is_ip_valid( $ip ) ) { if ( ! in_array( $ip, $ips ) ) { $ips[] = $ip; } if ( ! isset( $server[ $key ] ) ) { $server[ $key ] = ''; } if ( in_array( $ip, array( '127.0.0.1', '0.0.0.0' ) ) ) { $server[ $key ] = $ip; } else { $server[ $key ] .= 'IP' . array_search( $ip, $ips ) . ','; } } } } foreach ( $server as $server_key => $ips ) { $debug_info .= $server_key . ' = ' . trim( $ips, ',' ) . "\n"; } $plugin_data = get_plugin_data( LLA_PLUGIN_FILE ); ?>
PKwL\=>#&&0limit-login-attempts-reloaded/views/tab-help.phpnu[
with any questions.', 'limit-login-attempts-reloaded' ); ?>
The majority of requests receive an answer within a few days.', 'limit-login-attempts-reloaded' ); ?>
PKwL\fΕ~~7limit-login-attempts-reloaded/views/tab-logs-custom.phpnu[ PKwL\",AA6limit-login-attempts-reloaded/views/tab-logs-local.phpnu[

0 ) : ?>
0 ) : ?>
upgrade to premium.', 'limit-login-attempts-reloaded' ), 'https://www.limitloginattempts.com/info.php?from=plugin-denylist' ); ?>

Upgrade today to optimize or unload your DB by moving logs to the cloud.', 'limit-login-attempts-reloaded' ), 'https://www.limitloginattempts.com/info.php?from=plugin-clear-log' ); ?>
PKwL\3limit-login-attempts-reloaded/views/tab-premium.phpnu[array_name_plans(); $is_premium = ( $is_active_app_custom && $plans[$block_sub_group] >= $plans[$min_plan] ); ?>
Micro Cloud', 'limit-login-attempts-reloaded' ); ?> Premium', 'limit-login-attempts-reloaded' ); ?>
Limit Login Attempts Reloaded.', 'limit-login-attempts-reloaded' ); ?>

IP Intelligence. With IP intelligence, your website will be able to identify malicious IPs before they attempt a login, and absorb them into the cloud to save system resources. Your site will not only be more secure, but will operate at its optimal performance.', 'limit-login-attempts-reloaded' ); ?>

$list) : ?>
PKwL\Cn44limit-login-attempts-reloaded/views/tab-settings.phpnu[array_name_plans(); $is_premium = ( $is_active_app_custom && $plans[ $block_sub_group ] >= $plans[ $min_plan ] ); $url_try_for_free = 'https://www.limitloginattempts.com/upgrade/?from=plugin-'; $url_try_for_free_cloud = ( $is_active_app_custom ) ? $this->info_upgrade_url() : ''; ?>

upgrading to our Cloud App.', 'limit-login-attempts-reloaded' ), '#' ); ?>




%1$s times, a lockout lasting %2$s minutes is activated. If additional failed attempts occur within %3$s hours and lead to another lockout, once their combined total hits %4$s, the %2$s minutes duration is extended to %5$s hours. The lockout will be lifted once %3$s hours have passed since the last lockout incident.', 'limit-login-attempts-reloaded' ), Config::get( 'allowed_retries' ), Config::get( 'lockout_duration' ) / 60, Config::get( 'valid_duration' ) / 3600, Config::get( 'allowed_lockouts' ), Config::get( 'long_duration' ) / 3600 ); ?>
do not use anything other than REMOTE_ADDR since other origins can be easily faked. Examples: HTTP_X_FORWARDED_FOR, HTTP_CF_CONNECTING_IP, HTTP_X_SUCURI_CLIENTIP', 'limit-login-attempts-reloaded' ); ?>

$setting_params ) : ?>


value="1"/>

value="1" class="use_global_options"/>
checked /> GDPR compliant by showing a message on the login page. Read more', 'limit-login-attempts-reloaded' ), 'https://gdpr-info.eu/', 'https://www.limitloginattempts.com/gdpr-qa/?from=plugin-settings-gdpr' ); ?>
The shortcode is: [llar-link url="https://example.com" text="Privacy Policy"]', 'limit-login-attempts-reloaded' ); ?>
value="email"/>
value="email"/>
We\'ve created an article to troubleshoot common email deliverability issues.', 'limit-login-attempts-reloaded' ), 'https://www.limitloginattempts.com/troubleshooting-guide-fixing-issues-with-non-functioning-emails-from-your-wordpress-site/' ); ?>
>
>
>
 
>

PKwL\Lb]]updraftplus/addons/migrator.phpnu[get_wordpress_version(), '3.5', '>=')) { add_filter('updraftplus_restore_all_downloaded_postscan', array($this, 'restore_all_downloaded_postscan'), 10, 7); add_filter('updraftplus_restore_this_table', array($this, 'restore_this_table'), 10, 3); add_filter('updraftplus_pre_restore_move_in', array($this, 'pre_restore_move_in'), 10, 7); add_action('updraftplus_restorer_restore_options', array($this, 'restorer_restore_options')); add_filter('updraftplus_restore_delete_recursive', array($this, 'restore_delete_recursive'), 10, 4); add_action('updraftplus_admin_enqueue_scripts', array($this, 'updraftplus_admin_enqueue_scripts')); } } public function updraftplus_admin_enqueue_scripts() { global $updraftplus; $updraftplus->enqueue_select2(); } public function restore_delete_recursive($recurse, $ud_foreign, $restore_options, $type) {// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Unused parameter is present because the method is used as a WP filter. if ($recurse) return $recurse; // If doing a single-site-to-multisite import on the uploads, then we expect subdirectories to be around - they need deleting without raising any user-visible errors return ('uploads' == $type && !empty($this->new_blogid)) ? true : $recurse; } public function pre_restore_move_in($now_done, $type, $working_dir, $info, $backup_info, $restorer, $wp_filesystem_dir) {// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Unused parameter is present because the method is used as a WP filter. if ($now_done) return $now_done; if (is_multisite() && 0 == $restorer->ud_backup_is_multisite && (('plugins' == $type || 'themes' == $type) || ('uploads' == $type && !empty($this->new_blogid) && !get_site_option('ms_files_rewriting')))) { global $wp_filesystem, $updraftplus; $skin = $restorer->ud_get_skin(); // Migrating a single site into a multisite if ('plugins' == $type || 'themes' == $type) { $move_from = $restorer->get_first_directory($working_dir, array(basename($info['path']), $type)); // Only move in entities that are not already there $move_mode = Updraft_Restorer::MOVEIN_DO_NOTHING_IF_EXISTING; $skin->feedback('moving_backup'); $new_move_failed = (false === $move_from) ? true : false; if (false === $new_move_failed) { $move_in = $restorer->move_backup_in($move_from, trailingslashit($wp_filesystem_dir), $move_mode, array(), $type, true); if (is_wp_error($move_in)) return $move_in; if (!$move_in) $new_move_failed = true; } if ($new_move_failed) return new WP_Error('new_move_failed', $restorer->strings['new_move_failed']); @$wp_filesystem->delete($move_from);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the method. // Nothing more needs doing $now_done = true; } elseif ('uploads' == $type) { $skin->feedback('moving_old'); switch_to_blog($this->new_blogid); $ud = wp_upload_dir(); $wpud = $ud['basedir']; $fsud = trailingslashit($wp_filesystem->find_folder($wpud)); restore_current_blog(); if (!is_string($fsud)) { $updraftplus->log("Could not find basedir folder for site ($wpud)"); return new WP_Error('new_move_failed', $restorer->strings['new_move_failed']); } $updraftplus->log("Will move into: ".$fsud); return $fsud; // This now drops through to the uploads section } } return $now_done; } public function restorer_restore_options($restore_options) { $this->restore_options = $restore_options; } public function restore_this_table($restore_or_not, $unprefixed_table_name, $restore_options) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameter is present because the method is used as a WP filter. // We're only interested in filtering out the user/usermeta table when importing single site into multisite if (!$restore_or_not || empty($this->new_blogid)) return $restore_or_not; // Don't restore these - they're not used if ('users' == $unprefixed_table_name || 'usermeta' == $unprefixed_table_name) return false; return $restore_or_not; } /** * Runs upon the WP filter updraftplus_get_history_status_result * * @param Array $result - the pre-filtered information * * @return Array - after our filtering */ public function get_history_status_result($result) { if (!is_array($result)) return $result; ob_start(); $this->updraftplus_migrate_tab_output(); $tab_output = ob_get_contents(); ob_end_clean(); $result['migrate_tab'] = $tab_output; return $result; } public function updraftplus_migrate_tab_output() { global $updraftplus, $updraftplus_admin;// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Its used on line 187 but for some reason its flagged assuming becuase of the closed and open php tags ?>
include_template('wp-admin/settings/temporary-clone.php'); ?>

migrate_widget(); do_action('updraft_migrate_after_widget'); ?>
'; $ret .= '
'; $ret .= ''; $ret .= '

'.__('Restore an existing backup set onto this site', 'updraftplus').'

'; $ret .= '
'; $ret .= ''.__('To import a backup set, go to the "Existing backups" section in the "Backup/Restore" tab', 'updraftplus').""; if (empty($backup_history)) { $ret .= '

'.__('This site has no backups to restore from yet.', 'updraftplus').'

'; $ret .= ''; return $ret; } $incremental_set_found = false; $ret .= '

'; $ret .= ''; $ret .= '

'; if ($incremental_set_found) $ret .= '

'.__('For incremental backups, you will be able to choose which increments to restore at a later stage.', 'updraftplus').'

'; $ret .= ''; // $ret .= ''; return $ret; } /** * Disable W3TC and WP Super Cache, etc. */ public function restored_plugins() { if (true !== $this->is_migration) return; global $updraftplus; $active_plugins = maybe_unserialize($updraftplus->option_filter_get('active_plugins')); if (!is_array($active_plugins)) return; $disable_plugins = array( 'w3-total-cache/w3-total-cache.php' => 'W3 Total Cache', 'wp-super-cache/wp-cache.php' => 'W3 Super Cache', 'quick-cache/quick-cache.php' => 'Quick Cache', 'wp-fastest-cache/wpFastestCache.php' => 'WP Fastest Cache' ); foreach ($disable_plugins as $slug => $desc) { // in_array is case sensitive // if (in_array($slug, $active_plugins)) { if (preg_grep("#".$slug."#i", $active_plugins)) { unset($active_plugins[$slug]); $updraftplus->log("Disabled this plugin: %s: re-activate it manually when you are ready.", $desc); $updraftplus->log(sprintf(__("Disabled this plugin: %s: re-activate it manually when you are ready.", 'updraftplus'), $desc), 'notice-restore'); } } update_option('active_plugins', $active_plugins); } public function restorecachefiles($val, $file) { // On a migration, we don't want to add cache files if they do not already exist (because usually they won't work until re-installed) if (true !== $this->is_migration || false == $val) return $val; $val = (is_file(WP_CONTENT_DIR.'/'.$file)) ? $val : false; if (false == $val) { global $updraftplus; $updraftplus->log_e("%s: Skipping cache file (does not already exist)", $file); } return $val; } public function adminaction_searchreplace($options = array()) { global $updraftplus_restorer; $options = wp_parse_args($options, array( 'show_return_link' => true, 'show_heading' => true, )); if (!empty($options['show_heading'])) echo '

'.__('Search / replace database', 'updraftplus').'

'; echo ''.__('Search for', 'updraftplus').': '.htmlspecialchars($_POST['search'])."
"; echo ''.__('Replace with', 'updraftplus').': '.htmlspecialchars($_POST['replace'])."
"; $this->page_size = (empty($_POST['pagesize']) || !is_numeric($_POST['pagesize'])) ? 5000 : $_POST['pagesize']; $this->which_tables = (empty($_POST['whichtables'])) ? '' : explode(',', ($_POST['whichtables'])); if (empty($_POST['search'])) { echo sprintf(__("Failure: No %s was given.", 'updraftplus'), __('search term', 'updraftplus'))."
"; if (!empty($options['show_return_link'])) { echo ''.__('Return to UpdraftPlus Configuration', 'updraftplus').''; } return; } if (empty($updraftplus_restorer) || !is_a($updraftplus_restorer, 'Updraft_Restorer')) { // Needed for the UpdraftPlus_WPDB class and Updraft_Restorer::sql_exec() method updraft_try_include_file('restorer.php', 'include_once'); $updraftplus_restorer = new Updraft_Restorer(null, null, true); add_filter('updraftplus_logline', array($updraftplus_restorer, 'updraftplus_logline'), 10, 5); $updraftplus_restorer->search_replace_obj->updraftplus_restore_db_pre(); } $this->updraftplus_restore_db_pre(); $this->tables_replaced = array(); $this->updraftplus_restored_db_dosearchreplace($_POST['search'], $_POST['replace'], $this->base_prefix, false); if (!empty($options['show_return_link'])) echo ''.__('Return to UpdraftPlus Configuration', 'updraftplus').''; } /** * This method will check if the newly created table has already been created before, if it has then we should mark it to be search and replaced again. * * @param String $table - the name of the newly created table */ public function updraftplus_creating_table($table) { global $updraftplus; if (!empty($this->tables_replaced[$table]) && $this->tables_replaced[$table]) { $this->tables_replaced[$table] = false; $updraftplus->log('Warning: This database table has already been created once, now marking it to be search and replaced again - will try to continue but if errors are encountered then check that the backup is correct.', 'notice-restore'); } } public function debugtools_dashboard() { global $updraftplus_admin; ?>

settings_debugrow(':', ''); echo $updraftplus_admin->settings_debugrow(':', ''); echo $updraftplus_admin->settings_debugrow(':', ''); echo $updraftplus_admin->settings_debugrow(':', ''); ?> settings_debugrow('', ''); ?>
log(__('Processed plugin:', 'updraftplus').' '.$plugin, 'notice-restore'); $updraftplus->log("Processed plugin: $plugin"); } public function restored_themes_one($theme) { // Network-activate $allowed_themes = get_site_option('allowedthemes'); $allowed_themes[$theme] = true; update_site_option('allowedthemes', $allowed_themes); global $updraftplus; $updraftplus->log(__('Network activating theme:', 'updraftplus').' '.$theme, 'notice-restore'); $updraftplus->log('Network activating theme: '.$theme); } public function restore_set_table_prefix($import_table_prefix, $backup_is_multisite) { if (!is_multisite() || 0 !== $backup_is_multisite) return $import_table_prefix; $new_blogid = $this->generate_new_blogid(); if (!is_integer($new_blogid)) return $new_blogid; do_action('updraftplus_restore_set_table_prefix_multisite_got_new_blog_id', $new_blogid, $import_table_prefix); $this->new_blogid = $new_blogid; return (string) $import_table_prefix.$new_blogid.'_'; } /** * WordPress action updraftplus_restore_all_downloaded_postscan called during the restore process. * * The last four parameters can be edited in-place. * * @param Array $backups - list of backups * @param Integer $timestamp - the timestamp (epoch time) of the backup being restored * @param Array $elements - elements being restored (as the keys of the array) * @param Array $info - information about the backup being restored * @param Array $mess - array of informational-level messages * @param Array $warn - array of warning-level messages * @param Array $err - array of error-level messages */ public function restore_all_downloaded_postscan($backups, $timestamp, $elements, &$info, &$mess, &$warn, &$err) {// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Unused parameter is present because the method is used as a WP filter. if (is_array($info) && is_multisite() && isset($info['multisite']) && !$info['multisite']) { $original_error_count = count($err); if (!empty($elements['wpcore'])) { $err[] = sprintf(__('You selected %s to be included in the restoration - this cannot / should not be done when importing a single site into a network.', 'updraftplus'), __('WordPress core', 'updraftplus')).' '.__('Go here for more information.', 'updraftplus').''; } if (!empty($elements['others'])) { $err[] = sprintf(__('You selected %s to be included in the restoration - this cannot / should not be done when importing a single site into a network.', 'updraftplus'), __('other content from wp-content', 'updraftplus')).' '.__('Go here for more information.', 'updraftplus').''; } if (!empty($elements['mu-plugins'])) { $err[] = sprintf(__('You selected %s to be included in the restoration - this cannot / should not be done when importing a single site into a network.', 'updraftplus'), __('Must-use plugins', 'updraftplus')).' '.__('Go here for more information.', 'updraftplus').''; } global $updraftplus; if (version_compare($updraftplus->get_wordpress_version(), '3.5', '<')) { $err[] = __('Importing a single site into a multisite install', 'updraftplus').': '.sprintf(__('This feature requires %s version %s or later', 'updraftplus'), 'WordPress', '3.5'); } elseif (get_site_option('ms_files_rewriting')) { $err[] = __('Importing a single site into a multisite install', 'updraftplus').': '.sprintf(__('This feature is not compatible with %s', 'updraftplus'), 'pre-WordPress-3.5-style multisite uploads rewriting', 'updraftplus'); } if (count($err) > $original_error_count) return; if (empty($info['addui'])) $info['addui'] = ''; $info['addui'] .= '

'.__('Information needed to continue:', 'updraftplus').'
'; $info['addui'] .= __('Enter details for where this new site is to live within your multisite install:', 'updraftplus').'
'; global $current_site; if (!is_subdomain_install()) { $info['addui'] .= '
'; } else { $info['addui'] .= ' .
'; } $info['addui'] .= '

'; if (!empty($elements['db'])) { if (empty($info['addui'])) $info['addui'] = ''; $info['addui'] .= '


'; $class = (!defined('UPDRAFTPLUS_SELECT2_ENABLE') || UPDRAFTPLUS_SELECT2_ENABLE) ? 'updraft_select2' : ''; $info['addui'] .= ''; // $main_site_id = $current_site->blog_id; $page = 0; while (!isset($users) || count($users) > 0) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the loop. $users = get_users(array( // Not documented in codex, but the source reveals that to get "all sites", you use an ID of 0 'blog_id' => 0, 'offset' => $page * 500, 'number' => 500, 'fields' => array('ID', 'user_login', 'user_nicename'), )); if (!is_array($users)) $users = array(); foreach ($users as $user) { $info['addui'] .= ''; } $page++; } $info['addui'] .= '

'; } } if (is_array($info) && isset($info['migration']) && true === $info['migration']) { if (empty($info['addui'])) $info['addui'] = ''; $info['addui'] .= '
'; $info['addui'] .= '

' . __('Database restoration options:', 'updraftplus') . '

'; $info['addui'] .= ''; $info['addui'] .= '
'; } // return $info; } private function generate_new_blogid() { $blog_title = __('Migrated site (from UpdraftPlus)', 'updraftplus'); if (!isset($this->restore_options['updraftplus_migrate_blogname'])) { return new WP_Error('multisite_info_missing', sprintf(__('Required information for restoring this backup was not given (%s)', 'updraftplus'), 'new multisite import location')); } // Verify value given $result = wpmu_validate_blog_signup($this->restore_options['updraftplus_migrate_blogname'], $blog_title); if (!empty($result['errors']) && is_wp_error($result['errors']) && $result['errors']->get_error_code()) { return $result['errors']; } global $wpdb, $updraftplus; if (domain_exists($result['domain'], $result['path'], $wpdb->siteid)) { return new WP_Error('already_taken', sprintf(__('Error: %s', 'updraftplus'), 'Site URL already taken')); } $create = $this->create_empty_blog($result['domain'], $result['path'], $blog_title, $wpdb->siteid); if (is_integer($create)) { $url = untrailingslashit($result['domain'].$result['path']); $updraftplus->log(__('New site:', 'updraftplus').' '.$url, 'notice-restore'); switch_to_blog($create); // Update record of what we want to rewrite the URLs to in the search/replace operation $this->siteurl = untrailingslashit(site_url()); $this->home = untrailingslashit(home_url()); // The next line can't work, because content_url() fetches from the constant WP_CONTENT_URL // $this->content = untrailingslashit(content_url()); $wp_upload_dir = wp_upload_dir(); $this->uploads = $wp_upload_dir['baseurl']; if (is_subdomain_install()) { // For some reason, wp_upload_dir() on a subdomain install tends to return a URL with the host set to a different site's domain, despite switch_to_blog() having been called. Try to detect + fix this (though, it also usually won't matter anyway). $uploads_host = parse_url($this->uploads, PHP_URL_HOST); $expected_uploads_host = parse_url($this->home, PHP_URL_HOST); if ($uploads_host && $expected_uploads_host && $uploads_host != $expected_uploads_host) { $this->uploads = UpdraftPlus_Manipulation_Functions::str_replace_once($uploads_host, $expected_uploads_host, $this->uploads); $updraftplus->log("wp_upload_dir() returned an unexpected uploads hosts on a subdomain multisite ($uploads_host, rather than $expected_uploads_host) - correcting; destination uploads URL is now: ".$this->uploads); } } // We have to assume that on the imported site, uploads is at /uploads relative to the content directory if (empty($this->old_uploads)) $this->old_uploads = $this->old_content.'/uploads'; $this->content = false; $this->old_content = false; // $this->siteurl = 'http://'.$url; // $this->home = 'http://'.$url; // $this->content = // ?? restore_current_blog(); return $create; } elseif (is_wp_error($create)) { // Currently returns strings for errors, but being ready in case it improves doesn't hurt. return $create; } else { // Things like __('ERROR: problem creating site entry.' ) $updraftplus->log(__('Error when creating new site at your chosen address:', 'updraftplus'), 'warning-restore'); return new WP_Error('create_empty_blog_failed', __('Error when creating new site at your chosen address:', 'updraftplus').' '.(is_string($create) ? $create : print_r($create, true))); } } /** * Deprecated in WP 4.4 - https://core.trac.wordpress.org/changeset/34753 - hence, folded into the plugin instead * * @param string $domain * @param string $path * @param string $weblog_title * @param integer $site_id */ public function create_empty_blog($domain, $path, $weblog_title, $site_id = 1) { // Out of an abundance of caution, call the native, un-deprecated version if there is one global $updraftplus; $wp_version = $updraftplus->get_wordpress_version(); if (version_compare($wp_version, '4.4', '<') && function_exists('create_empty_blog')) return create_empty_blog($domain, $path, $weblog_title, $site_id); if (empty($path)) $path = '/'; // Check if the domain has been used already. We should return an error message. if (domain_exists($domain, $path, $site_id)) return __('ERROR: Site URL already taken.'); // Need to backup wpdb table names, and create a new wp_blogs entry for new blog. // Need to get blog_id from wp_blogs, and create new table names. // Must restore table names at the end of function. // insert_blog() and install_blog() are deprecated as of WP 5.1.0. // This has also caused an error when using install_blog on 5.1+, so we have switched to the new 'wp_insert_site' if (version_compare($wp_version, '5.1', '<')) { if (!$blog_id = insert_blog($domain, $path, $site_id)) return __('ERROR: problem creating site entry.'); switch_to_blog($blog_id); install_blog($blog_id); restore_current_blog(); } else { $blog_data = array( 'domain' => $domain, 'path' => $path, 'network_id' => $site_id, 'title' => $weblog_title, ); $blog_id = wp_insert_site($blog_data); } return $blog_id; } public function updraftplus_restore_db_record_old_siteurl($old_siteurl) { // Only record once if (!empty($this->old_siteurl)) return; $this->old_siteurl = $old_siteurl; } public function updraftplus_restore_db_record_old_home($old_home) { // Only record once if (!empty($this->old_home)) return; $this->old_home = $old_home; } public function updraftplus_restore_db_record_old_content($old_content) { // Only record once if (!empty($this->old_content)) return; $this->old_content = $old_content; } public function updraftplus_restore_db_record_old_uploads($old_uploads) { // Only record once if (!empty($this->old_uploads)) return; $this->old_uploads = $old_uploads; } /** * This function is called via a filter it saves the passed in old abspath value from restorer.php to a class variable for later use * * @param String $old_abspath - the old abspath * * @return void */ public function updraftplus_restore_db_record_old_abspath($old_abspath) { if ('' !== $this->old_abspath) return; $this->old_abspath = $old_abspath; } public function updraftplus_restore_db_pre() { global $wpdb, $updraftplus, $updraftplus_restorer; $this->siteurl = untrailingslashit(site_url()); $this->home = untrailingslashit(home_url()); $this->content = untrailingslashit(content_url()); $this->use_wpdb = $updraftplus_restorer->use_wpdb(); $this->base_prefix = $updraftplus->get_table_prefix(false); $mysql_dbh = false; $use_mysqli = false; if (!$this->use_wpdb) { // We have our own extension which drops lots of the overhead on the query $wpdb_obj = $updraftplus_restorer->get_db_object(); // Was that successful? if (!$wpdb_obj->is_mysql || !$wpdb_obj->ready) { $this->use_wpdb = true; } else { $this->wpdb_obj = $wpdb_obj; $mysql_dbh = $wpdb_obj->updraftplus_get_database_handle(); $use_mysqli = $wpdb_obj->updraftplus_use_mysqli(); } } $this->mysql_dbh = $mysql_dbh; $this->use_mysqli = $use_mysqli; if (true == $this->use_wpdb) $updraftplus->log_e('Database access: Direct MySQL access is not available, so we are falling back to wpdb (this will be considerably slower)'); if (is_multisite()) { $sites = $wpdb->get_results('SELECT id, domain, path FROM '.UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.'site'), ARRAY_N); if (is_array($sites)) { $nsites = array(); foreach ($sites as $site) $nsites[$site[0]] = array($site[1], $site[2]); $this->original_sites = $nsites; } } $this->report = array( 'tables' => 0, 'rows' => 0, 'change' => 0, 'updates' => 0, 'timetaken' => 0, 'errors' => array(), ); } public function updraftplus_restored_db_table($table, $import_table_prefix, $engine = '') { global $updraftplus, $wpdb, $updraftplus_restorer; if (!empty($this->new_blogid) && !empty($this->restore_options['updraft_restore_content_to_user'])) { if ($table == $import_table_prefix.'posts') { $updraftplus->log("Setting all content (posts/post_author) to be owned by ID: ".$this->restore_options['updraft_restore_content_to_user']); $posts_updated = $wpdb->query("UPDATE ".UpdraftPlus_Manipulation_Functions::backquote($table)." SET post_author=".(int) $this->restore_options['updraft_restore_content_to_user']); if (is_numeric($posts_updated)) { $updraftplus->log("Number of rows updated: ".$posts_updated); } else { $updraftplus->log("An error occurred when updating content ownership"); } } elseif ($table == $import_table_prefix.'postmeta') { // Set WooCommerce orders to belong to guest $keys_deleted = $wpdb->query("DELETE FROM ".UpdraftPlus_Manipulation_Functions::backquote($table)." WHERE meta_key='_customer_user'"); if (is_numeric($keys_deleted)) { $updraftplus->log("Number of WooCommerce orders re-assigned to Guest: ".$keys_deleted); } } } // Anything else to do? if (empty($this->restore_options['updraft_restorer_replacesiteurl'])) return; // Can only do something if the old siteurl is known $old_siteurl = isset($this->old_siteurl) ? $this->old_siteurl : ''; $old_home = isset($this->old_home) ? $this->old_home : ''; $old_content = isset($this->old_content) ? $this->old_content : $old_siteurl.'/wp-content'; // This wasn't stored in the backup header until 1.11.20. It's usually $old_content.'/uploads', but there's no need to force that, as on a default setup, the search/replace is caught by the content replace anyway $old_uploads = isset($this->old_uploads) ? $this->old_uploads : false; if (!$old_home && !$old_siteurl) return; $old_abspath = $this->old_abspath; if (empty($this->tables_replaced)) $this->tables_replaced = array(); // Already done? if (!empty($this->tables_replaced[$table])) return; // If not done already, then search & replace this table, + record that it is done if (function_exists('set_time_limit')) @set_time_limit(1800);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $stripped_table = substr($table, strlen($import_table_prefix)); // Remove multisite site number prefix, if relevant if (is_multisite() && preg_match('/^(\d+)_(.*)$/', $stripped_table, $matches)) $stripped_table = $matches[2]; // This array is for tables that a) we know don't need URL search/replacing and b) are likely to be sufficiently big that they could significantly delay the progress of the migrate (and increase the risk of timeouts on hosts that enforce them) // The term_relationships table contains 3 columns, all integers. Therefore, we can skip it. It can easily get big, so this is a good time-saver. $skip_tables = array('slim_stats', 'statpress', 'term_relationships', 'icl_languages_translations', 'icl_string_positions', 'icl_string_translations', 'icl_strings', 'redirection_logs', 'Counterize', 'Counterize_UserAgents', 'Counterize_Referers', 'adrotate_stats', 'login_security_solution_fail', 'wfHits', 'wfhits', 'wbz404_logs', 'wbz404_redirects', 'wfFileMods', 'wffilemods', 'tts_trafficstats', 'tts_referrer_stats', 'dmsguestbook', 'relevanssi', 'wponlinebackup_generations', 'svisitor_stat', 'simple_feed_stats', 'itsec_log', 'rp_tags', 'woocommerce_order_items', 'relevanssi_log', 'blc_instances', 'wysija_email_user_stat', 'woocommerce_sessions', 'et_bloom_stats', 'redirection_404', 'lbakut_activity_log', 'stream_meta', 'wfBlockedIPLog', 'wfblockediplog', 'page_visit_history', 'strack_st', 'eum_logs'); if (in_array($stripped_table, $skip_tables)) { $this->tables_replaced[$table] = true; $updraftplus->log_e("Skipping this table: data in this table (%s) should not be search/replaced", $table); return; } if ('ARCHIVE' == $engine) { $this->tables_replaced[$table] = true; $updraftplus->log_e("Skipping this table: this table (%s) should not be search/replaced, as it uses the %s engine", $table, $engine); return; } // Blogs table on multisite doesn't contain the full URL if (is_multisite() && ($table == $this->base_prefix.'blogs' || $table == $this->base_prefix.'site') && (preg_match('#^https?://([^/]+)#i', $this->home, $matches) || preg_match('#^https?://([^/]+)#i', $this->siteurl, $matches)) && (preg_match('#^https?://([^/]+)#i', $old_home, $omatches) || preg_match('#^https?://([^/]+)#i', $old_siteurl, $omatches))) { $from_array = strtolower($omatches[1]); $to_array = strtolower($matches[1]); $updraftplus->log_e("Replacing in blogs/site table: from: %s to: %s", htmlspecialchars($from_array), htmlspecialchars($to_array)); $try_site_blog_replace = true; } else { list($from_array, $to_array) = $this->build_searchreplace_array($old_siteurl, $old_home, $old_content, $old_uploads, $old_abspath); // This block is for multisite installs, to do the search/replace of each site's URL individually. We want to try to do it here for efficiency - i.e. so that we don't have to double-pass tables if (!empty($this->restored_blogs) && preg_match('/^(\d+)_(.*)$/', substr($table, strlen($import_table_prefix)), $tmatches) && (preg_match('#^((https?://)([^/]+))#i', $this->home, $matches) || preg_match('#^((https?://)([^/]+))#i', $this->siteurl, $matches)) && (preg_match('#^((https?://)([^/]+))#i', $old_home, $omatches) || preg_match('#^((https?://)([^/]+))#i', $old_siteurl, $omatches))) { $old_home_domain = strtolower($omatches[3]); $new_home_domain = strtolower($matches[3]); $blog_id = $tmatches[1]; if ($old_home_domain == $this->restored_blogs[1]['domain'] && isset($this->restored_blogs[$blog_id])) { $bdom = $this->restored_blogs[$blog_id]['domain']; $bpath = $this->restored_blogs[$blog_id]['path']; $sblog = $omatches[2].$bdom.untrailingslashit($bpath); $rblog = $omatches[2].str_replace($old_home_domain, $new_home_domain, $bdom).untrailingslashit($bpath); if (!in_array($sblog, $from_array)) { $from_array[] = $sblog; $to_array[] = $rblog; } } } } // The search/replace parameters are allowed to be either strings or arrays $report = $updraftplus_restorer->search_replace_obj->icit_srdb_replacer($from_array, $to_array, array($table => $stripped_table), 5000); // If we just replaced either the blogs or site table, then populate our records of what is *now* (i.e. post-restore) in them if (!empty($try_site_blog_replace)) { if ($table == $this->base_prefix.'blogs') { $blogs = $wpdb->get_results('SELECT blog_id, domain, path, site_id FROM '.UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.'blogs'), ARRAY_N); if (is_array($blogs)) { $nblogs = array(); foreach ($blogs as $blog) { $nblogs[$blog[0]] = array('domain' => $blog[1], 'path' => $blog[2], 'site_id' => $blog[3]); } $this->restored_blogs = $nblogs; } } elseif ($table == $this->base_prefix.'site') { $sites = $wpdb->get_results('SELECT id, domain, path FROM '.UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.'site').' ORDER BY id ASC', ARRAY_N); if (is_array($sites)) { $nsites = array(); foreach ($sites as $site) { $nsites[$site[0]] = array($site[1], $site[2]); } $this->restored_sites = $nsites; } } if (!empty($this->restored_sites) && !empty($this->restored_blogs) && !empty($this->original_sites)) { // Adjust paths // Domain, path $any_site_changes = false; foreach ($this->original_sites as $oid => $osite) { if (empty($this->restored_sites[$oid])) continue; $rsite = $this->restored_sites[$oid]; // Task: 1) Replace the site path with the previous site path 2) Replace all the blog path prefixes from the same blog if ($rsite[1] != $osite[1]) { $any_site_changes = true; $sitepath = $osite[1]; $this->restored_sites[$oid][1] = $sitepath; foreach ($this->restored_blogs as $blog_id => $blog) { // From this site? if ($blog['site_id'] != $oid) continue; // Replace the prefix according to the change in prefix for the site $this->restored_blogs[$blog_id] = array('domain' => $blog['domain'], 'path' => $sitepath.substr($blog['path'], strlen($rsite[1])), 'site_id' => $oid); } } } if ($any_site_changes) { $updraftplus->log_e('Adjusting multisite paths'); foreach ($this->restored_sites as $site_id => $osite) { $wpdb->query($wpdb->prepare("UPDATE ".UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.'site')." SET path='%s' WHERE id=%d", array($osite[1], (int) $site_id))); } foreach ($this->restored_blogs as $blog_id => $blog) { $wpdb->query($wpdb->prepare("UPDATE ".UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.'blogs')." SET path='%s' WHERE blog_id=%d", array($blog['path'], (int) $blog_id))); } } } } // Output any errors encountered during the db work. if (!empty($report['errors']) && is_array($report['errors'])) { $updraftplus->log(__('Error:', 'updraftplus'), 'warning-restore', 'restore-db-error'); $processed_errors = array(); foreach ($report['errors'] as $error) { if (in_array($error, $processed_errors)) continue; $processed_errors[] = $error; $num = count(array_keys($report['errors'], $error)); $err_string = $error; if ($num > 1) $err_string .= ' (x'.$num.')'; $updraftplus->log($err_string, 'warning-restore'); } } if (false == $report) { $updraftplus->log(sprintf(__('Failed: the %s operation was not able to start.', 'updraftplus'), __('search and replace', 'updraftplus')), 'warning-restore'); } elseif (!is_array($report)) { $updraftplus->log(sprintf(__('Failed: we did not understand the result returned by the %s operation.', 'updraftplus'), __('search and replace', 'updraftplus')), 'warning-restore'); } else { $this->tables_replaced[$table] = true; // Calc the time taken. foreach (array('tables', 'rows', 'change', 'updates') as $key) { $this->report[$key] += $report[$key]; } $this->report['timetaken'] += $report['end'] - $report['start']; } } /** * Displays admin notice if .htaccess have any old migrated site reference. */ public function migration_admin_notices() { $updraftplus_migrated_site_domain = get_site_option('updraftplus_migrated_site_domain', false); if ($updraftplus_migrated_site_domain) { $htaccess_file_path = ABSPATH.'.htaccess'; $htaccess_file_reference_line_num_arr = array(); if (file_exists($htaccess_file_path) && is_file($htaccess_file_path)) { $current_site_domain = rtrim(str_ireplace(array('http://', 'https://'), '', get_home_url()), '/'); $htaccess_file_lines = file($htaccess_file_path); if (false !== $htaccess_file_lines) { foreach ($htaccess_file_lines as $num => $line) { $migrated_site_domain_pos = stripos($line, $updraftplus_migrated_site_domain); if (false !== $migrated_site_domain_pos && stripos($line, $current_site_domain) !== $migrated_site_domain_pos) { $htaccess_file_reference_line_num_arr[] = $num + 1; } } } } $count_old_site_references = count($htaccess_file_reference_line_num_arr); if ($count_old_site_references > 0) { ?>

'.__('Warning', 'updraftplus').': '._n('Your .htaccess has an old site reference on line number %s. You should remove it manually.', 'Your .htaccess has an old site references on line numbers %s. You should remove them manually.', $count_old_site_references, 'updraftplus'), implode(', ', $htaccess_file_reference_line_num_arr)); ?>

(siteurl,home,content,uploads,abspath) * * @param String $old_siteurl - the old site url * @param String $old_home - the old home url * @param Boolean|String $old_content - the old content url * @param Boolean|String $old_uploads - the old upload url * @param String $old_abspath - the old abspath * * @return Array - itself containing two arrays, with corresponding 'search' and 'replace' items. */ private function build_searchreplace_array($old_siteurl, $old_home, $old_content = false, $old_uploads = false, $old_abspath = '') { // The uploads parameter, if === false, should be ignored - it is only intended to be used in the special case of single-into-multisite imports (only in that case with $this->uploads get set) if (false === $old_content && false === $old_uploads) $old_content = $old_siteurl.'/wp-content'; $from_array = array(); $to_array = array(); if (!empty($old_siteurl) && $old_siteurl == $old_home) { $from_array[] = $old_home; // Used to be site until Sep 2016, but that is wrong. Most likely it was the best possibility before the upload URL was also recorded/known. $to_array[] = $this->home; } elseif (!empty($old_home) && strpos($old_siteurl, $old_home) === 0) { // strpos: haystack, needle - i.e. old_home is a (proper, since they were not ==) substring of old_siteurl $from_array[] = $old_siteurl; $to_array[] = $this->siteurl; $from_array[] = $old_home; $to_array[] = $this->home; // If the source home URL is also a proper substring of the destination site URL, then this should be skipped if ($old_home != $this->siteurl && strpos($this->siteurl, $old_home) === 0) { // Not pretty, but the only solution that can cope with content in posts that contains references to both site and home URLs in this case. This extra search URL un-does the adding of an unnecessary duplicate portion to site URLs in the case that is detected here. $from_array[] = $this->home.substr($this->home, strlen($old_home)); $to_array[] = $this->home; } } elseif (!empty($old_siteurl) && strpos($old_home, $old_siteurl) === 0) { // old_siteurl is a substring of old_home (weird!) $from_array[] = $old_home; $to_array[] = $this->home; $from_array[] = $old_siteurl; $to_array[] = $this->siteurl; } else { // neither contains the other if (!empty($old_siteurl)) { $from_array[] = $old_siteurl; $to_array[] = $this->siteurl; } if (!empty($old_home)) { $from_array[] = $old_home; $to_array[] = $this->home; } } // We now have a minimal array based on the site_url and home settings // The case we need to detect is: (site_url is a prefix of content_url and new_site_url is a prefix of new_content_url and the remains are the same. // We do [0] of the existing array, to handle the weird case where old_siteurl is a substring of old_home (i.e. we get the shortest possible match) // We will want to do the content URLs first, since they are likely to be longest if (empty($old_content) || empty($this->content) || (!empty($from_array) && 0 === strpos($old_content, $from_array[0]) && 0 === strpos($this->content, $to_array[0]) && substr($old_content, strlen($from_array[0])) === substr($this->content, strlen($to_array[0])))) { // OK - nothing to do - is already covered } else { // Search/replace needed array_unshift($from_array, $old_content); array_unshift($to_array, $this->content); } if (empty($old_uploads) || empty($this->uploads) || (!empty($from_array) && 0 === strpos($old_uploads, $from_array[0]) && 0 === strpos($this->uploads, $to_array[0]) && substr($old_uploads, strlen($from_array[0])) === substr($this->uploads, strlen($to_array[0])))) { // OK - nothing to do - is already covered or no data is present } else { // Search/replace needed array_unshift($from_array, $old_uploads); array_unshift($to_array, $this->uploads); } $schemes = array('http', 'https'); $prefixes = array('www.', ''); // Add the opposite http version so that sites with mixed links are caught foreach ($from_array as $key => $value) { if (preg_match('#^https?://(?:www\.)?(.+)#i', $value, $matches)) { foreach ($schemes as $scheme) { foreach ($prefixes as $prefix) { if (!in_array($scheme."://".$prefix.$matches[1], $from_array)) { $from_array[] = $scheme."://".$prefix.$matches[1]; $to_array[] = $to_array[$key]; } } } } } if (rtrim($old_abspath, '/') !== '') { $from_array[] = rtrim($old_abspath, '/'); $to_array[] = rtrim(ABSPATH, '/'); } return array($from_array, $to_array); } public function updraftplus_restored_db($info, $import_table_prefix) { global $wpdb, $updraftplus; $updraftplus->log('Begin search and replace (updraftplus_restored_db)'); $updraftplus->log(__('Database: search and replace site URL', 'updraftplus'), 'database-replace-site-url'); if (empty($this->restore_options['updraft_restorer_replacesiteurl'])) { $updraftplus->log_e('This option was not selected.'); return; } $replace_this_siteurl = isset($this->old_siteurl) ? $this->old_siteurl : ''; // Don't call site_url() - the result may/will have been cached // if (isset($this->new_blogid)) switch_to_blog($this->new_blogid); // $db_siteurl_thissite = $wpdb->get_row("SELECT option_value FROM $wpdb->options WHERE option_name='siteurl'")->option_value; // $db_home_thissite = $wpdb->get_row("SELECT option_value FROM $wpdb->options WHERE option_name='home'")->option_value; // if (isset($this->new_blogid)) restore_current_blog(); // Until 1.12.25, we just used the main options table, which resulted in wrong results when importing a single site into a multisite $options_table = empty($this->new_blogid) ? 'options' : $this->new_blogid.'_options'; $db_siteurl_thissite = $wpdb->get_row("SELECT option_value FROM ".UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.$options_table)." WHERE option_name='siteurl'")->option_value; $db_home_thissite = $wpdb->get_row("SELECT option_value FROM ".UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.$options_table)." WHERE option_name='home'")->option_value; if (!$replace_this_siteurl) { $replace_this_siteurl = $db_siteurl_thissite; } $replace_this_home = isset($this->old_home) ? $this->old_home : ''; if (!$replace_this_home) { $replace_this_home = $db_home_thissite; } $replace_this_content = isset($this->old_content) ? $this->old_content : ''; if (!$replace_this_content) { $replace_this_content = $replace_this_siteurl.'/wp-content'; } $replace_this_uploads = isset($this->old_uploads) ? $this->old_uploads : false; $replace_this_abspath = $this->old_abspath; // Sanity checks if (empty($replace_this_siteurl)) { $updraftplus->log(sprintf(__('Error: unexpected empty parameter (%s, %s)', 'updraftplus'), 'backup_siteurl', $this->siteurl), 'warning-restore'); return; } if (empty($replace_this_home)) { $updraftplus->log(sprintf(__('Error: unexpected empty parameter (%s, %s)', 'updraftplus'), 'backup_home', $this->home), 'warning-restore'); return; } if (empty($replace_this_content)) { $updraftplus->log(sprintf(__('Error: unexpected empty parameter (%s, %s)', 'updraftplus'), 'backup_content_url', $this->content), 'warning-restore'); return; } if (empty($this->siteurl)) { $updraftplus->log(sprintf(__('Error: unexpected empty parameter (%s, %s)', 'updraftplus'), 'new_siteurl', $replace_this_siteurl), 'warning-restore'); return; } if (empty($this->home)) { $updraftplus->log(sprintf(__('Error: unexpected empty parameter (%s, %s)', 'updraftplus'), 'new_home', $replace_this_home), 'warning-restore'); return; } // Only complain about the empty content parameter if it's not the case where we use the uploads parameter instead if (empty($this->content) && empty($this->uploads)) { $updraftplus->log(sprintf(__('Error: unexpected empty parameter (%s, %s)', 'updraftplus'), 'new_contenturl', $replace_this_content), 'warning-restore'); return; } // Remove any scheduled backup jobs on any imported-into-multisite site if (!empty($this->new_blogid)) { switch_to_blog($this->new_blogid); wp_clear_scheduled_hook('updraft_backup'); wp_clear_scheduled_hook('updraft_backup_database'); wp_clear_scheduled_hook('updraft_backup_increments'); restore_current_blog(); } if ($replace_this_siteurl == $this->siteurl && $replace_this_home == $this->home && $replace_this_content == $this->content) { $this->is_migration = false; $updraftplus->log(sprintf(__('Nothing to do: the site URL is already: %s', 'updraftplus'), $this->siteurl), 'notice-restore'); return; } $this->is_migration = true; do_action('updraftplus_restored_db_is_migration'); // Detect situation where the database's siteurl in the header differs from that actual row data in the options table. This can occur if the options table was being over-ridden by a constant. In that case, the search/replace will have failed to set the option table's siteurl; and the result will be that that siteurl is hence wrong, leading to site breakage. The solution is to re-set it. // $info['expected_oldsiteurl'] is from the db.gz file header if (isset($info['expected_oldsiteurl']) && $info['expected_oldsiteurl'] != $db_siteurl_thissite && $db_siteurl_thissite != $this->siteurl) { $updraftplus->log_e(sprintf(__("Warning: the database's site URL (%s) is different to what we expected (%s)", 'updraftplus'), $db_siteurl_thissite, $info['expected_oldsiteurl'])); // Here, we change only the site URL entry; we don't run a full search/replace based on it. In theory, if someone developed using two different URLs, then this might be needed. if (!empty($this->base_prefix) && !empty($this->siteurl)) { $wpdb->query($wpdb->prepare("UPDATE ".UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.$options_table)." SET option_value='%s' WHERE option_name='siteurl'", array($this->siteurl))); } } if (isset($info['expected_oldhome']) && $info['expected_oldhome'] != $db_home_thissite && $db_home_thissite != $this->home) { $updraftplus->log_e(sprintf(__("Warning: the database's home URL (%s) is different to what we expected (%s)", 'updraftplus'), $db_home_thissite, $info['expected_oldhome'])); if (!empty($this->base_prefix) && !empty($this->home)) { $wpdb->query($wpdb->prepare("UPDATE ".UpdraftPlus_Manipulation_Functions::backquote($this->base_prefix.$options_table)." SET option_value='%s' WHERE option_name='home'", array($this->home))); } } if (function_exists('set_time_limit')) @set_time_limit(1800);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. list($from_array, $to_array) = $this->build_searchreplace_array($replace_this_siteurl, $replace_this_home, $replace_this_content, $replace_this_uploads, $replace_this_abspath); foreach ($from_array as $ind => $from_url) { $updraftplus->log_e('Database search and replace: replace %s in backup dump with %s', $from_url, $to_array[$ind]); } return $this->updraftplus_restored_db_dosearchreplace($from_array, $to_array, $import_table_prefix); } private function updraftplus_restored_db_dosearchreplace($from_array, $to_array, $import_table_prefix, $examine_siteurls = true) { global $updraftplus, $wpdb, $updraftplus_restorer; // Now, get an array of tables and then send it off to $updraftplus_restorer->search_replace_obj->icit_srdb_replacer() // Code modified from searchreplacedb2.php version 2.1.0 from http://www.davidcoveney.com // Do we have any tables and if so build the all tables array $tables = array(); // We use $wpdb for non-performance-sensitive operations (e.g. one-time calls) $tables_mysql = $wpdb->get_results('SHOW TABLES', ARRAY_N); $is_multisite = is_multisite(); if ($examine_siteurls && $is_multisite && empty($this->new_blogid)) { $sites = $wpdb->get_results('SELECT id, domain, path FROM '.UpdraftPlus_Manipulation_Functions::backquote($import_table_prefix.'site').' ORDER BY id ASC', ARRAY_N); $nsites = array(); foreach ($sites as $site) { $nsites[$site[0]] = array('dom' => $site[1], 'path' => $site[2]); } $blogs = $wpdb->get_results('SELECT blog_id, domain, path, site_id FROM '.UpdraftPlus_Manipulation_Functions::backquote($import_table_prefix.'blogs').' ORDER BY blog_id ASC', ARRAY_N); $nblogs = array(); foreach ($blogs as $blog) { $nblogs[$blog[0]] = array('dom' => $blog[1], 'path' => $blog[2], 'site_id' => $blog[3]); } } if (!$tables_mysql) { $updraftplus->log(__('Error:', 'updraftplus').' '.__('Could not get list of tables', 'updraftplus'), 'warning-restore'); $updraftplus->log('Could not get list of tables'); $updraftplus_restorer->search_replace_obj->print_error('SHOW TABLES'); return false; } else { // Run through the array - each element a numerically-indexed array $multisite_processed_sites = array(); foreach ($tables_mysql as $table) { // Type equality is necessary, as we don't want to match false // "Warning: strpos(): Empty delimiter" means that the second parameter is a zero-length string if (0 === strpos($table[0], $import_table_prefix)) { $tablename = $table[0]; // For migration only. This method is called from Advanced Tools > Search / replace database too. if (!empty($this->restore_options) && !empty($this->restore_options['tables_to_restore']) && !in_array($tablename, $this->restore_options['tables_to_restore'])) continue; $stripped_table = substr($tablename, strlen($import_table_prefix)); // Remove multisite site number prefix, if relevant if (is_multisite() && preg_match('/^(\d+)_(.*)$/', $stripped_table, $matches)) $stripped_table = $matches[2]; if (!empty($this->which_tables) && is_array($this->which_tables)) { if (!in_array($tablename, $this->which_tables)) { $updraftplus->log(sprintf(__('Search and replacing table:', 'updraftplus')).$tablename.': '.__('skipped (not in list)', 'updraftplus'), 'notice-restore', 'restore-skipped-'.$tablename); continue; } } $still_needs_doing = empty($this->tables_replaced[$tablename]); // Looking for site tables on multisite if ($examine_siteurls && $is_multisite && !empty($this->restored_blogs) && preg_match('/^(\d+)_(.*)$/', substr($tablename, strlen($import_table_prefix)), $tmatches) && is_numeric($tmatches[1]) && !empty($this->restored_blogs[$tmatches[1]]) && !empty($nblogs[$tmatches[1]]) && (preg_match('#^((https?://)([^/]+))#i', $this->home, $matches) || preg_match('#^((https?://)([^/]+))#i', $this->siteurl, $matches))) { // If the database file was not created by UD, then it may be out of order. Specifically, the 'blogs' table might have come *after* the tables for the individual sites. As a result, the tables for those sites may not have been fully searched + replaced... so we need to check that. // What are we expecting the site_url to be? $blog_id = $tmatches[1]; if (empty($multisite_processed_sites[$blog_id])) { $multisite_processed_sites[$blog_id] = true; $site_url_current = $wpdb->get_var("SELECT option_value FROM ".UpdraftPlus_Manipulation_Functions::backquote($import_table_prefix.$blog_id)."_options WHERE option_name='siteurl'"); if (is_string($site_url_current)) { $bpath = $this->restored_blogs[$blog_id]['path']; // Jan 2016: This line is old, and removes the main site's path, if present, from the front of this site's path - but why? I suspect it was so that images could be referenced directly without help from .htaccess - perhaps from when media used to be differently organised? // $bpathroot = $this->restored_blogs[1]['path']; // if (substr($bpath, 0, strlen($bpathroot)) == $bpathroot) $bpath = substr($bpath, strlen($bpathroot)-1); $proto = $matches[2]; $site_url_target = $proto.$nblogs[$blog_id]['dom'].untrailingslashit($bpath); if ($site_url_target != $site_url_current) { $updraftplus->log("Site url ($site_url_current) for this blog (blog_id=$blog_id) did not match the expected value ($site_url_target) - replacing"); $multisite_processed_sites[$blog_id] = 1; $still_needs_doing = true; $from_array[] = $site_url_current; $to_array[] = $site_url_target; } } } elseif (!$still_needs_doing && 1 === $multisite_processed_sites[$blog_id]) { $still_needs_doing = true; } } if ($still_needs_doing) { $tables[$tablename] = $stripped_table; } else { $updraftplus->log(sprintf(__('Search and replacing table:', 'updraftplus')).' '.$tablename.': '.__('already done', 'updraftplus'), 'notice-restore', 'restore-table-already-done-'.$tablename); $updraftplus->log('Search and replacing table: '.$tablename.': already done'); } } } } $final_report = $this->report; if (!empty($tables)) { $report = $updraftplus_restorer->search_replace_obj->icit_srdb_replacer($from_array, $to_array, $tables, $this->page_size); // Output any errors encountered during the db work. if (!empty($report['errors']) && is_array($report['errors'])) { $updraftplus->log(__('Error:', 'updraftplus'), 'warning-restore', 'db-replace-error'); $processed_errors = array(); foreach ($report['errors'] as $error) { if (in_array($error, $processed_errors)) continue; $processed_errors[] = $error; $num = count(array_keys($report['errors'], $error)); $error_msg = $error; if ($num > 1) $error_msg .= ' (x'.$num.')'; $updraftplus->log($error_msg, 'warning-restore'); } } if (false == $report) { $updraftplus->log(sprintf(__('Failed: the %s operation was not able to start.', 'updraftplus'), 'search and replace'), 'warning-notice'); } elseif (!is_array($report)) { $updraftplus->log(sprintf(__('Failed: we did not understand the result returned by the %s operation.', 'updraftplus'), 'search and replace'), 'warning-notice'); } // Calc the time taken. foreach (array('tables', 'rows', 'change', 'updates') as $key) { $final_report[$key] += $report[$key]; } $final_report['timetaken'] += $report['end'] - $report['start']; foreach ($report['errors'] as $error) { $final_report['errors'][] = $error; } } $updraftplus->log(__('Tables examined:', 'updraftplus').' '.$final_report['tables'], 'notice-restore', 'restore-tables-examined'); $updraftplus->log(__('Rows examined:', 'updraftplus').' '.$final_report['rows'], 'notice-restore', 'restore-rows-examined'); $updraftplus->log(__('Changes made:', 'updraftplus').' '.$final_report['change'], 'notice-restore', 'restore-changes-made'); $updraftplus->log(__('SQL update commands run:', 'updraftplus').' '.$final_report['updates'], 'notice-restore', 'restore-sql-commands-run'); $updraftplus->log(__('Errors:', 'updraftplus').' '. count($final_report['errors']), 'notice-restore', 'restore-tables-errors'); $updraftplus->log(__('Time taken (seconds):', 'updraftplus').' '.round($final_report['timetaken'], 3), 'notice-restore', 'restore-tables-time-taken'); // Here, We are saving migrated site url for scanning .htaccess file for migrated site url. if migrated site url exist in .htaccess file, plugin should prompt alert message for it. This site option stored if and if only Migrator addon is exist. It requires to add after search and replace. if (!empty($this->old_siteurl)) update_site_option('updraftplus_migrated_site_domain', rtrim(str_ireplace(array('http://', 'https://'), '', $this->old_siteurl), '/')); } /** * Add js for dismiss migration old site references notice * * @return void */ public function dismiss_notice_for_old_site_references() { global $pagenow; if (UpdraftPlus_Options::admin_page() != $pagenow || empty($_REQUEST['page']) || 'updraftplus' != $_REQUEST['page']) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- $pagenow is undefined $GLOBALS['updraftplus_admin']->admin_enqueue_scripts(); ?>

get_remotesites_selector();?>


list_our_keys(); ?>
options['context'] = $context; } // TODO: fix up request_filesystem_credentials(), or split it, to allow us to request a no-output version // This will output a credentials form in event of failure, We don't want that, so just hide with a buffer ob_start(); $result = parent::request_filesystem_credentials($error, $context, $allow_relaxed_file_ownership); ob_end_clean(); return $result; } /** * Get update message * * @return array reti=urns an array of messages */ public function get_upgrade_messages() { return $this->messages; } /** * Feedback * * @param string|array|WP_Error $data THis is the data to be used for the feedback */ protected function updraft_feedback($data) { if (is_wp_error($data)) { $string = $data->get_error_message(); } elseif (is_array($data)) { return; } else { $string = $data; } if (!empty($this->upgrader->strings[$string])) $string = $this->upgrader->strings[$string]; if (false !== strpos($string, '%')) { $args = func_get_args(); $args = array_splice($args, 1); if (!empty($args)) $string = vsprintf($string, $args); } $string = trim($string); // Only allow basic HTML in the messages, as it'll be used in emails/logs rather than direct browser output. $string = wp_kses($string, array( 'a' => array( 'href' => true ), 'br' => true, 'em' => true, 'strong' => true, )); if (empty($string)) return; $this->messages[] = $string; } public function header() { ob_start(); } public function footer() { $output = ob_get_clean(); if (!empty($output)) $this->feedback($output); } /** * @access public */ public function bulk_header() {} public function bulk_footer() { } } global $updraftcentral_main; $wp_version = $updraftcentral_main->get_wordpress_version(); if (version_compare($wp_version, '5.3', '>=')) { if (!class_exists('Automatic_Upgrader_Skin')) require_once(dirname(__FILE__).'/automatic-upgrader-skin-compatibility.php'); } else { class Automatic_Upgrader_Skin extends Automatic_Upgrader_Skin_Main { public function feedback($string) { parent::updraft_feedback($string); } } }PKwL\Kλ)).updraftplus/central/css/central-2-23-7.min.cssnu[.updraftcentral_wizard_option{width:45%;float:left;text-align:center}.updraftcentral_wizard_option label{margin-bottom:8px}#updraftcentral_keys_table{display:none}.create_key_container{border:1px solid;border-radius:4px;padding:0 0 6px 6px;margin-bottom:8px}.updraftcentral-subheading{font-size:14px;margin-top:-10px;margin-bottom:20px}.updraftcentral-data-consent{font-size:13px;margin-bottom:10px}#updraftcentral_keys_table{width:100%}#updraftcentral_stage1_go{cursor:pointer}.updraftcentral_wizard_option>div{margin-top:5px}#updraftcentral_keys_table td{line-height:1.4em}#updraftcentral_keys_table .updraftcentral_key_delete{display:inline-block;margin-top:4px;margin-bottom:4px}#updraftcentral_keys_table .updraft_debugrow td{min-width:auto !important} /*# sourceMappingURL=central-2-23-7.min.css.map */ PKwL\H"e2updraftplus/central/css/central-2-23-7.min.css.mapnu[{"version":3,"sources":["central/css/central.css"],"names":[],"mappings":"AAAA;CACC,UAAU;CACV,WAAW;CACX,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,iBAAiB;CACjB,kBAAkB;CAClB,oBAAoB;CACpB,kBAAkB;AACnB;;AAEA;CACC,eAAe;CACf,iBAAiB;CACjB,mBAAmB;AACpB;;AAEA;CACC,eAAe;CACf,mBAAmB;AACpB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,qBAAqB;CACrB,eAAe;CACf,kBAAkB;AACnB;;AAEA;CACC,0BAA0B;AAC3B","file":"central-2-23-7.min.css","sourcesContent":[".updraftcentral_wizard_option {\n\twidth: 45%;\n\tfloat: left;\n\ttext-align: center;\n}\n\n.updraftcentral_wizard_option label {\n\tmargin-bottom: 8px;\n}\n\n#updraftcentral_keys_table {\n\tdisplay: none;\n}\n\n.create_key_container {\n\tborder: 1px solid;\n\tborder-radius: 4px;\n\tpadding: 0 0 6px 6px;\n\tmargin-bottom: 8px;\n}\n\n.updraftcentral-subheading {\n\tfont-size: 14px;\n\tmargin-top: -10px;\n\tmargin-bottom: 20px;\n}\n\n.updraftcentral-data-consent {\n\tfont-size: 13px;\n\tmargin-bottom: 10px;\n}\n\n#updraftcentral_keys_table {\n\twidth: 100%;\n}\n\n#updraftcentral_stage1_go {\n\tcursor: pointer;\n}\n\n.updraftcentral_wizard_option > div {\n\tmargin-top: 5px;\n}\n\n#updraftcentral_keys_table td {\n\tline-height: 1.4em;\n}\n\n#updraftcentral_keys_table .updraftcentral_key_delete {\n\tdisplay: inline-block;\n\tmargin-top: 4px;\n\tmargin-bottom: 4px;\n}\n\n#updraftcentral_keys_table .updraft_debugrow td {\n\tmin-width: auto !important;\n}\n"]}PKwL\htt#updraftplus/central/css/central.cssnu[.updraftcentral_wizard_option { width: 45%; float: left; text-align: center; } .updraftcentral_wizard_option label { margin-bottom: 8px; } #updraftcentral_keys_table { display: none; } .create_key_container { border: 1px solid; border-radius: 4px; padding: 0 0 6px 6px; margin-bottom: 8px; } .updraftcentral-subheading { font-size: 14px; margin-top: -10px; margin-bottom: 20px; } .updraftcentral-data-consent { font-size: 13px; margin-bottom: 10px; } #updraftcentral_keys_table { width: 100%; } #updraftcentral_stage1_go { cursor: pointer; } .updraftcentral_wizard_option > div { margin-top: 5px; } #updraftcentral_keys_table td { line-height: 1.4em; } #updraftcentral_keys_table .updraftcentral_key_delete { display: inline-block; margin-top: 4px; margin-bottom: 4px; } #updraftcentral_keys_table .updraft_debugrow td { min-width: auto !important; } PKwL\Յ&updraftplus/central/images/ud-logo.pngnu[PNG  IHDR<q OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs.#.#x?vtIME  l6eIDATx{_Eu?_rsC < 0N1#(BAWT]vJ|BKBʣU^T%=-4M$ycޛ}wkݕܛ=3sٳgUSI5wTUҦg)oIW6_UZ`fX~q[c $i/`O`5nf;A +cJgG{oсo 7o+m5VCA&cshWX lS 4͒҆$GפTڬh \MXf'ְ o ,*m~^w jT9K5';`fe]nX <\|+^Jhok̬X6lޅF~:uM} 3}E$MVXj6~D]<ѧ8:\Mkxju$L"`Mk+U>JJm%qtCGW|zGSW $VX@GQ `Ch|͎'q4lJc9wzXiWJ{^$.vPPHr!#|$$շ풠]8Sv2w6;:yW7$$-v PM< Bi)zbDg$q4hCpvCc#Go`fI5z9kG֙4BGBrя]:'$q գOcJ9#͖|;GDr^,7TZO2}'~FۛދS[8*s;;zgJfz6Τ |:eV-Jߦ$nsSߠ뻚v{|> Rkkn`ݝyp/a`+XϠ: {~ci`A#u 6P,XWP~:p՚D_5Y(q"QX)UX} K+d7!a# ֏w3,PD^,` G֗Y–nZGH_T1dVvB`mEj $Bo_6-YD,`m=U+5kf@X = P#EfW՚AWXiZ^X[B8>p=k`+Ih2Qy2e%(,/ zZy f+#<5ZBMz_+\ *x v 6䌬o<+$ X8X^"ؐO 9rjJABH)>$߶$ Tšڈ=#sW`2xz - ;z?2YwXoUYJYK3zP(xoI`m]Axk|M竦;%>/9 GA],4Nؓ]7Wgdmg$BpxKLY I$>"wxY˪J2SYہgYXigI&7ZPqG^Rdp"s).љ%6;6+Kj%0Cil(Xb* ٘RVCP܍Rd*V,NV`ɑZ`ą2WsI-t=2μ xfq.s&0KEBH-F o8{GGs? xAݣelL(mD y$>^V*Q >åVlѽfp͓ے8ڻJHbV}s5ߐ`+ x"_ &7+9+2x ٘UXa.dsN͂<ιXѱdJ\sj.Ϲb7O, 7Sy*mj.E>"ߩ=I}+{nxAP-*b)Uԛѻsj؍ ka,GY-،I³Ey:셂O>u<[%򸅆w7+B.V,.ͭ:!^[`I bnV؝ٳ np/i&q4:8Ճj4GQ=$sC%N5.{q`uWKsXJ[F=VW3Ö;zvl\%ϭ! ,PPHPIg8뽪\(gRd2gpj9qH tjHIFe&cL.m5RO򌶒K[s7"|}~xqviL.JcrzhkaO A,Rf 7 &EX{Դvw3MϮ((4[ޛIc֦CtVPKA нe2"V%J;Ѥ#*\Qm#;|5{ :CCyJG}f)5C-]a4 [ 2쵗}RlٵZݢ5KSKT˕b X5xҠtVbŅxl+._Gs\5 ]t0iQNQEai{ͷ/ڑ0fŽMC! ,OPH-H 8ɧ`t$%VD08 ,e g+rAȐU%UKW+\D9yjX4O2p]_s݌Ժ}|JGtxwjzK5J_N8LC3#yVKBoPɕΫCTُԭܤә"0rtsmlP`J PT`h 0 n4` [>];2 ;x.=ٸ'zHAD$b$oa6+]1QF KY$&o lqO,e⥺m,nŒWDy FO3( i'T馣n`Z RdzIŝ<{t.8^aS *{$zS>E *K`I* Nk5ꕥ@asҖ(tt7Djmqb%%! ,PPH.I%8M'hhk n]q<欞 (SҬr kͪ1dU؅ E/gw~P%625.Kt--p''#p+y-},4&u{Dk/(dIĹ(Z$­s[֡YNR᥿a[ھ^溘_HsNc 'n:|O]C(2,8b2,i$ cK/ mcʊܭ7q2jGҔ Lh#Q޼T랚9[גM8Ű.WFD+r5=յ̀ U};߶rd@ZOo yo>؉dFEX?787O._(t; ,6q |M#lT%Jy-.|P·ȾhVȸ&[RԨ`ҳ=ʗڹaDm %~8 1%sOݺdƕͰ}H8*h^Nj PE&O΂/9<iA#OΞ%AB|5U =эK]̈Ě*wz h"9v&TzZOqs|\[ҍҽ +`΄;6ƆbBHJNO2ӽܜE@bM} !_u+$ ! ,OOH0 89&hhv*?<:o bȢ$eJJ ,hJAdTd#um1mLʇEC}8=L?>>~S4S=78`B9$8/1w. 6'X.k-gT.q(-T¾ͪZYQbvYf`O^ WF JVMwp":]zpvEV\ʖ`z8FJ""'x$5SXdM[4QhODLָLMݬ#XjN( kXbv5Tl~| 5..'#nWmP@Zv &lP:\vZR7=yh…OBGNŮ/%y! ,PPH.I%8=E&hE*+?ߠ7D7 _DqyJ^P>vz< AmeՌ>$;8 ak,SST}wH r4@8O770u0zR+ m.-M# i"jLɆ%VӲ=k&ۭQMZRgKoTb  z-$B^'~2214xnC$9tۇ^`Qf>Rs2L KSQg"͟!/f<r*K\ Ҭæέ5r ! ` ,رJRh֫qm*fO=VnԺy+!+>5:$.G;;@*y姯<%'P1})w_ (ԉ9%! ,PPX/I&8뭦čXclt*uߤM+~qJ6P3Z$jG7]bUZT,M9r!8~5| zB:3J/4gOJ -@% 6/>yt&i;PnVu\)*Wp`x铇ܶ.J C+z@8M?dA<ƄcF$a`#-eCRɐș"5idU opgk#C 5<3^F" KWŸ%\ʂW9 '4uXX\[ 'Z\ZBhp!)=CDʻ͡/o=(x* >GJdh&EX;:ΧU~ ۔O$y4m5;/%,U<{ƘڬY 5KF_pÛ7)߾6IeTgC&fTt^d楄?s&%҆NJ! ,OOX*I8 `pdhjd+;o- ڼ:No fHU IDS(hq.Vg-ųmY֝qy%Ͼ'{|}t.BO6/GJ/w84ql5L.@ZryVm;NOb*/|zV &4#da"}E ͘ϪhYEPSaʕ>݋05X;(prJ!@ln؋(Qd*bAY@#&[P| 56(-髕NB? ʜY҄>Q1}I$OF'Q&jؤjX\-e1GEAN:%6&]WpZb"B(bCXrSam-kH! ,PPH/I8M'hd*,Q+,rV mFYl.m{ ԶTfFS-!7~6)qjzBa \P iODI3~'}c2(p,RJ; 1Ľ¾ʓ&UυԌҍ 8S : < !ѩ raEumgaC)g8±f*+zyM<) =g軦 M>9CT:Z=u֭\.ke#ˌ+R m۔=Q͙%ّ-{W&O Vq2f.F'ήpt֌Ix1ڜ&!,PPH.I'8k=E&hh{*_ޟ7:[1aXd4FK5a{HmkU<wUSt:~g|nx2)t.{I%mFc=6+V(~+hYaħ6]zoςӁW}զoۖjeɸ?wTg?>_;)R;Ȥ114X.ĉ!H/FO*2)QF\ ̼EBkINJnk(B6? K͚%a8vdQD5$t/*Y%߄wv skӱ pY+k/DV٠%ЎOkG),f ^L37b} )&weѭR۫Ds`X;PKwL\2B==!updraftplus/central/js/central.jsnu[/** * Send an action over AJAX. A wrapper around jQuery.ajax. In future, all consumers can be reviewed to simplify some of the options, where there is historical cruft. * N.B. updraft_iframe_modal() below uses the AJAX URL for the iframe's src attribute * * @param {string} action - the action to send * @param {*} data - data to send * @param {Function} callback - will be called with the results * @param {object} options -further options. Relevant properties include: * - [json_parse=true] - whether to JSON parse the results * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it) * - [action='updraft_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'subaction' parameter on the AJAX request) * - [nonce=updraft_credentialtest_nonce] - the nonce value to send. * - [nonce_key='nonce'] - the key value for the nonce field * - [timeout=null] - set a timeout after this number of seconds (or if null, none is set) * - [async=true] - control whether the request is asynchronous (almost always wanted) or blocking (would need to have a specific reason) * - [type='POST'] - GET or POST */ function updraftcentral_send_command(action, data, callback, options) { default_options = { json_parse: true, alert_on_error: true, action: 'updraft_central_ajax', nonce_key: 'nonce', timeout: null, async: true, type: 'POST' } if ('undefined' !== typeof uclion.updraftcentral_request_nonce && uclion.updraftcentral_request_nonce) { default_options.nonce = uclion.updraftcentral_request_nonce; } if ('undefined' === typeof options) options = {}; for (var opt in default_options) { if (!options.hasOwnProperty(opt)) { options[opt] = default_options[opt]; } } var ajax_data = { action: options.action, subaction: action, }; ajax_data[options.nonce_key] = options.nonce; ajax_data.action_data = data; var ajax_opts = { type: options.type, url: ajaxurl, data: ajax_data, success: function(response, status) { if (options.json_parse) { try { var resp = central_parse_json(response); } catch (e) { if ('function' == typeof options.error_callback) { return options.error_callback(response, e, 502, resp); } else { console.log(e); console.log(response); if (options.alert_on_error) { alert(uclion.unexpectedresponse+' '+response); } return; } } if (resp.hasOwnProperty('fatal_error')) { if ('function' == typeof options.error_callback) { // 500 is internal server error code return options.error_callback(response, status, 500, resp); } else { console.error(resp.fatal_error_message); if (options.alert_on_error) { alert(resp.fatal_error_message); } return false; } } if ('function' == typeof callback) callback(resp, status, response); } else { if ('function' == typeof callback) callback(response, status); } }, error: function(response, status, error_code) { if ('function' == typeof options.error_callback) { options.error_callback(response, status, error_code); } else { console.log("updraftcentral_send_command: error: "+status+" ("+error_code+")"); console.log(response); } }, dataType: 'text', async: options.async }; if (null != options.timeout) { ajax_opts.timeout = options.timeout; } jQuery.ajax(ajax_opts); } /** * Parse JSON string, including automatically detecting unwanted extra input and skipping it * * @param {string} json_mix_str - JSON string which need to parse and convert to object * @param {boolean} analyse - if true, then the return format will contain information on the parsing, and parsing will skip attempting to JSON.parse() the entire string (will begin with trying to locate the actual JSON) * * @throws SyntaxError|String (including passing on what JSON.parse may throw) if a parsing error occurs. * * @returns Mixed parsed JSON object. Will only return if parsing is successful (otherwise, will throw). If analyse is true, then will rather return an object with properties (mixed)parsed, (integer)json_start_pos and (integer)json_end_pos */ function central_parse_json(json_mix_str, analyse) { analyse = ('undefined' === typeof analyse) ? false : true; // Just try it - i.e. the 'default' case where things work (which can include extra whitespace/line-feeds, and simple strings, etc.). if (!analyse) { try { var result = JSON.parse(json_mix_str); return result; } catch (e) { console.log(uclion.plugin_name+': Exception when trying to parse JSON (1) - will attempt to fix/re-parse based upon first/last curly brackets'); console.log(json_mix_str); } } var json_start_pos = json_mix_str.indexOf('{'); var json_last_pos = json_mix_str.lastIndexOf('}'); // Case where some php notice may be added after or before json string if (json_start_pos > -1 && json_last_pos > -1) { var json_str = json_mix_str.slice(json_start_pos, json_last_pos + 1); try { var parsed = JSON.parse(json_str); if (!analyse) { console.log(uclion.plugin_name+': JSON re-parse successful'); } return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: json_last_pos + 1 } : parsed; } catch (e) { console.log(uclion.plugin_name+': Exception when trying to parse JSON (2) - will attempt to fix/re-parse based upon bracket counting'); var cursor = json_start_pos; var open_count = 0; var last_character = ''; var inside_string = false; // Don't mistake this for a real JSON parser. Its aim is to improve the odds in real-world cases seen, not to arrive at universal perfection. while ((open_count > 0 || cursor == json_start_pos) && cursor <= json_last_pos) { var current_character = json_mix_str.charAt(cursor); if (!inside_string && '{' == current_character) { open_count++; } else if (!inside_string && '}' == current_character) { open_count--; } else if ('"' == current_character && '\\' != last_character) { inside_string = inside_string ? false : true; } last_character = current_character; cursor++; } console.log("Started at cursor="+json_start_pos+", ended at cursor="+cursor+" with result following:"); console.log(json_mix_str.substring(json_start_pos, cursor)); try { var parsed = JSON.parse(json_mix_str.substring(json_start_pos, cursor)); console.log(uclion.plugin_name+': JSON re-parse successful'); return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: cursor } : parsed; } catch (e) { // Throw it again, so that our function works just like JSON.parse() in its behaviour. throw e; } } } throw uclion.plugin_name+": could not parse the JSON"; } jQuery(function($) { $('#updraftcentral_keys').on('click', 'a.updraftcentral_keys_show', function(e) { e.preventDefault(); $(this).remove(); $('#updraftcentral_keys_table').slideDown(); }); $('#updraftcentral_keycreate_altmethod_moreinfo_get').on('click', function(e) { e.preventDefault(); $(this).remove(); $('#updraftcentral_keycreate_altmethod_moreinfo').slideDown(); }); function updraftcentral_keys_setupform(on_page_load) { var is_other = jQuery('#updraftcentral_mothership_other').is(':checked') ? true : false; if (is_other) { jQuery('#updraftcentral_keycreate_mothership').prop('disabled', false); if (on_page_load) { jQuery('#updraftcentral_keycreate_mothership_firewalled_container').show(); } else { jQuery('.updraftcentral_wizard_self_hosted_stage2').show(); jQuery('#updraftcentral_keycreate_mothership_firewalled_container').slideDown(); jQuery('#updraftcentral_keycreate_mothership').trigger('focus'); } } else { jQuery('#updraftcentral_keycreate_mothership').prop('disabled', true); if (!on_page_load) { jQuery('.updraftcentral_wizard_self_hosted_stage2').hide(); updraftcentral_stage2_go(); } } } function updraftcentral_stage2_go() { // Reset the error message before we continue jQuery('#updraftcentral_wizard_stage1_error').text(''); var host = ''; if (jQuery('#updraftcentral_mothership_updraftpluscom').is(':checked')) { jQuery('.updraftcentral_keycreate_description').hide(); host = 'updraftplus.com'; } else if (jQuery('#updraftcentral_mothership_other').is(':checked')) { jQuery('.updraftcentral_keycreate_description').show(); var mothership = jQuery('#updraftcentral_keycreate_mothership').val(); if ('' == mothership) { jQuery('#updraftcentral_wizard_stage1_error').text(uclion.updraftcentral_wizard_empty_url); return; } try { var url = new URL(mothership); host = url.hostname; } catch (e) { // Try and grab the host name a different way if it failed because of no URL object (e.g. Firefox version 25 and below). if ('undefined' === typeof URL) { host = jQuery('').prop('href', mothership).prop('hostname'); } if (!host || 'undefined' !== typeof URL) { jQuery('#updraftcentral_wizard_stage1_error').text(uclion.updraftcentral_wizard_invalid_url); return; } } } jQuery('#updraftcentral_keycreate_description').val(host); jQuery('.updraftcentral_wizard_stage1').hide(); jQuery('.updraftcentral_wizard_stage2').show(); } jQuery('#updraftcentral_keys').on('click', 'input[type="radio"]', function() { updraftcentral_keys_setupform(false); }); // Initial setup (for browsers, e.g. Firefox, that remember form selection state but not DOM state, which can leave an inconsistent state) updraftcentral_keys_setupform(true); jQuery('#updraftcentral_keys').on('click', '#updraftcentral_view_log', function(e) { e.preventDefault(); jQuery('#updraftcentral_view_log_container').block({ message: '

'+uclion.fetching+'
'}); try { updraftcentral_send_command('get_log', null, function(response) { jQuery('#updraftcentral_view_log_container').unblock(); if (response.hasOwnProperty('log_contents')) { jQuery('#updraftcentral_view_log_contents').html('
'+response.log_contents+'
'); } else { console.log(response); } }, { error_callback: function(response, status, error_code, resp) { jQuery('#updraftcentral_view_log_container').unblock(); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraftcentral_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); } catch (err) { jQuery('#updraft_central_key').html(); console.log(err); } }); // UpdraftCentral jQuery('#updraftcentral_keys').on('click', '#updraftcentral_wizard_go', function(e) { jQuery('#updraftcentral_wizard_go').hide(); jQuery('.updraftcentral_wizard_success').remove(); jQuery('.create_key_container').show(); }); jQuery('#updraftcentral_keys').on('click', '#updraftcentral_stage1_go', function(e) { e.preventDefault(); jQuery('.updraftcentral_wizard_stage2').hide(); jQuery('.updraftcentral_wizard_stage1').show(); }); jQuery('#updraftcentral_keys').on('click', '#updraftcentral_stage2_go', function(e) { e.preventDefault(); updraftcentral_stage2_go(); }); jQuery('#updraftcentral_keys').on('click', '#updraftcentral_keycreate_go', function(e) { e.preventDefault(); var is_other = jQuery('#updraftcentral_mothership_other').is(':checked') ? true : false; var key_description = jQuery('#updraftcentral_keycreate_description').val(); var key_size = jQuery('#updraftcentral_keycreate_keysize').val(); var where_send = '__updraftpluscom'; data = { key_description: key_description, key_size: key_size, }; if (is_other) { where_send = jQuery('#updraftcentral_keycreate_mothership').val(); if (where_send.substring(0, 4) != 'http') { alert(uclion.enter_mothership_url); return; } } data.mothership_firewalled = jQuery('#updraftcentral_keycreate_mothership_firewalled').is(':checked') ? 1 : 0; data.where_send = where_send; jQuery('.create_key_container').hide(); jQuery('.updraftcentral_wizard_stage1').show(); jQuery('.updraftcentral_wizard_stage2').hide(); jQuery('#updraftcentral_keys').block({ message: '

'+uclion.creating_please_allow+'
'}); try { updraftcentral_send_command('create_key', data, function(resp) { jQuery('#updraftcentral_keys').unblock(); try { if (resp.hasOwnProperty('error')) { alert(resp.error); console.log(resp); return; } alert(resp.r); if (resp.hasOwnProperty('bundle') && resp.hasOwnProperty('keys_guide')) { jQuery('#updraftcentral_keys_content').html(resp.keys_guide); jQuery('#updraftcentral_keys_content').append('
'+resp.r+'
'); } else { console.log(resp); } if (resp.hasOwnProperty('keys_table')) { jQuery('#updraftcentral_keys_content').append(resp.keys_table); } jQuery('#updraftcentral_wizard_go').show(); } catch (err) { alert(uclion.unexpectedresponse+' '+response); console.log(err); } }, { error_callback: function(response, status, error_code, resp) { jQuery('#updraftcentral_keys').unblock(); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraftcentral_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); } catch (err) { jQuery('#updraft_central_key').html(); console.log(err); } }); jQuery('#updraftcentral_keys').on('click', '.updraftcentral_key_delete', function(e) { e.preventDefault(); var key_id = jQuery(this).data('key_id'); if ('undefined' == typeof key_id) { console.log("UpdraftPlus: .updraftcentral_key_delete clicked, but no key ID found"); return; } jQuery('#updraftcentral_keys').block({ message: '

'+uclion.deleting+'
'}); updraftcentral_send_command('delete_key', { key_id: key_id }, function(response) { jQuery('#updraftcentral_keys').unblock(); if (response.hasOwnProperty('keys_table')) { jQuery('#updraftcentral_keys_content').html(response.keys_table); } }, { error_callback: function(response, status, error_code, resp) { jQuery('#updraftcentral_keys').unblock(); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraftcentral_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); }); });PKwL\R6Զ"",updraftplus/central/js/central-2-23-7.min.jsnu[function updraftcentral_send_command(e,r,a,o){for(var t in default_options={json_parse:!0,alert_on_error:!0,action:"updraft_central_ajax",nonce_key:"nonce",timeout:null,async:!0,type:"POST"},void 0!==uclion.updraftcentral_request_nonce&&uclion.updraftcentral_request_nonce&&(default_options.nonce=uclion.updraftcentral_request_nonce),void 0===o&&(o={}),default_options)o.hasOwnProperty(t)||(o[t]=default_options[t]);e={action:o.action,subaction:e},e[o.nonce_key]=o.nonce,e.action_data=r,r={type:o.type,url:ajaxurl,data:e,success:function(r,e){if(o.json_parse){try{var t=central_parse_json(r)}catch(e){return"function"==typeof o.error_callback?o.error_callback(r,e,502,t):(console.log(e),console.log(r),void(o.alert_on_error&&alert(uclion.unexpectedresponse+" "+r)))}if(t.hasOwnProperty("fatal_error"))return"function"==typeof o.error_callback?o.error_callback(r,e,500,t):(console.error(t.fatal_error_message),o.alert_on_error&&alert(t.fatal_error_message),!1);"function"==typeof a&&a(t,e,r)}else"function"==typeof a&&a(r,e)},error:function(e,r,t){"function"==typeof o.error_callback?o.error_callback(e,r,t):(console.log("updraftcentral_send_command: error: "+r+" ("+t+")"),console.log(e))},dataType:"text",async:o.async};null!=o.timeout&&(r.timeout=o.timeout),jQuery.ajax(r)}function central_parse_json(r,t){if(!(t=void 0!==t))try{return JSON.parse(r)}catch(e){console.log(uclion.plugin_name+": Exception when trying to parse JSON (1) - will attempt to fix/re-parse based upon first/last curly brackets"),console.log(r)}var a=r.indexOf("{"),o=r.lastIndexOf("}");if(-1").prop("href",t).prop("hostname"):r)||"undefined"!=typeof URL)return void jQuery("#updraftcentral_wizard_stage1_error").text(uclion.updraftcentral_wizard_invalid_url)}}jQuery("#updraftcentral_keycreate_description").val(r),jQuery(".updraftcentral_wizard_stage1").hide(),jQuery(".updraftcentral_wizard_stage2").show()}r("#updraftcentral_keys").on("click","a.updraftcentral_keys_show",function(e){e.preventDefault(),r(this).remove(),r("#updraftcentral_keys_table").slideDown()}),r("#updraftcentral_keycreate_altmethod_moreinfo_get").on("click",function(e){e.preventDefault(),r(this).remove(),r("#updraftcentral_keycreate_altmethod_moreinfo").slideDown()}),jQuery("#updraftcentral_keys").on("click",'input[type="radio"]',function(){e(!1)}),e(!0),jQuery("#updraftcentral_keys").on("click","#updraftcentral_view_log",function(e){e.preventDefault(),jQuery("#updraftcentral_view_log_container").block({message:'

'+uclion.fetching+"
"});try{updraftcentral_send_command("get_log",null,function(e){jQuery("#updraftcentral_view_log_container").unblock(),e.hasOwnProperty("log_contents")?jQuery("#updraftcentral_view_log_contents").html('
'+e.log_contents+"
"):console.log(e)},{error_callback:function(e,r,t,a){jQuery("#updraftcentral_view_log_container").unblock(),void 0!==a&&a.hasOwnProperty("fatal_error")?(console.error(a.fatal_error_message),alert(a.fatal_error_message)):(a="updraftcentral_send_command: error: "+r+" ("+t+")",console.log(a),alert(a),console.log(e))}})}catch(e){jQuery("#updraft_central_key").html(),console.log(e)}}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_wizard_go",function(e){jQuery("#updraftcentral_wizard_go").hide(),jQuery(".updraftcentral_wizard_success").remove(),jQuery(".create_key_container").show()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_stage1_go",function(e){e.preventDefault(),jQuery(".updraftcentral_wizard_stage2").hide(),jQuery(".updraftcentral_wizard_stage1").show()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_stage2_go",function(e){e.preventDefault(),t()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_keycreate_go",function(e){e.preventDefault();var e=!!jQuery("#updraftcentral_mothership_other").is(":checked"),r=jQuery("#updraftcentral_keycreate_description").val(),t=jQuery("#updraftcentral_keycreate_keysize").val(),a="__updraftpluscom";if(data={key_description:r,key_size:t},e&&"http"!=(a=jQuery("#updraftcentral_keycreate_mothership").val()).substring(0,4))alert(uclion.enter_mothership_url);else{data.mothership_firewalled=jQuery("#updraftcentral_keycreate_mothership_firewalled").is(":checked")?1:0,data.where_send=a,jQuery(".create_key_container").hide(),jQuery(".updraftcentral_wizard_stage1").show(),jQuery(".updraftcentral_wizard_stage2").hide(),jQuery("#updraftcentral_keys").block({message:'

'+uclion.creating_please_allow+"
"});try{updraftcentral_send_command("create_key",data,function(e){jQuery("#updraftcentral_keys").unblock();try{e.hasOwnProperty("error")?(alert(e.error),console.log(e)):(alert(e.r),e.hasOwnProperty("bundle")&&e.hasOwnProperty("keys_guide")?(jQuery("#updraftcentral_keys_content").html(e.keys_guide),jQuery("#updraftcentral_keys_content").append('
'+e.r+'
")):console.log(e),e.hasOwnProperty("keys_table")&&jQuery("#updraftcentral_keys_content").append(e.keys_table),jQuery("#updraftcentral_wizard_go").show())}catch(e){alert(uclion.unexpectedresponse+" "+response),console.log(e)}},{error_callback:function(e,r,t,a){jQuery("#updraftcentral_keys").unblock(),void 0!==a&&a.hasOwnProperty("fatal_error")?(console.error(a.fatal_error_message),alert(a.fatal_error_message)):(a="updraftcentral_send_command: error: "+r+" ("+t+")",console.log(a),alert(a),console.log(e))}})}catch(e){jQuery("#updraft_central_key").html(),console.log(e)}}}),jQuery("#updraftcentral_keys").on("click",".updraftcentral_key_delete",function(e){e.preventDefault();e=jQuery(this).data("key_id");void 0===e?console.log("UpdraftPlus: .updraftcentral_key_delete clicked, but no key ID found"):(jQuery("#updraftcentral_keys").block({message:'

'+uclion.deleting+"
"}),updraftcentral_send_command("delete_key",{key_id:e},function(e){jQuery("#updraftcentral_keys").unblock(),e.hasOwnProperty("keys_table")&&jQuery("#updraftcentral_keys_content").html(e.keys_table)},{error_callback:function(e,r,t,a){jQuery("#updraftcentral_keys").unblock(),void 0!==a&&a.hasOwnProperty("fatal_error")?(console.error(a.fatal_error_message),alert(a.fatal_error_message)):(a="updraftcentral_send_command: error: "+r+" ("+t+")",console.log(a),alert(a),console.log(e))}}))})});PKwL\pJJ%updraftplus/central/modules/users.phpnu[ID === $b->ID) { return 0; } return ($a->ID < $b->ID) ? -1 : 1; } /** * Searches users based from the keyword submitted * * @internal * @param array $query Parameter array containing the filter and keyword fields * @return array Contains the list of users found as well as the total users count */ private function _search_users($query) { $this->_admin_include('user.php'); $query1 = new WP_User_Query(array( 'orderby' => 'ID', 'order' => 'ASC', 'role'=> $query["role"], 'search' => '*' . esc_attr($query["search"]) . '*', 'search_columns' => array('user_login', 'user_email') )); $query2 = new WP_User_Query(array( 'orderby' => 'ID', 'order' => 'ASC', 'role'=> $query["role"], 'meta_query'=>array( 'relation' => 'OR', array( 'key' => 'first_name', 'value' => $query["search"], 'compare' => 'LIKE' ), array( 'key' => 'last_name', 'value' => $query["search"], 'compare' => 'LIKE' ), ) )); if (empty($query1->results) && empty($query2->results)) { return array("message" => "users_not_found"); } else { $found_users = array_merge($query1->results, $query2->results); $temp = array(); foreach ($found_users as $new_user) { if (!isset($temp[$new_user->ID])) { $temp[$new_user->ID] = $new_user; } }; $users = array_values($temp); // Sort users: usort($users, array($this, 'compare_user_id')); $offset = ((int) $query['page_no'] * (int) $query['per_page']) - (int) $query['per_page']; $user_list = array_slice($users, $offset, $query['per_page']); return array( 'users' => $user_list, 'total_users' => count($users) ); } } /** * Calculates the number of pages needed to construct the pagination links * * @internal * @param array $query * @param array $total_users The total number of users found from the WP_User_Query query * @return array Contains information needed to construct the pagination links */ private function _calculate_pages($query, $total_users) { $per_page_options = array(10, 20, 30, 40, 50); if (!empty($query)) { $pages = array(); $page_count = ceil($total_users / $query["per_page"]); if ($page_count > 1) { for ($i = 0; $i < $page_count; $i++) { if ($i + 1 == $query['page_no']) { $paginator_item = array( "value"=>$i+1, "setting"=>"disabled" ); } else { $paginator_item = array( "value"=>$i+1 ); } array_push($pages, $paginator_item); }; if ($query['page_no'] >= $page_count) { $page_next = array( "value"=>$page_count, "setting"=>"disabled" ); } else { $page_next = array( "value"=>$query['page_no'] + 1 ); }; if (1 === $query['page_no']) { $page_prev = array( "value"=>1, "setting"=>"disabled" ); } else { $page_prev = array( "value"=>$query['page_no'] - 1 ); }; return array( "page_no" => $query['page_no'], "per_page" => $query["per_page"], "page_count" => $page_count, "pages" => $pages, "page_next" => $page_next, "page_prev" => $page_prev, "total_results" => $total_users, "per_page_options" => $per_page_options ); } else { return array( "page_no" => $query['page_no'], "per_page" => $query["per_page"], "page_count" => $page_count, "total_results" => $total_users, "per_page_options" => $per_page_options ); } } else { return array( "per_page_options" => $per_page_options ); } } /** * Validates whether the username exists * * @param array $params Contains the user name to check and validate * @return array An array containing the result of the current process */ public function check_username($params) { $this->_admin_include('user.php'); $username = $params['user_name']; $blog_id = get_current_blog_id(); if (!empty($params['site_id'])) { $blog_id = $params['site_id']; } // Here, we're switching to the actual blog that we need // to pull users from. $switched = function_exists('switch_to_blog') ? switch_to_blog($blog_id) : false; if (username_exists($username) && is_user_member_of_blog(username_exists($username), $blog_id)) { $result = array("valid" => false, "message" => 'username_exists'); return $this->_response($result); } if (!validate_username($username)) { $result = array("valid" => false, "message" => 'username_invalid'); return $this->_response($result); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } $result = array("valid" => true, "message" => 'username_valid'); return $this->_response($result); } /** * Pulls blog sites available * for the current WP instance. * If the site is a multisite, then sites under the network * will be pulled, otherwise, it will return an empty array. * * @return Array - an array of sites */ private function _get_blog_sites() { if (!is_multisite()) return array(); // Initialize array container $sites = $network_sites = array(); // Check to see if latest get_sites (available on WP version >= 4.6) function is // available to pull any available sites from the current WP instance. If not, then // we're going to use the fallback function wp_get_sites (for older version). if (function_exists('get_sites') && class_exists('WP_Site_Query')) { $network_sites = get_sites(); } else { if (function_exists('wp_get_sites')) { $network_sites = wp_get_sites(); } } // We only process if sites array is not empty, otherwise, bypass // the next block. if (!empty($network_sites)) { foreach ($network_sites as $site) { // Here we're checking if the site type is an array, because // we're pulling the blog_id property based on the type of // site returned. // get_sites returns an array of object, whereas the wp_get_sites // function returns an array of array. $blog_id = is_array($site) ? $site['blog_id'] : $site->blog_id; // We're saving the blog_id and blog name as an associative item // into the sites array, that will be used as "Sites" option in // the frontend. $sites[$blog_id] = get_blog_details($blog_id)->blogname; } } return $sites; } /** * Validates whether the email exists * * @param array $params Contains the email to check and validate * @return array An array containing the result of the current process */ public function check_email($params) { $this->_admin_include('user.php'); $email = $params['email']; $blog_id = get_current_blog_id(); if (isset($params['site_id']) && 0 !== $params['site_id']) { $blog_id = $params['site_id']; } // Here, we're switching to the actual blog that we need // to pull users from. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } if (is_email($email) === false) { $result = array("valid" => false, "message" => 'email_invalid'); return $this->_response($result); } if (email_exists($email) && is_user_member_of_blog(email_exists($email), $blog_id)) { $result = array("valid" => false, "message" => 'email_exists'); return $this->_response($result); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } $result = array("valid" => true, "message" => 'email_valid'); return $this->_response($result); } /** * The get_users function pull all the users from the database * based on the current search parameters/filters. Please see _search_users * for the breakdown of these parameters. * * @param array $query Parameter array containing the filter and keyword fields * @return array An array containing the result of the current process */ public function get_users($query) { $this->_admin_include('user.php'); // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($query['site_id']) && 0 !== $query['site_id']) $blog_id = $query['site_id']; // Here, we're switching to the actual blog that we need // to pull users from. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } // Set default: if (empty($query["per_page"])) { $query["per_page"] = 10; } if (empty($query['page_no'])) { $query['page_no'] = 1; } if (empty($query["role"])) { $query["role"] = ""; } $users = array(); $total_users = 0; if (!empty($query["search"])) { $search_results = $this->_search_users($query); if (isset($search_results['users'])) { $users = $search_results['users']; $total_users = $search_results['total_users']; } } else { $user_query = new WP_User_Query(array( 'orderby' => 'ID', 'order' => 'ASC', 'number' => $query["per_page"], 'paged'=> $query['page_no'], 'role'=> $query["role"] )); if (empty($user_query->results)) { $result = array("message" => 'users_not_found'); return $this->_response($result); } $users = $user_query->results; $total_users = $user_query->get_total(); } foreach ($users as &$user) { $user_object = get_userdata($user->ID); if (method_exists($user_object, 'to_array')) { $user = $user_object->to_array(); $user["roles"] = $user_object->roles; $user["first_name"] = $user_object->first_name; $user["last_name"] = $user_object->last_name; $user["description"] = $user_object->description; } else { $user = $user_object; } } $result = array( "users"=>$users, "paging" => $this->_calculate_pages($query, $total_users) ); // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } /** * Creates new user for the current blog * * @param array $user User information to add * @return array An array containing the result of the current process */ public function add_user($user) { $this->_admin_include('user.php'); // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($user['site_id']) && 0 !== $user['site_id']) $blog_id = $user['site_id']; // Here, we're switching to the actual blog that we need // to pull users from. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } if (!current_user_can('create_users') && !is_super_admin()) { $result = array('error' => true, 'message' => 'user_create_no_permission', 'data' => array('multisite' => is_multisite())); return $this->_response($result); } if (is_email($user["user_email"]) === false) { $result = array("error" => true, "message" => "email_invalid"); return $this->_response($result); } if (email_exists($user["user_email"]) && is_user_member_of_blog(email_exists($user["user_email"]), $blog_id)) { $result = array("error" => true, "message" => "email_exists"); return $this->_response($result); } if (username_exists($user["user_login"]) && is_user_member_of_blog(username_exists($user["user_login"]), $blog_id)) { $result = array("error" => true, "message" => "username_exists"); return $this->_response($result); } if (!validate_username($user["user_login"])) { $result = array("error" => true, "message" => 'username_invalid'); return $this->_response($result); } if (isset($user['site_id']) && !current_user_can('manage_network_users')) { $result = array("error" => true, "message" => 'user_create_no_permission'); return $this->_response($result); } if (email_exists($user["user_email"]) && !is_user_member_of_blog(email_exists($user["user_email"]), $blog_id)) { $user_id = email_exists($user["user_email"]); } else { $user_id = wp_insert_user($user); } $role = $user['role']; if (is_multisite()) { add_existing_user_to_blog(array('user_id' => $user_id, 'role' => $role)); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } if ($user_id > 0) { $result = array("error" => false, "message" => "user_created_with_user_name", "values" => array($user['user_login'])); return $this->_response($result); } else { $result = array("error" => true, "message" => "user_create_failed", "values" => array($user)); } return $this->_response($result); } /** * [delete_user - UCP: users.delete_user] * * This function is used to check to make sure the user_id is valid and that it has has user delete permissions. * If there are no issues, the user is deleted. * * current_user_can: This check the user permissions from UCP * get_userdata: This get the user data on the data from user_id in the $user_id array * wp_delete_user: Deleting users on the User ID (user_id) and, IF Specified, the Assigner ID (assign_user_id). * * @param [type] $params [description] THis is an Array of params sent over from UpdraftCentral * @return [type] Array [description] This will send back an error array along with message if there are any issues with the user_id */ public function delete_user($params) { $this->_admin_include('user.php'); $user_id = $params['user_id']; $assign_user_id = $params["assign_user_id"]; // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($params['site_id']) && 0 !== $params['site_id']) $blog_id = $params['site_id']; $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } if (!current_user_can('delete_users') && !is_super_admin()) { $result = array('error' => true, 'message' => 'user_delete_no_permission', 'data' => array('multisite' => is_multisite())); return $this->_response($result); } if (get_userdata($user_id) === false) { $result = array("error" => true, "message" => "user_not_found"); return $this->_response($result); } if (wp_delete_user($user_id, $assign_user_id)) { $result = array("error" => false, "message" => "user_deleted"); } else { $result = array("error" => true, "message" => "user_delete_failed"); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } /** * Edits existing user information * * @param array $user User information to save * @return array An array containing the result of the current process */ public function edit_user($user) { $this->_admin_include('user.php'); // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($user['site_id']) && 0 !== $user['site_id']) $blog_id = $user['site_id']; // Here, we're switching to the actual blog that we need // to apply our changes. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } if (!current_user_can('edit_users') && !is_super_admin() && get_current_user_id() !== $user["ID"]) { $result = array('error' => true, 'message' => 'user_edit_no_permission', 'data' => array('multisite' => is_multisite())); return $this->_response($result); } if (false === get_userdata($user["ID"])) { $result = array("error" => true, "message" => "user_not_found"); return $this->_response($result); } if (get_current_user_id() == $user["ID"]) { unset($user["role"]); } /* Validate Username*/ if (!validate_username($user["user_login"])) { $result = array("error" => true, "message" => 'username_invalid'); return $this->_response($result); } /* Validate Email if not the same*/ $remote_user = get_userdata($user["ID"]); $old_email = $remote_user->user_email; if ($user['user_email'] !== $old_email) { if (is_email($user['user_email']) === false) { $result = array("error" => true, "message" => 'email_invalid'); return $this->_response($result); } if (email_exists($user['user_email'])) { $result = array("error" => true, "message" => 'email_exists'); return $this->_response($result); } } $user_id = wp_update_user($user); if (is_wp_error($user_id)) { $result = array("error" => true, "message" => "user_edit_failed_with_error", "values" => array($user_id)); } else { $result = array("error" => false, "message" => "user_edited_with_user_name", "values" => array($user["user_login"])); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } /** * Retrieves available roles to be used as filter options * * @return array An array containing all available roles */ public function get_roles() { $this->_admin_include('user.php'); $roles = array_reverse(get_editable_roles()); return $this->_response($roles); } /** * Retrieves information to be use as filters * * @return array An array containing the filter fields and their data */ public function get_user_filters() { $this->_admin_include('user.php'); // Pull sites options if available. $sites = $this->_get_blog_sites(); $result = array( "sites" => $sites, "roles" => array_reverse(get_editable_roles()), "paging" => $this->_calculate_pages(null, 0), ); return $this->_response($result); } } PKwL\ a)_)_%updraftplus/central/modules/theme.phpnu[switched = switch_to_blog($blog_id); } } /** * Function that gets called after every action * * @param string $command a string that corresponds to UDC command to call a certain method for this class. * @param array $data an array of data post or get fields * @param array $extra_info extrainfo use in the udrpc_action, e.g. user_id * * link to udrpc_action main function in class UpdraftCentral_Listener */ public function _post_action($command, $data, $extra_info) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameter is present because the caller from UpdraftCentral_Listener class uses 3 arguments. // Here, we're restoring to the current (default) blog before we switched if ($this->switched) restore_current_blog(); } /** * Constructor */ public function __construct() { $this->_admin_include('theme.php', 'file.php', 'template.php', 'class-wp-upgrader.php', 'theme-install.php', 'update.php'); } /** * Installs and activates a theme through upload * * @param array $params Parameter array containing information pertaining the currently uploaded theme * @return array Contains the result of the current process */ public function upload_theme($params) { return $this->process_chunk_upload($params, 'theme'); } /** * Checks whether the theme is currently installed and activated. * * @param array $query Parameter array containing the name of the theme to check * @return array Contains the result of the current process */ public function is_theme_installed($query) { if (!isset($query['theme'])) return $this->_generic_error_response('theme_name_required'); $result = $this->_get_theme_info($query['theme']); return $this->_response($result); } /** * Applies currently requested action for theme processing * * @param string $action The action to apply (e.g. activate or install) * @param array $query Parameter array containing information for the currently requested action * * @return array */ private function _apply_theme_action($action, $query) { $result = array(); switch ($action) { case 'activate': $info = $this->_get_theme_info($query['theme']); if ($info['installed']) { switch_theme($info['slug']); if (wp_get_theme()->get_stylesheet() === $info['slug']) { $result = array('activated' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info); } else { $result = $this->_generic_error_response('theme_not_activated', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_activated', 'error_message' => __('There appears to be a problem activating or switching to the intended theme. Please kindly check your permission and try again.', 'updraftplus'), 'info' => $this->_get_theme_info($query['theme']) )); } } else { $result = $this->_generic_error_response('theme_not_installed', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_installed', 'error_message' => __('The theme you wish to activate is either not installed or has been removed recently.', 'updraftplus'), 'info' => $info )); } break; case 'network_enable': $info = $this->_get_theme_info($query['theme']); if ($info['installed']) { if (current_user_can('manage_network_themes')) { // Make sure that network_enable_theme is present and callable since // it is only available at 4.6. If not, we'll do things the old fashion way if (is_callable(array('WP_Theme', 'network_enable_theme'))) { WP_Theme::network_enable_theme($info['slug']); } else { $allowed_themes = get_site_option('allowedthemes'); $allowed_themes[$info['slug']] = true; update_site_option('allowedthemes', $allowed_themes); } } $allowed = WP_Theme::get_allowed_on_network(); if (is_array($allowed) && !empty($allowed[$info['slug']])) { $result = array('enabled' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info); } else { $result = $this->_generic_error_response('theme_not_enabled', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_enabled', 'error_message' => __('There appears to be a problem enabling the intended theme on your network. Please kindly check your permission and try again.', 'updraftplus'), 'info' => $this->_get_theme_info($query['theme']) )); } } else { $result = $this->_generic_error_response('theme_not_installed', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_installed', 'error_message' => __('The theme you wish to enable on your network is either not installed or has been removed recently.', 'updraftplus'), 'info' => $info )); } break; case 'network_disable': $info = $this->_get_theme_info($query['theme']); if ($info['installed']) { if (current_user_can('manage_network_themes')) { // Make sure that network_disable_theme is present and callable since // it is only available at 4.6. If not, we'll do things the old fashion way if (is_callable(array('WP_Theme', 'network_disable_theme'))) { WP_Theme::network_disable_theme($info['slug']); } else { $allowed_themes = get_site_option('allowedthemes'); if (isset($allowed_themes[$info['slug']])) { unset($allowed_themes[$info['slug']]); } update_site_option('allowedthemes', $allowed_themes); } } $allowed = WP_Theme::get_allowed_on_network(); if (is_array($allowed) && empty($allowed[$info['slug']])) { $result = array('disabled' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info); } else { $result = $this->_generic_error_response('theme_not_disabled', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_disabled', 'error_message' => __('There appears to be a problem disabling the intended theme from your network. Please kindly check your permission and try again.', 'updraftplus'), 'info' => $this->_get_theme_info($query['theme']) )); } } else { $result = $this->_generic_error_response('theme_not_installed', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_installed', 'error_message' => __('The theme you wish to disable from your network is either not installed or has been removed recently.', 'updraftplus'), 'info' => $info )); } break; case 'install': $api = themes_api('theme_information', array( 'slug' => $query['slug'], 'fields' => array( 'description' => true, 'sections' => false, 'rating' => true, 'ratings' => true, 'downloaded' => true, 'downloadlink' => true, 'last_updated' => true, 'screenshot_url' => true, 'parent' => true, ) )); $info = $this->_get_theme_info($query['theme']); if (is_wp_error($api)) { $result = $this->_generic_error_response('generic_response_error', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_installed', 'error_message' => $api->get_error_message(), 'info' => $info )); } else { $installed = $info['installed']; $error_code = $error_message = ''; if (!$installed) { // WP < 3.7 if (!class_exists('Automatic_Upgrader_Skin')) include_once(dirname(dirname(__FILE__)).'/classes/class-automatic-upgrader-skin.php'); $skin = new Automatic_Upgrader_Skin(); $upgrader = new Theme_Upgrader($skin); $download_link = $api->download_link; $installed = $upgrader->install($download_link); if (is_wp_error($installed)) { $error_code = $installed->get_error_code(); $error_message = $installed->get_error_message(); } elseif (is_wp_error($skin->result)) { $error_code = $skin->result->get_error_code(); $error_message = $skin->result->get_error_message(); $error_data = $skin->result->get_error_data($error_code); if (!empty($error_data)) { if (is_array($error_data)) $error_data = json_encode($error_data); $error_message .= ' '.$error_data; } } elseif (is_null($installed) || !$installed) { global $wp_filesystem; $upgrade_messages = $skin->get_upgrade_messages(); if (!class_exists('WP_Filesystem_Base')) include_once(ABSPATH.'/wp-admin/includes/class-wp-filesystem-base.php'); // Pass through the error from WP_Filesystem if one was raised. if ($wp_filesystem instanceof WP_Filesystem_Base && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { $error_code = $wp_filesystem->errors->get_error_code(); $error_message = $wp_filesystem->errors->get_error_message(); } elseif (!empty($upgrade_messages)) { // We're only after for the last feedback that we received from the install process. Mostly, // that is where the last error has been inserted. $messages = $skin->get_upgrade_messages(); $error_code = 'install_failed'; $error_message = end($messages); } else { $error_code = 'unable_to_connect_to_filesystem'; $error_message = __('Unable to connect to the filesystem. Please confirm your credentials.'); } } } if (!$installed || is_wp_error($installed)) { $result = $this->_generic_error_response('theme_install_failed', array( 'theme' => $query['theme'], 'error_code' => $error_code, 'error_message' => $error_message, 'info' => $this->_get_theme_info($query['theme']) )); } else { $result = array('installed' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info); } } break; } return $result; } /** * Preloads the submitted credentials to the global $_POST variable * * @param array $query Parameter array containing information for the currently requested action */ private function _preload_credentials($query) { if (!empty($query) && isset($query['filesystem_credentials'])) { parse_str($query['filesystem_credentials'], $filesystem_credentials); if (is_array($filesystem_credentials)) { foreach ($filesystem_credentials as $key => $value) { // Put them into $_POST, which is where request_filesystem_credentials() checks for them. $_POST[$key] = $value; } } } } /** * Checks whether we have the required fields submitted and the user has * the capabilities to execute the requested action * * @param array $query The submitted information * @param array $fields The required fields to check * @param array $capabilities The capabilities to check and validate * * @return array|string */ private function _validate_fields_and_capabilities($query, $fields, $capabilities) { $error = ''; if (!empty($fields)) { for ($i=0; $i_generic_error_response('keyword_required'); } else { $error = $this->_generic_error_response('theme_'.$query[$field].'_required'); } break; } } } if (empty($error) && !empty($capabilities)) { for ($i=0; $i_generic_error_response('theme_insufficient_permission'); break; } } } return $error; } /** * Processing an action for multiple items * * @param array $query Parameter array containing a list of themes to process * @return array Contains the results of the bulk process */ public function process_action_in_bulk($query) { $action = isset($query['action']) ? $query['action'] : ''; $items = isset($query['args']) ? $query['args']['items'] : array(); $results = array(); if (!empty($action) && !empty($items) && is_array($items)) { foreach ($items as $value) { if (method_exists($this, $action)) { $results[] = $this->$action($value); } } } return $this->_response($results); } /** * Activates the theme * * @param array $query Parameter array containing the name of the theme to activate * @return array Contains the result of the current process */ public function activate_theme($query) { $fields = array('theme'); $permissions = array('switch_themes'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_theme_action('activate', $query); if (empty($result['activated'])) { return $result; } return $this->_response($result); } /** * Enables theme for network * * @param array $query Parameter array containing the name of the theme to activate * @return array Contains the result of the current process */ public function network_enable_theme($query) { $fields = array('theme'); $permissions = array('switch_themes'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_theme_action('network_enable', $query); if (empty($result['enabled'])) { return $result; } return $this->_response($result); } /** * Disables theme from network * * @param array $query Parameter array containing the name of the theme to activate * @return array Contains the result of the current process */ public function network_disable_theme($query) { $fields = array('theme'); $permissions = array('switch_themes'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_theme_action('network_disable', $query); if (empty($result['disabled'])) { return $result; } return $this->_response($result); } /** * Download, install and activates the theme * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug * @return array Contains the result of the current process */ public function install_activate_theme($query) { $fields = array('theme', 'slug'); $permissions = array('install_themes', 'switch_themes'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_theme_action('install', $query); if (!empty($result['installed']) && $result['installed']) { $result = $this->_apply_theme_action('activate', $query); if (empty($result['activated'])) { return $result; } } else { return $result; } return $this->_response($result); } /** * Download, install the theme * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug * @return array Contains the result of the current process */ public function install_theme($query) { $fields = array('theme', 'slug'); $permissions = array('install_themes'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_theme_action('install', $query); if (empty($result['installed'])) { return $result; } return $this->_response($result); } /** * Uninstall/delete the theme * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug * @return array Contains the result of the current process */ public function delete_theme($query) { $fields = array('theme'); $permissions = array('delete_themes'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $info = $this->_get_theme_info($query['theme']); if ($info['installed']) { $deleted = delete_theme($info['slug']); if ($deleted) { $result = array('deleted' => true, 'info' => $this->_get_theme_info($query['theme']), 'last_state' => $info); } else { return $this->_generic_error_response('delete_theme_failed', array( 'theme' => $query['theme'], 'error_code' => 'delete_theme_failed', 'info' => $info )); } } else { return $this->_generic_error_response('theme_not_installed', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_installed', 'info' => $info )); } return $this->_response($result); } /** * Updates/upgrade the theme * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the theme name and slug * @return array Contains the result of the current process */ public function update_theme($query) { $fields = array('theme'); $permissions = array('update_themes'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); // Make sure that we still have the theme installed before running // the update process $info = $this->_get_theme_info($query['theme']); if ($info['installed']) { // Load the updates command class if not existed if (!class_exists('UpdraftCentral_Updates_Commands')) include_once('updates.php'); $update_command = new UpdraftCentral_Updates_Commands($this->rc); $result = $update_command->update_theme($info['slug']); if (!empty($result['error'])) { $result['values'] = array('theme' => $query['theme'], 'info' => $info); } } else { return $this->_generic_error_response('theme_not_installed', array( 'theme' => $query['theme'], 'error_code' => 'theme_not_installed', 'info' => $info )); } return $this->_response($result); } /** * Gets the theme information along with its active and install status * * @internal * @param array $theme The name of the theme to pull the information from * @return array Contains the theme information */ private function _get_theme_info($theme) { $info = array( 'active' => false, 'installed' => false ); // Clear theme cache so that newly installed/downloaded themes // gets reflected when calling "get_themes" if (function_exists('wp_clean_themes_cache')) { wp_clean_themes_cache(); } // Gets all themes available. $themes = wp_get_themes(); $current_theme_slug = basename(get_stylesheet_directory()); // Loops around each theme available. foreach ($themes as $slug => $value) { $name = $value->get('Name'); $theme_name = !empty($name) ? $name : $slug; // If the theme name matches that of the specified name, it will gather details. if ($theme_name === $theme) { $info['installed'] = true; $info['active'] = ($slug === $current_theme_slug) ? true : false; $info['slug'] = $slug; $info['data'] = $value; $info['name'] = $theme_name; break; } } return $info; } /** * Loads all available themes with additional attributes and settings needed by UpdraftCentral * * @param array $query Parameter array Any available parameters needed for this action * @return array Contains the result of the current process */ public function load_themes($query) { $permissions = array('install_themes', 'switch_themes'); $args = array(); if (is_multisite() && !is_super_admin(get_current_user_id())) { $permissions = array('switch_themes'); $args = array('allowed' => true, 'blog_id' => get_current_blog_id()); } $error = $this->_validate_fields_and_capabilities($query, array(), $permissions); if (!empty($error)) { return $error; } $website = get_bloginfo('name'); $results = array(); // Load the updates command class if not existed if (!class_exists('UpdraftCentral_Updates_Commands')) include_once('updates.php'); $updates = new UpdraftCentral_Updates_Commands($this->rc); // Get themes for update $theme_updates = (array) $updates->get_item_updates('themes'); // Get all themes $themes = wp_get_themes($args); $current_theme_slug = basename(get_stylesheet_directory()); foreach ($themes as $slug => $value) { $name = $value->get('Name'); $theme_name = !empty($name) ? $name : $slug; $theme = new stdClass(); $theme->name = $theme_name; $theme->description = $value->get('Description'); $theme->slug = $slug; $theme->version = $value->get('Version'); $theme->author = $value->get('Author'); $theme->status = ($slug === $current_theme_slug) ? 'active' : 'inactive'; $template = $value->get('Template'); $theme->child_theme = !empty($template) ? true : false; $theme->website = $website; $theme->multisite = is_multisite(); $theme->site_url = trailingslashit(get_bloginfo('url')); if ($theme->child_theme) { $parent_theme = wp_get_theme($template); $parent_name = $parent_theme->get('Name'); $theme->parent = !empty($parent_name) ? $parent_name : $parent_theme->get_stylesheet(); } if (!empty($theme_updates[$slug])) { $update_info = $theme_updates[$slug]; if (version_compare($theme->version, $update_info->update['new_version'], '<')) { if (!empty($update_info->update['new_version'])) $theme->latest_version = $update_info->update['new_version']; if (!empty($update_info->update['package'])) $theme->download_link = $update_info->update['package']; } } if (empty($theme->short_description) && !empty($theme->description)) { // Only pull the first sentence as short description, it should be enough rather than displaying // an empty description or a full blown one which the user can access anytime if they press on // the view details link in UpdraftCentral. $temp = explode('.', $theme->description); $short_description = $temp[0]; // Adding the second sentence wouldn't hurt, in case the first sentence is too short. if (isset($temp[1])) $short_description .= '.'.$temp[1]; $theme->short_description = $short_description.'.'; } $results[] = $theme; } $result = array( 'themes' => $results, 'theme_updates' => $theme_updates, 'is_super_admin' => is_super_admin(), ); $result = array_merge($result, $this->_get_backup_credentials_settings(get_theme_root())); return $this->_response($result); } /** * Gets the backup and security credentials settings for this website * * @param array $query Parameter array Any available parameters needed for this action * @return array Contains the result of the current process */ public function get_theme_requirements() { return $this->_response($this->_get_backup_credentials_settings(get_theme_root())); } } PKwL\//xx'updraftplus/central/modules/updates.phpnu[_generic_error_response('invalid_data'); if (!empty($updates['plugins']) && !current_user_can('update_plugins')) return $this->_generic_error_response('updates_permission_denied', 'update_plugins'); if (!empty($updates['themes']) && !current_user_can('update_themes')) return $this->_generic_error_response('updates_permission_denied', 'update_themes'); if (!empty($updates['core']) && !current_user_can('update_core')) return $this->_generic_error_response('updates_permission_denied', 'update_core'); if (!empty($updates['translations']) && !$this->user_can_update_translations()) return $this->_generic_error_response('updates_permission_denied', 'update_translations'); $this->_admin_include('plugin.php', 'update.php', 'file.php', 'template.php'); $this->_frontend_include('update.php'); if (!empty($updates['meta']) && isset($updates['meta']['filesystem_credentials'])) { parse_str($updates['meta']['filesystem_credentials'], $filesystem_credentials); if (is_array($filesystem_credentials)) { foreach ($filesystem_credentials as $key => $value) { // Put them into $_POST, which is where request_filesystem_credentials() checks for them. $_POST[$key] = $value; } } } $plugins = empty($updates['plugins']) ? array() : $updates['plugins']; $plugin_updates = array(); foreach ($plugins as $plugin_info) { $plugin_updates[] = $this->_update_plugin($plugin_info['plugin'], $plugin_info['slug']); } $themes = empty($updates['themes']) ? array() : $updates['themes']; $theme_updates = array(); foreach ($themes as $theme_info) { $theme = $theme_info['theme']; $theme_updates[] = $this->_update_theme($theme); } $cores = empty($updates['core']) ? array() : $updates['core']; $core_updates = array(); foreach ($cores as $core) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- We dont use $core but we need the AS in the foreach so it needs to stay $core_updates[] = $this->_update_core(null); // Only one (and always we go to the latest version) - i.e. we ignore the passed parameters break; } $translation_updates = array(); if (!empty($updates['translations'])) { $translation_updates[] = $this->_update_translation(); } return $this->_response(array( 'plugins' => $plugin_updates, 'themes' => $theme_updates, 'core' => $core_updates, 'translations' => $translation_updates, )); } /** * Updates a plugin. A facade method that exposes a private updates * feature for other modules to consume. * * @param string $plugin Specific plugin to be updated * @param string $slug Unique key passed for updates * * @return array */ public function update_plugin($plugin, $slug) { return $this->_update_plugin($plugin, $slug); } /** * Updates a theme. A facade method that exposes a private updates * feature for other modules to consume. * * @param string $theme Specific theme to be updated * * @return array */ public function update_theme($theme) { return $this->_update_theme($theme); } /** * Gets available updates for a certain entity (e.g. plugin or theme). A facade method that * exposes a private updates feature for other modules to consume. * * @param string $entity The name of the entity that this request is intended for (e.g. themes or plugins) * * @return array */ public function get_item_updates($entity) { $updates = array(); switch ($entity) { case 'themes': wp_update_themes(); $updates = $this->maybe_add_third_party_items(get_theme_updates(), 'theme'); break; case 'plugins': wp_update_plugins(); $updates = $this->maybe_add_third_party_items(get_plugin_updates(), 'plugin'); break; } return $updates; } /** * Mostly from wp_ajax_update_plugin() in wp-admin/includes/ajax-actions.php (WP 4.5.2) * Code-formatting style has been retained from the original, for ease of comparison/updating * * @param string $plugin Specific plugin to be updated * @param string $slug Unique key passed for updates * @return array */ private function _update_plugin($plugin, $slug) { $status = array( 'update' => 'plugin', 'plugin' => $plugin, 'slug' => sanitize_key($slug), 'oldVersion' => '', 'newVersion' => '', ); if (false !== strpos($plugin, '..') || false !== strpos($plugin, ':') || !preg_match('#^[^\/]#i', $plugin)) { $status['error'] = 'not_found'; return $status; } $plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin); if (!isset($plugin_data['Name']) || !isset($plugin_data['Author']) || ('' == $plugin_data['Name'] && '' == $plugin_data['Author'])) { $status['error'] = 'not_found'; return $status; } if ($plugin_data['Version']) { $status['oldVersion'] = $plugin_data['Version']; } if (!current_user_can('update_plugins')) { $status['error'] = 'updates_permission_denied'; return $status; } include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'); wp_update_plugins(); // WP < 3.7 if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php'); $skin = new Automatic_Upgrader_Skin(); $upgrader = new Plugin_Upgrader($skin); $result = $upgrader->bulk_upgrade(array($plugin)); if (is_array($result) && empty($result[$plugin]) && is_wp_error($skin->result)) { $result = $skin->result; } $status['messages'] = $upgrader->skin->get_upgrade_messages(); if (is_array($result) && !empty($result[$plugin])) { $plugin_update_data = current($result); /* * If the `update_plugins` site transient is empty (e.g. when you update * two plugins in quick succession before the transient repopulates), * this may be the return. * * Preferably something can be done to ensure `update_plugins` isn't empty. * For now, surface some sort of error here. */ if (true === $plugin_update_data) { $status['error'] = 'update_failed'; return $status; } if (is_wp_error($result[$plugin])) { $status['error'] = $result[$plugin]->get_error_code(); $status['error_message'] = $result[$plugin]->get_error_message(); return $status; } $plugin_data = get_plugins('/' . $result[$plugin]['destination_name']); $plugin_data = reset($plugin_data); if ($plugin_data['Version']) { $status['newVersion'] = $plugin_data['Version']; } return $status; } elseif (is_wp_error($result)) { $status['error'] = $result->get_error_code(); $status['error_message'] = $result->get_error_message(); return $status; } elseif (is_bool($result) && !$result) { $status['error'] = 'unable_to_connect_to_filesystem'; global $wp_filesystem; // Pass through the error from WP_Filesystem if one was raised if (isset($wp_filesystem->errors) && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { $status['error'] = $wp_filesystem->errors->get_error_code(); $status['error_message'] = $wp_filesystem->errors->get_error_message(); } return $status; } else { // An unhandled error occurred $status['error'] = 'update_failed'; return $status; } } /** * Adapted from _update_theme (above) * * @param string $core * @return array */ private function _update_core($core) { global $wp_filesystem; $status = array( 'update' => 'core', 'core' => $core, 'oldVersion' => '', 'newVersion' => '', ); // THis is included so we can get $wp_version include(ABSPATH.WPINC.'/version.php'); $status['oldVersion'] = $wp_version;// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. if (!current_user_can('update_core')) { $status['error'] = 'updates_permission_denied'; return $status; } include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'); wp_version_check(); $locale = get_locale();// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused variable is for future use. $core_update_key = false; $core_update_latest_version = false; $get_core_updates = get_core_updates(); // THis is included so we can get $wp_version @include(ABSPATH.WPINC.'/version.php');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. foreach ($get_core_updates as $k => $core_update) { if (isset($core_update->version) && version_compare($core_update->version, $wp_version, '>') && version_compare($core_update->version, $core_update_latest_version, '>')) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. $core_update_latest_version = $core_update->version; $core_update_key = $k; } } if (false === $core_update_key) { $status['error'] = 'no_update_found'; return $status; } $update = $get_core_updates[$core_update_key]; // WP < 3.7 if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php'); $skin = new Automatic_Upgrader_Skin(); $upgrader = new Core_Upgrader($skin); $result = $upgrader->upgrade($update); $status['messages'] = $upgrader->skin->get_upgrade_messages(); if (is_wp_error($result)) { $status['error'] = $result->get_error_code(); $status['error_message'] = $result->get_error_message(); return $status; } elseif (is_bool($result) && !$result) { $status['error'] = 'unable_to_connect_to_filesystem'; // Pass through the error from WP_Filesystem if one was raised if (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { $status['error'] = $wp_filesystem->errors->get_error_code(); $status['error_message'] = $wp_filesystem->errors->get_error_message(); } return $status; } elseif (preg_match('/^[0-9]/', $result)) { $status['newVersion'] = $result; return $status; } else { // An unhandled error occurred $status['error'] = 'update_failed'; return $status; } } private function _update_theme($theme) { global $wp_filesystem; $status = array( 'update' => 'theme', 'theme' => $theme, 'oldVersion' => '', 'newVersion' => '', ); if (false !== strpos($theme, '/') || false !== strpos($theme, '\\')) { $status['error'] = 'not_found'; return $status; } $theme_version = $this->get_theme_version($theme); if (false === $theme_version) { $status['error'] = 'not_found'; return $status; } $status['oldVersion'] = $theme_version; if (!current_user_can('update_themes')) { $status['error'] = 'updates_permission_denied'; return $status; } include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'); wp_update_themes(); // WP < 3.7 if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php'); $skin = new Automatic_Upgrader_Skin(); $upgrader = new Theme_Upgrader($skin); $upgrader->init(); $result = $upgrader->bulk_upgrade(array($theme)); if (is_array($result) && empty($result[$theme]) && is_wp_error($skin->result)) { $result = $skin->result; } $status['messages'] = $upgrader->skin->get_upgrade_messages(); if (is_array($result) && !empty($result[$theme])) { $theme_update_data = current($result); /* * If the `update_themes` site transient is empty (e.g. when you update * two plugins in quick succession before the transient repopulates), * this may be the return. * * Preferably something can be done to ensure `update_themes` isn't empty. * For now, surface some sort of error here. */ if (true === $theme_update_data) { $status['error'] = 'update_failed'; return $status; } $new_theme_version = $this->get_theme_version($theme); if (false === $new_theme_version) { $status['error'] = 'update_failed'; return $status; } $status['newVersion'] = $new_theme_version; return $status; } elseif (is_wp_error($result)) { $status['error'] = $result->get_error_code(); $status['error_message'] = $result->get_error_message(); return $status; } elseif (is_bool($result) && !$result) { $status['error'] = 'unable_to_connect_to_filesystem'; // Pass through the error from WP_Filesystem if one was raised if (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { $status['error'] = $wp_filesystem->errors->get_error_code(); $status['error_message'] = $wp_filesystem->errors->get_error_message(); } return $status; } else { // An unhandled error occurred $status['error'] = 'update_failed'; return $status; } } /** * Updates available translations for this website * * @return Array */ private function _update_translation() { global $wp_filesystem; $status = array(); include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'); if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php'); $skin = new Automatic_Upgrader_Skin(); $upgrader = new Language_Pack_Upgrader($skin); $result = $upgrader->bulk_upgrade(); if (is_array($result) && !empty($result)) { $status['success'] = true; } elseif (is_wp_error($result)) { $status['error'] = $result->get_error_code(); $status['error_message'] = $result->get_error_message(); } elseif (is_bool($result) && !$result) { $status['error'] = 'unable_to_connect_to_filesystem'; // Pass through the error from WP_Filesystem if one was raised if (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { $status['error'] = $wp_filesystem->errors->get_error_code(); $status['error_message'] = $wp_filesystem->errors->get_error_message(); } } elseif (is_bool($result) && $result) { $status['error'] = 'up_to_date'; } else { // An unhandled error occurred $status['error'] = 'update_failed'; } return $status; } private function get_theme_version($theme) { if (function_exists('wp_get_theme')) { // Since WP 3.4.0 $theme = wp_get_theme($theme); if (is_a($theme, 'WP_Theme')) { return $theme->Version; } else { return false; } } else { $theme_data = get_theme_data(WP_CONTENT_DIR . '/themes/'.$theme.'/style.css'); if (isset($theme_data['Version'])) { return $theme_data['Version']; } else { return false; } } } /** * Adding third-party plugins/theme for UDC automatic updates, for some updaters which store their information when the transient is set, instead of (like most) when it is fetched * * @param Array $items A collection of plugins or themes for updates * @param String $type A string indicating which type of collection to process (e.g. 'plugin' or 'theme') * @return Array An updated collection of plugins or themes for updates */ private function maybe_add_third_party_items($items, $type) { // Here we're preparing a dummy transient object that will be pass to the filter // and gets populated by those plugins or themes that hooked into the "pre_set_site_transient_*" filter. // // We're setting some default properties so that plugins and themes won't be able to bypass populating them, // because most of the plugins and themes updater scripts checks whether or not these properties are set and // non-empty or passed the 12 hour period (where WordPress re-starts the process of checking updates for // these plugins and themes), otherwise, they bypass populating the update/upgrade info for these items. $transient = (object) array( 'last_checked' => time() - (13 * 3600), /* Making sure that we passed the 12 hour period check */ 'checked' => array('default' => 'none'), 'response' => array('default' => 'none') ); // Most of the premium plugin developers are hooking into the "pre_set_site_transient_update_plugins" and // "pre_set_site_transient_update_themes" filters if they want their plugins or themes to support automatic // updates. Thus, we're making sure here that if for some reason, those plugins or themes didn't get through // and added to the "update_plugins" or "update_themes" transients when calling the get_site_transient('update_plugins') // or get_site_transient('update_themes') we add them here manually. $filters = apply_filters("pre_set_site_transient_update_{$type}s", $transient, "update_{$type}s"); $all_items = array(); switch ($type) { case 'plugin': $all_items = get_plugins(); break; case 'theme': $this->_frontend_include('theme.php'); if (function_exists('wp_get_themes')) { $themes = wp_get_themes(); if (!empty($themes)) { // We make sure that the return key matched the previous // key from "get_themes", otherwise, no updates will be found // even if it does have one. "get_themes" returns the name of the // theme as the key while "wp_get_themes" returns the slug. foreach ($themes as $theme) { $all_items[$theme->Name] = $theme; } } } else { $all_items = get_themes(); } break; default: break; } if (!empty($all_items)) { $all_items = (array) $all_items; foreach ($all_items as $key => $data) { if (!isset($items[$key]) && isset($filters->response[$key])) { $update_info = ('plugin' === $type) ? $filters->response[$key] : $data; // If "package" is empty, it means that this plugin or theme does not support automatic updates // currently, since the "package" field is the one holding the download link of these plugins/themes // and WordPress is using this field to download the latest version of these items. // // Most of the time, this "package" field is not empty, but for premium plugins/themes this can be // conditional, only then if the user provides a legit access or api key can this field be populated or available. // // We set this variable to "false" by default, as plugins/themes hosted in wordpress.org always sets this // to the downloadable zip file of the plugin/theme. // // N.B. We only add premium plugins/themes that has this "package" field set and non-empty, otherwise, it // does not support automatic updates as explained above. $is_package_empty = false; if (is_object($update_info)) { if (!isset($update_info->package) || empty($update_info->package)) { $is_package_empty = true; } } elseif (is_array($update_info)) { if (!isset($update_info['package']) || empty($update_info['package'])) { $is_package_empty = true; } } // Add this plugin/theme to the current updates collection if (!$is_package_empty) { $items[$key] = ('plugin' === $type) ? (object) $data : $this->get_theme_info($key); $items[$key]->update = $update_info; } } } } return $this->prep_items_for_updates($items, $type); } /** * Extracts theme's data or information * * @param string $theme A string representing a theme's name or slug. * @return object|boolean If successful, an object containing the theme data or information, "false" otherwise. */ private function get_theme_info($theme) { if (function_exists('wp_get_theme')) { $theme = wp_get_theme($theme); if (is_a($theme, 'WP_Theme')) { return $theme; } } else { $theme_data = get_theme_data(WP_CONTENT_DIR.'/themes/'.$theme.'/style.css'); if (isset($theme_data['Version'])) { if (!isset($theme_data['ThemeURI'])) $theme_data['ThemeURI'] = $theme_data['URI']; return (object) $theme_data; } } return false; } /** * Fix items for update with missing "plugin" or "theme" field if applicable * * @param Array $items A collection of plugins or themes for updates * @param String $type A string indicating which type of collection to process (e.g. 'plugin' or 'theme') * @return Array An updated collection of plugins or themes for updates */ private function prep_items_for_updates($items, $type) { foreach ($items as $key => $data) { $update_info = $data->update; // Some plugins and/or themes does not adhere to the standard WordPress updates meta // properties/fields. Thus, missing some fields such as "plugin" or "theme" // in their update information results in "Automatic updates is unavailable for this item" // in UDC since we're using these fields to process the updates. // // As a workaround, we're filling these missing fields in order to solve the above issue // in case the developer of these plugins/themes forgot to include them. if (is_object($update_info)) { $update_info = (array) $update_info; if (!isset($update_info[$type])) { $update_info[$type] = $key; } $update_info = (object) $update_info; } elseif (is_array($update_info)) { if (!isset($update_info[$type])) { $update_info[$type] = $key; } } // Re-assign the updated info to the original "update" property $items[$key]->update = $update_info; } return $items; } /** * Custom validation for translation permission. Since the 'install_languages' capability insn't available until 4.9 * therefore, we wrapped the validation check in this block to support older version of WP. * * @return Boolean */ private function user_can_update_translations() { global $updraftcentral_main; $wp_version = $updraftcentral_main->get_wordpress_version(); if (version_compare($wp_version, '4.9', '<')) { if (current_user_can('update_core') || current_user_can('update_plugins') || current_user_can('update_themes')) return true; } else { if (current_user_can('install_languages')) return true; } return false; } public function get_updates($options) { // Forcing Elegant Themes (Divi) updates component to load if it exist. if (function_exists('et_register_updates_component')) et_register_updates_component(); if (!current_user_can('update_plugins') && !current_user_can('update_themes') && !current_user_can('update_core')) return $this->_generic_error_response('updates_permission_denied'); $this->_admin_include('plugin.php', 'update.php', 'file.php', 'template.php'); $this->_frontend_include('update.php'); if (!is_array($options)) $options = array(); // Normalise it $plugin_updates = array(); if (current_user_can('update_plugins')) { // Detect if refresh needed $transient = get_site_transient('update_plugins'); if (!empty($options['force_refresh']) || false === $transient) { delete_site_transient('update_plugins'); wp_update_plugins(); } $get_plugin_updates = $this->maybe_add_third_party_items(get_plugin_updates(), 'plugin'); if (is_array($get_plugin_updates)) { foreach ($get_plugin_updates as $update) { // For some reason, some 3rd-party (premium) plugins are returning the same version // with that of the currently installed version in WordPress. Thus, we're making sure here to // only return those items for update that has new versions greater than the currently installed version. if (version_compare($update->Version, $update->update->new_version, '>=')) continue; $plugin_updates[] = array( 'name' => $update->Name, 'plugin_uri' => $update->PluginURI, 'version' => $update->Version, 'description' => $update->Description, 'author' => $update->Author, 'author_uri' => $update->AuthorURI, 'title' => $update->Title, 'author_name' => $update->AuthorName, 'update' => array( // With Affiliates-WP, if you have not connected, this is null. 'plugin' => isset($update->update->plugin) ? $update->update->plugin : null, 'slug' => $update->update->slug, 'new_version' => $update->update->new_version, 'package' => $update->update->package, 'tested' => isset($update->update->tested) ? $update->update->tested : null, 'compatibility' => isset($update->update->compatibility) ? (array) $update->update->compatibility : null, 'sections' => isset($update->update->sections) ? (array) $update->update->sections : null, ), ); } } } $theme_updates = array(); if (current_user_can('update_themes')) { // Detect if refresh needed $transient = get_site_transient('update_themes'); if (!empty($options['force_refresh']) || false === $transient) { delete_site_transient('update_themes'); wp_update_themes(); } $get_theme_updates = $this->maybe_add_third_party_items(get_theme_updates(), 'theme'); if (is_array($get_theme_updates)) { foreach ($get_theme_updates as $update) { // We're making sure here to only return those items for update that has new // versions greater than the currently installed version. if (version_compare($update->Version, $update->update['new_version'], '>=')) continue; $name = $update->Name; $theme_name = !empty($name) ? $name : $update->update['theme']; $theme_updates[] = array( 'name' => $theme_name, 'theme_uri' => $update->ThemeURI, 'version' => $update->Version, 'description' => $update->Description, 'author' => $update->Author, 'author_uri' => $update->AuthorURI, 'update' => array( 'theme' => $update->update['theme'], 'new_version' => $update->update['new_version'], 'package' => $update->update['package'], 'url' => $update->update['url'], ), ); } } } $core_updates = array(); if (current_user_can('update_core')) { // Detect if refresh needed $transient = get_site_transient('update_core'); if (!empty($options['force_refresh']) || false === $transient) { // The next line is only needed for older WP versions - otherwise, the parameter to wp_version_check forces a check. delete_site_transient('update_core'); wp_version_check(array(), true); } $get_core_updates = get_core_updates(); if (is_array($get_core_updates)) { $core_update_key = false; $core_update_latest_version = false; // THis is included so we can get $wp_version @include(ABSPATH.WPINC.'/version.php');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. foreach ($get_core_updates as $k => $core_update) { if (isset($core_update->version) && version_compare($core_update->version, $wp_version, '>') && version_compare($core_update->version, $core_update_latest_version, '>')) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. $core_update_latest_version = $core_update->version; $core_update_key = $k; } } if (false !== $core_update_key) { $update = $get_core_updates[$core_update_key]; global $wpdb; $mysql_version = $wpdb->db_version(); $is_mysql = (file_exists(WP_CONTENT_DIR . '/db.php') && empty($wpdb->is_mysql)) ? false : true; // We're making sure here to only return those items for update that has new // versions greater than the currently installed version. if (version_compare($wp_version, $update->version, '<')) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. $core_updates[] = array( 'download' => $update->download, 'version' => $update->version, 'php_version' => $update->php_version, 'mysql_version' => $update->mysql_version, 'installed' => array( 'version' => $wp_version,// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. 'mysql' => $mysql_version, 'php' => PHP_VERSION, 'is_mysql' => $is_mysql, ), 'sufficient' => array( 'mysql' => version_compare($mysql_version, $update->mysql_version, '>='), 'php' => version_compare(PHP_VERSION, $update->php_version, '>='), ), ); } } } } $translation_updates = array(); if (function_exists('wp_get_translation_updates') && $this->user_can_update_translations()) { $translations = wp_get_translation_updates(); $translation_updates = array( 'items' => $translations ); } // Do we need to ask the user for filesystem credentials? $request_filesystem_credentials = array(); $check_fs = array( 'plugins' => WP_PLUGIN_DIR, 'themes' => WP_CONTENT_DIR.'/themes', 'core' => untrailingslashit(ABSPATH) ); if (!empty($translation_updates)) { // 'en_US' don't usually have the "languages" folder, thus, we // check if there's a need to ask for filesystem credentials for that // folder if it exists, most especially for locale other than 'en_US'. $language_dir = WP_CONTENT_DIR.'/languages'; if ('en_US' !== get_locale() && is_dir($language_dir)) { $check_fs['translations'] = $language_dir; } } foreach ($check_fs as $entity => $dir) { $filesystem_method = get_filesystem_method(array(), $dir); ob_start(); $filesystem_credentials_are_stored = request_filesystem_credentials(site_url()); $filesystem_form = strip_tags(ob_get_contents(), '

'); ob_end_clean(); $request_filesystem_credentials[$entity] = ('direct' != $filesystem_method && !$filesystem_credentials_are_stored); } $automatic_backups = (class_exists('UpdraftPlus_Options') && class_exists('UpdraftPlus_Addon_Autobackup') && UpdraftPlus_Options::get_updraft_option('updraft_autobackup_default', true)) ? true : false; return $this->_response(array( 'plugins' => $plugin_updates, 'themes' => $theme_updates, 'core' => $core_updates, 'translations' => $translation_updates, 'meta' => array( 'request_filesystem_credentials' => $request_filesystem_credentials, 'filesystem_form' => $filesystem_form, 'automatic_backups' => $automatic_backups ), )); } } PKwL\2okk(updraftplus/central/modules/comments.phpnu[ 'ID', 'order' => 'DESC', 'type' => $query['type'], 'status' => $query['status'], 'search' => esc_attr($query['search']), ); $query = new WP_Comment_Query; $found_comments = $query->query($args); $comments = array(); foreach ($found_comments as $comment) { // We're returning a collection of comment in an array, // in sync with the originator of the request on the ui side // so, we're pulling it one by one into the array before // returning it. if (!in_array($comment, $comments)) { array_push($comments, $comment); } } return $comments; } /** * The _calculate_pages function generates and builds the pagination links * based on the current search parameters/filters. Please see _search_comments * for the breakdown of these parameters. * * @param array $query Query to generate pagination links * @return array */ private function _calculate_pages($query) { $per_page_options = array(10, 20, 30, 40, 50); if (!empty($query)) { if (!empty($query['search'])) { return array( 'page_count' => 1, 'page_no' => 1 ); } $pages = array(); $page_query = new WP_Comment_Query; // Here, we're pulling the comments based on the // two parameters namely type and status. // // The number of results/comments found will then // be use to compute for the number of pages to be // displayed as navigation links when browsing all // comments from the frontend. $comments = $page_query->query(array( 'type' => $query['type'], 'status' => $query['status'] )); $total_comments = count($comments); $page_count = ceil($total_comments / $query['per_page']); if ($page_count > 1) { for ($i = 0; $i < $page_count; $i++) { if ($i + 1 == $query['page_no']) { $paginator_item = array( 'value' => $i+1, 'setting' => 'disabled' ); } else { $paginator_item = array( 'value' => $i+1 ); } array_push($pages, $paginator_item); } if ($query['page_no'] >= $page_count) { $page_next = array( 'value' => $page_count, 'setting' => 'disabled' ); } else { $page_next = array( 'value' => $query['page_no'] + 1 ); } if (1 === $query['page_no']) { $page_prev = array( 'value' => 1, 'setting' => 'disabled' ); } else { $page_prev = array( 'value' => $query['page_no'] - 1 ); } return array( 'page_no' => $query['page_no'], 'per_page' => $query['per_page'], 'page_count' => $page_count, 'pages' => $pages, 'page_next' => $page_next, 'page_prev' => $page_prev, 'total_results' => $total_comments, 'per_page_options' => $per_page_options ); } else { return array( 'page_no' => $query['page_no'], 'per_page' => $query['per_page'], 'page_count' => $page_count, 'total_results' => $total_comments, 'per_page_options' => $per_page_options ); } } else { return array( 'per_page_options' => $per_page_options ); } } /** * The get_blog_sites function pulls blog sites available for the current WP instance. * If Multisite is enabled on the server, then sites under the network will be pulled, otherwise, it will return an empty array. * * @return array */ private function get_blog_sites() { if (!is_multisite()) return array(); // Initialize array container $sites = $network_sites = array(); // Check to see if latest get_sites (available on WP version >= 4.6) function is // available to pull any available sites from the current WP instance. If not, then // we're going to use the fallback function wp_get_sites (for older version). if (function_exists('get_sites') && class_exists('WP_Site_Query')) { $network_sites = get_sites(); } else { if (function_exists('wp_get_sites')) { $network_sites = wp_get_sites(); } } // We only process if sites array is not empty, otherwise, bypass // the next block. if (!empty($network_sites)) { foreach ($network_sites as $site) { // Here we're checking if the site type is an array, because // we're pulling the blog_id property based on the type of // site returned. // get_sites returns an array of object, whereas the wp_get_sites // function returns an array of array. $blog_id = (is_array($site)) ? $site['blog_id'] : $site->blog_id; // We're saving the blog_id and blog name as an associative item // into the sites array, that will be used as "Sites" option in // the frontend. $sites[$blog_id] = get_blog_details($blog_id)->blogname; } } return $sites; } /** * The get_wp_option function pulls current blog options * from the database using either following functions: * - get_blog_option (for multisite) * - get_option (for ordinary blog) * * @param array $blog_id This is the specific blog ID * @param array $setting specifies settings * @return array */ private function _get_wp_option($blog_id, $setting) { return is_multisite() ? get_blog_option($blog_id, $setting) : get_option($setting); } /** * The get_comments function pull all the comments from the database * based on the current search parameters/filters. Please see _search_comments * for the breakdown of these parameters. * * @param array $query Specific query to pull comments * @return array */ public function get_comments($query) { // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($query['blog_id'])) $blog_id = $query['blog_id']; // Here, we're switching to the actual blog that we need // to pull comments from. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } if (!empty($query['search'])) { // If a search keyword is present, then we'll call the _search_comments // function to process the query. $comments = $this->_search_comments($query); } else { // Set default parameter values if the designated // parameters are empty. if (empty($query['per_page'])) { $query['per_page'] = 10; } if (empty($query['page_no'])) { $query['page_no'] = 1; } if (empty($query['type'])) { $query['type'] = ''; } if (empty($query['status'])) { $query['status'] = ''; } // Since WP_Comment_Query parameters doesn't have a "page" attribute, we // need to compute for the offset to get the exact content based on the // current page and the number of items per page. $offset = ((int) $query['page_no'] - 1) * (int) $query['per_page']; $args = array( 'orderby' => 'ID', 'order' => 'DESC', 'number' => $query['per_page'], 'offset' => $offset, 'type' => $query['type'], 'status' => $query['status'] ); $comments_query = new WP_Comment_Query; $comments = $comments_query->query($args); } // If no comments are found based on the current query then // we return with error. if (empty($comments)) { $result = array('message' => 'comments_not_found'); return $this->_response($result); } // Otherwise, we're going to process each comment // before we return it to the one issuing the request. // // Process in the sense that we add additional related info // such as the post tile where the comment belongs to, the // comment status, a formatted date field, and to which parent comment // does the comment was intended to be as a reply. foreach ($comments as &$comment) { $comment = get_comment($comment->comment_ID, ARRAY_A); if ($comment) { $post = get_post($comment['comment_post_ID']); if ($post) $comment['in_response_to'] = $post->post_title; if (!empty($comment['comment_parent'])) { $parent_comment = get_comment($comment['comment_parent'], ARRAY_A); if ($parent_comment) $comment['in_reply_to'] = $parent_comment['comment_author']; } // We're formatting the comment_date to be exactly the same // with that of WP Comments table (e.g. 2016/12/21 at 10:30 PM) $comment['comment_date'] = date('Y/m/d \a\t g:i a', strtotime($comment['comment_date'])); $status = wp_get_comment_status($comment['comment_ID']); if ($status) { $comment['comment_status'] = $status; } } } // We return the following to the one issuing // the request. $result = array( 'comments' => $comments, 'paging' => $this->_calculate_pages($query) ); // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } /** * The get_comment_filters function builds a array of options * to be use as filters for the search function on the frontend. */ public function get_comment_filters() { // Options for comment_types field $comment_types = apply_filters('admin_comment_types_dropdown', array( 'comment' => __('Comments'), 'pings' => __('Pings'), )); // Options for comment_status field $comment_statuses = array( 'approve' => __('Approve'), 'hold' => __('Hold or Unapprove'), 'trash' => __('Trash'), 'spam' => __('Spam'), ); // Pull sites options if available. $sites = $this->get_blog_sites(); $result = array( 'sites' => $sites, 'types' => $comment_types, 'statuses' => $comment_statuses, 'paging' => $this->_calculate_pages(null), ); return $this->_response($result); } /** * The get_settings function pulls the current discussion settings * option values. * * @param array $params Passing specific params for getting current discussion settings * @return array */ public function get_settings($params) { global $updraftcentral_main; // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($params['blog_id'])) $blog_id = $params['blog_id']; // If user does not have sufficient privileges to manage and edit // WP options then we return with error. if (!current_user_can_for_blog($blog_id, 'manage_options')) { $result = array('error' => true, 'message' => 'insufficient_permission'); return $this->_response($result); } // Pull sites options if available. $sites = $this->get_blog_sites(); // Wrap current discussion settings values into an array item // named settings. $result = array( 'settings' => array( 'default_pingback_flag' => $this->_get_wp_option($blog_id, 'default_pingback_flag'), 'default_ping_status' => $this->_get_wp_option($blog_id, 'default_ping_status'), 'default_comment_status' => $this->_get_wp_option($blog_id, 'default_comment_status'), 'require_name_email' => $this->_get_wp_option($blog_id, 'require_name_email'), 'comment_registration' => $this->_get_wp_option($blog_id, 'comment_registration'), 'close_comments_for_old_posts' => $this->_get_wp_option($blog_id, 'close_comments_for_old_posts'), 'close_comments_days_old' => $this->_get_wp_option($blog_id, 'close_comments_days_old'), 'thread_comments' => $this->_get_wp_option($blog_id, 'thread_comments'), 'thread_comments_depth' => $this->_get_wp_option($blog_id, 'thread_comments_depth'), 'page_comments' => $this->_get_wp_option($blog_id, 'page_comments'), 'comments_per_page' => $this->_get_wp_option($blog_id, 'comments_per_page'), 'default_comments_page' => $this->_get_wp_option($blog_id, 'default_comments_page'), 'comment_order' => $this->_get_wp_option($blog_id, 'comment_order'), 'comments_notify' => $this->_get_wp_option($blog_id, 'comments_notify'), 'moderation_notify' => $this->_get_wp_option($blog_id, 'moderation_notify'), 'comment_moderation' => $this->_get_wp_option($blog_id, 'comment_moderation'), 'comment_max_links' => $this->_get_wp_option($blog_id, 'comment_max_links'), 'moderation_keys' => $this->_get_wp_option($blog_id, 'moderation_keys'), ), 'sites' => $sites, ); $wp_version = $updraftcentral_main->get_wordpress_version(); if (version_compare($wp_version, '5.5.0', '<')) { $result['settings']['comment_whitelist'] = $this->_get_wp_option($blog_id, 'comment_whitelist'); $result['settings']['blacklist_keys'] = $this->_get_wp_option($blog_id, 'blacklist_keys'); } else { $result['settings']['comment_previously_approved'] = $this->_get_wp_option($blog_id, 'comment_previously_approved'); $result['settings']['disallowed_keys'] = $this->_get_wp_option($blog_id, 'disallowed_keys'); } return $this->_response($result); } /** * The update_settings function updates the discussion settings * basing on the user generated content/option from the frontend * form. * * @param array $params Specific params to update settings based on discussion * @return array */ public function update_settings($params) { // Extract settings values from passed parameters. $settings = $params['settings']; // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($params['blog_id'])) $blog_id = $params['blog_id']; // If user does not have sufficient privileges to manage and edit // WP options then we return with error. if (!current_user_can_for_blog($blog_id, 'manage_options')) { $result = array('error' => true, 'message' => 'insufficient_permission'); return $this->_response($result); } // Here, we're sanitizing the input fields before we save them to the database // for safety and security reason. The "explode" and "implode" functions are meant // to maintain the line breaks associated with a textarea input/value. foreach ($settings as $key => $value) { // We're using update_blog_option and update_option altogether to update the current // discussion settings. if (is_multisite()) { update_blog_option($blog_id, $key, implode("\n", array_map('sanitize_text_field', explode("\n", $value)))); } else { update_option($key, implode("\n", array_map('sanitize_text_field', explode("\n", $value)))); } } // We're not checking for errors here, but instead we're directly returning a success (error = false) // status always, because WP's update_option will return fail if values were not changed, meaning // previous values were not changed by the user's current request, not an actual exception thrown. // Thus, giving a false positive message or report to the frontend. $result = array('error' => false, 'message' => 'settings_updated', 'values' => array()); return $this->_response($result); } /** * The get_comment function pulls a single comment based * on a comment ID. * * @param array $params Specific params for getting a single comment * @return array */ public function get_comment($params) { // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($params['blog_id'])) $blog_id = $params['blog_id']; // If user does not have sufficient privileges to moderate or edit // a comment then we return with error. if (!current_user_can_for_blog($blog_id, 'moderate_comments')) { $result = array('error' => true, 'message' => 'insufficient_permission'); return $this->_response($result); } // Here, we're switching to the actual blog that we need // to pull comments from. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } // Get comment by comment_ID parameter and return result as an array. $result = array( 'comment' => get_comment($params['comment_id'], ARRAY_A) ); // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } /** * The reply_comment function creates a new comment as a reply * to a certain/selected comment. * * @param array $params Specific params to create a new comment reply * @return array */ public function reply_comment($params) { // Extract reply info from the passed parameters $reply = $params['comment']; // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($params['blog_id'])) $blog_id = $params['blog_id']; // If user does not have sufficient privileges to moderate or edit // a comment then we return with error. if (!current_user_can_for_blog($blog_id, 'moderate_comments')) { $result = array('error' => true, 'message' => 'comment_reply_no_permission'); return $this->_response($result); } // Here, we're switching to the actual blog that we need // to apply our changes. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } // Get comment by comment_ID parameter. $comment = get_comment($reply['comment_id']); if ($comment) { // Get the currently logged in user $user = wp_get_current_user(); // If the current comment was not approved yet then // we need to approve it before we create a reply to // to the comment, mimicking exactly the WP behaviour // in terms of creating a reply to a comment. if (empty($comment->comment_approved)) { $update_data = array( 'comment_ID' => $reply['comment_id'], 'comment_approved' => 1 ); wp_update_comment($update_data); } // Build new comment parameters based on current user info and // the target comment for the reply. $data = array( 'comment_post_ID' => $comment->comment_post_ID, 'comment_author' => $user->display_name, 'comment_author_email' => $user->user_email, 'comment_author_url' => $user->user_url, 'comment_content' => $reply['message'], 'comment_parent' => $reply['comment_id'], 'user_id' => $user->ID, 'comment_date' => current_time('mysql'), 'comment_approved' => 1 ); // Create new comment based on the parameters above, and return // the status accordingly. if (wp_insert_comment($data)) { $result = array('error' => false, 'message' => 'comment_replied_with_comment_author', 'values' => array($comment->comment_author)); } else { $result = array('error' => true, 'message' => 'comment_reply_failed_with_error', 'values' => array($comment->comment_ID)); } } else { $result = array('error' => true, 'message' => 'comment_does_not_exists_error', 'values' => array($reply['comment_id'])); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } /** * The edit_comment function saves new information for the * currently selected comment. * * @param array $params Specific params for editing a comment * @return array */ public function edit_comment($params) { // Extract new comment info from the passed parameters $comment = $params['comment']; // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($params['blog_id'])) $blog_id = $params['blog_id']; // If user does not have sufficient privileges to moderate or edit // a comment then we return with error. if (!current_user_can_for_blog($blog_id, 'moderate_comments')) { $result = array('error' => true, 'message' => 'comment_edit_no_permission'); return $this->_response($result); } // Here, we're switching to the actual blog that we need // to apply our changes. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } // Get current comment details $original_comment = get_comment($comment['comment_id']); if ($original_comment) { $data = array(); // Replace "comment_id" with "comment_ID" since WP does not recognize // the small case "id". $comment['comment_ID'] = $original_comment->comment_ID; unset($comment['comment_id']); // Here, we're sanitizing the input fields before we save them to the database // for safety and security reason. The "explode" and "implode" functions are meant // to maintain the line breaks associated with a textarea input/value. foreach ($comment as $key => $value) { $data[$key] = implode("\n", array_map('sanitize_text_field', explode("\n", $value))); } // Update existing comment based on the passed parameter fields and // return the status accordingly. if (wp_update_comment($data)) { $result = array('error' => false, 'message' => 'comment_edited_with_comment_author', 'values' => array($original_comment->comment_author)); } else { $result = array('error' => true, 'message' => 'comment_edit_failed_with_error', 'values' => array($original_comment->comment_ID)); } } else { $result = array('error' => true, 'message' => 'comment_does_not_exists_error', 'values' => array($comment['comment_id'])); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } /** * The update_comment_status function is a generic handler for the following * comment actions: * * - approve comment * - unapprove comment * - set comment as spam * - move comment to trash * - delete comment permanently * - unset comment as spam * - restore comment * * @param array $params Specific params to update comment status * @return array */ public function update_comment_status($params) { // Here, we're getting the current blog id. If blog id // is passed along with the parameters then we override // that current (default) value with the parameter blog id value. $blog_id = get_current_blog_id(); if (isset($params['blog_id'])) $blog_id = $params['blog_id']; // If user does not have sufficient privileges to moderate or edit // a comment then we return with error. if (!current_user_can_for_blog($blog_id, 'moderate_comments')) { $result = array('error' => true, 'message' => 'comment_change_status_no_permission'); return $this->_response($result); } // Here, we're switching to the actual blog that we need // to apply our changes. $switched = false; if (function_exists('switch_to_blog')) { $switched = switch_to_blog($blog_id); } // We make sure that we still have a valid comment from the server // before we apply the currently selected action. $comment = get_comment($params['comment_id']); if ($comment) { $post = get_post($comment->comment_post_ID); if ($post) $comment->in_response_to = $post->post_title; if (!empty($comment->comment_parent)) { $parent_comment = get_comment($comment->comment_parent); if ($parent_comment) $comment->in_reply_to = $parent_comment->comment_author; } // We're formatting the comment_date to be exactly the same // with that of WP Comments table (e.g. 2016/12/21 at 10:30 PM) $comment->comment_date = date('Y/m/d \a\t g:i a', strtotime($comment->comment_date)); $status = wp_get_comment_status($comment->comment_ID); if ($status) { $comment->comment_status = $status; } $succeeded = false; $message = ''; // Here, we're using WP's wp_set_comment_status function to change the state // of the selected comment based on the current action, except for the "delete" action // where we use the wp_delete_comment to delete the comment permanently by passing // "true" to the second argument. switch ($params['action']) { case 'approve': $succeeded = wp_set_comment_status($params['comment_id'], 'approve'); $message = 'comment_approve_with_comment_author'; break; case 'unapprove': $succeeded = wp_set_comment_status($params['comment_id'], 'hold'); $message = 'comment_unapprove_with_comment_author'; break; case 'spam': $succeeded = wp_set_comment_status($params['comment_id'], 'spam'); $message = 'comment_spam_with_comment_author'; break; case 'trash': $succeeded = wp_set_comment_status($params['comment_id'], 'trash'); $message = 'comment_trash_with_comment_author'; break; case 'delete': $succeeded = wp_delete_comment($params['comment_id'], true); $message = 'comment_delete_with_comment_author'; break; case 'notspam': $succeeded = wp_set_comment_status($params['comment_id'], 'hold'); $message = 'comment_not_spam_with_comment_author'; break; case 'restore': $succeeded = wp_set_comment_status($params['comment_id'], 'hold'); $message = 'comment_restore_with_comment_author'; break; } // If the current action succeeded, then we return a success message, otherwise, // we return an error message to the user issuing the request. if ($succeeded) { $result = array('error' => false, 'message' => $message, 'values' => array($comment->comment_author), 'status' => $comment->comment_status, 'approved' => $comment->comment_approved); } else { $result = array('error' => true, 'message' => 'comment_change_status_failed_with_error', 'values' => array($comment->comment_ID)); } } else { $result = array('error' => true, 'message' => 'comment_does_not_exists_error', 'values' => array($params['comment_id'])); } // Here, we're restoring to the current (default) blog before we // do the switched. if (function_exists('restore_current_blog') && $switched) { restore_current_blog(); } return $this->_response($result); } } PKwL\W$\\&updraftplus/central/modules/plugin.phpnu[switched = switch_to_blog($blog_id); } } /** * Function that gets called after every action * * @param string $command a string that corresponds to UDC command to call a certain method for this class. * @param array $data an array of data post or get fields * @param array $extra_info extrainfo use in the udrpc_action, e.g. user_id * * link to udrpc_action main function in class UpdraftCentral_Listener */ public function _post_action($command, $data, $extra_info) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameter is present because the caller from UpdraftCentral_Listener class uses 3 arguments. // Here, we're restoring to the current (default) blog before we switched if ($this->switched) restore_current_blog(); } /** * Constructor */ public function __construct() { $this->_admin_include('plugin.php', 'file.php', 'template.php', 'class-wp-upgrader.php', 'plugin-install.php', 'update.php'); } /** * Installs and activates a plugin through upload * * @param array $params Parameter array containing information pertaining the currently uploaded plugin * @return array Contains the result of the current process */ public function upload_plugin($params) { return $this->process_chunk_upload($params, 'plugin'); } /** * Checks whether the plugin is currently installed and activated. * * @param array $query Parameter array containing the name of the plugin to check * @return array Contains the result of the current process */ public function is_plugin_installed($query) { if (!isset($query['plugin'])) return $this->_generic_error_response('plugin_name_required'); $result = $this->_get_plugin_info($query); return $this->_response($result); } /** * Applies currently requested action for plugin processing * * @param string $action The action to apply (e.g. activate or install) * @param array $query Parameter array containing information for the currently requested action * * @return array */ private function _apply_plugin_action($action, $query) { $result = array(); switch ($action) { case 'activate': case 'network_activate': $info = $this->_get_plugin_info($query); if ($info['installed']) { $activate = activate_plugin($info['plugin_path']); if (is_wp_error($activate)) { $result = $this->_generic_error_response('generic_response_error', array( 'plugin' => $query['plugin'], 'error_code' => 'generic_response_error', 'error_message' => $activate->get_error_message(), 'info' => $this->_get_plugin_info($query) )); } else { $result = array('activated' => true, 'info' => $this->_get_plugin_info($query), 'last_state' => $info); } } else { $result = $this->_generic_error_response('plugin_not_installed', array( 'plugin' => $query['plugin'], 'error_code' => 'plugin_not_installed', 'error_message' => __('The plugin you wish to activate is either not installed or has been removed recently.', 'updraftplus'), 'info' => $info )); } break; case 'deactivate': case 'network_deactivate': $info = $this->_get_plugin_info($query); if ($info['active']) { deactivate_plugins($info['plugin_path']); if (!is_plugin_active($info['plugin_path'])) { $result = array('deactivated' => true, 'info' => $this->_get_plugin_info($query), 'last_state' => $info); } else { $result = $this->_generic_error_response('deactivate_plugin_failed', array( 'plugin' => $query['plugin'], 'error_code' => 'deactivate_plugin_failed', 'error_message' => __('There appears to be a problem deactivating the intended plugin. Please kindly check your permission and try again.', 'updraftplus'), 'info' => $this->_get_plugin_info($query) )); } } else { $result = $this->_generic_error_response('not_active', array( 'plugin' => $query['plugin'], 'error_code' => 'not_active', 'error_message' => __('The plugin you wish to deactivate is currently not active or is already deactivated.', 'updraftplus'), 'info' => $info )); } break; case 'install': $api = plugins_api('plugin_information', array( 'slug' => $query['slug'], 'fields' => array( 'short_description' => false, 'sections' => false, 'requires' => false, 'rating' => false, 'ratings' => false, 'downloaded' => false, 'last_updated' => false, 'added' => false, 'tags' => false, 'compatibility' => false, 'homepage' => false, 'donate_link' => false, ) )); $info = $this->_get_plugin_info($query); if (is_wp_error($api)) { $result = $this->_generic_error_response('generic_response_error', array( 'plugin' => $query['plugin'], 'error_code' => 'generic_response_error', 'error_message' => $api->get_error_message(), 'info' => $info )); } else { $installed = $info['installed']; $error_code = $error_message = ''; if (!$installed) { // WP < 3.7 if (!class_exists('Automatic_Upgrader_Skin')) include_once(dirname(dirname(__FILE__)).'/classes/class-automatic-upgrader-skin.php'); $skin = new Automatic_Upgrader_Skin(); $upgrader = new Plugin_Upgrader($skin); $download_link = $api->download_link; $installed = $upgrader->install($download_link); if (is_wp_error($installed)) { $error_code = $installed->get_error_code(); $error_message = $installed->get_error_message(); } elseif (is_wp_error($skin->result)) { $error_code = $skin->result->get_error_code(); $error_message = $skin->result->get_error_message(); $error_data = $skin->result->get_error_data($error_code); if (!empty($error_data)) { if (is_array($error_data)) $error_data = json_encode($error_data); $error_message .= ' '.$error_data; } } elseif (is_null($installed) || !$installed) { global $wp_filesystem; $upgrade_messages = $skin->get_upgrade_messages(); if (!class_exists('WP_Filesystem_Base')) include_once(ABSPATH.'/wp-admin/includes/class-wp-filesystem-base.php'); // Pass through the error from WP_Filesystem if one was raised. if ($wp_filesystem instanceof WP_Filesystem_Base && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { $error_code = $wp_filesystem->errors->get_error_code(); $error_message = $wp_filesystem->errors->get_error_message(); } elseif (!empty($upgrade_messages)) { // We're only after for the last feedback that we received from the install process. Mostly, // that is where the last error has been inserted. $messages = $skin->get_upgrade_messages(); $error_code = 'install_failed'; $error_message = end($messages); } else { $error_code = 'unable_to_connect_to_filesystem'; $error_message = __('Unable to connect to the filesystem. Please confirm your credentials.'); } } } if (!$installed || is_wp_error($installed)) { $result = $this->_generic_error_response('plugin_install_failed', array( 'plugin' => $query['plugin'], 'error_code' => $error_code, 'error_message' => $error_message, 'info' => $this->_get_plugin_info($query) )); } else { $result = array('installed' => true, 'info' => $this->_get_plugin_info($query), 'last_state' => $info); } } break; } return $result; } /** * Preloads the submitted credentials to the global $_POST variable * * @param array $query Parameter array containing information for the currently requested action */ private function _preload_credentials($query) { if (!empty($query) && isset($query['filesystem_credentials'])) { parse_str($query['filesystem_credentials'], $filesystem_credentials); if (is_array($filesystem_credentials)) { foreach ($filesystem_credentials as $key => $value) { // Put them into $_POST, which is where request_filesystem_credentials() checks for them. $_POST[$key] = $value; } } } } /** * Checks whether we have the required fields submitted and the user has * the capabilities to execute the requested action * * @param array $query The submitted information * @param array $fields The required fields to check * @param array $capabilities The capabilities to check and validate * * @return array|string */ private function _validate_fields_and_capabilities($query, $fields, $capabilities) { $error = ''; if (!empty($fields)) { for ($i=0; $i_generic_error_response('keyword_required'); } else { $error = $this->_generic_error_response('plugin_'.$query[$field].'_required'); } break; } } } if (empty($error) && !empty($capabilities)) { for ($i=0; $i_generic_error_response('plugin_insufficient_permission'); break; } } } return $error; } /** * Processing an action for multiple items * * @param array $query Parameter array containing a list of plugins to process * @return array Contains the results of the bulk process */ public function process_action_in_bulk($query) { $action = isset($query['action']) ? $query['action'] : ''; $items = isset($query['args']) ? $query['args']['items'] : array(); $results = array(); if (!empty($action) && !empty($items) && is_array($items)) { foreach ($items as $value) { if (method_exists($this, $action)) { $results[] = $this->$action($value); } } } return $this->_response($results); } /** * Activates the plugin * * @param array $query Parameter array containing the name of the plugin to activate * @return array Contains the result of the current process */ public function activate_plugin($query) { $fields = array('plugin'); $permissions = array('activate_plugins'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_plugin_action((!empty($query['multisite']) && (bool) $query['multisite']) ? 'network_activate' : 'activate', $query); if (empty($result['activated'])) { return $result; } return $this->_response($result); } /** * Deactivates the plugin * * @param array $query Parameter array containing the name of the plugin to deactivate * @return array Contains the result of the current process */ public function deactivate_plugin($query) { $fields = array('plugin'); $permissions = array('activate_plugins'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_plugin_action((!empty($query['multisite']) && (bool) $query['multisite']) ? 'network_deactivate' : 'deactivate', $query); if (empty($result['deactivated'])) { return $result; } return $this->_response($result); } /** * Download, install and activates the plugin * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the plugin name and slug * @return array Contains the result of the current process */ public function install_activate_plugin($query) { $fields = array('plugin', 'slug'); $permissions = array('install_plugins', 'activate_plugins'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_plugin_action('install', $query); if (!empty($result['installed']) && $result['installed']) { $result = $this->_apply_plugin_action((!empty($query['multisite']) && (bool) $query['multisite']) ? 'network_activate' : 'activate', $query); if (empty($result['activated'])) { return $result; } } else { return $result; } return $this->_response($result); } /** * Download, install the plugin * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the plugin name and slug * @return array Contains the result of the current process */ public function install_plugin($query) { $fields = array('plugin', 'slug'); $permissions = array('install_plugins'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $result = $this->_apply_plugin_action('install', $query); if (empty($result['installed'])) { return $result; } return $this->_response($result); } /** * Uninstall/delete the plugin * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the plugin name and slug * @return array Contains the result of the current process */ public function delete_plugin($query) { $fields = array('plugin'); $permissions = array('delete_plugins'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); $info = $this->_get_plugin_info($query); if ($info['installed']) { // Deactivate first before delete to invalidate the activate // state/status prior to deleting the item. Otherwise, WordPress will keep // that state, and as soon as you install the same plugin it will be automatically // activated since it's previous state was kept. deactivate_plugins($info['plugin_path']); $deleted = delete_plugins(array($info['plugin_path'])); if ($deleted) { $result = array('deleted' => true, 'info' => $this->_get_plugin_info($query), 'last_state' => $info); } else { return $this->_generic_error_response('delete_plugin_failed', array( 'plugin' => $query['plugin'], 'error_code' => 'delete_plugin_failed', 'info' => $info )); } } else { return $this->_generic_error_response('plugin_not_installed', array( 'plugin' => $query['plugin'], 'error_code' => 'plugin_not_installed', 'info' => $info )); } return $this->_response($result); } /** * Updates/upgrade the plugin * * @param array $query Parameter array containing the filesystem credentials entered by the user along with the plugin name and slug * @return array Contains the result of the current process */ public function update_plugin($query) { $fields = array('plugin', 'slug'); $permissions = array('update_plugins'); $error = $this->_validate_fields_and_capabilities($query, $fields, $permissions); if (!empty($error)) { return $error; } $this->_preload_credentials($query); // Make sure that we still have the plugin installed before running // the update process $info = $this->_get_plugin_info($query); if ($info['installed']) { // Load the updates command class if not existed if (!class_exists('UpdraftCentral_Updates_Commands')) include_once('updates.php'); $update_command = new UpdraftCentral_Updates_Commands($this->rc); $result = $update_command->update_plugin($info['plugin_path'], $query['slug']); if (!empty($result['error'])) { $result['values'] = array('plugin' => $query['plugin'], 'info' => $info); } } else { return $this->_generic_error_response('plugin_not_installed', array( 'plugin' => $query['plugin'], 'error_code' => 'plugin_not_installed', 'info' => $info )); } return $this->_response($result); } /** * Gets the plugin information along with its active and install status * * @internal * @param array $query Contains either the plugin name or slug or both to be used when retrieving information * @return array */ private function _get_plugin_info($query) { $info = array( 'active' => false, 'installed' => false ); // Clear plugin cache so that newly installed/downloaded plugins // gets reflected when calling "get_plugins" if (function_exists('wp_clean_plugins_cache')) { wp_clean_plugins_cache(); } // Gets all plugins available. $get_plugins = get_plugins(); // Loops around each plugin available. foreach ($get_plugins as $key => $value) { $slug = $this->extract_slug_from_info($key, $value); // If the plugin name matches that of the specified name, it will gather details. // In case name check isn't enough, we'll use slug to verify if the plugin being queried is actually installed. // // Reason for name check failure: // Due to plugin name inconsistencies - where wordpress.org registered plugin name is different // from the actual plugin files's metadata (found inside the plugin's PHP file itself). if ((!empty($query['plugin']) && html_entity_decode($value['Name']) === html_entity_decode($query['plugin'])) || (!empty($query['slug']) && $slug === $query['slug'])) { $info['installed'] = true; $info['active'] = is_plugin_active($key); $info['plugin_path'] = $key; $info['data'] = $value; $info['name'] = $value['Name']; $info['slug'] = $slug; break; } } return $info; } /** * Extract the slug from the plugin data * * @param string $key They key of the current info * @param array $info Data pulled from the plugin file * * @return string */ private function extract_slug_from_info($key, $info) { if (!is_array($info) || empty($info) || empty($key)) return ''; $temp = explode('/', $key); $slug = !empty($info['TextDomain']) ? $info['TextDomain'] : basename($temp[0], '.php'); // If in case the user kept the hello-dolly plugin then we'll make sure that it gets // the proper slug for it, otherwise, we'll end up with the wrong slug 'hello' instead of // 'hello-dolly'. Wrong slug will produce error in UpdraftCentral when running it against // wordpress.org for further information retrieval. $slug = ('Hello Dolly' === $info['Name']) ? 'hello-dolly' : $slug; return $slug; } /** * Loads all available plugins with additional attributes and settings needed by UpdraftCentral * * @param array $query Parameter array Any available parameters needed for this action * @return array Contains the result of the current process */ public function load_plugins($query) { $permissions = array('install_plugins', 'activate_plugins'); if (is_multisite() && !is_super_admin(get_current_user_id())) $permissions = array('activate_plugins'); $error = $this->_validate_fields_and_capabilities($query, array(), $permissions); if (!empty($error)) { return $error; } $website = get_bloginfo('name'); $results = array(); // Load the updates command class if not existed if (!class_exists('UpdraftCentral_Updates_Commands')) include_once('updates.php'); $updates = new UpdraftCentral_Updates_Commands($this->rc); // Get plugins for update $plugin_updates = $updates->get_item_updates('plugins'); // Get all plugins $plugins = get_plugins(); if (is_multisite() && !is_super_admin(get_current_user_id())) { // If the "Plugins" menu is disabled for the subsites on a multisite // network then we return an empty "plugins" array. $menu_items = get_site_option('menu_items'); if (empty($menu_items) || !isset($menu_items['plugins'])) { $plugins = array(); } else { $show_network_active = apply_filters('show_network_active_plugins', current_user_can('manage_network_plugins')); $filtered_plugins = array(); foreach ($plugins as $file => $data) { if (is_network_only_plugin($file) && !is_plugin_active($file)) { if ($show_network_active) $filtered_plugins[$file] = $data; } elseif (is_plugin_active_for_network($file)) { if ($show_network_active) $filtered_plugins[$file] = $data; } else { $filtered_plugins[$file] = $data; } } $plugins = $filtered_plugins; } } foreach ($plugins as $key => $value) { $slug = $this->extract_slug_from_info($key, $value); $plugin = new stdClass(); $plugin->name = $value['Name']; $plugin->description = $value['Description']; $plugin->slug = $slug; $plugin->version = $value['Version']; $plugin->author = $value['Author']; $plugin->status = is_plugin_active($key) ? 'active' : 'inactive'; $plugin->website = $website; $plugin->multisite = is_multisite(); $plugin->site_url = trailingslashit(get_bloginfo('url')); if (!empty($plugin_updates[$key])) { $update_info = $plugin_updates[$key]; if (version_compare($update_info->Version, $update_info->update->new_version, '<')) { if (!empty($update_info->update->new_version)) $plugin->latest_version = $update_info->update->new_version; if (!empty($update_info->update->package)) $plugin->download_link = $update_info->update->package; if (!empty($update_info->update->sections)) $plugin->sections = $update_info->update->sections; } } if (empty($plugin->short_description) && !empty($plugin->description)) { // Only pull the first sentence as short description, it should be enough rather than displaying // an empty description or a full blown one which the user can access anytime if they press on // the view details link in UpdraftCentral. $temp = explode('.', $plugin->description); $short_description = $temp[0]; // Adding the second sentence wouldn't hurt, in case the first sentence is too short. if (isset($temp[1])) $short_description .= '.'.$temp[1]; $plugin->short_description = $short_description.'.'; } $results[] = $plugin; } $result = array( 'plugins' => $results, 'is_super_admin' => is_super_admin(), ); $result = array_merge($result, $this->_get_backup_credentials_settings(WP_PLUGIN_DIR)); return $this->_response($result); } /** * Gets the backup and security credentials settings for this website * * @param array $query Parameter array Any available parameters needed for this action * @return array Contains the result of the current process */ public function get_plugin_requirements() { return $this->_response($this->_get_backup_credentials_settings(WP_PLUGIN_DIR)); } } PKwL\dfR%updraftplus/central/modules/pages.phpnu[switched = switch_to_blog($blog_id); } } /** * Function that gets called after every action * * @param string $command a string that corresponds to UDC command to call a certain method for this class. * @param array $data an array of data post or get fields * @param array $extra_info extrainfo use in the udrpc_action, e.g. user_id * * link to udrpc_action main function in class UpdraftCentral_Listener */ public function _post_action($command, $data, $extra_info) {// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable // Here, we're restoring to the current (default) blog before we switched if ($this->switched) restore_current_blog(); } /** * Returns the keys and fields names that are associated to a particular module type * * @param string $type The type of the module that the current request is processing * * @return array */ private function get_state_fields_by_type($type) { $state_fields = array( 'post' => array( 'validation_fields' => array('publish_posts', 'edit_posts', 'delete_posts'), 'items_key' => 'posts', 'count_key' => 'posts_count', 'list_key' => 'posts', 'result_key' => 'get', 'error_key' => 'post_state_change_failed' ), 'page' => array( 'validation_fields' => array('publish_pages', 'edit_pages', 'delete_pages'), 'items_key' => 'pages', 'count_key' => 'pages_count', 'list_key' => 'pages', 'result_key' => 'get', 'error_key' => 'page_state_change_failed' ) ); if (!isset($state_fields[$type])) return array(); return $state_fields[$type]; } /** * Fetch and retrieves posts based from the submitted parameters * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function get($params) { $state_fields = $this->get_state_fields_by_type($this->post_type); if (empty($state_fields)) return $this->_generic_error_response('unsupported_type_on_get_posts'); $error = $this->_validate_capabilities($state_fields['validation_fields']); if (!empty($error)) return $error; // check paged parameter; if empty set to defaults $paged = !empty($params['paged']) ? (int) $params['paged'] : 1; $numberposts = !empty($params['numberposts']) ? (int) $params['numberposts'] : 10; $offset = ($paged - 1) * $numberposts; $args = array( 'posts_per_page' => $numberposts, 'paged' => $paged, 'offset' => $offset, 'post_type' => $this->post_type, 'post_status' => 'publish,private,draft,pending,future', ); if (!empty($params['keyword'])) { $args['s'] = $params['keyword']; } if ('post' == $this->post_type) { if (!empty($params['category'])) { $args['cat'] = (int) $params['category']; } } if (!empty($params['date'])) { list($monthnum, $year) = explode(':', $params['date']); $args['monthnum'] = $monthnum; $args['year'] = $year; } if (!empty($params['status']) && 'all' !== $params['status']) { $args['post_status'] = $params['status']; } $query = new WP_Query($args); $result = $query->posts; $count_posts = (int) $query->found_posts; $page_count = 0; if ($count_posts > 0) { $page_count = absint($count_posts / $numberposts); $remainder = absint($count_posts % $numberposts); $page_count = ($remainder > 0) ? ++$page_count : $page_count; } $info = array( 'page' => $paged, 'pages' => $page_count, 'results' => $count_posts, 'items_from' => (($paged * $numberposts) - $numberposts) + 1, 'items_to' => ($paged == $page_count) ? $count_posts : $paged * $numberposts, ); $posts = array(); if (!empty($result)) { foreach ($result as $post) { // Pulling any other relevant and additional information regarding // the post before returning it in the response. $postdata = $this->get_postdata($post, false); if (!empty($postdata)) { array_push($posts, $postdata); } } } $response = array( $state_fields['items_key'] => $posts, 'options' => $this->get_options($this->post_type), 'info' => $info, $state_fields['count_key'] => $this->get_post_status_counts($this->post_type) ); // Load any additional information if preload parameter is set. Will only be // requested on initial load of items in UpdraftCentral. if (isset($params['preload']) && $params['preload']) { $timeout = !empty($params['timeout']) ? $params['timeout'] : 30; $response = array_merge($response, $this->get_preload_data($timeout, $this->post_type)); } return $this->_response($response); } /** * Extracts public properties from complex object and return a simple * object (stdClass) that contains the public properties of the original object. * * @param object $obj Any type of complex objects that needs converting (e.g. WP_Taxonomy, WP_Term or WP_User) * @return stdClass */ protected function trim_object($obj) { // To preserve the object's accessibility through its properties we recreate // the object using the stdClass and fill it with the public properties // that will be extracted from the original object ($obj). $newObj = new stdClass(); if (is_object($obj)) { // Making sure that we only extract those publicly accessible properties excluding // the private, protected, static ones and methods. $props = get_object_vars($obj); if (!empty($props)) { foreach ($props as $key => $value) { $newObj->{$key} = $value; } } } return $newObj; } /** * Retrieves information that will be preloaded in UC for quick and easy access * when editing a certain page or post * * @param int $timeout The user-defined timeout from UpdraftCentral * @param string $type The type of the module that the current request is processing * * @return array */ protected function get_preload_data($timeout, $type = 'post') { global $updraftcentral_host_plugin, $updraftcentral_main; if (!function_exists('get_page_templates')) { require_once(ABSPATH.'wp-admin/includes/theme.php'); } $templates = ('post' == $type) ? get_page_templates(null, 'post') : get_page_templates(); if (!empty($templates)) { $templates = array_flip($templates); if (!isset($templates['default'])) { $templates['default'] = $updraftcentral_host_plugin->retrieve_show_message('default_template'); } } // Preloading elements saves time and avoid unnecessary round trips to fetch // these information individually. $authors = $this->get_authors(); $parent_pages = $this->get_parent_pages(); $data = array( 'authors' => $authors['data']['authors'], 'parent_pages' => $parent_pages['data']['pages'], 'templates' => $templates, 'editor_styles' => $this->get_editor_styles($timeout), 'wp_version' => $updraftcentral_main->get_wordpress_version() ); if ('post' == $type) { $categories = $this->get_categories(); $tags = $this->get_tags(); $data['taxonomies'] = $this->get_taxonomies(); $data['categories'] = $categories['data']; $data['tags'] = $tags['data']; } global $post; $context = class_exists('WP_Block_Editor_Context') ? new WP_Block_Editor_Context(array('post' => $post)) : $post; // Load block patterns from w.org. if (function_exists('_load_remote_block_patterns')) _load_remote_block_patterns(); if (function_exists('_load_remote_featured_patterns')) _load_remote_featured_patterns(); $block_types = class_exists('WP_Block_Type_Registry') ? WP_Block_Type_Registry::get_instance()->get_all_registered() : array(); $block_patterns = class_exists('WP_Block_Patterns_Registry') ? WP_Block_Patterns_Registry::get_instance()->get_all_registered() : array(); $block_pattern_categories = class_exists('WP_Block_Pattern_Categories_Registry') ? WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered() : array(); $block_styles = class_exists('WP_Block_Styles_Registry') ? WP_Block_Styles_Registry::get_instance()->get_all_registered() : array(); $block_data = array( 'block_categories' => get_block_categories($context), 'block_definitions' => get_block_editor_server_block_settings(), 'block_types' => $block_types, 'block_patterns' => $block_patterns, 'block_pattern_categories' => $block_pattern_categories, 'block_styles' => $block_styles ); $data = array_merge($data, $block_data); return array( 'preloaded' => json_encode($data) ); } /** * Extract content from the given css path * * @param string $style CSS file path * @param int $timeout The user-defined timeout from UpdraftCentral * @return array */ protected function extract_css_content($style, $timeout) { $content = ''; if (1 === preg_match('~^(https?:)?//~i', $style)) { $response = wp_remote_get($style, array('timeout' => $timeout)); if (!is_wp_error($response)) { $result = trim(wp_remote_retrieve_body($response)); if (!empty($result)) $content = $result; } } else { // Editor styles that resides in "css/dist" if (false !== ($pos = stripos($style, 'css/dist'))) { $file = ABSPATH.WPINC.substr_replace($style, '/', 0, $pos); } else { // Styles that resides in "wp-content/themes" (coming from $editor_styles global var) $file = get_theme_file_path($style); } $is_valid = (function_exists('is_file')) ? is_file($file) : file_exists($file); if ($is_valid) { $result = trim(file_get_contents($file)); if (!empty($result)) $content = $result; } } return $this->extract_custom_fonts($this->filter_url($content)); } /** * Extract custom fonts defined within the css content. Basically, * separating custom font (@font-face) rules from the Style/css content. * * @param string $content Style content * @return array */ protected function extract_custom_fonts($content) { $fonts = array(); while ($start = strpos($content, '@font-face')) { $end = strpos($content, '}', $start) + 1; $length = $end - $start; $font = substr($content, $start, $length); $fonts[]= $this->update_font_src($font); $content = str_replace($font, '', $content); } return array( 'content' => $content, 'fonts' => $fonts ); } /** * Updates the font URL to point to the UpdraftCentral "load_font" action * * @param string $font Font-face definition/content * @return string */ protected function update_font_src($font) { $start = strpos($font, 'src:') + 4; $end = strpos($font, ';', $start); $length = $end - $start; $src = trim(substr($font, $start, $length)); $temp = explode(' ', $src); preg_match('/^url\((.*)\)$/i', $temp[0], $matches); $url = ''; if (!empty($matches)) { $url = trim(trim($matches[1], "'"), '"'); if (strlen($url)) { $font_url = 'CENTRAL_URL/?udcentral_action=load_font&font='.urlencode($url); $font = str_replace($url, $font_url, $font); } } return $font; } /** * Convert URL entries contained in the CSS content to absolute URLs * * @param string $content The content of the CSS file * @return string */ protected function filter_url($content) { // Replace with valid URL (absolute) preg_match_all('~url\((.+?)\)~i', $content, $all_matches); if (!empty($all_matches) && isset($all_matches[1])) { $urls = array_unique($all_matches[1]); foreach ($urls as $url) { $url = str_replace('"', '', $url); if (false !== strpos($url, 'data:')) continue; if (1 !== preg_match('~^(https?:)?//~i', $url)) { if (1 === preg_match('~(plugins|themes)~i', $url, $matches)) { if (false !== ($pos = stripos($url, $matches[1]))) { if (!function_exists('content_url')) { require_once ABSPATH.WPINC.'/link-template.php'; } $absolute_url = rtrim(content_url(), '/').substr_replace($url, '/', 0, $pos); $content = str_replace($url, $absolute_url, $content); } } else { $path = preg_replace('~(\.+\/)~', '', $url); $dirpath = trailingslashit(get_stylesheet_directory()); if (!file_exists($dirpath.$url)) $path = $this->resolve_path($path); $absolute_url = (!empty($path)) ? trailingslashit(get_stylesheet_directory_uri()).ltrim($path, '/') : ''; $content = str_replace($url, $absolute_url, $content); } } } } return $content; } /** * Resolve URL to its actual absolute path * * @param string $path Some relative path to check * @return string */ protected function resolve_path($path) { $dir = trailingslashit(get_stylesheet_directory()); // Some relative paths declared within the css file (e.g. only has '../fonts/etc/', called deep down from a subfolder) where parent // subfolder is not articulated needs to be resolve further to get its actual absolute path. Using glob will pinpoint its actual location // rather than iterating through a series of sublevels just to find the actual file. $result = str_replace($dir, '', glob($dir.'{,*/}{'.$path.'}', GLOB_BRACE)); if (!empty($result)) return $result[0]; return false; } /** * Retrieves block editor assets for iframe. * * @return string */ protected function get_iframed_editor_assets() { $script_handles = array(); $style_handles = array( 'wp-block-editor', 'wp-block-library', 'wp-block-library-theme', 'wp-edit-blocks', ); if (class_exists('WP_Block_Type_Registry')) { $block_registry = WP_Block_Type_Registry::get_instance(); foreach ($block_registry->get_all_registered() as $block_type) { if (!empty($block_type->style)) { if (is_array($block_type->style)) { $style_handles = array_merge($style_handles, $block_type->style); } else { $style_handles[] = $block_type->style; } } if (!empty($block_type->editor_style)) { if (is_array($block_type->editor_style)) { $style_handles = array_merge($style_handles, $block_type->editor_style); } else { $style_handles[] = $block_type->editor_style; } } if (!empty($block_type->script)) { if (is_array($block_type->script)) { $script_handles = array_merge($script_handles, $block_type->script); } else { $script_handles[] = $block_type->script; } } } } $style_handles = array_unique($style_handles); $done = wp_styles()->done; ob_start(); // We do not need reset styles for the iframed editor. wp_styles()->done = array('wp-reset-editor-styles'); wp_styles()->do_items($style_handles); wp_styles()->done = $done; $styles = ob_get_clean(); $script_handles = array_unique($script_handles); $done = wp_scripts()->done; ob_start(); wp_scripts()->done = array(); wp_scripts()->do_items($script_handles); wp_scripts()->done = $done; $scripts = ob_get_clean(); return wp_json_encode(array( 'styles' => $styles, 'scripts' => $scripts, )); } /** * Retrieve the editor styles/assets to be use by UpdraftCentral when editing a post * * @param int $timeout The user-defined timeout from UpdraftCentral * @return array() */ protected function get_editor_styles($timeout) { global $editor_styles, $wp_styles; $editing_styles = $loaded = array(); $fonts = ''; $required = array('css/dist/editor/style.css', 'css/dist/block-library/style.css', 'css/dist/block-library/theme.css'); foreach ($required as $style) { $result = $this->extract_css_content($style, $timeout); if (!empty($result['fonts'])) $fonts .= implode('', $result['fonts']); $editing_styles[] = array('css' => $result['content'], 'inline' => ''); }; do_action('enqueue_block_assets'); do_action('enqueue_block_editor_assets'); do_action('wp_enqueue_scripts'); // Checking for editor styles support since styles may vary from theme to theme if ($editor_styles) { foreach ($editor_styles as $style) { if (false !== array_search($style, $loaded)) continue; $result = $this->extract_css_content($style, $timeout); if (!empty($result['fonts'])) $fonts .= implode('', $result['fonts']); $editing_styles[] = array('css' => $result['content'], 'inline' => ''); $loaded[] = $style; } } if ($wp_styles) { foreach ($wp_styles->queue as $handle) { $style = $wp_styles->registered[$handle]->src; if (false !== array_search($style, $loaded)) continue; $result = $this->extract_css_content($style, $timeout); if (!empty($result['fonts'])) $fonts .= implode('', $result['fonts']); $inline_style = $wp_styles->print_inline_style($handle, false); if ($inline_style) { $inline_result = $this->extract_custom_fonts($inline_style); if (!empty($inline_result['fonts'])) $fonts .= implode('', $inline_result['fonts']); } $editing_styles[] = array( 'css' => $result['content'], 'inline' => (!$inline_style) ? '' : $inline_result['content'] ); $loaded[] = $style; } } // Introduced in 5.9.0 if (function_exists('wp_get_global_stylesheet')) { $result = $this->extract_custom_fonts(wp_get_global_stylesheet()); if (!empty($result['fonts'])) $fonts .= implode('', $result['fonts']); $editing_styles[] = array('css' => $result['content'], 'inline' => ''); } // Introduced in 5.8.0 if (function_exists('get_block_editor_settings')) { $block_editor_context = new WP_Block_Editor_Context(); $settings = get_block_editor_settings(array(), $block_editor_context); // Don't render but instead attached to the editor before load. // We let the editor render these kind of styles as they need to be prefixed // by the editor based on the current context. // // N.B. Leave the 'css' property empty. It is used for downward compatibility. $editing_styles[] = array('editor_css' => $settings['styles'], 'inline' => '', 'css' => ''); // Get editor assets (e.g. styles) for iframe, mostly used for previewing blocks and patterns $editing_styles[] = array('editor_assets' => $this->get_iframed_editor_assets(), 'inline' => '', 'css' => ''); } $result = $this->extract_css_content('/style.css', $timeout); if (!empty($result['fonts'])) $fonts .= implode('', $result['fonts']); $editing_styles[] = array('css' => $result['content'], 'inline' => ''); if (strlen($fonts)) { $editing_styles[] = array('font_css' => $fonts, 'inline' => '', 'css' => ''); } // These styles are used if the "no theme styles" options is triggered or on // themes without their own editor styles. $default_editor_styles_file = ABSPATH.WPINC.'/css/dist/block-editor/default-editor-styles.css'; if (file_exists($default_editor_styles_file)) { $editing_styles[] = array('default_editor_css' => file_get_contents($default_editor_styles_file), 'inline' => '', 'css' => ''); } // Extract fonts from theme.json if the current theme supports it $resolver = ABSPATH.WPINC.'/class-wp-theme-json-resolver.php'; if (!class_exists('WP_Theme_JSON_Resolver') && file_exists($resolver)) { require_once($resolver); } if (class_exists('WP_Theme_JSON_Resolver') && WP_Theme_JSON_Resolver::theme_has_support()) { $theme_json = ABSPATH.WPINC.'/class-wp-theme-json.php'; if (!class_exists('WP_Theme_JSON') && file_exists($theme_json)) require_once($theme_json); $theme_json_instance = WP_Theme_JSON_Resolver::get_theme_data(); if ($theme_json_instance) { $settings = $theme_json_instance->get_settings(); $theme_fonts = ''; if (isset($settings['typography']) && isset($settings['typography']['fontFamilies'])) { $font_families = $settings['typography']['fontFamilies']; if (isset($font_families['theme'])) { foreach ($font_families['theme'] as $theme) { if (isset($theme['fontFace'])) { foreach ($theme['fontFace'] as $font) { $theme_fonts .= '@font-face {'; $keys = array_keys($font); foreach ($keys as $key) { if (false !== stripos($key, 'font')) { $prop = 'font-'.strtolower(str_replace('font', '', $key)); $theme_fonts .= $prop.': '.$font[$key].';'; } elseif (false !== stripos($key, 'src')) { foreach ($font['src'] as $src_file) { $url = trailingslashit(get_stylesheet_directory_uri()).str_replace('file:./', '', $src_file); $theme_fonts .= 'src: url(CENTRAL_URL/?udcentral_action=load_font&font='.urlencode($url).');'; } } } $theme_fonts .= '}'; } } } } } $editing_styles[] = array('theme_json_fonts' => $theme_fonts, 'inline' => '', 'css' => ''); } } return $editing_styles; } /** * Retrieves the total number of items found under each post statuses * * @param string $type The type of the module that the current request is processing * * @return array */ protected function get_post_status_counts($type = 'post') { $posts = wp_count_posts($type); $publish = (int) $posts->publish; $private = (int) $posts->private; $draft = (int) $posts->draft; $pending = (int) $posts->pending; $future = (int) $posts->future; $trash = (int) $posts->trash; // We exclude "trash" from the overall total as WP doesn't actually // consider or include it in the total count. $all = $publish + $private + $draft + $pending + $future; return array( 'all' => $all, 'publish' => $publish, 'private' => $private, 'draft' => $draft, 'pending' => $pending, 'future' => $future, 'trash' => $trash, ); } /** * Retrieves a collection of formatted dates found for the given post statuses. * It will be used as options for the date filter when managing the posts in UpdraftCentral. * * @param string $type The type of the module that the current request is processing * * @return array */ protected function get_date_options($type = 'post') { global $wpdb; $date_options = $wpdb->get_col("SELECT DATE_FORMAT(`post_date`, '%M %Y') as `formatted_post_date` FROM {$wpdb->posts} WHERE `post_type` = '{$type}' AND `post_status` IN ('publish', 'private', 'draft', 'pending', 'future') GROUP BY `formatted_post_date` ORDER BY `post_date` DESC"); return $date_options; } /** * Make sure that we have the required fields to use in UpdraftCentral for * displaying the categories and tags sections. Add if missing. * * @param object $item Taxonomy item to check * @return object */ protected function map_tax($item) { $taxs = array('category' => 'categories', 'post_tag' => 'tags'); if (array_key_exists($item->name, $taxs)) { if (!isset($item->show_in_rest)) $item->show_in_rest = true; if (!isset($item->rest_base)) $item->rest_base = $taxs[$item->name]; } return $item; } /** * Fetch and retrieves available taxonomies for this site and some capabilities specific * to tags and categories when managing them. * * @return array */ protected function get_taxonomies() { $taxonomies = get_taxonomies(array(), 'objects'); $taxonomies = array_map(array($this, 'map_tax'), $taxonomies); $response = array( 'taxonomies' => $taxonomies, 'current_user_cap' => array( 'manage_categories' => current_user_can('manage_categories'), 'edit_categories' => current_user_can('edit_categories'), 'delete_categories' => current_user_can('delete_categories'), 'assign_categories' => current_user_can('assign_categories'), 'manage_post_tags' => current_user_can('manage_post_tags'), 'edit_post_tags' => current_user_can('edit_post_tags'), 'delete_post_tags' => current_user_can('delete_post_tags'), 'assign_post_tags' => current_user_can('assign_post_tags'), ) ); return $response; } /** * Fetch and retrieves categories based from the submitted parameters * * @param array $query Containing all the needed information to filter the results of the current request * @return array */ public function get_categories($query = array()) { $page = !empty($query['page']) ? (int) $query['page'] : 1; $items_per_page = !empty($query['per_page']) ? (int) $query['per_page'] : 100; $offset = ($page - 1) * $items_per_page; $order = !empty($query['order']) ? $query['order'] : 'asc'; $orderby = !empty($query['orderby']) ? $query['orderby'] : 'name'; $args = array( 'hide_empty' => false, 'orderby' => $orderby, 'order' => $order, 'number' => $items_per_page, 'offset' => $offset ); $categories = get_categories($args); $category_options = array(); if (!empty($categories)) { foreach ($categories as $key => $term) { $parent_term = get_term((int) $term->parent, $term->taxonomy); if (!is_wp_error($parent_term) && !is_null($parent_term)) { $parent_term = json_encode($this->trim_object($parent_term)); } else { $parent_term = ''; } $category_options[] = array( 'id' => $term->term_id, 'name' => $term->name, 'parent' => $term->parent ); $categories[$key] = array( 'term' => json_encode($this->trim_object($term)), 'misc' => array( 'link' => get_term_link($term), 'parent_term' => $parent_term, 'taxonomy' => $term->taxonomy ) ); } } $categorytax = get_taxonomy('category'); $parent_dropdown_args = array( 'taxonomy' => 'category', 'hide_empty' => 0, 'name' => 'newcategory_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '— '.$categorytax->labels->parent_item.' —', 'echo' => false ); $parent_dropdown_args = apply_filters('post_edit_category_parent_dropdown_args', $parent_dropdown_args); $parent_dropdown = wp_dropdown_categories($parent_dropdown_args); if (!function_exists('wp_popular_terms_checklist')) { require_once ABSPATH . 'wp-admin/includes/template.php'; } ob_start(); wp_popular_terms_checklist('category'); $popular_terms_checklist = ob_get_contents(); ob_end_clean(); return $this->_response(array( 'terms' => $categories, 'misc' => array( 'formatted' => $category_options, 'raw' => $categories, 'tax' => json_encode($this->trim_object($categorytax)), 'popular' => $popular_terms_checklist, 'parent_dropdown' => $parent_dropdown, 'capabilities' => array( 'can_edit_terms' => current_user_can($categorytax->cap->edit_terms) ) ) )); } /** * Fetch and retrieves tags based from the submitted parameters * * @param array $query Containing all the needed information to filter the results of the current request * @return array */ public function get_tags($query = array()) { $page = !empty($query['page']) ? (int) $query['page'] : 1; $items_per_page = !empty($query['per_page']) ? (int) $query['per_page'] : 100; $offset = ($page - 1) * $items_per_page; $order = !empty($query['order']) ? $query['order'] : 'desc'; $orderby = !empty($query['orderby']) ? $query['orderby'] : 'count'; $args = array( 'hide_empty' => false, 'orderby' => $orderby, 'order' => $order, 'number' => $items_per_page, 'offset' => $offset ); $tags = get_tags($args); $tag_options = array(); $tag_cloud = ''; if (!empty($tags)) { $tags_for_cloud = array(); foreach ($tags as $key => $term) { if (!isset($term->link)) $term->link = get_tag_link($term->term_id); array_push($tags_for_cloud, $term); $parent_term = get_term((int) $term->parent, $term->taxonomy); if (!is_wp_error($parent_term) && !is_null($parent_term)) { $parent_term = json_encode($this->trim_object($parent_term)); } else { $parent_term = ''; } $tag_options[] = array( 'id' => $term->term_id, 'name' => $term->name, ); $tags[$key] = array( 'term' => json_encode($this->trim_object($term)), 'misc' => array( 'link' => get_term_link($term), 'parent_term' => $parent_term, 'taxonomy' => $term->taxonomy ) ); } add_filter('tag_cloud_sort', array($this, 'sort_tag_cloud'), 9, 2); if (!function_exists('wp_generate_tag_cloud')) { require_once ABSPATH.WPINC.'/category-template.php'; } $tag_cloud = wp_generate_tag_cloud($tags_for_cloud, array( 'smallest' => 10, 'largest' => 22, 'unit' => 'pt', 'number' => 10, 'format' => 'flat', 'separator' => " ", 'orderby' => 'count', 'order' => 'DESC', 'show_count' => 1, 'echo' => false )); } $tagtax = get_taxonomy('post_tag'); return $this->_response(array( 'terms' => $tags, 'misc' => array( 'formatted' => $tag_options, 'raw' => $tags, 'tax' => json_encode($this->trim_object($tagtax)), 'tag_cloud' => $tag_cloud, 'capabilities' => array( 'can_assign_terms' => current_user_can($tagtax->cap->assign_terms) ) ) )); } /** * Sorts the tag items that are to be shown within the tag cloud * * @param array $tags The array to be sorted. Contains the tag items * @param array $args Additional parameters needed for the sorting process * @return array */ public function sort_tag_cloud($tags, $args) { uasort($tags, array($this, '_wp_object_count_sort_cb')); if ('DESC' === $args['order']) { $tags = array_reverse($tags, true); } return $tags; } /** * Serves as a callback for comparing objects based on count. Copied from WordPress 5.7 * core (wp-includes/category-template.php) and tweaked to return integer instead of boolean * because returning boolean using uasort is now DEPRECATED in PHP 8. * * Used with `uasort()`. * * @since 3.1.0 * @access private * * @param object $a The first object to compare. * @param object $b The second object to compare. * @return bool Whether the count value for `$a` is greater than the count value for `$b`. */ public function _wp_object_count_sort_cb($a, $b) { if ($a->count == $b->count) { return 0; } return ( $a->count > $b->count ) ? 1 : -1; } /** * Fetch all available taxonomies and terms information for the given post object * * @param array $post The "Post" object to use when retrieving the information * @return array */ protected function get_taxonomies_terms($post) { $taxonomies = get_object_taxonomies($post->post_type, 'objects'); $taxonomies = array_map(array($this, 'map_tax'), $taxonomies); $taxonomy_names = array(); $taxonomy_terms = array(); $taxonomy_caps = array(); foreach ($taxonomies as $taxonomy) { $terms = get_the_terms($post->ID, $taxonomy->name); $terms = !is_array($terms) ? (array) $terms : $terms; $taxonomy_terms[$taxonomy->name] = $terms; $taxonomy_caps[$taxonomy->name] = array( 'hierarchical' => is_taxonomy_hierarchical($taxonomy->name), 'edit_terms' => current_user_can($taxonomy->cap->edit_terms), 'assign_terms' => current_user_can($taxonomy->cap->assign_terms), ); array_push($taxonomy_names, $taxonomy->name); } return array( 'objects' => $taxonomies, 'names' => $taxonomy_names, 'terms' => $taxonomy_terms, 'caps' => $taxonomy_caps, ); } /** * Take over the current editing of the post * * @param array $params An array of data that serves as parameters for the given request * @return array */ public function take_over($params) { $error = $this->_validate_capabilities(array('edit_'.$this->post_type.'s')); if (!empty($error)) return $error; $result = array('lock_acquired' => false); if (!empty($params['post_id'])) { if (!function_exists('wp_set_post_lock')) { require_once ABSPATH.'wp-admin/includes/post.php'; } $lock = wp_set_post_lock($params['post_id']); if (!empty($lock)) { $result = array( 'lock_acquired' => true, 'details' => $lock ); } } return $this->_response($result); } /** * Retrieves the underlying data for the given post. Some extra information are * passed along that will be consumed by the editor in UpdraftCentral * * @param int|object $param Post object or a post ID * @param boolean $encode True to encode the post object, false otherwise * @return array */ public function get_postdata($param, $encode = true) { $response = array(); if (is_object($param) && isset($param->ID)) { $post = $param; } elseif (is_numeric($param)) { $post = get_post($param); } if ($post) { $post_type_obj = get_post_type_object($post->post_type); $is_post_type_viewable = false; if (!empty($post_type_obj)) { $is_post_type_viewable = $post_type_obj->publicly_queryable || ($post_type_obj->_builtin && $post_type_obj->public); } if (!function_exists('get_sample_permalink')) { require_once ABSPATH.'wp-admin/includes/post.php'; } // Validate template exists on the current theme, otherwise, // reset the template to default. $template = get_page_template_slug($post->ID); if (!empty($template)) { $page_templates = wp_get_theme()->get_page_templates($post); if ('default' != $template && !isset($page_templates[$template])) { update_post_meta($post->ID, '_wp_page_template', 'default'); } } $published_date = array( 'jj' => date('d', strtotime($post->post_date)), 'mm' => date('m', strtotime($post->post_date)), 'aa' => date('Y', strtotime($post->post_date)), 'hh' => date('H', strtotime($post->post_date)), 'mn' => date('i', strtotime($post->post_date)), 'ss' => date('s', strtotime($post->post_date)) ); $sample_permalink = get_sample_permalink($post->ID, $post->post_title, ''); $permalink = get_permalink($post->ID); $slug = $post->post_name; if (!empty($sample_permalink) && !empty($slug)) { if (isset($sample_permalink[0])) { if (false !== stripos($sample_permalink[0], '%pagename%/') || false !== stripos($sample_permalink[0], '%postname%/')) { $token = (false !== stripos($sample_permalink[0], '%pagename%/')) ? '%pagename%/' : '%postname%/'; $permalink = str_replace($token, '', $sample_permalink[0]).$slug; } } } $editor = null; $editor_id = wp_check_post_lock($post->ID); if ($editor_id) { $editor = get_userdata($editor_id); if (!$editor) { // The user with lock does not exist. This can happen if you created a backup or clone // where you excluded the users table during the process and you restore this backup to // a different site or the user was deleted or removed more recently. Thus, we will // release the lock so that other users with the right permission can edit the post. delete_post_meta($post->ID, '_edit_lock'); } } $response = array( 'post' => $encode ? json_encode($post) : $post, 'misc' => array( 'guid_rendered' => apply_filters('get_the_guid', $post->guid, $post->ID), 'link' => $permalink, 'slug' => $slug, 'site_url' => site_url('/'), 'title_rendered' => get_the_title($post->ID), 'content_rendered' => apply_filters('the_content', $post->post_content), 'excerpt' => $post->post_excerpt, 'featured_media' => 0, 'sticky' => is_sticky($post->ID), 'template' => get_page_template_slug($post->ID), 'permalink_template' => get_permalink($post->ID, true), 'author_name' => get_the_author_meta('display_name', $post->post_author), 'publish_month_year' => date('F Y', strtotime($post->post_date)), 'published_date' => $published_date, 'format' => get_post_format($post->ID), 'post_type_name' => $post_type_obj->name, 'post_type_viewable' => $is_post_type_viewable, 'post_type_public' => $post_type_obj->public, 'post_type_hierarchical' => $post_type_obj->hierarchical, 'sample_permalink' => get_sample_permalink($post->ID, $post->post_title, ''), 'post_password_required' => post_password_required($post), 'post_type_supports_authors' => post_type_supports($post->post_type, 'author'), 'post_type_supports_comments' => post_type_supports($post->post_type, 'comments'), 'post_type_supports_revisions' => post_type_supports($post->post_type, 'revisions'), 'post_revisions' => array(), // N.B. We're not going to allow revisions editing for now 'post_thumbnail_id' => get_post_thumbnail_id($post->ID), 'can_publish_posts' => current_user_can($post_type_obj->cap->publish_posts), 'can_edit_others_posts' => current_user_can($post_type_obj->cap->edit_others_posts), 'can_unfiltered_html' => current_user_can('unfiltered_html'), 'is_edited' => $editor ? 1 : 0, 'editor_id' => $editor_id, 'editor' => $editor, 'edited_by_id' => $editor ? $editor->ID : 0, 'edited_by_display_name' => $editor ? $editor->display_name : '', ) ); if ('post' == $post->post_type) { $taxonomies = $this->get_taxonomies_terms($post); $response['misc']['taxonomy_objects'] = $taxonomies['objects']; $response['misc']['taxonomy_names'] = $taxonomies['names']; $response['misc']['taxonomy_terms'] = $taxonomies['terms']; $response['misc']['taxonomy_caps'] = $taxonomies['caps']; if (!function_exists('wp_popular_terms_checklist') || !function_exists('get_terms_to_edit')) { require_once ABSPATH . 'wp-admin/includes/template.php'; require_once ABSPATH . 'wp-admin/includes/taxonomy.php'; } if (!function_exists('wp_get_post_categories')) { require_once(ABSPATH.WPINC.'/post.php'); } $categories = wp_get_post_categories($post->ID, array('fields' => 'ids')); if (!is_wp_error($categories)) { $response['misc']['categories'] = empty($categories) ? array() : $categories; $terms_to_edit = get_terms_to_edit($post->ID, 'category'); if (!empty($terms_to_edit)) { $response['misc']['categories_list'] = str_replace(',', ', ', $terms_to_edit); } $popular_ids = wp_popular_terms_checklist('category', 0, 10, false); // On WP 3.4 the "wp_terms_checklist" doesn't have an "echo" parameter and will automatically // display the rendered checklist. Therefore, we're going to pull the terms so that all // versions starting from WP 3.4 will pull the content instead of displaying them. ob_start(); // In this call we'll have to set the "echo" parameter to true so that later version of WP // will be able to catch and process it. wp_terms_checklist($post->ID, array('taxonomy' => 'category', 'popular_cats' => $popular_ids, 'echo' => true)); $popular_checklist = ob_get_contents(); ob_end_clean(); $response['misc']['categories_checklist'] = $popular_checklist; ob_start(); wp_terms_checklist($post->ID, array('taxonomy' => 'category', 'checked_ontop' => 0, 'echo' => true)); $quickedit_checklist = ob_get_contents(); ob_end_clean(); $response['misc']['categories_quickedit_checklist'] = $quickedit_checklist; } $tags = wp_get_post_tags($post->ID, array('fields' => 'ids')); if (!is_wp_error($tags)) { $response['misc']['tags'] = empty($tags) ? array() : $tags; $terms_to_edit = get_terms_to_edit($post->ID, 'post_tag'); if (!empty($terms_to_edit)) { $response['misc']['tags_list'] = str_replace(',', ', ', $terms_to_edit); } } } // Naturally, the "featured_media" will suffice when loading the image (media) in // UpdraftCentral since the value in this field is the actual image id of the featured // media used in UC. If we currently don't have an entry in the "featured_media_updraftcentral" meta, // then UC will need to download the featured media (image) for this current post/page // using the "featured_media_url" field (below) if not empty. $featured_media = get_post_meta($post->ID, 'featured_media_updraftcentral', true); if (!empty($featured_media)) { $response['misc']['featured_media'] = $featured_media; } // Retrieve featured media if currently present for the given post/page. // If present, we pull the image (media) URL in case there's a need for // UpdraftCentral to download the image upon loading the editor (e.g. the featured_media id // above no longer exists). $media_id = (int) get_post_thumbnail_id($post->ID); if (!empty($media_id)) { $response['misc']['featured_media_url'] = wp_get_attachment_url($media_id); } else { // The post/page no longer has a "featured_media" or doesn't have one currently, therefore, // we're going to set the "featured_media" and "featured_media_url" fields to both empty to // to avoid any further actions (e.g. download media). $response['misc']['featured_media'] = 0; $response['misc']['featured_media_url'] = ''; } } return $response; } /** * Changes the state/status of the submitted post(s) * * @param array $params An array of data that serves as parameters for the given request * @return array */ public function set_state($params) { $state_fields = $this->get_state_fields_by_type($this->post_type); if (empty($state_fields)) return $this->_generic_error_response('unsupported_type_on_set_state'); $error = $this->_validate_capabilities($state_fields['validation_fields']); if (!empty($error)) return $error; $result = array(); if (!empty($params['list'])) { $posts = array(); foreach ($params['list'] as $id) { $post = $this->apply_state($id, $params['action'], $this->post_type); if (!empty($post)) { array_push($posts, $post); } } if (!empty($posts)) { $result = array($state_fields['list_key'] => $posts); } } elseif (!empty($params['id'])) { $post = $this->apply_state($params['id'], $params['action'], $this->post_type); if (!empty($post)) $result = $post; } if (!empty($result)) { $response = $this->get($params); if (!empty($response['response']) && 'rpcok' === $response['response']) { $result[$state_fields['result_key']] = $response['data']; } return $this->_response($result); } else { return $this->_generic_error_response($state_fields['error_key'], array('action' => $params['action'])); } } /** * Creates new category * * @param array $params An array of data that serves as parameters for the given request * @param boolean $wrap_response Indicates whether to wrap the response based on local or UpdraftCentral calls. Default true. * @return array */ public function add_category($params, $wrap_response = true) { $error = $this->_validate_capabilities(array('manage_categories')); if (!empty($error)) return $error; $name = sanitize_text_field($params['name']); $args = array(); if (!empty($params['parent'])) { $args['parent'] = $params['parent']; } $result = wp_insert_term($name, 'category', $args); if (!is_wp_error($result)) { $term_id = $result['term_id']; $term = get_term($term_id, 'category'); $data = array(); if (!is_wp_error($term)) { $data = array( 'id' => $term->term_id, 'count' => $term->count, 'description' => $term->description, 'link' => get_term_link($term->term_id, 'category'), 'name' => $term->name, 'slug' => $term->slug, 'taxonomy' => $term->taxonomy, 'parent' => $term->parent, 'meta' => array() ); $categories = $this->get_categories(); if ($wrap_response) $data['categories'] = json_encode($categories['data']); } return $wrap_response ? $this->_response($data) : $data; } else { $error = array( 'message' => $result->get_error_message() ); return $wrap_response ? $this->_generic_error_response('post_add_category_failed', $error) : $error; } } /** * Assigns categories to a certain post object * * @param int $post_id The ID of the post object * @param array $category_ids A collection of category IDs to assign to the post object * @return void */ protected function assign_category_to_post($post_id, $category_ids) { if (!empty($category_ids)) { // Making sure that we have the correct type to use and we // don't have any redundant IDs before saving. $category_ids = array_unique(array_map('intval', $category_ids)); // Attach (new) categories to post wp_set_object_terms($post_id, $category_ids, 'category'); } else { wp_set_object_terms($post_id, get_option('default_category'), 'category'); } } /** * Creates new tag * * @param array $params An array of data that serves as parameters for the given request * @param boolean $wrap_response Indicates whether to wrap the response based on local or UpdraftCentral calls. Default true. * @return array */ public function add_tag($params, $wrap_response = true) { // N.B. Since the "manage_post_tags" capability does not exist in WP 3.4. We'll use the "manage_categories" instead. Besides, the "manage_post_tags" along with the other tag-related capabilities in the latest versions are actually mapped to the "manage_categories" capability (refer to wp-includes/capabilities.php under the "map_meta_cap" function). $error = $this->_validate_capabilities(array('manage_categories')); if (!empty($error)) return $error; $name = sanitize_text_field($params['name']); $result = wp_insert_term($name, 'post_tag'); if (!is_wp_error($result)) { $term_id = $result['term_id']; $term = get_term($term_id, 'post_tag'); $data = array(); if (!is_wp_error($term)) { $data = array( 'id' => $term->term_id, 'count' => $term->count, 'description' => $term->description, 'link' => get_term_link($term->term_id, 'post_tag'), 'name' => $term->name, 'slug' => $term->slug, 'taxonomy' => $term->taxonomy, 'meta' => array() ); $tags = $this->get_tags(); if ($wrap_response) $data['tags'] = json_encode($tags['data']); } return $wrap_response ? $this->_response($data) : $data; } else { $error = array( 'message' => $result->get_error_message() ); return $wrap_response ? $this->_generic_error_response('post_add_tag_failed', $error) : $error; } } /** * Assigns tags to a certain post object * * @param int $post_id The ID of the post object * @param array $tag_ids A collection of tag IDs to assign to the post object * @return void */ protected function assign_tag_to_post($post_id, $tag_ids) { if (!empty($tag_ids)) { // Making sure that we have the correct type to use and we // don't have any redundant IDs before saving. $tag_ids = array_unique(array_map('intval', $tag_ids)); // Attach (new) tags to post wp_set_object_terms($post_id, $tag_ids, 'post_tag'); } else { wp_set_object_terms($post_id, null, 'post_tag'); } } /** * Pre-validates data before running the save process * * @param WP_Post $post The post object to validate * @param array $params An array of data that serves as parameters for the given request * * @return array|void */ private function pre_validation($post, $params) { if (empty($post) || empty($params)) return; if (!empty($params['password'])) { if (!empty($params['sticky'])) { return $this->_generic_error_response('post_save_failed', array( 'message' => __('A post can not be sticky and have a password.'), 'args' => $params )); } if (!isset($params['sticky']) && is_sticky($post->ID)) { return $this->_generic_error_response('post_save_failed', array( 'message' => __('A sticky post can not be password protected.'), 'args' => $params )); } } if (!empty($params['sticky'])) { if (!isset($params['password']) && post_password_required($post->ID)) { return $this->_generic_error_response('post_save_failed', array( 'message' => __('A password protected post can not be set to sticky.'), 'args' => $params )); } } } /** * Saves or updates post/page information based from the submitted data * * @param array $params An array of data that serves as parameters for the given request * @return array */ public function save($params) { global $updraftcentral_host_plugin; $validation_fields = array( 'post' => array('publish_posts', 'edit_posts', 'delete_posts'), 'page' => array('publish_pages', 'edit_pages', 'delete_pages') ); if (!isset($validation_fields[$this->post_type])) return $this->_generic_error_response('unsupported_type_on_save_post'); $error = $this->_validate_capabilities($validation_fields[$this->post_type]); if (!empty($error)) return $error; if (!empty($params['id']) || !empty($params['new'])) { $args = array(); if (!empty($params['id'])) { $post = get_post($params['id']); if (!empty($post)) { $result = $this->pre_validation($post, $params); if (isset($result['response']) && 'rpcerror' == $result['response']) { return $result; } } } // post_content if (!empty($params['content'])) $args['post_content'] = $params['content']; // post_excerpt if (!empty($params['excerpt'])) $args['post_excerpt'] = $params['excerpt']; // menu_order if (isset($params['order'])) $args['menu_order'] = (int) $params['order']; // post_parent if (isset($params['parent'])) { $args['post_parent'] = empty($params['parent']) ? 0 : $params['parent']; } // post_name if (!empty($params['slug'])) $args['post_name'] = $params['slug']; // post_status if (!empty($params['status'])) { $args['post_status'] = $params['status']; } // post_title if (!empty($params['title'])) $args['post_title'] = $params['title']; // post_author if (!empty($params['author'])) $args['post_author'] = $params['author']; // comment_status if (!empty($params['comment_status'])) $args['comment_status'] = $params['comment_status']; // ping_status if (!empty($params['ping_status'])) $args['ping_status'] = $params['ping_status']; // visibility if (!empty($params['visibility'])) { switch ($params['visibility']) { case 'public': $args['post_status'] = 'publish'; $args['post_password'] = ''; break; case 'password': $args['post_status'] = 'publish'; $args['post_password'] = $params['password']; break; case 'private': $args['post_status'] = 'private'; $args['post_password'] = ''; break; default: break; } } else { if (!empty($params['password'])) { $args['post_status'] = 'publish'; $args['post_password'] = $params['password']; } elseif (isset($params['password']) && '' == $params['password']) { $args['post_status'] = 'publish'; $args['post_password'] = ''; } } // post/publish date if (!empty($params['date'])) { $datetime = strtotime($params['date']); $post_date = date('Y-m-d H:i:s', $datetime); $args['post_date'] = $post_date; $args['post_date_gmt'] = gmdate('Y-m-d H:i:s', $datetime); // We only change the status to "future" based from the submitted date if the post status // is not empty and equal to 'publish' and the date is for the coming future. if (!empty($params['status']) && 'publish' == $params['status']) { if (strtotime($post_date) > strtotime(date('Y-m-d H:i:s'))) $args['post_status'] = 'future'; } } // Make sure we have a slug/post_name generated before insert/update if (empty($params['slug']) && !empty($params['title'])) { $args['post_name'] = sanitize_title_with_dashes($params['title']); } if (!empty($params['new'])) { $args['post_type'] = $this->post_type; $post_id = wp_insert_post($args, true); } else { $args['ID'] = $params['id']; $args['post_modified'] = date('Y-m-d H:i:s'); $args['post_modified_gmt'] = gmdate('Y-m-d H:i:s'); $post_id = wp_update_post($args, true); } // We have successfully created/updated a post at this point, thus, we'll continue // with implementing the other requested processes and return the result. if (!is_wp_error($post_id)) { // sticky post if (isset($params['sticky'])) { $sticky = (bool) $params['sticky']; if ($sticky) { stick_post($post_id); } else { if (is_sticky($post_id)) { unstick_post($post_id); } } } // template if (!empty($params['template'])) { update_post_meta($post_id, '_wp_page_template', $params['template']); } // featured_media if (isset($params['featured_media'])) { if (!empty($params['featured_media'])) { $featured_media = (int) $params['featured_media']; $attach_continue = true; $url = wp_get_attachment_url($featured_media); if (!empty($url) && !empty($params['featured_media_url']) && $url == $params['featured_media_url']) { set_post_thumbnail($post_id, $featured_media); update_post_meta($post_id, 'featured_media_updraftcentral', $params['featured_media']); $attach_continue = false; } if ($attach_continue) { $featured_media_data = !empty($params['featured_media_data']) ? $params['featured_media_data'] : null; $media_id = $this->attach_remote_image($params['featured_media_url'], $featured_media_data, $post_id); if (!empty($media_id)) { // If we have a successful attachment then add reference to UC's media id update_post_meta($post_id, 'featured_media_updraftcentral', $params['featured_media']); } } } else { // Remove featured image. delete_post_meta($post_id, '_thumbnail_id'); delete_post_meta($post_id, 'featured_media_updraftcentral'); } } // categories $categories_updated = false; if (!empty($params['categories'])) { $term_ids = array(); foreach ($params['categories'] as $value) { $category = sanitize_text_field($value); $parent = 0; if (false !== strpos($category, ':')) { list($parent, $category) = explode(':', $category); $result = $this->add_category(array('name' => $category, 'parent' => $parent), false); if (!empty($result)) { array_push($term_ids, $result['id']); } } else { $term = get_term_by('id', $category, 'category'); if (!empty($term)) { $term_id = $term->term_id; array_push($term_ids, $term_id); } } } $this->assign_category_to_post($post_id, $term_ids); $categories_updated = true; } // tags $tags_updated = false; if (!empty($params['tags'])) { $term_ids = array(); foreach ($params['tags'] as $value) { $tag = sanitize_text_field($value); $field = is_numeric($tag) ? 'id' : 'name'; $term = get_term_by($field, $tag, 'post_tag'); if (!empty($term)) { $term_id = $term->term_id; array_push($term_ids, $term_id); } else { $result = $this->add_tag(array('name' => $tag), false); if (!empty($result)) { array_push($term_ids, $result['id']); } } } $this->assign_tag_to_post($post_id, $term_ids); $tags_updated = true; } // Pulling any other relevant and additional information regarding // the post before returning it in the response. $postdata = $this->get_postdata($post_id); if (!empty($params['new'])) { $timeout = !empty($params['timeout']) ? $params['timeout'] : 30; $postdata = array_merge($postdata, $this->get_preload_data($timeout, $this->post_type)); } else { if ($categories_updated || $tags_updated) { $categories = $this->get_categories(); $tags = $this->get_tags(); $postdata['preloaded'] = json_encode(array( 'categories' => $categories['data'], 'tags' => $tags['data'] )); } } $postdata['options'] = $this->get_options($this->post_type); return $this->_response($postdata); } else { // ERROR: error creating or updating post return $this->_generic_error_response('post_save_failed', array( 'message' => $post_id->get_error_message(), 'args' => $args )); } } else { // ERROR: no id parameter, invalid request return $this->_generic_error_response('post_invalid_request', array('message' => $updraftcentral_host_plugin->retrieve_show_message('parameters_missing'))); } } /** * Fetch and retrieves authors based from the submitted parameters * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function get_authors($params = array()) { global $updraftcentral_main; // If expected parameters are empty or does not exists then set them to some default values $page = !empty($params['page']) ? (int) $params['page'] : 1; $per_page = !empty($params['per_page']) ? (int) $params['per_page'] : 15; $offset = ($page - 1) * $per_page; $who = !empty($params['who']) ? $params['who'] : 'authors'; $order = !empty($params['order']) ? strtoupper($params['order']) : 'ASC'; $orderby = !empty($params['orderby']) ? $params['orderby'] : 'display_name'; $get_user_params = array( 'number' => $per_page, 'paged' => $page, 'offset' => $offset, 'order' => $order, 'orderby' => $orderby, ); // WP 5.9 deprecated the 'who' parameter and introduces the 'capability' // parameter, thus we'll be replacing the 'who' parameter in 5.9 or higher if (version_compare($updraftcentral_main->get_wordpress_version(), '5.9', '<')) { $get_user_params['who'] = $who; } else { $get_user_params['capability'] = array('edit_posts'); } $users = get_users($get_user_params); $authors = array(); $locale = get_locale(); foreach ($users as $user) { $data = array( 'user' => json_encode($this->trim_object($user)), 'misc' => array( 'link' => get_author_posts_url($user->ID, $user->user_nicename), 'locale' => function_exists('get_user_locale') ? get_user_locale($user) : $locale, 'registered_date' => date('c', strtotime($user->user_registered)), ) ); array_push($authors, $data); } return $this->_response(array( 'authors' => $authors )); } /** * Fetch and retrieves parent pages based from the submitted parameters * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function get_parent_pages($params = array()) { // If expected parameters are empty or does not exists then set them to some default values $page = !empty($params['page']) ? (int) $params['page'] : 1; $per_page = !empty($params['per_page']) ? (int) $params['per_page'] : 100; $offset = ($page - 1) * $per_page; $exclude = !empty($params['exclude']) ? $params['exclude'] : array(); $order = !empty($params['order']) ? strtoupper($params['order']) : 'ASC'; $orderby = !empty($params['orderby']) ? $params['orderby'] : 'menu_order'; $status = !empty($params['status']) ? $params['status'] : 'publish'; $args = array( 'posts_per_page' => $per_page, 'paged' => $page, 'offset' => $offset, 'post__not_in' => $exclude, 'order' => $order, 'orderby' => $orderby, 'post_type' => 'page', 'post_status' => $status, ); $query = new WP_Query($args); $posts = $query->posts; $pages = array(); if (!empty($posts)) { foreach ($posts as $post) { // Get additional information and merge with the response $postdata = $this->get_postdata($post, true); if (!empty($postdata)) array_push($pages, $this->trim_parent_info($postdata)); } } return $this->_response(array( 'pages' => $pages )); } /** * Trim down return data for parent pages * * @param array $postdata The array containing the data to process * @return array */ protected function trim_parent_info($postdata) { if (isset($postdata['post'])) { $post = json_decode($postdata['post']); $page = new stdClass(); $page->ID = $post->ID; $page->post_title = $post->post_title; $page->post_parent = $post->post_parent; $page->post_type = $post->post_type; $page->post_status = $post->post_status; $postdata['post'] = json_encode($page); } return $postdata; } /** * Retrieves pages, templates, authors, categories and tags data that will be * used as options when displayed on the editor in UpdraftCentral * * @param string $type The type of the module that the current request is processing * * @return array */ protected function get_options($type = 'post') { // Primarily used for editor consumption so we don't include trash here. Besides, // trash posts/pages aren't included as parent options. $parent_pages = $this->get_parent_pages(); $pages = $parent_pages['data']['pages']; // Add flexibility by letting users filter the default roles and add their own // custom page/post "author" role(s) if need be. $author_roles = apply_filters('updraftcentral_author_roles', array('administrator', 'editor', 'author', 'contributor')); $authors = get_users(array('role__in' => $author_roles)); if (!function_exists('get_page_templates')) { require_once(ABSPATH.'wp-admin/includes/theme.php'); } $templates = ('post' == $type) ? get_page_templates(null, 'post') : get_page_templates(); $template_options = array(); foreach ($templates as $template => $filename) { $item = array( 'filename' => $filename, 'template' => $template, ); $template_options[] = $item; } $page_options = array(); foreach ($pages as $page_item) { if (isset($page_item['post'])) { $page = json_decode($page_item['post']); $item = array( 'id' => $page->ID, 'title' => $page->post_title, 'parent' => $page->post_parent ); $page_options[] = $item; } } $author_options = array(); foreach ($authors as $user) { $item = array( 'id' => $user->ID, 'name' => $user->display_name, ); $author_options[] = $item; } $response = array( 'page' => $page_options, 'author' => $author_options, 'template' => $template_options, 'date' => $this->get_date_options($type), ); if ('post' == $type) { $categories = get_categories(array('hide_empty' => false, 'orderby' => 'name', 'order' => 'ASC')); $tags = get_tags(array('hide_empty' => false)); $category_options = array(); foreach ($categories as $category) { $item = array( 'id' => $category->term_id, 'name' => $category->name, 'parent' => $category->parent ); $category_options[] = $item; } $tag_options = array(); foreach ($tags as $tag) { $item = array( 'id' => $tag->term_id, 'name' => $tag->name, ); $tag_options[] = $item; } $response['category'] = $category_options; $response['tag'] = $tag_options; } return $response; } /** * Changes the state/status of the given post based from the submitted action/request * * @param int $id The ID of the current page to work on * @param string $action The type of change that the current request is going to apply * @param string $type The type of the module that the current request is processing * * @return array */ protected function apply_state($id, $action, $type = 'post') { if (empty($id)) return false; $post = get_post($id); if (!empty($post)) { $previous_status = $post->post_status; $deleted = false; switch ($action) { case 'draft': $args = array('ID' => $id, 'post_status' => 'draft'); wp_update_post($args); break; case 'trash': wp_trash_post($id); break; case 'publish': $args = array('ID' => $id, 'post_status' => 'publish'); wp_update_post($args); break; case 'restore': $args = array('ID' => $id, 'post_status' => 'pending'); wp_update_post($args); break; case 'delete': $result = wp_delete_post($id, true); if (!empty($result)) $deleted = true; break; default: break; } $postdata = $this->get_postdata($post); if (!empty($postdata) || $deleted) { $data = $deleted ? $id : $postdata; $result = array( 'id' => $id, 'previous_status' => $previous_status ); $result[$type] = $data; return $result; } } return false; } /** * Imports image from UpdraftCentral's page/post editor * * @param string $image_url The URL of the image to import * @param string $image_data The image data to save. If empty, image_url will be used to download the image * @param int $post_id The ID of the page where this image is to be attached * * @return integer */ protected function attach_remote_image($image_url, $image_data, $post_id) { if (empty($image_url) || empty($post_id)) return; $image = pathinfo($image_url); $image_name = $image['basename']; $upload_dir = wp_upload_dir(); if (empty($image_data)) { $response = wp_remote_get($image_url); if (!is_wp_error($response)) { $image_data = wp_remote_retrieve_body($response); } } else { $image_data = base64_decode($image_data); } $media_id = 0; if (!empty($image_data)) { $unique_file_name = wp_unique_filename($upload_dir['path'], $image_name); $filename = basename($unique_file_name); if (wp_mkdir_p($upload_dir['path'])) { $file = $upload_dir['path'] . '/' . $filename; } else { $file = $upload_dir['basedir'] . '/' . $filename; } file_put_contents($file, $image_data); $wp_filetype = wp_check_filetype($filename, null); $attachment = array( 'post_mime_type' => $wp_filetype['type'], 'post_title' => sanitize_file_name($filename), 'post_content' => '', 'post_status' => 'inherit' ); $media_id = wp_insert_attachment($attachment, $file, $post_id); require_once(ABSPATH . 'wp-admin/includes/image.php'); $attach_data = wp_generate_attachment_metadata($media_id, $file); wp_update_attachment_metadata($media_id, $attach_data); set_post_thumbnail($post_id, $media_id); } return $media_id; } /** * Checks whether we have the required fields submitted and the user has * the capabilities to execute the requested action * * @param array $capabilities The capabilities to check and validate * * @return array|void */ protected function _validate_capabilities($capabilities) { foreach ($capabilities as $capability) { if (!current_user_can($capability)) return $this->_generic_error_response('insufficient_permission'); } } } PKwL\h4h4)updraftplus/central/modules/analytics.phpnu[auth_endpoint = defined('UPDRAFTPLUS_GOOGLECLOUD_CALLBACK_URL') ? UPDRAFTPLUS_GOOGLECLOUD_CALLBACK_URL : 'https://auth.updraftplus.com/auth/googleanalytics'; $this->client_id = defined('UPDRAFTPLUS_GOOGLECLOUD_CLIENT_ID') ? UPDRAFTPLUS_GOOGLECLOUD_CLIENT_ID : '306245874349-6s896c3tjpra26ns3dpplhqcl6rv6qlb.apps.googleusercontent.com'; // Set transient expiration - default for 24 hours $this->expiration = 86400; } /** * Checks whether Google Analytics (GA) is installed or setup * * N.B. This check assumes GA is installed either using "wp_head" or "wp_footer" (e.g. attached * to the or somewhere before ). It does not recursively check all the pages * of the website to find if GA is installed on each or one of those pages, but only on the main/root page. * * @return array $result An array containing "ga_installed" property which returns "true" if GA (Google Analytics) is installed, "false" otherwise. */ public function ga_checker() { try { // Retrieves the tracking code/id if available $tracking_id = $this->get_tracking_id(); $installed = true; // If tracking code/id is currently not available then we // parse the needed information from the buffered content through // the "wp_head" and "wp_footer" hooks. if (false === $tracking_id) { $info = $this->extract_tracking_id(); $installed = $info['installed']; $tracking_id = $info['tracking_id']; } // Get access token to be use to generate the report. $access_token = $this->_get_token(); if (empty($access_token)) { // If we don't get a valid access token then that would mean // the access has been revoked by the user or UpdraftCentral was not authorized yet // to access the user's analytics data, thus, we're clearing // any previously stored user access so we're doing some housekeeping here. $this->clear_user_access(); } // Wrap and combined information for the requesting // client's consumption $result = array( 'ga_installed' => $installed, 'tracking_id' => $tracking_id, 'client_id' => $this->client_id, 'redirect_uri' => $this->auth_endpoint, 'scope' => $this->scope, 'access_token' => $access_token, 'endpoint' => $this->endpoint ); } catch (Exception $e) { $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage())); } return $this->_response($result); } /** * Extracts Google Tracking ID from contents rendered through the "wp_head" and "wp_footer" action hooks * * @internal * @return array $result An array containing the result of the extraction. */ private function extract_tracking_id() { // Define result array $result = array(); // Retrieve header content ob_start(); do_action('wp_head'); $header_content = ob_get_clean(); // Extract analytics information if available. $output = $this->parse_content($header_content); $result['installed'] = $output['installed']; $result['tracking_id'] = $output['tracking_id']; // If it was not found, then now try the footer if (empty($result['tracking_id'])) { // Retrieve footer content ob_start(); do_action('wp_footer'); $footer_content = ob_get_clean(); $output = $this->parse_content($footer_content); $result['installed'] = $output['installed']; $result['tracking_id'] = $output['tracking_id']; } if (!empty($result['tracking_id'])) { set_transient($this->tracking_id_key, $result['tracking_id'], $this->expiration); } return $result; } /** * Gets access token * * Validates whether the system currently have a valid token to use when connecting to Google Analytics API. * If not, then it will send a token request based on the authorization code we stored during the * authorization phase. Otherwise, it will return an empty token. * * @return array $result An array containing the Google Analytics API access token. */ public function get_access_token() { try { // Loads or request a valid token to use $access_token = $this->_get_token(); if (!empty($access_token)) { $result = array('access_token' => $access_token); } else { $result = array('error' => true, 'message' => 'ga_token_retrieval_failed', 'values' => array()); } } catch (Exception $e) { $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage())); } return $this->_response($result); } /** * Clears any previously stored user access * * @return bool */ public function clear_user_access() { return delete_option($this->access_key); } /** * Saves user is and access token received from the auth server * * @param array $query Parameter array containing the user id and access token from the auth server. * @return array $result An array containing a "success" or "failure" message as a result of the current process. */ public function save_user_access($query) { try { $token = get_option($this->access_key, false); $result = array(); if (false === $token) { $token = array( 'user_id' => base64_decode(urldecode($query['user_id'])), 'access_token' => base64_decode(urldecode($query['access_token'])) ); if (false !== update_option($this->access_key, $token)) { $result = array('error' => false, 'message' => 'ga_access_saved', 'values' => array()); } else { $result = array('error' => true, 'message' => 'ga_access_saving_failed', 'values' => array($query['access_token'])); } } } catch (Exception $e) { $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage())); } return $this->_response($result); } /** * Saves the tracking code/id manually (user input) * * @param array $query Parameter array containing the tracking code/id to save. * @return array $result An array containing the result of the process. */ public function save_tracking_id($query) { try { $tracking_id = $query['tracking_id']; $saved = false; if (!empty($tracking_id)) { $saved = set_transient($this->tracking_id_key, $tracking_id, $this->expiration); } $result = array('saved' => $saved); } catch (Exception $e) { $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage())); } return $this->_response($result); } /** * Retrieves any available access token either previously saved info or * from a new request from the Google Server. * * @internal * @return string $authorization_code */ private function _get_token() { // Retrieves the tracking code/id if available $tracking_id = $this->get_tracking_id(); $access_token = ''; $token = get_option($this->access_key, false); if (false !== $token) { $access_token = isset($token['access_token']) ? $token['access_token'] : ''; $user_id = isset($token['user_id']) ? $token['user_id'] : ''; if ((!empty($access_token) && !$this->_token_valid($access_token)) || (!empty($user_id) && empty($access_token) && !empty($tracking_id))) { if (!empty($user_id)) { $args = array( 'headers' => apply_filters('updraftplus_auth_headers', array()) ); $response = wp_remote_get($this->auth_endpoint.'?user_id='.$user_id.'&code=ud_googleanalytics_code', $args); if (is_wp_error($response)) { throw new Exception($response->get_error_message()); } else { if (is_array($response)) { $body = json_decode($response['body'], true); $token_response = array(); if (is_array($body) && !isset($body['error'])) { $token_response = json_decode(base64_decode($body[0]), true); } if (is_array($token_response) && isset($token_response['access_token'])) { $access_token = $token_response['access_token']; } else { // If we don't get any valid response then that would mean that the // permission was already revoked. Thus, we need to re-authorize the // user before using the analytics feature once again. $access_token = ''; } $token['access_token'] = $access_token; update_option($this->access_key, $token); } } } } } return $access_token; } /** * Verifies whether the access token is still valid for use * * @internal * @param string $token The access token to be check and validated * @return bool * @throws Exception If an error has occurred while connecting to the Google Server. */ private function _token_valid($token) { $response = wp_remote_get($this->token_info_endpoint.'?access_token='.$token); if (is_wp_error($response)) { throw new Exception($response->get_error_message()); } else { if (is_array($response)) { $response = json_decode($response['body'], true); if (!empty($response)) { if (!isset($response['error']) && !isset($response['error_description'])) { return true; } } } } return false; } /** * Parses and extracts the google analytics information (NEEDED) * * @internal * @param string $content The content to parse * @return array An array containing the status of the process along with the tracking code/id */ private function parse_content($content) { $installed = false; $gtm_installed = false; $tracking_id = ''; $script_file_found = false; $tracking_id_found = false; // Pull google analytics script file(s) preg_match_all('/]*>([\s\S]*?)<\/script>/i', $content, $scripts); for ($i=0; $i < count($scripts[0]); $i++) { // Check for Google Analytics file if (stristr($scripts[0][$i], 'ga.js') || stristr($scripts[0][$i], 'analytics.js')) { $script_file_found = true; } // Check for Google Tag Manager file // N.B. We are not checking for GTM but this check will be useful when // showing the notice to the user if we haven't found Google Analytics // directly being installed on the page. if (stristr($scripts[0][$i], 'gtm.js')) { $gtm_installed = true; } } // Pull tracking code preg_match_all('/UA-[0-9]{5,}-[0-9]{1,}/i', $content, $codes); if (count($codes) > 0) { if (!empty($codes[0])) { $tracking_id_found = true; $tracking_id = $codes[0][0]; } } // If we found both the script and the tracking code then it is safe // to say that Google Analytics (GA) is installed. Thus, we're returning // "true" as a response. if ($script_file_found && $tracking_id_found) { $installed = true; } // Return result of process. return array( 'installed' => $installed, 'gtm_installed' => $gtm_installed, 'tracking_id' => $tracking_id ); } /** * Retrieves the "analytics_tracking_id" transient * * @internal * @return mixed Returns the value of the saved transient. Returns "false" if the transient does not exist. */ private function get_tracking_id() { return get_transient($this->tracking_id_key); } /** * Returns the current tracking id * * @return array $result An array containing the Google Tracking ID. */ public function get_current_tracking_id() { try { // Get current site transient stored for this key $tracking_id = get_transient($this->tracking_id_key); // Checks whether we have a valid token $access_token = $this->_get_token(); if (empty($access_token)) { $tracking_id = ''; } if (false === $tracking_id) { $result = $this->extract_tracking_id(); } else { $result = array( 'installed' => true, 'tracking_id' => $tracking_id ); } } catch (Exception $e) { $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage())); } return $this->_response($result); } /** * Clears user access from database * * @return array $result An array containing the "Remove" confirmation whether the action succeeded or not. */ public function remove_user_access() { try { // Clear user access $is_cleared = $this->clear_user_access(); if (false !== $is_cleared) { $result = array('removed' => true); } else { $result = array('error' => true, 'message' => 'user_access_remove_failed', 'values' => array()); } } catch (Exception $e) { $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage())); } return $this->_response($result); } } PKwL\]-NN%updraftplus/central/modules/media.phpnu[switched = switch_to_blog($blog_id); } } /** * Function that gets called after every action * * @param string $command a string that corresponds to UDC command to call a certain method for this class. * @param array $data an array of data post or get fields * @param array $extra_info extrainfo use in the udrpc_action, e.g. user_id * * link to udrpc_action main function in class UpdraftCentral_Listener */ public function _post_action($command, $data, $extra_info) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameter is present because the caller from UpdraftCentral_Listener class uses 3 arguments. // Here, we're restoring to the current (default) blog before we switched if ($this->switched) restore_current_blog(); } /** * Fetch and retrieves posts based from the submitted parameters * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function get_media_items($params) { $error = $this->_validate_capabilities(array('upload_files', 'edit_posts')); if (!empty($error)) return $error; // check paged parameter; if empty set to defaults $paged = !empty($params['paged']) ? (int) $params['paged'] : 1; $numberposts = !empty($params['numberposts']) ? (int) $params['numberposts'] : 10; $offset = ($paged - 1) * $numberposts; $args = array( 'posts_per_page' => $numberposts, 'paged' => $paged, 'offset' => $offset, 'post_type' => 'attachment', 'post_status' => 'inherit', ); if (!empty($params['keyword'])) { $args['s'] = $params['keyword']; } if (!empty($params['category'])) { if (in_array($params['category'], array('detached', 'unattached'))) { $attachment_ids = $this->get_unattached_ids(); } else { $attachment_ids = $this->get_type_ids($params['category']); } $args['post__in'] = $attachment_ids; } if (!empty($params['date'])) { list($monthnum, $year) = explode(':', $params['date']); $args['monthnum'] = $monthnum; $args['year'] = $year; } $query = new WP_Query($args); $result = $query->posts; $count_posts = (int) $query->found_posts; $page_count = 0; if ($count_posts > 0) { $page_count = absint($count_posts / $numberposts); $remainder = absint($count_posts % $numberposts); $page_count = ($remainder > 0) ? ++$page_count : $page_count; } $info = array( 'page' => $paged, 'pages' => $page_count, 'results' => $count_posts, 'items_from' => (($paged * $numberposts) - $numberposts) + 1, 'items_to' => ($paged == $page_count) ? $count_posts : $paged * $numberposts, ); $media_items = array(); if (!empty($result)) { foreach ($result as $item) { $media = $this->get_media_item($item, null, true); if (!empty($media)) { array_push($media_items, $media); } } } $response = array( 'items' => $media_items, 'has_image_editor' => $this->has_image_editor(isset($media_items[0]) ? $media_items[0] : null), 'info' => $info, 'options' => array( 'date' => $this->get_date_options(), 'type' => $this->get_type_options() ) ); return $this->_response($response); } /** * Check whether we have an image editor (e.g. GD, Imagick, etc.) set in place to handle the basic editing * functions such as rotate, crop, etc. If not, then we hide that feature in UpdraftCentral * * @param object $media The media item/object to check * @return boolean */ private function has_image_editor($media) { // Most of the time image library are enabled by default in the php.ini but there's a possbility that users don't // enable them as they have no need for them at the moment or for some other reasons. Thus, we need to confirm // that here through the wp_get_image_editor method. $has_image_editor = true; if (!empty($media)) { if (!function_exists('wp_get_image_editor')) { require_once(ABSPATH.'wp-includes/media.php'); } if (!function_exists('_load_image_to_edit_path')) { require_once(ABSPATH.'wp-admin/includes/image.php'); } $image_editor = wp_get_image_editor(_load_image_to_edit_path($media->ID)); if (is_wp_error($image_editor)) { $has_image_editor = false; } } return $has_image_editor; } /** * Fetch a single media item information * * @param array $params Containing all the needed information to filter the results of the current request * @param array|null $extra_info Additional information from the current request * @param boolean $raw If set, returns the result of the fetch process unwrapped by the response array * @return array */ public function get_media_item($params, $extra_info = null, $raw = false) { $error = $this->_validate_capabilities(array('upload_files', 'edit_posts')); if (!empty($error)) return $error; // Raw means that we need to return the result without wrapping it // with the "$this->_response" function which indicates that the call // was done locally (within the class) and not directly from UpdraftCentral. if ($raw && is_object($params) && isset($params->ID)) { $media = $params; } elseif (is_array($params) && !empty($params['id'])) { $media = get_post($params['id']); } if (!function_exists('get_post_mime_types')) { global $updraftcentral_main; // For a much later version of WP the "get_post_mime_types" is located // in a different folder. So, we make sure that we have it loaded before // actually using it. if (version_compare($updraftcentral_main->get_wordpress_version(), '3.5', '>=')) { require_once(ABSPATH.WPINC.'/post.php'); } else { // For WP 3.4, the "get_post_mime_types" is located in the location provided below. require_once(ABSPATH.'wp-admin/includes/post.php'); } } if (!function_exists('wp_image_editor')) { require_once(ABSPATH.'wp-admin/includes/image-edit.php'); } if (!function_exists('get_media_item')) { require_once(ABSPATH.'wp-admin/includes/template.php'); require_once(ABSPATH.'wp-admin/includes/media.php'); } if ($media) { $thumb = wp_get_attachment_image_src($media->ID, 'thumbnail', true); if (!empty($thumb)) $media->thumb_url = $thumb[0]; $media->url = wp_get_attachment_url($media->ID); $media->parent_post_title = get_the_title($media->post_parent); $media->author = get_the_author_meta('display_name', $media->post_author); $media->filename = basename($media->url); $media->date = date('Y/m/d', strtotime($media->post_date)); $media->upload_date = mysql2date(get_option('date_format'), $media->post_date); $media->filesize = 0; $file = get_attached_file($media->ID); if (!empty($file) && file_exists($file)) { $media->filesize = size_format(filesize($file)); } $media->nonce = wp_create_nonce('image_editor-'.$media->ID); if (false !== strpos($media->post_mime_type, 'image/')) { $meta = wp_get_attachment_metadata($media->ID); $thumb = image_get_intermediate_size($media->ID, 'thumbnail'); $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']); // Pulling details $sizer = 1; if (isset($meta['width'], $meta['height'])) { $big = max($meta['width'], $meta['height']); $sizer = $big > 400 ? 400 / $big : 1; } $constrained_dims = array(); if ($thumb && $sub_sizes) { $constrained_dims = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120); } $rotate_supported = false; if (function_exists('imagerotate') || wp_image_editor_supports(array('mime_type' => get_post_mime_type($media->ID), 'methods' => array('rotate')))) { $rotate_supported = true; } // Check for alternative text if present $alt = get_post_meta($media->ID, '_wp_attachment_image_alt', true); $media->alt = !empty($alt) ? $alt : ''; // Check whether edited images are restorable $backup_sizes = get_post_meta($media->ID, '_wp_attachment_backup_sizes', true); $can_restore = !empty($backup_sizes) && isset($backup_sizes['full-orig']) && basename($meta['file']) != $backup_sizes['full-orig']['file']; $image_edit_overwrite = (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) ? 0 : 1; $media->misc = array( 'sizer' => $sizer, 'rand' => rand(1, 99999), 'constrained_dims' => $constrained_dims, 'rotate_supported' => (int) $rotate_supported, 'thumb' => $thumb, 'meta' => $meta, 'alt_text' => $alt, 'can_restore' => $can_restore, 'image_edit_overwrite' => $image_edit_overwrite ); } } return $raw ? $media : $this->_response(array('item' => $media)); } /** * Fetch and retrieves posts based from the submitted parameters * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function get_posts($params) { $error = $this->_validate_capabilities(array('edit_posts')); if (!empty($error)) return $error; // check paged parameter; if empty set to defaults $paged = !empty($params['paged']) ? (int) $params['paged'] : 1; $numberposts = !empty($params['numberposts']) ? (int) $params['numberposts'] : 10; $offset = ($paged - 1) * $numberposts; $args = array( 'posts_per_page' => $numberposts, 'paged' => $paged, 'offset' => $offset, 'post_type' => 'post', 'post_status' => 'publish,private,draft,pending,future', ); if (!empty($params['keyword'])) { $args['s'] = $params['keyword']; } $query = new WP_Query($args); $result = $query->posts; $count_posts = (int) $query->found_posts; $page_count = 0; if ($count_posts > 0) { $page_count = absint($count_posts / $numberposts); $remainder = absint($count_posts % $numberposts); $page_count = ($remainder > 0) ? ++$page_count : $page_count; } $info = array( 'page' => $paged, 'pages' => $page_count, 'results' => $count_posts, 'items_from' => (($paged * $numberposts) - $numberposts) + 1, 'items_to' => ($paged == $page_count) ? $count_posts : $paged * $numberposts, ); $posts = array(); if (!empty($result)) { foreach ($result as $post) { array_push($posts, array('ID' => $post->ID, 'title' => $post->post_title)); } } $response = array( 'posts' => $posts, 'info' => $info ); return $this->_response($response); } /** * Saves media changes from UpdraftCentral * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function save_media_item($params) { $error = $this->_validate_capabilities(array('upload_files', 'edit_posts')); if (!empty($error)) return $error; $args = array( 'post_title' => $params['image_title'], 'post_excerpt' => $params['image_caption'], 'post_content' => $params['image_description'] ); if (!empty($params['new'])) { $args['post_type'] = 'attachment'; $media_id = wp_insert_post($args, true); } else { $args['ID'] = $params['id']; $args['post_modified'] = date('Y-m-d H:i:s'); $args['post_modified_gmt'] = gmdate('Y-m-d H:i:s'); $media_id = wp_update_post($args, true); } if (!empty($media_id)) { // Update alternative text if not empty if (!empty($params['image_alternative_text'])) { update_post_meta($media_id, '_wp_attachment_image_alt', $params['image_alternative_text']); } $result = array( 'status' => 'success', 'item' => $this->get_media_item(array('id' => $media_id), null, true) ); } else { $result = array('status' => 'failed'); } return $this->_response($result); } /** * Executes media action (e.g. attach, detach and delete) * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function execute_media_action($params) { global $updraftcentral_host_plugin; $error = $this->_validate_capabilities(array('upload_files', 'edit_posts')); if (!empty($error)) return $error; $result = array(); switch ($params['do']) { case 'attach': global $wpdb; $query_result = $wpdb->query($wpdb->prepare("UPDATE {$wpdb->posts} SET `post_parent` = %d WHERE `post_type` = 'attachment' AND ID = %d", $params['parent_id'], $params['id'])); if (false === $query_result) { $result['error'] = $updraftcentral_host_plugin->retrieve_show_message('failed_to_attach_media'); } else { $result['msg'] = $updraftcentral_host_plugin->retrieve_show_message('media_attached'); } break; case 'detach': global $wpdb; $query_result = $wpdb->query($wpdb->prepare("UPDATE {$wpdb->posts} SET `post_parent` = 0 WHERE `post_type` = 'attachment' AND ID = %d", $params['id'])); if (false === $query_result) { $result['error'] = $updraftcentral_host_plugin->retrieve_show_message('failed_to_detach_media'); } else { $result['msg'] = $updraftcentral_host_plugin->retrieve_show_message('media_detached'); } break; case 'delete': $failed_items = array(); foreach ($params['ids'] as $id) { // Delete permanently if (false === wp_delete_attachment($id, true)) { $failed_items[] = $id; } } if (!empty($failed_items)) { $result['error'] = $updraftcentral_host_plugin->retrieve_show_message('failed_to_delete_media'); $result['items'] = $failed_items; } else { $result['msg'] = $updraftcentral_host_plugin->retrieve_show_message('selected_media_deleted'); } break; default: break; } return $this->_response($result); } /** * Retrieves a collection of formatted dates found for the given post statuses. * It will be used as options for the date filter when managing the media items in UpdraftCentral. * * @return array */ private function get_date_options() { global $wpdb; $options = array(); $date_options = $wpdb->get_col("SELECT DATE_FORMAT(`post_date`, '%M %Y') as `formatted_post_date` FROM {$wpdb->posts} WHERE `post_type` = 'attachment' AND `post_status` = 'inherit' GROUP BY `formatted_post_date` ORDER BY `post_date` DESC"); if (!empty($date_options)) { foreach ($date_options as $monthyear) { $timestr = strtotime($monthyear); $options[] = array('label' => date('F Y', $timestr), 'value' => date('n:Y', $timestr)); } } return $options; } /** * Retrieves mime types that will be use as filter option in UpdraftCentral * * @return array */ private function get_type_options() { global $wpdb, $updraftcentral_host_plugin, $updraftcentral_main; $options = array(); if (!function_exists('get_post_mime_types')) { // For a much later version of WP the "get_post_mime_types" is located // in a different folder. So, we make sure that we have it loaded before // actually using it. if (version_compare($updraftcentral_main->get_wordpress_version(), '3.5', '>=')) { require_once(ABSPATH.WPINC.'/post.php'); } else { // For WP 3.4, the "get_post_mime_types" is located in the location provided below. require_once(ABSPATH.'wp-admin/includes/post.php'); } } $post_mime_types = get_post_mime_types(); $type_options = $wpdb->get_col("SELECT `post_mime_type` FROM {$wpdb->posts} WHERE `post_type` = 'attachment' AND `post_status` = 'inherit' GROUP BY `post_mime_type` ORDER BY `post_mime_type` DESC"); foreach ($post_mime_types as $mime_type => $label) { if (!wp_match_mime_types($mime_type, $type_options)) continue; $options[] = array('label' => $label[0], 'value' => esc_attr($mime_type)); } $options[] = array('label' => $updraftcentral_host_plugin->retrieve_show_message('unattached'), 'value' => 'detached'); return $options; } /** * Retrieves media items that haven't been attached to any posts * * @return array */ private function get_unattached_ids() { global $wpdb; return $wpdb->get_col("SELECT `ID` FROM {$wpdb->posts} WHERE `post_type` = 'attachment' AND `post_status` = 'inherit' AND `post_parent` = '0'"); } /** * Retrieves IDs of media items that has the given mime type * * @param string $type The mime type to search for * @return array */ private function get_type_ids($type) { global $wpdb; return $wpdb->get_col($wpdb->prepare("SELECT `ID` FROM {$wpdb->posts} WHERE `post_type` = 'attachment' AND `post_status` = 'inherit' AND `post_mime_type` LIKE %s", $type.'/%')); } /** * Checks whether we have the required fields submitted and the user has * the capabilities to execute the requested action * * @param array $capabilities The capabilities to check and validate * * @return array|void */ private function _validate_capabilities($capabilities) { foreach ($capabilities as $capability) { if (!current_user_can($capability)) { return $this->_generic_error_response('insufficient_permission'); } } } /** * Populates the $_REQUEST global variable with the submitted data * * @param array $params Submitted data received from UpdraftCentral * @return array */ private function populate_request($params) { if (!empty($params)) { foreach ($params as $key => $value) { $_REQUEST[$key] = $value; } } } /** * Handles image editing requests coming from UpdraftCentral * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function image_editor($params) { $error = $this->_validate_capabilities(array('edit_posts')); if (!empty($error)) return $error; $attachment_id = (int) $params['postid']; $this->populate_request($params); if (!function_exists('load_image_to_edit')) { require_once(ABSPATH.'wp-admin/includes/image.php'); } include_once(ABSPATH.'wp-admin/includes/image-edit.php'); $msg = false; switch ($params['do']) { case 'save': case 'scale': $msg = wp_save_image($attachment_id); break; case 'restore': $msg = wp_restore_image($attachment_id); break; } $msg = (false !== $msg) ? json_encode($msg) : $msg; return $this->_response(array('content' => $msg)); } /** * Handles image preview requests coming from UpdraftCentral * * @param array $params Containing all the needed information to filter the results of the current request * @return array */ public function image_preview($params) { $error = $this->_validate_capabilities(array('edit_posts')); if (!empty($error)) return $error; if (!function_exists('load_image_to_edit')) { require_once(ABSPATH.'wp-admin/includes/image.php'); } include_once(ABSPATH.'wp-admin/includes/image-edit.php'); $this->populate_request($params); $post_id = (int) $params['postid']; ob_start(); stream_preview_image($post_id); $content = ob_get_contents(); ob_end_clean(); return $this->_response(array('content' => base64_encode($content))); } } PKwL\FJ==$updraftplus/central/modules/core.phpnu[ (string - a code), 'data' => (mixed)); * * RPC commands are not allowed to begin with an underscore. So, any private methods can be prefixed with an underscore. */ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands { /** * Executes a list of submitted commands (multiplexer) * * @param Array $query An array containing the commands to execute and a flag to indicate how to handle command execution failure. * @return Array An array containing the results of the process. */ public function execute_commands($query) { try { $commands = $query['commands']; $command_results = array(); $error_count = 0; /** * Should be one of the following options: * 1 = Abort on first failure * 2 = Abort if any command fails * 3 = Abort if all command fails (default) */ $error_flag = isset($query['error_flag']) ? (int) $query['error_flag'] : 3; foreach ($commands as $command => $params) { $command_info = apply_filters('updraftcentral_get_command_info', false, $command); if (!$command_info) { list($_prefix, $_command) = explode('.', $command); $command_results[$_prefix][$_command] = array('response' => 'rpcerror', 'data' => array('code' => 'unknown_rpc_command', 'data' => $command)); $error_count++; if (1 === $error_flag) break; } else { $action = $command_info['command']; $command_php_class = $command_info['command_php_class']; // Instantiate the command class and execute the needed action if (class_exists($command_php_class)) { $instance = new $command_php_class($this->rc); if (method_exists($instance, $action)) { $params = empty($params) ? array() : $params; $call_result = call_user_func(array($instance, $action), $params); $command_results[$command] = $call_result; if ('rpcerror' === $call_result['response'] || (isset($call_result['data']['error']) && $call_result['data']['error'])) { $error_count++; if (1 === $error_flag) break; } } } } } if (0 !== $error_count) { // N.B. These error messages should be defined in UpdraftCentral's translation file (dashboard-translations.php) // before actually using this multiplexer function. $message = 'general_command_execution_error'; switch ($error_flag) { case 1: $message = 'command_execution_aborted'; break; case 2: $message = 'failed_to_execute_some_commands'; break; case 3: if (count($commands) === $error_count) { $message = 'failed_to_execute_all_commands'; } break; default: break; } $result = array('error' => true, 'message' => $message, 'values' => $command_results); } else { $result = $command_results; } } catch (Exception $e) { $result = array('error' => true, 'message' => $e->getMessage()); } return $this->_response($result); } /** * Validates the credentials entered by the user * * @param array $creds an array of filesystem credentials * @return array An array containing the result of the validation process. */ public function validate_credentials($creds) { try { $entity = $creds['entity']; if (isset($creds['filesystem_credentials'])) { parse_str($creds['filesystem_credentials'], $filesystem_credentials); if (is_array($filesystem_credentials)) { foreach ($filesystem_credentials as $key => $value) { // Put them into $_POST, which is where request_filesystem_credentials() checks for them. $_POST[$key] = $value; } } } // Include the needed WP Core file(s) // template.php needed for submit_button() which is called by request_filesystem_credentials() $this->_admin_include('file.php', 'template.php'); // Directory entities that we currently need permissions // to update. $entity_directories = array( 'plugins' => WP_PLUGIN_DIR, 'themes' => WP_CONTENT_DIR.'/themes', 'core' => untrailingslashit(ABSPATH) ); if ('translations' === $entity) { // 'en_US' don't usually have the "languages" folder, thus, we // check if there's a need to ask for filesystem credentials for that // folder if it exists, most especially for locale other than 'en_US'. $language_dir = WP_CONTENT_DIR.'/languages'; if ('en_US' !== get_locale() && is_dir($language_dir)) { $entity_directories['translations'] = $language_dir; } } $url = wp_nonce_url(site_url()); $passed = false; if (isset($entity_directories[$entity])) { $directory = $entity_directories[$entity]; // Check if credentials are valid and have sufficient // privileges to create and delete (e.g. write) ob_start(); $credentials = request_filesystem_credentials($url, '', false, $directory); ob_end_clean(); // The "WP_Filesystem" will suffice in validating the inputted credentials // from UpdraftCentral, as it is already attempting to connect to the filesystem // using the chosen transport (e.g. ssh, ftp, etc.) $passed = WP_Filesystem($credentials, $directory); } if ($passed) { $result = array('error' => false, 'message' => 'credentials_ok', 'values' => array()); } else { // We're adding some useful error information to help troubleshooting any problems // that may arise in the future. If the user submitted a wrong password or username // it usually falls through here. global $wp_filesystem; $errors = array(); if (isset($wp_filesystem->errors) && is_wp_error($wp_filesystem->errors)) { $errors = $wp_filesystem->errors->errors; } $result = array('error' => true, 'message' => 'failed_credentials', 'values' => array('errors' => $errors)); } } catch (Exception $e) { $result = array('error' => true, 'message' => $e->getMessage(), 'values' => array()); } return $this->_response($result); } /** * Gets the FileSystem Credentials * * Extract the needed filesystem credentials (permissions) to be used * to update/upgrade the plugins, themes and the WP core. * * @return array $result - An array containing the creds form and some flags * to determine whether we need to extract the creds * manually from the user. */ public function get_credentials() { try { // Check whether user has enough permission to update entities if (!current_user_can('update_plugins') && !current_user_can('update_themes') && !current_user_can('update_core')) return $this->_generic_error_response('updates_permission_denied'); // Include the needed WP Core file(s) $this->_admin_include('file.php', 'template.php'); // A container that will hold the state (in this case, either true or false) of // each directory entities (plugins, themes, core) that will be used to determine // whether or not there's a need to show a form that will ask the user for their credentials // manually. $request_filesystem_credentials = array(); // A container for the filesystem credentials form if applicable. $filesystem_form = ''; // Directory entities that we currently need permissions // to update. $check_fs = array( 'plugins' => WP_PLUGIN_DIR, 'themes' => WP_CONTENT_DIR.'/themes', 'core' => untrailingslashit(ABSPATH) ); // Here, we're looping through each entities and find output whether // we have sufficient permissions to update objects belonging to them. foreach ($check_fs as $entity => $dir) { // We're determining which method to use when updating // the files in the filesystem. $filesystem_method = get_filesystem_method(array(), $dir); // Buffering the output to pull the actual credentials form // currently being used by this WP instance if no sufficient permissions // is found. $url = wp_nonce_url(site_url()); ob_start(); $filesystem_credentials_are_stored = request_filesystem_credentials($url, $filesystem_method); $form = strip_tags(ob_get_contents(), '');e&&s.append("

"+e+"

"),t&&s.append("

"+t+"

"),void 0===o&&(o=3e3),i(),s.css("opacity"),s.on("mouseover",function(){i({fadeIn:0,timeout:3e4});var e=p(".blockMsg");e.stop(),e.fadeTo(300,1)}).on("mouseout",function(){p(".blockMsg").fadeOut(1e3)})},p.fn.block=function(e){var t;return this[0]===window?(p.blockUI(e),this):(t=p.extend({},p.blockUI.defaults,e||{}),this.each(function(){var e=p(this);t.ignoreIfBlocked&&e.data("blockUI.isBlocked")||e.unblock({fadeOut:0})}),this.each(function(){"static"==p.css(this,"position")&&(this.style.position="relative",p(this).data("blockUI.static",!0)),this.style.zoom=1,o(this,e)}))},p.fn.unblock=function(e){return this[0]===window?(p.unblockUI(e),this):this.each(function(){v(this,e)})},p.blockUI.version=2.7,p.blockUI.defaults={message:"

Please wait...

",title:null,draggable:!0,theme:!1,css:{padding:0,margin:0,width:"30%",top:"40%",left:"35%",textAlign:"center",color:"#000",border:"3px solid #aaa",backgroundColor:"#fff",cursor:"wait"},themedCSS:{width:"30%",top:"40%",left:"35%"},overlayCSS:{backgroundColor:"#000",opacity:.6,cursor:"wait"},cursorReset:"default",growlCSS:{width:"350px",top:"10px",left:"",right:"10px",border:"none",padding:"5px",opacity:.6,cursor:"default",color:"#fff",backgroundColor:"#000","-webkit-border-radius":"10px","-moz-border-radius":"10px","border-radius":"10px"},iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank",forceIframe:!1,baseZ:1e3,centerX:!0,centerY:!0,allowBodyStretch:!0,bindEvents:!0,constrainTabKey:!0,fadeIn:200,fadeOut:400,timeout:0,showOverlay:!0,focusInput:!0,focusableElements:":input:enabled:visible",onBlock:null,onUnblock:null,onOverlayClick:null,quirksmodeOffsetHack:4,blockMsgClass:"blockMsg",ignoreIfBlocked:!1},null),g=[];function o(e,o){var n,i,t,s,l,a,d,c,r,u=e==window,f=o&&void 0!==o.message?o.message:void 0;(o=p.extend({},p.blockUI.defaults,o||{})).ignoreIfBlocked&&p(e).data("blockUI.isBlocked")||(o.overlayCSS=p.extend({},p.blockUI.defaults.overlayCSS,o.overlayCSS||{}),l=p.extend({},p.blockUI.defaults.css,o.css||{}),o.onOverlayClick&&(o.overlayCSS.cursor="pointer"),a=p.extend({},p.blockUI.defaults.themedCSS,o.themedCSS||{}),f=void 0===f?o.message:f,u&&y&&v(window,{fadeOut:0}),f&&"string"!=typeof f&&(f.parentNode||f.jquery)&&(r=f.jquery?f[0]:f,t={},p(e).data("blockUI.history",t),t.el=r,t.parent=r.parentNode,t.display=r.style.display,t.position=r.style.position,t.parent)&&t.parent.removeChild(r),p(e).data("blockUI.onUnblock",o.onUnblock),t=o.baseZ,r=h||o.forceIframe?p(''):p(''),c=o.theme?p(''):p(''),o.theme&&u?(d=''):o.theme?(d=''):d=u?'':'',t=p(d),f&&(o.theme?(t.css(a),t.addClass("ui-widget-content")):t.css(l)),o.theme||c.css(o.overlayCSS),c.css("position",u?"fixed":"absolute"),(h||o.forceIframe)&&r.css("opacity",0),d=[r,c,t],s=p(u?"body":e),p.each(d,function(){this.appendTo(s)}),o.theme&&o.draggable&&p.fn.draggable&&t.draggable({handle:".ui-dialog-titlebar",cancel:"li"}),a=k&&("CSS1Compat"!==document.compatMode||0 .blockUI"):s.find(">.blockUI"),t.cursorReset&&(1

'); if (!empty($form)) { $filesystem_form = $form; } ob_end_clean(); // Save the state whether or not there's a need to show the // credentials form to the user. $request_filesystem_credentials[$entity] = ('direct' !== $filesystem_method && !$filesystem_credentials_are_stored); } // Wrapping the credentials info before passing it back // to the client issuing the request. $result = array( 'request_filesystem_credentials' => $request_filesystem_credentials, 'filesystem_form' => $filesystem_form ); } catch (Exception $e) { $result = array('error' => true, 'message' => $e->getMessage(), 'values' => array()); } return $this->_response($result); } /** * Fetches a browser-usable URL which will automatically log the user in to the site * * @param String $redirect_to - the URL to got to after logging in * @param Array $extra_info - valid keys are user_id, which should be a numeric user ID to log in as. */ public function get_login_url($redirect_to, $extra_info) { if (is_array($extra_info) && !empty($extra_info['user_id']) && is_numeric($extra_info['user_id'])) { $user_id = $extra_info['user_id']; if (false == ($login_key = $this->_get_autologin_key($user_id))) return $this->_generic_error_response('user_key_failure'); // Default value $redirect_url = network_admin_url(); if (is_array($redirect_to) && !empty($redirect_to['module'])) { switch ($redirect_to['module']) { case 'updraftplus': if ('initiate_restore' == $redirect_to['action'] && class_exists('UpdraftPlus_Options')) { $redirect_url = UpdraftPlus_Options::admin_page_url().'?page=updraftplus&udaction=initiate_restore&entities='.urlencode($redirect_to['data']['entities']).'&showdata='.urlencode($redirect_to['data']['showdata']).'&backup_timestamp='.(int) $redirect_to['data']['backup_timestamp']; } elseif ('download_file' == $redirect_to['action']) { $findex = empty($redirect_to['data']['findex']) ? 0 : (int) $redirect_to['data']['findex']; // e.g. ?udcentral_action=dl&action=updraftplus_spool_file&backup_timestamp=1455101696&findex=0&what=plugins $redirect_url = site_url().'?udcentral_action=spool_file&action=updraftplus_spool_file&findex='.$findex.'&what='.urlencode($redirect_to['data']['what']).'&backup_timestamp='.(int) $redirect_to['data']['backup_timestamp']; } break; case 'direct_url': $redirect_url = $redirect_to['url']; break; } } $login_key = apply_filters('updraftplus_remotecontrol_login_key', array( 'key' => $login_key, 'created' => time(), 'redirect_url' => $redirect_url ), $redirect_to, $extra_info); // Over-write any previous value - only one can be valid at a time) update_user_meta($user_id, 'updraftcentral_login_key', $login_key); return $this->_response(array( 'login_url' => network_site_url('?udcentral_action=login&login_id='.$user_id.'&login_key='.$login_key['key']) )); } else { return $this->_generic_error_response('user_unknown'); } } /** * Get information derived from phpinfo() * * @return Array */ public function phpinfo() { $phpinfo = $this->_get_phpinfo_array(); if (!empty($phpinfo)) { return $this->_response($phpinfo); } return $this->_generic_error_response('phpinfo_fail'); } /** * The key obtained is only intended to be short-lived. Hence, there's no intention other than that it is random and only used once - only the most recent one is valid. * * @param Integer $user_id Specific user ID to get the autologin key * @return Array */ public function _get_autologin_key($user_id) { $secure_auth_key = defined('SECURE_AUTH_KEY') ? SECURE_AUTH_KEY : hash('sha256', DB_PASSWORD).'_'.rand(0, 999999999); if (!defined('SECURE_AUTH_KEY')) return false; $hash_it = $user_id.'_'.microtime(true).'_'.rand(0, 999999999).'_'.$secure_auth_key; $hash = hash('sha256', $hash_it); return $hash; } public function site_info() { global $wpdb; // THis is included so we can get $wp_version @include(ABSPATH.WPINC.'/version.php');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $ud_version = is_a($this->ud, 'UpdraftPlus') ? $this->ud->version : 'none'; return $this->_response(array( 'versions' => array( 'ud' => $ud_version, 'php' => PHP_VERSION, 'wp' => $wp_version,// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. 'mysql' => $wpdb->db_version(), 'udrpc_php' => $this->rc->udrpc_version, ), 'bloginfo' => array( 'url' => network_site_url(), 'name' => get_bloginfo('name'), ) )); } /** * This calls the WP_Action within WP * * @param array $data Array of Data to be used within call_wp_action * @return array */ public function call_wordpress_action($data) { if (false === ($updraftplus_admin = $this->_load_ud_admin())) return $this->_generic_error_response('no_updraftplus'); $response = $updraftplus_admin->call_wp_action($data); if (empty($data["wpaction"])) { return $this->_generic_error_response("error", "no command sent"); } return $this->_response(array( "response" => $response['response'], "status" => $response['status'], "log" => $response['log'] )); } /** * Get disk space used * * @uses UpdraftPlus_Filesystem_Functions::get_disk_space_used() * * @param String $entity - the entity to count (e.g. 'plugins', 'themes') * * @return Array - response */ public function count($entity) { if (!class_exists('UpdraftPlus_Filesystem_Functions')) return $this->_generic_error_response('no_updraftplus'); $response = UpdraftPlus_Filesystem_Functions::get_disk_space_used($entity); return $this->_response($response); } /** * https://secure.php.net/phpinfo * * @return null|array */ private function _get_phpinfo_array() { if (!function_exists('phpinfo')) return null; ob_start(); phpinfo(INFO_GENERAL|INFO_CREDITS|INFO_MODULES); $phpinfo = array('phpinfo' => array()); if (preg_match_all('#(?:

(?:)?(.*?)(?:)?

)|(?:(.*?)\s*(?:(.*?)\s*(?:(.*?)\s*)?)?)#s', ob_get_clean(), $matches, PREG_SET_ORDER)) { foreach ($matches as $match) { if (strlen($match[1])) { $phpinfo[$match[1]] = array(); } elseif (isset($match[3])) { $keys1 = array_keys($phpinfo); $phpinfo[end($keys1)][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3]; } else { $keys1 = array_keys($phpinfo); $phpinfo[end($keys1)][] = $match[2]; } } return $phpinfo; } return false; } /** * Return an UpdraftPlus_Admin object * * @return UpdraftPlus_Admin|Boolean - false in case of failure */ private function _load_ud_admin() { if (!defined('UPDRAFTPLUS_DIR') || !is_file(UPDRAFTPLUS_DIR.'/admin.php')) return false; updraft_try_include_file('admin.php', 'include_once'); global $updraftplus_admin; return $updraftplus_admin; } } PKwL\RL""updraftplus/central/host.phpnu[plugin_name; } /** * Retrieves or shows a message from the translations collection based on its identifier key * * @param string $key The ID of the the message * @param bool $echo Indicate whether the message is to be shown directly (echoed) or just for retrieval * * @return string/void */ public function retrieve_show_message($key, $echo = false) { if (empty($key) || !isset($this->translations[$key])) return ''; if ($echo) { echo $this->translations[$key]; return; } return $this->translations[$key]; } /** * Adds a section to a designated area primarily used for generating UpdraftCentral keys * * @return void */ public function debugtools_dashboard() { if (!current_user_can('manage_options')) return; global $updraftcentral_main; if (!class_exists('UpdraftCentral_Main')) { if (defined('UPDRAFTCENTRAL_CLIENT_DIR') && file_exists(UPDRAFTCENTRAL_CLIENT_DIR.'/bootstrap.php')) { include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/bootstrap.php'); $updraftcentral_main = new UpdraftCentral_Main(); } } if ($updraftcentral_main) { $updraftcentral_main->debugtools_dashboard(); } } /** * Whether the current user can perform key control AJAX actions * * @return Boolean */ public function current_user_can_ajax() { return current_user_can('manage_options'); } /** * Handles ajax requests coming from the section or area generated by the * "debugtools_dashboard" method (below) * * @return void */ public function updraft_central_ajax_handler() { global $updraftcentral_main; $nonce = empty($_REQUEST['nonce']) ? '' : $_REQUEST['nonce']; if (empty($nonce) || !wp_verify_nonce($nonce, 'updraftcentral-request-nonce') || !$this->current_user_can_ajax() || empty($_REQUEST['subaction'])) die('Security check'); if (is_a($updraftcentral_main, 'UpdraftCentral_Main')) { $subaction = $_REQUEST['subaction']; if ($this->is_action_whitelisted($subaction) && is_callable(array($updraftcentral_main, $subaction))) { // Undo WP's slashing of POST data $data = $this->wp_unslash($_POST); // TODO: Once all commands come through here and through updraft_send_command(), the data should always come from this attribute (once updraft_send_command() is modified appropriately). if (isset($data['action_data'])) $data = $data['action_data']; try { $results = call_user_func(array($updraftcentral_main, $subaction), $data); } catch (Exception $e) { $log_message = 'PHP Fatal Exception error ('.get_class($e).') has occurred during '.$subaction.' subaction. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; error_log($log_message); echo json_encode(array( 'fatal_error' => true, 'fatal_error_message' => $log_message )); die; // @codingStandardsIgnoreLine } catch (Error $e) { $log_message = 'PHP Fatal error ('.get_class($e).') has occurred during '.$subaction.' subaction. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; error_log($log_message); echo json_encode(array( 'fatal_error' => true, 'fatal_error_message' => $log_message )); die; } if (is_wp_error($results)) { $results = array( 'result' => false, 'error_code' => $results->get_error_code(), 'error_message' => $results->get_error_message(), 'error_data' => $results->get_error_data(), ); } if (is_string($results)) { // A handful of legacy methods, and some which are directly the source for iframes, for which JSON is not appropriate. echo $results; } else { echo json_encode($results); } die; } } die; } /** * Verifies whether the submitted action is valid and allowed for execution over AJAX * * @param string $action The action to execute * * @return bool */ private function is_action_whitelisted($action) { $allowed_actions = array('delete_key', 'get_log', 'create_key'); return in_array($action, $allowed_actions); } /** * Retrieves the filter used by UpdraftCentral to log errors or certain events * * @return string */ public function get_logline_filter() { return 'updraftcentral_logline'; } /** * Gets an RPC object, and sets some defaults on it that we always want * * @param string $indicator_name indicator name * @return array */ public function get_udrpc($indicator_name = 'migrator.updraftplus.com') { if (!class_exists('UpdraftPlus_Remote_Communications')) include_once($this->get_host_dir().'/vendor/team-updraft/common-libs/src/updraft-rpc/class-udrpc.php'); $ud_rpc = new UpdraftPlus_Remote_Communications($indicator_name); $ud_rpc->set_can_generate(true); return $ud_rpc; } /** * Noop method. * Depending on the host plugin this method may or may not be used. * * N.B. The UpdraftPlus plugin is using and overriding this method in its host file. * * @param boolean $register Indicate whether to add or remote filter hooks * @ignore */ // @codingStandardsIgnoreLine public function register_wp_http_option_hooks($register = true) {} /** * Remove slashes from a string or array of strings. * * The function wp_unslash() is WP 3.6+, so therefore we have a compatibility method here * * @param String|Array $value String or array of strings to unslash. * @return String|Array Unslashed $value */ public function wp_unslash($value) { return function_exists('wp_unslash') ? wp_unslash($value) : stripslashes_deep($value); } /** * Generate a log line based from the PHP error information * * @param Integer $errno Error number * @param String $errstr Error string * @param String $errfile Error file * @param String $errline Line number where the error occurred * * @return string|bool */ public function php_error_to_logline($errno, $errstr, $errfile, $errline) { switch ($errno) { case 1: $e_type = 'E_ERROR'; break; case 2: $e_type = 'E_WARNING'; break; case 4: $e_type = 'E_PARSE'; break; case 8: $e_type = 'E_NOTICE'; break; case 16: $e_type = 'E_CORE_ERROR'; break; case 32: $e_type = 'E_CORE_WARNING'; break; case 64: $e_type = 'E_COMPILE_ERROR'; break; case 128: $e_type = 'E_COMPILE_WARNING'; break; case 256: $e_type = 'E_USER_ERROR'; break; case 512: $e_type = 'E_USER_WARNING'; break; case 1024: $e_type = 'E_USER_NOTICE'; break; case 2048: $e_type = 'E_STRICT'; break; case 4096: $e_type = 'E_RECOVERABLE_ERROR'; break; case 8192: $e_type = 'E_DEPRECATED'; break; case 16384: $e_type = 'E_USER_DEPRECATED'; break; case 30719: $e_type = 'E_ALL'; break; default: $e_type = "E_UNKNOWN ($errno)"; break; } if (false !== stripos($errstr, 'table which is not valid in this version of Gravity Forms')) return false; if (!is_string($errstr)) $errstr = serialize($errstr); if (0 === strpos($errfile, ABSPATH)) $errfile = substr($errfile, strlen(ABSPATH)); if ('E_DEPRECATED' == $e_type && !empty($this->no_deprecation_warnings)) { return false; } return "PHP event: code $e_type: $errstr (line $errline, $errfile)"; } /** * PHP error handler * * @param Integer $errno Error number * @param String $errstr Error string * @param String $errfile Error file * @param String $errline Line number where the error occurred * * @return bool */ public function php_error($errno, $errstr, $errfile, $errline) { if (0 == error_reporting()) return true; $logline = $this->php_error_to_logline($errno, $errstr, $errfile, $errline); if (false !== $logline) $this->log($logline, 'notice', 'php_event'); // Pass it up the chain return $this->error_reporting_stop_when_logged; } } PKwL\ ]#updraftplus/central/updraftplus.phpnu[maybe_initialize_required_objects(); } /** * Loads the UpdraftCentral_Main instance * * @return void */ public function load_updraftcentral() { $central_path = $this->is_host_dir_set() ? trailingslashit(UPDRAFTPLUS_DIR) : ''; if (file_exists($central_path.'central/bootstrap.php')) { include_once($central_path.'central/bootstrap.php'); } } /** * Whether the current user can perform key control AJAX actions * * @return Boolean */ public function current_user_can_ajax() { return UpdraftPlus_Options::user_can_manage(); } /** * Below are interface methods' implementations that are required by UpdraftCentral to function properly. Please * see the "interface.php" to check all the required interface methods. */ /** * Checks whether the plugin's DIR constant is currently define or not * * @return bool */ public function is_host_dir_set() { return defined('UPDRAFTPLUS_DIR') ? true : false; } /** * Get the host plugin's dir path * * @return string */ public function get_host_dir() { return defined('UPDRAFTPLUS_DIR') ? UPDRAFTPLUS_DIR : dirname(dirname(__FILE__)); } /** * Retrieves the filter used by UpdraftPlus to log errors or certain events * * @return string */ public function get_logline_filter() { return 'updraftplus_logline'; } /** * Checks whether debug mod is set * * @return bool */ public function get_debug_mode() { if (class_exists('UpdraftPlus_Options')) { return UpdraftPlus_Options::get_updraft_option('updraft_debug_mode'); } return false; } /** * Used as a central location (to avoid repetition) to register or de-register hooks into the WP HTTP API * * @param bool $register True to register, false to de-register * @return void */ public function register_wp_http_option_hooks($register = true) { global $updraftplus; if ($updraftplus) { $updraftplus->register_wp_http_option_hooks($register); } } /** * Retrieves the class name of the host plugin * * @return string|bool */ public function get_class_name() { global $updraftplus; if ($updraftplus) { return get_class($updraftplus); } return false; } /** * Returns the instance of the host plugin * * @return object|bool */ public function get_instance() { global $updraftplus; if ($updraftplus) { return $updraftplus; } return false; } /** * Returns the admin instance of the host plugin * * @return object|bool */ public function get_admin_instance() { global $updraftplus_admin; if ($updraftplus_admin) { return $updraftplus_admin; } else { if (defined('UPDRAFTPLUS_DIR') && file_exists(UPDRAFTPLUS_DIR.'/admin.php')) { updraft_try_include_file('admin.php', 'include_once'); $updraftplus_admin = new UpdraftPlus_Admin(); return $updraftplus_admin; } } return false; } /** * Logs the given line * * @param string $line The log line * @param string $level The log level: notice, warning, error, etc. * @param boolean|string $uniq_id Each of these will only be logged once * * @return void */ public function log($line, $level = 'notice', $uniq_id = false) { global $updraftplus; if ($updraftplus) { if (is_callable(array($updraftplus, 'log'))) { call_user_func(array($updraftplus, 'log'), $line, $level, $uniq_id); } } } /** * Returns the current version of the host plugin * * @return string|bool */ public function get_version() { global $updraftplus; if ($updraftplus) { return $updraftplus->version; } return false; } /** * Returns the filesystem class of the host's plugin * * @return class|bool */ public function get_filesystem_functions() { if ($this->has_filesystem_functions()) { return UpdraftPlus_Filesystem_Functions; } return false; } /** * Checks whether the filesystem class of the host plugin exists * * @return bool */ public function has_filesystem_functions() { return class_exists('UpdraftPlus_Filesystem_Functions'); } /** * Checks whether force debugging is set * * @return bool */ public function is_force_debug() { return (defined('UPDRAFTPLUS_UDRPC_FORCE_DEBUG') && UPDRAFTPLUS_UDRPC_FORCE_DEBUG) ? true : false; } /** * Initializes required objects (if not yet initialized) for UpdraftCentral usage * * @return void */ private function maybe_initialize_required_objects() { global $updraftplus; if (!class_exists('UpdraftPlus')) { if (defined('UPDRAFTPLUS_DIR') && file_exists(UPDRAFTPLUS_DIR.'/class-updraftplus.php')) { updraft_try_include_file('class-updraftplus.php', 'include_once'); if (empty($updraftplus) || !is_a($updraftplus, 'UpdraftPlus')) { $updraftplus = new UpdraftPlus(); } } } if (!class_exists('UpdraftPlus_Options')) { if (defined('UPDRAFTPLUS_DIR') && file_exists(UPDRAFTPLUS_DIR.'/options.php')) { updraft_try_include_file('options.php', 'require_once'); } } if (!class_exists('UpdraftPlus_Filesystem_Functions')) { if (defined('UPDRAFTPLUS_DIR') && file_exists(UPDRAFTPLUS_DIR.'/includes/class-filesystem-functions.php')) { updraft_try_include_file('includes/class-filesystem-functions.php', 'require_once'); } } // Load updraftplus translations if (defined('UPDRAFTCENTRAL_CLIENT_DIR') && file_exists(UPDRAFTCENTRAL_CLIENT_DIR.'/translations-central.php')) { $this->translations = include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/translations-central.php'); } } } PKwL\X9 7474 updraftplus/central/commands.phpnu[ (string - a code), 'data' => (mixed)); * * RPC commands are not allowed to begin with an underscore. So, any private methods can be prefixed with an underscore. */ abstract class UpdraftCentral_Commands { protected $rc; protected $ud; protected $installed_data; /** * Class constructor * * @param string $rc */ public function __construct($rc) { $this->rc = $rc; global $updraftplus; $this->ud = $updraftplus; $this->installed_data = array(); } /** * Include a file or files from wp-admin/includes */ final protected function _admin_include() { $files = func_get_args(); foreach ($files as $file) { include_once(ABSPATH.'/wp-admin/includes/'.$file); } } /** * Include a file or files from wp-includes */ final protected function _frontend_include() { $files = func_get_args(); foreach ($files as $file) { include_once(ABSPATH.WPINC.'/'.$file); } } /** * Return a response in the expected format * * @param Mixed $data * @param String $code * * @return Array */ final protected function _response($data = null, $code = 'rpcok') { return array( 'response' => $code, 'data' => $data ); } /** * Return an error in the expected format * * @param String $code * @param Mixed $data * * @return Array */ final protected function _generic_error_response($code = 'central_unspecified', $data = null) { return $this->_response( array( 'code' => $code, 'data' => $data ), 'rpcerror' ); } /** * Checks whether a backup and a security credentials is required for the given request * * @param array $dir The directory location to check * @return array */ final protected function _get_backup_credentials_settings($dir) { // Do we need to ask the user for filesystem credentials? when installing and/or deleting items in the given directory $filesystem_method = get_filesystem_method(array(), $dir); ob_start(); $filesystem_credentials_are_stored = request_filesystem_credentials(site_url(), $filesystem_method); ob_end_clean(); $request_filesystem_credentials = ('direct' != $filesystem_method && !$filesystem_credentials_are_stored); // Do we need to execute a backup process before installing/managing items $automatic_backups = (class_exists('UpdraftPlus_Options') && class_exists('UpdraftPlus_Addon_Autobackup') && UpdraftPlus_Options::get_updraft_option('updraft_autobackup_default', true)) ? true : false; return array( 'request_filesystem_credentials' => $request_filesystem_credentials, 'automatic_backups' => $automatic_backups ); } /** * Retrieves the information of the currently installed item (e.g. plugin or theme) through filter * * @param bool $response Indicates whether the installation was a success or failure * @param array $args Extra argument for the hook * @param array $data Contains paths used and other relevant information regarding the file * @return array */ final public function get_install_data($response, $args, $data) { if ($response) { switch ($args['type']) { case 'plugin': $plugin_data = get_plugins('/'.$data['destination_name']); if (!empty($plugin_data)) { $info = reset($plugin_data); $key = key($plugin_data); $info['slug'] = $data['destination_name'].'/'.$key; $this->installed_data = $info; } break; case 'theme': $theme = wp_get_theme($data['destination_name']); if ($theme->exists()) { // Minimalistic info here, if you need to add additional information // you can add them here. For now, the "Name" and "slug" fields will suffice // in the succeeding process. $this->installed_data = array( 'Name' => $theme->get('Name'), 'slug' => $data['destination_name'], 'template' => $theme->get_template() ); } break; default: break; } } return $response; } /** * Installs and activates either a plugin or theme through zip file upload * * @param array $params Parameter array containing information pertaining the currently uploaded item * @param string $type Indicates whether this current process is intended for a 'plugin' or a 'theme' item * @return array */ final protected function process_chunk_upload($params, $type) { global $updraftcentral_host_plugin, $updraftcentral_main; if (!in_array($type, array('plugin', 'theme'))) { return $this->_generic_error_response('upload_type_not_supported'); } $permission_error = false; if ('plugin' === $type) { if (!current_user_can('install_plugins') || !current_user_can('activate_plugins')) $permission_error = true; } else { if (!current_user_can('install_themes') || !current_user_can('switch_themes')) $permission_error = true; } if ($permission_error) { return $this->_generic_error_response($type.'_insufficient_permission'); } // Pull any available and writable directory where we can store // our data/file temporarily before running the installation process. $upload_dir = untrailingslashit(get_temp_dir()); if (!is_writable($upload_dir)) { $upload_dir = WP_CONTENT_DIR.'/upgrade'; if (!is_dir($upload_dir)) { $wp_dir = wp_upload_dir(); if (!empty($wp_dir['basedir'])) $upload_dir = $wp_dir['basedir']; } } // If we haven't found any writable directory to temporarily store our file then // we bail and send an error back to the caller. if (!is_dir($upload_dir) || !is_writable($upload_dir)) { return $this->_generic_error_response('upload_dir_not_available'); } // Preloads the submitted credentials to the global $_POST variable if (!empty($params) && isset($params['filesystem_credentials'])) { parse_str($params['filesystem_credentials'], $filesystem_credentials); if (is_array($filesystem_credentials)) { foreach ($filesystem_credentials as $key => $value) { // Put them into $_POST, which is where request_filesystem_credentials() checks for them. $_POST[$key] = $value; } } } // Save uploaded file $filename = basename($params['filename']); $is_chunked = false; if (isset($params['chunks']) && 1 < (int) $params['chunks']) { $filename = basename($params['filename']).'.part'; $is_chunked = true; } if (!$is_chunked || ($is_chunked && isset($params['chunk']) && 0 === (int) $params['chunk'])) { // if it's not a chunk upload or if it's a chunk upload operation and the current chunk variable is zero, then it means a new upload operation has just begun therefore we should remove previous left-over file (if any and due to error during the previous upload of the same file), because it can lead to a corrupt/invalid zip file (we use file_put_contents a few lines below with FILE_APPEND attribute) if (file_exists($upload_dir.'/'.$filename) && !unlink($upload_dir.'/'.$filename)) return $this->_generic_error_response('unable_to_delete_existing_file'); } if (empty($params['data'])) { return $this->_generic_error_response('data_empty_or_invalid'); } $result = file_put_contents($upload_dir.'/'.$filename, base64_decode($params['data']), FILE_APPEND | LOCK_EX); if (false === $result) { return $this->_generic_error_response('unable_to_write_content'); } // Set $install_now to true for single upload and for the last chunk of a multi-chunks upload process $install_now = true; if ($is_chunked) { if ($params['chunk'] == (int) $params['chunks'] - 1) { // If this is the last chunk of the request, then we're going to restore the // original filename of the file (without the '.part') since our upload is now complete. $orig_filename = basename($filename, '.part'); $success = rename($upload_dir.'/'.$filename, $upload_dir.'/'.$orig_filename); // If renaming the file was successful then restore the original name and override the $filename variable. // Overriding the $filename variable makes it easy for us to use the same variable for both // non-chunked and chunked zip file for the installation process. if ($success) { $filename = $orig_filename; } else { return $this->_generic_error_response('unable_to_rename_file'); } } else { // Bypass installation for now since we're waiting for the last chunk to arrive // to complete the uploading of the zip file. $install_now = false; } } // Everything is already good (upload completed), thus, we proceed with the installation if ($install_now) { // We have successfully uploaded the zip file in this location with its original filename intact. $zip_filepath = $upload_dir.'/'.$filename; // Making sure that the file does actually exists, since we've just run through // a renaming process above. if (file_exists($zip_filepath)) { add_filter('upgrader_post_install', array($this, 'get_install_data'), 10, 3); // WP < 3.7 if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php'); $skin = new Automatic_Upgrader_Skin(); $upgrader = ('plugin' === $type) ? new Plugin_Upgrader($skin) : new Theme_Upgrader($skin); $install_result = $upgrader->install($zip_filepath); remove_filter('upgrader_post_install', array($this, 'get_install_data'), 10, 3); // Remove zip file on success and on error (cleanup) if ($install_result || is_null($install_result) || is_wp_error($install_result)) { @unlink($zip_filepath);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } if (false === $install_result || is_wp_error($install_result)) { $message = $updraftcentral_host_plugin->retrieve_show_message('unable_to_connect'); if (is_wp_error($install_result)) $message = $install_result->get_error_message(); return $this->_generic_error_response($type.'_install_failed', array('message' => $message)); } else { // Pull installed data $data = $this->installed_data; // For WP 3.4 the intended filter hook isn't working or not available // so we're going to pull the data manually. if ($install_result && empty($data)) { $result = $this->get_install_data($install_result, array('type' => $type), $skin->result); if ($result) { // Getting the installed data one more time after manually calling // the "get_install_data" function. $data = $this->installed_data; } } if (!empty($data)) { // Activate item if set $is_active = ('plugin' === $type) ? is_plugin_active($data['slug']) : ((wp_get_theme()->get('Name') === $data['Name']) ? true : false); if ((bool) $params['activate'] && !$is_active) { if ('plugin' === $type) { if (is_multisite()) { $activate = activate_plugin($data['slug'], '', true); } else { $activate = activate_plugin($data['slug']); } } else { // In order to make it compatible with older versions of switch_theme which takes two // arguments we're going to pass two arguments instead of one. Latest versions have backward // compatibility so it's safe to do it this way. switch_theme($data['template'], $data['slug']); $activate = (wp_get_theme()->get_stylesheet() === $data['slug']) ? true : false; } if (false === $activate || is_wp_error($activate)) { $wp_version = $updraftcentral_main->get_wordpress_version(); $message = is_wp_error($activate) ? array('message' => $activate->get_error_message()) : array('message' => sprintf($updraftcentral_host_plugin->retrieve_show_message('unable_to_activate'), $type, $type, $wp_version)); return $this->_generic_error_response('unable_to_activate_'.$type, $message); } } return $this->_response( array( 'installed' => true, 'installed_data' => $data, ) ); } if (is_wp_error($skin->result)) { $code = $skin->result->get_error_code(); $message = $skin->result->get_error_message(); $error_data = $skin->result->get_error_data($code); if (!empty($error_data)) { if (is_array($error_data)) $error_data = json_encode($error_data); $message .= ' '.$error_data; } return $this->_generic_error_response($code, $message); } else { return $this->_response( array( 'installed' => false, 'message' => sprintf($updraftcentral_host_plugin->retrieve_show_message('unable_to_install'), $type, $type, $type, $type, 'wp-content/'.$type.'s'), ) ); } } } } else { // Returning response to a chunk requests while still processing and // completing the file upload process. If we don't return a positive response // for every chunk requests then the caller will assumed an error has occurred // and will eventually stop the upload process. return $this->_response(array('in_progress' => true)); } } } PKwL\).99#updraftplus/central/wp-optimize.phpnu[translations = include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/translations-central.php'); } } /** * Whether the current user can perform key control AJAX actions * * @return Boolean */ public function current_user_can_ajax() { return current_user_can(WP_Optimize()->capability_required()); } /** * Loads the UpdraftCentral_Main instance * * @return void */ public function load_updraftcentral() { $central_path = $this->is_host_dir_set() ? trailingslashit(WPO_PLUGIN_MAIN_PATH) : ''; if (!empty($central_path) && file_exists($central_path.'central/bootstrap.php')) { include_once($central_path.'central/bootstrap.php'); } } /** * Checks whether the plugin's DIR constant is currently define or not * * @return bool */ public function is_host_dir_set() { return defined('WPO_PLUGIN_MAIN_PATH') ? true : false; } /** * Get the host plugin's dir path * * @return string */ public function get_host_dir() { return defined('WPO_PLUGIN_MAIN_PATH') ? WPO_PLUGIN_MAIN_PATH : dirname(dirname(__FILE__)); } /** * Returns the current version of the host plugin * * @return string|bool */ public function get_version() { return defined('WPO_VERSION') ? WPO_VERSION : false; } /** * Returns the instance of the host plugin * * @return object|bool */ public function get_instance() { global $wp_optimize; if ($wp_optimize) { return $wp_optimize; } return false; } /** * Checks whether debug mod is set * * @return bool */ public function get_debug_mode() { return (defined('WP_OPTIMIZE_DEBUG_OPTIMIZATIONS') && WP_OPTIMIZE_DEBUG_OPTIMIZATIONS); } /** * Logs the given line * * @param string $line The log line * @param string $level The log level: notice, warning, error, etc. * @param boolean|string $uniq_id Each of these will only be logged once * * @return void */ public function log($line, $level = 'notice', $uniq_id = false) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameter is present because the the abstract UpdraftCentral_Host class uses 3 arguments. global $wp_optimize; if ($wp_optimize) { if (is_callable(array($wp_optimize, 'log'))) { call_user_func(array($wp_optimize, 'log'), $line); } } } /** * Developer Note: * * You can add your class methods below if ever you want to extend or modify * the module handlers of UpdraftCentral located at central/modules. Just be * sure to use this class to abstract any functionality that would link to the * wp-optimize plugin. * * N.B. All custom methods added here will then be available from the global * variable $updraftcentral_host_plugin (e.g. $updraftcentral_host_plugin->YOUR_METHOD) */ } PKwL\f !updraftplus/central/bootstrap.phpnu[is_host_dir_set()) die('No access.'); // This file is included during plugins_loaded // Load the listener class that we rely on to pick up messages if (!class_exists('UpdraftCentral_Listener')) require_once('listener.php'); // We exit if class already exists. More common if two or more plugins integrated // the same `UpdraftCentral` client folder. if (!class_exists('UpdraftCentral_Main')) : class UpdraftCentral_Main { /** * Class constructor */ public function __construct() { add_action('udrpc_log', array($this, 'udrpc_log'), 10, 3); add_action('wp_ajax_updraftcentral_receivepublickey', array($this, 'wp_ajax_updraftcentral_receivepublickey')); add_action('wp_ajax_nopriv_updraftcentral_receivepublickey', array($this, 'wp_ajax_updraftcentral_receivepublickey')); // The host plugin's command class is registered in its "plugins_loaded" method (e.g. UpdraftPlus::plugins_loaded()). // // N.B. The new filter "updraftcentral_remotecontrol_command_classes" was introduced on Jan. 2021 and will soon replace the // old filter "updraftplus_remotecontrol_command_classes" (below). This was done in order to synchronize all available filters // and actions related to UpdraftCentral so that we can easily port the UpdraftCentral client code into our other plugins. // // If you happened to use the old filter from any of your projects then you might as well update it with the new filter as the // old filter has already been marked as deprecated, though currently supported as can be seen below but will soon be remove // from this code block. $command_classes = apply_filters('updraftcentral_remotecontrol_command_classes', array( 'core' => 'UpdraftCentral_Core_Commands', 'updates' => 'UpdraftCentral_Updates_Commands', 'users' => 'UpdraftCentral_Users_Commands', 'comments' => 'UpdraftCentral_Comments_Commands', 'analytics' => 'UpdraftCentral_Analytics_Commands', 'plugin' => 'UpdraftCentral_Plugin_Commands', 'theme' => 'UpdraftCentral_Theme_Commands', 'posts' => 'UpdraftCentral_Posts_Commands', 'media' => 'UpdraftCentral_Media_Commands', 'pages' => 'UpdraftCentral_Pages_Commands' )); // N.B. This "updraftplus_remotecontrol_command_classes" filter has been marked as deprecated and will be remove after May 2021. // Please see above code comment for further explanation and its alternative. $command_classes = apply_filters('updraftplus_remotecontrol_command_classes', $command_classes); // If nothing was sent, then there is no incoming message, so no need to set up a listener (or CORS request, etc.). This avoids a DB SELECT query on the option below in the case where it didn't get autoloaded, which is the case when there are no keys. if (!empty($_SERVER['REQUEST_METHOD']) && ('GET' == $_SERVER['REQUEST_METHOD'] || 'POST' == $_SERVER['REQUEST_METHOD']) && (empty($_REQUEST['action']) || 'updraft_central' !== $_REQUEST['action']) && empty($_REQUEST['udcentral_action']) && empty($_REQUEST['udrpc_message'])) return; // Remote control keys // These are different from the remote send keys, which are set up in the Migrator add-on $our_keys = $this->get_central_localkeys(); if (is_array($our_keys) && !empty($our_keys)) { new UpdraftCentral_Listener($our_keys, $command_classes); } } /** * Enqueues the needed styles and scripts for UpdraftCentral * * @return void */ public function enqueue_central_scripts() { // This is an additional check; the caller is assumed to have already run checks before painting its page in general if (!current_user_can('manage_options')) return; global $updraftcentral_host_plugin; $version = $updraftcentral_host_plugin->get_version(); $enqueue_version = (defined('WP_DEBUG') && WP_DEBUG) ? $version.'.'.time() : $version; $min_or_not = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min'; // Fallback to unminified version if the minified version is not found. if (!empty($min_or_not) && !file_exists(UPDRAFTCENTRAL_CLIENT_DIR.'/js/central'.$min_or_not.'.js')) { $min_or_not = ''; } wp_enqueue_script('updraft-central', UPDRAFTCENTRAL_CLIENT_URL.'/js/central'.$min_or_not.'.js', array(), $enqueue_version); wp_enqueue_style('updraft-central', UPDRAFTCENTRAL_CLIENT_URL.'/css/central'.$min_or_not.'.css', array(), $enqueue_version); $localize = array_merge( array( 'central_url' => UPDRAFTCENTRAL_CLIENT_URL, 'plugin_name' => $updraftcentral_host_plugin->get_plugin_name(), 'updraftcentral_request_nonce' => wp_create_nonce('updraftcentral-request-nonce'), ), $updraftcentral_host_plugin->translations ); wp_localize_script('updraft-central', 'uclion', apply_filters('updraftcentral_uclion', $localize)); } /** * Retrieves current clean url for anchor link where href attribute value is not url (for ex. #div) or empty. Output is not escaped (caller should escape). * * @return String - current clean url */ public function get_current_clean_url() { // Within an UpdraftCentral context, there should be no prefix on the anchor link if (defined('UPDRAFTCENTRAL_COMMAND') && UPDRAFTCENTRAL_COMMAND || defined('WP_CLI') && WP_CLI) return ''; if (defined('DOING_AJAX') && DOING_AJAX && !empty($_SERVER['HTTP_REFERER'])) { $current_url = $_SERVER['HTTP_REFERER']; } else { $url_prefix = is_ssl() ? 'https' : 'http'; $host = empty($_SERVER['HTTP_HOST']) ? parse_url(network_site_url(), PHP_URL_HOST) : $_SERVER['HTTP_HOST']; $current_url = $url_prefix."://".$host.$_SERVER['REQUEST_URI']; } $remove_query_args = array('state', 'action', 'oauth_verifier', 'nonce', 'updraftplus_instance', 'access_token', 'user_id', 'updraftplus_googledriveauth'); $query_string = remove_query_arg($remove_query_args, $current_url); return function_exists('wp_unslash') ? wp_unslash($query_string) : stripslashes_deep($query_string); } /** * Get the WordPress version * * @return String - the version */ public function get_wordpress_version() { static $got_wp_version = false; if (!$got_wp_version) { @include(ABSPATH.WPINC.'/version.php');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $got_wp_version = $wp_version;// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. } return $got_wp_version; } /** * Retrieves the UpdraftCentral generated keys * * @param Mixed $default default value to return when option is not found * * @return Mixed */ private function get_central_localkeys($default = null) { $option = 'updraft_central_localkeys'; $ret = get_option($option, $default); return apply_filters('updraftcentral_get_option', $ret, $option, $default); } /** * Updates the UpdraftCentral's keys * * @param string $value Specify option value * @param bool $use_cache Whether or not to use the WP options cache * @param string $autoload Whether to autoload (only takes effect on a change of value) * * @return bool */ private function update_central_localkeys($value, $use_cache = true, $autoload = 'yes') { $option = 'updraft_central_localkeys'; return update_option($option, apply_filters('updraftcentral_update_option', $value, $option, $use_cache), $autoload); } /** * Receive a new public key in $_GET, and echo a response. Will die() if called. */ public function wp_ajax_updraftcentral_receivepublickey() { global $updraftcentral_host_plugin; // The actual nonce check is done in the method below if (empty($_GET['_wpnonce']) || empty($_GET['public_key']) || !isset($_GET['updraft_key_index'])) die; $result = $this->receive_public_key(); if (!is_array($result) || empty($result['responsetype'])) die; $style = 'body {text-align: center;font-family: Helvetica,Arial,Lucida,sans-serif;background-color: #A64C1A;color: #FFF;height: 100%;width: 100%;margin: 0;padding: 0;}#main {height: 100%;width: 100%;display: table;}#wrapper {display: table-cell;height: 100%;vertical-align: middle;}h1 {margin-bottom: 5px;}h2 {margin-top: 0;font-size: 22px;color: #FFF;}#btn-close {color: #FFF;font-size: 20px;font-weight: 500;padding: .3em 1em;line-height: 1.7em !important;background-color: transparent;background-size: cover;background-position: 50%;background-repeat: no-repeat;border: 2px solid;border-radius: 3px;-webkit-transition-duration: .2s;transition-duration: .2s;-webkit-transition-property: all !important;transition-property: all !important;text-decoration: none;}#btn-close:hover {background-color: #DE6726;}'; echo 'UpdraftCentral

'.$updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection').'

'.htmlspecialchars(network_site_url()).'

'; if ('ok' == $result['responsetype']) { $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection_successful', true); } else { echo ''.$updraftcentral_host_plugin->retrieve_show_message('updraftcentral_connection_failed').'
'; switch ($result['code']) { case 'unknown_key': $updraftcentral_host_plugin->retrieve_show_message('unknown_key', true); break; case 'not_logged_in': echo $updraftcentral_host_plugin->retrieve_show_message('not_logged_in').' '.$updraftcentral_host_plugin->retrieve_show_message('must_visit_url'); break; case 'nonce_failure': $updraftcentral_host_plugin->retrieve_show_message('security_check', true); $updraftcentral_host_plugin->retrieve_show_message('must_visit_link', true); break; case 'already_have': $updraftcentral_host_plugin->retrieve_show_message('connection_already_made', true); break; case 'insufficient_privilege': $updraftcentral_host_plugin->retrieve_show_message('insufficient_privilege', true); break; default: echo htmlspecialchars(print_r($result, true)); break; } } echo '

'.$updraftcentral_host_plugin->retrieve_show_message('close').'

'; die; } /** * Checks _wpnonce, and if successful, saves the public key found in $_GET * * @return Array - with keys responsetype (can be 'error' or 'ok') and code, indicating whether the parse was successful */ private function receive_public_key() { if (!is_user_logged_in()) { return array('responsetype' => 'error', 'code' => 'not_logged_in'); } if (!wp_verify_nonce($_GET['_wpnonce'], 'updraftcentral_receivepublickey')) return array('responsetype' => 'error', 'code' => 'nonce_failure'); $updraft_key_index = $_GET['updraft_key_index']; $our_keys = $this->get_central_localkeys(); if (!is_array($our_keys)) $our_keys = array(); if (!isset($our_keys[$updraft_key_index])) { return array('responsetype' => 'error', 'code' => 'unknown_key'); } if (!empty($our_keys[$updraft_key_index]['publickey_remote'])) { return array('responsetype' => 'error', 'code' => 'already_have'); } $our_keys[$updraft_key_index]['publickey_remote'] = base64_decode(stripslashes($_GET['public_key'])); $this->update_central_localkeys($our_keys, true, 'no'); return array('responsetype' => 'ok', 'code' => 'ok'); } /** * Action parameters, from udrpc: $message, $level, $this->key_name_indicator, $this->debug, $this * * @param string $message The log message * @param string $level Log level * @param string $key_name_indicator This indicates the key name */ public function udrpc_log($message, $level, $key_name_indicator) { $udrpc_log = get_site_option('updraftcentral_client_log'); if (!is_array($udrpc_log)) $udrpc_log = array(); $new_item = array( 'time' => time(), 'level' => $level, 'message' => $message, 'key_name_indicator' => $key_name_indicator ); if (!empty($_SERVER['REMOTE_ADDR'])) { $new_item['remote_ip'] = $_SERVER['REMOTE_ADDR']; } if (!empty($_SERVER['HTTP_USER_AGENT'])) { $new_item['http_user_agent'] = $_SERVER['HTTP_USER_AGENT']; } if (!empty($_SERVER['HTTP_X_SECONDARY_USER_AGENT'])) { $new_item['http_secondary_user_agent'] = $_SERVER['HTTP_X_SECONDARY_USER_AGENT']; } $udrpc_log[] = $new_item; if (count($udrpc_log) > 50) array_shift($udrpc_log); update_site_option('updraftcentral_client_log', $udrpc_log); } /** * Delete UpdraftCentral Key * * @param array $key_id key_id of UpdraftCentral * * @return array which contains deleted flag and key table. If error, Returns array which contains fatal_error flag and fatal_error_message */ public function delete_key($key_id) { $our_keys = $this->get_central_localkeys(); if (is_array($key_id) && isset($key_id['key_id'])) { $key_id = $key_id['key_id']; } if (!is_array($our_keys)) $our_keys = array(); if (isset($our_keys[$key_id])) { unset($our_keys[$key_id]); $this->update_central_localkeys($our_keys); } return array('deleted' => 1, 'keys_table' => $this->get_keys_table()); } /** * Get UpdraftCentral Log * * @return array which contains log_contents. If error, Returns array which contains fatal_error flag and fatal_error_message */ public function get_log() { global $updraftcentral_host_plugin; $udrpc_log = get_site_option('updraftcentral_client_log'); if (!is_array($udrpc_log)) $udrpc_log = array(); $log_contents = ''; // Events are appended to the array in the order they happen. So, reversing the order gets them into most-recent-first order. rsort($udrpc_log); if (empty($udrpc_log)) { $log_contents = ''.$updraftcentral_host_plugin->retrieve_show_message('nothing_yet_logged').''; } foreach ($udrpc_log as $m) { // Skip invalid data if (!isset($m['time'])) continue; $time = gmdate('Y-m-d H:i:s O', $m['time']); // $level is not used yet. We could put the message in different colours for different levels, if/when it becomes used. $key_name_indicator = empty($m['key_name_indicator']) ? '' : $m['key_name_indicator']; $log_contents .= ''."$time "; if (!empty($m['remote_ip'])) $log_contents .= '['.htmlspecialchars($m['remote_ip']).'] '; $log_contents .= "[".htmlspecialchars($key_name_indicator)."] ".htmlspecialchars($m['message'])."\n"; } return array('log_contents' => $log_contents); } public function create_key($params) { global $updraftcentral_host_plugin; // Use the site URL - this means that if the site URL changes, communication ends; which is the case anyway $user = wp_get_current_user(); if (!is_object($user) || empty($user->ID)) return array('error' => $updraftcentral_host_plugin->retrieve_show_message('insufficient_privilege')); if (!current_user_can('manage_options')) return array('error' => $updraftcentral_host_plugin->retrieve_show_message('insufficient_privilege')); $where_send = empty($params['where_send']) ? '' : (string) $params['where_send']; if ('__updraftpluscom' != $where_send) { $purl = parse_url($where_send); if (empty($purl) || !array($purl) || empty($purl['scheme']) || empty($purl['host'])) return array('error' => $updraftcentral_host_plugin->retrieve_show_message('invalid_url')); } // ENT_HTML5 exists only on PHP 5.4+ // @codingStandardsIgnoreLine $flags = defined('ENT_HTML5') ? ENT_QUOTES | ENT_HTML5 : ENT_QUOTES; $extra_info = array( 'user_id' => $user->ID, 'user_login' => $user->user_login, 'ms_id' => get_current_blog_id(), 'site_title' => html_entity_decode(get_bloginfo('name'), $flags), ); if ($where_send) { $extra_info['mothership'] = $where_send; if (!empty($params['mothership_firewalled'])) { $extra_info['mothership_firewalled'] = true; } } if (!empty($params['key_description'])) { $extra_info['name'] = (string) $params['key_description']; } $key_size = (empty($params['key_size']) || !is_numeric($params['key_size']) || $params['key_size'] < 512) ? 2048 : (int) $params['key_size']; $extra_info['key_size'] = $key_size; $created = $this->create_remote_control_key(false, $extra_info, $where_send); if (is_array($created)) { $created['keys_table'] = $this->get_keys_table(); $created['keys_guide'] = '

'. $updraftcentral_host_plugin->retrieve_show_message('updraftcentral_key_created') .'

'; if ('__updraftpluscom' != $where_send) { $created['keys_guide'] .= '

'.sprintf($updraftcentral_host_plugin->retrieve_show_message('need_to_copy_key'), 'UpdraftCentral dashboard').'

'.$updraftcentral_host_plugin->retrieve_show_message('press_add_site_button').'

'.sprintf($updraftcentral_host_plugin->retrieve_show_message('detailed_instructions'), 'UpdraftPlus.com').'

'; } else { $created['keys_guide'] .= '

'. sprintf($updraftcentral_host_plugin->retrieve_show_message('control_this_site'), 'UpdraftPlus.com').'

'; } } return $created; } /** * Given an index, return the indicator name * * @param String $index * * @return String */ private function indicator_name_from_index($index) { return $index.'.central.updraftplus.com'; } /** * Gets an RPC object, and sets some defaults on it that we always want * * @param string $indicator_name indicator name * * @return array */ public function get_udrpc($indicator_name = 'migrator.updraftplus.com') { global $updraftcentral_host_plugin; if (!class_exists('UpdraftPlus_Remote_Communications')) include_once($updraftcentral_host_plugin->get_host_dir().'/vendor/team-updraft/common-libs/src/updraft-rpc/class-udrpc.php'); $ud_rpc = new UpdraftPlus_Remote_Communications($indicator_name); $ud_rpc->set_can_generate(true); return $ud_rpc; } private function create_remote_control_key($index = false, $extra_info = array(), $post_it = false) { global $updraftcentral_host_plugin; $our_keys = $this->get_central_localkeys(); if (!is_array($our_keys)) $our_keys = array(); if (false === $index) { if (empty($our_keys)) { $index = 0; } else { $index = max(array_keys($our_keys))+1; } } $name_hash = $index; if (isset($our_keys[$name_hash])) { unset($our_keys[$name_hash]); } $indicator_name = $this->indicator_name_from_index($name_hash); $ud_rpc = $this->get_udrpc($indicator_name); if ('__updraftpluscom' == $post_it) { $post_it = defined('UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION') ? UPDRAFTPLUS_OVERRIDE_UDCOM_DESTINATION : 'https://updraftplus.com/?updraftcentral_action=receive_key'; $post_it_description = 'UpdraftPlus.Com'; } else { $post_it_description = $post_it; } // Normally, key generation takes seconds, even on a slow machine. However, some Windows machines appear to have a setup in which it takes a minute or more. And then, if you're on a double-localhost setup on slow hardware - even worse. It doesn't hurt to just raise the maximum execution time. if (function_exists('set_time_limit')) @set_time_limit(UPDRAFTCENTRAL_SET_TIME_LIMIT);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $key_size = (empty($extra_info['key_size']) || !is_numeric($extra_info['key_size']) || $extra_info['key_size'] < 512) ? 2048 : (int) $extra_info['key_size']; if (is_object($ud_rpc) && $ud_rpc->generate_new_keypair($key_size)) { if ($post_it && empty($extra_info['mothership_firewalled'])) { $p_url = parse_url($post_it); if (is_array($p_url) && !empty($p_url['user'])) { $http_username = $p_url['user']; $http_password = empty($p_url['pass']) ? '' : $p_url['pass']; $post_it = $p_url['scheme'].'://'.$p_url['host']; if (!empty($p_url['port'])) $post_it .= ':'.$p_url['port']; $post_it .= $p_url['path']; if (!empty($p_url['query'])) $post_it .= '?'.$p_url['query']; } $post_options = array( 'timeout' => 90, 'body' => array( 'updraftcentral_action' => 'receive_key', 'key' => $ud_rpc->get_key_remote() ) ); if (!empty($http_username)) { $post_options['headers'] = array( 'Authorization' => 'Basic '.base64_encode($http_username.':'.$http_password) ); } // This option allows the key to be sent to the other side via a known-secure channel (e.g. http over SSL), rather than potentially allowing it to travel over an unencrypted channel (e.g. http back to the user's browser). As such, if specified, it is compulsory for it to work. $updraftcentral_host_plugin->register_wp_http_option_hooks(); $sent_key = wp_remote_post( $post_it, $post_options ); $updraftcentral_host_plugin->register_wp_http_option_hooks(false); $connection_troubleshooting_url = 'https://updraftplus.com/troubleshooting-updraftcentral-connection-issues/'; if (is_wp_error($sent_key) || empty($sent_key)) { $err_msg = sprintf($updraftcentral_host_plugin->retrieve_show_message('attempt_to_register_failed'), (string) $post_it_description, $connection_troubleshooting_url); if (is_wp_error($sent_key)) $err_msg .= ' '.$sent_key->get_error_message().' ('.$sent_key->get_error_code().')'; return array( 'r' => $err_msg ); } $response = json_decode(wp_remote_retrieve_body($sent_key), true); if (!is_array($response) || !isset($response['key_id']) || !isset($response['key_public'])) { return array( 'r' => sprintf($updraftcentral_host_plugin->retrieve_show_message('attempt_to_register_failed'), (string) $post_it_description, $connection_troubleshooting_url), 'raw' => wp_remote_retrieve_body($sent_key) ); } $key_hash = hash('sha256', $ud_rpc->get_key_remote()); $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => array('key_hash' => $key_hash, 'key_id' => $response['key_id']))); } elseif ($post_it) { // Don't send; instead, include in the bundle info that the mothership is firewalled; this will then tell the mothership to try the reverse connection instead if (is_array($extra_info)) { $extra_info['mothership_firewalled_callback_url'] = wp_nonce_url(admin_url('admin-ajax.php'), 'updraftcentral_receivepublickey'); $extra_info['updraft_key_index'] = $index; } $local_bundle = $ud_rpc->get_portable_bundle('base64_with_count', $extra_info, array('key' => $ud_rpc->get_key_remote())); } if (isset($extra_info['name'])) { $name = (string) $extra_info['name']; unset($extra_info['name']); } else { $name = 'UpdraftCentral Remote Control'; } $our_keys[$name_hash] = array( 'name' => $name, 'key' => $ud_rpc->get_key_local(), 'extra_info' => $extra_info, 'created' => time(), ); // Store the other side's public key if (!empty($response) && is_array($response) && !empty($response['key_public'])) { $our_keys[$name_hash]['publickey_remote'] = $response['key_public']; } $this->update_central_localkeys($our_keys, true, 'no'); return array( 'bundle' => $local_bundle, 'r' => $updraftcentral_host_plugin->retrieve_show_message('key_created_successfully').' '.$updraftcentral_host_plugin->retrieve_show_message('copy_paste_key'), ); } return false; } /** * Get the HTML for the keys table * * @return String */ public function get_keys_table() { // This is an additional check - it implies requirement for a dashboard context if (!current_user_can('manage_options')) return; global $updraftcentral_host_plugin; $ret = ''; $our_keys = $this->get_central_localkeys(); if (!is_array($our_keys)) $our_keys = array(); if (empty($our_keys)) { $ret .= ''.$updraftcentral_host_plugin->retrieve_show_message('no_updraftcentral_dashboards').''; } foreach ($our_keys as $i => $key) { if (empty($key['extra_info'])) continue; $user_id = $key['extra_info']['user_id']; if (!empty($key['extra_info']['mothership'])) { $mothership_url = $key['extra_info']['mothership']; if ('__updraftpluscom' == $mothership_url) { $reconstructed_url = 'https://updraftplus.com'; } else { $purl = parse_url($mothership_url); $path = empty($purl['path']) ? '' : $purl['path']; $reconstructed_url = $purl['scheme'].'://'.$purl['host'].(!empty($purl['port']) ? ':'.$purl['port'] : '').$path; } } else { $reconstructed_url = $updraftcentral_host_plugin->retrieve_show_message('unknown'); } $name = $key['name']; $user = get_user_by('id', $user_id); $user_display = is_a($user, 'WP_User') ? $user->user_login.' ('.$user->user_email.')' : $updraftcentral_host_plugin->retrieve_show_message('unknown'); $ret .= ''.htmlspecialchars($name).' ('.htmlspecialchars($i).')'.$updraftcentral_host_plugin->retrieve_show_message('access_as_user')." ".htmlspecialchars($user_display)."
".$updraftcentral_host_plugin->retrieve_show_message('public_key_sent').' '.htmlspecialchars($reconstructed_url).'
'; if (!empty($key['created'])) { $ret .= $updraftcentral_host_plugin->retrieve_show_message('created').' '.date_i18n(get_option('date_format').' '.get_option('time_format'), $key['created']).'.'; if (!empty($key['extra_info']['key_size'])) { $ret .= ' '.sprintf($updraftcentral_host_plugin->retrieve_show_message('key_size'), $key['extra_info']['key_size']).'.'; } $ret .= '
'; } $ret .= ''.$updraftcentral_host_plugin->retrieve_show_message('delete').''; } ob_start(); ?>
retrieve_show_message('manage_keys'), count($our_keys)); ?>
retrieve_show_message('key_description', true); ?> retrieve_show_message('details', true); ?>

retrieve_show_message('connect_to_updraftcentral_dashboard', true); ?>



retrieve_show_message('website_installed'), 'UpdraftCentral'); ?>
enqueue_central_scripts(); global $updraftcentral_host_plugin; $including_desc = ''; if (function_exists('get_current_screen')) { $screen = get_current_screen(); $hosts = apply_filters('updraftcentral_host_plugins', array()); $includes = $updraftcentral_host_plugin->retrieve_show_message('including_description'); foreach ($hosts as $plugin) { if (false !== stripos($screen->id, $plugin)) { $key = str_replace('-', '_', strtolower($plugin)).'_desc'; if (isset($includes[$key])) { $including_desc = $includes[$key]; break; } } } } $updraftcentral_description = preg_replace('/\s+/', ' ', sprintf($updraftcentral_host_plugin->retrieve_show_message('updraftcentral_description'), $including_desc)); ?>

retrieve_show_message('updraftcentral_remote_control', true); ?>

'.$updraftcentral_host_plugin->retrieve_show_message('read_more').''; ?>

create_key_markup(); ?> get_keys_table(); ?> get_log_markup(); ?>
__('UpdraftCentral Connection', 'updraftplus'), 'updraftcentral_connection_successful' => __('An UpdraftCentral connection has been made successfully.', 'updraftplus'), 'updraftcentral_connection_failed' => __('A new UpdraftCentral connection has not been made.', 'updraftplus'), 'unknown_key' => __('The key referred to was unknown.', 'updraftplus'), 'not_logged_in' => __('You are not logged into this WordPress site in your web browser.', 'updraftplus'), 'must_visit_url' => __('You must visit this URL in the same browser and login session as you created the key in.', 'updraftplus'), 'security_check' => __('Security check. ', 'updraftplus'), 'must_visit_link' => __('You must visit this link in the same browser and login session as you created the key in.', 'updraftplus'), 'connection_already_made' => __('This connection appears to already have been made.', 'updraftplus'), 'close' => __('Close', 'updraftplus'), 'nothing_yet_logged' => __('(Nothing yet logged)', 'updraftplus'), 'invalid_url' => __('An invalid URL was entered', 'updraftplus'), 'updraftcentral_key_created' => __('UpdraftCentral key created successfully', 'updraftplus'), 'need_to_copy_key' => __('You now need to copy the key below and enter it at your %s.', 'updraftplus'), 'press_add_site_button' => __('At your UpdraftCentral dashboard you should press the "Add Site" button then paste the key in the input box.', 'updraftplus'), 'detailed_instructions' => __('Detailed instructions for this can be found at %s', 'updraftplus'), 'control_this_site' => __('You can now control this site via your UpdraftCentral dashboard at %s.', 'updraftplus'), 'attempt_to_register_failed' => __('A key was created, but the attempt to register it with %1$s was unsuccessful. You can try again, or try using the alternative connection method if the problem persists. For more information visit %2$s', 'updraftplus'), 'key_created_successfully' => __('Key created successfully.', 'updraftplus'), 'copy_paste_key' => __('You must copy and paste this key now - it cannot be shown again.', 'updraftplus'), 'no_updraftcentral_dashboards' => __('There are no UpdraftCentral dashboards that can currently control this site.', 'updraftplus'), 'unknown' => __('Unknown', 'updraftplus'), 'access_as_user' => __('Access this site as user:', 'updraftplus'), 'public_key_sent' => __('Public key was sent to:', 'updraftplus'), 'created' => __('Created:', 'updraftplus'), 'key_size' => __('Key size: %d bits', 'updraftplus'), 'delete' => __('Delete...', 'updraftplus'), 'manage_keys' => __('Manage existing keys (%d)...', 'updraftplus'), 'key_description' => __('Key description', 'updraftplus'), 'details' => __('Details', 'updraftplus'), 'connect_to_updraftcentral_dashboard' => __('Connect this site to an UpdraftCentral dashboard found at...', 'updraftplus'), 'in_example' => __('i.e. if you have %s there', 'updraftplus'), 'an_account' => __('an account', 'updraftplus'), 'self_hosted_dashboard' => __('Self-hosted dashboard', 'updraftplus'), 'website_installed' => __('A website where you have installed %s', 'updraftplus'), 'enter_url' => __('Enter the URL where your self-hosted install of UpdraftCentral is located:', 'updraftplus'), 'updraftcentral_dashboard_url' => __('URL for the site of your UpdraftCentral dashboard', 'updraftplus'), 'next' => __('Next', 'updraftplus'), 'updraftcentral_connection_details' => __('UpdraftCentral dashboard connection details', 'updraftplus'), 'description' => __('Description', 'updraftplus'), 'enter_description' => __('Enter any description', 'updraftplus'), 'encryption_key_size' => __('Encryption key size:', 'updraftplus'), 'bits' => __('%s bits', 'updraftplus'), 'bytes' => __('%s bytes', 'updraftplus'), 'easy_to_break' => __('easy to break, fastest', 'updraftplus'), 'faster' => __('faster (possibility for slow PHP installs)', 'updraftplus'), 'recommended' => __('recommended', 'updraftplus'), 'slower' => __('slower, strongest', 'updraftplus'), 'use_alternative_method' => __('Use the alternative method for making a connection with the dashboard.', 'updraftplus'), 'more_information' => __('More information...', 'updraftplus'), 'this_is_useful' => __('This is useful if the dashboard webserver cannot be contacted with incoming traffic by this website (for example, this is the case if this website is hosted on the public Internet, but the UpdraftCentral dashboard is on localhost, or on an Intranet, or if this website has an outgoing firewall), or if the dashboard website does not have a SSL certificate.', 'updraftplus'), 'create' => __('Create', 'updraftplus'), 'back' => __('Back...', 'updraftplus'), 'view_log_events' => __('View recent UpdraftCentral log events', 'updraftplus'), 'updraftcentral_remote_control' => __('UpdraftCentral (Remote Control)', 'updraftplus'), 'updraftcentral_description' => __('UpdraftCentral enables control of your WordPress sites %s from a central dashboard.', 'updraftplus'), 'including_description' => array( 'wp_optimize_desc' => __('(including management of WP-Optimize)', 'updraftplus'), 'updraftplus_desc' => __('(including management of backups and updates)', 'updraftplus'), ), 'read_more' => __('Read more about it here.', 'updraftplus'), 'create_another_key' => __('Create another key', 'updraftplus'), 'unable_to_connect' => __('Unable to connect to the filesystem', 'updraftplus'), 'unable_to_activate' => __('Unable to activate %s successfully. Make sure that this %s is compatible with your remote WordPress version. WordPress version currently installed in your remote website is %s.', 'updraftplus'), 'unable_to_install' => __('Unable to install %s. Make sure that the zip file is a valid %s file and a previous version of this %s does not exist. If you wish to overwrite an existing %s then you will have to manually delete it from the %s folder on the remote website and try uploading the file again.', 'updraftplus'), 'failed_to_attach_media' => __('Failed to attach media.', 'updraftplus'), 'media_attached' => __('Media has been attached to post.', 'updraftplus'), 'failed_to_detach_media' => __('Failed to detach media.', 'updraftplus'), 'media_detached' => __('Media has been detached from post.', 'updraftplus'), 'failed_to_delete_media' => __('Failed to delete selected media.', 'updraftplus'), 'selected_media_deleted' => __('Selected media has been deleted successfully.', 'updraftplus'), 'unattached' => __('Unattached', 'updraftplus'), 'default_template' => __('Default template', 'updraftplus'), 'parameters_missing' => __('Expected parameter(s) missing.', 'updraftplus'), 'fetching' => __('Fetching...', 'updraftplus'), 'deleting' => __('Deleting...', 'updraftplus'), 'enter_mothership_url' => __('Please enter a valid URL', 'updraftplus'), 'creating_please_allow' => __('Creating...', 'updraftplus').(function_exists('openssl_encrypt') ? '' : ' ('.__('your PHP install lacks the openssl module; as a result, this can take minutes; if nothing has happened by then, then you should either try a smaller key size, or ask your web hosting company how to enable this PHP module on your setup.', 'updraftplus').')'), 'unexpectedresponse' => __('Unexpected response:', 'updraftplus'), 'updraftcentral_wizard_empty_url' => __('Please enter the URL where your UpdraftCentral dashboard is hosted.', 'updraftplus'), 'updraftcentral_wizard_invalid_url' => __('Please enter a valid URL e.g http://example.com', 'updraftplus'), 'insufficient_privilege' => __('Sorry, you do not have enough privilege to execute the requested action.', 'updraftplus'), ); PKwL\-:-: updraftplus/central/listener.phpnu[host = $updraftcentral_host_plugin; // It seems impossible for this condition to result in a return; but it seems Plesk can do something odd within the control panel that causes a problem - see HS#6276 if (!is_a($this->host, 'UpdraftCentral_Host')) return; $this->command_classes = $command_classes; foreach ($keys as $name_hash => $key) { // publickey_remote isn't necessarily set yet, depending on the key exchange method if (!is_array($key) || empty($key['extra_info']) || empty($key['publickey_remote'])) continue; $indicator = $name_hash.'.central.updraftplus.com'; $ud_rpc = $this->host->get_udrpc($indicator); $this->udrpc_version = $ud_rpc->version; // Only turn this on if you are comfortable with potentially anything appearing in your PHP error log if (defined('UPDRAFTCENTRAL_UDRPC_FORCE_DEBUG') && UPDRAFTCENTRAL_UDRPC_FORCE_DEBUG) $ud_rpc->set_debug(true); $this->receivers[$indicator] = $ud_rpc; $this->extra_info[$indicator] = isset($key['extra_info']) ? $key['extra_info'] : null; $ud_rpc->set_key_local($key['key']); $ud_rpc->set_key_remote($key['publickey_remote']); // Create listener (which causes WP actions to be fired when messages are received) $ud_rpc->activate_replay_protection(); if (!empty($key['extra_info']) && isset($key['extra_info']['mothership'])) { $mothership = $key['extra_info']['mothership']; $url = ''; if ('__updraftpluscom' == $mothership) { $url = 'https://updraftplus.com'; } elseif (false != ($parsed = parse_url($key['extra_info']['mothership'])) && is_array($parsed)) { $url = $parsed['scheme'].'://'.$parsed['host']; } if (!empty($url)) $ud_rpc->set_allow_cors_from(array($url)); } $ud_rpc->create_listener(); } // If we ever need to expand beyond a single GET action, this can/should be generalised and put into the commands class if (!empty($_GET['udcentral_action']) && 'login' == $_GET['udcentral_action']) { // auth_redirect() does not return, according to the documentation; but the code shows that it can // auth_redirect(); if (!empty($_GET['login_id']) && is_numeric($_GET['login_id']) && !empty($_GET['login_key'])) { $login_user = get_user_by('id', $_GET['login_id']); // THis is included so we can get $wp_version include_once(ABSPATH.WPINC.'/version.php'); if (is_a($login_user, 'WP_User') || (version_compare($wp_version, '3.5', '<') && !empty($login_user->ID))) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable // Allow site implementers to disable this functionality -- The variable is defined inside the ABSPATH.WPINC.'/version.php'. $allow_autologin = apply_filters('updraftcentral_allow_autologin', true, $login_user); if ($allow_autologin) { $login_key = get_user_meta($login_user->ID, 'updraftcentral_login_key', true); if (is_array($login_key) && !empty($login_key['created']) && $login_key['created'] > time() - 60 && !empty($login_key['key']) && $login_key['key'] == $_GET['login_key']) { $autologin = empty($login_key['redirect_url']) ? network_admin_url() : $login_key['redirect_url']; } } } } if (!empty($autologin)) { // Allow use once only delete_user_meta($login_user->ID, 'updraftcentral_login_key'); $this->autologin_user($login_user, $autologin); } } add_filter('udrpc_action', array($this, 'udrpc_action'), 10, 5); add_filter('updraftcentral_get_command_info', array($this, 'updraftcentral_get_command_info'), 10, 2); add_filter('updraftcentral_get_updraftplus_status', array($this, 'get_updraftplus_status'), 10, 1); } /** * Retrieves the UpdraftPlus plugin status whether it has been installed or activated * * @param mixed $data Default data to return * @return array */ public function get_updraftplus_status($data) { // Handle cases of users who rename their plugin folders if (class_exists('UpdraftPlus')) { $data['is_updraftplus_installed'] = true; $data['is_updraftplus_active'] = true; } else { if (!function_exists('get_plugins')) require_once(ABSPATH.'wp-admin/includes/plugin.php'); $plugins = get_plugins(); $key = 'updraftplus/updraftplus.php'; if (array_key_exists($key, $plugins)) { $data['is_updraftplus_installed'] = true; if (is_plugin_active($key)) $data['is_updraftplus_active'] = true; } } return $data; } /** * Retrieves command class information and includes class file if class * is currently not available. * * @param mixed $response The default response to return if the submitted command does not exists * @param string $command The command to parse and check * @return array Contains the following command information "command_php_class", "class_prefix" and "command" */ public function updraftcentral_get_command_info($response, $command) { if (!preg_match('/^([a-z0-9]+)\.(.*)$/', $command, $matches)) return $response; $class_prefix = $matches[1]; $command = $matches[2]; // Other plugins might have registered the filter rather later so we need to make // sure that we get all the commands intended for UpdraftCentral. $this->command_classes = apply_filters('updraftcentral_remotecontrol_command_classes', $this->command_classes); // We only handle some commands - the others, we let something else deal with if (!isset($this->command_classes[$class_prefix])) return $response; $command_php_class = $this->command_classes[$class_prefix]; $command_base_class_at = apply_filters('updraftcentral_command_base_class_at', UPDRAFTCENTRAL_CLIENT_DIR.'/commands.php'); if (!class_exists('UpdraftCentral_Commands')) include_once($command_base_class_at); // Second parameter has been passed since do_action('updraftcentral_command_class_wanted', $command_php_class); if (!class_exists($command_php_class)) { if (file_exists(UPDRAFTCENTRAL_CLIENT_DIR.'/modules/'.$class_prefix.'.php')) { include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/modules/'.$class_prefix.'.php'); } } return array( 'command_php_class' => $command_php_class, 'class_prefix' => $class_prefix, 'command' => $command ); } /** * Do verification before calling this method * * @param WP_User|Object $user user object for autologin * @param boolean $redirect_url Redirect URL */ private function autologin_user($user, $redirect_url = false) { if (!is_user_logged_in()) { // $user = get_user_by('id', $user_id); // Don't check that it's a WP_User - that's WP 3.5+ only if (!is_object($user) || empty($user->ID)) return; wp_set_current_user($user->ID, $user->user_login); wp_set_auth_cookie($user->ID); do_action('wp_login', $user->user_login, $user); } if ($redirect_url) { wp_safe_redirect($redirect_url); exit; } } /** * WP filter udrpc_action * * @param Array $response - the unfiltered response that will be returned * @param String $command - the command being called * @param Array $data - the parameters to the command * @param String $key_name_indicator - the UC key that is in use * @param Object $ud_rpc - the UDRP object * * @return Array - filtered response */ public function udrpc_action($response, $command, $data, $key_name_indicator, $ud_rpc) { try { if (empty($this->receivers[$key_name_indicator])) return $response; // This can be used to detect an UpdraftCentral context if (!defined('UPDRAFTCENTRAL_COMMAND')) define('UPDRAFTCENTRAL_COMMAND', $command); $this->initialise_listener_error_handling(); // UpdraftCentral needs this extra information especially now that the UpdraftCentral // libraries can be totally embedded in other plugins (e.g. WP-Optimize, etc.) thus, // that makes the UpdraftPlus plugin optional. // // This will give UpdraftCentral a proper way of disabling the backup feature // for this site if the UpdraftPlus plugin is currently not installed or activated. $extra = apply_filters('updraftcentral_get_updraftplus_status', array( 'is_updraftplus_installed' => false, 'is_updraftplus_active' => false )); $command_info = apply_filters('updraftcentral_get_command_info', false, $command); if (!$command_info) { if (isset($response['data']) && is_array($response['data'])) $response['data']['extra'] = $extra; return $response; } $class_prefix = $command_info['class_prefix']; $command = $command_info['command']; $command_php_class = $command_info['command_php_class']; if (empty($this->commands[$class_prefix])) { if (class_exists($command_php_class)) { $this->commands[$class_prefix] = new $command_php_class($this); } } $command_class = isset($this->commands[$class_prefix]) ? $this->commands[$class_prefix] : new stdClass; if ('_' == substr($command, 0, 1) || !is_a($command_class, $command_php_class) || (!method_exists($command_class, $command) && !method_exists($command_class, '__call'))) { if (defined('UPDRAFTCENTRAL_UDRPC_FORCE_DEBUG') && UPDRAFTCENTRAL_UDRPC_FORCE_DEBUG) error_log("Unknown RPC command received: ".$command); return $this->return_rpc_message(array('response' => 'rpcerror', 'data' => array('code' => 'unknown_rpc_command', 'data' => array('prefix' => $class_prefix, 'command' => $command, 'class' => $command_php_class)))); } $extra_info = isset($this->extra_info[$key_name_indicator]) ? $this->extra_info[$key_name_indicator] : null; // Make it so that current_user_can() checks can apply + work if (!empty($extra_info['user_id'])) wp_set_current_user($extra_info['user_id']); $this->current_udrpc = $ud_rpc; do_action('updraftcentral_listener_pre_udrpc_action', $command, $command_class, $data, $extra_info); // Allow the command class to perform any boiler-plate actions. if (is_callable(array($command_class, '_pre_action'))) call_user_func(array($command_class, '_pre_action'), $command, $data, $extra_info); // Despatch $msg = apply_filters('updraftcentral_listener_udrpc_action', call_user_func(array($command_class, $command), $data, $extra_info), $command_class, $class_prefix, $command, $data, $extra_info); if (is_callable(array($command_class, '_post_action'))) call_user_func(array($command_class, '_post_action'), $command, $data, $extra_info); do_action('updraftcentral_listener_post_udrpc_action', $command, $command_class, $data, $extra_info); if (isset($msg['data']) && is_array($msg['data'])) { $msg['data']['extra'] = $extra; } return $this->return_rpc_message($msg); } catch (Exception $e) { $log_message = 'PHP Fatal Exception error ('.get_class($e).') has occurred during UpdraftCentral command execution. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; error_log($log_message); return $this->return_rpc_message(array('response' => 'rpcerror', 'data' => array('code' => 'rpc_fatal_error', 'data' => array('command' => $command, 'message' => $log_message)))); // @codingStandardsIgnoreLine } catch (Error $e) { $log_message = 'PHP Fatal error ('.get_class($e).') has occurred during UpdraftCentral command execution. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; error_log($log_message); return $this->return_rpc_message(array('response' => 'rpcerror', 'data' => array('code' => 'rpc_fatal_error', 'data' => array('command' => $command, 'message' => $log_message)))); } } public function get_current_udrpc() { return $this->current_udrpc; } private function initialise_listener_error_handling() { global $updraftcentral_host_plugin; $this->host->error_reporting_stop_when_logged = true; set_error_handler(array($this->host, 'php_error'), E_ALL & ~E_STRICT); $this->php_events = array(); @ob_start();// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Might be a bigger picture that I am missing but do we need to silence errors here? add_filter($updraftcentral_host_plugin->get_logline_filter(), array($this, 'updraftcentral_logline'), 10, 4); if (!$updraftcentral_host_plugin->get_debug_mode()) return; } public function updraftcentral_logline($line, $nonce, $level, $uniq_id) {// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Unused parameter is present because the method is used as a WP filter. if ('notice' === $level && 'php_event' === $uniq_id) { $this->php_events[] = $line; } return $line; } public function return_rpc_message($msg) { if (is_array($msg) && isset($msg['response']) && 'error' == $msg['response']) { $this->host->log('Unexpected response code in remote communications: '.serialize($msg)); } $caught_output = @ob_get_contents();// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Might be a bigger picture that I am missing but do we need to silence errors here? @ob_end_clean();// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Might be a bigger picture that I am missing but do we need to silence errors here? // If turning output-catching off, turn this on instead: // $caught_output = ''; @ob_end_flush(); // If there's higher-level output buffering going on, then get rid of that if (ob_get_level()) ob_end_clean(); if ($caught_output) { if (!isset($msg['data'])) $msg['data'] = null; $msg['data'] = array('caught_output' => $caught_output, 'previous_data' => $msg['data']); $already_rearranged_data = true; } if (!empty($this->php_events)) { if (!isset($msg['data'])) $msg['data'] = null; if (!empty($already_rearranged_data)) { $msg['data']['php_events'] = array(); } else { $msg['data'] = array('php_events' => array(), 'previous_data' => $msg['data']); } foreach ($this->php_events as $logline) { $msg['data']['php_events'][] = $logline; } } restore_error_handler(); return $msg; } } PKwL\Ƌ updraftplus/central/factory.phpnu[get_plugin_name()) // // N.B. You can add additional host plugins here. Just make sure that you will create // a host class for that particular plugin (see central/wp-optimize.php as an example). $mapped_classes = array( 'updraftplus' => 'UpdraftPlus_Host', 'wp-optimize' => 'WP_Optimize_Host', ); $path = $host_class = ''; foreach ($hosts as $plugin) { // Make sure that we have a registered host class with a valid file that exist $host_file = dirname(__FILE__).'/'.$plugin.'.php'; if (isset($mapped_classes[$plugin]) && file_exists($host_file)) { $path = $host_file; $host_class = $mapped_classes[$plugin]; break; } } // The host file was not found under this plugin thus, we let the other plugins // create or build the host plugin (global) variable instead. if (empty($path)) return null; if (!class_exists($host_class)) include_once($path); // Re-check host class once again just to make sure that we have the desired // class loaded before calling its instance method if (class_exists($host_class)) { return call_user_func(array($host_class, 'instance')); } return null; } } endif; global $updraftcentral_host_plugin; $updraftcentral_host_plugin = UpdraftCentral_Factory::create_host(); if ($updraftcentral_host_plugin) { $updraftcentral_host_plugin->load_updraftcentral(); } PKwL\pp=updraftplus/css/tether-shepherd/shepherd-theme-arrows-fix.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } PKwL\00Gupdraftplus/css/tether-shepherd/shepherd-theme-arrows-plain-buttons.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element, .shepherd-element:after, .shepherd-element:before, .shepherd-element *, .shepherd-element *:after, .shepherd-element *:before { box-sizing: border-box; } .shepherd-element { position: absolute; display: none; } .shepherd-element.shepherd-open { display: block; } .shepherd-element.shepherd-theme-arrows-plain-buttons { max-width: 100%; max-height: 100%; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content { border-radius: 5px; position: relative; font-family: inherit; background: #fff; color: #444; padding: 1em; font-size: 1.1em; line-height: 1.5em; -webkit-transform: translateZ(0); transform: translateZ(0); -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content:before { content: ""; display: block; position: absolute; width: 0; height: 0; border-color: transparent; border-width: 16px; border-style: solid; pointer-events: none; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content { left: -32px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content { left: 32px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { top: 100%; left: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { top: 100%; right: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before { top: 100%; left: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before { top: 100%; right: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { top: 16px; left: 100%; border-left-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 16px; right: 100%; border-right-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { bottom: 16px; left: 100%; border-left-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { bottom: 16px; right: 100%; border-right-color: #fff; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: #eee; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header { background: #eee; padding: 1em; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { padding: 0; margin-bottom: 0; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-cancel-link .shepherd-content header h3 { float: left; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content { padding: 0; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header { *zoom: 1; border-radius: 5px 5px 0 0; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header:after { content: ""; display: table; clear: both; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header h3 { margin: 0; line-height: 1; font-weight: normal; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header a.shepherd-cancel-link { float: right; text-decoration: none; font-size: 1.25em; line-height: .8em; font-weight: normal; color: rgba(0, 0, 0, 0.5); opacity: 0.25; position: relative; top: .1em; padding: .8em; margin-bottom: -.8em; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header a.shepherd-cancel-link:hover { opacity: 1; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text { padding: 1em; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p { margin: 0 0 .5em 0; line-height: 1.3em; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p:last-child { margin-bottom: 0; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer { padding: 0 1em 1em; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons { text-align: right; list-style: none; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li { display: inline; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; cursor: pointer; margin: 0 .5em 0 0; text-decoration: none; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button { margin-right: 0; } PKwL\QU<**=updraftplus/css/tether-shepherd/shepherd-theme-square.min.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}.shepherd-element,.shepherd-element:after,.shepherd-element:before,.shepherd-element *,.shepherd-element *:after,.shepherd-element *:before{box-sizing:border-box}.shepherd-element{position:absolute;display:none}.shepherd-element.shepherd-open{display:block}.shepherd-element.shepherd-theme-square{max-width:100%;max-height:100%}.shepherd-element.shepherd-theme-square .shepherd-content{border-radius:5px;position:relative;font-family:inherit;background:#f6f6f6;color:#444;padding:1em;font-size:1.1em;line-height:1.5em}.shepherd-element.shepherd-theme-square .shepherd-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid;pointer-events:none}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content{left:-32px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content{left:32px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{top:100%;left:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{top:100%;right:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before{top:100%;left:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before{top:100%;right:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{top:16px;left:100%;border-left-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{top:16px;right:100%;border-right-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{bottom:16px;left:100%;border-left-color:#f6f6f6}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{bottom:16px;right:100%;border-right-color:#f6f6f6}.shepherd-element.shepherd-theme-square{border-radius:0;z-index:9999;max-width:24em;font-size:1em}.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before{border-bottom-color:#e6e6e6}.shepherd-element.shepherd-theme-square.shepherd-has-title .shepherd-content header{background:#e6e6e6;padding:1em}.shepherd-element.shepherd-theme-square.shepherd-has-title .shepherd-content header a.shepherd-cancel-link{padding:0;margin-bottom:0}.shepherd-element.shepherd-theme-square.shepherd-has-cancel-link .shepherd-content header h3{float:left}.shepherd-element.shepherd-theme-square .shepherd-content{box-shadow:0 0 0 1px rgba(0,0,0,0.17);border-radius:0;padding:0}.shepherd-element.shepherd-theme-square .shepherd-content *{font-size:inherit}.shepherd-element.shepherd-theme-square .shepherd-content header{*zoom:1;border-radius:0}.shepherd-element.shepherd-theme-square .shepherd-content header:after{content:"";display:table;clear:both}.shepherd-element.shepherd-theme-square .shepherd-content header h3{margin:0;line-height:1;font-weight:normal}.shepherd-element.shepherd-theme-square .shepherd-content header a.shepherd-cancel-link{float:right;text-decoration:none;font-size:1.25em;line-height:.8em;font-weight:normal;color:rgba(0,0,0,0.5);opacity:.25;position:relative;top:.1em;padding:.8em;margin-bottom:-.8em}.shepherd-element.shepherd-theme-square .shepherd-content header a.shepherd-cancel-link:hover{opacity:1}.shepherd-element.shepherd-theme-square .shepherd-content .shepherd-text{padding:1em}.shepherd-element.shepherd-theme-square .shepherd-content .shepherd-text p{margin:0 0 .5em 0;line-height:1.3em}.shepherd-element.shepherd-theme-square .shepherd-content .shepherd-text p:last-child{margin-bottom:0}.shepherd-element.shepherd-theme-square .shepherd-content footer{padding:0 1em 1em}.shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons{text-align:right;list-style:none;padding:0;margin:0}.shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li{display:inline;padding:0;margin:0}.shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li .shepherd-button{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:0;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}.shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary{background:#eee;color:#888}.shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button{margin-right:0}.shepherd-start-tour-button.shepherd-theme-square{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:0;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}PKwL\zF**>updraftplus/css/tether-shepherd/shepherd-theme-default.min.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}.shepherd-element,.shepherd-element:after,.shepherd-element:before,.shepherd-element *,.shepherd-element *:after,.shepherd-element *:before{box-sizing:border-box}.shepherd-element{position:absolute;display:none}.shepherd-element.shepherd-open{display:block}.shepherd-element.shepherd-theme-default{max-width:100%;max-height:100%}.shepherd-element.shepherd-theme-default .shepherd-content{border-radius:5px;position:relative;font-family:inherit;background:#f6f6f6;color:#444;padding:1em;font-size:1.1em;line-height:1.5em}.shepherd-element.shepherd-theme-default .shepherd-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid;pointer-events:none}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content{left:-32px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content{left:32px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{top:100%;left:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{top:100%;right:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before{top:100%;left:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before{top:100%;right:16px;border-top-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{top:16px;left:100%;border-left-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{top:16px;right:100%;border-right-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{bottom:16px;left:100%;border-left-color:#f6f6f6}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{bottom:16px;right:100%;border-right-color:#f6f6f6}.shepherd-element.shepherd-theme-default{z-index:9999;max-width:24em;font-size:1em}.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before{border-bottom-color:#e6e6e6}.shepherd-element.shepherd-theme-default.shepherd-has-title .shepherd-content header{background:#e6e6e6;padding:1em}.shepherd-element.shepherd-theme-default.shepherd-has-title .shepherd-content header a.shepherd-cancel-link{padding:0;margin-bottom:0}.shepherd-element.shepherd-theme-default.shepherd-has-cancel-link .shepherd-content header h3{float:left}.shepherd-element.shepherd-theme-default .shepherd-content{box-shadow:0 0 0 1px rgba(0,0,0,0.17);padding:0}.shepherd-element.shepherd-theme-default .shepherd-content *{font-size:inherit}.shepherd-element.shepherd-theme-default .shepherd-content header{*zoom:1;border-radius:5px 5px 0 0}.shepherd-element.shepherd-theme-default .shepherd-content header:after{content:"";display:table;clear:both}.shepherd-element.shepherd-theme-default .shepherd-content header h3{margin:0;line-height:1;font-weight:normal}.shepherd-element.shepherd-theme-default .shepherd-content header a.shepherd-cancel-link{float:right;text-decoration:none;font-size:1.25em;line-height:.8em;font-weight:normal;color:rgba(0,0,0,0.5);opacity:.25;position:relative;top:.1em;padding:.8em;margin-bottom:-.8em}.shepherd-element.shepherd-theme-default .shepherd-content header a.shepherd-cancel-link:hover{opacity:1}.shepherd-element.shepherd-theme-default .shepherd-content .shepherd-text{padding:1em}.shepherd-element.shepherd-theme-default .shepherd-content .shepherd-text p{margin:0 0 .5em 0;line-height:1.3em}.shepherd-element.shepherd-theme-default .shepherd-content .shepherd-text p:last-child{margin-bottom:0}.shepherd-element.shepherd-theme-default .shepherd-content footer{padding:0 1em 1em}.shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons{text-align:right;list-style:none;padding:0;margin:0}.shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li{display:inline;padding:0;margin:0}.shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li .shepherd-button{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:3px;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}.shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary{background:#eee;color:#888}.shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button{margin-right:0}.shepherd-start-tour-button.shepherd-theme-default{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:3px;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}PKwL\f$lR2R29updraftplus/css/tether-shepherd/shepherd-theme-square.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element, .shepherd-element:after, .shepherd-element:before, .shepherd-element *, .shepherd-element *:after, .shepherd-element *:before { box-sizing: border-box; } .shepherd-element { position: absolute; display: none; } .shepherd-element.shepherd-open { display: block; } .shepherd-element.shepherd-theme-square { max-width: 100%; max-height: 100%; } .shepherd-element.shepherd-theme-square .shepherd-content { border-radius: 5px; position: relative; font-family: inherit; background: #f6f6f6; color: #444; padding: 1em; font-size: 1.1em; line-height: 1.5em; } .shepherd-element.shepherd-theme-square .shepherd-content:before { content: ""; display: block; position: absolute; width: 0; height: 0; border-color: transparent; border-width: 16px; border-style: solid; pointer-events: none; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content { left: -32px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content { left: 32px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { top: 100%; left: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { top: 100%; right: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before { top: 100%; left: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before { top: 100%; right: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { top: 16px; left: 100%; border-left-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 16px; right: 100%; border-right-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { bottom: 16px; left: 100%; border-left-color: #f6f6f6; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { bottom: 16px; right: 100%; border-right-color: #f6f6f6; } .shepherd-element.shepherd-theme-square { border-radius: 0; z-index: 9999; max-width: 24em; font-size: 1em; } .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-square.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: #e6e6e6; } .shepherd-element.shepherd-theme-square.shepherd-has-title .shepherd-content header { background: #e6e6e6; padding: 1em; } .shepherd-element.shepherd-theme-square.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { padding: 0; margin-bottom: 0; } .shepherd-element.shepherd-theme-square.shepherd-has-cancel-link .shepherd-content header h3 { float: left; } .shepherd-element.shepherd-theme-square .shepherd-content { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.17); border-radius: 0; padding: 0; } .shepherd-element.shepherd-theme-square .shepherd-content * { font-size: inherit; } .shepherd-element.shepherd-theme-square .shepherd-content header { *zoom: 1; border-radius: 0; } .shepherd-element.shepherd-theme-square .shepherd-content header:after { content: ""; display: table; clear: both; } .shepherd-element.shepherd-theme-square .shepherd-content header h3 { margin: 0; line-height: 1; font-weight: normal; } .shepherd-element.shepherd-theme-square .shepherd-content header a.shepherd-cancel-link { float: right; text-decoration: none; font-size: 1.25em; line-height: .8em; font-weight: normal; color: rgba(0, 0, 0, 0.5); opacity: 0.25; position: relative; top: .1em; padding: .8em; margin-bottom: -.8em; } .shepherd-element.shepherd-theme-square .shepherd-content header a.shepherd-cancel-link:hover { opacity: 1; } .shepherd-element.shepherd-theme-square .shepherd-content .shepherd-text { padding: 1em; } .shepherd-element.shepherd-theme-square .shepherd-content .shepherd-text p { margin: 0 0 .5em 0; line-height: 1.3em; } .shepherd-element.shepherd-theme-square .shepherd-content .shepherd-text p:last-child { margin-bottom: 0; } .shepherd-element.shepherd-theme-square .shepherd-content footer { padding: 0 1em 1em; } .shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons { text-align: right; list-style: none; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li { display: inline; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li .shepherd-button { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 0; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } .shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary { background: #eee; color: #888; } .shepherd-element.shepherd-theme-square .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button { margin-right: 0; } .shepherd-start-tour-button.shepherd-theme-square { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 0; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } PKwL\] ++Bupdraftplus/css/tether-shepherd/shepherd-theme-square-dark.min.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}.shepherd-element,.shepherd-element:after,.shepherd-element:before,.shepherd-element *,.shepherd-element *:after,.shepherd-element *:before{box-sizing:border-box}.shepherd-element{position:absolute;display:none}.shepherd-element.shepherd-open{display:block}.shepherd-element.shepherd-theme-square-dark{max-width:100%;max-height:100%}.shepherd-element.shepherd-theme-square-dark .shepherd-content{border-radius:5px;position:relative;font-family:inherit;background:#232323;color:#eee;padding:1em;font-size:1.1em;line-height:1.5em}.shepherd-element.shepherd-theme-square-dark .shepherd-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid;pointer-events:none}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content{left:-32px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content{left:32px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{top:100%;left:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{top:100%;right:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before{top:100%;left:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before{top:100%;right:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{top:16px;left:100%;border-left-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{top:16px;right:100%;border-right-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{bottom:16px;left:100%;border-left-color:#232323}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{bottom:16px;right:100%;border-right-color:#232323}.shepherd-element.shepherd-theme-square-dark{border-radius:0;z-index:9999;max-width:24em;font-size:1em}.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before{border-bottom-color:#303030}.shepherd-element.shepherd-theme-square-dark.shepherd-has-title .shepherd-content header{background:#303030;padding:1em}.shepherd-element.shepherd-theme-square-dark.shepherd-has-title .shepherd-content header a.shepherd-cancel-link{padding:0;margin-bottom:0}.shepherd-element.shepherd-theme-square-dark.shepherd-has-cancel-link .shepherd-content header h3{float:left}.shepherd-element.shepherd-theme-square-dark .shepherd-content{box-shadow:0 0 0 1px rgba(0,0,0,0.17);border-radius:0;padding:0}.shepherd-element.shepherd-theme-square-dark .shepherd-content *{font-size:inherit}.shepherd-element.shepherd-theme-square-dark .shepherd-content header{*zoom:1;border-radius:0}.shepherd-element.shepherd-theme-square-dark .shepherd-content header:after{content:"";display:table;clear:both}.shepherd-element.shepherd-theme-square-dark .shepherd-content header h3{margin:0;line-height:1;font-weight:normal}.shepherd-element.shepherd-theme-square-dark .shepherd-content header a.shepherd-cancel-link{float:right;text-decoration:none;font-size:1.25em;line-height:.8em;font-weight:normal;color:rgba(0,0,0,0.5);opacity:.25;position:relative;top:.1em;padding:.8em;margin-bottom:-.8em}.shepherd-element.shepherd-theme-square-dark .shepherd-content header a.shepherd-cancel-link:hover{opacity:1}.shepherd-element.shepherd-theme-square-dark .shepherd-content .shepherd-text{padding:1em}.shepherd-element.shepherd-theme-square-dark .shepherd-content .shepherd-text p{margin:0 0 .5em 0;line-height:1.3em}.shepherd-element.shepherd-theme-square-dark .shepherd-content .shepherd-text p:last-child{margin-bottom:0}.shepherd-element.shepherd-theme-square-dark .shepherd-content footer{padding:0 1em 1em}.shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons{text-align:right;list-style:none;padding:0;margin:0}.shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li{display:inline;padding:0;margin:0}.shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li .shepherd-button{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:0;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}.shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary{background:#eee;color:#888}.shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button{margin-right:0}.shepherd-start-tour-button.shepherd-theme-square-dark{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:0;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}PKwL\"vs2s2:updraftplus/css/tether-shepherd/shepherd-theme-default.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element, .shepherd-element:after, .shepherd-element:before, .shepherd-element *, .shepherd-element *:after, .shepherd-element *:before { box-sizing: border-box; } .shepherd-element { position: absolute; display: none; } .shepherd-element.shepherd-open { display: block; } .shepherd-element.shepherd-theme-default { max-width: 100%; max-height: 100%; } .shepherd-element.shepherd-theme-default .shepherd-content { border-radius: 5px; position: relative; font-family: inherit; background: #f6f6f6; color: #444; padding: 1em; font-size: 1.1em; line-height: 1.5em; } .shepherd-element.shepherd-theme-default .shepherd-content:before { content: ""; display: block; position: absolute; width: 0; height: 0; border-color: transparent; border-width: 16px; border-style: solid; pointer-events: none; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content { left: -32px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content { left: 32px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { top: 100%; left: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { top: 100%; right: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before { top: 100%; left: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before { top: 100%; right: 16px; border-top-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { top: 16px; left: 100%; border-left-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 16px; right: 100%; border-right-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { bottom: 16px; left: 100%; border-left-color: #f6f6f6; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { bottom: 16px; right: 100%; border-right-color: #f6f6f6; } .shepherd-element.shepherd-theme-default { z-index: 9999; max-width: 24em; font-size: 1em; } .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-default.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: #e6e6e6; } .shepherd-element.shepherd-theme-default.shepherd-has-title .shepherd-content header { background: #e6e6e6; padding: 1em; } .shepherd-element.shepherd-theme-default.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { padding: 0; margin-bottom: 0; } .shepherd-element.shepherd-theme-default.shepherd-has-cancel-link .shepherd-content header h3 { float: left; } .shepherd-element.shepherd-theme-default .shepherd-content { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.17); padding: 0; } .shepherd-element.shepherd-theme-default .shepherd-content * { font-size: inherit; } .shepherd-element.shepherd-theme-default .shepherd-content header { *zoom: 1; border-radius: 5px 5px 0 0; } .shepherd-element.shepherd-theme-default .shepherd-content header:after { content: ""; display: table; clear: both; } .shepherd-element.shepherd-theme-default .shepherd-content header h3 { margin: 0; line-height: 1; font-weight: normal; } .shepherd-element.shepherd-theme-default .shepherd-content header a.shepherd-cancel-link { float: right; text-decoration: none; font-size: 1.25em; line-height: .8em; font-weight: normal; color: rgba(0, 0, 0, 0.5); opacity: 0.25; position: relative; top: .1em; padding: .8em; margin-bottom: -.8em; } .shepherd-element.shepherd-theme-default .shepherd-content header a.shepherd-cancel-link:hover { opacity: 1; } .shepherd-element.shepherd-theme-default .shepherd-content .shepherd-text { padding: 1em; } .shepherd-element.shepherd-theme-default .shepherd-content .shepherd-text p { margin: 0 0 .5em 0; line-height: 1.3em; } .shepherd-element.shepherd-theme-default .shepherd-content .shepherd-text p:last-child { margin-bottom: 0; } .shepherd-element.shepherd-theme-default .shepherd-content footer { padding: 0 1em 1em; } .shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons { text-align: right; list-style: none; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li { display: inline; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li .shepherd-button { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 3px; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } .shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary { background: #eee; color: #888; } .shepherd-element.shepherd-theme-default .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button { margin-right: 0; } .shepherd-start-tour-button.shepherd-theme-default { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 3px; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } PKwL\ j33>updraftplus/css/tether-shepherd/shepherd-theme-square-dark.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element, .shepherd-element:after, .shepherd-element:before, .shepherd-element *, .shepherd-element *:after, .shepherd-element *:before { box-sizing: border-box; } .shepherd-element { position: absolute; display: none; } .shepherd-element.shepherd-open { display: block; } .shepherd-element.shepherd-theme-square-dark { max-width: 100%; max-height: 100%; } .shepherd-element.shepherd-theme-square-dark .shepherd-content { border-radius: 5px; position: relative; font-family: inherit; background: #232323; color: #eee; padding: 1em; font-size: 1.1em; line-height: 1.5em; } .shepherd-element.shepherd-theme-square-dark .shepherd-content:before { content: ""; display: block; position: absolute; width: 0; height: 0; border-color: transparent; border-width: 16px; border-style: solid; pointer-events: none; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content { left: -32px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content { left: 32px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { top: 100%; left: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { top: 100%; right: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before { top: 100%; left: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before { top: 100%; right: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { top: 16px; left: 100%; border-left-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 16px; right: 100%; border-right-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { bottom: 16px; left: 100%; border-left-color: #232323; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { bottom: 16px; right: 100%; border-right-color: #232323; } .shepherd-element.shepherd-theme-square-dark { border-radius: 0; z-index: 9999; max-width: 24em; font-size: 1em; } .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-square-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: #303030; } .shepherd-element.shepherd-theme-square-dark.shepherd-has-title .shepherd-content header { background: #303030; padding: 1em; } .shepherd-element.shepherd-theme-square-dark.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { padding: 0; margin-bottom: 0; } .shepherd-element.shepherd-theme-square-dark.shepherd-has-cancel-link .shepherd-content header h3 { float: left; } .shepherd-element.shepherd-theme-square-dark .shepherd-content { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.17); border-radius: 0; padding: 0; } .shepherd-element.shepherd-theme-square-dark .shepherd-content * { font-size: inherit; } .shepherd-element.shepherd-theme-square-dark .shepherd-content header { *zoom: 1; border-radius: 0; } .shepherd-element.shepherd-theme-square-dark .shepherd-content header:after { content: ""; display: table; clear: both; } .shepherd-element.shepherd-theme-square-dark .shepherd-content header h3 { margin: 0; line-height: 1; font-weight: normal; } .shepherd-element.shepherd-theme-square-dark .shepherd-content header a.shepherd-cancel-link { float: right; text-decoration: none; font-size: 1.25em; line-height: .8em; font-weight: normal; color: rgba(0, 0, 0, 0.5); opacity: 0.25; position: relative; top: .1em; padding: .8em; margin-bottom: -.8em; } .shepherd-element.shepherd-theme-square-dark .shepherd-content header a.shepherd-cancel-link:hover { opacity: 1; } .shepherd-element.shepherd-theme-square-dark .shepherd-content .shepherd-text { padding: 1em; } .shepherd-element.shepherd-theme-square-dark .shepherd-content .shepherd-text p { margin: 0 0 .5em 0; line-height: 1.3em; } .shepherd-element.shepherd-theme-square-dark .shepherd-content .shepherd-text p:last-child { margin-bottom: 0; } .shepherd-element.shepherd-theme-square-dark .shepherd-content footer { padding: 0 1em 1em; } .shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons { text-align: right; list-style: none; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li { display: inline; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li .shepherd-button { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 0; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } .shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary { background: #eee; color: #888; } .shepherd-element.shepherd-theme-square-dark .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button { margin-right: 0; } .shepherd-start-tour-button.shepherd-theme-square-dark { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 0; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } PKwL\0://9updraftplus/css/tether-shepherd/shepherd-theme-arrows.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element, .shepherd-element:after, .shepherd-element:before, .shepherd-element *, .shepherd-element *:after, .shepherd-element *:before { box-sizing: border-box; } .shepherd-element { position: absolute; display: none; } .shepherd-element.shepherd-open { display: block; } .shepherd-element.shepherd-theme-arrows { max-width: 100%; max-height: 100%; } .shepherd-element.shepherd-theme-arrows .shepherd-content { border-radius: 5px; position: relative; font-family: inherit; background: #fff; color: #444; padding: 1em; font-size: 1.1em; line-height: 1.5em; -webkit-transform: translateZ(0); transform: translateZ(0); -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); } .shepherd-element.shepherd-theme-arrows .shepherd-content:before { content: ""; display: block; position: absolute; width: 0; height: 0; border-color: transparent; border-width: 16px; border-style: solid; pointer-events: none; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content { left: -32px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content { left: 32px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { top: 100%; left: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { top: 100%; right: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before { top: 100%; left: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before { top: 100%; right: 16px; border-top-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { top: 16px; left: 100%; border-left-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 16px; right: 100%; border-right-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { bottom: 16px; left: 100%; border-left-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { bottom: 16px; right: 100%; border-right-color: #fff; } .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: #eee; } .shepherd-element.shepherd-theme-arrows.shepherd-has-title .shepherd-content header { background: #eee; padding: 1em; } .shepherd-element.shepherd-theme-arrows.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { padding: 0; margin-bottom: 0; } .shepherd-element.shepherd-theme-arrows.shepherd-has-cancel-link .shepherd-content header h3 { float: left; } .shepherd-element.shepherd-theme-arrows .shepherd-content { padding: 0; } .shepherd-element.shepherd-theme-arrows .shepherd-content * { font-size: inherit; } .shepherd-element.shepherd-theme-arrows .shepherd-content header { *zoom: 1; border-radius: 5px 5px 0 0; } .shepherd-element.shepherd-theme-arrows .shepherd-content header:after { content: ""; display: table; clear: both; } .shepherd-element.shepherd-theme-arrows .shepherd-content header h3 { margin: 0; line-height: 1; font-weight: normal; } .shepherd-element.shepherd-theme-arrows .shepherd-content header a.shepherd-cancel-link { float: right; text-decoration: none; font-size: 1.25em; line-height: .8em; font-weight: normal; color: rgba(0, 0, 0, 0.5); opacity: 0.25; position: relative; top: .1em; padding: .8em; margin-bottom: -.8em; } .shepherd-element.shepherd-theme-arrows .shepherd-content header a.shepherd-cancel-link:hover { opacity: 1; } .shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text { padding: 1em; } .shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text p { margin: 0 0 .5em 0; line-height: 1.3em; } .shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text p:last-child { margin-bottom: 0; } .shepherd-element.shepherd-theme-arrows .shepherd-content footer { padding: 0 1em 1em; } .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons { text-align: right; list-style: none; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li { display: inline; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li .shepherd-button { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 3px; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary { background: #eee; color: #888; } .shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button { margin-right: 0; } PKwL\wO)O)=updraftplus/css/tether-shepherd/shepherd-theme-arrows.min.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}.shepherd-element,.shepherd-element:after,.shepherd-element:before,.shepherd-element *,.shepherd-element *:after,.shepherd-element *:before{box-sizing:border-box}.shepherd-element{position:absolute;display:none}.shepherd-element.shepherd-open{display:block}.shepherd-element.shepherd-theme-arrows{max-width:100%;max-height:100%}.shepherd-element.shepherd-theme-arrows .shepherd-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:#444;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0,0,0,0.2));filter:drop-shadow(0 1px 4px rgba(0,0,0,0.2))}.shepherd-element.shepherd-theme-arrows .shepherd-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid;pointer-events:none}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content{left:-32px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content{left:32px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{top:100%;left:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{top:100%;right:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before{top:100%;left:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before{top:100%;right:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{top:16px;left:100%;border-left-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{top:16px;right:100%;border-right-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{bottom:16px;left:100%;border-left-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{bottom:16px;right:100%;border-right-color:#fff}.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-arrows.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before{border-bottom-color:#eee}.shepherd-element.shepherd-theme-arrows.shepherd-has-title .shepherd-content header{background:#eee;padding:1em}.shepherd-element.shepherd-theme-arrows.shepherd-has-title .shepherd-content header a.shepherd-cancel-link{padding:0;margin-bottom:0}.shepherd-element.shepherd-theme-arrows.shepherd-has-cancel-link .shepherd-content header h3{float:left}.shepherd-element.shepherd-theme-arrows .shepherd-content{padding:0}.shepherd-element.shepherd-theme-arrows .shepherd-content *{font-size:inherit}.shepherd-element.shepherd-theme-arrows .shepherd-content header{*zoom:1;border-radius:5px 5px 0 0}.shepherd-element.shepherd-theme-arrows .shepherd-content header:after{content:"";display:table;clear:both}.shepherd-element.shepherd-theme-arrows .shepherd-content header h3{margin:0;line-height:1;font-weight:normal}.shepherd-element.shepherd-theme-arrows .shepherd-content header a.shepherd-cancel-link{float:right;text-decoration:none;font-size:1.25em;line-height:.8em;font-weight:normal;color:rgba(0,0,0,0.5);opacity:.25;position:relative;top:.1em;padding:.8em;margin-bottom:-.8em}.shepherd-element.shepherd-theme-arrows .shepherd-content header a.shepherd-cancel-link:hover{opacity:1}.shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text{padding:1em}.shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text p{margin:0 0 .5em 0;line-height:1.3em}.shepherd-element.shepherd-theme-arrows .shepherd-content .shepherd-text p:last-child{margin-bottom:0}.shepherd-element.shepherd-theme-arrows .shepherd-content footer{padding:0 1em 1em}.shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons{text-align:right;list-style:none;padding:0;margin:0}.shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li{display:inline;padding:0;margin:0}.shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li .shepherd-button{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:3px;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}.shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary{background:#eee;color:#888}.shepherd-element.shepherd-theme-arrows .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button{margin-right:0}PKwL\_eeAupdraftplus/css/tether-shepherd/shepherd-theme-arrows-fix.min.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}PKwL\*E**Kupdraftplus/css/tether-shepherd/shepherd-theme-arrows-plain-buttons.min.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}.shepherd-element,.shepherd-element:after,.shepherd-element:before,.shepherd-element *,.shepherd-element *:after,.shepherd-element *:before{box-sizing:border-box}.shepherd-element{position:absolute;display:none}.shepherd-element.shepherd-open{display:block}.shepherd-element.shepherd-theme-arrows-plain-buttons{max-width:100%;max-height:100%}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:#444;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0,0,0,0.2));filter:drop-shadow(0 1px 4px rgba(0,0,0,0.2))}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid;pointer-events:none}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content{left:-32px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content{left:32px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{top:100%;left:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{top:100%;right:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before{top:100%;left:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before{top:100%;right:16px;border-top-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{top:16px;left:100%;border-left-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{top:16px;right:100%;border-right-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{bottom:16px;left:100%;border-left-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{bottom:16px;right:100%;border-right-color:#fff}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before{border-bottom-color:#eee}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header{background:#eee;padding:1em}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link{padding:0;margin-bottom:0}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-cancel-link .shepherd-content header h3{float:left}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content{padding:0}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header{*zoom:1;border-radius:5px 5px 0 0}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header:after{content:"";display:table;clear:both}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header h3{margin:0;line-height:1;font-weight:normal}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header a.shepherd-cancel-link{float:right;text-decoration:none;font-size:1.25em;line-height:.8em;font-weight:normal;color:rgba(0,0,0,0.5);opacity:.25;position:relative;top:.1em;padding:.8em;margin-bottom:-.8em}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header a.shepherd-cancel-link:hover{opacity:1}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text{padding:1em}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p{margin:0 0 .5em 0;line-height:1.3em}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p:last-child{margin-bottom:0}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer{padding:0 1em 1em}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons{text-align:right;list-style:none;padding:0;margin:0}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li{display:inline;padding:0;margin:0}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;cursor:pointer;margin:0 .5em 0 0;text-decoration:none}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button{margin-right:0}PKwL\Q?=*=*;updraftplus/css/tether-shepherd/shepherd-theme-dark.min.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}.shepherd-element,.shepherd-element:after,.shepherd-element:before,.shepherd-element *,.shepherd-element *:after,.shepherd-element *:before{box-sizing:border-box}.shepherd-element{position:absolute;display:none}.shepherd-element.shepherd-open{display:block}.shepherd-element.shepherd-theme-dark{max-width:100%;max-height:100%}.shepherd-element.shepherd-theme-dark .shepherd-content{border-radius:5px;position:relative;font-family:inherit;background:#232323;color:#eee;padding:1em;font-size:1.1em;line-height:1.5em}.shepherd-element.shepherd-theme-dark .shepherd-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid;pointer-events:none}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content{left:-32px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content{left:32px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before{top:100%;left:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before{top:100%;right:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;left:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content{margin-top:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before{bottom:100%;right:16px;border-bottom-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before{top:100%;left:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content{margin-bottom:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before{top:100%;right:16px;border-top-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{top:16px;left:100%;border-left-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{top:16px;right:100%;border-right-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content{margin-right:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before{bottom:16px;left:100%;border-left-color:#232323}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content{margin-left:16px}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{bottom:16px;right:100%;border-right-color:#232323}.shepherd-element.shepherd-theme-dark{z-index:9999;max-width:24em;font-size:1em}.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before{border-bottom-color:#303030}.shepherd-element.shepherd-theme-dark.shepherd-has-title .shepherd-content header{background:#303030;padding:1em}.shepherd-element.shepherd-theme-dark.shepherd-has-title .shepherd-content header a.shepherd-cancel-link{padding:0;margin-bottom:0}.shepherd-element.shepherd-theme-dark.shepherd-has-cancel-link .shepherd-content header h3{float:left}.shepherd-element.shepherd-theme-dark .shepherd-content{box-shadow:0 0 1em rgba(0,0,0,0.2);padding:0}.shepherd-element.shepherd-theme-dark .shepherd-content *{font-size:inherit}.shepherd-element.shepherd-theme-dark .shepherd-content header{*zoom:1;border-radius:5px 5px 0 0}.shepherd-element.shepherd-theme-dark .shepherd-content header:after{content:"";display:table;clear:both}.shepherd-element.shepherd-theme-dark .shepherd-content header h3{margin:0;line-height:1;font-weight:normal}.shepherd-element.shepherd-theme-dark .shepherd-content header a.shepherd-cancel-link{float:right;text-decoration:none;font-size:1.25em;line-height:.8em;font-weight:normal;color:rgba(0,0,0,0.5);opacity:.25;position:relative;top:.1em;padding:.8em;margin-bottom:-.8em}.shepherd-element.shepherd-theme-dark .shepherd-content header a.shepherd-cancel-link:hover{opacity:1}.shepherd-element.shepherd-theme-dark .shepherd-content .shepherd-text{padding:1em}.shepherd-element.shepherd-theme-dark .shepherd-content .shepherd-text p{margin:0 0 .5em 0;line-height:1.3em}.shepherd-element.shepherd-theme-dark .shepherd-content .shepherd-text p:last-child{margin-bottom:0}.shepherd-element.shepherd-theme-dark .shepherd-content footer{padding:0 1em 1em}.shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons{text-align:right;list-style:none;padding:0;margin:0}.shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li{display:inline;padding:0;margin:0}.shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li .shepherd-button{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:3px;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}.shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary{background:#eee;color:#888}.shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button{margin-right:0}.shepherd-start-tour-button.shepherd-theme-dark{display:inline-block;vertical-align:middle;*vertical-align:auto;*zoom:1;*display:inline;border-radius:3px;cursor:pointer;border:0;margin:0 .5em 0 0;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em;background:#3288e6;color:#fff}PKwL\-117updraftplus/css/tether-shepherd/shepherd-theme-dark.cssnu[.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element, .shepherd-element:after, .shepherd-element:before, .shepherd-element *, .shepherd-element *:after, .shepherd-element *:before { box-sizing: border-box; } .shepherd-element { position: absolute; display: none; } .shepherd-element.shepherd-open { display: block; } .shepherd-element.shepherd-theme-dark { max-width: 100%; max-height: 100%; } .shepherd-element.shepherd-theme-dark .shepherd-content { border-radius: 5px; position: relative; font-family: inherit; background: #232323; color: #eee; padding: 1em; font-size: 1.1em; line-height: 1.5em; } .shepherd-element.shepherd-theme-dark .shepherd-content:before { content: ""; display: block; position: absolute; width: 0; height: 0; border-color: transparent; border-width: 16px; border-style: solid; pointer-events: none; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-center .shepherd-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-center .shepherd-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-right.shepherd-element-attached-middle .shepherd-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-left.shepherd-element-attached-middle .shepherd-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-left.shepherd-target-attached-center .shepherd-content { left: -32px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-right.shepherd-target-attached-center .shepherd-content { left: 32px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-middle .shepherd-content:before { top: 100%; left: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-middle .shepherd-content:before { top: 100%; right: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; left: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content { margin-top: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom .shepherd-content:before { bottom: 100%; right: 16px; border-bottom-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top .shepherd-content:before { top: 100%; left: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content { margin-bottom: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top .shepherd-content:before { top: 100%; right: 16px; border-top-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { top: 16px; left: 100%; border-left-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 16px; right: 100%; border-right-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content { margin-right: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-left .shepherd-content:before { bottom: 16px; left: 100%; border-left-color: #232323; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content { margin-left: 16px; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { bottom: 16px; right: 100%; border-right-color: #232323; } .shepherd-element.shepherd-theme-dark { z-index: 9999; max-width: 24em; font-size: 1em; } .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-dark.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: #303030; } .shepherd-element.shepherd-theme-dark.shepherd-has-title .shepherd-content header { background: #303030; padding: 1em; } .shepherd-element.shepherd-theme-dark.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { padding: 0; margin-bottom: 0; } .shepherd-element.shepherd-theme-dark.shepherd-has-cancel-link .shepherd-content header h3 { float: left; } .shepherd-element.shepherd-theme-dark .shepherd-content { box-shadow: 0 0 1em rgba(0, 0, 0, 0.2); padding: 0; } .shepherd-element.shepherd-theme-dark .shepherd-content * { font-size: inherit; } .shepherd-element.shepherd-theme-dark .shepherd-content header { *zoom: 1; border-radius: 5px 5px 0 0; } .shepherd-element.shepherd-theme-dark .shepherd-content header:after { content: ""; display: table; clear: both; } .shepherd-element.shepherd-theme-dark .shepherd-content header h3 { margin: 0; line-height: 1; font-weight: normal; } .shepherd-element.shepherd-theme-dark .shepherd-content header a.shepherd-cancel-link { float: right; text-decoration: none; font-size: 1.25em; line-height: .8em; font-weight: normal; color: rgba(0, 0, 0, 0.5); opacity: 0.25; position: relative; top: .1em; padding: .8em; margin-bottom: -.8em; } .shepherd-element.shepherd-theme-dark .shepherd-content header a.shepherd-cancel-link:hover { opacity: 1; } .shepherd-element.shepherd-theme-dark .shepherd-content .shepherd-text { padding: 1em; } .shepherd-element.shepherd-theme-dark .shepherd-content .shepherd-text p { margin: 0 0 .5em 0; line-height: 1.3em; } .shepherd-element.shepherd-theme-dark .shepherd-content .shepherd-text p:last-child { margin-bottom: 0; } .shepherd-element.shepherd-theme-dark .shepherd-content footer { padding: 0 1em 1em; } .shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons { text-align: right; list-style: none; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li { display: inline; padding: 0; margin: 0; } .shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li .shepherd-button { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 3px; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } .shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li .shepherd-button.shepherd-button-secondary { background: #eee; color: #888; } .shepherd-element.shepherd-theme-dark .shepherd-content footer .shepherd-buttons li:last-child .shepherd-button { margin-right: 0; } .shepherd-start-tour-button.shepherd-theme-dark { display: inline-block; vertical-align: middle; *vertical-align: auto; *zoom: 1; *display: inline; border-radius: 3px; cursor: pointer; border: 0; margin: 0 .5em 0 0; font-family: inherit; text-transform: uppercase; letter-spacing: .1em; font-size: .8em; line-height: 1em; padding: .75em 2em; background: #3288e6; color: #fff; } PKwL\744%updraftplus/css/updraftplus-admin.cssnu[@-webkit-keyframes udp_blink { from { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } to { opacity: 0.4; -webkit-transform: scale(0.85); transform: scale(0.85); } } @keyframes udp_blink { from { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } to { opacity: 0.4; -webkit-transform: scale(0.85); transform: scale(0.85); } } @-webkit-keyframes udp_rotate { from { -webkit-transform: rotate(0); transform: rotate(0); } to { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes udp_rotate { from { -webkit-transform: rotate(0); transform: rotate(0); } to { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } /* Widths and sizing */ .max-width-600 { max-width: 600px; } .max-width-700 { max-width: 700px; } .width-900 { max-width: 900px; } .width-80 { width: 80%; } .updraft--flex { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } .updraft--flex > * { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; -webkit-box-sizing: border-box; box-sizing: border-box; } .updraft--flex > .updraft--one-half { width: 50%; -webkit-box-flex: 1; -ms-flex: auto; flex: auto; } .updraft--flex > .updraft--two-halves { width: 100%; -webkit-box-flex: 1; -ms-flex: auto; flex: auto; } .updraft-color--very-light-grey { background: #F8F8F8; } /* End widths and sizing */ /* Font styling */ .no-decoration { text-decoration: none; } .bold { font-weight: bold; } /* End font styling */ /* Alignment */ .center-align-td { text-align: center; } /* End of Alignment */ /* Padding */ .remove-padding { padding: 0 !important; } /* End of padding */ .updraft-text-center { text-align: center; } .autobackup { padding: 6px; margin: 8px 0px; } ul .disc { list-style: disc inside; } .dashicons-log-fix { display: inherit; } .udpdraft__lifted { -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1); box-shadow: 0 1px 1px 0 rgba(0,0,0,.1); } #updraft-wrap a .dashicons { text-decoration: none; } .updraft-field-description, table.form-table td p.updraft-field-description { font-size: 90%; line-height: 1.2; font-style: italic; margin-bottom: 5px; } /* Input boxes */ label.updraft_checkbox { display: block; margin-bottom: 4px; margin-left: 26px; } label.updraft_checkbox > input[type=checkbox] { margin-left: -25px; } div[id*="updraft_include_"] { margin-bottom: 9px; } /* Input boxes */ .settings_page_updraftplus input[type="file"] { border: none; } .settings_page_updraftplus .wipe_settings { padding-bottom: 10px; } .settings_page_updraftplus input[type="text"] { font-size: 14px; } .settings_page_updraftplus select { border-radius: 4px; max-width: 100%; } input.updraft_input--wide, textarea.updraft_input--wide { max-width: 442px; width: 100%; } #updraft-wrap .button-large { font-size: 1.3em; } /* End input boxes */ /* Main Buttons */ .main-dashboard-buttons { border-width: 4px; border-radius: 12px; letter-spacing: 0px; font-size: 17px; font-weight: bold; padding-left: 0.7em; padding-right: 2em; padding: 0.3em 1em; line-height: 1.7em; background: transparent; position: relative; border: 2px solid; -webkit-transition: all 0.2s; transition: all 0.2s; vertical-align: baseline; -webkit-box-sizing: border-box; box-sizing: border-box; text-align: center; line-height: 1.3em; margin-left: .3em; text-transform: none; line-height: 1; text-decoration: none; } .button-restore { border-color: rgb(98, 158, 192); color: rgb(98, 158, 192); } .button-ud-google { text-decoration: none !important; -webkit-transition: background-color .3s, -webkit-box-shadow .3s; transition: background-color .3s, -webkit-box-shadow .3s; transition: background-color .3s, box-shadow .3s; transition: background-color .3s, box-shadow .3s, -webkit-box-shadow .3s; padding: 12px 16px 12px 42px !important; border: none; border-radius: 3px; -webkit-box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 1px 1px rgba(0, 0, 0, .25); box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 1px 1px rgba(0, 0, 0, .25); color: #757575; font-size: 14px; font-weight: 500; font-family: "Roboto"; background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMTcuNiA5LjJsLS4xLTEuOEg5djMuNGg0LjhDMTMuNiAxMiAxMyAxMyAxMiAxMy42djIuMmgzYTguOCA4LjggMCAwIDAgMi42LTYuNnoiIGZpbGw9IiM0Mjg1RjQiIGZpbGwtcnVsZT0ibm9uemVybyIvPjxwYXRoIGQ9Ik05IDE4YzIuNCAwIDQuNS0uOCA2LTIuMmwtMy0yLjJhNS40IDUuNCAwIDAgMS04LTIuOUgxVjEzYTkgOSAwIDAgMCA4IDV6IiBmaWxsPSIjMzRBODUzIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48cGF0aCBkPSJNNCAxMC43YTUuNCA1LjQgMCAwIDEgMC0zLjRWNUgxYTkgOSAwIDAgMCAwIDhsMy0yLjN6IiBmaWxsPSIjRkJCQzA1IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48cGF0aCBkPSJNOSAzLjZjMS4zIDAgMi41LjQgMy40IDEuM0wxNSAyLjNBOSA5IDAgMCAwIDEgNWwzIDIuNGE1LjQgNS40IDAgMCAxIDUtMy43eiIgZmlsbD0iI0VBNDMzNSIgZmlsbC1ydWxlPSJub256ZXJvIi8+PHBhdGggZD0iTTAgMGgxOHYxOEgweiIvPjwvZz48L3N2Zz4=); background-color: #FFF; background-repeat: no-repeat; background-position: 12px 11px; } .button-ud-google:hover { -webkit-box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 2px 4px rgba(0, 0, 0, .25); box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 2px 4px rgba(0, 0, 0, .25); } .button-ud-google:active { background-color: #EEE; } .button-ud-google:focus { outline: none; -webkit-box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 2px 4px rgba(0, 0, 0, .25), 0 0 0 3px #C8DAFC; box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 2px 4px rgba(0, 0, 0, .25), 0 0 0 3px #C8DAFC; } .button-ud-google:disabled { -webkit-filter: grayscale(100%); filter: grayscale(100%); background-color: #EBEBEB; -webkit-box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 1px 1px rgba(0, 0, 0, .25); box-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 1px 1px rgba(0, 0, 0, .25); cursor: not-allowed; } .dashboard-main-sizing { border-width: 4px; width: 190px; line-height: 1.7em; } p.updraftplus-option { margin-top: 0; margin-bottom: 5px; } p.updraftplus-option-inline { display: inline-block; padding-right: 20px; } span.updraftplus-option-label { display: block; } /* * MIGRATE - CLONE */ #updraft-navtab-migrate-content .postbox { padding: 18px; } /* Clone Rows */ .updraftclone-main-row { display: -webkit-box; display: -ms-flexbox; display: flex; } .updraftclone-tokens { background: #F5F5F5; padding: 20px; border-radius: 10px; margin-right: 20px; max-width: 300px; } .updraftclone-tokens p { margin: 0; } .updraftclone_action_box { background: #F5F5F5; padding: 20px; border-radius: 10px; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; } .updraftclone_action_box p:first-child { margin-top: 0; } .updraftclone_action_box p:last-child { margin-bottom: 0; } .updraftclone_action_box #ud_downloadstatus3 { margin-top: 10px; } span.tokens-number { font-size: 46px; display: block; } /* Clone header button */ .button.updraft_migrate_widget_temporary_clone_show_stage0 { display: none; position: absolute; right: 0; top: 0; height: 100%; border-left: 1px solid #CCC; padding-left: 10px; padding-right: 10px; } .updraft_migrate_widget_temporary_clone_stage0_container { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .updraft_migrate_widget_temporary_clone_stage0_box { margin-right: 20px; width: 100%; -ms-flex-preferred-size: 100%; flex-basis: 100%; } .updraft_migrate_widget_temporary_clone_stage0_box iframe, .updraft_migrate_widget_temporary_clone_stage0_box a.udp-replace-with-iframe--js { float: none; } @media (min-width: 1024px) { .updraft_migrate_widget_temporary_clone_stage0_container { -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -ms-flex-wrap: wrap; flex-wrap: wrap; } .updraft_migrate_widget_temporary_clone_stage0_box { -ms-flex-preferred-size: 45%; flex-basis: 45%; } .updraft_migrate_widget_temporary_clone_stage0_box iframe, .updraft_migrate_widget_temporary_clone_stage0_box a.udp-replace-with-iframe--js { float: right; } } .updraft_migrate_widget_temporary_clone_show_stage0 .dashicons { text-decoration: none; font-size: 20px; } .opened .button.updraft_migrate_widget_temporary_clone_show_stage0 { display: inline-block; } .opened .updraft_migrate_widget_temporary_clone_stage0 { background: #F5F5F5; padding: 20px; border-radius: 8px; margin-bottom: 21px; } /* Clone list table */ .clone-list { clear: both; width: 100%; margin-top: 40px; } .clone-list table { width: 100%; text-align: left; } .clone-list table tr th { background: #E4E4E4; } .clone-list table tr td { background: #F5F5F5; word-break: break-word; } .clone-list table tr:nth-child(odd) td { background: #FAFAFA; } .clone-list table td, .clone-list table th { padding: 6px; } /* Clone Progress */ .updraftplus-clone .updraft_row { padding-left: 0; padding-right: 0; } button#updraft_migrate_createclone + .updraftplus_spinner { margin-top: 13px; } /* Clone - Show step 1 info button */ .button.button-hero.updraftclone_show_step_1 { white-space: normal; height: auto; line-height: 14px; padding-top: 10px; padding-bottom: 10px; } .button.button-hero.updraftclone_show_step_1 span.dashicons { height: auto; } .updraftplus_clone_status { color: red; } /* MIGRATE */ a.updraft_migrate_add_site--trigger span.dashicons { text-decoration: none; } .button-restore:hover, .button-migrate:hover, .button-backup:hover, .button-view-log:hover, .button-mass-selectors:hover, .button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover { border-color: #DF6926; color: #DF6926; } .button-migrate { color: rgb(238, 169, 32); border-color: rgb(238, 169, 32); } #updraft_migrate_tab_main { padding: 8px; } .updraft_migrate_widget_module_content { background: #FFF; border-radius: 0; position: relative; } body.js #updraft_migrate .updraft_migrate_widget_module_content { display: none; } .updraft_migrate_widget_module_content > h3, div[class*="updraft_migrate_widget_temporary_clone_stage"] > h3 { margin-top: 0; } /* Migrate / Clone headers */ .updraft_migrate_widget_module_content header, #updraft_migrate_tab_alt header { position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-line-pack: center; align-content: center; justify-items: center; margin-top: -18px; margin-left: -18px; margin-right: -18px; margin-bottom: 15px; border-bottom: 1px solid #CCC; } .updraft_migrate_widget_module_content header h3, .updraft_migrate_widget_module_content header button.button.close, #updraft_migrate_tab_alt header h3, #updraft_migrate_tab_alt header button.button.close { padding: 10px; line-height: 20px; height: auto; margin: 0; } .updraft_migrate_widget_module_content button.button.close, #updraft_migrate_tab_alt button.button.close { text-decoration: none; padding-left: 5px; border-right: 1px solid #CCC; } .updraft_migrate_widget_module_content button.button.close .dashicons, #updraft_migrate_tab_alt button.button.close .dashicons { margin-top: 1px; } .updraft_migrate_widget_module_content header h3, #updraft_migrate_tab_alt header h3 { margin: 0; } .updraft_migrate_intro button.button.button-primary.button-hero { max-width: 235px; word-wrap: normal; white-space: normal; line-height: 1; height: auto; padding-top: 13px; padding-bottom: 13px; text-align: left; position: relative; margin-right: 10px; margin-bottom: 10px; } .updraft_migrate_intro button.button.button-primary.button-hero .dashicons { position: absolute; left: 10px; top: calc(50% - 8px); } #updraft_migrate_tab_alt #updraft_migrate_send_existing_button { margin-right: 6px; } /* jquery UI Accordion module */ #updraft_migrate .ui-widget-content a { color: #1C94C4; } #updraft-wrap .ui-accordion .ui-accordion-header { background: #F6F6F6; margin: 0; border-radius: 0; padding-left: 0.5em; padding-right: 0.7em; } #updraft-wrap .ui-widget { font-family: inherit; } .ui-accordion-header .ui-accordion-header-icon.ui-icon-caret-1-w { background-position: -96px 0px; } .ui-accordion-header .ui-accordion-header-icon.ui-icon-caret-1-s { background-position: -64px 0; } #updraft-wrap .ui-accordion .ui-accordion-header .ui-accordion-header-icon { left: auto; right: 5px; } #updraft-wrap .ui-accordion .ui-accordion-header:focus { outline: none; -webkit-box-shadow: 0 0 0 1px rgba(91, 157, 217, 0.22), 0 0 2px 1px rgba(30, 140, 190, 0.3); box-shadow: 0 0 0 1px rgba(91, 157, 217, 0.22), 0 0 2px 1px rgba(30, 140, 190, 0.3); background: #FFF; } #updraft-wrap .ui-accordion .ui-accordion-header:focus .dashicons { color: #0572AA; opacity: 1; } #updraft-wrap .ui-accordion .ui-accordion-header.ui-state-active { background: #F6F6F6; border-bottom: 2px solid #0572AA; -webkit-box-shadow: 1px 6px 12px -5px rgba(0, 0, 0, 0.3); box-shadow: 1px 6px 12px -5px rgba(0, 0, 0, 0.3); } #updraft-wrap .ui-accordion .ui-accordion-header.ui-state-active:focus { -webkit-box-shadow: 1px 6px 12px -5px rgba(0, 0, 0, 0.3), 0 0 0 1px #5B9DD9, 0 0 2px 1px rgba(30, 140, 190, .8); box-shadow: 1px 6px 12px -5px rgba(0, 0, 0, 0.3), 0 0 0 1px #5B9DD9, 0 0 2px 1px rgba(30, 140, 190, .8); } #updraft-wrap .ui-accordion .ui-accordion-header:not(:first-child) { border-top: none; } #updraft-wrap .ui-accordion .ui-accordion-header .dashicons { opacity: 0.4; margin-right: 10px; } #updraft-wrap .ui-accordion .ui-accordion-header:focus { outline: none; -webkit-box-shadow: 0 0 0 1px #5B9DD9, 0 0 2px 1px rgba(30, 140, 190, .8); box-shadow: 0 0 0 1px #5B9DD9, 0 0 2px 1px rgba(30, 140, 190, .8); z-index: 1; } button.ui-dialog-titlebar-close:before { content: none!important; } .updraft_next_scheduled_backups_wrapper { display: -webkit-box; display: -ms-flexbox; display: flex; background: #FFF; justify-items: center; -ms-flex-wrap: wrap; flex-wrap: wrap; } .updraft_next_scheduled_backups_wrapper > div { width: 50%; background: #FFF; height: auto; /* padding: 18px 33px; */ padding: 33px; -webkit-box-sizing: border-box; box-sizing: border-box; } .updraft_backup_btn_wrapper { text-align: center; border-left: 1px solid #F1F1F1; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } .incremental-backups-only { display: none; } .incremental-free-only { display: none; } .incremental-free-only p { padding: 5px; background: rgba(255, 0, 0, 0.06); border: 1px solid #BFBFBF; } #updraft-delete-waitwarning span.spinner { visibility: visible; float: none; margin: 0; margin-right: 10px; } button#updraft-backupnow-button .spinner, button#updraft-backupnow-button .dashicons-yes { display: none; } button#updraft-backupnow-button.loading .spinner { display: inline-block; visibility: visible; margin-top: 13px; margin-right: 0; } button#updraft-backupnow-button.loading { background-color: #EFEFEF; border-color: #CCC; text-shadow: 0 -1px 1px #BBC3C7, 1px 0 1px #BBC3C7, 0 1px 1px #BBC3C7, -1px 0 1px #BBC3C7; -webkit-box-shadow: none; box-shadow: none; } button#updraft-backupnow-button.finished .dashicons-yes { display: inline-block; visibility: visible; font-size: 42px; margin-right: 0; margin-top: 2px; } .updraft_next_scheduled_entity { width: 50%; display: inline-block; float: left; /* padding: 20px 20px 10px 20px; */ } .updraft_next_scheduled_entity .dashicons { color: #CCC; font-size: 20px; } .updraft_next_scheduled_entity strong { font-size: 20px; } .updraft_next_scheduled_heading { margin-bottom: 10px; } .updraft_next_scheduled_date_time { color: #46A84B; } .updraft_time_now_wrapper { margin-top: 68px; width: 100%; } .updraft_time_now_label, .updraft_time_now { display: inline-block; padding: 7px; } .updraft_time_now_label { background: #B7B7B7; border-top-left-radius: 4px; border-bottom-left-radius: 4px; color: #FFF; margin-right: 0; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); } .updraft_time_now { background: #F1F1F1; border-top-right-radius: 4px; border-bottom-right-radius: 4px; margin-left: -3px; } #updraft_lastlogmessagerow { margin: 6px 0; } #updraft_lastlogmessagerow { clear: both; padding: 0.25px 0; } #updraft_lastlogmessagerow .updraft-log-link { float: right; margin-top: -2.5em; margin-right: 2px; } #updraft_lastlogmessagerow > div { clear: both; background: #FFF; padding: 18px; } #updraft_activejobs_table { overflow: hidden; width: 100%; background: #FAFAFA; padding: 0; } .updraft_requeststart { padding: 15px 33px; text-align: center; } .updraft_requeststart .spinner { visibility: visible; float: none; vertical-align: middle; margin-top: -2px; } a.updraft_jobinfo_delete.disabled { opacity: 0.4; color: inherit; text-decoration: none; } .updraft_row { clear: both; -webkit-transition: 0.3s all; transition: 0.3s all; padding: 15px 33px; } .updraft_row.deleting { opacity: 0.4; } .updraft_progress_container { /* width: 83%; */ } .updraft_existing_backups_count { padding: 2px 8px; font-size: 12px; background: #CA4A1E; color: #FFF; font-weight: bold; border-radius: 10px; } .form-table .existing-backups-table input[type="checkbox"] { border-radius: 0; } .form-table .existing-backups-table .check-column { width: 40px; padding: 0; padding-top: 8px; } .existing-backups-buttons { font-size: 11px; line-height: 1.4em; border-width: 3px; } .existing-backups-restore-buttons { font-size: 11px; line-height: 1.4em; border-width: 3px; } .button-delete { color: #E23900; border-color: #E23900; font-size: 14px; line-height: 1.4em; border-width: 2px; margin-right: 10px; } .button-view-log, .button-mass-selectors { color: darkgrey; border-color: darkgrey; font-size: 14px; line-height: 1.4em; border-width: 2px; margin-top: -1px; } .button-view-log { width: 120px; } .button-existing-restore { font-size: 14px; line-height: 1.4em; border-width: 2px; width: 110px; } .main-restore { margin-right: 3%; margin-left: 3%; } .button-entity-backup { color: #555; border-color: #555; font-size: 11px; line-height: 1.4em; border-width: 2px; margin-right: 5px; } .button-select-all { width: 122px; } .button-deselect { width: 92px; } #ud_massactions > .display-flex > .mass-selectors-margins, #updraft-delete-waitwarning > .display-flex > .mass-selectors-margins { margin-right: -4px; } .udp-button-primary { border-width: 4px; color: #0073AA; border-color: #0073AA; font-size: 14px; height: 40px; } #ud_massactions .button-delete { margin-right: 0px; } .stored_local { border-radius: 5px; background-color: #007FE7; padding: 3px 5px 5px 5px; color: #FFF; font-size: 75%; } span#updraft_lastlogcontainer { word-break: break-all; } .stored_icon { height: 1.3em; position: relative; top: 0.2em; } .backup_date_label > * { vertical-align: middle; } .backup_date_label .dashicons { font-size: 18px; } .backup_date_label .clear-right { clear: right; } .existing-backups-table .backup_date_label > div, .existing-backups-table .backup_date_label span > div { font-weight: bold; } /* End Main Buttons */ /* End of common elements */ .udp-logo-70 { width: 70px; height: 70px; float: left; padding-right: 25px; } h3 .thank-you { margin-top: 0px; } .ws_advert { max-width: 800px; font-size: 140%; line-height: 140%; padding: 14px; clear: left; } .dismiss-dash-notice { float: right; position: relative; top: -20px; } .updraft_exclude_container, .updraft_include_container { margin-left: 24px; margin-top: 5px; margin-bottom: 10px; padding: 15px; border: 1px solid #DDD; } label.updraft-exclude-label { font-weight: 500; margin-bottom: 5px; display: inline-block; } .updraft_add_exclude_item, #updraft_include_more_paths_another { display: inline-block; margin-top: 10px; } input.updraft_exclude_entity_field, .form-table td input.updraft_exclude_entity_field, .updraftplus-morefiles-row input[type=text] { width: calc(100% - 70px); max-width: 400px; } .updraft-fs-italic { font-style: italic; } @media screen and (max-width: 782px) { .form-table td input.updraft_exclude_entity_field, .form-table td .updraftplus-morefiles-row input[type=text] { display: inline-block; } } .updraft_exclude_entity_delete.dashicons, .updraft_exclude_entity_edit.dashicons, .updraft_exclude_entity_update.dashicons, .updraftplus-morefiles-row a.dashicons { margin-top: 2px; font-size: 20px; -webkit-box-shadow: none; box-shadow: none; line-height: 1; padding: 3px; margin-right: 4px; } .updraft_exclude_entity_delete, .updraft_exclude_entity_delete:hover, .updraftplus-morefiles-row-delete { color: #FF6347; } .updraft_exclude_entity_update.dashicons, .updraft_exclude_entity_update.dashicons:hover { color: #008000; font-weight: bold; font-size: 22px; margin-left: 4px; } .updraft_exclude_entity_edit { margin-left: 4px; } .updraft_exclude_entity_update.is-active ~ .updraft_exclude_entity_delete { display: none; } .updraft-exclude-panel-heading { margin-bottom: 8px; } .updraft-exclude-panel-heading h3 { margin: 0.5em 0 0.5em 0; } .updraft-exclude-submit.button-primary { margin-top: 5px; } .updraft_exclude_actions_list { font-weight: bold; } .updraft-exclude-link { cursor: pointer; } #updraft_include_more_options { padding-left: 25px; } #updraft_report_cell .updraft_reportbox, .updraft_small_box { padding: 12px; margin: 8px 0; border: 1px solid #CCC; position: relative; } #updraft_report_cell button.updraft_reportbox_delete, .updraft_box_delete_button, .updraft_small_box .updraft_box_delete_button { padding: 4px; padding-top: 6px; border: none; background: transparent; position: absolute; top: 4px; right: 4px; cursor: pointer; } #updraft_report_cell button.updraft_reportbox_delete:hover { color: #DE3C3C; } a.updraft_report_another .dashicons { text-decoration: none; margin-top: 2px; } .updraft_report_dbbackup.updraft_report_disabled { color: #CCC; } #updraft-navtab-settings-content .updraft-test-button { font-size: 18px !important; } #updraft_report_cell .updraft_report_email { display: block; width: calc(100% - 50px); margin-bottom: 9px; } #updraft_report_cell .updraft_report_another_p { clear: left; } /* Taken straight from admin.php */ #updraft-navtab-settings-content table.form-table p { max-width: 700px; } #updraft-navtab-settings-content table.form-table .notice p { max-width: none; } #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected, #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected td { background-color: #EFEFEF; } #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected:nth-child(even) td { background-color: #E8E8E8; } .updraft_settings_sectionheading { display: none; } .updraft-backupentitybutton-disabled { background-color: transparent; border: none; color: #0074A2; text-decoration: underline; cursor: pointer; clear: none; float: left; } .updraft-backupentitybutton { margin-left: 8px; } .updraft-bigbutton { padding: 2px 0px !important; margin-right: 14px !important; font-size: 22px !important; min-height: 32px; min-width: 180px; } tr[class*="_updraft_remote_storage_border"] { border-top: 1px solid #CCC; } .updraft_multi_storage_options { float: right; clear: right; margin-bottom: 5px !important; } .updraft_toggle_instance_label { vertical-align: top !important; } .updraft_debugrow th { float: right; text-align: right; font-weight: bold; padding-right: 8px; min-width: 140px; } .updraft_debugrow td { min-width: 300px; vertical-align: bottom; } .updraft_webdav_host_error, .onedrive_folder_error { color: red; } label[for=updraft_servicecheckbox_updraftvault] { position: relative; } #updraft-wrap .udp-info { position: absolute; right: 10px; top: calc(50% - 10px); } #updraft-wrap span.info-trigger { display: inline-block; width: 20px; height: 20px; background: #FFF; color: #72777C; border-radius: 30px; text-align: center; line-height: 20px; -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); } #updraft-wrap .info-content-wrapper { display: none; position: absolute; bottom: 20px; -webkit-transform: translatex(calc(-50% + 10px)); transform: translatex(calc(-50% + 10px)); width: 330px; padding-bottom: 10px; } #updraft-wrap .info-content-wrapper::before { content: ''; position: absolute; bottom: -10px; border: 10px solid transparent; border-top-color: #FFF; left: calc(50% - 10px); } #updraft-wrap .info-content { padding: 20px; background: #FFF; border-radius: 4px; -webkit-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); color: #72777C; } #updraft-wrap .info-content h3 { margin-top: 0; } #updraft-wrap .info-content p { margin-top: 10px; } #updraft-wrap .udp-info:hover .info-content-wrapper { display: block; } div.conditional_remote_backup select.logic_type { vertical-align: inherit !important; } div.conditional_remote_backup label.updraft_toggle_instance_label.radio_group { display: block; margin-top: 7px; } div.conditional_remote_backup div.logic ul.rules input.rule_value { vertical-align: middle; } div.conditional_remote_backup p { margin-bottom: 10px; } div.conditional_remote_backup div.logic ul.rules span svg { width: 20px; vertical-align: middle; cursor: pointer; } div.conditional_remote_backup div.logic ul.rules span svg { margin-left: 3px; } div.conditional_remote_backup div.logic select.logic_type { vertical-align: unset; } /* jstree styles */ /* these styles hide the dots from the parent but keep the arrows */ .updraft_jstree .jstree-container-ul > .jstree-node, div[id^="updraft_more_files_jstree_"] .jstree-container-ul > .jstree-node { background: transparent; } .updraft_jstree .jstree-container-ul > .jstree-open > .jstree-ocl, div[id^="updraft_more_files_jstree_"] .jstree-container-ul > .jstree-open > .jstree-ocl { background-position: -36px -4px; } .updraft_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl, div[id^="updraft_more_files_jstree_"] .jstree-container-ul > .jstree-closed> .jstree-ocl { background-position: -4px -4px; } .updraft_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl, div[id^="updraft_more_files_jstree_"] .jstree-container-ul > .jstree-leaf> .jstree-ocl { background: transparent; } /* zip browser jstree styles */ #updraft_zip_files_container { position: relative; height: 450px; overflow: none; } .updraft_jstree_info_container { position: relative; height: auto; width: 100%; border: 1px dotted; margin-bottom: 5px; } .updraft_jstree_info_container p { margin: 1px; padding-left: 10px; font-size: 14px; } #updraft_zip_download_item { display: none; color: #0073AA; padding-left: 10px; } #updraft_zip_download_notice { padding-left: 10px; } #updraft_exclude_files_folders_jstree, #updraft_exclude_files_folders_wildcards_jstree { max-height: 200px; overflow-y: scroll; } .updraft_jstree { position: relative; border: 1px dotted; height: 80%; width: 100%; overflow: auto; } /* More files jstree styles */ div[id^="updraft_more_files_container_"] { position: relative; display: none; width: 100%; border: 1px solid #CCC; background: #FAFAFA; margin-bottom: 5px; margin-top: 4px; -webkit-box-shadow: 0 5px 8px rgba(0, 0, 0, 0.1); box-shadow: 0 5px 8px rgba(0, 0, 0, 0.1); } div[id^="updraft_more_files_container_"]::before { content: ' '; width: 11px; height: 11px; display: block; background: #FAFAFA; position: absolute; top: 0; left: 20px; border-top: 1px solid #CCC; border-left: 1px solid #CCC; -webkit-transform: translatey(-7px) rotate(45deg); transform: translatey(-7px) rotate(45deg); } input.updraft_more_path_editing { border-color: #0285BA; } input.updraft_more_path_editing ~ a.dashicons { display: none; } div[id^="updraft_jstree_buttons_"] { padding: 10px; background: #E6E6E6; } div[id^="updraft_jstree_container_"] { height: 300px; width: 100%; overflow: auto; } div[id^="updraft_more_files_container_"] button { line-height: 20px; } button[id^="updraft_parent_directory_"] { margin: 10px 10px 4px 10px; padding-left: 3px; } button[id^="updraft_jstree_confirm_"], button[id^="updraft_jstree_cancel_"] { display: none; } input[id^="updraft_include_more_path_restore_"] { text-align: right; } .updraftplus-morefiles-row-delete, .updraftplus-morefiles-row-edit { cursor: pointer; } #updraft_include_more_paths_error { color: #DE3C3C; } p[id^="updraftplus_manual_authentication_error_"] { color: #DE3C3C; } #updraft-wrap .form-table th { width: 230px; } #updraft-wrap .form-table .existing-backups-table th { width: auto; } .updraft-viewlogdiv form { margin: 0; padding: 0; } .updraft-viewlogdiv { display: inline-block; } .updraft-viewlogdiv input, .updraft-viewlogdiv a { border: none; background-color: transparent; color: #000; margin: 0px; padding: 3px 4px; font-size: 16px; line-height: 26px; } .updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover { color: #FFF; cursor: pointer; } .button.button-remove { color: white; background-color: #DE3C3C; border-color: #C00000; -webkit-box-shadow: 0 1px 0 #C10100; box-shadow: 0 1px 0 #C10100; } .button.button-remove:hover, .button.button-remove:focus { border-color: #C00; color: #FFF; background: #C00; } /* button-remove colors for midnight admin theme */ body.admin-color-midnight .button.button-remove { color: #DE3C3C; background-color: #F7F7F7; border-color: #CCC; -webkit-box-shadow: 0 1px 0 #CCC; box-shadow: 0 1px 0 #CCC; } body.admin-color-midnight .button.button-remove:hover, body.admin-color-midnight .button.button-remove:focus { border-color: #BA281F; } body.admin-color-midnight .button.button-remove:focus { -webkit-box-shadow: inherit; box-shadow: inherit; -webkit-box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); } .drag-drop #drag-drop-area2 { border: 4px dashed #DDD; height: 200px; } #drag-drop-area2 .drag-drop-inside { margin: 36px auto 0; width: 350px; } #filelist, #filelist2 { margin-top: 30px; width: 100%; } #filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file, #ud_downloadstatus3 .file { padding: 1px; background: #ECECEC; border: solid 1px #CCC; margin: 4px 0; } .updraft_premium section { margin-bottom: 20px; } /* Call to action Premium */ .updraft_premium_cta { background: #FFF; margin-top: 30px; padding: 0; border-left: 4px solid #DB6A03; } .updraft_premium_cta a { font-weight: normal; } .updraft_premium_cta__action { position: relative; text-align: center; } .updraft_premium_cta a.button.button-primary.button-hero { font-size: 1.3em; letter-spacing: 0.03rem; text-transform: uppercase; margin-bottom: 7px; } .updraft_premium_cta a.button.button-primary.button-hero + small { display: block; max-width: 100%; text-align: center; color: #AFAFAF; } .updraft_premium_cta a.button.button-primary.button-hero + small .dashicons { width: 12px; height: 12px; } .updraft_premium_cta__top { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; padding: 18px 30px; } .updraft_premium_cta__bottom { background: #F9F9F9; padding: 5px 30px; } .updraft_premium_cta__summary { margin-right: 60px; } .updraft_premium_cta h2 { font-size: 28px; font-weight: 200; line-height: 1; margin: 0; margin-bottom: 5px; letter-spacing: 0.05rem; color: #DB6A03; } .updraft_premium_cta ul li::after { color: #CCC; } @media only screen and (max-width: 768px) { .updraft_premium_cta__top { -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; text-align: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } .updraft_premium_cta__summary { margin-right: 0; margin-bottom: 30px; } } /* Box */ .udp-box { background: #FFF; padding: 20px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); text-align: center; } .udp-box h3 { margin: 0; } .udp-box__heading { -ms-flex-item-align: center; align-self: center; background: none; -webkit-box-shadow: none; box-shadow: none; } /* Other Plugins */ .updraft-more-plugins { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -ms-flex-wrap: wrap; flex-wrap: wrap; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; flex-wrap: wrap; } .updraft-more-plugins img { max-width: 80%; max-height: 30%; display: inline-block; } .updraft-more-plugins .udp-box { -webkit-box-sizing: border-box; box-sizing: border-box; width: 24%; } .updraft-more-plugins .udp-box p:last-child { margin-bottom: 0; padding-bottom: 0; } /* links list */ .updraft_premium_description_list { text-align: left; margin: 0; font-size: 12px; } ul.updraft_premium_description_list, ul#updraft_restore_warnings { list-style: disc inside; } ul.updraft_premium_description_list li { display: inline; } ul.updraft_premium_description_list li::after { content: " | "; } ul.updraft_premium_description_list li:last-child::after { content: ""; } .updraft_feature_cell { background-color: #F7D9C9 !important; padding: 5px 10px; } .updraftplus_com_login_status, .updraftplus_com_key_status { display: none; background: #FFF; border-left: 4px solid #FFF; border-left-color: #DC3232; -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1); box-shadow: 0 1px 1px 0 rgba(0,0,0,.1); margin: 5px 0 15px 0; padding: 5px 12px; } .updraftplus_com_login_status.success { border-left-color: green; } #updraft-wrap strong.success { color: green; } .updraft_feat_table { border: none; border-collapse: collapse; font-size: 120%; background-color: white; text-align: center; } .updraft_feat_th, .updraft_feat_table td { border: 1px solid #F1F1F1; border-collapse: collapse; font-size: 120%; background-color: white; text-align: center; padding: 15px; } .updraft_feat_table td { border-bottom-width: 4px; } .updraft_feat_table td:first-child { border-left: none; } .updraft_feat_table td:last-child { border-right: none; } .updraft_feat_table tr:last-child td { border-bottom: none; } .updraft_feat_table td:nth-child(2), .updraft_feat_table td:nth-child(3) { background-color: rgba(241, 241, 241, 0.38); width: 190px; } .updraft_feat_table__header td img { display: block; margin: 0 auto; } .updraft_feat_table__header td { text-align: center; } .updraft_feat_table .installed { font-size: 14px; } .updraft_feat_table p { padding: 0px 10px; margin: 5px 0px; font-size: 13px; } .updraft_feat_table h4 { margin: 5px 0px; } .updraft_feat_table .dashicons { width: 25px; height: 25px; font-size: 25px; line-height: 1; } .updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes { color: green; } .updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no { color: red; } .updraft_tick_cell { text-align: center; } .updraft_tick_cell img { margin: 4px 0; height: 24px; } .ud_downloadstatus__close { border: none; background: transparent; width: auto; font-size: 20px; padding: 0; cursor: pointer; } #filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress, #ud_downloadstatus3 .dlfileprogress { width: 0%; background: #0572AA; height: 8px; -webkit-transition: width .3s; transition: width .3s; } .ud_downloadstatus .raw, #ud_downloadstatus2 .raw, #ud_downloadstatus3 .raw { margin-top: 8px; clear: left; } .ud_downloadstatus .file, #ud_downloadstatus2 .file, #ud_downloadstatus3 .file { margin-top: 8px; } div[class^="updraftplus_downloader_container_"] { padding: 10px; } tr.updraftplusmethod h3 { margin: 0px; } tr.updraftplusmethod img { max-width: 100%; } #updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete { cursor: pointer; color: red; font-size: 120%; font-weight: bold; border: 0px; border-radius: 3px; padding: 2px; margin: 0 6px; text-decoration: none; display: inline-block; } #updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover { cursor: pointer; color: white; background: red; } #updraft_backup_started { max-width: 800px; font-size: 140%; line-height: 140%; padding: 14px; clear: left; } /* backup finished */ .blockUI.blockOverlay.ui-widget-overlay { background: #000; } .updraft_success_popup { text-align: center; padding-bottom: 30px; } .updraft_success_popup > .dashicons { font-size: 100px; width: 100px; height: 100px; line-height: 100px; padding: 0px; border-radius: 50%; margin-top: 30px; display: block; margin-left: auto; margin-right: auto; background: #E2E6E5; } .updraft_success_popup > .dashicons.dashicons-yes { text-indent: -5px; } .updraft_success_popup.success > .dashicons { color: green; } .updraft_success_popup.warning > .dashicons { color: #888; } .updraft_success_popup--message { padding: 20px; } .button.updraft-close-overlay .dashicons { text-decoration: none; font-size: 20px; margin-left: -5px; padding: 0; -webkit-transform: translatey(3px); transform: translatey(3px); } .updraft_saving_popup img { -webkit-animation-name: udp_blink; animation-name: udp_blink; -webkit-animation-duration: 610ms; animation-duration: 610ms; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-direction: alternate; animation-direction: alternate; -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } .udp-premium-image { display: none; } @media screen and (min-width: 720px) { .udp-premium-image { display: block; float: left; padding-right: 5px; } } /* End stuff already in admin.php */ #plupload-upload-ui2 { width: 80%; } .backup-restored { padding: 8px; } .updated.backup-restored { padding-top: 15px; padding-bottom: 15px; } .backup-restored span { font-size: 120%; } .memory-limit { padding: 8px; } .updraft_list_errors { padding: 8px; } /*.nav-tab { border-radius: 20px 20px 0 0; border-color: grey; border-width: 2px; margin-top: 34px; } .nav-tab:hover { border-bottom: 0; } .nav-tab-active, .nav-tab-active:active { color: #df6926; border-color: #D3D3D3; border-width: 1px; border-bottom: 0; } .nav-tab-active:focus { color: #df6926; }*/ .nav-tab-wrapper { margin: 14px 0px; } #updraft-poplog-content { white-space: pre-wrap; } .next-backup { border: 0px; padding: 0px; margin: 0 10px 0 0; } .not-scheduled { vertical-align: top !important; margin: 0px !important; padding: 0px !important; } .next-backup .updraft_scheduled { /* width: 124px;*/ margin: 0px; padding: 2px 4px 2px 0px; } #next-backup-table-inner td { vertical-align: top; } .updraft_all-files { color: blue; } .multisite-advert-width { width: 800px; } .updraft_settings_sectionheading { margin-top: 6px; } .premium-upgrade-prompt { /* font-size: 115%; */ } section.premium-upgrade-purchase-success { padding: 2em; background: #FAFAFA; text-align: center; -webkit-box-shadow: 0px 14px 40px rgba(0, 0, 0, 0.1); box-shadow: 0px 14px 40px rgba(0, 0, 0, 0.1); } section.premium-upgrade-purchase-success h3 { font-size: 2em; color: green; } section.premium-upgrade-purchase-success h3 .dashicons { display: block; margin: 0 auto; font-size: 60px; width: 60px; height: 60px; border-radius: 50%; background: green; color: #FFF; margin-bottom: 20px; } section.premium-upgrade-purchase-success h3 .dashicons::before { display: inline-block; margin-left: -4px; margin-top: 2px; } section.premium-upgrade-purchase-success p { font-size: 120%; } .show_admin_restore_in_progress_notice { padding: 8px; } .show_admin_restore_in_progress_notice .unfinished-restoration { font-size: 120%; } #backupnow_includefiles_moreoptions, #backupnow_database_moreoptions, #backupnow_includecloud_moreoptions { margin: 4px 16px 6px 16px; border: 1px dotted; padding: 6px 10px; } #backupnow_database_moreoptions { max-height: 250px; overflow: auto; } #backupnow_database_moreoptions div.backupnow-db-tables { margin-bottom: 5px; } #backupnow_database_moreoptions div.backupnow-db-tables > a { color: #0073AA; } .form-table #updraft_activejobsrow .minimum-height { min-height: 100px; } #updraft_activejobsrow th { max-width: 112px; margin: 0; padding: 13px 0 0 0; } #updraft_lastlogmessagerow .last-message { padding-top: 20px; display: block; } .updraft_simplepie { vertical-align: top; } .download-backups { margin-top: 8px; } .download-backups .updraft_download_button { margin-right: 6px; } .download-backups .ud-whitespace-warning, .download-backups .ud-bom-warning { background-color: pink; padding: 8px; margin: 4px; border: 1px dotted; } .download-backups .ul { list-style: none inside; max-width: 800px; margin-top: 6px; margin-bottom: 12px; } #updraft-plupload-modal { margin: 16px 0; } .download-backups .upload { max-width: 610px; } .download-backups #plupload-upload-ui { width: 100%; } .ud_downloadstatus { padding: 10px 0; } #ud_massactions, #updraft-delete-waitwarning { padding: 14px; background: rgb(241, 241, 241); position: absolute; left: 0; top: 100%; } #ud_massactions > *, #updraft-delete-waitwarning > * { vertical-align: middle; } #ud_massactions .updraftplus-remove { display: inline-block; margin-right: 0; } #ud_massactions .updraftplus-remove a { text-decoration: none; } #ud_massactions .updraft-viewlogdiv a { text-decoration: none; position: relative; } small.ud_massactions-tip { display: inline-block; opacity: 0.5; font-style: italic; margin-left: 20px; } #updraft-navtab-backups-content .updraft_existing_backups { margin-bottom: 35px; position: relative; } #updraft-message-modal-innards { padding: 4px; } #updraft-authenticate-modal { text-align: center; font-size: 16px !important; } #updraft-authenticate-modal p { font-size: 16px; } div.ui-dialog.ui-widget.ui-widget-content { z-index: 99999 !important; } #updraft_delete_form p { margin-top: 3px; padding-top: 0; } #updraft_restore_form .cannot-restore { margin: 8px 0; } .notice.updraft-restore-option { padding: 12px; margin: 8px 0 4px 0; border-left-color: #CCC; } /* updraft_restore_crypteddb */ #updraft_restorer_dboptions h4 { margin: 0px 0px 6px 0px; padding: 0px; } .updraftplus_restore_tables_options_container { max-height: 250px; overflow: auto; } .updraft_debugrow th { vertical-align: top; padding-top: 6px; max-width: 140px; } .expertmode p { font-size: 125%; } .expertmode .call-wp-action { width: 300px; height: 22px; } .updraftplus-lock-advert { clear: left; max-width: 600px; } .uncompressed-data { clear: left; max-width: 600px; } .delete-old-directories { padding: 8px; padding-bottom: 12px; } .active-jobs { width: 100%; text-align: center; padding: 33px; } .job-id { margin-top: 0; margin-bottom: 8px; } .next-resumption { font-weight: bold; } .updraft_percentage { z-index: -1; position: absolute; left: 0px; top: 0px; text-align: center; background-color: #1D8EC2; -webkit-transition: width 0.3s; transition: width 0.3s; } .curstage { z-index: 1; border-radius: 2px; margin-top: 8px; width: 100%; height: 26px; line-height: 26px; position: relative; text-align: center; font-style: italic; color: #FFF; background-color: #B7B7B7; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); } .curstage-info { display: inline-block; z-index: 2; } .retain-files { width: 48px; } .backup-interval-description tr td div { max-width: 670px; } #updraft-manualdecrypt-modal { width: 85%; margin: 6px; margin-left: 100px; } .directory-permissions { font-size: 110%; font-weight: bold; } .double-warning { border: 1px solid; padding: 6px; } .raw-backup-info { font-style: italic; font-weight: bold; font-size: 120%; } .updraft_existingbackup_date { width: 22%; max-width: 140px; } .updraft_existing_backups_wrapper { margin-top: 20px; border-top: 1px solid #DDD; } .updraft-no-backups-msg { padding: 10px 40px; text-align: center; font-style: italic; } .tr-bottom-4 { margin-bottom: 4px; } .existing-backups-table th { padding: 8px 10px; } .form-table .backup-date { width: 172px; } .form-table .backup-data { width: 426px; } .form-table .updraft_backup_actions { width: 272px; } .existing-date { -webkit-box-sizing: border-box; box-sizing: border-box; max-width: 140px; width: 25%; } .line-break-tr { height: 2px; padding: 1px; margin: 0px; } .line-break-td { margin: 0; padding: 0; } .td-line-color { height: 2px; background-color: #888; } .raw-backup { max-width: 140px; } .existing-backups-actions { padding: 1px; margin: 0px; } .existing-backups-border { height: 2px; padding: 1px; margin: 0px; } .existing-backups-border > td { margin: 0; padding: 0; } .existing-backups-border > div { height: 2px; background-color: #AAA; } .updraft_existing_backup_date { max-width: 140px; } .updraftplus-upload { margin-right: 6px; float: left; clear: none; } .before-restore-button { padding: 1px; margin: 0px; } .before-restore-button div { float: none; display: inline-block; } .table-separator-tr { height: 2px; padding: 1px; margin: 0px; } .table-separator-td { margin: 0px; padding: 0px; } .end-of-table-div { height: 2px; background-color: #AAA; } .last-backup-job { padding-top: 3% !important; } .line-height-03 { line-height: 0.3 !important; } .line-height-13 { line-height: 1.3 !important; } .line-height-23 { line-height: 2.3 !important; } #updraft_diskspaceused { color: #DF6926; } #updraft_delete_old_dirs_pagediv { padding-bottom: 10px; } /*#updraft_lastlogmessagerow > td, #updraft_last_backup > td { padding: 0; }*/ /* Time + scheduling add-on*/ .fix-time { width: 70px; } .retain-files { width: 70px; } .number-input { min-width: 50px; max-width: 70px; } .additional-rule-width { min-width: 60px; max-width: 70px; } /* Add-ons */ /* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */ #updraft-wrap .dashicons.dashicons-adapt-size { line-height: inherit; font-size: inherit; } #updraft-wrap .button span.dashicons:not(.dashicons-adapt-size) { vertical-align: middle; margin-top: -3px; } .addon-logo-150 { margin-left: 30px; margin-top: 33px; height: 125px; width: 150px; } .margin-bottom-50 { margin-bottom: 50px; } .premium-container { width: 80%; } /* Main Header */ .main-header { background-color: #DF6926; height: 200px; width: 100%; } .button-add-to-cart { color: white; border-color: white; float: none; margin-right: 17px; } .button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active { border-color: #A0A5AA; color: #A0A5AA; } .addon-title { margin-top: 25px; } .addon-text { margin-top: 75px; } .image-main-div { width: 25%; float: left; } .text-main-div { width: 60%; float: left; text-align: center; color: white; margin-top: 16px; } .text-main-div-title { font-weight: bold !important; color: white; text-align: center; } .text-main-div-paragraph { color: white; } /* End main header */ /* Vault icons */ .updraftplus-vault-cta { width: 100%; text-align: center; margin-bottom: 50px; } .updraftplus-vault-cta h1 { font-weight: bold; } .updraftvault-buy { width: 225px; height: 225px; border: 2px solid #777; display: inline-table; margin: 0 auto; margin-right: 50px; position: relative; } .updraftplus-vault-cta > .vault-options > .center-vault { width: 275px; height: 275px; } .updraftplus-vault-cta > .vault-options > .center-vault > a { right: 21%; font-size: 16px; border-width: 4px !important; } .updraftplus-vault-cta > .vault-options > .center-vault > p { font-size: 16px; } .updraftvault-buy .button-purchase { right: 24%; margin-left: 0; line-height: 1.7em; } .updraftvault-buy hr { height: 2px; background-color: #777; margin-top: 18px; } .right { margin-right: 0px; } .updraftvault-buy .addon-logo-100 { height: 100px; width: 125px; margin-top: 7px; } .updraftvault-buy .addon-logo-large { margin-top: 7px; } .updraftvault-buy .button-buy-vault { font-size: 12px; color: #DF6926; border-color: #DF6926; border-width: 2px !important; position: absolute; right: 29%; bottom: 2%; } .premium-addon-div .button-purchase { line-height: 1.7em; } .updraftvault-buy .button-buy-vault:hover { border-color: darkgrey; color: darkgrey; } /* End Vault icons */ /* Premium addons */ .premium-addons { margin-top: 80px; width: 100%; margin: 0 auto; display: table; } .addon-list { /* margin-left: 32px; */ display: table; text-align: center; } .premium-addons h1 { text-align: center; font-weight: bold; } .premium-addons p { text-align: center; } .premium-addons .premium-addon-div { width: 200px; height: 250px; border: 2px solid #777; display: inline-table; margin: 0 auto; margin-right: 25px; margin-top: 25px; text-align: center; position: relative; } .premium-addons .premium-addon-div p { margin-left: 2px; margin-right: 2px; } .premium-addons .premium-addon-div img { width: auto; height: 50px; margin-top: 7px; } .premium-addons .premium-addon-div .hr-alignment { margin-top: 44px; } .premium-addons .premium-addon-div .dropbox-logo { height: 39px; width: 150px; } .premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo { width: 75%; height: 24px; } .button-purchase { font-size: 12px; color: #DF6926; border-color: #DF6926; border-width: 2px !important; position: absolute; right: 25%; bottom: 2%; } .button-purchase:hover { color: darkgrey; border-color: darkgrey; } .premium-addons .premium-addon-div hr { height: 2px; background-color: #777; margin-top: 18px; } .premium-addon-div p { font-style: italic; } .addon-list > .premium-addon-div > .onedrive-fix, .addon-list > .premium-addon-div > .azure-logo { margin-top: 33px; } .addon-list > .premium-addon-div > .dropbox-fix { margin-top: 18px; } /* End premium addons */ /* Forgotton something (that is the name of the div rather than a mental note!) */ .premium-forgotton-something { margin-top: 5%; } .premium-forgotton-something h1 { text-align: center; font-weight: bold; } .premium-forgotton-something p { text-align: center; font-weight: normal; } .premium-forgotton-something .button-faq { color: #DF6926; border-color: #DF6926; margin: 0 auto; display: table; } .premium-forgotton-something .button-faq:hover { color: #777; border-color: #777; } /* End of forgotton something */ .updraftplusmethod.updraftvault #vaultlogo { padding-left: 40px; } .updraftplusmethod.updraftvault .vault_primary_option { float: left; width: 50%; text-align: center; padding-bottom: 20px; } .updraftplusmethod.updraftvault .vault_primary_option div { clear: right; padding-top: 20px; } .updraftplusmethod.updraftvault .clear-left { clear: left; } .updraftplusmethod.updraftvault .padding-top-20px { padding-top: 20px; } .updraftplusmethod.updraftvault .padding-top-14px { padding-top: 14px; } .updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary { font-size: 18px !important; } .updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect { margin-top: 8px; } .updraftplusmethod.updraftvault #updraftvault_settings_connect input { margin-right: 10px; } .updraftplusmethod.updraftvault #updraftvault_email { width: 280px; } .updraftplusmethod.updraftvault #updraftvault_pass { width: 200px; } .updraftplusmethod.updraftvault #vault-is-connected { margin: 0; padding: 0; } .updraftplusmethod.updraftvault #updraftvault_settings_default p { clear: left; } .updraftplusmethod.updraftvault .vault-purchase-option-container { text-align: center; } .updraftplusmethod.updraftvault .vault-purchase-option { width: 40%; text-align: center; padding-top: 20px; display: inline-block; } .updraftplusmethod.updraftvault .vault-purchase-option-size { font-size: 200%; font-weight: bold; } .updraftplusmethod.updraftvault .vault-purchase-option-link { clear: both; font-size: 150%; } .updraftplusmethod.updraftvault .vault-purchase-option-or { clear: both; font-size: 115%; font-style: italic; } /* Automation Backup Advert by B */ .autobackup-image { /* display: inline-block; */ /* min-width: 10%; max-width:25%;*/ /* float: left;*/ clear: left; float: left; width: 110px; height: 110px; } .autobackup-description { width: 100%; } .advert-description { float: left; clear: right; padding: 4px 10px 8px 10px; width: 70%; clear: right; vertical-align: top; } .advert-btn { display: inline-block; min-width: 10%; vertical-align: top; margin-bottom: 8px; } .advert-btn:first-of-type { margin-top: 25px; } .advert-btn a { display: block; cursor: pointer; } a.btn-get-started { background: #FFF; border: 2px solid #DF6926; border-radius: 4px; color: #DF6926; display: inline-block; margin-left: 10px !important; margin-bottom: 7px !important; font-size: 18px !important; line-height: 20px; min-height: 28px; padding: 11px 10px 5px 10px; text-transform: uppercase; text-decoration: none; } .circle-dblarrow { border: 1px solid #DF6926; border-radius: 100%; display: inline-block; font-size: 17px; line-height: 17px; margin-left: 5px; width: 20px; height: 20px; text-align: center; } /* End Automation Backup Advert by B */ /* New Responsive Pretty Advanced Settings */ .expertmode .advanced_settings_container { height: auto; overflow: hidden; } .expertmode .advanced_settings_container .advanced_settings_menu { float: none; border-bottom: 1px solid rgb(204, 204, 204); } .expertmode .advanced_settings_container .advanced_settings_content { padding-top: 5px; float: none; width: auto; overflow: auto; } .expertmode .advanced_settings_container .advanced_settings_content h3:first-child { margin-top: 5px !important; } .expertmode .advanced_settings_container .advanced_settings_content .advanced_tools { display: none; } .expertmode .advanced_settings_container .advanced_settings_content .site_info { display: block; } .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button { display: inline-block; cursor: pointer; padding: 5px; color: #000; } .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text { font-size: 16px; } .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover { background-color: #EAEAEA; } .expertmode .advanced_settings_container .advanced_settings_menu .active { background-color: #3498DB; color: #FFF; } .expertmode .advanced_settings_container .advanced_settings_menu .active:hover { background-color: #72C5FD; color: #FFF; } .expertmode .advanced_settings_container .advanced_settings_content input#import_settings { height: auto !important; } div#updraft-wrap a { cursor: pointer !important; } .updraftcentral_wizard_option { width: 45%; float: left; text-align: center; } .updraftcentral_wizard_option label { margin-bottom: 8px; } #updraftcentral_keys_table { display: none; } .create_key_container { border: 1px solid; border-radius: 4px; padding: 0 0 6px 6px; margin-bottom: 8px; } .updraftcentral_cloud_connect { border-radius: 4px; border: 1px solid #000; padding: 0 20px; margin-top: 30px; background-color: #FFF; } .updraftcentral_cloud_error { border: 1px solid #000; padding: 3px 10px; border-left: 3px solid #F00; background-color: #FFF; margin-bottom: 10px; } .updraftcentral_cloud_info { border: 1px solid #000; padding: 3px 10px; border-left: 3px solid #EF8F31; background-color: #FFF; margin-bottom: 10px; } .updraftplus_spinner.spinner { padding-left: 25px; float: none; } .updraftplus_spinner.spinner.visible { visibility: visible; width: auto; } .updraftcentral_cloud_notices .updraftplus_spinner { margin-top: -5px; } .updraftcentral-subheading { font-size: 14px; margin-top: -10px; margin-bottom: 20px; } #updraftcentral_cloud_form input#email, #updraftcentral_cloud_form input#password { min-width: 250px; } .updraftcentral-data-consent { font-size: 13px; margin-bottom: 10px; } .updraftcentral_cloud_wizard_image { float: left; min-width: 100px; margin-right: 25px; } .updraftcentral_cloud_wizard { float: left; } .updraftcentral_cloud_clear { clear: both; } .updraftplus-settings-footer { margin-top: 30px; } .updraftplus-top-menu { padding: 0.5em; } #updraft_inpage_backup #updraft_activejobs_table { background: transparent; } #updraft_inpage_backup #updraft_lastlogmessagerow .updraft-log-link { float: none; } #updraft_inpage_backup #updraft_activejobsrow .updraft_row { -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; padding-left: 20px; padding-right: 20px; } #updraft_inpage_backup #updraft_activejobsrow .updraft_progress_container { width: 100%; } #updraft_inpage_backup #updraft_activejobs_table { overflow: inherit; } #updraft_inpage_backup span#updraft_lastlogcontainer { padding: 18px; background: #FAFAFA; display: block; font-size: 90%; -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); } #updraft_inpage_backup div#updraft_activejobsrow { background: #FAFAFA; -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1); } #updraft_inpage_backup #updraft_lastlogmessagerow > div { background: transparent; padding: 0; } #updraft_inpage_backup .last-message > strong { display: block; margin-top: 13px; } body.update-core-php #updraft_inpage_backup h2:nth-child(1) { margin-top: 1em !important; } /* Restoration page */ .updraft_restore_container { display: block; position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 99999; padding-top: 30px; background: #F1F1F1; overflow: auto; } .updraft-modal-is-opened .select2-container { z-index: 99999; } body.updraft-modal-is-opened { overflow: hidden; } .updraft_restore_container h2 { margin: 0; } .updraft_restore_container .updraftmessage { -webkit-box-sizing: border-box; box-sizing: border-box; max-width: 860px; margin-left: auto; margin-right: auto; } .updraft_restore_main { max-width: 860px; margin: 0 auto; margin-top: 20px; background: #FFF; -webkit-box-shadow: 0 3px 3px rgba(0, 0, 0, 0.1); box-shadow: 0 3px 3px rgba(0, 0, 0, 0.1); position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; -webkit-box-sizing: border-box; box-sizing: border-box; } .updraft_restore_main--header { font-size: 20px; font-weight: bold; text-align: center; padding-top: 16px; line-height: 20px; width: 100%; max-width: 100%; padding-right: 30px; padding-left: 30px; -webkit-box-sizing: border-box; box-sizing: border-box; } .updraft_restore_main--activity { position: relative; width: calc(100% - 350px); -webkit-box-sizing: border-box; box-sizing: border-box; } .updraft_restore_main--activity-title { padding: 20px; margin: 0; } .show-credentials-form.updraft_restore_main .updraft_restore_main--activity-title { display: none; } .updraft_restore_main--components { width: 350px; padding: 20px; -webkit-box-sizing: border-box; box-sizing: border-box; background: #F8F8F8; min-height: 350px; } .updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output { background: #23282D; color: #E3E3E3; font-family: monospace; padding: 19px; overflow: auto; position: absolute; top: 60px; bottom: 0; right: 0; left: 0; } #updraftplus_ajax_restore_output form { white-space: normal; font-family: -apple-system, blinkmacsystemfont, "Segoe UI", roboto, oxygen-sans, ubuntu, cantarell, "Helvetica Neue", sans-serif; } #updraftplus_ajax_restore_output .updraft_restore_errors { border: 1px solid #DC3232; padding: 10px 20px; white-space: normal; } .updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output h2 { color: #00A0D2; padding-top: 10px; padding-bottom: 5px; } .updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output { padding: 20px; border-left: 1px solid #EEE; } .updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output #message { margin-left: 0; margin-right: 0; } .updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output .form-table td, .updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output .form-table th { padding-bottom: 0; } .updraft_restore_main.show-credentials-form .updraft_restore_main--components { opacity: 0.2; } .updraft_restore_main.show-credentials-form div.error .restore-credential-errors--list p { margin: 0; list-style-type: disc; display: list-item; list-style-position: inside; } .restore-credential-errors > :first-child { margin-top: 0; } .restore-credential-errors > :last-child { margin-bottom: 0; } ul.updraft_restore_components_list li { color: #BABABA; font-size: 1.2em; margin-bottom: 1em; } ul.updraft_restore_components_list li::before { content: '\f469'; font-family: dashicons; font-size: 20px; vertical-align: middle; display: inline-block; margin-right: 7px; } ul.updraft_restore_components_list li span { vertical-align: middle; } ul.updraft_restore_components_list li.done { color: green; } ul.updraft_restore_components_list li.done::before { content: "\f147"; } ul.updraft_restore_components_list li.active { color: inherit; } ul.updraft_restore_components_list li.active::before { content: "\f463"; -webkit-animation: udp_rotate 1s linear infinite; animation: udp_rotate 1s linear infinite; } ul.updraft_restore_components_list li.error { color: #DC3232; } ul.updraft_restore_components_list li.error::before { content: "\f335"; } .updraft_restore_result { padding: 10px 0; font-size: 1.3em; margin-bottom: 1em; vertical-align: middle; display: none; } .updraft_restore_result.restore-error { color: #DC3232; } .updraft_restore_result.restore-success { color: green; } .updraft_restore_result .dashicons { font-size: 35px; height: 35px; line-height: 33px; width: 35px; } .updraft_restore_result span { vertical-align: middle; } /* Restore modal */ #updraft-restore-modal { width: 100%; } div#updraft-restore-modal .notice { background: #F8F8F8; } .updraft-restore-modal--stage .updraft--two-halves, .updraft-restore-modal--stage .updraft--one-half { padding: 20px 30px; } .updraft-restore-modal--header { padding: 20px; padding-bottom: 0px; text-align: center; border-bottom: 1px solid #EEE; } .updraft-restore-modal--header h3 { margin: 0; padding: 0; } .updraft-restore-item { padding-bottom: 4px; } .updraft-restore-buttons { padding-top: 10px; } ul.updraft-restore--stages { display: inline-block; margin: 0; height: 28px; } ul.updraft-restore--stages li { display: inline-block; position: relative; width: 12px; height: 12px; background: #D2D2D2; border-radius: 20px; line-height: 1; margin: 0 4px; vertical-align: middle; } ul.updraft-restore--stages li.active { background: #444; } .updraft-restore--footer { border-top: 1px solid #EEE; padding: 20px; text-align: center; position: sticky; bottom: 0; background: #FFF; width: 100%; -webkit-box-sizing: border-box; box-sizing: border-box; } .updraft-restore--footer .updraft-restore--cancel { position: absolute; left: 20px; top: auto; } .updraft-restore--footer .updraft-restore--next-step { position: absolute; right: 20px; top: auto; } ul.updraft-restore--stages li span { position: absolute; width: 120px; bottom: calc(100% + 14px); left: -55px; background: rgba(0,0,0,0.85882); padding: 5px; -webkit-box-sizing: border-box; box-sizing: border-box; border-radius: 4px; color: #FFF; text-align: center; display: none; } ul.updraft-restore--stages li:hover span { display: inline-block; } .updraft-restore-item input[type=checkbox] { margin-bottom: -5px; } .updraft-restore-item input[type=checkbox]:checked + label { font-weight: bold; } /* Hide close button on download window */ div#updraft-restore-modal .ud_downloadstatus__close { display: none; } #ud_downloadstatus2:not(:empty) { margin-top: 15px; } .dashicons.rotate { -webkit-animation: udp_rotate 1s linear infinite; animation: udp_rotate 1s linear infinite; } /* Activity stalled */ span#updraftplus_ajax_restore_last_activity { font-size: .8rem; font-weight: normal; float: right; } .updraft_restore_main--components .updated.show_admin_restore_in_progress_notice { margin: -20px -20px 20px; padding: 19px; } .updraft_restore_main--components .updated.show_admin_restore_in_progress_notice button { margin-right: 5px; } #updraft_migrate_receivingsites .updraftplus-remote-sites-selector .button-primary, .updraft_migrate_add_site .input-field input, .updraft_migrate_add_site button { vertical-align: middle; } #updraft_migrate_receivingsites .text-link-menu a:not(:last-child) { padding-right: 10px; } #updraft_migrate_receivingsites a.updraft_migrate_clear_sites span.dashicons-trash:before { font-size: 17px; } #updraft_migrate_receivingsites .updraft_migrate_add_site { clear: both; } /* RTL Support */ .rtl .advanced_tools.total_size table td { direction: ltr; text-align: right; } .rtl #plupload-upload-ui2.drag-drop #drag-drop-area2 { margin-bottom: 20px; } .rtl #updraft_lastlogmessagerow .updraft-log-link { float: left; } .rtl label.updraft_checkbox > input[type=checkbox] { margin-right: -25px; margin-left: inherit; } .rtl .ud_downloadstatus__close { float: left !important; } .rtl #updraft_backupextradbs_another_container { float: right; } .rtl input.labelauty + label { direction: ltr; position: relative; min-height: 29px; } .rtl input.labelauty + label > span.labelauty-checked-image, .rtl input.labelauty + label > span.labelauty-unchecked-image { right: 8px; top: 11px; position: absolute; } .rtl .button.updraft-close-overlay .dashicons { margin-right: -5px; margin-left: inherit; } .rtl label.updraft_checkbox { margin-right: 26px; margin-left: inherit; } .rtl #updraft-wrap .udp-info { left: 10px; right: inherit; } .rtl input.labelauty + label > span.labelauty-unchecked-image + span.labelauty-unchecked, .rtl input.labelauty + label > span.labelauty-checked-image + span.labelauty-checked { margin-right: 7px; margin-left: inherit; padding: 7px 7px 7px 26px; width: 141px; text-align: right; } .rtl #updraft_report_cell button.updraft_reportbox_delete, .rtl .updraft_box_delete_button, .rtl .updraft_small_box .updraft_box_delete_button { left: 4px; right: inherit; } #updraft_exclude_modal .clause-input-container { overflow: auto; } #updraft_exclude_modal .clause-input-container select, #updraft_exclude_modal .clause-input-container input { float: left; } #updraft_exclude_modal .clause-input-container .wildcards-input { margin: 7px 7px 0 0; } #updraft_exclude_modal .updraft-exclude-panel .contain-clause-sub-label { margin-top: 10px; display: block; } @media only screen and (min-width: 1024px) { #updraft_activejobsrow .updraft_row { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: baseline; -ms-flex-align: baseline; align-items: baseline; } #updraft_activejobsrow .updraft_row .updraft_col { -webkit-box-flex: 1; -ms-flex: auto; flex: auto; } #updraft_activejobsrow .updraft_progress_container { width: calc(100% - 230px); } } @media only screen and (min-width: 782px) { .settings_page_updraftplus input[type=text], .settings_page_updraftplus input[type=password], .settings_page_updraftplus input[type=number] { /* border-radius: 4px; */ line-height: 1.42; /* border: 1px solid #CCC; */ height: 27px; padding: 2px 6px; color: #555; } .settings_page_updraftplus input[type="number"] { height: 31px; } #ud_massactions.active, #updraft-delete-waitwarning.active { position: fixed; bottom: 0; left: 160px; right: 0; top: auto; background: #FFF; z-index: 3; -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); } .rtl #ud_massactions.active, .rtl #updraft-delete-waitwarning.active { left: 0px; right: 160px; } body.folded #ud_massactions.active, body.folded #updraft-delete-waitwarning.active { left: 36px; } .updraft-after-form-table { margin-left: 250px; } #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.range-selection:not(.backuprowselected) .updraft_existingbackup_date .backup_date_label { color: #FFF; } } @media only screen and (min-width: 782px) and (max-width: 960px) { body.auto-fold #ud_massactions.active, body.auto-fold #updraft-delete-waitwarning.active { left: 36px; } } @media only screen and (max-width: 782px) { #updraft-wrap { margin-right: 0; } #updraft-wrap .form-table td { padding-right: 0; } label.updraft_checkbox { margin-bottom: 8px; margin-top: 8px; margin-left: 36px; } .updraft_retain_rules { position: relative; margin-right: 0; border: 1px solid #CCC; padding: 5px; margin-bottom: -1px; } .updraft_retain_rules_delete { position: absolute; right: 0; top: 5px; } a[id*=updraft_retain_] { display: block; padding: 15px 15px 15px 0; } label.updraft_checkbox > input[type=checkbox] { margin-left: -33px; } #updraft-backupnow-button { margin: 0; display: block; width: 100%; } .updraft_next_scheduled_backups_wrapper > .updraft_backup_btn_wrapper { padding-top: 0; } #ud_massactions, #updraft-delete-waitwarning { width: 100%; -webkit-box-sizing: border-box; box-sizing: border-box; text-align: center; } #ud_massactions.active { position: fixed; top: auto; bottom: 0; width: 100%; -webkit-box-sizing: border-box; box-sizing: border-box; text-align: center; -webkit-box-shadow: 0 -3px 15px rgba(0, 0, 0, 0.08); box-shadow: 0 -3px 15px rgba(0, 0, 0, 0.08); background: #FFF; z-index: 3; } #ud_massactions strong { display: block; margin-bottom: 5px; } small.ud_massactions-tip { display: block; } /* .advert-description { min-width: 75%; margin-bottom: 5px; } .advert-btn { margin-top: 15px; margin-left:86px; min-width: 100%; }*/ .existing-backups-table .backup_date_label > div, .existing-backups-table .backup_date_label span > div { font-weight: normal; } .existing-backups-table .backup_date_label .clear-right { display: inline-block; } table.widefat.existing-backups-table { border: 0; -webkit-box-shadow: none; box-shadow: none; background: transparent; } .existing-backups-table thead { border: none; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; padding: 0; margin: 0; } .existing-backups-table tr { display: block; margin-bottom: .625em; padding-bottom: 16.625px; width: 100%; padding: 0; margin: 0; margin-bottom: 10px; background: #FFF; -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); } .existing-backups-table td { border-bottom: 1px solid #DDD; display: block; font-size: .9em; text-align: left; width: 100%; padding: 10px; margin: 0; } .wp-list-table.existing-backups-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before { /* * aria-label has no advantage, it won't be read inside a table content: attr(aria-label); */ content: attr(data-label); font-weight: bold; display: block; position: relative; left: auto; padding-bottom: 10px; width: auto; text-align: left; } .existing-backups-table td:last-child { border-bottom: 0; } .form-table td.updraft_existingbackup_date { width: inherit; max-width: 100%; } .existing-backups-table td.before-restore-button { min-height: 36px; } .updraft_next_scheduled_backups_wrapper { -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .updraft_next_scheduled_backups_wrapper > div { width: 100%; } .updraft_progress_container { /* width: 77%; */ } #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row { position: relative; } #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected { background-color: #FFF; border-left: 4px solid #0572AA; } #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row td:not(.backup-select) { margin-left: 50px; } #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row td.backup-select { width: 50px !important; position: absolute; left: 0; top: 0; -webkit-box-sizing: border-box; box-sizing: border-box; height: 100%; z-index: 1; border: none; border-right: 1px solid rgba(0, 0, 0, 0.05); } #updraft-navtab-backups-content .updraft_existing_backups input[type="checkbox"] { height: 25px; } .updraft_migrate_intro button.button.button-primary.button-hero { display: block; margin-right: 0; width: 100%; max-width: 100%; } .updraftclone-main-row { -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .updraftclone-main-row > div { width: auto; max-width: none; margin-right: 0; margin-bottom: 10px; } .form-table th { padding-bottom: 10px; } .updraft--flex { -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .updraft_restore_main { -ms-flex-wrap: wrap; flex-wrap: wrap; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .updraft_restore_main--components { width: 100%; min-height: 0; } .updraft_restore_main--activity { width: 100%; } div#updraftplus_ajax_restore_output, .updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output { position: relative; top: 0; bottom: auto; } .updraft--flex > .updraft--two-halves, .updraft--flex > .updraft--one-half { width: 100%; } .updraft-restore-item { padding-bottom: 10px; padding-top: 10px; } } @media screen and (max-width: 600px) { .updraft_next_scheduled_backups_wrapper > div { } .updraft_next_scheduled_entity { float: none; width: 100%; margin-bottom: 2em; } .updraft_time_now_wrapper { margin-top: 0; } #updraft_lastlogmessagerow h3 { margin-bottom: 5px; } #updraft_lastlogmessagerow .updraft-log-link { display: block; float: none; margin: 0; margin-bottom: 10px; } } @media screen and (max-width: 520px) { } @media only screen and (min-width: 768px) { .addon-activation-notice { left: 20em; } .existing-backups-table tbody tr.range-selection:hover, .existing-backups-table tbody tr.range-selection { background: #0572AA; /* #2b7fd9 */ } .existing-backups-table tbody tr:hover { background: #F1F1F1; } .existing-backups-table tbody tr td.before-restore-button { position: relative; } .form-table .existing-backups-table thead th.check-column { padding-left: 6px; } .existing-backups-table tr td:first-child { border-left: 4px solid transparent; } .existing-backups-table tr.backuprowselected td:first-child { border-left-color: #0572AA; } } @media screen and (min-width: 670px) { .expertmode .advanced_settings_container .advanced_settings_menu { float: left; width: 215px; border-right: 1px solid rgb(204, 204, 204); border-bottom: none; } .expertmode .advanced_settings_container .advanced_settings_content { padding-left: 10px; padding-top: 0px; } .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button { display: block; } } @media only screen and (max-width: 1068px) { .updraft-more-plugins .udp-box { width: calc(50% - 10px); margin-bottom: 20px; } .updraft_feat_table td:nth-child(2), .updraft_feat_table td:nth-child(3) { width: 100px; } } @media only screen and (max-width: 600px) { .updraft-more-plugins .udp-box { width: 100%; margin-bottom: 20px; } .updraft_feat_table td:nth-child(2), .updraft_feat_table td:nth-child(3) { width: auto; } table.updraft_feat_table { display: block; } table.updraft_feat_table tr { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } table.updraft_feat_table td { display: block; } table.updraft_feat_table td:first-child { width: 100%; border-bottom: none; } table.updraft_feat_table td:not(:first-child) { width: 50%; -webkit-box-sizing: border-box; box-sizing: border-box; } table.updraft_feat_table td:first-child:empty { display: none; } td[data-colname]::before { content: attr(data-colname); font-size: 0.8rem; color: #CCC; line-height: 1; } } PKwL\ߎ˜# # 6updraftplus/css/updraftplus-notices-2-23-7.min.css.mapnu[{"version":3,"sources":["css/updraftplus-notices.css"],"names":[],"mappings":"AAAA,oBAAoB;;AAEpB;CACC,YAAY;CACZ,gBAAgB;AACjB;;AAEA;CACC,aAAa;CACb,oBAAa;CAAb,oBAAa;CAAb,aAAa;AACd;;AAEA;CACC,mBAAmB;CACnB,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,yBAAmB;KAAnB,sBAAmB;SAAnB,mBAAmB;AACpB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,WAAW;CACX,WAAW;AACZ;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,yBAAmB;KAAnB,sBAAmB;SAAnB,mBAAmB;AACpB;;AAEA;CACC,WAAW;CACX,WAAW;CACX,gBAAgB;AACjB;;AAEA;CACC,cAAc;CACd,aAAa;CACb,eAAe;CACf,uBAAuB;CACvB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;AACnB;;AAEA;CACC,YAAY;CACZ,eAAe;CACf,mBAAmB;AACpB;;AAEA;CACC,0BAA0B;CAC1B,6BAA6B;AAC9B;;AAEA;CACC,0BAA0B;CAC1B,6BAA6B;AAC9B;;AAEA;CACC,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;;CAEC;EACC,WAAW;CACZ;;AAED","file":"updraftplus-notices-2-23-7.min.css","sourcesContent":["/* CSS for adverts */\n\n.updraft_notice_container {\n\theight: auto;\n\toverflow: hidden;\n}\n\n.updraft_review_notice_container {\n\tpadding: 12px;\n\tdisplay: flex;\n}\n\n.updraft_advert_button_container {\n\tmargin-bottom: 10px;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.updraft_advert_button_container .dashicons {\n\tmargin-left: 10px;\n}\n\n.updraft_advert_content_left {\n\tfloat: none;\n\twidth: 65px;\n}\n\n.updraft_advert_content_left_extra {\n\tfloat: none;\n\twidth: 100px;\n\tpadding-right: 15px;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.updraft_advert_content_right {\n\tfloat: none;\n\twidth: auto;\n\toverflow: hidden;\n}\n\n.updraft_advert_bottom {\n\tmargin: 10px 0;\n\tpadding: 10px;\n\tfont-size: 140%;\n\tbackground-color: white;\n\tborder-color: #E6DB55;\n\tborder: 1px solid;\n\tborder-radius: 4px;\n}\n\n.updraft-advert-dismiss {\n\tfloat: right;\n\tfont-size: 13px;\n\tfont-weight: normal;\n}\n\nh3.updraft_advert_heading {\n\tmargin-top: 5px !important;\n\tmargin-bottom: 5px !important;\n}\n\nh4.updraft_advert_heading {\n\tmargin-top: 2px !important;\n\tmargin-bottom: 3px !important;\n}\n\n.updraft_center_content {\n\ttext-align: center;\n\tmargin-bottom: 5px;\n}\n\n.updraft_notice_link {\n\tpadding-left: 5px;\n}\n\n.updraft_text_center {\n\ttext-align: center;\n}\n\n@media screen and (min-width: 560px) {\n\n\t.updraft_advert_content_left, .updraft_advert_content_left_extra {\n\t\tfloat: left;\n\t}\n\n}\n"]}PKwL\a*$updraftplus/css/updraftplus-tour.cssnu[.shepherd-theme-arrows-plain-buttons { z-index: 9999; max-width: 390px!important; } .shepherd-theme-arrows-plain-buttons.super-index { z-index: 999999; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content { border-radius: 3px; -webkit-filter: none; filter: none; -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 10px 40px rgba(0, 0, 0, 0.15); box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 10px 40px rgba(0, 0, 0, 0.15); } .shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: #DD6823; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header { background-color: #DD6823; border-radius: 3px 3px 0 0; padding-right: 90px; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header h3 { color: #FFF; font-size: 1.2em; float: none; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { opacity: 0.7; color: rgba(255, 255, 255, 0); font-size: 0.8em; border: 1px solid #FFF; border-radius: 50%; width: 22px; height: 22px; line-height: 20px; padding: 0; text-align: center; float: none; position: absolute; right: 11px; top: 12px } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link::before { color: #FFF; content: attr(data-btntext); position: absolute; right: 20px; padding-right: 10px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link::after { content: "\f335"; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: dashicons; color: #FFF; position: absolute; left: 2px; line-height: 21px; font-size: 16px; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus { border: 1px solid #A04E00; opacity: 1 } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover::before, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus::before { color: #A04E00; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover::after, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus::after { color: #A04E00; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 44px; } .shepherd-content .ud-notice { background: #F0F0F0; padding: 14px; border-radius: 4px; font-size: 90% !important; line-height: 1.5; } .shepherd-content .ud-notice h3 { margin-top: 0; padding-top: 0; margin-bottom: .5em; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p { margin-top: 0.5em; margin-bottom: 1.3em; } .ud-notice span.ud-special-offer { font-weight: bold; display: inline-block; padding: 1px 6px; border-radius: 3px; background: rgba(217, 105, 0, 0.09); } label[for=updraft_servicecheckbox_updraftvault] { border: 1px solid rgba(204, 204, 204, 0.4); -webkit-transition: border .5s; transition: border .5s } label[for=updraft_servicecheckbox_updraftvault].emphasize { border-color: #DD6823; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back, .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end { float: left; position: relative; padding-left: 10px; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end { padding-left: 0; color: #B7B7B7; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back::before { content: ' '; width: 6px; height: 6px; display: block; border-left: 1px solid; border-bottom: 1px solid; position: absolute; left: 0px; top: 8px; -webkit-transform: rotate(45deg); transform: rotate(45deg); } a.shepherd-button.udp-tour-end::before { display: inline-block; position: relative; content: "\f335"; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: dashicons; font-size: 20px; line-height: 20px; vertical-align: middle; margin-top: -2px; } .updraftplus-welcome-logo { display: block; width: 70px; float: left; margin-top: -11px; margin-right: 12px; } .updraftplus-welcome-logo img { display: block; width: auto; max-width: 100%; } .highlight-udp .plugins #the-list tr:not([data-slug="updraftplus"]) { opacity: 0.3; } @media(max-width: 790px) { .shepherd-element.shepherd-theme-arrows-plain-buttons { display: none; } } PKwL\>r220updraftplus/css/updraftplus-admin-2-23-7.min.cssnu[@-webkit-keyframes udp_blink{from{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:.4;-webkit-transform:scale(0.85);transform:scale(0.85)}}@keyframes udp_blink{from{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:.4;-webkit-transform:scale(0.85);transform:scale(0.85)}}@-webkit-keyframes udp_rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes udp_rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.max-width-600{max-width:600px}.max-width-700{max-width:700px}.width-900{max-width:900px}.width-80{width:80%}.updraft--flex{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.updraft--flex>*{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-sizing:border-box;box-sizing:border-box}.updraft--flex>.updraft--one-half{width:50%;-webkit-box-flex:1;-ms-flex:auto;flex:auto}.updraft--flex>.updraft--two-halves{width:100%;-webkit-box-flex:1;-ms-flex:auto;flex:auto}.updraft-color--very-light-grey{background:#f8f8f8}.no-decoration{text-decoration:none}.bold{font-weight:bold}.center-align-td{text-align:center}.remove-padding{padding:0 !important}.updraft-text-center{text-align:center}.autobackup{padding:6px;margin:8px 0}ul .disc{list-style:disc inside}.dashicons-log-fix{display:inherit}.udpdraft__lifted{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}#updraft-wrap a .dashicons{text-decoration:none}.updraft-field-description,table.form-table td p.updraft-field-description{font-size:90%;line-height:1.2;font-style:italic;margin-bottom:5px}label.updraft_checkbox{display:block;margin-bottom:4px;margin-left:26px}label.updraft_checkbox>input[type=checkbox]{margin-left:-25px}div[id*="updraft_include_"]{margin-bottom:9px}.settings_page_updraftplus input[type="file"]{border:0}.settings_page_updraftplus .wipe_settings{padding-bottom:10px}.settings_page_updraftplus input[type="text"]{font-size:14px}.settings_page_updraftplus select{border-radius:4px;max-width:100%}input.updraft_input--wide,textarea.updraft_input--wide{max-width:442px;width:100%}#updraft-wrap .button-large{font-size:1.3em}.main-dashboard-buttons{border-width:4px;border-radius:12px;letter-spacing:0;font-size:17px;font-weight:bold;padding-left:.7em;padding-right:2em;padding:.3em 1em;line-height:1.7em;background:transparent;position:relative;border:2px solid;-webkit-transition:all .2s;transition:all .2s;vertical-align:baseline;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;line-height:1.3em;margin-left:.3em;text-transform:none;line-height:1;text-decoration:none}.button-restore{border-color:#629ec0;color:#629ec0}.button-ud-google{text-decoration:none !important;-webkit-transition:background-color .3s,-webkit-box-shadow .3s;transition:background-color .3s,-webkit-box-shadow .3s;transition:background-color .3s,box-shadow .3s;transition:background-color .3s,box-shadow .3s,-webkit-box-shadow .3s;padding:12px 16px 12px 42px !important;border:0;border-radius:3px;-webkit-box-shadow:0 -1px 0 rgba(0,0,0,.04),0 1px 1px rgba(0,0,0,.25);box-shadow:0 -1px 0 rgba(0,0,0,.04),0 1px 1px rgba(0,0,0,.25);color:#757575;font-size:14px;font-weight:500;font-family:"Roboto";background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMTcuNiA5LjJsLS4xLTEuOEg5djMuNGg0LjhDMTMuNiAxMiAxMyAxMyAxMiAxMy42djIuMmgzYTguOCA4LjggMCAwIDAgMi42LTYuNnoiIGZpbGw9IiM0Mjg1RjQiIGZpbGwtcnVsZT0ibm9uemVybyIvPjxwYXRoIGQ9Ik05IDE4YzIuNCAwIDQuNS0uOCA2LTIuMmwtMy0yLjJhNS40IDUuNCAwIDAgMS04LTIuOUgxVjEzYTkgOSAwIDAgMCA4IDV6IiBmaWxsPSIjMzRBODUzIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48cGF0aCBkPSJNNCAxMC43YTUuNCA1LjQgMCAwIDEgMC0zLjRWNUgxYTkgOSAwIDAgMCAwIDhsMy0yLjN6IiBmaWxsPSIjRkJCQzA1IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48cGF0aCBkPSJNOSAzLjZjMS4zIDAgMi41LjQgMy40IDEuM0wxNSAyLjNBOSA5IDAgMCAwIDEgNWwzIDIuNGE1LjQgNS40IDAgMCAxIDUtMy43eiIgZmlsbD0iI0VBNDMzNSIgZmlsbC1ydWxlPSJub256ZXJvIi8+PHBhdGggZD0iTTAgMGgxOHYxOEgweiIvPjwvZz48L3N2Zz4=);background-color:#FFF;background-repeat:no-repeat;background-position:12px 11px}.button-ud-google:hover{-webkit-box-shadow:0 -1px 0 rgba(0,0,0,.04),0 2px 4px rgba(0,0,0,.25);box-shadow:0 -1px 0 rgba(0,0,0,.04),0 2px 4px rgba(0,0,0,.25)}.button-ud-google:active{background-color:#EEE}.button-ud-google:focus{outline:0;-webkit-box-shadow:0 -1px 0 rgba(0,0,0,.04),0 2px 4px rgba(0,0,0,.25),0 0 0 3px #c8dafc;box-shadow:0 -1px 0 rgba(0,0,0,.04),0 2px 4px rgba(0,0,0,.25),0 0 0 3px #c8dafc}.button-ud-google:disabled{-webkit-filter:grayscale(100%);filter:grayscale(100%);background-color:#ebebeb;-webkit-box-shadow:0 -1px 0 rgba(0,0,0,.04),0 1px 1px rgba(0,0,0,.25);box-shadow:0 -1px 0 rgba(0,0,0,.04),0 1px 1px rgba(0,0,0,.25);cursor:not-allowed}.dashboard-main-sizing{border-width:4px;width:190px;line-height:1.7em}p.updraftplus-option{margin-top:0;margin-bottom:5px}p.updraftplus-option-inline{display:inline-block;padding-right:20px}span.updraftplus-option-label{display:block}#updraft-navtab-migrate-content .postbox{padding:18px}.updraftclone-main-row{display:-webkit-box;display:-ms-flexbox;display:flex}.updraftclone-tokens{background:#f5f5f5;padding:20px;border-radius:10px;margin-right:20px;max-width:300px}.updraftclone-tokens p{margin:0}.updraftclone_action_box{background:#f5f5f5;padding:20px;border-radius:10px;-webkit-box-flex:1;-ms-flex:1;flex:1}.updraftclone_action_box p:first-child{margin-top:0}.updraftclone_action_box p:last-child{margin-bottom:0}.updraftclone_action_box #ud_downloadstatus3{margin-top:10px}span.tokens-number{font-size:46px;display:block}.button.updraft_migrate_widget_temporary_clone_show_stage0{display:none;position:absolute;right:0;top:0;height:100%;border-left:1px solid #CCC;padding-left:10px;padding-right:10px}.updraft_migrate_widget_temporary_clone_stage0_container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.updraft_migrate_widget_temporary_clone_stage0_box{margin-right:20px;width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.updraft_migrate_widget_temporary_clone_stage0_box iframe,.updraft_migrate_widget_temporary_clone_stage0_box a.udp-replace-with-iframe--js{float:none}@media(min-width:1024px){.updraft_migrate_widget_temporary_clone_stage0_container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.updraft_migrate_widget_temporary_clone_stage0_box{-ms-flex-preferred-size:45%;flex-basis:45%}.updraft_migrate_widget_temporary_clone_stage0_box iframe,.updraft_migrate_widget_temporary_clone_stage0_box a.udp-replace-with-iframe--js{float:right}}.updraft_migrate_widget_temporary_clone_show_stage0 .dashicons{text-decoration:none;font-size:20px}.opened .button.updraft_migrate_widget_temporary_clone_show_stage0{display:inline-block}.opened .updraft_migrate_widget_temporary_clone_stage0{background:#f5f5f5;padding:20px;border-radius:8px;margin-bottom:21px}.clone-list{clear:both;width:100%;margin-top:40px}.clone-list table{width:100%;text-align:left}.clone-list table tr th{background:#e4e4e4}.clone-list table tr td{background:#f5f5f5;word-break:break-word}.clone-list table tr:nth-child(odd) td{background:#fafafa}.clone-list table td,.clone-list table th{padding:6px}.updraftplus-clone .updraft_row{padding-left:0;padding-right:0}button#updraft_migrate_createclone+.updraftplus_spinner{margin-top:13px}.button.button-hero.updraftclone_show_step_1{white-space:normal;height:auto;line-height:14px;padding-top:10px;padding-bottom:10px}.button.button-hero.updraftclone_show_step_1 span.dashicons{height:auto}.updraftplus_clone_status{color:red}a.updraft_migrate_add_site--trigger span.dashicons{text-decoration:none}.button-restore:hover,.button-migrate:hover,.button-backup:hover,.button-view-log:hover,.button-mass-selectors:hover,.button-delete:hover,.button-entity-backup:hover,.udp-button-primary:hover{border-color:#df6926;color:#df6926}.button-migrate{color:#eea920;border-color:#eea920}#updraft_migrate_tab_main{padding:8px}.updraft_migrate_widget_module_content{background:#FFF;border-radius:0;position:relative}body.js #updraft_migrate .updraft_migrate_widget_module_content{display:none}.updraft_migrate_widget_module_content>h3,div[class*="updraft_migrate_widget_temporary_clone_stage"]>h3{margin-top:0}.updraft_migrate_widget_module_content header,#updraft_migrate_tab_alt header{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;justify-items:center;margin-top:-18px;margin-left:-18px;margin-right:-18px;margin-bottom:15px;border-bottom:1px solid #CCC}.updraft_migrate_widget_module_content header h3,.updraft_migrate_widget_module_content header button.button.close,#updraft_migrate_tab_alt header h3,#updraft_migrate_tab_alt header button.button.close{padding:10px;line-height:20px;height:auto;margin:0}.updraft_migrate_widget_module_content button.button.close,#updraft_migrate_tab_alt button.button.close{text-decoration:none;padding-left:5px;border-right:1px solid #CCC}.updraft_migrate_widget_module_content button.button.close .dashicons,#updraft_migrate_tab_alt button.button.close .dashicons{margin-top:1px}.updraft_migrate_widget_module_content header h3,#updraft_migrate_tab_alt header h3{margin:0}.updraft_migrate_intro button.button.button-primary.button-hero{max-width:235px;word-wrap:normal;white-space:normal;line-height:1;height:auto;padding-top:13px;padding-bottom:13px;text-align:left;position:relative;margin-right:10px;margin-bottom:10px}.updraft_migrate_intro button.button.button-primary.button-hero .dashicons{position:absolute;left:10px;top:calc(50% - 8px)}#updraft_migrate_tab_alt #updraft_migrate_send_existing_button{margin-right:6px}#updraft_migrate .ui-widget-content a{color:#1c94c4}#updraft-wrap .ui-accordion .ui-accordion-header{background:#f6f6f6;margin:0;border-radius:0;padding-left:.5em;padding-right:.7em}#updraft-wrap .ui-widget{font-family:inherit}.ui-accordion-header .ui-accordion-header-icon.ui-icon-caret-1-w{background-position:-96px 0}.ui-accordion-header .ui-accordion-header-icon.ui-icon-caret-1-s{background-position:-64px 0}#updraft-wrap .ui-accordion .ui-accordion-header .ui-accordion-header-icon{left:auto;right:5px}#updraft-wrap .ui-accordion .ui-accordion-header:focus{outline:0;-webkit-box-shadow:0 0 0 1px rgba(91,157,217,0.22),0 0 2px 1px rgba(30,140,190,0.3);box-shadow:0 0 0 1px rgba(91,157,217,0.22),0 0 2px 1px rgba(30,140,190,0.3);background:#FFF}#updraft-wrap .ui-accordion .ui-accordion-header:focus .dashicons{color:#0572aa;opacity:1}#updraft-wrap .ui-accordion .ui-accordion-header.ui-state-active{background:#f6f6f6;border-bottom:2px solid #0572aa;-webkit-box-shadow:1px 6px 12px -5px rgba(0,0,0,0.3);box-shadow:1px 6px 12px -5px rgba(0,0,0,0.3)}#updraft-wrap .ui-accordion .ui-accordion-header.ui-state-active:focus{-webkit-box-shadow:1px 6px 12px -5px rgba(0,0,0,0.3),0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:1px 6px 12px -5px rgba(0,0,0,0.3),0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}#updraft-wrap .ui-accordion .ui-accordion-header:not(:first-child){border-top:0}#updraft-wrap .ui-accordion .ui-accordion-header .dashicons{opacity:.4;margin-right:10px}#updraft-wrap .ui-accordion .ui-accordion-header:focus{outline:0;-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);z-index:1}button.ui-dialog-titlebar-close:before{content:none !important}.updraft_next_scheduled_backups_wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;background:#FFF;justify-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.updraft_next_scheduled_backups_wrapper>div{width:50%;background:#FFF;height:auto;padding:33px;-webkit-box-sizing:border-box;box-sizing:border-box}.updraft_backup_btn_wrapper{text-align:center;border-left:1px solid #f1f1f1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.incremental-backups-only{display:none}.incremental-free-only{display:none}.incremental-free-only p{padding:5px;background:rgba(255,0,0,0.06);border:1px solid #bfbfbf}#updraft-delete-waitwarning span.spinner{visibility:visible;float:none;margin:0;margin-right:10px}button#updraft-backupnow-button .spinner,button#updraft-backupnow-button .dashicons-yes{display:none}button#updraft-backupnow-button.loading .spinner{display:inline-block;visibility:visible;margin-top:13px;margin-right:0}button#updraft-backupnow-button.loading{background-color:#efefef;border-color:#CCC;text-shadow:0 -1px 1px #bbc3c7,1px 0 1px #bbc3c7,0 1px 1px #bbc3c7,-1px 0 1px #bbc3c7;-webkit-box-shadow:none;box-shadow:none}button#updraft-backupnow-button.finished .dashicons-yes{display:inline-block;visibility:visible;font-size:42px;margin-right:0;margin-top:2px}.updraft_next_scheduled_entity{width:50%;display:inline-block;float:left}.updraft_next_scheduled_entity .dashicons{color:#CCC;font-size:20px}.updraft_next_scheduled_entity strong{font-size:20px}.updraft_next_scheduled_heading{margin-bottom:10px}.updraft_next_scheduled_date_time{color:#46a84b}.updraft_time_now_wrapper{margin-top:68px;width:100%}.updraft_time_now_label,.updraft_time_now{display:inline-block;padding:7px}.updraft_time_now_label{background:#b7b7b7;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#FFF;margin-right:0;text-shadow:0 1px 2px rgba(0,0,0,0.4)}.updraft_time_now{background:#f1f1f1;border-top-right-radius:4px;border-bottom-right-radius:4px;margin-left:-3px}#updraft_lastlogmessagerow{margin:6px 0}#updraft_lastlogmessagerow{clear:both;padding:.25px 0}#updraft_lastlogmessagerow .updraft-log-link{float:right;margin-top:-2.5em;margin-right:2px}#updraft_lastlogmessagerow>div{clear:both;background:#FFF;padding:18px}#updraft_activejobs_table{overflow:hidden;width:100%;background:#fafafa;padding:0}.updraft_requeststart{padding:15px 33px;text-align:center}.updraft_requeststart .spinner{visibility:visible;float:none;vertical-align:middle;margin-top:-2px}a.updraft_jobinfo_delete.disabled{opacity:.4;color:inherit;text-decoration:none}.updraft_row{clear:both;-webkit-transition:.3s all;transition:.3s all;padding:15px 33px}.updraft_row.deleting{opacity:.4}.updraft_existing_backups_count{padding:2px 8px;font-size:12px;background:#ca4a1e;color:#FFF;font-weight:bold;border-radius:10px}.form-table .existing-backups-table input[type="checkbox"]{border-radius:0}.form-table .existing-backups-table .check-column{width:40px;padding:0;padding-top:8px}.existing-backups-buttons{font-size:11px;line-height:1.4em;border-width:3px}.existing-backups-restore-buttons{font-size:11px;line-height:1.4em;border-width:3px}.button-delete{color:#e23900;border-color:#e23900;font-size:14px;line-height:1.4em;border-width:2px;margin-right:10px}.button-view-log,.button-mass-selectors{color:darkgrey;border-color:darkgrey;font-size:14px;line-height:1.4em;border-width:2px;margin-top:-1px}.button-view-log{width:120px}.button-existing-restore{font-size:14px;line-height:1.4em;border-width:2px;width:110px}.main-restore{margin-right:3%;margin-left:3%}.button-entity-backup{color:#555;border-color:#555;font-size:11px;line-height:1.4em;border-width:2px;margin-right:5px}.button-select-all{width:122px}.button-deselect{width:92px}#ud_massactions>.display-flex>.mass-selectors-margins,#updraft-delete-waitwarning>.display-flex>.mass-selectors-margins{margin-right:-4px}.udp-button-primary{border-width:4px;color:#0073aa;border-color:#0073aa;font-size:14px;height:40px}#ud_massactions .button-delete{margin-right:0}.stored_local{border-radius:5px;background-color:#007fe7;padding:3px 5px 5px 5px;color:#FFF;font-size:75%}span#updraft_lastlogcontainer{word-break:break-all}.stored_icon{height:1.3em;position:relative;top:.2em}.backup_date_label>*{vertical-align:middle}.backup_date_label .dashicons{font-size:18px}.backup_date_label .clear-right{clear:right}.existing-backups-table .backup_date_label>div,.existing-backups-table .backup_date_label span>div{font-weight:bold}.udp-logo-70{width:70px;height:70px;float:left;padding-right:25px}h3 .thank-you{margin-top:0}.ws_advert{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.dismiss-dash-notice{float:right;position:relative;top:-20px}.updraft_exclude_container,.updraft_include_container{margin-left:24px;margin-top:5px;margin-bottom:10px;padding:15px;border:1px solid #DDD}label.updraft-exclude-label{font-weight:500;margin-bottom:5px;display:inline-block}.updraft_add_exclude_item,#updraft_include_more_paths_another{display:inline-block;margin-top:10px}input.updraft_exclude_entity_field,.form-table td input.updraft_exclude_entity_field,.updraftplus-morefiles-row input[type=text]{width:calc(100% - 70px);max-width:400px}.updraft-fs-italic{font-style:italic}@media screen and (max-width:782px){.form-table td input.updraft_exclude_entity_field,.form-table td .updraftplus-morefiles-row input[type=text]{display:inline-block}}.updraft_exclude_entity_delete.dashicons,.updraft_exclude_entity_edit.dashicons,.updraft_exclude_entity_update.dashicons,.updraftplus-morefiles-row a.dashicons{margin-top:2px;font-size:20px;-webkit-box-shadow:none;box-shadow:none;line-height:1;padding:3px;margin-right:4px}.updraft_exclude_entity_delete,.updraft_exclude_entity_delete:hover,.updraftplus-morefiles-row-delete{color:#ff6347}.updraft_exclude_entity_update.dashicons,.updraft_exclude_entity_update.dashicons:hover{color:#008000;font-weight:bold;font-size:22px;margin-left:4px}.updraft_exclude_entity_edit{margin-left:4px}.updraft_exclude_entity_update.is-active ~ .updraft_exclude_entity_delete{display:none}.updraft-exclude-panel-heading{margin-bottom:8px}.updraft-exclude-panel-heading h3{margin:.5em 0 .5em 0}.updraft-exclude-submit.button-primary{margin-top:5px}.updraft_exclude_actions_list{font-weight:bold}.updraft-exclude-link{cursor:pointer}#updraft_include_more_options{padding-left:25px}#updraft_report_cell .updraft_reportbox,.updraft_small_box{padding:12px;margin:8px 0;border:1px solid #CCC;position:relative}#updraft_report_cell button.updraft_reportbox_delete,.updraft_box_delete_button,.updraft_small_box .updraft_box_delete_button{padding:4px;padding-top:6px;border:0;background:transparent;position:absolute;top:4px;right:4px;cursor:pointer}#updraft_report_cell button.updraft_reportbox_delete:hover{color:#de3c3c}a.updraft_report_another .dashicons{text-decoration:none;margin-top:2px}.updraft_report_dbbackup.updraft_report_disabled{color:#CCC}#updraft-navtab-settings-content .updraft-test-button{font-size:18px !important}#updraft_report_cell .updraft_report_email{display:block;width:calc(100% - 50px);margin-bottom:9px}#updraft_report_cell .updraft_report_another_p{clear:left}#updraft-navtab-settings-content table.form-table p{max-width:700px}#updraft-navtab-settings-content table.form-table .notice p{max-width:none}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected,#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected td{background-color:#efefef}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected:nth-child(even) td{background-color:#e8e8e8}.updraft_settings_sectionheading{display:none}.updraft-backupentitybutton-disabled{background-color:transparent;border:0;color:#0074a2;text-decoration:underline;cursor:pointer;clear:none;float:left}.updraft-backupentitybutton{margin-left:8px}.updraft-bigbutton{padding:2px 0 !important;margin-right:14px !important;font-size:22px !important;min-height:32px;min-width:180px}tr[class*="_updraft_remote_storage_border"]{border-top:1px solid #CCC}.updraft_multi_storage_options{float:right;clear:right;margin-bottom:5px !important}.updraft_toggle_instance_label{vertical-align:top !important}.updraft_debugrow th{float:right;text-align:right;font-weight:bold;padding-right:8px;min-width:140px}.updraft_debugrow td{min-width:300px;vertical-align:bottom}.updraft_webdav_host_error,.onedrive_folder_error{color:red}label[for=updraft_servicecheckbox_updraftvault]{position:relative}#updraft-wrap .udp-info{position:absolute;right:10px;top:calc(50% - 10px)}#updraft-wrap span.info-trigger{display:inline-block;width:20px;height:20px;background:#FFF;color:#72777c;border-radius:30px;text-align:center;line-height:20px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.15);box-shadow:0 1px 3px rgba(0,0,0,0.15)}#updraft-wrap .info-content-wrapper{display:none;position:absolute;bottom:20px;-webkit-transform:translatex(calc(-50% + 10px));transform:translatex(calc(-50% + 10px));width:330px;padding-bottom:10px}#updraft-wrap .info-content-wrapper::before{content:'';position:absolute;bottom:-10px;border:10px solid transparent;border-top-color:#FFF;left:calc(50% - 10px)}#updraft-wrap .info-content{padding:20px;background:#FFF;border-radius:4px;-webkit-box-shadow:0 3px 10px rgba(0,0,0,0.1);box-shadow:0 3px 10px rgba(0,0,0,0.1);color:#72777c}#updraft-wrap .info-content h3{margin-top:0}#updraft-wrap .info-content p{margin-top:10px}#updraft-wrap .udp-info:hover .info-content-wrapper{display:block}div.conditional_remote_backup select.logic_type{vertical-align:inherit !important}div.conditional_remote_backup label.updraft_toggle_instance_label.radio_group{display:block;margin-top:7px}div.conditional_remote_backup div.logic ul.rules input.rule_value{vertical-align:middle}div.conditional_remote_backup p{margin-bottom:10px}div.conditional_remote_backup div.logic ul.rules span svg{width:20px;vertical-align:middle;cursor:pointer}div.conditional_remote_backup div.logic ul.rules span svg{margin-left:3px}div.conditional_remote_backup div.logic select.logic_type{vertical-align:unset}.updraft_jstree .jstree-container-ul>.jstree-node,div[id^="updraft_more_files_jstree_"] .jstree-container-ul>.jstree-node{background:transparent}.updraft_jstree .jstree-container-ul>.jstree-open>.jstree-ocl,div[id^="updraft_more_files_jstree_"] .jstree-container-ul>.jstree-open>.jstree-ocl{background-position:-36px -4px}.updraft_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl,div[id^="updraft_more_files_jstree_"] .jstree-container-ul>.jstree-closed>.jstree-ocl{background-position:-4px -4px}.updraft_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl,div[id^="updraft_more_files_jstree_"] .jstree-container-ul>.jstree-leaf>.jstree-ocl{background:transparent}#updraft_zip_files_container{position:relative;height:450px;overflow:none}.updraft_jstree_info_container{position:relative;height:auto;width:100%;border:1px dotted;margin-bottom:5px}.updraft_jstree_info_container p{margin:1px;padding-left:10px;font-size:14px}#updraft_zip_download_item{display:none;color:#0073aa;padding-left:10px}#updraft_zip_download_notice{padding-left:10px}#updraft_exclude_files_folders_jstree,#updraft_exclude_files_folders_wildcards_jstree{max-height:200px;overflow-y:scroll}.updraft_jstree{position:relative;border:1px dotted;height:80%;width:100%;overflow:auto}div[id^="updraft_more_files_container_"]{position:relative;display:none;width:100%;border:1px solid #CCC;background:#fafafa;margin-bottom:5px;margin-top:4px;-webkit-box-shadow:0 5px 8px rgba(0,0,0,0.1);box-shadow:0 5px 8px rgba(0,0,0,0.1)}div[id^="updraft_more_files_container_"]::before{content:' ';width:11px;height:11px;display:block;background:#fafafa;position:absolute;top:0;left:20px;border-top:1px solid #CCC;border-left:1px solid #CCC;-webkit-transform:translatey(-7px) rotate(45deg);transform:translatey(-7px) rotate(45deg)}input.updraft_more_path_editing{border-color:#0285ba}input.updraft_more_path_editing ~ a.dashicons{display:none}div[id^="updraft_jstree_buttons_"]{padding:10px;background:#e6e6e6}div[id^="updraft_jstree_container_"]{height:300px;width:100%;overflow:auto}div[id^="updraft_more_files_container_"] button{line-height:20px}button[id^="updraft_parent_directory_"]{margin:10px 10px 4px 10px;padding-left:3px}button[id^="updraft_jstree_confirm_"],button[id^="updraft_jstree_cancel_"]{display:none}input[id^="updraft_include_more_path_restore_"]{text-align:right}.updraftplus-morefiles-row-delete,.updraftplus-morefiles-row-edit{cursor:pointer}#updraft_include_more_paths_error{color:#de3c3c}p[id^="updraftplus_manual_authentication_error_"]{color:#de3c3c}#updraft-wrap .form-table th{width:230px}#updraft-wrap .form-table .existing-backups-table th{width:auto}.updraft-viewlogdiv form{margin:0;padding:0}.updraft-viewlogdiv{display:inline-block}.updraft-viewlogdiv input,.updraft-viewlogdiv a{border:0;background-color:transparent;color:#000;margin:0;padding:3px 4px;font-size:16px;line-height:26px}.updraft-viewlogdiv input:hover,.updraft-viewlogdiv a:hover{color:#FFF;cursor:pointer}.button.button-remove{color:white;background-color:#de3c3c;border-color:#c00000;-webkit-box-shadow:0 1px 0 #c10100;box-shadow:0 1px 0 #c10100}.button.button-remove:hover,.button.button-remove:focus{border-color:#C00;color:#FFF;background:#C00}body.admin-color-midnight .button.button-remove{color:#de3c3c;background-color:#f7f7f7;border-color:#CCC;-webkit-box-shadow:0 1px 0 #CCC;box-shadow:0 1px 0 #CCC}body.admin-color-midnight .button.button-remove:hover,body.admin-color-midnight .button.button-remove:focus{border-color:#ba281f}body.admin-color-midnight .button.button-remove:focus{-webkit-box-shadow:inherit;box-shadow:inherit;-webkit-box-shadow:0 0 3px rgba(0,115,170,0.8);box-shadow:0 0 3px rgba(0,115,170,0.8)}.drag-drop #drag-drop-area2{border:4px dashed #DDD;height:200px}#drag-drop-area2 .drag-drop-inside{margin:36px auto 0;width:350px}#filelist,#filelist2{margin-top:30px;width:100%}#filelist .file,#filelist2 .file,.ud_downloadstatus .file,#ud_downloadstatus2 .file,#ud_downloadstatus3 .file{padding:1px;background:#ececec;border:solid 1px #CCC;margin:4px 0}.updraft_premium section{margin-bottom:20px}.updraft_premium_cta{background:#FFF;margin-top:30px;padding:0;border-left:4px solid #db6a03}.updraft_premium_cta a{font-weight:normal}.updraft_premium_cta__action{position:relative;text-align:center}.updraft_premium_cta a.button.button-primary.button-hero{font-size:1.3em;letter-spacing:.03rem;text-transform:uppercase;margin-bottom:7px}.updraft_premium_cta a.button.button-primary.button-hero+small{display:block;max-width:100%;text-align:center;color:#afafaf}.updraft_premium_cta a.button.button-primary.button-hero+small .dashicons{width:12px;height:12px}.updraft_premium_cta__top{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:18px 30px}.updraft_premium_cta__bottom{background:#f9f9f9;padding:5px 30px}.updraft_premium_cta__summary{margin-right:60px}.updraft_premium_cta h2{font-size:28px;font-weight:200;line-height:1;margin:0;margin-bottom:5px;letter-spacing:.05rem;color:#db6a03}.updraft_premium_cta ul li::after{color:#CCC}@media only screen and (max-width:768px){.updraft_premium_cta__top{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.updraft_premium_cta__summary{margin-right:0;margin-bottom:30px}}.udp-box{background:#FFF;padding:20px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.1);box-shadow:0 1px 2px rgba(0,0,0,0.1);text-align:center}.udp-box h3{margin:0}.udp-box__heading{-ms-flex-item-align:center;align-self:center;background:0;-webkit-box-shadow:none;box-shadow:none}.updraft-more-plugins{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;flex-wrap:wrap}.updraft-more-plugins img{max-width:80%;max-height:30%;display:inline-block}.updraft-more-plugins .udp-box{-webkit-box-sizing:border-box;box-sizing:border-box;width:24%}.updraft-more-plugins .udp-box p:last-child{margin-bottom:0;padding-bottom:0}.updraft_premium_description_list{text-align:left;margin:0;font-size:12px}ul.updraft_premium_description_list,ul#updraft_restore_warnings{list-style:disc inside}ul.updraft_premium_description_list li{display:inline}ul.updraft_premium_description_list li::after{content:" | "}ul.updraft_premium_description_list li:last-child::after{content:""}.updraft_feature_cell{background-color:#f7d9c9 !important;padding:5px 10px}.updraftplus_com_login_status,.updraftplus_com_key_status{display:none;background:#FFF;border-left:4px solid #FFF;border-left-color:#dc3232;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 15px 0;padding:5px 12px}.updraftplus_com_login_status.success{border-left-color:green}#updraft-wrap strong.success{color:green}.updraft_feat_table{border:0;border-collapse:collapse;font-size:120%;background-color:white;text-align:center}.updraft_feat_th,.updraft_feat_table td{border:1px solid #f1f1f1;border-collapse:collapse;font-size:120%;background-color:white;text-align:center;padding:15px}.updraft_feat_table td{border-bottom-width:4px}.updraft_feat_table td:first-child{border-left:0}.updraft_feat_table td:last-child{border-right:0}.updraft_feat_table tr:last-child td{border-bottom:0}.updraft_feat_table td:nth-child(2),.updraft_feat_table td:nth-child(3){background-color:rgba(241,241,241,0.38);width:190px}.updraft_feat_table__header td img{display:block;margin:0 auto}.updraft_feat_table__header td{text-align:center}.updraft_feat_table .installed{font-size:14px}.updraft_feat_table p{padding:0 10px;margin:5px 0;font-size:13px}.updraft_feat_table h4{margin:5px 0}.updraft_feat_table .dashicons{width:25px;height:25px;font-size:25px;line-height:1}.updraft_feat_table .dashicons-yes,.updraft_feat_table .updraft-yes{color:green}.updraft_feat_table .dashicons-no-alt,.updraft_feat_table .updraft-no{color:red}.updraft_tick_cell{text-align:center}.updraft_tick_cell img{margin:4px 0;height:24px}.ud_downloadstatus__close{border:0;background:transparent;width:auto;font-size:20px;padding:0;cursor:pointer}#filelist .fileprogress,#filelist2 .fileprogress,.ud_downloadstatus .dlfileprogress,#ud_downloadstatus2 .dlfileprogress,#ud_downloadstatus3 .dlfileprogress{width:0;background:#0572aa;height:8px;-webkit-transition:width .3s;transition:width .3s}.ud_downloadstatus .raw,#ud_downloadstatus2 .raw,#ud_downloadstatus3 .raw{margin-top:8px;clear:left}.ud_downloadstatus .file,#ud_downloadstatus2 .file,#ud_downloadstatus3 .file{margin-top:8px}div[class^="updraftplus_downloader_container_"]{padding:10px}tr.updraftplusmethod h3{margin:0}tr.updraftplusmethod img{max-width:100%}#updraft_retain_db_rules .updraft_retain_rules_delete,#updraft_retain_files_rules .updraft_retain_rules_delete{cursor:pointer;color:red;font-size:120%;font-weight:bold;border:0;border-radius:3px;padding:2px;margin:0 6px;text-decoration:none;display:inline-block}#updraft_retain_db_rules .updraft_retain_rules_delete:hover,#updraft_retain_files_rules .updraft_retain_rules_delete:hover{cursor:pointer;color:white;background:red}#updraft_backup_started{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.blockUI.blockOverlay.ui-widget-overlay{background:#000}.updraft_success_popup{text-align:center;padding-bottom:30px}.updraft_success_popup>.dashicons{font-size:100px;width:100px;height:100px;line-height:100px;padding:0;border-radius:50%;margin-top:30px;display:block;margin-left:auto;margin-right:auto;background:#e2e6e5}.updraft_success_popup>.dashicons.dashicons-yes{text-indent:-5px}.updraft_success_popup.success>.dashicons{color:green}.updraft_success_popup.warning>.dashicons{color:#888}.updraft_success_popup--message{padding:20px}.button.updraft-close-overlay .dashicons{text-decoration:none;font-size:20px;margin-left:-5px;padding:0;-webkit-transform:translatey(3px);transform:translatey(3px)}.updraft_saving_popup img{-webkit-animation-name:udp_blink;animation-name:udp_blink;-webkit-animation-duration:610ms;animation-duration:610ms;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-direction:alternate;animation-direction:alternate;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}.udp-premium-image{display:none}@media screen and (min-width:720px){.udp-premium-image{display:block;float:left;padding-right:5px}}#plupload-upload-ui2{width:80%}.backup-restored{padding:8px}.updated.backup-restored{padding-top:15px;padding-bottom:15px}.backup-restored span{font-size:120%}.memory-limit{padding:8px}.updraft_list_errors{padding:8px}.nav-tab-wrapper{margin:14px 0}#updraft-poplog-content{white-space:pre-wrap}.next-backup{border:0;padding:0;margin:0 10px 0 0}.not-scheduled{vertical-align:top !important;margin:0 !important;padding:0 !important}.next-backup .updraft_scheduled{margin:0;padding:2px 4px 2px 0}#next-backup-table-inner td{vertical-align:top}.updraft_all-files{color:blue}.multisite-advert-width{width:800px}.updraft_settings_sectionheading{margin-top:6px}section.premium-upgrade-purchase-success{padding:2em;background:#fafafa;text-align:center;-webkit-box-shadow:0 14px 40px rgba(0,0,0,0.1);box-shadow:0 14px 40px rgba(0,0,0,0.1)}section.premium-upgrade-purchase-success h3{font-size:2em;color:green}section.premium-upgrade-purchase-success h3 .dashicons{display:block;margin:0 auto;font-size:60px;width:60px;height:60px;border-radius:50%;background:green;color:#FFF;margin-bottom:20px}section.premium-upgrade-purchase-success h3 .dashicons::before{display:inline-block;margin-left:-4px;margin-top:2px}section.premium-upgrade-purchase-success p{font-size:120%}.show_admin_restore_in_progress_notice{padding:8px}.show_admin_restore_in_progress_notice .unfinished-restoration{font-size:120%}#backupnow_includefiles_moreoptions,#backupnow_database_moreoptions,#backupnow_includecloud_moreoptions{margin:4px 16px 6px 16px;border:1px dotted;padding:6px 10px}#backupnow_database_moreoptions{max-height:250px;overflow:auto}#backupnow_database_moreoptions div.backupnow-db-tables{margin-bottom:5px}#backupnow_database_moreoptions div.backupnow-db-tables>a{color:#0073aa}.form-table #updraft_activejobsrow .minimum-height{min-height:100px}#updraft_activejobsrow th{max-width:112px;margin:0;padding:13px 0 0 0}#updraft_lastlogmessagerow .last-message{padding-top:20px;display:block}.updraft_simplepie{vertical-align:top}.download-backups{margin-top:8px}.download-backups .updraft_download_button{margin-right:6px}.download-backups .ud-whitespace-warning,.download-backups .ud-bom-warning{background-color:pink;padding:8px;margin:4px;border:1px dotted}.download-backups .ul{list-style:none inside;max-width:800px;margin-top:6px;margin-bottom:12px}#updraft-plupload-modal{margin:16px 0}.download-backups .upload{max-width:610px}.download-backups #plupload-upload-ui{width:100%}.ud_downloadstatus{padding:10px 0}#ud_massactions,#updraft-delete-waitwarning{padding:14px;background:#f1f1f1;position:absolute;left:0;top:100%}#ud_massactions>*,#updraft-delete-waitwarning>*{vertical-align:middle}#ud_massactions .updraftplus-remove{display:inline-block;margin-right:0}#ud_massactions .updraftplus-remove a{text-decoration:none}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative}small.ud_massactions-tip{display:inline-block;opacity:.5;font-style:italic;margin-left:20px}#updraft-navtab-backups-content .updraft_existing_backups{margin-bottom:35px;position:relative}#updraft-message-modal-innards{padding:4px}#updraft-authenticate-modal{text-align:center;font-size:16px !important}#updraft-authenticate-modal p{font-size:16px}div.ui-dialog.ui-widget.ui-widget-content{z-index:99999 !important}#updraft_delete_form p{margin-top:3px;padding-top:0}#updraft_restore_form .cannot-restore{margin:8px 0}.notice.updraft-restore-option{padding:12px;margin:8px 0 4px 0;border-left-color:#CCC}#updraft_restorer_dboptions h4{margin:0 0 6px 0;padding:0}.updraftplus_restore_tables_options_container{max-height:250px;overflow:auto}.updraft_debugrow th{vertical-align:top;padding-top:6px;max-width:140px}.expertmode p{font-size:125%}.expertmode .call-wp-action{width:300px;height:22px}.updraftplus-lock-advert{clear:left;max-width:600px}.uncompressed-data{clear:left;max-width:600px}.delete-old-directories{padding:8px;padding-bottom:12px}.active-jobs{width:100%;text-align:center;padding:33px}.job-id{margin-top:0;margin-bottom:8px}.next-resumption{font-weight:bold}.updraft_percentage{z-index:-1;position:absolute;left:0;top:0;text-align:center;background-color:#1d8ec2;-webkit-transition:width .3s;transition:width .3s}.curstage{z-index:1;border-radius:2px;margin-top:8px;width:100%;height:26px;line-height:26px;position:relative;text-align:center;font-style:italic;color:#FFF;background-color:#b7b7b7;text-shadow:0 1px 2px rgba(0,0,0,0.3)}.curstage-info{display:inline-block;z-index:2}.retain-files{width:48px}.backup-interval-description tr td div{max-width:670px}#updraft-manualdecrypt-modal{width:85%;margin:6px;margin-left:100px}.directory-permissions{font-size:110%;font-weight:bold}.double-warning{border:1px solid;padding:6px}.raw-backup-info{font-style:italic;font-weight:bold;font-size:120%}.updraft_existingbackup_date{width:22%;max-width:140px}.updraft_existing_backups_wrapper{margin-top:20px;border-top:1px solid #DDD}.updraft-no-backups-msg{padding:10px 40px;text-align:center;font-style:italic}.tr-bottom-4{margin-bottom:4px}.existing-backups-table th{padding:8px 10px}.form-table .backup-date{width:172px}.form-table .backup-data{width:426px}.form-table .updraft_backup_actions{width:272px}.existing-date{-webkit-box-sizing:border-box;box-sizing:border-box;max-width:140px;width:25%}.line-break-tr{height:2px;padding:1px;margin:0}.line-break-td{margin:0;padding:0}.td-line-color{height:2px;background-color:#888}.raw-backup{max-width:140px}.existing-backups-actions{padding:1px;margin:0}.existing-backups-border{height:2px;padding:1px;margin:0}.existing-backups-border>td{margin:0;padding:0}.existing-backups-border>div{height:2px;background-color:#AAA}.updraft_existing_backup_date{max-width:140px}.updraftplus-upload{margin-right:6px;float:left;clear:none}.before-restore-button{padding:1px;margin:0}.before-restore-button div{float:none;display:inline-block}.table-separator-tr{height:2px;padding:1px;margin:0}.table-separator-td{margin:0;padding:0}.end-of-table-div{height:2px;background-color:#AAA}.last-backup-job{padding-top:3% !important}.line-height-03{line-height:.3 !important}.line-height-13{line-height:1.3 !important}.line-height-23{line-height:2.3 !important}#updraft_diskspaceused{color:#df6926}#updraft_delete_old_dirs_pagediv{padding-bottom:10px}.fix-time{width:70px}.retain-files{width:70px}.number-input{min-width:50px;max-width:70px}.additional-rule-width{min-width:60px;max-width:70px}#updraft-wrap .dashicons.dashicons-adapt-size{line-height:inherit;font-size:inherit}#updraft-wrap .button span.dashicons:not(.dashicons-adapt-size){vertical-align:middle;margin-top:-3px}.addon-logo-150{margin-left:30px;margin-top:33px;height:125px;width:150px}.margin-bottom-50{margin-bottom:50px}.premium-container{width:80%}.main-header{background-color:#df6926;height:200px;width:100%}.button-add-to-cart{color:white;border-color:white;float:none;margin-right:17px}.button-add-to-cart:hover,.button-add-to-cart:focus,.button-add-to-cart:active{border-color:#a0a5aa;color:#a0a5aa}.addon-title{margin-top:25px}.addon-text{margin-top:75px}.image-main-div{width:25%;float:left}.text-main-div{width:60%;float:left;text-align:center;color:white;margin-top:16px}.text-main-div-title{font-weight:bold !important;color:white;text-align:center}.text-main-div-paragraph{color:white}.updraftplus-vault-cta{width:100%;text-align:center;margin-bottom:50px}.updraftplus-vault-cta h1{font-weight:bold}.updraftvault-buy{width:225px;height:225px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:50px;position:relative}.updraftplus-vault-cta>.vault-options>.center-vault{width:275px;height:275px}.updraftplus-vault-cta>.vault-options>.center-vault>a{right:21%;font-size:16px;border-width:4px !important}.updraftplus-vault-cta>.vault-options>.center-vault>p{font-size:16px}.updraftvault-buy .button-purchase{right:24%;margin-left:0;line-height:1.7em}.updraftvault-buy hr{height:2px;background-color:#777;margin-top:18px}.right{margin-right:0}.updraftvault-buy .addon-logo-100{height:100px;width:125px;margin-top:7px}.updraftvault-buy .addon-logo-large{margin-top:7px}.updraftvault-buy .button-buy-vault{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:29%;bottom:2%}.premium-addon-div .button-purchase{line-height:1.7em}.updraftvault-buy .button-buy-vault:hover{border-color:darkgrey;color:darkgrey}.premium-addons{margin-top:80px;width:100%;margin:0 auto;display:table}.addon-list{display:table;text-align:center}.premium-addons h1{text-align:center;font-weight:bold}.premium-addons p{text-align:center}.premium-addons .premium-addon-div{width:200px;height:250px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:25px;margin-top:25px;text-align:center;position:relative}.premium-addons .premium-addon-div p{margin-left:2px;margin-right:2px}.premium-addons .premium-addon-div img{width:auto;height:50px;margin-top:7px}.premium-addons .premium-addon-div .hr-alignment{margin-top:44px}.premium-addons .premium-addon-div .dropbox-logo{height:39px;width:150px}.premium-addons .premium-addon-div .azure-logo,.premium-addons .premium-addon-div .onedrive-logo{width:75%;height:24px}.button-purchase{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:25%;bottom:2%}.button-purchase:hover{color:darkgrey;border-color:darkgrey}.premium-addons .premium-addon-div hr{height:2px;background-color:#777;margin-top:18px}.premium-addon-div p{font-style:italic}.addon-list>.premium-addon-div>.onedrive-fix,.addon-list>.premium-addon-div>.azure-logo{margin-top:33px}.addon-list>.premium-addon-div>.dropbox-fix{margin-top:18px}.premium-forgotton-something{margin-top:5%}.premium-forgotton-something h1{text-align:center;font-weight:bold}.premium-forgotton-something p{text-align:center;font-weight:normal}.premium-forgotton-something .button-faq{color:#df6926;border-color:#df6926;margin:0 auto;display:table}.premium-forgotton-something .button-faq:hover{color:#777;border-color:#777}.updraftplusmethod.updraftvault #vaultlogo{padding-left:40px}.updraftplusmethod.updraftvault .vault_primary_option{float:left;width:50%;text-align:center;padding-bottom:20px}.updraftplusmethod.updraftvault .vault_primary_option div{clear:right;padding-top:20px}.updraftplusmethod.updraftvault .clear-left{clear:left}.updraftplusmethod.updraftvault .padding-top-20px{padding-top:20px}.updraftplusmethod.updraftvault .padding-top-14px{padding-top:14px}.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary,.updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary{font-size:18px !important}.updraftplusmethod.updraftvault #updraftvault_showoptions,.updraftplusmethod.updraftvault #updraftvault_connect{margin-top:8px}.updraftplusmethod.updraftvault #updraftvault_settings_connect input{margin-right:10px}.updraftplusmethod.updraftvault #updraftvault_email{width:280px}.updraftplusmethod.updraftvault #updraftvault_pass{width:200px}.updraftplusmethod.updraftvault #vault-is-connected{margin:0;padding:0}.updraftplusmethod.updraftvault #updraftvault_settings_default p{clear:left}.updraftplusmethod.updraftvault .vault-purchase-option-container{text-align:center}.updraftplusmethod.updraftvault .vault-purchase-option{width:40%;text-align:center;padding-top:20px;display:inline-block}.updraftplusmethod.updraftvault .vault-purchase-option-size{font-size:200%;font-weight:bold}.updraftplusmethod.updraftvault .vault-purchase-option-link{clear:both;font-size:150%}.updraftplusmethod.updraftvault .vault-purchase-option-or{clear:both;font-size:115%;font-style:italic}.autobackup-image{clear:left;float:left;width:110px;height:110px}.autobackup-description{width:100%}.advert-description{float:left;clear:right;padding:4px 10px 8px 10px;width:70%;clear:right;vertical-align:top}.advert-btn{display:inline-block;min-width:10%;vertical-align:top;margin-bottom:8px}.advert-btn:first-of-type{margin-top:25px}.advert-btn a{display:block;cursor:pointer}a.btn-get-started{background:#FFF;border:2px solid #df6926;border-radius:4px;color:#df6926;display:inline-block;margin-left:10px !important;margin-bottom:7px !important;font-size:18px !important;line-height:20px;min-height:28px;padding:11px 10px 5px 10px;text-transform:uppercase;text-decoration:none}.circle-dblarrow{border:1px solid #df6926;border-radius:100%;display:inline-block;font-size:17px;line-height:17px;margin-left:5px;width:20px;height:20px;text-align:center}.expertmode .advanced_settings_container{height:auto;overflow:hidden}.expertmode .advanced_settings_container .advanced_settings_menu{float:none;border-bottom:1px solid #ccc}.expertmode .advanced_settings_container .advanced_settings_content{padding-top:5px;float:none;width:auto;overflow:auto}.expertmode .advanced_settings_container .advanced_settings_content h3:first-child{margin-top:5px !important}.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools{display:none}.expertmode .advanced_settings_container .advanced_settings_content .site_info{display:block}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:inline-block;cursor:pointer;padding:5px;color:#000}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text{font-size:16px}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover{background-color:#eaeaea}.expertmode .advanced_settings_container .advanced_settings_menu .active{background-color:#3498db;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_menu .active:hover{background-color:#72c5fd;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_content input#import_settings{height:auto !important}div#updraft-wrap a{cursor:pointer !important}.updraftcentral_wizard_option{width:45%;float:left;text-align:center}.updraftcentral_wizard_option label{margin-bottom:8px}#updraftcentral_keys_table{display:none}.create_key_container{border:1px solid;border-radius:4px;padding:0 0 6px 6px;margin-bottom:8px}.updraftcentral_cloud_connect{border-radius:4px;border:1px solid #000;padding:0 20px;margin-top:30px;background-color:#FFF}.updraftcentral_cloud_error{border:1px solid #000;padding:3px 10px;border-left:3px solid #F00;background-color:#FFF;margin-bottom:10px}.updraftcentral_cloud_info{border:1px solid #000;padding:3px 10px;border-left:3px solid #ef8f31;background-color:#FFF;margin-bottom:10px}.updraftplus_spinner.spinner{padding-left:25px;float:none}.updraftplus_spinner.spinner.visible{visibility:visible;width:auto}.updraftcentral_cloud_notices .updraftplus_spinner{margin-top:-5px}.updraftcentral-subheading{font-size:14px;margin-top:-10px;margin-bottom:20px}#updraftcentral_cloud_form input#email,#updraftcentral_cloud_form input#password{min-width:250px}.updraftcentral-data-consent{font-size:13px;margin-bottom:10px}.updraftcentral_cloud_wizard_image{float:left;min-width:100px;margin-right:25px}.updraftcentral_cloud_wizard{float:left}.updraftcentral_cloud_clear{clear:both}.updraftplus-settings-footer{margin-top:30px}.updraftplus-top-menu{padding:.5em}#updraft_inpage_backup #updraft_activejobs_table{background:transparent}#updraft_inpage_backup #updraft_lastlogmessagerow .updraft-log-link{float:none}#updraft_inpage_backup #updraft_activejobsrow .updraft_row{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:20px;padding-right:20px}#updraft_inpage_backup #updraft_activejobsrow .updraft_progress_container{width:100%}#updraft_inpage_backup #updraft_activejobs_table{overflow:inherit}#updraft_inpage_backup span#updraft_lastlogcontainer{padding:18px;background:#fafafa;display:block;font-size:90%;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.1);box-shadow:0 1px 2px rgba(0,0,0,0.1)}#updraft_inpage_backup div#updraft_activejobsrow{background:#fafafa;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.1);box-shadow:0 1px 2px rgba(0,0,0,0.1)}#updraft_inpage_backup #updraft_lastlogmessagerow>div{background:transparent;padding:0}#updraft_inpage_backup .last-message>strong{display:block;margin-top:13px}body.update-core-php #updraft_inpage_backup h2:nth-child(1){margin-top:1em !important}.updraft_restore_container{display:block;position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999;padding-top:30px;background:#f1f1f1;overflow:auto}.updraft-modal-is-opened .select2-container{z-index:99999}body.updraft-modal-is-opened{overflow:hidden}.updraft_restore_container h2{margin:0}.updraft_restore_container .updraftmessage{-webkit-box-sizing:border-box;box-sizing:border-box;max-width:860px;margin-left:auto;margin-right:auto}.updraft_restore_main{max-width:860px;margin:0 auto;margin-top:20px;background:#FFF;-webkit-box-shadow:0 3px 3px rgba(0,0,0,0.1);box-shadow:0 3px 3px rgba(0,0,0,0.1);position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-sizing:border-box;box-sizing:border-box}.updraft_restore_main--header{font-size:20px;font-weight:bold;text-align:center;padding-top:16px;line-height:20px;width:100%;max-width:100%;padding-right:30px;padding-left:30px;-webkit-box-sizing:border-box;box-sizing:border-box}.updraft_restore_main--activity{position:relative;width:calc(100% - 350px);-webkit-box-sizing:border-box;box-sizing:border-box}.updraft_restore_main--activity-title{padding:20px;margin:0}.show-credentials-form.updraft_restore_main .updraft_restore_main--activity-title{display:none}.updraft_restore_main--components{width:350px;padding:20px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#f8f8f8;min-height:350px}.updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output{background:#23282d;color:#e3e3e3;font-family:monospace;padding:19px;overflow:auto;position:absolute;top:60px;bottom:0;right:0;left:0}#updraftplus_ajax_restore_output form{white-space:normal;font-family:-apple-system,blinkmacsystemfont,"Segoe UI",roboto,oxygen-sans,ubuntu,cantarell,"Helvetica Neue",sans-serif}#updraftplus_ajax_restore_output .updraft_restore_errors{border:1px solid #dc3232;padding:10px 20px;white-space:normal}.updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output h2{color:#00a0d2;padding-top:10px;padding-bottom:5px}.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output{padding:20px;border-left:1px solid #EEE}.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output #message{margin-left:0;margin-right:0}.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output .form-table td,.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output .form-table th{padding-bottom:0}.updraft_restore_main.show-credentials-form .updraft_restore_main--components{opacity:.2}.updraft_restore_main.show-credentials-form div.error .restore-credential-errors--list p{margin:0;list-style-type:disc;display:list-item;list-style-position:inside}.restore-credential-errors>:first-child{margin-top:0}.restore-credential-errors>:last-child{margin-bottom:0}ul.updraft_restore_components_list li{color:#bababa;font-size:1.2em;margin-bottom:1em}ul.updraft_restore_components_list li::before{content:'\f469';font-family:dashicons;font-size:20px;vertical-align:middle;display:inline-block;margin-right:7px}ul.updraft_restore_components_list li span{vertical-align:middle}ul.updraft_restore_components_list li.done{color:green}ul.updraft_restore_components_list li.done::before{content:"\f147"}ul.updraft_restore_components_list li.active{color:inherit}ul.updraft_restore_components_list li.active::before{content:"\f463";-webkit-animation:udp_rotate 1s linear infinite;animation:udp_rotate 1s linear infinite}ul.updraft_restore_components_list li.error{color:#dc3232}ul.updraft_restore_components_list li.error::before{content:"\f335"}.updraft_restore_result{padding:10px 0;font-size:1.3em;margin-bottom:1em;vertical-align:middle;display:none}.updraft_restore_result.restore-error{color:#dc3232}.updraft_restore_result.restore-success{color:green}.updraft_restore_result .dashicons{font-size:35px;height:35px;line-height:33px;width:35px}.updraft_restore_result span{vertical-align:middle}#updraft-restore-modal{width:100%}div#updraft-restore-modal .notice{background:#f8f8f8}.updraft-restore-modal--stage .updraft--two-halves,.updraft-restore-modal--stage .updraft--one-half{padding:20px 30px}.updraft-restore-modal--header{padding:20px;padding-bottom:0;text-align:center;border-bottom:1px solid #EEE}.updraft-restore-modal--header h3{margin:0;padding:0}.updraft-restore-item{padding-bottom:4px}.updraft-restore-buttons{padding-top:10px}ul.updraft-restore--stages{display:inline-block;margin:0;height:28px}ul.updraft-restore--stages li{display:inline-block;position:relative;width:12px;height:12px;background:#d2d2d2;border-radius:20px;line-height:1;margin:0 4px;vertical-align:middle}ul.updraft-restore--stages li.active{background:#444}.updraft-restore--footer{border-top:1px solid #EEE;padding:20px;text-align:center;position:sticky;bottom:0;background:#FFF;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.updraft-restore--footer .updraft-restore--cancel{position:absolute;left:20px;top:auto}.updraft-restore--footer .updraft-restore--next-step{position:absolute;right:20px;top:auto}ul.updraft-restore--stages li span{position:absolute;width:120px;bottom:calc(100% + 14px);left:-55px;background:rgba(0,0,0,0.85882);padding:5px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;color:#FFF;text-align:center;display:none}ul.updraft-restore--stages li:hover span{display:inline-block}.updraft-restore-item input[type=checkbox]{margin-bottom:-5px}.updraft-restore-item input[type=checkbox]:checked+label{font-weight:bold}div#updraft-restore-modal .ud_downloadstatus__close{display:none}#ud_downloadstatus2:not(:empty){margin-top:15px}.dashicons.rotate{-webkit-animation:udp_rotate 1s linear infinite;animation:udp_rotate 1s linear infinite}span#updraftplus_ajax_restore_last_activity{font-size:.8rem;font-weight:normal;float:right}.updraft_restore_main--components .updated.show_admin_restore_in_progress_notice{margin:-20px -20px 20px;padding:19px}.updraft_restore_main--components .updated.show_admin_restore_in_progress_notice button{margin-right:5px}#updraft_migrate_receivingsites .updraftplus-remote-sites-selector .button-primary,.updraft_migrate_add_site .input-field input,.updraft_migrate_add_site button{vertical-align:middle}#updraft_migrate_receivingsites .text-link-menu a:not(:last-child){padding-right:10px}#updraft_migrate_receivingsites a.updraft_migrate_clear_sites span.dashicons-trash:before{font-size:17px}#updraft_migrate_receivingsites .updraft_migrate_add_site{clear:both}.rtl .advanced_tools.total_size table td{direction:ltr;text-align:right}.rtl #plupload-upload-ui2.drag-drop #drag-drop-area2{margin-bottom:20px}.rtl #updraft_lastlogmessagerow .updraft-log-link{float:left}.rtl label.updraft_checkbox>input[type=checkbox]{margin-right:-25px;margin-left:inherit}.rtl .ud_downloadstatus__close{float:left !important}.rtl #updraft_backupextradbs_another_container{float:right}.rtl input.labelauty+label{direction:ltr;position:relative;min-height:29px}.rtl input.labelauty+label>span.labelauty-checked-image,.rtl input.labelauty+label>span.labelauty-unchecked-image{right:8px;top:11px;position:absolute}.rtl .button.updraft-close-overlay .dashicons{margin-right:-5px;margin-left:inherit}.rtl label.updraft_checkbox{margin-right:26px;margin-left:inherit}.rtl #updraft-wrap .udp-info{left:10px;right:inherit}.rtl input.labelauty+label>span.labelauty-unchecked-image+span.labelauty-unchecked,.rtl input.labelauty+label>span.labelauty-checked-image+span.labelauty-checked{margin-right:7px;margin-left:inherit;padding:7px 7px 7px 26px;width:141px;text-align:right}.rtl #updraft_report_cell button.updraft_reportbox_delete,.rtl .updraft_box_delete_button,.rtl .updraft_small_box .updraft_box_delete_button{left:4px;right:inherit}#updraft_exclude_modal .clause-input-container{overflow:auto}#updraft_exclude_modal .clause-input-container select,#updraft_exclude_modal .clause-input-container input{float:left}#updraft_exclude_modal .clause-input-container .wildcards-input{margin:7px 7px 0 0}#updraft_exclude_modal .updraft-exclude-panel .contain-clause-sub-label{margin-top:10px;display:block}@media only screen and (min-width:1024px){#updraft_activejobsrow .updraft_row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}#updraft_activejobsrow .updraft_row .updraft_col{-webkit-box-flex:1;-ms-flex:auto;flex:auto}#updraft_activejobsrow .updraft_progress_container{width:calc(100% - 230px)}}@media only screen and (min-width:782px){.settings_page_updraftplus input[type=text],.settings_page_updraftplus input[type=password],.settings_page_updraftplus input[type=number]{line-height:1.42;height:27px;padding:2px 6px;color:#555}.settings_page_updraftplus input[type="number"]{height:31px}#ud_massactions.active,#updraft-delete-waitwarning.active{position:fixed;bottom:0;left:160px;right:0;top:auto;background:#FFF;z-index:3;-webkit-box-shadow:0 0 10px rgba(0,0,0,0.2);box-shadow:0 0 10px rgba(0,0,0,0.2)}.rtl #ud_massactions.active,.rtl #updraft-delete-waitwarning.active{left:0;right:160px}body.folded #ud_massactions.active,body.folded #updraft-delete-waitwarning.active{left:36px}.updraft-after-form-table{margin-left:250px}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.range-selection:not(.backuprowselected) .updraft_existingbackup_date .backup_date_label{color:#FFF}}@media only screen and (min-width:782px) and (max-width:960px){body.auto-fold #ud_massactions.active,body.auto-fold #updraft-delete-waitwarning.active{left:36px}}@media only screen and (max-width:782px){#updraft-wrap{margin-right:0}#updraft-wrap .form-table td{padding-right:0}label.updraft_checkbox{margin-bottom:8px;margin-top:8px;margin-left:36px}.updraft_retain_rules{position:relative;margin-right:0;border:1px solid #CCC;padding:5px;margin-bottom:-1px}.updraft_retain_rules_delete{position:absolute;right:0;top:5px}a[id*=updraft_retain_]{display:block;padding:15px 15px 15px 0}label.updraft_checkbox>input[type=checkbox]{margin-left:-33px}#updraft-backupnow-button{margin:0;display:block;width:100%}.updraft_next_scheduled_backups_wrapper>.updraft_backup_btn_wrapper{padding-top:0}#ud_massactions,#updraft-delete-waitwarning{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center}#ud_massactions.active{position:fixed;top:auto;bottom:0;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;-webkit-box-shadow:0 -3px 15px rgba(0,0,0,0.08);box-shadow:0 -3px 15px rgba(0,0,0,0.08);background:#FFF;z-index:3}#ud_massactions strong{display:block;margin-bottom:5px}small.ud_massactions-tip{display:block}.existing-backups-table .backup_date_label>div,.existing-backups-table .backup_date_label span>div{font-weight:normal}.existing-backups-table .backup_date_label .clear-right{display:inline-block}table.widefat.existing-backups-table{border:0;-webkit-box-shadow:none;box-shadow:none;background:transparent}.existing-backups-table thead{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;padding:0;margin:0}.existing-backups-table tr{display:block;margin-bottom:.625em;padding-bottom:16.625px;width:100%;padding:0;margin:0;margin-bottom:10px;background:#FFF;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.1);box-shadow:0 2px 3px rgba(0,0,0,0.1)}.existing-backups-table td{border-bottom:1px solid #DDD;display:block;font-size:.9em;text-align:left;width:100%;padding:10px;margin:0}.wp-list-table.existing-backups-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{content:attr(data-label);font-weight:bold;display:block;position:relative;left:auto;padding-bottom:10px;width:auto;text-align:left}.existing-backups-table td:last-child{border-bottom:0}.form-table td.updraft_existingbackup_date{width:inherit;max-width:100%}.existing-backups-table td.before-restore-button{min-height:36px}.updraft_next_scheduled_backups_wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.updraft_next_scheduled_backups_wrapper>div{width:100%}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row{position:relative}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected{background-color:#FFF;border-left:4px solid #0572aa}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row td:not(.backup-select){margin-left:50px}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row td.backup-select{width:50px !important;position:absolute;left:0;top:0;-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;z-index:1;border:0;border-right:1px solid rgba(0,0,0,0.05)}#updraft-navtab-backups-content .updraft_existing_backups input[type="checkbox"]{height:25px}.updraft_migrate_intro button.button.button-primary.button-hero{display:block;margin-right:0;width:100%;max-width:100%}.updraftclone-main-row{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.updraftclone-main-row>div{width:auto;max-width:none;margin-right:0;margin-bottom:10px}.form-table th{padding-bottom:10px}.updraft--flex{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.updraft_restore_main{-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.updraft_restore_main--components{width:100%;min-height:0}.updraft_restore_main--activity{width:100%}div#updraftplus_ajax_restore_output,.updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output{position:relative;top:0;bottom:auto}.updraft--flex>.updraft--two-halves,.updraft--flex>.updraft--one-half{width:100%}.updraft-restore-item{padding-bottom:10px;padding-top:10px}}@media screen and (max-width:600px){.updraft_next_scheduled_entity{float:none;width:100%;margin-bottom:2em}.updraft_time_now_wrapper{margin-top:0}#updraft_lastlogmessagerow h3{margin-bottom:5px}#updraft_lastlogmessagerow .updraft-log-link{display:block;float:none;margin:0;margin-bottom:10px}}@media only screen and (min-width:768px){.addon-activation-notice{left:20em}.existing-backups-table tbody tr.range-selection:hover,.existing-backups-table tbody tr.range-selection{background:#0572aa}.existing-backups-table tbody tr:hover{background:#f1f1f1}.existing-backups-table tbody tr td.before-restore-button{position:relative}.form-table .existing-backups-table thead th.check-column{padding-left:6px}.existing-backups-table tr td:first-child{border-left:4px solid transparent}.existing-backups-table tr.backuprowselected td:first-child{border-left-color:#0572aa}}@media screen and (min-width:670px){.expertmode .advanced_settings_container .advanced_settings_menu{float:left;width:215px;border-right:1px solid #ccc;border-bottom:0}.expertmode .advanced_settings_container .advanced_settings_content{padding-left:10px;padding-top:0}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:block}}@media only screen and (max-width:1068px){.updraft-more-plugins .udp-box{width:calc(50% - 10px);margin-bottom:20px}.updraft_feat_table td:nth-child(2),.updraft_feat_table td:nth-child(3){width:100px}}@media only screen and (max-width:600px){.updraft-more-plugins .udp-box{width:100%;margin-bottom:20px}.updraft_feat_table td:nth-child(2),.updraft_feat_table td:nth-child(3){width:auto}table.updraft_feat_table{display:block}table.updraft_feat_table tr{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}table.updraft_feat_table td{display:block}table.updraft_feat_table td:first-child{width:100%;border-bottom:0}table.updraft_feat_table td:not(:first-child){width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}table.updraft_feat_table td:first-child:empty{display:none}td[data-colname]::before{content:attr(data-colname);font-size:.8rem;color:#CCC;line-height:1}} /*# sourceMappingURL=updraftplus-admin-2-23-7.min.css.map */ PKwL\/updraftplus/css/updraftplus-tour-2-23-7.min.cssnu[.shepherd-theme-arrows-plain-buttons{z-index:9999;max-width:390px !important}.shepherd-theme-arrows-plain-buttons.super-index{z-index:999999}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content{border-radius:3px;-webkit-filter:none;filter:none;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.15),0 10px 40px rgba(0,0,0,0.15);box-shadow:0 1px 3px rgba(0,0,0,0.15),0 10px 40px rgba(0,0,0,0.15)}.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before{display:none}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before{border-bottom-color:#dd6823}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header{background-color:#dd6823;border-radius:3px 3px 0 0;padding-right:90px}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header h3{color:#FFF;font-size:1.2em;float:none}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link{opacity:.7;color:rgba(255,255,255,0);font-size:.8em;border:1px solid #FFF;border-radius:50%;width:22px;height:22px;line-height:20px;padding:0;text-align:center;float:none;position:absolute;right:11px;top:12px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link::before{color:#FFF;content:attr(data-btntext);position:absolute;right:20px;padding-right:10px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link::after{content:"\f335";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:dashicons;color:#FFF;position:absolute;left:2px;line-height:21px;font-size:16px}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover,.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus{border:1px solid #a04e00;opacity:1}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover::before,.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus::before{color:#a04e00}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover::after,.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus::after{color:#a04e00}.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before{top:44px}.shepherd-content .ud-notice{background:#f0f0f0;padding:14px;border-radius:4px;font-size:90% !important;line-height:1.5}.shepherd-content .ud-notice h3{margin-top:0;padding-top:0;margin-bottom:.5em}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p{margin-top:.5em;margin-bottom:1.3em}.ud-notice span.ud-special-offer{font-weight:bold;display:inline-block;padding:1px 6px;border-radius:3px;background:rgba(217,105,0,0.09)}label[for=updraft_servicecheckbox_updraftvault]{border:1px solid rgba(204,204,204,0.4);-webkit-transition:border .5s;transition:border .5s}label[for=updraft_servicecheckbox_updraftvault].emphasize{border-color:#dd6823}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back,.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end{float:left;position:relative;padding-left:10px}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end{padding-left:0;color:#b7b7b7}.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back::before{content:' ';width:6px;height:6px;display:block;border-left:1px solid;border-bottom:1px solid;position:absolute;left:0;top:8px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}a.shepherd-button.udp-tour-end::before{display:inline-block;position:relative;content:"\f335";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:dashicons;font-size:20px;line-height:20px;vertical-align:middle;margin-top:-2px}.updraftplus-welcome-logo{display:block;width:70px;float:left;margin-top:-11px;margin-right:12px}.updraftplus-welcome-logo img{display:block;width:auto;max-width:100%}.highlight-udp .plugins #the-list tr:not([data-slug="updraftplus"]){opacity:.3}@media(max-width:790px){.shepherd-element.shepherd-theme-arrows-plain-buttons{display:none}} /*# sourceMappingURL=updraftplus-tour-2-23-7.min.css.map */ PKwL\b@mm2updraftplus/css/updraftplus-notices-2-23-7.min.cssnu[.updraft_notice_container{height:auto;overflow:hidden}.updraft_review_notice_container{padding:12px;display:-webkit-box;display:-ms-flexbox;display:flex}.updraft_advert_button_container{margin-bottom:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.updraft_advert_button_container .dashicons{margin-left:10px}.updraft_advert_content_left{float:none;width:65px}.updraft_advert_content_left_extra{float:none;width:100px;padding-right:15px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.updraft_advert_content_right{float:none;width:auto;overflow:hidden}.updraft_advert_bottom{margin:10px 0;padding:10px;font-size:140%;background-color:white;border-color:#e6db55;border:1px solid;border-radius:4px}.updraft-advert-dismiss{float:right;font-size:13px;font-weight:normal}h3.updraft_advert_heading{margin-top:5px !important;margin-bottom:5px !important}h4.updraft_advert_heading{margin-top:2px !important;margin-bottom:3px !important}.updraft_center_content{text-align:center;margin-bottom:5px}.updraft_notice_link{padding-left:5px}.updraft_text_center{text-align:center}@media screen and (min-width:560px){.updraft_advert_content_left,.updraft_advert_content_left_extra{float:left}} /*# sourceMappingURL=updraftplus-notices-2-23-7.min.css.map */ PKwL\~ A%updraftplus/css/updraftplus-tour.scssnu[$udp_primary: #DD6823; $wp_blue: #0073AA; .shepherd-theme-arrows-plain-buttons { z-index: 9999; max-width: 390px!important; } .shepherd-theme-arrows-plain-buttons.super-index { z-index: 999999; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content { border-radius: 3px; filter: none; box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 10px 40px rgba(0, 0, 0, 0.15); } .shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before, .shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before { display: none; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before { border-bottom-color: $udp_primary; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header { background-color: $udp_primary; border-radius: 3px 3px 0 0; padding-right: 90px; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header h3 { color: #FFF; font-size: 1.2em; float: none; } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link { opacity: 0.7; color: rgba(255, 255, 255, 0); font-size: 0.8em; border: 1px solid #FFF; border-radius: 50%; width: 22px; height: 22px; line-height: 20px; padding: 0; text-align: center; float: none; position: absolute; right: 11px; top: 12px; &::before { color: #FFF; content: attr(data-btntext); position: absolute; right: 20px; padding-right: 10px; } &::after { content: "\f335"; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: dashicons; color: #FFF; position: absolute; left: 2px; line-height: 21px; font-size: 16px; } } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover, .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus { border: 1px solid #A04E00; opacity: 1; &::before { color: #A04E00; } &::after { color: #A04E00; } } .shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before { top: 44px; } .shepherd-content .ud-notice { background: #F0F0F0; padding: 14px; border-radius: 4px; font-size: 90% !important; line-height: 1.5; h3 { margin-top: 0; padding-top: 0; margin-bottom: .5em; } } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p { margin-top: 0.5em; margin-bottom: 1.3em; } .ud-notice span.ud-special-offer { font-weight: bold; display: inline-block; padding: 1px 6px; border-radius: 3px; background: rgba(217, 105, 0, 0.09); } label[for=updraft_servicecheckbox_updraftvault] { border: 1px solid rgba(204, 204, 204, 0.4); transition: border .5s; &.emphasize { border-color: $udp_primary; } } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back, .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end { float: left; position: relative; padding-left: 10px; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end { padding-left: 0; color: #B7B7B7; } .shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back::before { content: ' '; width: 6px; height: 6px; display: block; border-left: 1px solid; border-bottom: 1px solid; position: absolute; left: 0px; top: 8px; transform: rotate(45deg); } a.shepherd-button.udp-tour-end::before { display: inline-block; position: relative; content: "\f335"; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: dashicons; font-size: 20px; line-height: 20px; vertical-align: middle; margin-top: -2px; } .updraftplus-welcome-logo { display: block; width: 70px; float: left; margin-top: -11px; margin-right: 12px; } .updraftplus-welcome-logo img { display: block; width: auto; max-width: 100%; } .highlight-udp .plugins #the-list tr:not([data-slug="updraftplus"]) { opacity: 0.3; } @media(max-width: 790px) { .shepherd-element.shepherd-theme-arrows-plain-buttons { display: none; } } PKwL\.3updraftplus/css/updraftplus-tour-2-23-7.min.css.mapnu[{"version":3,"sources":["css/updraftplus-tour.scss"],"names":[],"mappings":"AAEA;CACC,aAAa;CACb,0BAA0B;AAC3B;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,kBAAkB;CAClB,oBAAY;SAAZ,YAAY;CACZ,sFAA8E;SAA9E,8EAA8E;AAC/E;;AAEA;;;;CAIC,aAAa;AACd;;AAEA;;;CAGC,4BAAiC;AAClC;;AAEA;CACC,yBAA8B;CAC9B,0BAA0B;CAC1B,mBAAmB;AACpB;;AAEA;CACC,WAAW;CACX,gBAAgB;CAChB,WAAW;AACZ;;AAEA;CACC,YAAY;CACZ,6BAA6B;CAC7B,gBAAgB;CAChB,sBAAsB;CACtB,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,iBAAiB;CACjB,UAAU;CACV,kBAAkB;CAClB,WAAW;CACX,kBAAkB;CAClB,WAAW;CACX;AAoBD;;AAlBC;EACC,WAAW;EACX,2BAA2B;EAC3B,kBAAkB;EAClB,WAAW;EACX,mBAAmB;CACpB;;AACA;EACC,gBAAgB;EAChB,mCAAmC;EACnC,kCAAkC;EAClC,sBAAsB;EACtB,WAAW;EACX,kBAAkB;EAClB,SAAS;EACT,iBAAiB;EACjB,eAAe;CAChB;;AAGD;;CAEC,yBAAyB;CACzB;AAOD;;AANC;EACC,cAAc;CACf;;AACA;EACC,cAAc;CACf;;AAGD;CACC,SAAS;AACV;;AAEA;;CAEC,mBAAmB;CACnB,aAAa;CACb,kBAAkB;CAClB,yBAAyB;CACzB,gBAAgB;;AAOjB;;AANC;EACC,aAAa;EACb,cAAc;EACd,mBAAmB;CACpB;;AAID;CACC,iBAAiB;CACjB,oBAAoB;AACrB;;AAEA;CACC,iBAAiB;CACjB,qBAAqB;CACrB,gBAAgB;CAChB,kBAAkB;CAClB,mCAAmC;AACpC;;AAEA;;CAEC,0CAA0C;CAC1C,8BAAsB;CAAtB;;AAKD;;AAJC;EACC,qBAA0B;CAC3B;;AAID;;CAEC,WAAW;CACX,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,eAAe;CACf,cAAc;AACf;;AAEA;CACC,YAAY;CACZ,UAAU;CACV,WAAW;CACX,cAAc;CACd,sBAAsB;CACtB,wBAAwB;CACxB,kBAAkB;CAClB,SAAS;CACT,QAAQ;CACR,gCAAwB;SAAxB,wBAAwB;AACzB;;AAEA;CACC,qBAAqB;CACrB,kBAAkB;CAClB,gBAAgB;CAChB,mCAAmC;CACnC,kCAAkC;CAClC,sBAAsB;CACtB,eAAe;CACf,iBAAiB;CACjB,sBAAsB;CACtB,gBAAgB;AACjB;;AAEA;CACC,cAAc;CACd,WAAW;CACX,WAAW;CACX,iBAAiB;CACjB,kBAAkB;AACnB;;AAEA;CACC,cAAc;CACd,WAAW;CACX,eAAe;AAChB;;AAEA;CACC,YAAY;AACb;;AAEA;;CAEC;EACC,aAAa;CACd;;AAED","file":"updraftplus-tour-2-23-7.min.css","sourcesContent":["$udp_primary: #DD6823;\n$wp_blue: #0073AA;\n.shepherd-theme-arrows-plain-buttons {\n\tz-index: 9999;\n\tmax-width: 390px!important;\n}\n\n.shepherd-theme-arrows-plain-buttons.super-index {\n\tz-index: 999999;\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content {\n\tborder-radius: 3px;\n\tfilter: none;\n\tbox-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 10px 40px rgba(0, 0, 0, 0.15);\n}\n\n.shepherd-element-attached-bottom.shepherd-element-attached-right.shepherd-target-attached-top.shepherd-target-attached-left .shepherd-content:before,\n.shepherd-element-attached-bottom.shepherd-element-attached-left.shepherd-target-attached-top.shepherd-target-attached-right .shepherd-content:before,\n.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-target-attached-left .shepherd-content:before,\n.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-target-attached-right .shepherd-content:before {\n\tdisplay: none;\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-center.shepherd-has-title .shepherd-content:before,\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-right.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before,\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-bottom.shepherd-has-title .shepherd-content:before {\n\tborder-bottom-color: $udp_primary;\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header {\n\tbackground-color: $udp_primary;\n\tborder-radius: 3px 3px 0 0;\n\tpadding-right: 90px;\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content header h3 {\n\tcolor: #FFF;\n\tfont-size: 1.2em;\n\tfloat: none;\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link {\n\topacity: 0.7;\n\tcolor: rgba(255, 255, 255, 0);\n\tfont-size: 0.8em;\n\tborder: 1px solid #FFF;\n\tborder-radius: 50%;\n\twidth: 22px;\n\theight: 22px;\n\tline-height: 20px;\n\tpadding: 0;\n\ttext-align: center;\n\tfloat: none;\n\tposition: absolute;\n\tright: 11px;\n\ttop: 12px;\n\n\t&::before {\n\t\tcolor: #FFF;\n\t\tcontent: attr(data-btntext);\n\t\tposition: absolute;\n\t\tright: 20px;\n\t\tpadding-right: 10px;\n\t}\n\t&::after {\n\t\tcontent: \"\\f335\";\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-moz-osx-font-smoothing: grayscale;\n\t\tfont-family: dashicons;\n\t\tcolor: #FFF;\n\t\tposition: absolute;\n\t\tleft: 2px;\n\t\tline-height: 21px;\n\t\tfont-size: 16px;\n\t}\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:hover,\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-has-title .shepherd-content header a.shepherd-cancel-link:focus {\n\tborder: 1px solid #A04E00;\n\topacity: 1;\n\t&::before {\n\t\tcolor: #A04E00;\n\t}\n\t&::after {\n\t\tcolor: #A04E00;\n\t}\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons.shepherd-element-attached-top.shepherd-element-attached-left.shepherd-target-attached-right .shepherd-content:before {\n\ttop: 44px;\n}\n\n.shepherd-content .ud-notice {\n\n\tbackground: #F0F0F0;\n\tpadding: 14px;\n\tborder-radius: 4px;\n\tfont-size: 90% !important;\n\tline-height: 1.5;\n\th3 {\n\t\tmargin-top: 0;\n\t\tpadding-top: 0;\n\t\tmargin-bottom: .5em;\n\t}\n\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content .shepherd-text p {\n\tmargin-top: 0.5em;\n\tmargin-bottom: 1.3em;\n}\n\n.ud-notice span.ud-special-offer {\n\tfont-weight: bold;\n\tdisplay: inline-block;\n\tpadding: 1px 6px;\n\tborder-radius: 3px;\n\tbackground: rgba(217, 105, 0, 0.09);\n}\n\nlabel[for=updraft_servicecheckbox_updraftvault] {\n\n\tborder: 1px solid rgba(204, 204, 204, 0.4);\n\ttransition: border .5s;\n\t&.emphasize {\n\t\tborder-color: $udp_primary;\n\t}\n\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back,\n.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end {\n\tfloat: left;\n\tposition: relative;\n\tpadding-left: 10px;\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-end {\n\tpadding-left: 0;\n\tcolor: #B7B7B7;\n}\n\n.shepherd-element.shepherd-theme-arrows-plain-buttons .shepherd-content footer .shepherd-buttons li .shepherd-button.udp-tour-back::before {\n\tcontent: ' ';\n\twidth: 6px;\n\theight: 6px;\n\tdisplay: block;\n\tborder-left: 1px solid;\n\tborder-bottom: 1px solid;\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 8px;\n\ttransform: rotate(45deg);\n}\n\na.shepherd-button.udp-tour-end::before {\n\tdisplay: inline-block;\n\tposition: relative;\n\tcontent: \"\\f335\";\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tfont-family: dashicons;\n\tfont-size: 20px;\n\tline-height: 20px;\n\tvertical-align: middle;\n\tmargin-top: -2px;\n}\n\n.updraftplus-welcome-logo {\n\tdisplay: block;\n\twidth: 70px;\n\tfloat: left;\n\tmargin-top: -11px;\n\tmargin-right: 12px;\n}\n\n.updraftplus-welcome-logo img {\n\tdisplay: block;\n\twidth: auto;\n\tmax-width: 100%;\n}\n\n.highlight-udp .plugins #the-list tr:not([data-slug=\"updraftplus\"]) {\n\topacity: 0.3;\n}\n\n@media(max-width: 790px) {\n\n\t.shepherd-element.shepherd-theme-arrows-plain-buttons {\n\t\tdisplay: none;\n\t}\n\n}\n"]}PKwL\9Z~=='updraftplus/css/updraftplus-notices.cssnu[/* CSS for adverts */ .updraft_notice_container { height: auto; overflow: hidden; } .updraft_review_notice_container { padding: 12px; display: -webkit-box; display: -ms-flexbox; display: flex; } .updraft_advert_button_container { margin-bottom: 10px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } .updraft_advert_button_container .dashicons { margin-left: 10px; } .updraft_advert_content_left { float: none; width: 65px; } .updraft_advert_content_left_extra { float: none; width: 100px; padding-right: 15px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } .updraft_advert_content_right { float: none; width: auto; overflow: hidden; } .updraft_advert_bottom { margin: 10px 0; padding: 10px; font-size: 140%; background-color: white; border-color: #E6DB55; border: 1px solid; border-radius: 4px; } .updraft-advert-dismiss { float: right; font-size: 13px; font-weight: normal; } h3.updraft_advert_heading { margin-top: 5px !important; margin-bottom: 5px !important; } h4.updraft_advert_heading { margin-top: 2px !important; margin-bottom: 3px !important; } .updraft_center_content { text-align: center; margin-bottom: 5px; } .updraft_notice_link { padding-left: 5px; } .updraft_text_center { text-align: center; } @media screen and (min-width: 560px) { .updraft_advert_content_left, .updraft_advert_content_left_extra { float: left; } } PKwL\04updraftplus/css/updraftplus-admin-2-23-7.min.css.mapnu[{"version":3,"sources":["css/updraftplus-admin.css"],"names":[],"mappings":"AAAA;;CAEC;EACC,UAAU;EACV,2BAAmB;UAAnB,mBAAmB;CACpB;;CAEA;EACC,YAAY;EACZ,8BAAsB;UAAtB,sBAAsB;CACvB;;AAED;;AAZA;;CAEC;EACC,UAAU;EACV,2BAAmB;UAAnB,mBAAmB;CACpB;;CAEA;EACC,YAAY;EACZ,8BAAsB;UAAtB,sBAAsB;CACvB;;AAED;;AAEA;;CAEC;EACC,4BAAoB;UAApB,oBAAoB;CACrB;;CAEA;EACC,iCAAyB;UAAzB,yBAAyB;CAC1B;;AAED;;AAVA;;CAEC;EACC,4BAAoB;UAApB,oBAAoB;CACrB;;CAEA;EACC,iCAAyB;UAAzB,yBAAyB;CAC1B;;AAED;;AAEA,sBAAsB;AACtB;CACC,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,UAAU;AACX;;AAEA;CACC,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,mBAAe;KAAf,eAAe;AAChB;;AAEA;CACC,mBAAO;KAAP,WAAO;SAAP,OAAO;CACP,8BAAsB;SAAtB,sBAAsB;AACvB;;AAEA;CACC,UAAU;CACV,mBAAU;KAAV,cAAU;SAAV,UAAU;AACX;;AAEA;CACC,WAAW;CACX,mBAAU;KAAV,cAAU;SAAV,UAAU;AACX;;AAEA;CACC,mBAAmB;AACpB;;AAEA,0BAA0B;;AAE1B,iBAAiB;AACjB;CACC,qBAAqB;AACtB;;AAEA;CACC,iBAAiB;AAClB;;AAEA,qBAAqB;AACrB,cAAc;AACd;CACC,kBAAkB;AACnB;;AAEA,qBAAqB;AACrB,YAAY;AACZ;CACC,qBAAqB;AACtB;;AAEA,mBAAmB;;AAEnB;CACC,kBAAkB;AACnB;;AAEA;CACC,YAAY;CACZ,eAAe;AAChB;;AAEA;CACC,uBAAuB;AACxB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,8CAAsC;SAAtC,sCAAsC;AACvC;;AAEA;CACC,qBAAqB;AACtB;;AAEA;;CAEC,cAAc;CACd,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA,gBAAgB;AAChB;CACC,cAAc;CACd,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;AACnB;;AAEA,gBAAgB;AAChB;CACC,YAAY;AACb;;AAEA;CACC,oBAAoB;AACrB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,kBAAkB;CAClB,eAAe;AAChB;;AAEA;;CAEC,gBAAgB;CAChB,WAAW;AACZ;;AAEA;CACC,gBAAgB;AACjB;;AAEA,oBAAoB;;AAEpB,iBAAiB;AACjB;CACC,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB,eAAe;CACf,iBAAiB;CACjB,mBAAmB;CACnB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,kBAAkB;CAClB,iBAAiB;CACjB,4BAAoB;CAApB,oBAAoB;CACpB,wBAAwB;CACxB,8BAAsB;SAAtB,sBAAsB;CACtB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,oBAAoB;CACpB,cAAc;CACd,qBAAqB;AACtB;;AAEA;CACC,+BAA+B;CAC/B,wBAAwB;AACzB;;AAEA;CACC,gCAAgC;CAChC,gEAAgD;CAAhD,wDAAgD;CAAhD,gDAAgD;CAAhD,wEAAgD;CAChD,uCAAuC;CACvC,YAAY;CACZ,kBAAkB;CAClB,6EAAqE;SAArE,qEAAqE;CACrE,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,qBAAqB;CACrB,60BAA60B;CAC70B,sBAAsB;CACtB,4BAA4B;CAC5B,8BAA8B;AAC/B;;AAEA;CACC,6EAAqE;SAArE,qEAAqE;AACtE;;AAEA;CACC,sBAAsB;AACvB;;AAEA;CACC,aAAa;CACb,gGAAwF;SAAxF,wFAAwF;AACzF;;AAEA;CACC,+BAAuB;SAAvB,uBAAuB;CACvB,yBAAyB;CACzB,6EAAqE;SAArE,qEAAqE;CACrE,mBAAmB;AACpB;;AAEA;CACC,iBAAiB;CACjB,YAAY;CACZ,kBAAkB;AACnB;;AAEA;CACC,aAAa;CACb,kBAAkB;AACnB;;AAEA;CACC,qBAAqB;CACrB,mBAAmB;AACpB;;AAEA;CACC,cAAc;AACf;;AAEA;;CAEC;;AAED;CACC,aAAa;AACd;;AAEA,eAAe;;AAEf;CACC,oBAAa;CAAb,oBAAa;CAAb,aAAa;AACd;;AAEA;CACC,mBAAmB;CACnB,aAAa;CACb,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;AACjB;;AAEA;CACC,SAAS;AACV;;AAEA;CACC,mBAAmB;CACnB,aAAa;CACb,mBAAmB;CACnB,mBAAO;KAAP,WAAO;SAAP,OAAO;AACR;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,eAAe;CACf,cAAc;AACf;;AAEA,wBAAwB;AACxB;CACC,aAAa;CACb,kBAAkB;CAClB,QAAQ;CACR,MAAM;CACN,YAAY;CACZ,2BAA2B;CAC3B,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA;CACC,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,4BAAsB;CAAtB,6BAAsB;KAAtB,0BAAsB;SAAtB,sBAAsB;AACvB;;AAEA;CACC,kBAAkB;CAClB,WAAW;CACX,6BAAgB;KAAhB,gBAAgB;AACjB;;AAEA;;CAEC,WAAW;AACZ;;AAEA;;CAEC;EACC,8BAAmB;EAAnB,6BAAmB;MAAnB,uBAAmB;UAAnB,mBAAmB;EACnB,mBAAe;MAAf,eAAe;CAChB;;CAEA;EACC,4BAAe;MAAf,eAAe;CAChB;;CAEA;;EAEC,YAAY;CACb;;AAED;;AAEA;CACC,qBAAqB;CACrB,eAAe;AAChB;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,mBAAmB;CACnB,aAAa;CACb,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA,qBAAqB;AACrB;CACC,WAAW;CACX,WAAW;CACX,gBAAgB;AACjB;;AAEA;CACC,WAAW;CACX,gBAAgB;AACjB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,mBAAmB;CACnB,sBAAsB;AACvB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;;CAEC,YAAY;AACb;;AAEA,mBAAmB;AACnB;CACC,eAAe;CACf,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;AACjB;;AAEA,oCAAoC;AACpC;CACC,mBAAmB;CACnB,YAAY;CACZ,iBAAiB;CACjB,iBAAiB;CACjB,oBAAoB;AACrB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,UAAU;AACX;;AAEA,YAAY;;AAEZ;CACC,qBAAqB;AACtB;;AAEA;;;CAGC,qBAAqB;CACrB,cAAc;AACf;;AAEA;CACC,wBAAwB;CACxB,+BAA+B;AAChC;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;AACnB;;AAEA;CACC,aAAa;AACd;;AAEA;;CAEC,aAAa;AACd;;AAEA,4BAA4B;AAC5B;;CAEC,kBAAkB;CAClB,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,0BAAqB;KAArB,qBAAqB;CACrB,qBAAqB;CACrB,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;CACnB,mBAAmB;CACnB,6BAA6B;AAC9B;;AAEA;;;;CAIC,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ,SAAS;AACV;;AAEA;;CAEC,qBAAqB;CACrB,iBAAiB;CACjB,4BAA4B;AAC7B;;AAEA;;CAEC,eAAe;AAChB;;AAEA;;CAEC,SAAS;AACV;;AAEA;CACC,gBAAgB;CAChB,iBAAiB;CACjB,mBAAmB;CACnB,cAAc;CACd,YAAY;CACZ,iBAAiB;CACjB,oBAAoB;CACpB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA;CACC,kBAAkB;CAClB,UAAU;CACV,oBAAoB;AACrB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;;CAEC;AACD;CACC,cAAc;AACf;;AAEA;CACC,mBAAmB;CACnB,SAAS;CACT,gBAAgB;CAChB,mBAAmB;CACnB,oBAAoB;AACrB;;AAEA;CACC,oBAAoB;AACrB;;AAEA;CACC,8BAA8B;AAC/B;;AAEA;CACC,4BAA4B;AAC7B;;AAEA;CACC,UAAU;CACV,UAAU;AACX;;AAEA;CACC,aAAa;CACb,2FAAmF;SAAnF,mFAAmF;CACnF,gBAAgB;AACjB;;AAEA;CACC,cAAc;CACd,UAAU;AACX;;AAEA;CACC,mBAAmB;CACnB,gCAAgC;CAChC,wDAAgD;SAAhD,gDAAgD;AACjD;;AAEA;CACC,+GAAuG;SAAvG,uGAAuG;AACxG;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,YAAY;CACZ,kBAAkB;AACnB;;AAEA;CACC,aAAa;CACb,yEAAiE;SAAjE,iEAAiE;CACjE,UAAU;AACX;;AAEA;CACC,uBAAuB;AACxB;;AAEA;CACC,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,gBAAgB;CAChB,qBAAqB;CACrB,mBAAe;KAAf,eAAe;AAChB;;AAEA;CACC,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,wBAAwB;CACxB,aAAa;CACb,8BAAsB;SAAtB,sBAAsB;AACvB;;AAEA;CACC,kBAAkB;CAClB,8BAA8B;CAC9B,wBAAuB;KAAvB,qBAAuB;SAAvB,uBAAuB;CACvB,yBAAmB;KAAnB,sBAAmB;SAAnB,mBAAmB;AACpB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,YAAY;CACZ,iCAAiC;CACjC,yBAAyB;AAC1B;;AAEA;CACC,mBAAmB;CACnB,WAAW;CACX,SAAS;CACT,kBAAkB;AACnB;;AAEA;;CAEC,aAAa;AACd;;AAEA;CACC,qBAAqB;CACrB,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;AAChB;;AAEA;CACC,yBAAyB;CACzB,kBAAkB;CAClB,yFAAyF;CACzF,wBAAgB;SAAhB,gBAAgB;AACjB;;AAEA;CACC,qBAAqB;CACrB,mBAAmB;CACnB,eAAe;CACf,eAAe;CACf,eAAe;AAChB;;AAEA;CACC,UAAU;CACV,qBAAqB;CACrB,WAAW;CACX;;EAEC;AACF;;AAEA;CACC,WAAW;CACX,eAAe;AAChB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,gBAAgB;CAChB,WAAW;AACZ;;AAEA;CACC,qBAAqB;CACrB,YAAY;AACb;;AAEA;CACC,mBAAmB;CACnB,2BAA2B;CAC3B,8BAA8B;CAC9B,WAAW;CACX,eAAe;CACf,yCAAyC;AAC1C;;AAEA;CACC,mBAAmB;CACnB,4BAA4B;CAC5B,+BAA+B;CAC/B,iBAAiB;AAClB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,WAAW;CACX,iBAAiB;AAClB;;AAEA;CACC,YAAY;CACZ,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,WAAW;CACX,gBAAgB;CAChB,aAAa;AACd;;AAEA;CACC,gBAAgB;CAChB,WAAW;CACX,mBAAmB;CACnB,UAAU;AACX;;AAEA;CACC,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,mBAAmB;CACnB,WAAW;CACX,sBAAsB;CACtB,gBAAgB;AACjB;;AAEA;CACC,YAAY;CACZ,cAAc;CACd,qBAAqB;AACtB;;AAEA;CACC,WAAW;CACX,4BAAoB;CAApB,oBAAoB;CACpB,kBAAkB;AACnB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;CAChB,eAAe;CACf,mBAAmB;CACnB,WAAW;CACX,iBAAiB;CACjB,mBAAmB;AACpB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,WAAW;CACX,UAAU;CACV,gBAAgB;AACjB;;AAEA;CACC,eAAe;CACf,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,eAAe;CACf,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,cAAc;CACd,qBAAqB;CACrB,eAAe;CACf,kBAAkB;CAClB,iBAAiB;CACjB,kBAAkB;AACnB;;AAEA;CACC,eAAe;CACf,sBAAsB;CACtB,eAAe;CACf,kBAAkB;CAClB,iBAAiB;CACjB,gBAAgB;AACjB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,eAAe;CACf,kBAAkB;CAClB,iBAAiB;CACjB,YAAY;AACb;;AAEA;CACC,gBAAgB;CAChB,eAAe;AAChB;;AAEA;CACC,WAAW;CACX,kBAAkB;CAClB,eAAe;CACf,kBAAkB;CAClB,iBAAiB;CACjB,iBAAiB;AAClB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,iBAAiB;CACjB,cAAc;CACd,qBAAqB;CACrB,eAAe;CACf,YAAY;AACb;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,kBAAkB;CAClB,yBAAyB;CACzB,wBAAwB;CACxB,WAAW;CACX,cAAc;AACf;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,aAAa;CACb,kBAAkB;CAClB,UAAU;AACX;;AAEA;CACC,sBAAsB;AACvB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,iBAAiB;AAClB;;AAEA,qBAAqB;;AAErB,2BAA2B;;AAE3B;CACC,WAAW;CACX,YAAY;CACZ,WAAW;CACX,mBAAmB;AACpB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,gBAAgB;CAChB,eAAe;CACf,iBAAiB;CACjB,aAAa;CACb,WAAW;AACZ;;AAEA;CACC,YAAY;CACZ,kBAAkB;CAClB,UAAU;AACX;;AAEA;;CAEC,iBAAiB;CACjB,eAAe;CACf,mBAAmB;CACnB,aAAa;CACb,sBAAsB;AACvB;;AAEA;CACC,gBAAgB;CAChB,kBAAkB;CAClB,qBAAqB;AACtB;;AAEA;;CAEC,qBAAqB;CACrB,gBAAgB;AACjB;;AAEA;;;CAGC,wBAAwB;CACxB,gBAAgB;AACjB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;;CAEC;;EAEC,qBAAqB;CACtB;;AAED;;AAEA;CACC,eAAe;CACf,eAAe;CACf,wBAAgB;SAAhB,gBAAgB;CAChB,cAAc;CACd,YAAY;CACZ,iBAAiB;AAClB;;AAEA;;;CAGC,cAAc;AACf;;AAEA;CACC,cAAc;CACd,iBAAiB;CACjB,eAAe;CACf,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,uBAAuB;AACxB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;;CAEC,aAAa;CACb,aAAa;CACb,sBAAsB;CACtB,kBAAkB;AACnB;;AAEA;;;CAGC,YAAY;CACZ,gBAAgB;CAChB,YAAY;CACZ,uBAAuB;CACvB,kBAAkB;CAClB,QAAQ;CACR,UAAU;CACV,eAAe;AAChB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,qBAAqB;CACrB,eAAe;AAChB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,0BAA0B;AAC3B;;AAEA;CACC,cAAc;CACd,wBAAwB;CACxB,kBAAkB;AACnB;;AAEA;CACC,WAAW;AACZ;;AAEA,kCAAkC;;AAElC;CACC,gBAAgB;AACjB;;AAEA;CACC,eAAe;AAChB;;AAEA;;CAEC,yBAAyB;AAC1B;;AAEA;CACC,yBAAyB;AAC1B;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,6BAA6B;CAC7B,YAAY;CACZ,cAAc;CACd,0BAA0B;CAC1B,eAAe;CACf,WAAW;CACX,WAAW;AACZ;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,2BAA2B;CAC3B,6BAA6B;CAC7B,0BAA0B;CAC1B,gBAAgB;CAChB,gBAAgB;AACjB;;AAEA;CACC,0BAA0B;AAC3B;;AAEA;CACC,YAAY;CACZ,YAAY;CACZ,6BAA6B;AAC9B;;AAEA;CACC,8BAA8B;AAC/B;;AAEA;CACC,YAAY;CACZ,iBAAiB;CACjB,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;CAChB,sBAAsB;AACvB;;AAEA;CACC,UAAU;AACX;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;CAClB,WAAW;CACX,qBAAqB;AACtB;;AAEA;CACC,qBAAqB;CACrB,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,iDAAyC;SAAzC,yCAAyC;AAC1C;;AAEA;CACC,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,gDAAwC;SAAxC,wCAAwC;CACxC,YAAY;CACZ,oBAAoB;AACrB;;AAEA;CACC,WAAW;CACX,kBAAkB;CAClB,aAAa;CACb,8BAA8B;CAC9B,sBAAsB;CACtB,sBAAsB;AACvB;;AAEA;CACC,aAAa;CACb,gBAAgB;CAChB,kBAAkB;CAClB,iDAAyC;SAAzC,yCAAyC;CACzC,cAAc;AACf;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,kCAAkC;AACnC;;AAEA;CACC,cAAc;CACd,eAAe;AAChB;;AAEA;CACC,sBAAsB;AACvB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,WAAW;CACX,sBAAsB;CACtB,eAAe;AAChB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,qBAAqB;AACtB;;AAEA,kBAAkB;;AAElB,mEAAmE;AACnE;;CAEC,uBAAuB;AACxB;;AAEA;;CAEC,+BAA+B;AAChC;;AAEA;;CAEC,8BAA8B;AAC/B;;AAEA;;CAEC,uBAAuB;AACxB;;AAEA,8BAA8B;AAC9B;CACC,kBAAkB;CAClB,aAAa;CACb,cAAc;AACf;;AAEA;CACC,kBAAkB;CAClB,YAAY;CACZ,WAAW;CACX,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,WAAW;CACX,kBAAkB;CAClB,eAAe;AAChB;;AAEA;CACC,aAAa;CACb,cAAc;CACd,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,iBAAiB;CACjB,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;CAClB,kBAAkB;CAClB,WAAW;CACX,WAAW;CACX,cAAc;AACf;;AAEA,6BAA6B;AAC7B;CACC,kBAAkB;CAClB,aAAa;CACb,WAAW;CACX,sBAAsB;CACtB,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,gDAAwC;SAAxC,wCAAwC;AACzC;;AAEA;CACC,YAAY;CACZ,WAAW;CACX,YAAY;CACZ,cAAc;CACd,mBAAmB;CACnB,kBAAkB;CAClB,MAAM;CACN,UAAU;CACV,0BAA0B;CAC1B,2BAA2B;CAC3B,iDAAyC;SAAzC,yCAAyC;AAC1C;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,aAAa;CACb,mBAAmB;AACpB;;AAEA;CACC,aAAa;CACb,WAAW;CACX,cAAc;AACf;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,0BAA0B;CAC1B,iBAAiB;AAClB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,iBAAiB;AAClB;;AAEA;;CAEC,eAAe;AAChB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,SAAS;CACT,UAAU;AACX;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,YAAY;CACZ,6BAA6B;CAC7B,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,eAAe;CACf,iBAAiB;AAClB;;AAEA;CACC,WAAW;CACX,eAAe;AAChB;;AAEA;CACC,YAAY;CACZ,yBAAyB;CACzB,qBAAqB;CACrB,mCAA2B;SAA3B,2BAA2B;AAC5B;;AAEA;;CAEC,kBAAkB;CAClB,WAAW;CACX,gBAAgB;AACjB;;AAEA,kDAAkD;AAClD;CACC,cAAc;CACd,yBAAyB;CACzB,kBAAkB;CAClB,gCAAwB;SAAxB,wBAAwB;AACzB;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,2BAAmB;SAAnB,mBAAmB;CACnB,kDAA0C;SAA1C,0CAA0C;AAC3C;;AAEA;CACC,uBAAuB;CACvB,aAAa;AACd;;AAEA;CACC,mBAAmB;CACnB,YAAY;AACb;;AAEA;CACC,gBAAgB;CAChB,WAAW;AACZ;;AAEA;CACC,YAAY;CACZ,mBAAmB;CACnB,sBAAsB;CACtB,aAAa;AACd;;AAEA;CACC,mBAAmB;AACpB;;AAEA;;CAEC;AACD;CACC,gBAAgB;CAChB,gBAAgB;CAChB,UAAU;CACV,8BAA8B;AAC/B;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,gBAAgB;CAChB,uBAAuB;CACvB,yBAAyB;CACzB,kBAAkB;AACnB;;AAEA;CACC,cAAc;CACd,eAAe;CACf,kBAAkB;CAClB,cAAc;AACf;;AAEA;CACC,WAAW;CACX,YAAY;AACb;;AAEA;CACC,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,yBAAmB;KAAnB,sBAAmB;SAAnB,mBAAmB;CACnB,yBAA8B;KAA9B,sBAA8B;SAA9B,8BAA8B;CAC9B,kBAAkB;AACnB;;AAEA;CACC,mBAAmB;CACnB,iBAAiB;AAClB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,eAAe;CACf,gBAAgB;CAChB,cAAc;CACd,SAAS;CACT,kBAAkB;CAClB,uBAAuB;CACvB,cAAc;AACf;;AAEA;CACC,WAAW;AACZ;;AAEA;;CAEC;EACC,4BAAsB;EAAtB,6BAAsB;MAAtB,0BAAsB;UAAtB,sBAAsB;EACtB,kBAAkB;EAClB,yBAAmB;MAAnB,sBAAmB;UAAnB,mBAAmB;CACpB;;CAEA;EACC,eAAe;EACf,mBAAmB;CACpB;;AAED;;AAEA;;CAEC;AACD;CACC,gBAAgB;CAChB,aAAa;CACb,gDAAwC;SAAxC,wCAAwC;CACxC,kBAAkB;AACnB;;AAEA;CACC,SAAS;AACV;;AAEA;CACC,2BAAkB;KAAlB,kBAAkB;CAClB,gBAAgB;CAChB,wBAAgB;SAAhB,gBAAgB;AACjB;;AAEA;;CAEC;AACD;CACC,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,8BAAmB;CAAnB,6BAAmB;KAAnB,uBAAmB;SAAnB,mBAAmB;CACnB,mBAAe;KAAf,eAAe;CACf,yBAA8B;KAA9B,sBAA8B;SAA9B,8BAA8B;CAC9B,eAAe;AAChB;;AAEA;CACC,cAAc;CACd,eAAe;CACf,qBAAqB;AACtB;;AAEA;CACC,8BAAsB;SAAtB,sBAAsB;CACtB,UAAU;AACX;;AAEA;CACC,gBAAgB;CAChB,iBAAiB;AAClB;;AAEA;;CAEC;AACD;CACC,gBAAgB;CAChB,SAAS;CACT,eAAe;AAChB;;AAEA;CACC,uBAAuB;AACxB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,oCAAoC;CACpC,iBAAiB;AAClB;;AAEA;CACC,aAAa;CACb,gBAAgB;CAChB,2BAA2B;CAC3B,0BAA0B;CAC1B,8CAAsC;SAAtC,sCAAsC;CACtC,oBAAoB;CACpB,iBAAiB;AAClB;;AAEA;CACC,wBAAwB;AACzB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,YAAY;CACZ,yBAAyB;CACzB,eAAe;CACf,uBAAuB;CACvB,kBAAkB;AACnB;;AAEA;CACC,yBAAyB;CACzB,yBAAyB;CACzB,eAAe;CACf,uBAAuB;CACvB,kBAAkB;CAClB,aAAa;AACd;;AAEA;CACC,wBAAwB;AACzB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;;CAEC,2CAA2C;CAC3C,YAAY;AACb;;AAEA;CACC,cAAc;CACd,cAAc;AACf;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,iBAAiB;CACjB,eAAe;CACf,eAAe;AAChB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,eAAe;CACf,cAAc;AACf;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,UAAU;AACX;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,aAAa;CACb,YAAY;AACb;;AAEA;CACC,YAAY;CACZ,uBAAuB;CACvB,WAAW;CACX,eAAe;CACf,UAAU;CACV,eAAe;AAChB;;AAEA;CACC,SAAS;CACT,mBAAmB;CACnB,WAAW;CACX,6BAAqB;CAArB,qBAAqB;AACtB;;AAEA;CACC,eAAe;CACf,WAAW;AACZ;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,eAAe;CACf,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,WAAW;CACX,kBAAkB;CAClB,YAAY;CACZ,aAAa;CACb,qBAAqB;CACrB,qBAAqB;AACtB;;AAEA;CACC,eAAe;CACf,YAAY;CACZ,eAAe;AAChB;;AAEA;CACC,gBAAgB;CAChB,eAAe;CACf,iBAAiB;CACjB,aAAa;CACb,WAAW;AACZ;;AAEA,oBAAoB;AACpB;CACC,gBAAgB;AACjB;;AAEA;CACC,kBAAkB;CAClB,oBAAoB;AACrB;;AAEA;CACC,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,kBAAkB;CAClB,gBAAgB;CAChB,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,qBAAqB;CACrB,eAAe;CACf,iBAAiB;CACjB,UAAU;CACV,kCAA0B;SAA1B,0BAA0B;AAC3B;;AAEA;CACC,iCAAyB;SAAzB,yBAAyB;CACzB,iCAAyB;SAAzB,yBAAyB;CACzB,2CAAmC;SAAnC,mCAAmC;CACnC,sCAA8B;SAA9B,8BAA8B;CAC9B,2CAAmC;SAAnC,mCAAmC;AACpC;;AAEA;CACC,aAAa;AACd;;AAEA;;CAEC;EACC,cAAc;EACd,WAAW;EACX,kBAAkB;CACnB;;AAED;;AAEA,mCAAmC;AACnC;CACC,UAAU;AACX;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,iBAAiB;CACjB,oBAAoB;AACrB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,YAAY;AACb;;AAEA;;;;;;;;;;;;;;;;;;;;EAoBE;;AAEF;CACC,gBAAgB;AACjB;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,kBAAkB;AACnB;;AAEA;CACC,8BAA8B;CAC9B,sBAAsB;CACtB,uBAAuB;AACxB;;AAEA;CACC,iBAAiB;CACjB,WAAW;CACX,wBAAwB;AACzB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;CAClB,oDAA4C;SAA5C,4CAA4C;AAC7C;;AAEA;CACC,cAAc;CACd,YAAY;AACb;;AAEA;CACC,cAAc;CACd,cAAc;CACd,eAAe;CACf,WAAW;CACX,YAAY;CACZ,kBAAkB;CAClB,iBAAiB;CACjB,WAAW;CACX,mBAAmB;AACpB;;AAEA;CACC,qBAAqB;CACrB,iBAAiB;CACjB,eAAe;AAChB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,yBAAyB;CACzB,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,iBAAiB;CACjB,cAAc;AACf;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,gBAAgB;CAChB,SAAS;CACT,mBAAmB;AACpB;;AAEA;CACC,iBAAiB;CACjB,cAAc;AACf;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,sBAAsB;CACtB,YAAY;CACZ,WAAW;CACX,kBAAkB;AACnB;;AAEA;CACC,uBAAuB;CACvB,gBAAgB;CAChB,eAAe;CACf,mBAAmB;AACpB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,aAAa;CACb,8BAA8B;CAC9B,kBAAkB;CAClB,OAAO;CACP,SAAS;AACV;;AAEA;CACC,sBAAsB;AACvB;;AAEA;CACC,qBAAqB;CACrB,eAAe;AAChB;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,qBAAqB;CACrB,kBAAkB;AACnB;;AAEA;CACC,qBAAqB;CACrB,YAAY;CACZ,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,mBAAmB;CACnB,kBAAkB;AACnB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,kBAAkB;CAClB,0BAA0B;AAC3B;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,yBAAyB;AAC1B;;AAEA;CACC,eAAe;CACf,cAAc;AACf;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,aAAa;CACb,mBAAmB;CACnB,uBAAuB;AACxB;;AAEA,8BAA8B;AAC9B;CACC,uBAAuB;CACvB,YAAY;AACb;;AAEA;CACC,iBAAiB;CACjB,cAAc;AACf;;AAEA;CACC,mBAAmB;CACnB,gBAAgB;CAChB,gBAAgB;AACjB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,YAAY;CACZ,YAAY;AACb;;AAEA;CACC,WAAW;CACX,gBAAgB;AACjB;;AAEA;CACC,WAAW;CACX,gBAAgB;AACjB;;AAEA;CACC,YAAY;CACZ,oBAAoB;AACrB;;AAEA;CACC,WAAW;CACX,kBAAkB;CAClB,aAAa;AACd;;AAEA;CACC,aAAa;CACb,kBAAkB;AACnB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,WAAW;CACX,kBAAkB;CAClB,SAAS;CACT,QAAQ;CACR,kBAAkB;CAClB,yBAAyB;CACzB,8BAAsB;CAAtB,sBAAsB;AACvB;;AAEA;CACC,UAAU;CACV,kBAAkB;CAClB,eAAe;CACf,WAAW;CACX,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,WAAW;CACX,yBAAyB;CACzB,yCAAyC;AAC1C;;AAEA;CACC,qBAAqB;CACrB,UAAU;AACX;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,UAAU;CACV,WAAW;CACX,kBAAkB;AACnB;;AAEA;CACC,eAAe;CACf,iBAAiB;AAClB;;AAEA;CACC,iBAAiB;CACjB,YAAY;AACb;;AAEA;CACC,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;AAChB;;AAEA;CACC,UAAU;CACV,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;CAChB,0BAA0B;AAC3B;;AAEA;CACC,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,8BAA8B;CAE9B,sBAAsB;CACtB,gBAAgB;CAChB,UAAU;AACX;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,WAAW;AACZ;;AAEA;CACC,SAAS;CACT,UAAU;AACX;;AAEA;CACC,WAAW;CACX,sBAAsB;AACvB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,YAAY;CACZ,WAAW;AACZ;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,WAAW;AACZ;;AAEA;CACC,SAAS;CACT,UAAU;AACX;;AAEA;CACC,WAAW;CACX,sBAAsB;AACvB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,iBAAiB;CACjB,WAAW;CACX,WAAW;AACZ;;AAEA;CACC,YAAY;CACZ,WAAW;AACZ;;AAEA;CACC,WAAW;CACX,qBAAqB;AACtB;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,WAAW;AACZ;;AAEA;CACC,WAAW;CACX,YAAY;AACb;;AAEA;CACC,WAAW;CACX,sBAAsB;AACvB;;AAEA;CACC,0BAA0B;AAC3B;;AAEA;CACC,2BAA2B;AAC5B;;AAEA;CACC,2BAA2B;AAC5B;;AAEA;CACC,2BAA2B;AAC5B;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,oBAAoB;AACrB;;AAEA;;EAEE;;AAEF,4BAA4B;AAC5B;CACC,WAAW;AACZ;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,eAAe;CACf,eAAe;AAChB;;AAEA;CACC,eAAe;CACf,eAAe;AAChB;;AAEA,YAAY;AACZ,mHAAmH;;AAEnH;CACC,oBAAoB;CACpB,kBAAkB;AACnB;;AAEA;CACC,sBAAsB;CACtB,gBAAgB;AACjB;;AAEA;CACC,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,YAAY;AACb;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,UAAU;AACX;;AAEA,gBAAgB;;AAEhB;CACC,yBAAyB;CACzB,aAAa;CACb,WAAW;AACZ;;AAEA;CACC,YAAY;CACZ,mBAAmB;CACnB,WAAW;CACX,kBAAkB;AACnB;;AAEA;CACC,qBAAqB;CACrB,cAAc;AACf;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,UAAU;CACV,WAAW;AACZ;;AAEA;CACC,UAAU;CACV,WAAW;CACX,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;AACjB;;AAEA;CACC,4BAA4B;CAC5B,YAAY;CACZ,kBAAkB;AACnB;;AAEA;CACC,YAAY;AACb;;AAEA,oBAAoB;;AAEpB,gBAAgB;;AAEhB;CACC,WAAW;CACX,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,YAAY;CACZ,aAAa;CACb,sBAAsB;CACtB,qBAAqB;CACrB,cAAc;CACd,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,YAAY;CACZ,aAAa;AACd;;AAEA;CACC,UAAU;CACV,eAAe;CACf,4BAA4B;AAC7B;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,UAAU;CACV,cAAc;CACd,kBAAkB;AACnB;;AAEA;CACC,WAAW;CACX,sBAAsB;CACtB,gBAAgB;AACjB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,aAAa;CACb,YAAY;CACZ,eAAe;AAChB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,eAAe;CACf,cAAc;CACd,qBAAqB;CACrB,4BAA4B;CAC5B,kBAAkB;CAClB,UAAU;CACV,UAAU;AACX;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,sBAAsB;CACtB,eAAe;AAChB;;AAEA,oBAAoB;;AAEpB,mBAAmB;;AAEnB;CACC,gBAAgB;CAChB,WAAW;CACX,cAAc;CACd,cAAc;AACf;;AAEA;CACC,uBAAuB;CACvB,cAAc;CACd,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,YAAY;CACZ,aAAa;CACb,sBAAsB;CACtB,qBAAqB;CACrB,cAAc;CACd,kBAAkB;CAClB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,gBAAgB;CAChB,iBAAiB;AAClB;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,eAAe;AAChB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,YAAY;CACZ,YAAY;AACb;;AAEA;CACC,UAAU;CACV,YAAY;AACb;;AAEA;CACC,eAAe;CACf,cAAc;CACd,qBAAqB;CACrB,4BAA4B;CAC5B,kBAAkB;CAClB,UAAU;CACV,UAAU;AACX;;AAEA;CACC,eAAe;CACf,sBAAsB;AACvB;;AAEA;CACC,WAAW;CACX,sBAAsB;CACtB,gBAAgB;AACjB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;;CAEC,gBAAgB;AACjB;;AAEA;CACC,gBAAgB;AACjB;;AAEA,uBAAuB;;;AAGvB,kFAAkF;;AAElF;CACC,cAAc;AACf;;AAEA;CACC,kBAAkB;CAClB,iBAAiB;AAClB;;AAEA;CACC,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA;CACC,cAAc;CACd,qBAAqB;CACrB,cAAc;CACd,cAAc;AACf;;AAEA;CACC,WAAW;CACX,kBAAkB;AACnB;;AAEA,+BAA+B;;AAE/B;CACC,kBAAkB;AACnB;;AAEA;CACC,WAAW;CACX,UAAU;CACV,kBAAkB;CAClB,oBAAoB;AACrB;;AAEA;CACC,YAAY;CACZ,iBAAiB;AAClB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,0BAA0B;AAC3B;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,SAAS;CACT,UAAU;AACX;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,UAAU;CACV,kBAAkB;CAClB,iBAAiB;CACjB,qBAAqB;AACtB;;AAEA;CACC,eAAe;CACf,iBAAiB;AAClB;;AAEA;CACC,WAAW;CACX,eAAe;AAChB;;AAEA;CACC,WAAW;CACX,eAAe;CACf,kBAAkB;AACnB;;AAEA,kCAAkC;AAClC;AACA,4BAA4B;AAC5B;gBACgB;AAChB,gBAAgB;CACf,WAAW;CACX,WAAW;CACX,YAAY;CACZ,aAAa;AACd;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,WAAW;CACX,YAAY;CACZ,0BAA0B;CAC1B,UAAU;CACV,YAAY;CACZ,mBAAmB;AACpB;;AAEA;CACC,qBAAqB;CACrB,cAAc;CACd,mBAAmB;CACnB,kBAAkB;AACnB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,cAAc;CACd,eAAe;AAChB;;AAEA;CACC,gBAAgB;CAChB,yBAAyB;CACzB,kBAAkB;CAClB,cAAc;CACd,qBAAqB;CACrB,4BAA4B;CAC5B,6BAA6B;CAC7B,0BAA0B;CAC1B,iBAAiB;CACjB,gBAAgB;CAChB,2BAA2B;CAC3B,yBAAyB;CACzB,qBAAqB;AACtB;;AAEA;CACC,yBAAyB;CACzB,mBAAmB;CACnB,qBAAqB;CACrB,eAAe;CACf,iBAAiB;CACjB,gBAAgB;CAChB,WAAW;CACX,YAAY;CACZ,kBAAkB;AACnB;;AAEA,sCAAsC;AACtC,4CAA4C;AAC5C;CACC,YAAY;CACZ,gBAAgB;AACjB;;AAEA;CACC,WAAW;CACX,2CAA2C;AAC5C;;AAEA;CACC,gBAAgB;CAChB,WAAW;CACX,WAAW;CACX,cAAc;AACf;;AAEA;CACC,0BAA0B;AAC3B;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,qBAAqB;CACrB,eAAe;CACf,YAAY;CACZ,WAAW;AACZ;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,yBAAyB;AAC1B;;AAEA;CACC,yBAAyB;CACzB,WAAW;AACZ;;AAEA;CACC,yBAAyB;CACzB,WAAW;AACZ;;AAEA;CACC,uBAAuB;AACxB;;AAEA;CACC,0BAA0B;AAC3B;;AAEA;CACC,UAAU;CACV,WAAW;CACX,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;AACnB;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,iBAAiB;CACjB,kBAAkB;CAClB,oBAAoB;CACpB,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;CAClB,sBAAsB;CACtB,eAAe;CACf,gBAAgB;CAChB,sBAAsB;AACvB;;AAEA;CACC,sBAAsB;CACtB,iBAAiB;CACjB,2BAA2B;CAC3B,sBAAsB;CACtB,mBAAmB;AACpB;;AAEA;CACC,sBAAsB;CACtB,iBAAiB;CACjB,8BAA8B;CAC9B,sBAAsB;CACtB,mBAAmB;AACpB;;AAEA;CACC,kBAAkB;CAClB,WAAW;AACZ;;AAEA;CACC,mBAAmB;CACnB,WAAW;AACZ;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,eAAe;CACf,iBAAiB;CACjB,mBAAmB;AACpB;;AAEA;;CAEC,gBAAgB;AACjB;;AAEA;CACC,eAAe;CACf,mBAAmB;AACpB;;AAEA;CACC,WAAW;CACX,gBAAgB;CAChB,kBAAkB;AACnB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,uBAAuB;AACxB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,4BAAsB;CAAtB,6BAAsB;KAAtB,0BAAsB;SAAtB,sBAAsB;CACtB,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,cAAc;CACd,kDAA0C;SAA1C,0CAA0C;AAC3C;;AAEA;CACC,mBAAmB;CACnB,kDAA0C;SAA1C,0CAA0C;AAC3C;;AAEA;CACC,uBAAuB;CACvB,UAAU;AACX;;AAEA;CACC,cAAc;CACd,gBAAgB;AACjB;;AAEA;CACC,0BAA0B;AAC3B;;AAEA,qBAAqB;;AAErB;CACC,cAAc;CACd,eAAe;CACf,MAAM;CACN,OAAO;CACP,QAAQ;CACR,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,mBAAmB;CACnB,cAAc;AACf;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,SAAS;AACV;;AAEA;CACC,8BAAsB;SAAtB,sBAAsB;CACtB,gBAAgB;CAChB,iBAAiB;CACjB,kBAAkB;AACnB;;AAEA;CACC,gBAAgB;CAChB,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gDAAwC;SAAxC,wCAAwC;CACxC,kBAAkB;CAClB,oBAAa;CAAb,oBAAa;CAAb,aAAa;CACb,mBAAe;KAAf,eAAe;CACf,8BAAsB;SAAtB,sBAAsB;AACvB;;AAEA;CACC,eAAe;CACf,iBAAiB;CACjB,kBAAkB;CAClB,iBAAiB;CACjB,iBAAiB;CACjB,WAAW;CACX,eAAe;CACf,mBAAmB;CACnB,kBAAkB;CAClB,8BAAsB;SAAtB,sBAAsB;AACvB;;AAEA;CACC,kBAAkB;CAClB,yBAAyB;CACzB,8BAAsB;SAAtB,sBAAsB;AACvB;;AAEA;CACC,aAAa;CACb,SAAS;AACV;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,YAAY;CACZ,aAAa;CACb,8BAAsB;SAAtB,sBAAsB;CACtB,mBAAmB;CACnB,iBAAiB;AAClB;;AAEA;CACC,mBAAmB;CACnB,cAAc;CACd,sBAAsB;CACtB,aAAa;CACb,cAAc;CACd,kBAAkB;CAClB,SAAS;CACT,SAAS;CACT,QAAQ;CACR,OAAO;AACR;;AAEA;CACC,mBAAmB;CACnB,gIAAgI;AACjI;;AAEA;CACC,yBAAyB;CACzB,kBAAkB;CAClB,mBAAmB;AACpB;;AAEA;CACC,cAAc;CACd,iBAAiB;CACjB,mBAAmB;AACpB;;AAEA;CACC,aAAa;CACb,2BAA2B;AAC5B;;AAEA;CACC,cAAc;CACd,eAAe;AAChB;;AAEA;;CAEC,iBAAiB;AAClB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,SAAS;CACT,qBAAqB;CACrB,kBAAkB;CAClB,2BAA2B;AAC5B;;AAEA;CACC,aAAa;AACd;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,cAAc;CACd,gBAAgB;CAChB,kBAAkB;AACnB;;AAEA;CACC,gBAAgB;CAChB,sBAAsB;CACtB,eAAe;CACf,sBAAsB;CACtB,qBAAqB;CACrB,iBAAiB;AAClB;;AAEA;CACC,sBAAsB;AACvB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,gBAAgB;CAChB,gDAAwC;SAAxC,wCAAwC;AACzC;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,eAAe;CACf,gBAAgB;CAChB,kBAAkB;CAClB,sBAAsB;CACtB,aAAa;AACd;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,eAAe;CACf,YAAY;CACZ,iBAAiB;CACjB,WAAW;AACZ;;AAEA;CACC,sBAAsB;AACvB;;AAEA,kBAAkB;;AAElB;CACC,WAAW;AACZ;;AAEA;CACC,mBAAmB;AACpB;;AAEA;;CAEC,kBAAkB;AACnB;;AAEA;CACC,aAAa;CACb,mBAAmB;CACnB,kBAAkB;CAClB,6BAA6B;AAC9B;;AAEA;CACC,SAAS;CACT,UAAU;AACX;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,qBAAqB;CACrB,SAAS;CACT,YAAY;AACb;;AAEA;CACC,qBAAqB;CACrB,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;CACd,aAAa;CACb,sBAAsB;AACvB;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,0BAA0B;CAC1B,aAAa;CACb,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,gBAAgB;CAChB,WAAW;CACX,8BAAsB;SAAtB,sBAAsB;AACvB;;AAEA;CACC,kBAAkB;CAClB,UAAU;CACV,SAAS;AACV;;AAEA;CACC,kBAAkB;CAClB,WAAW;CACX,SAAS;AACV;;AAEA;CACC,kBAAkB;CAClB,YAAY;CACZ,yBAAyB;CACzB,WAAW;CACX,+BAAqB;CACrB,YAAY;CACZ,8BAAsB;SAAtB,sBAAsB;CACtB,kBAAkB;CAClB,WAAW;CACX,kBAAkB;CAClB,aAAa;AACd;;AAEA;CACC,qBAAqB;AACtB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,iBAAiB;AAClB;;AAEA,yCAAyC;AACzC;CACC,aAAa;AACd;;AAEA;CACC,gBAAgB;AACjB;;AAEA;CACC,gDAAwC;SAAxC,wCAAwC;AACzC;;AAEA,qBAAqB;;AAErB;CACC,gBAAgB;CAChB,mBAAmB;CACnB,YAAY;AACb;;AAEA;CACC,wBAAwB;CACxB,aAAa;AACd;;AAEA;CACC,iBAAiB;AAClB;;AAEA;CACC,sBAAsB;AACvB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,WAAW;AACZ;;AAEA,gBAAgB;;AAEhB;CACC,cAAc;CACd,iBAAiB;AAClB;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,mBAAmB;CACnB,oBAAoB;AACrB;;AAEA;CACC,sBAAsB;AACvB;;AAEA;CACC,YAAY;AACb;;AAEA;CACC,cAAc;CACd,kBAAkB;CAClB,gBAAgB;AACjB;;AAEA;CACC,UAAU;CACV,SAAS;CACT,kBAAkB;AACnB;;AAEA;CACC,kBAAkB;CAClB,oBAAoB;AACrB;;AAEA;CACC,kBAAkB;CAClB,oBAAoB;AACrB;;AAEA;CACC,UAAU;CACV,cAAc;AACf;;AAEA;;CAEC,iBAAiB;CACjB,oBAAoB;CACpB,yBAAyB;CACzB,YAAY;CACZ,iBAAiB;AAClB;;AAEA;;;CAGC,SAAS;CACT,cAAc;AACf;;AAEA;CACC,cAAc;AACf;;AAEA;CACC,WAAW;AACZ;;AAEA;CACC,mBAAmB;AACpB;;AAEA;CACC,gBAAgB;CAChB,cAAc;AACf;;AAEA;;CAEC;EACC,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,2BAAqB;MAArB,wBAAqB;UAArB,qBAAqB;CACtB;;CAEA;EACC,mBAAU;MAAV,cAAU;UAAV,UAAU;CACX;;CAEA;EACC,yBAAyB;CAC1B;;AAED;;AAEA;;CAEC;;;EAGC,wBAAwB;EACxB,iBAAiB;EACjB,4BAA4B;EAC5B,YAAY;EACZ,gBAAgB;EAChB,WAAW;CACZ;;CAEA;EACC,YAAY;CACb;;CAEA;EACC,eAAe;EACf,SAAS;EACT,WAAW;EACX,QAAQ;EACR,SAAS;EACT,gBAAgB;EAChB,UAAU;EACV,+CAAuC;UAAvC,uCAAuC;CACxC;;CAEA;EACC,SAAS;EACT,YAAY;CACb;;CAEA;EACC,UAAU;CACX;;CAEA;EACC,kBAAkB;CACnB;;CAEA;EACC,WAAW;CACZ;;AAED;;AAEA;;CAEC;EACC,UAAU;CACX;;AAED;;AAEA;;CAEC;EACC,eAAe;CAChB;;CAEA;EACC,gBAAgB;CACjB;;CAEA;EACC,kBAAkB;EAClB,eAAe;EACf,iBAAiB;CAClB;;CAEA;EACC,kBAAkB;EAClB,eAAe;EACf,sBAAsB;EACtB,YAAY;EACZ,mBAAmB;CACpB;;CAEA;EACC,kBAAkB;EAClB,QAAQ;EACR,QAAQ;CACT;;CAEA;EACC,cAAc;EACd,yBAAyB;CAC1B;;CAEA;EACC,kBAAkB;CACnB;;CAEA;EACC,SAAS;EACT,cAAc;EACd,WAAW;CACZ;;CAEA;EACC,cAAc;CACf;;CAEA;EACC,WAAW;EACX,8BAAsB;UAAtB,sBAAsB;EACtB,kBAAkB;CACnB;;CAEA;EACC,eAAe;EACf,SAAS;EACT,SAAS;EACT,WAAW;EACX,8BAAsB;UAAtB,sBAAsB;EACtB,kBAAkB;EAClB,mDAA2C;UAA3C,2CAA2C;EAC3C,gBAAgB;EAChB,UAAU;CACX;;CAEA;EACC,cAAc;EACd,kBAAkB;CACnB;;CAEA;EACC,cAAc;CACf;;AAED;;;;;;;;;GASG;;CAEF;EACC,mBAAmB;CACpB;;CAEA;EACC,qBAAqB;CACtB;;CAEA;EACC,SAAS;EACT,wBAAgB;UAAhB,gBAAgB;EAChB,uBAAuB;CACxB;;CAEA;EACC,YAAY;EACZ,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,UAAU;EACV,kBAAkB;EAClB,UAAU;EACV,UAAU;EACV,SAAS;CACV;;CAEA;EACC,cAAc;EACd,qBAAqB;EACrB,wBAAwB;EACxB,WAAW;EACX,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,gBAAgB;EAChB,gDAAwC;UAAxC,wCAAwC;CACzC;;CAEA;EACC,6BAA6B;EAC7B,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,SAAS;CACV;;CAEA;EACC;;;GAGC;EACD,yBAAyB;EACzB,iBAAiB;EACjB,cAAc;EACd,kBAAkB;EAClB,UAAU;EACV,oBAAoB;EACpB,WAAW;EACX,gBAAgB;CACjB;;CAEA;EACC,gBAAgB;CACjB;;CAEA;EACC,cAAc;EACd,eAAe;CAChB;;CAEA;EACC,gBAAgB;CACjB;;CAEA;EACC,4BAAsB;EAAtB,6BAAsB;MAAtB,0BAAsB;UAAtB,sBAAsB;CACvB;;CAEA;EACC,WAAW;CACZ;;CAEA;EACC,gBAAgB;CACjB;;CAEA;EACC,kBAAkB;CACnB;;CAEA;EACC,sBAAsB;EACtB,8BAA8B;CAC/B;;CAEA;EACC,iBAAiB;CAClB;;CAEA;EACC,sBAAsB;EACtB,kBAAkB;EAClB,OAAO;EACP,MAAM;EACN,8BAAsB;UAAtB,sBAAsB;EACtB,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,2CAA2C;CAC5C;;CAEA;EACC,YAAY;CACb;;CAEA;EACC,cAAc;EACd,eAAe;EACf,WAAW;EACX,eAAe;CAChB;;CAEA;EACC,4BAAsB;EAAtB,6BAAsB;MAAtB,0BAAsB;UAAtB,sBAAsB;CACvB;;CAEA;EACC,WAAW;EACX,eAAe;EACf,eAAe;EACf,mBAAmB;CACpB;;CAEA;EACC,oBAAoB;CACrB;;CAEA;EACC,4BAAsB;EAAtB,6BAAsB;MAAtB,0BAAsB;UAAtB,sBAAsB;CACvB;;CAEA;EACC,mBAAe;MAAf,eAAe;EACf,4BAAsB;EAAtB,6BAAsB;MAAtB,0BAAsB;UAAtB,sBAAsB;CACvB;;CAEA;EACC,WAAW;EACX,aAAa;CACd;;CAEA;EACC,WAAW;CACZ;;CAEA;;EAEC,kBAAkB;EAClB,MAAM;EACN,YAAY;CACb;;CAEA;;EAEC,WAAW;CACZ;;CAEA;EACC,oBAAoB;EACpB,iBAAiB;CAClB;;AAED;;AAEA;;CAEC;CACA;;CAEA;EACC,WAAW;EACX,WAAW;EACX,kBAAkB;CACnB;;CAEA;EACC,aAAa;CACd;;CAEA;EACC,kBAAkB;CACnB;;CAEA;EACC,cAAc;EACd,WAAW;EACX,SAAS;EACT,mBAAmB;CACpB;;AAED;;AAEA;AACA;;AAEA;;CAEC;EACC,UAAU;CACX;;CAEA;EACC,mBAAmB,EAAE,YAAY;CAClC;;CAEA;EACC,mBAAmB;CACpB;;CAEA;EACC,kBAAkB;CACnB;;CAEA;EACC,iBAAiB;CAClB;;CAEA;EACC,kCAAkC;CACnC;;CAEA;EACC,0BAA0B;CAC3B;;AAED;;AAEA;;CAEC;EACC,WAAW;EACX,YAAY;EACZ,0CAA0C;EAC1C,mBAAmB;CACpB;;CAEA;EACC,kBAAkB;EAClB,gBAAgB;CACjB;;CAEA;EACC,cAAc;CACf;;AAED;;AAEA;;CAEC;EACC,uBAAuB;EACvB,mBAAmB;CACpB;;CAEA;EACC,YAAY;CACb;;AAED;;AAEA;;CAEC;EACC,WAAW;EACX,mBAAmB;CACpB;;CAEA;EACC,WAAW;CACZ;;CAEA;EACC,cAAc;CACf;;CAEA;EACC,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,mBAAe;MAAf,eAAe;CAChB;;CAEA;EACC,cAAc;CACf;;CAEA;EACC,WAAW;EACX,mBAAmB;CACpB;;CAEA;EACC,UAAU;EACV,8BAAsB;UAAtB,sBAAsB;CACvB;;CAEA;EACC,aAAa;CACd;;CAEA;EACC,2BAA2B;EAC3B,iBAAiB;EACjB,WAAW;EACX,cAAc;CACf;;AAED","file":"updraftplus-admin-2-23-7.min.css","sourcesContent":["@keyframes udp_blink {\n\n\tfrom {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n\n\tto {\n\t\topacity: 0.4;\n\t\ttransform: scale(0.85);\n\t}\n\n}\n\n@keyframes udp_rotate {\n\n\tfrom {\n\t\ttransform: rotate(0);\n\t}\n\n\tto {\n\t\ttransform: rotate(360deg);\n\t}\n\n}\n\n/* Widths and sizing */\n.max-width-600 {\n\tmax-width: 600px;\n}\n\n.max-width-700 {\n\tmax-width: 700px;\n}\n\n.width-900 {\n\tmax-width: 900px;\n}\n\n.width-80 {\n\twidth: 80%;\n}\n\n.updraft--flex {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n}\n\n.updraft--flex > * {\n\tflex: 1;\n\tbox-sizing: border-box;\n}\n\n.updraft--flex > .updraft--one-half {\n\twidth: 50%;\n\tflex: auto;\n}\n\n.updraft--flex > .updraft--two-halves {\n\twidth: 100%;\n\tflex: auto;\n}\n\n.updraft-color--very-light-grey {\n\tbackground: #F8F8F8;\n}\n\n/* End widths and sizing */\n\n/* Font styling */\n.no-decoration {\n\ttext-decoration: none;\n}\n\n.bold {\n\tfont-weight: bold;\n}\n\n/* End font styling */\n/* Alignment */\n.center-align-td {\n\ttext-align: center;\n}\n\n/* End of Alignment */\n/* Padding */\n.remove-padding {\n\tpadding: 0 !important;\n}\n\n/* End of padding */\n\n.updraft-text-center {\n\ttext-align: center;\n}\n\n.autobackup {\n\tpadding: 6px;\n\tmargin: 8px 0px;\n}\n\nul .disc {\n\tlist-style: disc inside;\n}\n\n.dashicons-log-fix {\n\tdisplay: inherit;\n}\n\n.udpdraft__lifted {\n\tbox-shadow: 0 1px 1px 0 rgba(0,0,0,.1);\n}\n\n#updraft-wrap a .dashicons {\n\ttext-decoration: none;\n}\n\n.updraft-field-description,\ntable.form-table td p.updraft-field-description {\n\tfont-size: 90%;\n\tline-height: 1.2;\n\tfont-style: italic;\n\tmargin-bottom: 5px;\n}\n\n/* Input boxes */\nlabel.updraft_checkbox {\n\tdisplay: block;\n\tmargin-bottom: 4px;\n\tmargin-left: 26px;\n}\n\nlabel.updraft_checkbox > input[type=checkbox] {\n\tmargin-left: -25px;\n}\n\ndiv[id*=\"updraft_include_\"] {\n\tmargin-bottom: 9px;\n}\n\n/* Input boxes */\n.settings_page_updraftplus input[type=\"file\"] {\n\tborder: none;\n}\n\n.settings_page_updraftplus .wipe_settings {\n\tpadding-bottom: 10px;\n}\n\n.settings_page_updraftplus input[type=\"text\"] {\n\tfont-size: 14px;\n}\n\n.settings_page_updraftplus select {\n\tborder-radius: 4px;\n\tmax-width: 100%;\n}\n\ninput.updraft_input--wide,\ntextarea.updraft_input--wide {\n\tmax-width: 442px;\n\twidth: 100%;\n}\n\n#updraft-wrap .button-large {\n\tfont-size: 1.3em;\n}\n\n/* End input boxes */\n\n/* Main Buttons */\n.main-dashboard-buttons {\n\tborder-width: 4px;\n\tborder-radius: 12px;\n\tletter-spacing: 0px;\n\tfont-size: 17px;\n\tfont-weight: bold;\n\tpadding-left: 0.7em;\n\tpadding-right: 2em;\n\tpadding: 0.3em 1em;\n\tline-height: 1.7em;\n\tbackground: transparent;\n\tposition: relative;\n\tborder: 2px solid;\n\ttransition: all 0.2s;\n\tvertical-align: baseline;\n\tbox-sizing: border-box;\n\ttext-align: center;\n\tline-height: 1.3em;\n\tmargin-left: .3em;\n\ttext-transform: none;\n\tline-height: 1;\n\ttext-decoration: none;\n}\n\n.button-restore {\n\tborder-color: rgb(98, 158, 192);\n\tcolor: rgb(98, 158, 192);\n}\n\n.button-ud-google {\n\ttext-decoration: none !important;\n\ttransition: background-color .3s, box-shadow .3s;\n\tpadding: 12px 16px 12px 42px !important;\n\tborder: none;\n\tborder-radius: 3px;\n\tbox-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 1px 1px rgba(0, 0, 0, .25);\n\tcolor: #757575;\n\tfont-size: 14px;\n\tfont-weight: 500;\n\tfont-family: \"Roboto\";\n\tbackground-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMTcuNiA5LjJsLS4xLTEuOEg5djMuNGg0LjhDMTMuNiAxMiAxMyAxMyAxMiAxMy42djIuMmgzYTguOCA4LjggMCAwIDAgMi42LTYuNnoiIGZpbGw9IiM0Mjg1RjQiIGZpbGwtcnVsZT0ibm9uemVybyIvPjxwYXRoIGQ9Ik05IDE4YzIuNCAwIDQuNS0uOCA2LTIuMmwtMy0yLjJhNS40IDUuNCAwIDAgMS04LTIuOUgxVjEzYTkgOSAwIDAgMCA4IDV6IiBmaWxsPSIjMzRBODUzIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48cGF0aCBkPSJNNCAxMC43YTUuNCA1LjQgMCAwIDEgMC0zLjRWNUgxYTkgOSAwIDAgMCAwIDhsMy0yLjN6IiBmaWxsPSIjRkJCQzA1IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48cGF0aCBkPSJNOSAzLjZjMS4zIDAgMi41LjQgMy40IDEuM0wxNSAyLjNBOSA5IDAgMCAwIDEgNWwzIDIuNGE1LjQgNS40IDAgMCAxIDUtMy43eiIgZmlsbD0iI0VBNDMzNSIgZmlsbC1ydWxlPSJub256ZXJvIi8+PHBhdGggZD0iTTAgMGgxOHYxOEgweiIvPjwvZz48L3N2Zz4=);\n\tbackground-color: #FFF;\n\tbackground-repeat: no-repeat;\n\tbackground-position: 12px 11px;\n}\n\n.button-ud-google:hover {\n\tbox-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 2px 4px rgba(0, 0, 0, .25);\n}\n\n.button-ud-google:active {\n\tbackground-color: #EEE;\n}\n\n.button-ud-google:focus {\n\toutline: none;\n\tbox-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 2px 4px rgba(0, 0, 0, .25), 0 0 0 3px #C8DAFC;\n}\n\n.button-ud-google:disabled {\n\tfilter: grayscale(100%);\n\tbackground-color: #EBEBEB;\n\tbox-shadow: 0 -1px 0 rgba(0, 0, 0, .04), 0 1px 1px rgba(0, 0, 0, .25);\n\tcursor: not-allowed;\n}\n\n.dashboard-main-sizing {\n\tborder-width: 4px;\n\twidth: 190px;\n\tline-height: 1.7em;\n}\n\np.updraftplus-option {\n\tmargin-top: 0;\n\tmargin-bottom: 5px;\n}\n\np.updraftplus-option-inline {\n\tdisplay: inline-block;\n\tpadding-right: 20px;\n}\n\nspan.updraftplus-option-label {\n\tdisplay: block;\n}\n\n/*\n* MIGRATE - CLONE\n*/\n\n#updraft-navtab-migrate-content .postbox {\n\tpadding: 18px;\n}\n\n/* Clone Rows */\n\n.updraftclone-main-row {\n\tdisplay: flex;\n}\n\n.updraftclone-tokens {\n\tbackground: #F5F5F5;\n\tpadding: 20px;\n\tborder-radius: 10px;\n\tmargin-right: 20px;\n\tmax-width: 300px;\n}\n\n.updraftclone-tokens p {\n\tmargin: 0;\n}\n\n.updraftclone_action_box {\n\tbackground: #F5F5F5;\n\tpadding: 20px;\n\tborder-radius: 10px;\n\tflex: 1;\n}\n\n.updraftclone_action_box p:first-child {\n\tmargin-top: 0;\n}\n\n.updraftclone_action_box p:last-child {\n\tmargin-bottom: 0;\n}\n\n.updraftclone_action_box #ud_downloadstatus3 {\n\tmargin-top: 10px;\n}\n\nspan.tokens-number {\n\tfont-size: 46px;\n\tdisplay: block;\n}\n\n/* Clone header button */\n.button.updraft_migrate_widget_temporary_clone_show_stage0 {\n\tdisplay: none;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\theight: 100%;\n\tborder-left: 1px solid #CCC;\n\tpadding-left: 10px;\n\tpadding-right: 10px;\n}\n\n.updraft_migrate_widget_temporary_clone_stage0_container {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.updraft_migrate_widget_temporary_clone_stage0_box {\n\tmargin-right: 20px;\n\twidth: 100%;\n\tflex-basis: 100%;\n}\n\n.updraft_migrate_widget_temporary_clone_stage0_box iframe,\n.updraft_migrate_widget_temporary_clone_stage0_box a.udp-replace-with-iframe--js {\n\tfloat: none;\n}\n\n@media (min-width: 1024px) {\n\n\t.updraft_migrate_widget_temporary_clone_stage0_container {\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t}\n\n\t.updraft_migrate_widget_temporary_clone_stage0_box {\n\t\tflex-basis: 45%;\n\t}\n\n\t.updraft_migrate_widget_temporary_clone_stage0_box iframe,\n\t.updraft_migrate_widget_temporary_clone_stage0_box a.udp-replace-with-iframe--js {\n\t\tfloat: right;\n\t}\n\n}\n\n.updraft_migrate_widget_temporary_clone_show_stage0 .dashicons {\n\ttext-decoration: none;\n\tfont-size: 20px;\n}\n\n.opened .button.updraft_migrate_widget_temporary_clone_show_stage0 {\n\tdisplay: inline-block;\n}\n\n.opened .updraft_migrate_widget_temporary_clone_stage0 {\n\tbackground: #F5F5F5;\n\tpadding: 20px;\n\tborder-radius: 8px;\n\tmargin-bottom: 21px;\n}\n\n/* Clone list table */\n.clone-list {\n\tclear: both;\n\twidth: 100%;\n\tmargin-top: 40px;\n}\n\n.clone-list table {\n\twidth: 100%;\n\ttext-align: left;\n}\n\n.clone-list table tr th {\n\tbackground: #E4E4E4;\n}\n\n.clone-list table tr td {\n\tbackground: #F5F5F5;\n\tword-break: break-word;\n}\n\n.clone-list table tr:nth-child(odd) td {\n\tbackground: #FAFAFA;\n}\n\n.clone-list table td,\n.clone-list table th {\n\tpadding: 6px;\n}\n\n/* Clone Progress */\n.updraftplus-clone .updraft_row {\n\tpadding-left: 0;\n\tpadding-right: 0;\n}\n\nbutton#updraft_migrate_createclone + .updraftplus_spinner {\n\tmargin-top: 13px;\n}\n\n/* Clone - Show step 1 info button */\n.button.button-hero.updraftclone_show_step_1 {\n\twhite-space: normal;\n\theight: auto;\n\tline-height: 14px;\n\tpadding-top: 10px;\n\tpadding-bottom: 10px;\n}\n\n.button.button-hero.updraftclone_show_step_1 span.dashicons {\n\theight: auto;\n}\n\n.updraftplus_clone_status {\n\tcolor: red;\n}\n\n/* MIGRATE */\n\na.updraft_migrate_add_site--trigger span.dashicons {\n\ttext-decoration: none;\n}\n\n.button-restore:hover, .button-migrate:hover, .button-backup:hover,\n.button-view-log:hover, .button-mass-selectors:hover,\n.button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover {\n\tborder-color: #DF6926;\n\tcolor: #DF6926;\n}\n\n.button-migrate {\n\tcolor: rgb(238, 169, 32);\n\tborder-color: rgb(238, 169, 32);\n}\n\n#updraft_migrate_tab_main {\n\tpadding: 8px;\n}\n\n.updraft_migrate_widget_module_content {\n\tbackground: #FFF;\n\tborder-radius: 0;\n\tposition: relative;\n}\n\nbody.js #updraft_migrate .updraft_migrate_widget_module_content {\n\tdisplay: none;\n}\n\n.updraft_migrate_widget_module_content > h3,\ndiv[class*=\"updraft_migrate_widget_temporary_clone_stage\"] > h3 {\n\tmargin-top: 0;\n}\n\n/* Migrate / Clone headers */\n.updraft_migrate_widget_module_content header,\n#updraft_migrate_tab_alt header {\n\tposition: relative;\n\tdisplay: flex;\n\talign-content: center;\n\tjustify-items: center;\n\tmargin-top: -18px;\n\tmargin-left: -18px;\n\tmargin-right: -18px;\n\tmargin-bottom: 15px;\n\tborder-bottom: 1px solid #CCC;\n}\n\n.updraft_migrate_widget_module_content header h3,\n.updraft_migrate_widget_module_content header button.button.close,\n#updraft_migrate_tab_alt header h3,\n#updraft_migrate_tab_alt header button.button.close {\n\tpadding: 10px;\n\tline-height: 20px;\n\theight: auto;\n\tmargin: 0;\n}\n\n.updraft_migrate_widget_module_content button.button.close,\n#updraft_migrate_tab_alt button.button.close {\n\ttext-decoration: none;\n\tpadding-left: 5px;\n\tborder-right: 1px solid #CCC;\n}\n\n.updraft_migrate_widget_module_content button.button.close .dashicons,\n#updraft_migrate_tab_alt button.button.close .dashicons {\n\tmargin-top: 1px;\n}\n\n.updraft_migrate_widget_module_content header h3,\n#updraft_migrate_tab_alt header h3 {\n\tmargin: 0;\n}\n\n.updraft_migrate_intro button.button.button-primary.button-hero {\n\tmax-width: 235px;\n\tword-wrap: normal;\n\twhite-space: normal;\n\tline-height: 1;\n\theight: auto;\n\tpadding-top: 13px;\n\tpadding-bottom: 13px;\n\ttext-align: left;\n\tposition: relative;\n\tmargin-right: 10px;\n\tmargin-bottom: 10px;\n}\n\n.updraft_migrate_intro button.button.button-primary.button-hero .dashicons {\n\tposition: absolute;\n\tleft: 10px;\n\ttop: calc(50% - 8px);\n}\n\n#updraft_migrate_tab_alt #updraft_migrate_send_existing_button {\n\tmargin-right: 6px;\n}\n\n/*\njquery UI Accordion module\n*/\n#updraft_migrate .ui-widget-content a {\n\tcolor: #1C94C4;\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header {\n\tbackground: #F6F6F6;\n\tmargin: 0;\n\tborder-radius: 0;\n\tpadding-left: 0.5em;\n\tpadding-right: 0.7em;\n}\n\n#updraft-wrap .ui-widget {\n\tfont-family: inherit;\n}\n\n.ui-accordion-header .ui-accordion-header-icon.ui-icon-caret-1-w {\n\tbackground-position: -96px 0px;\n}\n\n.ui-accordion-header .ui-accordion-header-icon.ui-icon-caret-1-s {\n\tbackground-position: -64px 0;\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header .ui-accordion-header-icon {\n\tleft: auto;\n\tright: 5px;\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header:focus {\n\toutline: none;\n\tbox-shadow: 0 0 0 1px rgba(91, 157, 217, 0.22), 0 0 2px 1px rgba(30, 140, 190, 0.3);\n\tbackground: #FFF;\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header:focus .dashicons {\n\tcolor: #0572AA;\n\topacity: 1;\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header.ui-state-active {\n\tbackground: #F6F6F6;\n\tborder-bottom: 2px solid #0572AA;\n\tbox-shadow: 1px 6px 12px -5px rgba(0, 0, 0, 0.3);\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header.ui-state-active:focus {\n\tbox-shadow: 1px 6px 12px -5px rgba(0, 0, 0, 0.3), 0 0 0 1px #5B9DD9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header:not(:first-child) {\n\tborder-top: none;\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header .dashicons {\n\topacity: 0.4;\n\tmargin-right: 10px;\n}\n\n#updraft-wrap .ui-accordion .ui-accordion-header:focus {\n\toutline: none;\n\tbox-shadow: 0 0 0 1px #5B9DD9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tz-index: 1;\n}\n\nbutton.ui-dialog-titlebar-close:before {\n\tcontent: none!important;\n}\n\n.updraft_next_scheduled_backups_wrapper {\n\tdisplay: flex;\n\tbackground: #FFF;\n\tjustify-items: center;\n\tflex-wrap: wrap;\n}\n\n.updraft_next_scheduled_backups_wrapper > div {\n\twidth: 50%;\n\tbackground: #FFF;\n\theight: auto;\n\t/* padding: 18px 33px; */\n\tpadding: 33px;\n\tbox-sizing: border-box;\n}\n\n.updraft_backup_btn_wrapper {\n\ttext-align: center;\n\tborder-left: 1px solid #F1F1F1;\n\tjustify-content: center;\n\talign-items: center;\n}\n\n.incremental-backups-only {\n\tdisplay: none;\n}\n\n.incremental-free-only {\n\tdisplay: none;\n}\n\n.incremental-free-only p {\n\tpadding: 5px;\n\tbackground: rgba(255, 0, 0, 0.06);\n\tborder: 1px solid #BFBFBF;\n}\n\n#updraft-delete-waitwarning span.spinner {\n\tvisibility: visible;\n\tfloat: none;\n\tmargin: 0;\n\tmargin-right: 10px;\n}\n\nbutton#updraft-backupnow-button .spinner,\nbutton#updraft-backupnow-button .dashicons-yes {\n\tdisplay: none;\n}\n\nbutton#updraft-backupnow-button.loading .spinner {\n\tdisplay: inline-block;\n\tvisibility: visible;\n\tmargin-top: 13px;\n\tmargin-right: 0;\n}\n\nbutton#updraft-backupnow-button.loading {\n\tbackground-color: #EFEFEF;\n\tborder-color: #CCC;\n\ttext-shadow: 0 -1px 1px #BBC3C7, 1px 0 1px #BBC3C7, 0 1px 1px #BBC3C7, -1px 0 1px #BBC3C7;\n\tbox-shadow: none;\n}\n\nbutton#updraft-backupnow-button.finished .dashicons-yes {\n\tdisplay: inline-block;\n\tvisibility: visible;\n\tfont-size: 42px;\n\tmargin-right: 0;\n\tmargin-top: 2px;\n}\n\n.updraft_next_scheduled_entity {\n\twidth: 50%;\n\tdisplay: inline-block;\n\tfloat: left;\n\t/*\n\tpadding: 20px 20px 10px 20px;\n\t*/\n}\n\n.updraft_next_scheduled_entity .dashicons {\n\tcolor: #CCC;\n\tfont-size: 20px;\n}\n\n.updraft_next_scheduled_entity strong {\n\tfont-size: 20px;\n}\n\n.updraft_next_scheduled_heading {\n\tmargin-bottom: 10px;\n}\n\n.updraft_next_scheduled_date_time {\n\tcolor: #46A84B;\n}\n\n.updraft_time_now_wrapper {\n\tmargin-top: 68px;\n\twidth: 100%;\n}\n\n.updraft_time_now_label, .updraft_time_now {\n\tdisplay: inline-block;\n\tpadding: 7px;\n}\n\n.updraft_time_now_label {\n\tbackground: #B7B7B7;\n\tborder-top-left-radius: 4px;\n\tborder-bottom-left-radius: 4px;\n\tcolor: #FFF;\n\tmargin-right: 0;\n\ttext-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);\n}\n\n.updraft_time_now {\n\tbackground: #F1F1F1;\n\tborder-top-right-radius: 4px;\n\tborder-bottom-right-radius: 4px;\n\tmargin-left: -3px;\n}\n\n#updraft_lastlogmessagerow {\n\tmargin: 6px 0;\n}\n\n#updraft_lastlogmessagerow {\n\tclear: both;\n\tpadding: 0.25px 0;\n}\n\n#updraft_lastlogmessagerow .updraft-log-link {\n\tfloat: right;\n\tmargin-top: -2.5em;\n\tmargin-right: 2px;\n}\n\n#updraft_lastlogmessagerow > div {\n\tclear: both;\n\tbackground: #FFF;\n\tpadding: 18px;\n}\n\n#updraft_activejobs_table {\n\toverflow: hidden;\n\twidth: 100%;\n\tbackground: #FAFAFA;\n\tpadding: 0;\n}\n\n.updraft_requeststart {\n\tpadding: 15px 33px;\n\ttext-align: center;\n}\n\n.updraft_requeststart .spinner {\n\tvisibility: visible;\n\tfloat: none;\n\tvertical-align: middle;\n\tmargin-top: -2px;\n}\n\na.updraft_jobinfo_delete.disabled {\n\topacity: 0.4;\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n\n.updraft_row {\n\tclear: both;\n\ttransition: 0.3s all;\n\tpadding: 15px 33px;\n}\n\n.updraft_row.deleting {\n\topacity: 0.4;\n}\n\n.updraft_progress_container {\n\t/* width: 83%; */\n}\n\n.updraft_existing_backups_count {\n\tpadding: 2px 8px;\n\tfont-size: 12px;\n\tbackground: #CA4A1E;\n\tcolor: #FFF;\n\tfont-weight: bold;\n\tborder-radius: 10px;\n}\n\n.form-table .existing-backups-table input[type=\"checkbox\"] {\n\tborder-radius: 0;\n}\n\n.form-table .existing-backups-table .check-column {\n\twidth: 40px;\n\tpadding: 0;\n\tpadding-top: 8px;\n}\n\n.existing-backups-buttons {\n\tfont-size: 11px;\n\tline-height: 1.4em;\n\tborder-width: 3px;\n}\n\n.existing-backups-restore-buttons {\n\tfont-size: 11px;\n\tline-height: 1.4em;\n\tborder-width: 3px;\n}\n\n.button-delete {\n\tcolor: #E23900;\n\tborder-color: #E23900;\n\tfont-size: 14px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\tmargin-right: 10px;\n}\n\n.button-view-log, .button-mass-selectors {\n\tcolor: darkgrey;\n\tborder-color: darkgrey;\n\tfont-size: 14px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\tmargin-top: -1px;\n}\n\n.button-view-log {\n\twidth: 120px;\n}\n\n.button-existing-restore {\n\tfont-size: 14px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\twidth: 110px;\n}\n\n.main-restore {\n\tmargin-right: 3%;\n\tmargin-left: 3%;\n}\n\n.button-entity-backup {\n\tcolor: #555;\n\tborder-color: #555;\n\tfont-size: 11px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\tmargin-right: 5px;\n}\n\n.button-select-all {\n\twidth: 122px;\n}\n\n.button-deselect {\n\twidth: 92px;\n}\n\n#ud_massactions > .display-flex > .mass-selectors-margins, #updraft-delete-waitwarning > .display-flex > .mass-selectors-margins {\n\tmargin-right: -4px;\n}\n\n.udp-button-primary {\n\tborder-width: 4px;\n\tcolor: #0073AA;\n\tborder-color: #0073AA;\n\tfont-size: 14px;\n\theight: 40px;\n}\n\n#ud_massactions .button-delete {\n\tmargin-right: 0px;\n}\n\n.stored_local {\n\tborder-radius: 5px;\n\tbackground-color: #007FE7;\n\tpadding: 3px 5px 5px 5px;\n\tcolor: #FFF;\n\tfont-size: 75%;\n}\n\nspan#updraft_lastlogcontainer {\n\tword-break: break-all;\n}\n\n.stored_icon {\n\theight: 1.3em;\n\tposition: relative;\n\ttop: 0.2em;\n}\n\n.backup_date_label > * {\n\tvertical-align: middle;\n}\n\n.backup_date_label .dashicons {\n\tfont-size: 18px;\n}\n\n.backup_date_label .clear-right {\n\tclear: right;\n}\n\n.existing-backups-table .backup_date_label > div, .existing-backups-table .backup_date_label span > div {\n\tfont-weight: bold;\n}\n\n/* End Main Buttons */\n\n/* End of common elements */\n\n.udp-logo-70 {\n\twidth: 70px;\n\theight: 70px;\n\tfloat: left;\n\tpadding-right: 25px;\n}\n\nh3 .thank-you {\n\tmargin-top: 0px;\n}\n\n.ws_advert {\n\tmax-width: 800px;\n\tfont-size: 140%;\n\tline-height: 140%;\n\tpadding: 14px;\n\tclear: left;\n}\n\n.dismiss-dash-notice {\n\tfloat: right;\n\tposition: relative;\n\ttop: -20px;\n}\n\n.updraft_exclude_container,\n.updraft_include_container {\n\tmargin-left: 24px;\n\tmargin-top: 5px;\n\tmargin-bottom: 10px;\n\tpadding: 15px;\n\tborder: 1px solid #DDD;\n}\n\nlabel.updraft-exclude-label {\n\tfont-weight: 500;\n\tmargin-bottom: 5px;\n\tdisplay: inline-block;\n}\n\n.updraft_add_exclude_item,\n#updraft_include_more_paths_another {\n\tdisplay: inline-block;\n\tmargin-top: 10px;\n}\n\ninput.updraft_exclude_entity_field,\n.form-table td input.updraft_exclude_entity_field,\n.updraftplus-morefiles-row input[type=text] {\n\twidth: calc(100% - 70px);\n\tmax-width: 400px;\n}\n\n.updraft-fs-italic {\n\tfont-style: italic;\n}\n\n@media screen and (max-width: 782px) {\n\n\t.form-table td input.updraft_exclude_entity_field,\n\t.form-table td .updraftplus-morefiles-row input[type=text] {\n\t\tdisplay: inline-block;\n\t}\n\n}\n\n.updraft_exclude_entity_delete.dashicons, .updraft_exclude_entity_edit.dashicons, .updraft_exclude_entity_update.dashicons, .updraftplus-morefiles-row a.dashicons {\n\tmargin-top: 2px;\n\tfont-size: 20px;\n\tbox-shadow: none;\n\tline-height: 1;\n\tpadding: 3px;\n\tmargin-right: 4px;\n}\n\n.updraft_exclude_entity_delete,\n.updraft_exclude_entity_delete:hover,\n.updraftplus-morefiles-row-delete {\n\tcolor: #FF6347;\n}\n\n.updraft_exclude_entity_update.dashicons, .updraft_exclude_entity_update.dashicons:hover {\n\tcolor: #008000;\n\tfont-weight: bold;\n\tfont-size: 22px;\n\tmargin-left: 4px;\n}\n\n.updraft_exclude_entity_edit {\n\tmargin-left: 4px;\n}\n\n.updraft_exclude_entity_update.is-active ~ .updraft_exclude_entity_delete {\n\tdisplay: none;\n}\n\n.updraft-exclude-panel-heading {\n\tmargin-bottom: 8px;\n}\n\n.updraft-exclude-panel-heading h3 {\n\tmargin: 0.5em 0 0.5em 0;\n}\n\n.updraft-exclude-submit.button-primary {\n\tmargin-top: 5px;\n}\n\n.updraft_exclude_actions_list {\n\tfont-weight: bold;\n}\n\n.updraft-exclude-link {\n\tcursor: pointer;\n}\n\n#updraft_include_more_options {\n\tpadding-left: 25px;\n}\n\n#updraft_report_cell .updraft_reportbox,\n.updraft_small_box {\n\tpadding: 12px;\n\tmargin: 8px 0;\n\tborder: 1px solid #CCC;\n\tposition: relative;\n}\n\n#updraft_report_cell button.updraft_reportbox_delete,\n.updraft_box_delete_button,\n.updraft_small_box .updraft_box_delete_button {\n\tpadding: 4px;\n\tpadding-top: 6px;\n\tborder: none;\n\tbackground: transparent;\n\tposition: absolute;\n\ttop: 4px;\n\tright: 4px;\n\tcursor: pointer;\n}\n\n#updraft_report_cell button.updraft_reportbox_delete:hover {\n\tcolor: #DE3C3C;\n}\n\na.updraft_report_another .dashicons {\n\ttext-decoration: none;\n\tmargin-top: 2px;\n}\n\n.updraft_report_dbbackup.updraft_report_disabled {\n\tcolor: #CCC;\n}\n\n#updraft-navtab-settings-content .updraft-test-button {\n\tfont-size: 18px !important;\n}\n\n#updraft_report_cell .updraft_report_email {\n\tdisplay: block;\n\twidth: calc(100% - 50px);\n\tmargin-bottom: 9px;\n}\n\n#updraft_report_cell .updraft_report_another_p {\n\tclear: left;\n}\n\n/* Taken straight from admin.php */\n\n#updraft-navtab-settings-content table.form-table p {\n\tmax-width: 700px;\n}\n\n#updraft-navtab-settings-content table.form-table .notice p {\n\tmax-width: none;\n}\n\n#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected,\n#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected td {\n\tbackground-color: #EFEFEF;\n}\n\n#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected:nth-child(even) td {\n\tbackground-color: #E8E8E8;\n}\n\n.updraft_settings_sectionheading {\n\tdisplay: none;\n}\n\n.updraft-backupentitybutton-disabled {\n\tbackground-color: transparent;\n\tborder: none;\n\tcolor: #0074A2;\n\ttext-decoration: underline;\n\tcursor: pointer;\n\tclear: none;\n\tfloat: left;\n}\n\n.updraft-backupentitybutton {\n\tmargin-left: 8px;\n}\n\n.updraft-bigbutton {\n\tpadding: 2px 0px !important;\n\tmargin-right: 14px !important;\n\tfont-size: 22px !important;\n\tmin-height: 32px;\n\tmin-width: 180px;\n}\n\ntr[class*=\"_updraft_remote_storage_border\"] {\n\tborder-top: 1px solid #CCC;\n}\n\n.updraft_multi_storage_options {\n\tfloat: right;\n\tclear: right;\n\tmargin-bottom: 5px !important;\n}\n\n.updraft_toggle_instance_label {\n\tvertical-align: top !important;\n}\n\n.updraft_debugrow th {\n\tfloat: right;\n\ttext-align: right;\n\tfont-weight: bold;\n\tpadding-right: 8px;\n\tmin-width: 140px;\n}\n\n.updraft_debugrow td {\n\tmin-width: 300px;\n\tvertical-align: bottom;\n}\n\n.updraft_webdav_host_error, .onedrive_folder_error {\n\tcolor: red;\n}\n\nlabel[for=updraft_servicecheckbox_updraftvault] {\n\tposition: relative;\n}\n\n#updraft-wrap .udp-info {\n\tposition: absolute;\n\tright: 10px;\n\ttop: calc(50% - 10px);\n}\n\n#updraft-wrap span.info-trigger {\n\tdisplay: inline-block;\n\twidth: 20px;\n\theight: 20px;\n\tbackground: #FFF;\n\tcolor: #72777C;\n\tborder-radius: 30px;\n\ttext-align: center;\n\tline-height: 20px;\n\tbox-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n#updraft-wrap .info-content-wrapper {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: 20px;\n\ttransform: translatex(calc(-50% + 10px));\n\twidth: 330px;\n\tpadding-bottom: 10px;\n}\n\n#updraft-wrap .info-content-wrapper::before {\n\tcontent: '';\n\tposition: absolute;\n\tbottom: -10px;\n\tborder: 10px solid transparent;\n\tborder-top-color: #FFF;\n\tleft: calc(50% - 10px);\n}\n\n#updraft-wrap .info-content {\n\tpadding: 20px;\n\tbackground: #FFF;\n\tborder-radius: 4px;\n\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);\n\tcolor: #72777C;\n}\n\n#updraft-wrap .info-content h3 {\n\tmargin-top: 0;\n}\n\n#updraft-wrap .info-content p {\n\tmargin-top: 10px;\n}\n\n#updraft-wrap .udp-info:hover .info-content-wrapper {\n\tdisplay: block;\n}\n\ndiv.conditional_remote_backup select.logic_type {\n\tvertical-align: inherit !important;\n}\n\ndiv.conditional_remote_backup label.updraft_toggle_instance_label.radio_group {\n\tdisplay: block;\n\tmargin-top: 7px;\n}\n\ndiv.conditional_remote_backup div.logic ul.rules input.rule_value {\n\tvertical-align: middle;\n}\n\ndiv.conditional_remote_backup p {\n\tmargin-bottom: 10px;\n}\n\ndiv.conditional_remote_backup div.logic ul.rules span svg {\n\twidth: 20px;\n\tvertical-align: middle;\n\tcursor: pointer;\n}\n\ndiv.conditional_remote_backup div.logic ul.rules span svg {\n\tmargin-left: 3px;\n}\n\ndiv.conditional_remote_backup div.logic select.logic_type {\n\tvertical-align: unset;\n}\n\n/* jstree styles */\n\n/* these styles hide the dots from the parent but keep the arrows */\n.updraft_jstree .jstree-container-ul > .jstree-node,\ndiv[id^=\"updraft_more_files_jstree_\"] .jstree-container-ul > .jstree-node {\n\tbackground: transparent;\n}\n\n.updraft_jstree .jstree-container-ul > .jstree-open > .jstree-ocl,\ndiv[id^=\"updraft_more_files_jstree_\"] .jstree-container-ul > .jstree-open > .jstree-ocl {\n\tbackground-position: -36px -4px;\n}\n\n.updraft_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl,\ndiv[id^=\"updraft_more_files_jstree_\"] .jstree-container-ul > .jstree-closed> .jstree-ocl {\n\tbackground-position: -4px -4px;\n}\n\n.updraft_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl,\ndiv[id^=\"updraft_more_files_jstree_\"] .jstree-container-ul > .jstree-leaf> .jstree-ocl {\n\tbackground: transparent;\n}\n\n/* zip browser jstree styles */\n#updraft_zip_files_container {\n\tposition: relative;\n\theight: 450px;\n\toverflow: none;\n}\n\n.updraft_jstree_info_container {\n\tposition: relative;\n\theight: auto;\n\twidth: 100%;\n\tborder: 1px dotted;\n\tmargin-bottom: 5px;\n}\n\n.updraft_jstree_info_container p {\n\tmargin: 1px;\n\tpadding-left: 10px;\n\tfont-size: 14px;\n}\n\n#updraft_zip_download_item {\n\tdisplay: none;\n\tcolor: #0073AA;\n\tpadding-left: 10px;\n}\n\n#updraft_zip_download_notice {\n\tpadding-left: 10px;\n}\n\n#updraft_exclude_files_folders_jstree, #updraft_exclude_files_folders_wildcards_jstree {\n\tmax-height: 200px;\n\toverflow-y: scroll;\n}\n\n.updraft_jstree {\n\tposition: relative;\n\tborder: 1px dotted;\n\theight: 80%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n/* More files jstree styles */\ndiv[id^=\"updraft_more_files_container_\"] {\n\tposition: relative;\n\tdisplay: none;\n\twidth: 100%;\n\tborder: 1px solid #CCC;\n\tbackground: #FAFAFA;\n\tmargin-bottom: 5px;\n\tmargin-top: 4px;\n\tbox-shadow: 0 5px 8px rgba(0, 0, 0, 0.1);\n}\n\ndiv[id^=\"updraft_more_files_container_\"]::before {\n\tcontent: ' ';\n\twidth: 11px;\n\theight: 11px;\n\tdisplay: block;\n\tbackground: #FAFAFA;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 20px;\n\tborder-top: 1px solid #CCC;\n\tborder-left: 1px solid #CCC;\n\ttransform: translatey(-7px) rotate(45deg);\n}\n\ninput.updraft_more_path_editing {\n\tborder-color: #0285BA;\n}\n\ninput.updraft_more_path_editing ~ a.dashicons {\n\tdisplay: none;\n}\n\ndiv[id^=\"updraft_jstree_buttons_\"] {\n\tpadding: 10px;\n\tbackground: #E6E6E6;\n}\n\ndiv[id^=\"updraft_jstree_container_\"] {\n\theight: 300px;\n\twidth: 100%;\n\toverflow: auto;\n}\n\ndiv[id^=\"updraft_more_files_container_\"] button {\n\tline-height: 20px;\n}\n\nbutton[id^=\"updraft_parent_directory_\"] {\n\tmargin: 10px 10px 4px 10px;\n\tpadding-left: 3px;\n}\n\nbutton[id^=\"updraft_jstree_confirm_\"], button[id^=\"updraft_jstree_cancel_\"] {\n\tdisplay: none;\n}\n\ninput[id^=\"updraft_include_more_path_restore_\"] {\n\ttext-align: right;\n}\n\n.updraftplus-morefiles-row-delete,\n.updraftplus-morefiles-row-edit {\n\tcursor: pointer;\n}\n\n#updraft_include_more_paths_error {\n\tcolor: #DE3C3C;\n}\n\np[id^=\"updraftplus_manual_authentication_error_\"] {\n\tcolor: #DE3C3C;\n}\n\n#updraft-wrap .form-table th {\n\twidth: 230px;\n}\n\n#updraft-wrap .form-table .existing-backups-table th {\n\twidth: auto;\n}\n\n.updraft-viewlogdiv form {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.updraft-viewlogdiv {\n\tdisplay: inline-block;\n}\n\n.updraft-viewlogdiv input, .updraft-viewlogdiv a {\n\tborder: none;\n\tbackground-color: transparent;\n\tcolor: #000;\n\tmargin: 0px;\n\tpadding: 3px 4px;\n\tfont-size: 16px;\n\tline-height: 26px;\n}\n\n.updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover {\n\tcolor: #FFF;\n\tcursor: pointer;\n}\n\n.button.button-remove {\n\tcolor: white;\n\tbackground-color: #DE3C3C;\n\tborder-color: #C00000;\n\tbox-shadow: 0 1px 0 #C10100;\n}\n\n.button.button-remove:hover,\n.button.button-remove:focus {\n\tborder-color: #C00;\n\tcolor: #FFF;\n\tbackground: #C00;\n}\n\n/* button-remove colors for midnight admin theme */\nbody.admin-color-midnight .button.button-remove {\n\tcolor: #DE3C3C;\n\tbackground-color: #F7F7F7;\n\tborder-color: #CCC;\n\tbox-shadow: 0 1px 0 #CCC;\n}\n\nbody.admin-color-midnight .button.button-remove:hover, body.admin-color-midnight .button.button-remove:focus {\n\tborder-color: #BA281F;\n}\n\nbody.admin-color-midnight .button.button-remove:focus {\n\tbox-shadow: inherit;\n\tbox-shadow: 0 0 3px rgba(0, 115, 170, 0.8);\n}\n\n.drag-drop #drag-drop-area2 {\n\tborder: 4px dashed #DDD;\n\theight: 200px;\n}\n\n#drag-drop-area2 .drag-drop-inside {\n\tmargin: 36px auto 0;\n\twidth: 350px;\n}\n\n#filelist, #filelist2 {\n\tmargin-top: 30px;\n\twidth: 100%;\n}\n\n#filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file, #ud_downloadstatus3 .file {\n\tpadding: 1px;\n\tbackground: #ECECEC;\n\tborder: solid 1px #CCC;\n\tmargin: 4px 0;\n}\n\n.updraft_premium section {\n\tmargin-bottom: 20px;\n}\n\n/*\n\tCall to action Premium\n*/\n.updraft_premium_cta {\n\tbackground: #FFF;\n\tmargin-top: 30px;\n\tpadding: 0;\n\tborder-left: 4px solid #DB6A03;\n}\n\n.updraft_premium_cta a {\n\tfont-weight: normal;\n}\n\n.updraft_premium_cta__action {\n\tposition: relative;\n\ttext-align: center;\n}\n\n.updraft_premium_cta a.button.button-primary.button-hero {\n\tfont-size: 1.3em;\n\tletter-spacing: 0.03rem;\n\ttext-transform: uppercase;\n\tmargin-bottom: 7px;\n}\n\n.updraft_premium_cta a.button.button-primary.button-hero + small {\n\tdisplay: block;\n\tmax-width: 100%;\n\ttext-align: center;\n\tcolor: #AFAFAF;\n}\n\n.updraft_premium_cta a.button.button-primary.button-hero + small .dashicons {\n\twidth: 12px;\n\theight: 12px;\n}\n\n.updraft_premium_cta__top {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 18px 30px;\n}\n\n.updraft_premium_cta__bottom {\n\tbackground: #F9F9F9;\n\tpadding: 5px 30px;\n}\n\n.updraft_premium_cta__summary {\n\tmargin-right: 60px;\n}\n\n.updraft_premium_cta h2 {\n\tfont-size: 28px;\n\tfont-weight: 200;\n\tline-height: 1;\n\tmargin: 0;\n\tmargin-bottom: 5px;\n\tletter-spacing: 0.05rem;\n\tcolor: #DB6A03;\n}\n\n.updraft_premium_cta ul li::after {\n\tcolor: #CCC;\n}\n\n@media only screen and (max-width: 768px) {\n\n\t.updraft_premium_cta__top {\n\t\tflex-direction: column;\n\t\ttext-align: center;\n\t\talign-items: center;\n\t}\n\n\t.updraft_premium_cta__summary {\n\t\tmargin-right: 0;\n\t\tmargin-bottom: 30px;\n\t}\n\n}\n\n/*\n\tBox\n*/\n.udp-box {\n\tbackground: #FFF;\n\tpadding: 20px;\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n\ttext-align: center;\n}\n\n.udp-box h3 {\n\tmargin: 0;\n}\n\n.udp-box__heading {\n\talign-self: center;\n\tbackground: none;\n\tbox-shadow: none;\n}\n\n/*\n\tOther Plugins\n*/\n.updraft-more-plugins {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\tjustify-content: space-between;\n\tflex-wrap: wrap;\n}\n\n.updraft-more-plugins img {\n\tmax-width: 80%;\n\tmax-height: 30%;\n\tdisplay: inline-block;\n}\n\n.updraft-more-plugins .udp-box {\n\tbox-sizing: border-box;\n\twidth: 24%;\n}\n\n.updraft-more-plugins .udp-box p:last-child {\n\tmargin-bottom: 0;\n\tpadding-bottom: 0;\n}\n\n/*\n\tlinks list\n*/\n.updraft_premium_description_list {\n\ttext-align: left;\n\tmargin: 0;\n\tfont-size: 12px;\n}\n\nul.updraft_premium_description_list, ul#updraft_restore_warnings {\n\tlist-style: disc inside;\n}\n\nul.updraft_premium_description_list li {\n\tdisplay: inline;\n}\n\nul.updraft_premium_description_list li::after {\n\tcontent: \" | \";\n}\n\nul.updraft_premium_description_list li:last-child::after {\n\tcontent: \"\";\n}\n\n.updraft_feature_cell {\n\tbackground-color: #F7D9C9 !important;\n\tpadding: 5px 10px;\n}\n\n.updraftplus_com_login_status, .updraftplus_com_key_status {\n\tdisplay: none;\n\tbackground: #FFF;\n\tborder-left: 4px solid #FFF;\n\tborder-left-color: #DC3232;\n\tbox-shadow: 0 1px 1px 0 rgba(0,0,0,.1);\n\tmargin: 5px 0 15px 0;\n\tpadding: 5px 12px;\n}\n\n.updraftplus_com_login_status.success {\n\tborder-left-color: green;\n}\n\n#updraft-wrap strong.success {\n\tcolor: green;\n}\n\n.updraft_feat_table {\n\tborder: none;\n\tborder-collapse: collapse;\n\tfont-size: 120%;\n\tbackground-color: white;\n\ttext-align: center;\n}\n\n.updraft_feat_th, .updraft_feat_table td {\n\tborder: 1px solid #F1F1F1;\n\tborder-collapse: collapse;\n\tfont-size: 120%;\n\tbackground-color: white;\n\ttext-align: center;\n\tpadding: 15px;\n}\n\n.updraft_feat_table td {\n\tborder-bottom-width: 4px;\n}\n\n.updraft_feat_table td:first-child {\n\tborder-left: none;\n}\n\n.updraft_feat_table td:last-child {\n\tborder-right: none;\n}\n\n.updraft_feat_table tr:last-child td {\n\tborder-bottom: none;\n}\n\n.updraft_feat_table td:nth-child(2),\n.updraft_feat_table td:nth-child(3) {\n\tbackground-color: rgba(241, 241, 241, 0.38);\n\twidth: 190px;\n}\n\n.updraft_feat_table__header td img {\n\tdisplay: block;\n\tmargin: 0 auto;\n}\n\n.updraft_feat_table__header td {\n\ttext-align: center;\n}\n\n.updraft_feat_table .installed {\n\tfont-size: 14px;\n}\n\n.updraft_feat_table p {\n\tpadding: 0px 10px;\n\tmargin: 5px 0px;\n\tfont-size: 13px;\n}\n\n.updraft_feat_table h4 {\n\tmargin: 5px 0px;\n}\n\n.updraft_feat_table .dashicons {\n\twidth: 25px;\n\theight: 25px;\n\tfont-size: 25px;\n\tline-height: 1;\n}\n\n.updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes {\n\tcolor: green;\n}\n\n.updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no {\n\tcolor: red;\n}\n\n.updraft_tick_cell {\n\ttext-align: center;\n}\n\n.updraft_tick_cell img {\n\tmargin: 4px 0;\n\theight: 24px;\n}\n\n.ud_downloadstatus__close {\n\tborder: none;\n\tbackground: transparent;\n\twidth: auto;\n\tfont-size: 20px;\n\tpadding: 0;\n\tcursor: pointer;\n}\n\n#filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress, #ud_downloadstatus3 .dlfileprogress {\n\twidth: 0%;\n\tbackground: #0572AA;\n\theight: 8px;\n\ttransition: width .3s;\n}\n\n.ud_downloadstatus .raw, #ud_downloadstatus2 .raw, #ud_downloadstatus3 .raw {\n\tmargin-top: 8px;\n\tclear: left;\n}\n\n.ud_downloadstatus .file, #ud_downloadstatus2 .file, #ud_downloadstatus3 .file {\n\tmargin-top: 8px;\n}\n\ndiv[class^=\"updraftplus_downloader_container_\"] {\n\tpadding: 10px;\n}\n\ntr.updraftplusmethod h3 {\n\tmargin: 0px;\n}\n\ntr.updraftplusmethod img {\n\tmax-width: 100%;\n}\n\n#updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete {\n\tcursor: pointer;\n\tcolor: red;\n\tfont-size: 120%;\n\tfont-weight: bold;\n\tborder: 0px;\n\tborder-radius: 3px;\n\tpadding: 2px;\n\tmargin: 0 6px;\n\ttext-decoration: none;\n\tdisplay: inline-block;\n}\n\n#updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover {\n\tcursor: pointer;\n\tcolor: white;\n\tbackground: red;\n}\n\n#updraft_backup_started {\n\tmax-width: 800px;\n\tfont-size: 140%;\n\tline-height: 140%;\n\tpadding: 14px;\n\tclear: left;\n}\n\n/* backup finished */\n.blockUI.blockOverlay.ui-widget-overlay {\n\tbackground: #000;\n}\n\n.updraft_success_popup {\n\ttext-align: center;\n\tpadding-bottom: 30px;\n}\n\n.updraft_success_popup > .dashicons {\n\tfont-size: 100px;\n\twidth: 100px;\n\theight: 100px;\n\tline-height: 100px;\n\tpadding: 0px;\n\tborder-radius: 50%;\n\tmargin-top: 30px;\n\tdisplay: block;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tbackground: #E2E6E5;\n}\n\n.updraft_success_popup > .dashicons.dashicons-yes {\n\ttext-indent: -5px;\n}\n\n.updraft_success_popup.success > .dashicons {\n\tcolor: green;\n}\n\n.updraft_success_popup.warning > .dashicons {\n\tcolor: #888;\n}\n\n.updraft_success_popup--message {\n\tpadding: 20px;\n}\n\n.button.updraft-close-overlay .dashicons {\n\ttext-decoration: none;\n\tfont-size: 20px;\n\tmargin-left: -5px;\n\tpadding: 0;\n\ttransform: translatey(3px);\n}\n\n.updraft_saving_popup img {\n\tanimation-name: udp_blink;\n\tanimation-duration: 610ms;\n\tanimation-iteration-count: infinite;\n\tanimation-direction: alternate;\n\tanimation-timing-function: ease-out;\n}\n\n.udp-premium-image {\n\tdisplay: none;\n}\n\n@media screen and (min-width: 720px) {\n\n\t.udp-premium-image {\n\t\tdisplay: block;\n\t\tfloat: left;\n\t\tpadding-right: 5px;\n\t}\n\n}\n\n/* End stuff already in admin.php */\n#plupload-upload-ui2 {\n\twidth: 80%;\n}\n\n.backup-restored {\n\tpadding: 8px;\n}\n\n.updated.backup-restored {\n\tpadding-top: 15px;\n\tpadding-bottom: 15px;\n}\n\n.backup-restored span {\n\tfont-size: 120%;\n}\n\n.memory-limit {\n\tpadding: 8px;\n}\n\n.updraft_list_errors {\n\tpadding: 8px;\n}\n\n/*.nav-tab {\n\tborder-radius: 20px 20px 0 0;\n\tborder-color: grey;\n\tborder-width: 2px;\n\tmargin-top: 34px;\n}\n\n.nav-tab:hover {\n\tborder-bottom: 0;\n}\n\n.nav-tab-active, .nav-tab-active:active {\n\tcolor: #df6926;\n\tborder-color: #D3D3D3;\n\tborder-width: 1px;\n\tborder-bottom: 0;\n}\n\n.nav-tab-active:focus {\n\tcolor: #df6926;\n}*/\n\n.nav-tab-wrapper {\n\tmargin: 14px 0px;\n}\n\n#updraft-poplog-content {\n\twhite-space: pre-wrap;\n}\n\n.next-backup {\n\tborder: 0px;\n\tpadding: 0px;\n\tmargin: 0 10px 0 0;\n}\n\n.not-scheduled {\n\tvertical-align: top !important;\n\tmargin: 0px !important;\n\tpadding: 0px !important;\n}\n\n.next-backup .updraft_scheduled {\n\t/* width: 124px;*/\n\tmargin: 0px;\n\tpadding: 2px 4px 2px 0px;\n}\n\n#next-backup-table-inner td {\n\tvertical-align: top;\n}\n\n.updraft_all-files {\n\tcolor: blue;\n}\n\n.multisite-advert-width {\n\twidth: 800px;\n}\n\n.updraft_settings_sectionheading {\n\tmargin-top: 6px;\n}\n\n.premium-upgrade-prompt {\n\t/* font-size: 115%; */\n}\n\nsection.premium-upgrade-purchase-success {\n\tpadding: 2em;\n\tbackground: #FAFAFA;\n\ttext-align: center;\n\tbox-shadow: 0px 14px 40px rgba(0, 0, 0, 0.1);\n}\n\nsection.premium-upgrade-purchase-success h3 {\n\tfont-size: 2em;\n\tcolor: green;\n}\n\nsection.premium-upgrade-purchase-success h3 .dashicons {\n\tdisplay: block;\n\tmargin: 0 auto;\n\tfont-size: 60px;\n\twidth: 60px;\n\theight: 60px;\n\tborder-radius: 50%;\n\tbackground: green;\n\tcolor: #FFF;\n\tmargin-bottom: 20px;\n}\n\nsection.premium-upgrade-purchase-success h3 .dashicons::before {\n\tdisplay: inline-block;\n\tmargin-left: -4px;\n\tmargin-top: 2px;\n}\n\nsection.premium-upgrade-purchase-success p {\n\tfont-size: 120%;\n}\n\n.show_admin_restore_in_progress_notice {\n\tpadding: 8px;\n}\n\n.show_admin_restore_in_progress_notice .unfinished-restoration {\n\tfont-size: 120%;\n}\n\n#backupnow_includefiles_moreoptions, #backupnow_database_moreoptions, #backupnow_includecloud_moreoptions {\n\tmargin: 4px 16px 6px 16px;\n\tborder: 1px dotted;\n\tpadding: 6px 10px;\n}\n\n#backupnow_database_moreoptions {\n\tmax-height: 250px;\n\toverflow: auto;\n}\n\n#backupnow_database_moreoptions div.backupnow-db-tables {\n\tmargin-bottom: 5px;\n}\n\n#backupnow_database_moreoptions div.backupnow-db-tables > a {\n\tcolor: #0073AA;\n}\n\n.form-table #updraft_activejobsrow .minimum-height {\n\tmin-height: 100px;\n}\n\n#updraft_activejobsrow th {\n\tmax-width: 112px;\n\tmargin: 0;\n\tpadding: 13px 0 0 0;\n}\n\n#updraft_lastlogmessagerow .last-message {\n\tpadding-top: 20px;\n\tdisplay: block;\n}\n\n.updraft_simplepie {\n\tvertical-align: top;\n}\n\n.download-backups {\n\tmargin-top: 8px;\n}\n\n.download-backups .updraft_download_button {\n\tmargin-right: 6px;\n}\n\n.download-backups .ud-whitespace-warning, .download-backups .ud-bom-warning {\n\tbackground-color: pink;\n\tpadding: 8px;\n\tmargin: 4px;\n\tborder: 1px dotted;\n}\n\n.download-backups .ul {\n\tlist-style: none inside;\n\tmax-width: 800px;\n\tmargin-top: 6px;\n\tmargin-bottom: 12px;\n}\n\n#updraft-plupload-modal {\n\tmargin: 16px 0;\n}\n\n.download-backups .upload {\n\tmax-width: 610px;\n}\n\n.download-backups #plupload-upload-ui {\n\twidth: 100%;\n}\n\n.ud_downloadstatus {\n\tpadding: 10px 0;\n}\n\n#ud_massactions, #updraft-delete-waitwarning {\n\tpadding: 14px;\n\tbackground: rgb(241, 241, 241);\n\tposition: absolute;\n\tleft: 0;\n\ttop: 100%;\n}\n\n#ud_massactions > *, #updraft-delete-waitwarning > * {\n\tvertical-align: middle;\n}\n\n#ud_massactions .updraftplus-remove {\n\tdisplay: inline-block;\n\tmargin-right: 0;\n}\n\n#ud_massactions .updraftplus-remove a {\n\ttext-decoration: none;\n}\n\n#ud_massactions .updraft-viewlogdiv a {\n\ttext-decoration: none;\n\tposition: relative;\n}\n\nsmall.ud_massactions-tip {\n\tdisplay: inline-block;\n\topacity: 0.5;\n\tfont-style: italic;\n\tmargin-left: 20px;\n}\n\n#updraft-navtab-backups-content .updraft_existing_backups {\n\tmargin-bottom: 35px;\n\tposition: relative;\n}\n\n#updraft-message-modal-innards {\n\tpadding: 4px;\n}\n\n#updraft-authenticate-modal {\n\ttext-align: center;\n\tfont-size: 16px !important;\n}\n\n#updraft-authenticate-modal p {\n\tfont-size: 16px;\n}\n\ndiv.ui-dialog.ui-widget.ui-widget-content {\n\tz-index: 99999 !important;\n}\n\n#updraft_delete_form p {\n\tmargin-top: 3px;\n\tpadding-top: 0;\n}\n\n#updraft_restore_form .cannot-restore {\n\tmargin: 8px 0;\n}\n\n.notice.updraft-restore-option {\n\tpadding: 12px;\n\tmargin: 8px 0 4px 0;\n\tborder-left-color: #CCC;\n}\n\n/* updraft_restore_crypteddb */\n#updraft_restorer_dboptions h4 {\n\tmargin: 0px 0px 6px 0px;\n\tpadding: 0px;\n}\n\n.updraftplus_restore_tables_options_container {\n\tmax-height: 250px;\n\toverflow: auto;\n}\n\n.updraft_debugrow th {\n\tvertical-align: top;\n\tpadding-top: 6px;\n\tmax-width: 140px;\n}\n\n.expertmode p {\n\tfont-size: 125%;\n}\n\n.expertmode .call-wp-action {\n\twidth: 300px;\n\theight: 22px;\n}\n\n.updraftplus-lock-advert {\n\tclear: left;\n\tmax-width: 600px;\n}\n\n.uncompressed-data {\n\tclear: left;\n\tmax-width: 600px;\n}\n\n.delete-old-directories {\n\tpadding: 8px;\n\tpadding-bottom: 12px;\n}\n\n.active-jobs {\n\twidth: 100%;\n\ttext-align: center;\n\tpadding: 33px;\n}\n\n.job-id {\n\tmargin-top: 0;\n\tmargin-bottom: 8px;\n}\n\n.next-resumption {\n\tfont-weight: bold;\n}\n\n.updraft_percentage {\n\tz-index: -1;\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 0px;\n\ttext-align: center;\n\tbackground-color: #1D8EC2;\n\ttransition: width 0.3s;\n}\n\n.curstage {\n\tz-index: 1;\n\tborder-radius: 2px;\n\tmargin-top: 8px;\n\twidth: 100%;\n\theight: 26px;\n\tline-height: 26px;\n\tposition: relative;\n\ttext-align: center;\n\tfont-style: italic;\n\tcolor: #FFF;\n\tbackground-color: #B7B7B7;\n\ttext-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n}\n\n.curstage-info {\n\tdisplay: inline-block;\n\tz-index: 2;\n}\n\n.retain-files {\n\twidth: 48px;\n}\n\n.backup-interval-description tr td div {\n\tmax-width: 670px;\n}\n\n#updraft-manualdecrypt-modal {\n\twidth: 85%;\n\tmargin: 6px;\n\tmargin-left: 100px;\n}\n\n.directory-permissions {\n\tfont-size: 110%;\n\tfont-weight: bold;\n}\n\n.double-warning {\n\tborder: 1px solid;\n\tpadding: 6px;\n}\n\n.raw-backup-info {\n\tfont-style: italic;\n\tfont-weight: bold;\n\tfont-size: 120%;\n}\n\n.updraft_existingbackup_date {\n\twidth: 22%;\n\tmax-width: 140px;\n}\n\n.updraft_existing_backups_wrapper {\n\tmargin-top: 20px;\n\tborder-top: 1px solid #DDD;\n}\n\n.updraft-no-backups-msg {\n\tpadding: 10px 40px;\n\ttext-align: center;\n\tfont-style: italic;\n}\n\n.tr-bottom-4 {\n\tmargin-bottom: 4px;\n}\n\n.existing-backups-table th {\n\tpadding: 8px 10px;\n}\n\n.form-table .backup-date {\n\twidth: 172px;\n}\n\n.form-table .backup-data {\n\twidth: 426px;\n}\n\n.form-table .updraft_backup_actions {\n\twidth: 272px;\n}\n\n.existing-date {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmax-width: 140px;\n\twidth: 25%;\n}\n\n.line-break-tr {\n\theight: 2px;\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.line-break-td {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.td-line-color {\n\theight: 2px;\n\tbackground-color: #888;\n}\n\n.raw-backup {\n\tmax-width: 140px;\n}\n\n.existing-backups-actions {\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.existing-backups-border {\n\theight: 2px;\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.existing-backups-border > td {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.existing-backups-border > div {\n\theight: 2px;\n\tbackground-color: #AAA;\n}\n\n.updraft_existing_backup_date {\n\tmax-width: 140px;\n}\n\n.updraftplus-upload {\n\tmargin-right: 6px;\n\tfloat: left;\n\tclear: none;\n}\n\n.before-restore-button {\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.before-restore-button div {\n\tfloat: none;\n\tdisplay: inline-block;\n}\n\n.table-separator-tr {\n\theight: 2px;\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.table-separator-td {\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\n.end-of-table-div {\n\theight: 2px;\n\tbackground-color: #AAA;\n}\n\n.last-backup-job {\n\tpadding-top: 3% !important;\n}\n\n.line-height-03 {\n\tline-height: 0.3 !important;\n}\n\n.line-height-13 {\n\tline-height: 1.3 !important;\n}\n\n.line-height-23 {\n\tline-height: 2.3 !important;\n}\n\n#updraft_diskspaceused {\n\tcolor: #DF6926;\n}\n\n#updraft_delete_old_dirs_pagediv {\n\tpadding-bottom: 10px;\n}\n\n/*#updraft_lastlogmessagerow > td, #updraft_last_backup > td {\n\tpadding: 0;\n}*/\n\n/* Time + scheduling add-on*/\n.fix-time {\n\twidth: 70px;\n}\n\n.retain-files {\n\twidth: 70px;\n}\n\n.number-input {\n\tmin-width: 50px;\n\tmax-width: 70px;\n}\n\n.additional-rule-width {\n\tmin-width: 60px;\n\tmax-width: 70px;\n}\n\n/* Add-ons */\n/* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */\n\n#updraft-wrap .dashicons.dashicons-adapt-size {\n\tline-height: inherit;\n\tfont-size: inherit;\n}\n\n#updraft-wrap .button span.dashicons:not(.dashicons-adapt-size) {\n\tvertical-align: middle;\n\tmargin-top: -3px;\n}\n\n.addon-logo-150 {\n\tmargin-left: 30px;\n\tmargin-top: 33px;\n\theight: 125px;\n\twidth: 150px;\n}\n\n.margin-bottom-50 {\n\tmargin-bottom: 50px;\n}\n\n.premium-container {\n\twidth: 80%;\n}\n\n/* Main Header */\n\n.main-header {\n\tbackground-color: #DF6926;\n\theight: 200px;\n\twidth: 100%;\n}\n\n.button-add-to-cart {\n\tcolor: white;\n\tborder-color: white;\n\tfloat: none;\n\tmargin-right: 17px;\n}\n\n.button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active {\n\tborder-color: #A0A5AA;\n\tcolor: #A0A5AA;\n}\n\n.addon-title {\n\tmargin-top: 25px;\n}\n\n.addon-text {\n\tmargin-top: 75px;\n}\n\n.image-main-div {\n\twidth: 25%;\n\tfloat: left;\n}\n\n.text-main-div {\n\twidth: 60%;\n\tfloat: left;\n\ttext-align: center;\n\tcolor: white;\n\tmargin-top: 16px;\n}\n\n.text-main-div-title {\n\tfont-weight: bold !important;\n\tcolor: white;\n\ttext-align: center;\n}\n\n.text-main-div-paragraph {\n\tcolor: white;\n}\n\n/* End main header */\n\n/* Vault icons */\n\n.updraftplus-vault-cta {\n\twidth: 100%;\n\ttext-align: center;\n\tmargin-bottom: 50px;\n}\n\n.updraftplus-vault-cta h1 {\n\tfont-weight: bold;\n}\n\n.updraftvault-buy {\n\twidth: 225px;\n\theight: 225px;\n\tborder: 2px solid #777;\n\tdisplay: inline-table;\n\tmargin: 0 auto;\n\tmargin-right: 50px;\n\tposition: relative;\n}\n\n.updraftplus-vault-cta > .vault-options > .center-vault {\n\twidth: 275px;\n\theight: 275px;\n}\n\n.updraftplus-vault-cta > .vault-options > .center-vault > a {\n\tright: 21%;\n\tfont-size: 16px;\n\tborder-width: 4px !important;\n}\n\n.updraftplus-vault-cta > .vault-options > .center-vault > p {\n\tfont-size: 16px;\n}\n\n.updraftvault-buy .button-purchase {\n\tright: 24%;\n\tmargin-left: 0;\n\tline-height: 1.7em;\n}\n\n.updraftvault-buy hr {\n\theight: 2px;\n\tbackground-color: #777;\n\tmargin-top: 18px;\n}\n\n.right {\n\tmargin-right: 0px;\n}\n\n.updraftvault-buy .addon-logo-100 {\n\theight: 100px;\n\twidth: 125px;\n\tmargin-top: 7px;\n}\n\n.updraftvault-buy .addon-logo-large {\n\tmargin-top: 7px;\n}\n\n.updraftvault-buy .button-buy-vault {\n\tfont-size: 12px;\n\tcolor: #DF6926;\n\tborder-color: #DF6926;\n\tborder-width: 2px !important;\n\tposition: absolute;\n\tright: 29%;\n\tbottom: 2%;\n}\n\n.premium-addon-div .button-purchase {\n\tline-height: 1.7em;\n}\n\n.updraftvault-buy .button-buy-vault:hover {\n\tborder-color: darkgrey;\n\tcolor: darkgrey;\n}\n\n/* End Vault icons */\n\n/* Premium addons */\n\n.premium-addons {\n\tmargin-top: 80px;\n\twidth: 100%;\n\tmargin: 0 auto;\n\tdisplay: table;\n}\n\n.addon-list {\n\t/* margin-left: 32px; */\n\tdisplay: table;\n\ttext-align: center;\n}\n\n.premium-addons h1 {\n\ttext-align: center;\n\tfont-weight: bold;\n}\n\n.premium-addons p {\n\ttext-align: center;\n}\n\n.premium-addons .premium-addon-div {\n\twidth: 200px;\n\theight: 250px;\n\tborder: 2px solid #777;\n\tdisplay: inline-table;\n\tmargin: 0 auto;\n\tmargin-right: 25px;\n\tmargin-top: 25px;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.premium-addons .premium-addon-div p {\n\tmargin-left: 2px;\n\tmargin-right: 2px;\n}\n\n.premium-addons .premium-addon-div img {\n\twidth: auto;\n\theight: 50px;\n\tmargin-top: 7px;\n}\n\n.premium-addons .premium-addon-div .hr-alignment {\n\tmargin-top: 44px;\n}\n\n.premium-addons .premium-addon-div .dropbox-logo {\n\theight: 39px;\n\twidth: 150px;\n}\n\n.premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo {\n\twidth: 75%;\n\theight: 24px;\n}\n\n.button-purchase {\n\tfont-size: 12px;\n\tcolor: #DF6926;\n\tborder-color: #DF6926;\n\tborder-width: 2px !important;\n\tposition: absolute;\n\tright: 25%;\n\tbottom: 2%;\n}\n\n.button-purchase:hover {\n\tcolor: darkgrey;\n\tborder-color: darkgrey;\n}\n\n.premium-addons .premium-addon-div hr {\n\theight: 2px;\n\tbackground-color: #777;\n\tmargin-top: 18px;\n}\n\n.premium-addon-div p {\n\tfont-style: italic;\n}\n\n.addon-list > .premium-addon-div > .onedrive-fix,\n.addon-list > .premium-addon-div > .azure-logo {\n\tmargin-top: 33px;\n}\n\n.addon-list > .premium-addon-div > .dropbox-fix {\n\tmargin-top: 18px;\n}\n\n/* End premium addons */\n\n\n/* Forgotton something (that is the name of the div rather than a mental note!) */\n\n.premium-forgotton-something {\n\tmargin-top: 5%;\n}\n\n.premium-forgotton-something h1 {\n\ttext-align: center;\n\tfont-weight: bold;\n}\n\n.premium-forgotton-something p {\n\ttext-align: center;\n\tfont-weight: normal;\n}\n\n.premium-forgotton-something .button-faq {\n\tcolor: #DF6926;\n\tborder-color: #DF6926;\n\tmargin: 0 auto;\n\tdisplay: table;\n}\n\n.premium-forgotton-something .button-faq:hover {\n\tcolor: #777;\n\tborder-color: #777;\n}\n\n/* End of forgotton something */\n\n.updraftplusmethod.updraftvault #vaultlogo {\n\tpadding-left: 40px;\n}\n\n.updraftplusmethod.updraftvault .vault_primary_option {\n\tfloat: left;\n\twidth: 50%;\n\ttext-align: center;\n\tpadding-bottom: 20px;\n}\n\n.updraftplusmethod.updraftvault .vault_primary_option div {\n\tclear: right;\n\tpadding-top: 20px;\n}\n\n.updraftplusmethod.updraftvault .clear-left {\n\tclear: left;\n}\n\n.updraftplusmethod.updraftvault .padding-top-20px {\n\tpadding-top: 20px;\n}\n\n.updraftplusmethod.updraftvault .padding-top-14px {\n\tpadding-top: 14px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary {\n\tfont-size: 18px !important;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect {\n\tmargin-top: 8px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_settings_connect input {\n\tmargin-right: 10px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_email {\n\twidth: 280px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_pass {\n\twidth: 200px;\n}\n\n.updraftplusmethod.updraftvault #vault-is-connected {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_settings_default p {\n\tclear: left;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option-container {\n\ttext-align: center;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option {\n\twidth: 40%;\n\ttext-align: center;\n\tpadding-top: 20px;\n\tdisplay: inline-block;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option-size {\n\tfont-size: 200%;\n\tfont-weight: bold;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option-link {\n\tclear: both;\n\tfont-size: 150%;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option-or {\n\tclear: both;\n\tfont-size: 115%;\n\tfont-style: italic;\n}\n\n/* Automation Backup Advert by B */\n.autobackup-image {\n/* \tdisplay: inline-block; */\n/*\tmin-width: 10%;\n\tmax-width:25%;*/\n/*\tfloat: left;*/\n\tclear: left;\n\tfloat: left;\n\twidth: 110px;\n\theight: 110px;\n}\n\n.autobackup-description {\n\twidth: 100%;\n}\n\n.advert-description {\n\tfloat: left;\n\tclear: right;\n\tpadding: 4px 10px 8px 10px;\n\twidth: 70%;\n\tclear: right;\n\tvertical-align: top;\n}\n\n.advert-btn {\n\tdisplay: inline-block;\n\tmin-width: 10%;\n\tvertical-align: top;\n\tmargin-bottom: 8px;\n}\n\n.advert-btn:first-of-type {\n\tmargin-top: 25px;\n}\n\n.advert-btn a {\n\tdisplay: block;\n\tcursor: pointer;\n}\n\na.btn-get-started {\n\tbackground: #FFF;\n\tborder: 2px solid #DF6926;\n\tborder-radius: 4px;\n\tcolor: #DF6926;\n\tdisplay: inline-block;\n\tmargin-left: 10px !important;\n\tmargin-bottom: 7px !important;\n\tfont-size: 18px !important;\n\tline-height: 20px;\n\tmin-height: 28px;\n\tpadding: 11px 10px 5px 10px;\n\ttext-transform: uppercase;\n\ttext-decoration: none;\n}\n\n.circle-dblarrow {\n\tborder: 1px solid #DF6926;\n\tborder-radius: 100%;\n\tdisplay: inline-block;\n\tfont-size: 17px;\n\tline-height: 17px;\n\tmargin-left: 5px;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n}\n\n/* End Automation Backup Advert by B */\n/* New Responsive Pretty Advanced Settings */\n.expertmode .advanced_settings_container {\n\theight: auto;\n\toverflow: hidden;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu {\n\tfloat: none;\n\tborder-bottom: 1px solid rgb(204, 204, 204);\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content {\n\tpadding-top: 5px;\n\tfloat: none;\n\twidth: auto;\n\toverflow: auto;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content h3:first-child {\n\tmargin-top: 5px !important;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools {\n\tdisplay: none;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content .site_info {\n\tdisplay: block;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\n\tdisplay: inline-block;\n\tcursor: pointer;\n\tpadding: 5px;\n\tcolor: #000;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text {\n\tfont-size: 16px;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover {\n\tbackground-color: #EAEAEA;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .active {\n\tbackground-color: #3498DB;\n\tcolor: #FFF;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .active:hover {\n\tbackground-color: #72C5FD;\n\tcolor: #FFF;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content input#import_settings {\n\theight: auto !important;\n}\n\ndiv#updraft-wrap a {\n\tcursor: pointer !important;\n}\n\n.updraftcentral_wizard_option {\n\twidth: 45%;\n\tfloat: left;\n\ttext-align: center;\n}\n\n.updraftcentral_wizard_option label {\n\tmargin-bottom: 8px;\n}\n\n#updraftcentral_keys_table {\n\tdisplay: none;\n}\n\n.create_key_container {\n\tborder: 1px solid;\n\tborder-radius: 4px;\n\tpadding: 0 0 6px 6px;\n\tmargin-bottom: 8px;\n}\n\n.updraftcentral_cloud_connect {\n\tborder-radius: 4px;\n\tborder: 1px solid #000;\n\tpadding: 0 20px;\n\tmargin-top: 30px;\n\tbackground-color: #FFF;\n}\n\n.updraftcentral_cloud_error {\n\tborder: 1px solid #000;\n\tpadding: 3px 10px;\n\tborder-left: 3px solid #F00;\n\tbackground-color: #FFF;\n\tmargin-bottom: 10px;\n}\n\n.updraftcentral_cloud_info {\n\tborder: 1px solid #000;\n\tpadding: 3px 10px;\n\tborder-left: 3px solid #EF8F31;\n\tbackground-color: #FFF;\n\tmargin-bottom: 10px;\n}\n\n.updraftplus_spinner.spinner {\n\tpadding-left: 25px;\n\tfloat: none;\n}\n\n.updraftplus_spinner.spinner.visible {\n\tvisibility: visible;\n\twidth: auto;\n}\n\n.updraftcentral_cloud_notices .updraftplus_spinner {\n\tmargin-top: -5px;\n}\n\n.updraftcentral-subheading {\n\tfont-size: 14px;\n\tmargin-top: -10px;\n\tmargin-bottom: 20px;\n}\n\n#updraftcentral_cloud_form input#email,\n#updraftcentral_cloud_form input#password {\n\tmin-width: 250px;\n}\n\n.updraftcentral-data-consent {\n\tfont-size: 13px;\n\tmargin-bottom: 10px;\n}\n\n.updraftcentral_cloud_wizard_image {\n\tfloat: left;\n\tmin-width: 100px;\n\tmargin-right: 25px;\n}\n\n.updraftcentral_cloud_wizard {\n\tfloat: left;\n}\n\n.updraftcentral_cloud_clear {\n\tclear: both;\n}\n\n.updraftplus-settings-footer {\n\tmargin-top: 30px;\n}\n\n.updraftplus-top-menu {\n\tpadding: 0.5em;\n}\n\n#updraft_inpage_backup #updraft_activejobs_table {\n\tbackground: transparent;\n}\n\n#updraft_inpage_backup #updraft_lastlogmessagerow .updraft-log-link {\n\tfloat: none;\n}\n\n#updraft_inpage_backup #updraft_activejobsrow .updraft_row {\n\tflex-direction: column;\n\tpadding-left: 20px;\n\tpadding-right: 20px;\n}\n\n#updraft_inpage_backup #updraft_activejobsrow .updraft_progress_container {\n\twidth: 100%;\n}\n\n#updraft_inpage_backup #updraft_activejobs_table {\n\toverflow: inherit;\n}\n\n#updraft_inpage_backup span#updraft_lastlogcontainer {\n\tpadding: 18px;\n\tbackground: #FAFAFA;\n\tdisplay: block;\n\tfont-size: 90%;\n\tbox-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n#updraft_inpage_backup div#updraft_activejobsrow {\n\tbackground: #FAFAFA;\n\tbox-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n#updraft_inpage_backup #updraft_lastlogmessagerow > div {\n\tbackground: transparent;\n\tpadding: 0;\n}\n\n#updraft_inpage_backup .last-message > strong {\n\tdisplay: block;\n\tmargin-top: 13px;\n}\n\nbody.update-core-php #updraft_inpage_backup h2:nth-child(1) {\n\tmargin-top: 1em !important;\n}\n\n/* Restoration page */\n\n.updraft_restore_container {\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tz-index: 99999;\n\tpadding-top: 30px;\n\tbackground: #F1F1F1;\n\toverflow: auto;\n}\n\n.updraft-modal-is-opened .select2-container {\n\tz-index: 99999;\n}\n\nbody.updraft-modal-is-opened {\n\toverflow: hidden;\n}\n\n.updraft_restore_container h2 {\n\tmargin: 0;\n}\n\n.updraft_restore_container .updraftmessage {\n\tbox-sizing: border-box;\n\tmax-width: 860px;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n.updraft_restore_main {\n\tmax-width: 860px;\n\tmargin: 0 auto;\n\tmargin-top: 20px;\n\tbackground: #FFF;\n\tbox-shadow: 0 3px 3px rgba(0, 0, 0, 0.1);\n\tposition: relative;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tbox-sizing: border-box;\n}\n\n.updraft_restore_main--header {\n\tfont-size: 20px;\n\tfont-weight: bold;\n\ttext-align: center;\n\tpadding-top: 16px;\n\tline-height: 20px;\n\twidth: 100%;\n\tmax-width: 100%;\n\tpadding-right: 30px;\n\tpadding-left: 30px;\n\tbox-sizing: border-box;\n}\n\n.updraft_restore_main--activity {\n\tposition: relative;\n\twidth: calc(100% - 350px);\n\tbox-sizing: border-box;\n}\n\n.updraft_restore_main--activity-title {\n\tpadding: 20px;\n\tmargin: 0;\n}\n\n.show-credentials-form.updraft_restore_main .updraft_restore_main--activity-title {\n\tdisplay: none;\n}\n\n.updraft_restore_main--components {\n\twidth: 350px;\n\tpadding: 20px;\n\tbox-sizing: border-box;\n\tbackground: #F8F8F8;\n\tmin-height: 350px;\n}\n\n.updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output {\n\tbackground: #23282D;\n\tcolor: #E3E3E3;\n\tfont-family: monospace;\n\tpadding: 19px;\n\toverflow: auto;\n\tposition: absolute;\n\ttop: 60px;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n}\n\n#updraftplus_ajax_restore_output form {\n\twhite-space: normal;\n\tfont-family: -apple-system, blinkmacsystemfont, \"Segoe UI\", roboto, oxygen-sans, ubuntu, cantarell, \"Helvetica Neue\", sans-serif;\n}\n\n#updraftplus_ajax_restore_output .updraft_restore_errors {\n\tborder: 1px solid #DC3232;\n\tpadding: 10px 20px;\n\twhite-space: normal;\n}\n\n.updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output h2 {\n\tcolor: #00A0D2;\n\tpadding-top: 10px;\n\tpadding-bottom: 5px;\n}\n\n.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output {\n\tpadding: 20px;\n\tborder-left: 1px solid #EEE;\n}\n\n.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output #message {\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output .form-table td,\n.updraft_restore_main.show-credentials-form div#updraftplus_ajax_restore_output .form-table th {\n\tpadding-bottom: 0;\n}\n\n.updraft_restore_main.show-credentials-form .updraft_restore_main--components {\n\topacity: 0.2;\n}\n\n.updraft_restore_main.show-credentials-form div.error .restore-credential-errors--list p {\n\tmargin: 0;\n\tlist-style-type: disc;\n\tdisplay: list-item;\n\tlist-style-position: inside;\n}\n\n.restore-credential-errors > :first-child {\n\tmargin-top: 0;\n}\n\n.restore-credential-errors > :last-child {\n\tmargin-bottom: 0;\n}\n\nul.updraft_restore_components_list li {\n\tcolor: #BABABA;\n\tfont-size: 1.2em;\n\tmargin-bottom: 1em;\n}\n\nul.updraft_restore_components_list li::before {\n\tcontent: '\\f469';\n\tfont-family: dashicons;\n\tfont-size: 20px;\n\tvertical-align: middle;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\nul.updraft_restore_components_list li span {\n\tvertical-align: middle;\n}\n\nul.updraft_restore_components_list li.done {\n\tcolor: green;\n}\n\nul.updraft_restore_components_list li.done::before {\n\tcontent: \"\\f147\";\n}\n\nul.updraft_restore_components_list li.active {\n\tcolor: inherit;\n}\n\nul.updraft_restore_components_list li.active::before {\n\tcontent: \"\\f463\";\n\tanimation: udp_rotate 1s linear infinite;\n}\n\nul.updraft_restore_components_list li.error {\n\tcolor: #DC3232;\n}\n\nul.updraft_restore_components_list li.error::before {\n\tcontent: \"\\f335\";\n}\n\n.updraft_restore_result {\n\tpadding: 10px 0;\n\tfont-size: 1.3em;\n\tmargin-bottom: 1em;\n\tvertical-align: middle;\n\tdisplay: none;\n}\n\n.updraft_restore_result.restore-error {\n\tcolor: #DC3232;\n}\n\n.updraft_restore_result.restore-success {\n\tcolor: green;\n}\n\n.updraft_restore_result .dashicons {\n\tfont-size: 35px;\n\theight: 35px;\n\tline-height: 33px;\n\twidth: 35px;\n}\n\n.updraft_restore_result span {\n\tvertical-align: middle;\n}\n\n/* Restore modal */\n\n#updraft-restore-modal {\n\twidth: 100%;\n}\n\ndiv#updraft-restore-modal .notice {\n\tbackground: #F8F8F8;\n}\n\n.updraft-restore-modal--stage .updraft--two-halves,\n.updraft-restore-modal--stage .updraft--one-half {\n\tpadding: 20px 30px;\n}\n\n.updraft-restore-modal--header {\n\tpadding: 20px;\n\tpadding-bottom: 0px;\n\ttext-align: center;\n\tborder-bottom: 1px solid #EEE;\n}\n\n.updraft-restore-modal--header h3 {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.updraft-restore-item {\n\tpadding-bottom: 4px;\n}\n\n.updraft-restore-buttons {\n\tpadding-top: 10px;\n}\n\nul.updraft-restore--stages {\n\tdisplay: inline-block;\n\tmargin: 0;\n\theight: 28px;\n}\n\nul.updraft-restore--stages li {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 12px;\n\theight: 12px;\n\tbackground: #D2D2D2;\n\tborder-radius: 20px;\n\tline-height: 1;\n\tmargin: 0 4px;\n\tvertical-align: middle;\n}\n\nul.updraft-restore--stages li.active {\n\tbackground: #444;\n}\n\n.updraft-restore--footer {\n\tborder-top: 1px solid #EEE;\n\tpadding: 20px;\n\ttext-align: center;\n\tposition: sticky;\n\tbottom: 0;\n\tbackground: #FFF;\n\twidth: 100%;\n\tbox-sizing: border-box;\n}\n\n.updraft-restore--footer .updraft-restore--cancel {\n\tposition: absolute;\n\tleft: 20px;\n\ttop: auto;\n}\n\n.updraft-restore--footer .updraft-restore--next-step {\n\tposition: absolute;\n\tright: 20px;\n\ttop: auto;\n}\n\nul.updraft-restore--stages li span {\n\tposition: absolute;\n\twidth: 120px;\n\tbottom: calc(100% + 14px);\n\tleft: -55px;\n\tbackground: #000000DB;\n\tpadding: 5px;\n\tbox-sizing: border-box;\n\tborder-radius: 4px;\n\tcolor: #FFF;\n\ttext-align: center;\n\tdisplay: none;\n}\n\nul.updraft-restore--stages li:hover span {\n\tdisplay: inline-block;\n}\n\n.updraft-restore-item input[type=checkbox] {\n\tmargin-bottom: -5px;\n}\n\n.updraft-restore-item input[type=checkbox]:checked + label {\n\tfont-weight: bold;\n}\n\n/* Hide close button on download window */\ndiv#updraft-restore-modal .ud_downloadstatus__close {\n\tdisplay: none;\n}\n\n#ud_downloadstatus2:not(:empty) {\n\tmargin-top: 15px;\n}\n\n.dashicons.rotate {\n\tanimation: udp_rotate 1s linear infinite;\n}\n\n/* Activity stalled */\n\nspan#updraftplus_ajax_restore_last_activity {\n\tfont-size: .8rem;\n\tfont-weight: normal;\n\tfloat: right;\n}\n\n.updraft_restore_main--components .updated.show_admin_restore_in_progress_notice {\n\tmargin: -20px -20px 20px;\n\tpadding: 19px;\n}\n\n.updraft_restore_main--components .updated.show_admin_restore_in_progress_notice button {\n\tmargin-right: 5px;\n}\n\n#updraft_migrate_receivingsites .updraftplus-remote-sites-selector .button-primary, .updraft_migrate_add_site .input-field input, .updraft_migrate_add_site button {\n\tvertical-align: middle;\n}\n\n#updraft_migrate_receivingsites .text-link-menu a:not(:last-child) {\n\tpadding-right: 10px;\n}\n\n#updraft_migrate_receivingsites a.updraft_migrate_clear_sites span.dashicons-trash:before {\n\tfont-size: 17px;\n}\n\n#updraft_migrate_receivingsites .updraft_migrate_add_site {\n\tclear: both;\n}\n\n/* RTL Support */\n\n.rtl .advanced_tools.total_size table td {\n\tdirection: ltr;\n\ttext-align: right;\n}\n\n.rtl #plupload-upload-ui2.drag-drop #drag-drop-area2 {\n\tmargin-bottom: 20px;\n}\n\n.rtl #updraft_lastlogmessagerow .updraft-log-link {\n\tfloat: left;\n}\n\n.rtl label.updraft_checkbox > input[type=checkbox] {\n\tmargin-right: -25px;\n\tmargin-left: inherit;\n}\n\n.rtl .ud_downloadstatus__close {\n\tfloat: left !important;\n}\n\n.rtl #updraft_backupextradbs_another_container {\n\tfloat: right;\n}\n\n.rtl input.labelauty + label {\n\tdirection: ltr;\n\tposition: relative;\n\tmin-height: 29px;\n}\n\n.rtl input.labelauty + label > span.labelauty-checked-image, .rtl input.labelauty + label > span.labelauty-unchecked-image {\n\tright: 8px;\n\ttop: 11px;\n\tposition: absolute;\n}\n\n.rtl .button.updraft-close-overlay .dashicons {\n\tmargin-right: -5px;\n\tmargin-left: inherit;\n}\n\n.rtl label.updraft_checkbox {\n\tmargin-right: 26px;\n\tmargin-left: inherit;\n}\n\n.rtl #updraft-wrap .udp-info {\n\tleft: 10px;\n\tright: inherit;\n}\n\n.rtl input.labelauty + label > span.labelauty-unchecked-image + span.labelauty-unchecked,\n.rtl input.labelauty + label > span.labelauty-checked-image + span.labelauty-checked {\n\tmargin-right: 7px;\n\tmargin-left: inherit;\n\tpadding: 7px 7px 7px 26px;\n\twidth: 141px;\n\ttext-align: right;\n}\n\n.rtl #updraft_report_cell button.updraft_reportbox_delete,\n.rtl .updraft_box_delete_button,\n.rtl .updraft_small_box .updraft_box_delete_button {\n\tleft: 4px;\n\tright: inherit;\n}\n\n#updraft_exclude_modal .clause-input-container {\n\toverflow: auto;\n}\n\n#updraft_exclude_modal .clause-input-container select, #updraft_exclude_modal .clause-input-container input {\n\tfloat: left;\n}\n\n#updraft_exclude_modal .clause-input-container .wildcards-input {\n\tmargin: 7px 7px 0 0;\n}\n\n#updraft_exclude_modal .updraft-exclude-panel .contain-clause-sub-label {\n\tmargin-top: 10px;\n\tdisplay: block;\n}\n\n@media only screen and (min-width: 1024px) {\n\n\t#updraft_activejobsrow .updraft_row {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t}\n\n\t#updraft_activejobsrow .updraft_row .updraft_col {\n\t\tflex: auto;\n\t}\n\n\t#updraft_activejobsrow .updraft_progress_container {\n\t\twidth: calc(100% - 230px);\n\t}\n\n}\n\n@media only screen and (min-width: 782px) {\n\n\t.settings_page_updraftplus input[type=text],\n\t.settings_page_updraftplus input[type=password],\n\t.settings_page_updraftplus input[type=number] {\n\t\t/* border-radius: 4px; */\n\t\tline-height: 1.42;\n\t\t/* border: 1px solid #CCC; */\n\t\theight: 27px;\n\t\tpadding: 2px 6px;\n\t\tcolor: #555;\n\t}\n\n\t.settings_page_updraftplus input[type=\"number\"] {\n\t\theight: 31px;\n\t}\n\n\t#ud_massactions.active, #updraft-delete-waitwarning.active {\n\t\tposition: fixed;\n\t\tbottom: 0;\n\t\tleft: 160px;\n\t\tright: 0;\n\t\ttop: auto;\n\t\tbackground: #FFF;\n\t\tz-index: 3;\n\t\tbox-shadow: 0 0 10px rgba(0, 0, 0, 0.2);\n\t}\n\t\n\t.rtl #ud_massactions.active, .rtl #updraft-delete-waitwarning.active {\n\t\tleft: 0px;\n\t\tright: 160px;\n\t}\n\n\tbody.folded #ud_massactions.active, body.folded #updraft-delete-waitwarning.active {\n\t\tleft: 36px;\n\t}\n\n\t.updraft-after-form-table {\n\t\tmargin-left: 250px;\n\t}\n\n\t#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.range-selection:not(.backuprowselected) .updraft_existingbackup_date .backup_date_label {\n\t\tcolor: #FFF;\n\t}\n\n}\n\n@media only screen and (min-width: 782px) and (max-width: 960px) {\n\n\tbody.auto-fold #ud_massactions.active, body.auto-fold #updraft-delete-waitwarning.active {\n\t\tleft: 36px;\n\t}\n\n}\n\n@media only screen and (max-width: 782px) {\n\n\t#updraft-wrap {\n\t\tmargin-right: 0;\n\t}\n\n\t#updraft-wrap .form-table td {\n\t\tpadding-right: 0;\n\t}\n\n\tlabel.updraft_checkbox {\n\t\tmargin-bottom: 8px;\n\t\tmargin-top: 8px;\n\t\tmargin-left: 36px;\n\t}\n\n\t.updraft_retain_rules {\n\t\tposition: relative;\n\t\tmargin-right: 0;\n\t\tborder: 1px solid #CCC;\n\t\tpadding: 5px;\n\t\tmargin-bottom: -1px;\n\t}\n\n\t.updraft_retain_rules_delete {\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 5px;\n\t}\n\n\ta[id*=updraft_retain_] {\n\t\tdisplay: block;\n\t\tpadding: 15px 15px 15px 0;\n\t}\n\n\tlabel.updraft_checkbox > input[type=checkbox] {\n\t\tmargin-left: -33px;\n\t}\n\n\t#updraft-backupnow-button {\n\t\tmargin: 0;\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n\n\t.updraft_next_scheduled_backups_wrapper > .updraft_backup_btn_wrapper {\n\t\tpadding-top: 0;\n\t}\n\n\t#ud_massactions, #updraft-delete-waitwarning {\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\ttext-align: center;\n\t}\n\n\t#ud_massactions.active {\n\t\tposition: fixed;\n\t\ttop: auto;\n\t\tbottom: 0;\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\ttext-align: center;\n\t\tbox-shadow: 0 -3px 15px rgba(0, 0, 0, 0.08);\n\t\tbackground: #FFF;\n\t\tz-index: 3;\n\t}\n\n\t#ud_massactions strong {\n\t\tdisplay: block;\n\t\tmargin-bottom: 5px;\n\t}\n\n\tsmall.ud_massactions-tip {\n\t\tdisplay: block;\n\t}\n\n/*\t.advert-description {\n\t\tmin-width: 75%;\n\t\tmargin-bottom: 5px;\n\t}\n\n\t.advert-btn {\n\t\tmargin-top: 15px;\n\t\tmargin-left:86px;\n\t\tmin-width: 100%;\n\t}*/\n\n\t.existing-backups-table .backup_date_label > div, .existing-backups-table .backup_date_label span > div {\n\t\tfont-weight: normal;\n\t}\n\n\t.existing-backups-table .backup_date_label .clear-right {\n\t\tdisplay: inline-block;\n\t}\n\n\ttable.widefat.existing-backups-table {\n\t\tborder: 0;\n\t\tbox-shadow: none;\n\t\tbackground: transparent;\n\t}\n\n\t.existing-backups-table thead {\n\t\tborder: none;\n\t\tclip: rect(0 0 0 0);\n\t\theight: 1px;\n\t\tmargin: -1px;\n\t\toverflow: hidden;\n\t\tpadding: 0;\n\t\tposition: absolute;\n\t\twidth: 1px;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t}\n\n\t.existing-backups-table tr {\n\t\tdisplay: block;\n\t\tmargin-bottom: .625em;\n\t\tpadding-bottom: 16.625px;\n\t\twidth: 100%;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tmargin-bottom: 10px;\n\t\tbackground: #FFF;\n\t\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);\n\t}\n\n\t.existing-backups-table td {\n\t\tborder-bottom: 1px solid #DDD;\n\t\tdisplay: block;\n\t\tfont-size: .9em;\n\t\ttext-align: left;\n\t\twidth: 100%;\n\t\tpadding: 10px;\n\t\tmargin: 0;\n\t}\n\n\t.wp-list-table.existing-backups-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before {\n\t\t/*\n\t\t* aria-label has no advantage, it won't be read inside a table\n\t\tcontent: attr(aria-label);\n\t\t*/\n\t\tcontent: attr(data-label);\n\t\tfont-weight: bold;\n\t\tdisplay: block;\n\t\tposition: relative;\n\t\tleft: auto;\n\t\tpadding-bottom: 10px;\n\t\twidth: auto;\n\t\ttext-align: left;\n\t}\n\n\t.existing-backups-table td:last-child {\n\t\tborder-bottom: 0;\n\t}\n\n\t.form-table td.updraft_existingbackup_date {\n\t\twidth: inherit;\n\t\tmax-width: 100%;\n\t}\n\n\t.existing-backups-table td.before-restore-button {\n\t\tmin-height: 36px;\n\t}\n\n\t.updraft_next_scheduled_backups_wrapper {\n\t\tflex-direction: column;\n\t}\n\n\t.updraft_next_scheduled_backups_wrapper > div {\n\t\twidth: 100%;\n\t}\n\n\t.updraft_progress_container {\n\t\t/* width: 77%; */\n\t}\n\n\t#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row {\n\t\tposition: relative;\n\t}\n\n\t#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected {\n\t\tbackground-color: #FFF;\n\t\tborder-left: 4px solid #0572AA;\n\t}\n\n\t#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row td:not(.backup-select) {\n\t\tmargin-left: 50px;\n\t}\n\n\t#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row td.backup-select {\n\t\twidth: 50px !important;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tbox-sizing: border-box;\n\t\theight: 100%;\n\t\tz-index: 1;\n\t\tborder: none;\n\t\tborder-right: 1px solid rgba(0, 0, 0, 0.05);\n\t}\n\n\t#updraft-navtab-backups-content .updraft_existing_backups input[type=\"checkbox\"] {\n\t\theight: 25px;\n\t}\n\n\t.updraft_migrate_intro button.button.button-primary.button-hero {\n\t\tdisplay: block;\n\t\tmargin-right: 0;\n\t\twidth: 100%;\n\t\tmax-width: 100%;\n\t}\n\n\t.updraftclone-main-row {\n\t\tflex-direction: column;\n\t}\n\n\t.updraftclone-main-row > div {\n\t\twidth: auto;\n\t\tmax-width: none;\n\t\tmargin-right: 0;\n\t\tmargin-bottom: 10px;\n\t}\n\n\t.form-table th {\n\t\tpadding-bottom: 10px;\n\t}\n\n\t.updraft--flex {\n\t\tflex-direction: column;\n\t}\n\n\t.updraft_restore_main {\n\t\tflex-wrap: wrap;\n\t\tflex-direction: column;\n\t}\n\n\t.updraft_restore_main--components {\n\t\twidth: 100%;\n\t\tmin-height: 0;\n\t}\n\n\t.updraft_restore_main--activity {\n\t\twidth: 100%;\n\t}\n\n\tdiv#updraftplus_ajax_restore_output,\n\t.updraft_restore_main:not(.show-credentials-form) div#updraftplus_ajax_restore_output {\n\t\tposition: relative;\n\t\ttop: 0;\n\t\tbottom: auto;\n\t}\n\n\t.updraft--flex > .updraft--two-halves,\n\t.updraft--flex > .updraft--one-half {\n\t\twidth: 100%;\n\t}\n\n\t.updraft-restore-item {\n\t\tpadding-bottom: 10px;\n\t\tpadding-top: 10px;\n\t}\n\n}\n\n@media screen and (max-width: 600px) {\n\t\n\t.updraft_next_scheduled_backups_wrapper > div {\n\t}\n\n\t.updraft_next_scheduled_entity {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin-bottom: 2em;\n\t}\n\n\t.updraft_time_now_wrapper {\n\t\tmargin-top: 0;\n\t}\n\n\t#updraft_lastlogmessagerow h3 {\n\t\tmargin-bottom: 5px;\n\t}\n\n\t#updraft_lastlogmessagerow .updraft-log-link {\n\t\tdisplay: block;\n\t\tfloat: none;\n\t\tmargin: 0;\n\t\tmargin-bottom: 10px;\n\t}\n\n}\n\n@media screen and (max-width: 520px) {\n}\n\n@media only screen and (min-width: 768px) {\n\n\t.addon-activation-notice {\n\t\tleft: 20em;\n\t}\n\n\t.existing-backups-table tbody tr.range-selection:hover, .existing-backups-table tbody tr.range-selection {\n\t\tbackground: #0572AA; /* #2b7fd9 */\n\t}\n\n\t.existing-backups-table tbody tr:hover {\n\t\tbackground: #F1F1F1;\n\t}\n\n\t.existing-backups-table tbody tr td.before-restore-button {\n\t\tposition: relative;\n\t}\n\n\t.form-table .existing-backups-table thead th.check-column {\n\t\tpadding-left: 6px;\n\t}\n\n\t.existing-backups-table tr td:first-child {\n\t\tborder-left: 4px solid transparent;\n\t}\n\n\t.existing-backups-table tr.backuprowselected td:first-child {\n\t\tborder-left-color: #0572AA;\n\t}\n\n}\n\n@media screen and (min-width: 670px) {\n\t\n\t.expertmode .advanced_settings_container .advanced_settings_menu {\n\t\tfloat: left;\n\t\twidth: 215px;\n\t\tborder-right: 1px solid rgb(204, 204, 204);\n\t\tborder-bottom: none;\n\t}\n\n\t.expertmode .advanced_settings_container .advanced_settings_content {\n\t\tpadding-left: 10px;\n\t\tpadding-top: 0px;\n\t}\n\n\t.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\n\t\tdisplay: block;\n\t}\n\n}\n\n@media only screen and (max-width: 1068px) {\n\n\t.updraft-more-plugins .udp-box {\n\t\twidth: calc(50% - 10px);\n\t\tmargin-bottom: 20px;\n\t}\n\n\t.updraft_feat_table td:nth-child(2), .updraft_feat_table td:nth-child(3) {\n\t\twidth: 100px;\n\t}\n\n}\n\n@media only screen and (max-width: 600px) {\n\n\t.updraft-more-plugins .udp-box {\n\t\twidth: 100%;\n\t\tmargin-bottom: 20px;\n\t}\n\n\t.updraft_feat_table td:nth-child(2), .updraft_feat_table td:nth-child(3) {\n\t\twidth: auto;\n\t}\n\n\ttable.updraft_feat_table {\n\t\tdisplay: block;\n\t}\n\n\ttable.updraft_feat_table tr {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t}\n\n\ttable.updraft_feat_table td {\n\t\tdisplay: block;\n\t}\n\n\ttable.updraft_feat_table td:first-child {\n\t\twidth: 100%;\n\t\tborder-bottom: none;\n\t}\n\n\ttable.updraft_feat_table td:not(:first-child) {\n\t\twidth: 50%;\n\t\tbox-sizing: border-box;\n\t}\n\n\ttable.updraft_feat_table td:first-child:empty {\n\t\tdisplay: none;\n\t}\n\n\ttd[data-colname]::before {\n\t\tcontent: attr(data-colname);\n\t\tfont-size: 0.8rem;\n\t\tcolor: #CCC;\n\t\tline-height: 1;\n\t}\n\n}\n"]}PKwL\w64updraftplus/images/addons-images/google-enhanced.pngnu[PNG  IHDR,?PLTEZ[(nIDBE:= ]\[A8~@ ^3z6}4| _2y8 _FOK ]>L/wG+s0x=O ]c9.v` _:5|b ^N>-t>?JbIaO.u<<)o?`A=:e0xafad VU `MA*qb _;:,m*k@Nd `1y^5ZC)p(j];4u&h%h=0qba,7~-o2sFvc98.pPf`[ X?91 ]VgdPWRB]$mT+u5wWH7y2rϯLGy9iӱH?aC;|Y0%p*j(eS7(s&g];87ԶIc"nݎhW>9}f_52v%mМ׿fÚ܂ԴQ@ϮW-s gWA=~5y"mka W@ؾ>б#szʦJpǠ&mTVNNHt-uOy{,TȽDumN>UaPHFGTINeĺӝURIDATxIlaMcj LӈĐD5VzKqpÅDDƥ҈0Xc{p \߳wK̼څx;?J$owF;} {i-֝B~e&ݷF4VP wi|yHK-'=ut~ce]BK[W^|1- ښ6f.m \`{tqt] N7JJ8Юu:/ 曘SKe\gϸ0KڲHz/BYںʶl1cW$/:hӈul]mz =%}8=eƱ寥.|G̴a,V Ӭ0J(+YlwWEyS+y#!.p1"ԙ0tIڈ ҂z~4Bij?V{apA-b{!Zi5*EtC F?9a`1CbҰh#m=!щ5S 8LC*uyoVJ00zGl&:mr!XX{F;t3 CGձ_yyꯃuL E*:;/!Ҙݤ{ǪK[fhsWL4ԧlF[*R/wڶWq&>IZ 0G:Hg >ThǶ9qіR65\PKVeV[3͝NpU-4ڔ.5/Ĺm:}SW54ePO&-'UK,dW\mGn6$O*}XgC 몷֕ތ1LASUJ4#l)|M٦5hm}숫k73M4N%A.[jRM84m8:/W#&z#< &mSFqU:b&SGgh.eܶM{n%Samyx^-lFe[&R6M%eh>n at;+̱u&@.یL1؈8-bʭ(]w)C+~hq*'bad X l t,i]29Uᴍ&.6RGL>[ Dat/&R\.$NF98T'm4hS8^ SS=eOD+D*j[DSN|8 NlGۦ-S 24 xp)EmK`k͍mS+3 s6f΄ukWwʵOuI8GgӸ)h*i8^lc j#Vgёhʦp*+*G@ &l t SIΎa/HjMp1CcZ{䡲6VJLm!>8WO/F.rtތ58XGL!M֬i[l-\kX Nt:D]a_i^qqpL5SS &*tX~/oϖV)]ŋakwDZ6zphϝ[gj ڈCtm>m:q5LmX#O3 }e;br 4sLõ\ڐu5vJ37qe:br \-8[T逃m¹ 7 w %Inۆʲ+98 Nr"88?ʵ[\>$w莥LR8,p ] 幧. Nnqy #f8my.lʖgPywҸ y$i2ܐ߾Bq+09$"3\n(3⠬B.efY$BV(B.+ryE)zy{^ 1p\WQ$_tr2>m_ԅOC ggǗŏezڌ 1eqOu 4$ο.puGv/F(%p,G&q[KյC; py'|`Be8;sۡJ q )k 8`ybvIhM-ALymxR8>~5yҷ6ufPhcoy;1pB]G+>T@ڌnvc/lц3 10яEܟ jq0q۱! J A:ޒS)XFlȸ!CvNM- A\Â.lJ=eXMƍuwhSݎS+8:]6sNqXI&O<Ս?n[F>ԊP9cjE}b9{ nq5ЀC@A{ q+u<a}~7vV4؈C2`{8k;98o*qE(ꎁq6.!N8yW2o1^aq6.!) Tխ 33VSI99]طGjuvw|TCc%KdOٰ*2 NN3d/@s;C6-8ߛ%_rjt6N{ٸ8S{UqQ\.l8m6?nP2723З\"u&lQ`N_\{ 5Sl\F u!*.C#7,'m\ɚ53:8^Yê 0$8c@Jv\pͬ(؀ps~tyܙ^Mr6;3:C{M㸟X?u:3ngփC̋S:Ly:qUq>T8=p5s֥:DhUqP8Y8$Wl,·+Z/xm*)qzh<ҌŹ{PDu5z36sA'p5jb<qhD_V̝{Hfv1cNVxȬ 2ʴ_o38wg JN$I$I$I$I$I$I$I$I$I$I$I$![IENDB`PKwL\28updraftplus/images/addons-images/cloudfiles-enhanced.pngnu[PNG  IHDRX# pHYs  sRGBgAMA aDIDATxKv!Lns΅^AIn;HXA:+@VfD fs0w@\KRݿsԶ!^U)†&:?'kmGǏqX AG!2E.8~jl_d)0^gSlz9rn(m@T`C$opm\ؙ]ajxIl!D+29ƑD78[fB=Nΰ#CA]:s]8z6QVP L"lB_W#:M`4C@P0gBp)&˸4!Q1AAΝ,u]?& |zj0R>;8'}_lᆯ`K.ձ 5 A GئW, ~28HPЩ#ql\!:- "q%( 1A÷x{ yx1xqKyɍ!#~>WXt6~ ғl{rig НO7#^Gc͊:ȨxoV,MCvdoF]|ztpƒW5|aATSmdΧuPW3&SQZ- 9èuR8^hrԫIczu_B^`:g*0^;7F 8ce~Zfx5j+}9i Ѝ~5?RThNx~`ݨ;#ޭ|0M_+OI Au"ʷq3jx>/JjO%`p&'' BeAeU[xy|y ?MamΑMa<hUbe"Uh?;p\yu>.?aMÇi-e(W<揦ߍrN<0|o?@^gNi^9|l:{C &]lWW4VtW,s*.:?W*wmDoΕДoE  ?oR~G|y<[ the+ =~hzKTѐAhuSRVI>m.cBA1cM=lv^1sfaSD|BlN";׵ňS'~դl9o>>":d?~-EQXvᆪ% tI9}%m;z4<fFnX%O%:?9-84o f}V:?mz\JHE 7%|hg j>v,j o~VpK_ OYQ3[X0;w{{)M& M&ۊN?TYǚ>S|vN0Z\:(g [S(ۖig|jt6*/iеE_'5R/AGQ^2 =G$AOVGJ\GC8i@Wh,AZiٴM? CT !ᰈj CXppJR|qCor]-u퓥ap ?57_7#hȓDF`_VK-m>>!M*ɵ]ؓ0&jM4,cd3EH Q%}PʿWF ?N?CZ瓏+ B) C $4@ّsT0HןX@DHߙTC G(Po* p$:hW8![@~ޛeܿ@ Ȥp1X-ɋoϝJX¶fLx}O[qVvrW C OxR;G"}T ߽3$ޔ4>t 8o;Tw(4c}+fhxw8ncUS'|n,p-^|qaDW \dEy!m94&G0Ĺgƿ#'LrIZm\-w>u> Dr: 7j4&II1N 3p.3uS4kWc_TfUM@xPsh]ttENbg- c봀[G!_83O-Ͱ% #< @) DQ׿2t5;yؙǽvu.mgQ 4TQ'ŭdj x:Q$6~"f%\#>ﶡRo~2`Y ~+.D eGӖbY gDC ONЄ!t>#[O')$1WʼnwÃ]!K@86?F{s%,2l#IP4$h_Jȷ[bfQY Ds 'h{5g Bƾ;WWo!m~,!~S#NcgZԩU_Ixvbe[MïSY6&!AN9]pP:ӕJS "Ԑ4@iU:F=#/ _Qo-7VX'p<)عڳLih5O:ŀw~i8_Gh3yCи.`hS? |;?4 Mۏ0 h2gA/wyfPn4^Eԡ#RjO_)HN?\ƶzo(Ћϟio(Z-~?;DzYs! WIE݀A$Ngէ8DSL&qۤ%jN{Y%<ۇ|+tIȋDx\[+Z7hz Wb P'N'D$NpAc*cT 3laƐ;vEцaLJ (!:BaF$*?r" W`CS-TG % 6xߘ0N'AIENDB`PKwL\]`33/updraftplus/images/addons-images/autobackup.pngnu[PNG  IHDR8X3IDATx흇{U~}__AD(" TtRY""PeelKt4+i~9I>i9ױi'}=al c.(,Jf1P2Y bd(@,f1P2Y bd(@,f1P2Ybd%@,f1P2Ybd%@,Jf1Ybd%@,Jf1Y b%(ln 0p'&--xC g1P2̙)v&]2LusҤyd9-sm-uFUA?ޱʿhD~(쳹ҭS$[^}:K>>dtY(IGW-v=uM A+oHsoWS|ץۦ_='.HxP4F [& %y7 EEe[ՠm4ɋ)u1oDڲoKw̐|4Y'UfK(h qM~QD_$_Ez?iN +$=hhj.YG5'՜PupSg_y P|``!QH8q8qxœ,0C=7n*| % xN0R GJৠ-/!> v y9D s$z6W)dHުV}s B5lҞ#1s#aQ7J9wĖH{u1"07K <3؎K?{0E# \/Q-LLA$zOޫQX813>R͝ÕҜ *9^sȪjaAԫW+lB9gub["AS祕qtNBFTLRnN:d"ҘK7-\ P$kAˍiH6d}nQFy KC^ꞥ(:W s۪W؄r%UyIAAQy^l@pLn\pQ3JԙZLjU,__ؘ~w|>q%l!9Gy z%O"bbԫ8h\pM]ߤ"+ b86WPXXTRF1/"]rPE #Qg6#Z_iT ӵ9Tn0,}2K˔>1,$Ig$&a.ArO7:J.W*U8?>)** JS+J>{ FNOpY Hr}qab45V7W$H&S>uT/+tkvv&]D98kIt:׆?)JaJS @_BYRRє+UjVS{||p)`Y;c(- EU7T^D]D*Kt϶$,ޫޫ3n,&e'#T **uWP* Wk*҇SpDZZ4fW[Cg R%s(ŭP*GC7>#bl%Ҩ(.ɘpF slKOC@9p0! #$DA!քk6v;#[(%P JX鶩pR.L }G c6u -~#Q 1jC?G OٔjmʶB RZD *SBdyJwR N/>  )_?Q\Wf'*3_h26$$6U%~TbzFJA@D!!}9a3a`>AcCDKC5@FAmS 2#VUQCS ߼2\>-,.2(QH#PJ͌ / PP"Iܿf)X{ȹ䷎( RImϪzTzrv妈7(ej:%5dtKDkt'ůwIq;wJZ$%rr [eW5X$&eTj_yU ݋%]^'b:=\4RccJMM*NP)>cKY6Pba odkQEwCy쓙(6}J.,,2XHeyyə7,t0v!pF! OK-I냄")mcYYy %Mb"&qPCl"|"I  6;6rigplW 9 I/={#;~u#>x+MT&yBeI  eP Vb+ PIm!aOmԩ^|׳M_uϤm?*[Y[IF3%R PC9_ `@$ZXXĒOxNl"7 Yy%ܮE@|!$فl}7v: Nڬhh$q]Q8==36.$"DRRDR.K\A|rFf ; k!nYzZxH/(PE@ˑPk5IBbʣGyPY2yNJhl{ KZZ-E VPmhAq acW\r+:Mfb-,E<)9-7 -vgMw=q%TSv̵b78QKpTׇz66\J.rԹJzBBPA;t%'^=ÉKq"@"55ڝ8?X W `Σw\q!_@m#p 6yC*SsD}Um6PR[&`>sip2:wCiyob?H4ɭIkp)TS_NEOWCpPφOkrӡaWjhyu? !vR2:[JCԕgPˏY2xJD /EU#$h;`"RO:}-d'֮"@Q'DnxAAc۠T]h3e#]nA\)75֚zdD0d$h[}_/)k1אJ\ypSs*dۧ)յ:PШΖHQ.G6eCSck3VbQQY< JRT/F_}:Kg HYy{GRvf 3)xfY5+sfND4]CܛNdVUC)~/BQDݣAQZܿP 7MuEA#yړh QO›`'1 ʾ\alTu"*+hR@y޿guP̙c U\ &EDs3RyvK"P;eoJ^(ٿ4BT \+Jywe|V${鶈:!$|,.0sUVP':}QC ~dԈ[ꫨy=uv&8AMC- oPP@Pi8)V[4|֋iޣKCH~#r6?65c̯m{#o # uev5ahK[7PW偵!pI 3#%i`ԨmG%Ħ(RJ+qeQ°D7EäkbkmgOϸqPIV;2kģ#s YP cg;  i_[ʥ I[#Qg6$BѴwS b{k 5$br쯽ObSmdS h5T휓3*-{LXKq$pN ֔`{?6ol[zVc`{-aM5je/|oC$48"R2 "IY}ڏ;9tԯy_|媙, \> 0eM* h#; Oƛb;=~ PsSڗi8D&F@mu7~៎`km5ߒ]O Džh+ ,\m>%L\զK..,X&*bf{)ctb JOjl: w#kZ -Fz(cjn  aO{Fq%8=v :%8]_X@)ʢyj&u 2K 0(n(M,13T8ɨrccze]]}plflT4''7򂤛}./躦U :/D~"GͅҖ E^BVKTJ<0--'O.}ʼnIPՇ~T#KpeQ(@X?yk;DLJLd4?-^˝}-H.srzb'?m|@w\jFEhHOJjt>;sgM)0ǥ6BTe7<4u LLBGDzҮeB,v TVVv"#1'ܙHO@S\~hKB,mH,Աgui:|}&fEUFqIaIX+3A|bP=&;Cǝm!A Ssx1HSU>q6r.5g~:ٳuȗt7ZoBcYմKFLb:  EDcb~1p%KR}NRzzzgD6EOty:\]Rrw?139RK55 KKń%E).1!1)y}MiVHقSwI$-(m蛁~-'4u6( FhVC{lR, g]n,&y &TI.=ϳ"[[3w6ye::L, tȗZw yX5fEQ#v5'] JeRr9T J4z%@XzN$\D j4f'GSw5#A;H\p)/ e#>Bk58QZkM#q4gQuܹi%|*Z%&p_,n͜s9}p(q(:$Rl5(nu7""w7W0AU5K(J )#5ٍ)!4eO}5l753Z:P En+:  ~E ێKzƪ$naK(N`OELJ)Qc!4+F:Vw~,pg4.[CBBBPFݚlW}2J\^əҔݓf-]ic\~tOHÉGK-uRaٓy.w ecT"NQ|=UdM-/\IK& ݞ8u"uf Sһi8-~eۢ☪M6E"0 ZfDB׬=hN:#B, _2{Mw#%mVܥզD9cVMMӹ9T6Sc- Qkp wZ-cK:\e/u>`y -u-(@Nͥ#?tIy2W&T @6 d@[(ESoVGuGhW܎EN{suku'xH(G3s<~L<6.`h hv$;h 0ݥPNu!R-B˙mM6h~*x] K쉵V}ǠX{rP-,:O;]bA;M{q%a7rXl~rPB,˨/J(UB*0˥AIJ-uP@N%k7W8d%!R~ ".:۱(.AJ(4EnQ6n0G,+v*s K\Ej[4NQeFSyiM⫆Ֆ T|ՖuE(-hBk":0C [-D^>լrI|~[1Ѽ䂨OZWCiiHˍ[%vO]-K T \ܹ%wբbK$ oԘJBdڀkK?N=-wƀs9D93ZɥC$˧}1JA.$Z[vC{w,#v~빳9^7J\z<$ak%wVKEBCicWv>x9E.VX6ަz )<1!¥Bs9Cmͪ|C r^K n7F, ¸3_̐Fu;@Xǻ-)5efmK2.?ot~R'K)X^z;wgScc3RR3Ҧ&㓎Oyhm 4̢g;1V;-w!˚G(z! BKzsFBι@*<}k;BIM7m֕[y<}l2[֊ŬcH&KeϒD5FN꫔B׍Z*A%$1ge g Q eɶ,C=2B^YoMhDaf.6k80ӟ1h~^n]TCK-g (C-\ c;x9V:AXjB ^0 |5+ddxm\!*N%%JD7:"܁ ͺ>ROgNOɮOsILjpI:^^:+UE}CAKzYhyHC>vQ/B(c!d,niP%i9t(-²NGJ- ~#$_/=KS$*Z%)sSs~[}4yl x`av;+Wڸc'ҢѤI '0mD".ñ?7ڋM Hw!((Mw3@0 ne7~V5ZZ.W*UU%T>OGIJDiA-\.H<ӣIߠ#n~KtFI%͐ T!2}SȡR;儨htOPbrS뛐tT(TJhb qĬ3_X .ry kyPȻ~əYqIJqQHu<} O 3!:C_7ÉKQЬҬW:.%zSpx蘿A #r -5e|B2>3Ϗry߿M0.%P~.#1ǥ̐8^KQ9 5Uw&SC`!Tԩ%D&1HWXx v}8piwg(׋AYcUV+2mO:Kb\m=° P[,Eex~[r =%eZB xOFQbP"vע$Y@I#>2{_5anv1Kx~wN!; EŏB=-W4 zH ?  g/~5BdDLՙKƒƒc͢- gjw R <["A;,.%1."7<8c%:V<%%&jLV&y@{K 3Gű{(D^3o4>u:@*YLD=j֎| ܎z(0W"2!=`AbaYjB'}Trӈ)i=V*+ǕJJ^RiXc8 A,%|2 H6= &AR >x'e$*P1RVS233"($enr|%Hc^g޴2Jb\.-ұ: }( P1yٷ6l2lA_} 5eظV'](IUQ[.W%XLI$#㓔 JTK?W$MsX2(Nɋأ )wd""#[j`WwB2^vV^LjZ sV.!Uª+ ?D6nӗ::m^18t&ov\qp / AeC`.N( sǁZnkMYzXq/ \^w1.] J^ !XoL_u /NOTk%!)A/3YKWN[j #}{EHp"PW*Yb)'\n+~sի]nغqժ__|Y<#Bf?^n7D|P&Ƹtj(s.hs 4s.d%+.Y5mɪKW#"gӕG>[~glnf熒}NgS+zo V}cWr5F0'Ҷ0NCI̯˷ǹ ˃BZ ҅m<>Z. JBdrCڴ1X!`1ɠ$VR6Þh ;jji$4Sgml;M;@مfiJ:`(rQN%1%esdd;=A"^B"Qwh(x>pp!S2"\X,a䥃BI+hjhYbw?hu pPCJ;q#(JN^ubKQq {z%'fd2\:DF t8A@P0N CIںzh}k)`tD=:~ۗ%H{ըtܓ]s9P%uν!t!/!kp_3AI$č\>N޻К|*A\ݿFQ!lJv@tւ :F kPL W`3UOҵAr= 3 C*,z7 j:qRHLT6S\245A ){/]qם{)"h|0P*x=ڋ+9Y--oe8,b%(,Jf1P2Y bd(@,f1P2Y bd(@,f1P2YeLZ zIENDB`PKwL\ΈFF0updraftplus/images/addons-images/googlecloud.pngnu[PNG  IHDRhhM;PLTEB}jt{~t{~t{~p|t{~t{~t{~t{~t{~t{~t{~t{~t{~t{~t{~ɴt{~t{~t{~D7t{~t{~t{~t{~t{~t{~t{~t{~t{~t{~t{~t{~t{~D8i(t{~t{~t{~t{~t{~t{~t{~t{~t{~t{t{~t{~t{~t{~t{~t{~t{~t{~t{~ڢt{~t{~t{~Ƴt{~B8t{~D7D7t{~ofB=b[PBD7D7μD7D7I}N10ۜD7D7D7BdZOCЬͣϝD7BBB߬ۏ ہoj!BBBBnҕw呮ƗԄ|āBD7AD7ZMHxpW](ɩ|tm@D7BD7{ѱC;˥-iίLM|ӍXBimWzh`~9{X|BD7D7BD7t{~=1ۢ;wFDA3<@=0L?4u?|2>1R@ۃC6-ÿKXWtRNS^[ht+P ɞ& >(!VC)cI50:Ϛ^nڃ |M޷ <ʏ1J?8(ݻqSJ;hXJtpYlbc`]J UIDATxԱ @8( A ȡ?)a uCFv(57T%Xɜ۫ג}!r^1fGc6gO5xjv5Og=p‘'N|DQЫW {GtE]Hf:l ; awϾyƿ;>V=Gg)HZxQ ʣ!)[RU/ _y,R X$J!F<tz+$5JI +sP!<gren9ss=zeEzl_4deE$ xk\seHSPU7O>=$އsխʷ )Ybx'[ːZ)8wI8YBX!We@/N Hxs*OY[?FR~ gY~xA г_c3|nJ/?#]/iyTu~8>*d@$1T @"cIvTABfk̕<&oBRS+g|=!HHifUXr24:YL#B1Kɺc#tnGq*P*8=Kb_K2T^r8Mgk{+-o#Lh/dQAk5UbIY6P1(GH|+e5%)\x"ݙ8$왾 ]Ⱦ.P BORK4% Q?zFa$ݡPU,3-ʣnia 3\ ZXrq#4xQےdSg $iF$=1Ozcd]ۑkMc.zd 0pl֚ "cEA0= p0Iͨwq9f?w#auB才#ZbwJG,YaIjs"ewZ7G1_fg>6Bs'W7GPOW-B T|FT svlG 40E^ai#j'1Vhc;[CE5"ݽ+*f ح)t8GPǫ"h)5Mjz(L;w[5q4\h!55ؚaq];"N45qj==_NyRb;QC8WesE}43zK+lpW|$͂KWbXZFHGwh6C h9A=s;CVG=f!{x_ܳEJ/7w,!nqo,v̓r^wc΃ o-1nPP9wZv#|2%Tv9?4 ;Zx GsCǎKh4 `.9$z;x">LZe$dm%Z![PLePI+СSB 1 ;a\Ѝ &xI7rg7m;Sp~0~#ax3~ߦ^kzt;GD25|]GY7?L͸5s+5&` i>wZݑp>v Ń̠c~4Ջ)x fb9yzр 9ӮHأ~8aA!b) .!Gp;!Ve?4کI@ЇyLί .I4 .A!$ݍ<ϯ.q.3._]U&V}?LM34߉E^ v7U&cc7 rH~ٽKVHTBto*o}sj5.{\l'\Yӈj4_9 $ v|ʵ5$'Wh#yqYK~+LnhtgCØszaȺ-uhʏ\nYBϐcaik㛍k&_jgȆt|ښ`+Yd KPʫT,e zqhC:`0IWH/LФQWt2ΙT*nE"M"h41|-2baO%zΖC1!B!B!B!F]SPK]]]M)8\:r?YUnmHљfhnNVTHAuekZuMeԈ|e^Z*Zص]E0 "5 Шۨq5ƓF {jtz@U`D0w;C /K;^UX5轺VbzhsM)=rXo2.K3J;t?B)Kˡg"[_ -*B77_6LzE@$Qb,:9ui嗪S%4SRTZp,jwk\帟"^BifK(nj*V.KUwSȣ\ТMCԲCV".+W."0D!"KJw'ꪃv)HD RۖC/VaРPxՙ\ba% =vnL/T14cuaµKﴎ'" ]g'.wK^q⇿/<EBuX[Y7@/5GwE{.o B78hFK)B;4f1q|ڶ)2M[_-J^]u3BKHf\? $4ARh(bj1٤,p3Cw(ЇEЗ EN6:."+Lܴ,Y3;SK}:cS:11GƔe >tst:faڗB/o>Ecӎ:Xt"K0Kt)z\rE}dY.d|Do)Z1{bLKSa9t SO%CArFJR:<Δ2X_  R6"ׯA߄:04pFj\t2dh_ӄjC=;Bǣ_C8 6_ ?r>N*44iJC`ݦw{ 28(V^a5?ؠtW?G.z# GA@VD 0z`Aw;`C{ XN)vYhaD^9\Z4}-)ΨGgwtE@? M9B2-OvYH4 6n;G1J);3%Iy!SƬn 0*E׼`})tRsj*б 6;hBS>i`;݌/E(,iDJ n~Ih"0~lo T M -kv o3j@h%4%M:m.CX o M q +,8*[n9quoOøv7e>DtI5͎jO\?fw}2)?%A>>>>>>b_AUUUUUUUUUUUUUU=8o\${;̭IENDB`PKwL\'-updraftplus/images/addons-images/migrator.pngnu[PNG  IHDR,?PLTE#O"#vv#E$O"Q,O!N5" ##ON#k|ON##kk{k}TNOOQP#k}Egy~Nk{OONk}P)uk~?UPkydhVkxUl~jrOhcPSjwO"Vjqij\h\On|igd6uMRQhaafOe>c*R""ZNkvXim[#j#fF" ePjt` "#NN#ioZhd#MN1#="#"#" #" "   -tRNS٭ֳF 5%Pg1 !yI,m  ۡ곽' LJVE("~zi]RM:,b21XTC7-rnvpiT@?<7Æ"vd]C:&700,}]ilggaU IDATxڱOZQ pzaBMxN$$E ,& ℮mX1it0o{|6>aki|%!B!B!B$v1L92ivkڸ-&1MYðl8HհM7FdlG-LJ"C.OL \bEjqsz;ppppppp D[^\KkMh|4#W9zL)IK~mnNVn.g'm8%Qo\>|bq22,(>n6mnNVyn#uN/q]7*IR;8ɨ蜓fBUjQXغǤ86&xh0mr'NY#̧=cX_ƒLj-z/kAg` 󯽖WNЙd\TI/Y9rA׵_(Iff%gcGvss,cuk[*iE25ҊkcL*~nE2N]єm?+ͺFz_7ck1nVc*FZQ*6o޻U\?#4ftQ_OPjb5uT[룴Zn}A~32$ AD!&&Rz޶s9\_SϾ<8l{owm;k#q;ttC#;xW'(|p$rxsb p\|ԁ_á\:9<{uѢ(VpO_CjpOijB#En/KFp\Ep\Ep\7<8|.?~ KqYDD19qE?Q/,qo\$* 1㴖ˑ2o --[g܌SsƓdyvBJɊX-UY+(0}p@i.ù\;ؽ:\uW6w|?Mk$aM93߮tI>^.) Leph]2)-sEh tb.HThj&^d*ۢh`%ܴH4^>+YTr_]ǒdeBYRlye[e~?kWJ4 l9i0X  6Mۼ%0)&1eppBmzYےc|/citHOR|\gc;mYZRЗP9 vhfdYSpm.b2Bl(LHO2\{Dk1'?3myƂCһ#8C,Ḽ676ꣵ ]YE!d]]|U6@CW{*3?ϰde(۾S^Ư+mOy yCVPzK1)RC<~|$ pp"8NIM`&æ) b)AEay9/b&slyb,=3c y:ߕ/iPpUSÅ9[ ,;O҆Ŏ :.]؍zj^HP'Tķ 7@'#e:󝼱3%D?)rGmRTMgpSdЎD#1+ Ɗ@ᶶ^(bsf)GqBk Aɽ%(Óڠ=4/~QS81۝gpcXnNkbSxtrYds@I< m܃q־.um1ғɎ-6Ĉ 81 }bs ExĴ]q G8X-8Wг'q9HWafEɥ|b~2p =~vB-$ʤo$ge:@ުuS󻄘8h6%C]DrBI 'FsyFGq){* ఈ=ٔP+,|qf y&O8c=ג/(8-& ]|)B,OBW*\.R[&Pi I4 .jɠXފ YQqjI”ԜJj :Id'v&FWkr.l~wvدh'J_W|p8h`b]Wgϳ{+%ʞxk#7F_Ep\Ep\Ep\83=D.i/{3hmgH0B-pOmrʎ[8Pvr > Bile{BV19OR,9b5` cs\0?,o Kn3"=QEMT27!9jLiT:@h:P2uTN;})U3ק-mu6Y/җF%h8"m vIZۉ]uI,. 4og h+ov.yS@b(-yw?}@u7X%M>oa PܝJ$QH${6"'rrvovhҘa̕'~6=YZ&Mew3H>sN7#i3xc<'pa-ִ[@ܢvjm|u/~pg%R#8t}<MF vm| OǴ( YˇPk p> {Jw kIa"s,vW5r]3-l!GzD,C gqy09AAAA: `IENDB`PKwL\J I I .updraftplus/images/addons-images/reporting.pngnu[PNG  IHDR,?PLTEOdgVD[^N:KadH^aKpЅWH[orSikG'LD#J+M.RMR3k~HS🪣ДzDՃE]?:.zO=4Fv[gy|x׏x}㼲­iM䐷a~HW9ξܼ۳泝@}cIȸeۀfnSņ^鼧=~P݋rՅldGتʢ±嬕٩⣌n϶Ɏҿ˷w؟חl~dYȬ{j`;RVUGK*˚庢{|Ɇq^S HIDATx Pߺ׍YY%&vMLXˤz0%т.t%Yo$|Mt:Nt:Nt:Nvޜ+ڋ 3Kwط{i7(T6;ȶ0 *m7̧FKui,ȸnSf&Zt2/oۑ dLg 3 <:ps7lg[s6VDu-[AcX%C,0N?;Cc Go=LO(*p'R=qF֓/y+Z&щpS_eİ8DpS8U)Q0{q;13D8IA[VY=H~sdvMMfY7HB:ܵL!v C e eBR!붹%"]͎Ʀp6wskAaͩw-buws 8Wd<'wHɎ젲)Ԧt#ʂC֔k2Warp*?Mnp87N NNqbLk{SNe^:n) gԖL;ubχCYqqZ`"NfOupNpħ PŪ $qdL 6Xi|ֲ~[TJ˶#@ .o"φ!{"'qYtuAtLkP{ p}pYeWPą I.KOuH⦗gpk[K[[2p~sb Nٿ[d u} 4w 2NXͥ! s)0||0<.ށ圻n !Bp(6{tڭG` "0y^I"}?}Vpx) [SgМy]@B97۱9l-8? G4NrƑ_XW!]7>sC\{>?8ܵ.vf2[.Q!5)Rb{!ŤҥS?]Pѵ$%Wi0|M@W?AGKᯏ@u6E׍PMM88l̖JieqvWjپ 4< UE Á R*(ۡM5mh@ m6Ŷ0hG 4'3"٬-mQZ}*d)(!=:[3Rr$ G;Ė?5F KEma( mD9GmDفu-Cm \׍,:y6>pZ[[ȴZ¹HrCuSn22{o延W(<+8RWko.ba? [« ͍=jZqlJVcw]tnSap`'"'FnK^c{\&.!el4诵(L:6Cu?QC(g{+Yciuk2n<# GVjC q`Q#)۵K[&S%t{g8b[atHnMg.%If8v66uwgmdk,Kc/b[I`cJ>pz61ȺŁp?xXcmlQne=.<"ab@[Tk0ڀA5xNlE0Tl cN|  G N3zH\Q70E@ sj=@Pw0r10 t KAЋ:xuCwl$\6|'Fs9k ZPmsȸ`/M"fQ0 F(`@{w0DaxX0ծHe!R ؊Bni2YwbCh1L#gH+r@sqsqsqsWIq2Dqt|{G^▕}.a(ufiwYN.@yHHkc/xl~S5[s}fkpQp%}dgp5/47kD[PQ/ϕSJ(IENDB`PKwL\a0==,updraftplus/images/addons-images/fixtime.pngnu[PNG  IHDR,?PLTEOdgRfiPehD[^CZ]F\`:=J`cLbeH^aI_b.BY\1Uil`supm~*exzbuw}hz|ZnqXlnt4ֹ?7ծ]prŶʿµ縀꾙zڳww_ȠܖЕƻ¥؋z̜ޝԁ̰岒HļĻsϹÆlBȾXȽe=TYPڑirIDATxKAgx fz @ AY "TP<T `/m*]8uck}dddddddddddddddddddDaa<+l9~VŠ5h׽|QʐEdOjR2AM֧z!}hSƟq˶˷=b>KY+mk,Jh Aa_;ERs2%^޴6F:T8 #V%RT, ciHxu\M DkQu2*ԛ >8 Ύ3m.Dɥ@gT^?cSvҝ^KckiAg#D]u2: LVb'K=ލ+%<-EAŒx XOՖ%Й56E輀dGI>{•e $%;FM[+]i]B U/?p.Bj v׎=i6T K$P`|۞K7@᷄cT%r)aE߮dWenn̰a#W1~D62KعW -gC'8bnxZl#rKxHv;<۫kw F}K&g%&6gr7N㤏hFBj#96$ZOw/I.J w.EXFNX/6 ]Mt|*q+Rsr Hoӛ;u9z"6)Z> z *Cr]oH@Zϓbm'9h{UF[9ҽs~QЮK]I>JCYaHW+ |Yfw*6r]/f4u/Mvˎlceak"J$Vk#q,٤XΒ$jf$y,N,7P@v]Uϳ='v+^J:e%u|b|$tZqNʽ/l4_m`s4K=<ޭ4$Ad%vIȊ[ӕM80c8WA8QL0܏KrVPM<' lM7Lg{nAjO Lވش< JQZ_rG'rCJiq Ѥ!-LdȬb'-b pl$̦u>i koSd|W]N#8&l35f!b4;=ċȁyD&C{'DE%ְD{]{L p﷛Z$S^S_&]Oc'MoGwEڴ,\ނ=k輩1C:F\L$l`+i{@SfȤ m *uC{Pvw&B9|pۃ}jpObTfq(9M !TeKLjCە6Eaf 1.̂1(QQ T|#KhbUDRĺҙLfҒ~w;|;E +@/5f>wEMܩh#:e'B#ўXv*ˆ1-;Q?(7ާZ$d6{2,ʅ]Ӈ Rå#T0Ao/1g&EQCY4ϊ.C sR\"%=Ew~M v7 .u,ƥTSq(,2%&~łT\Q(KK1~L"VdJ3*ף 9e;w GR$PyӡO굒pܸ1T{$+s[< \wDJ f%;f[ꎉ,\U-8!G2RJֺ0 <ĉ+,4WwK,Si6XjUrH".۹jy4'ιܐJGf2IJ୹d9 vlVMs=1@Ӆ%cLs_C0< } ^/TdbO)tDڥWA:T Q?6!ƽIgMRSD#;Z0F;{P&x ^EZDe7 D n.}M0QnCw 2AXP.?,(6GcuSYyb >Ô䵄ӏ?Л9nW\{(_SzwMCao=GHt B:2NZYEڊ2эz އJea^:m5'ڔ y>_NImv\5*]55# e[69 閟HdϜ1fF+'Xcmlc͛#cٛ;I鯓 s,28.[)jC}J :PW,Pv0-h1#.y =m:X˴;ztSI 1Ck I0e-$`q NȈiS,FzQPs6kVce}70Qv?U<֕P0̴&ų2Ec%9Ši u{\Njb 1DPT$^|TlYlV!'zYP#gkg8Ae**qȩC%ȄEE[4J?vޫ6p+unzx{ElBpX_) gn9-é% dXEfC)QZq6wzJ7,ۇ_>޽C.Y)K {oYJ|o&Uӕ]&6,B\Bnv*eo6]Avi(7V쨛I$Ѵiʪ4*,߼CYMeX|pkd k$TGbN+Cif1ĈOͭ^Z?~jif CƬjg!) B,O>> =%1%qɋgheDFHpos "ҿhsǻåkV9޾◗)dⲸ^^[,0!nnkͶ?Fkp|aJ.8%-zzy  w$0p$ω \xX`DN}}OQYEKB該趶=A7ظ\bhhn蚢Y\dEJR33<Šnz9B4?U\qLShQ9=H$厗ۓǾ*7 B yqx!& 2! ,٪Q^5=)ؾao77FL]swJST[~|_gҬʔIKU^*S_e{p| %jq㰻ğdlzbmFWqx9Ap#.?saqCN7>^«/;LZ&tRNS 6IDATx  g渃>&W%W%W%W%W%W%W%W%W%W%W%W%W%wA`q"X:9j 28(6"^N.v V t= sX/ }mDoc;Nc;Nc;>0 !82̳3%G6Ǿghf~Qt^sY_z7Zw?˫8!qx]/ja1Lis֚ϫmѩ(,z7,[:u}P?K O,mpL.{WEn+Z+Hd#:$zҘ=^%I3q,ÐINT(ͻF)=E;ǡhȶ3ZFͰW̕੖ZQoꏮmh(0 $lBPdb6yCUm5 'd4Da*4$1DbPߦxU2Ǒ ]QP ֣Q=UPUhC \z|.kO4hOmKPz pqqA!'@(Fy>+nzeC{B}aw=ME#z3Et~G*}ImykK ~{]^d}ASn/ױbfCGy1^rL(i2\Ew[-O֒ǼEQqܘcgwfXewaٕkOPP@P.40TD@9@RAPP@ԼHJ+Բ~@'3,;;ywNԶ7^ q; kdh X/};ʿg[%NYi;'GG'qPNǘ$n{#tvH_c7myƦNe GG> !V,@nĵ4&.zF׀L- DG x -\V;$ Mpԅ ̥RR;kZ\[G ]zɮ@8y2PImv[WydsJӏJthkΝb?j_6_0bU϶'kK[_z)󥏗&sVOkwvڬBR[JzOg~w1 !qxP$#faM<7L&Jc˵33nZoR8gFےF[E'.-*-$zmF7nX<ً޹?Ӿ O􄷔x)h3u9C;Np-Q HǰX8C9 DD":Ф8:|;_tˬ#\&LpAxNFωkMs̥ѵugVd3۽ #]ݖd X!ĭ,WPvo I  D A赀jAy -*#uџ7['S(,:t;b䭭r8PȤIL~޵z|1Sep `cp vKz$ !\u7w,4|A׫&{)Ôs/LzU?"'#?,H3Vrt(pE&$G1d]E:?,GGq?ce,DZ@l,frEzeW&JIi['?=A2< p<7|W}yR #AHxlvPӇ]uY#8bXl6gp{w=P3y7Mx)# i̳'r&ϰmy ImIP(' kFyݐBPa#Iv>S_ .VɴpMj ܋m76tgNv#8WPZn|plL08En4sHJV?Ӽj6* .sJeuWye2]F{Λqy5H !oi.dcS꩹ʜGs?f!n O.%лYglecCSC#W5,Eqc]l`;so'.tkME:R#!*8Ю1ñXʴԊe7awnM.<>]oNCڶvm!(FY9I'8UzS28hSb`);t&͘⮕Elƺ19l b OqL<2zTP LD"pw`\&FF?!;IBqX6-ak+tS'NG!BŖS1gG9bhPq{(" {.@g:fuBd&tN qಡgJ[QiTںF7tWoUG#X(4pyXq3^k쇙FkA8 e YQ\:O ŭ4"9|ÊՉ⊀!`ʚrH͂WWX; }ݽc8 H 믿biI04 \e )i 0hTfd{Jǃ<0NKrJxTGEiJV2r2p6'F™;yݲocoe38rr) R )a3{~X鑒"<3+Xx.`epgܪ!E'[ܹUK]vyf=U eD>pXI-ч-)K/6S<.D`<秤 @L c(}9lʊ `fBzu/z0욧op! \0jL4ι2C;0jށOC%lCIQ`~GK$$ÐjR;] ~)+Y05iNVBx7yv <XK=]`╇?  KQ&o)8'{ +j #z% A8AHXA>QTap8.Cr뾠;,:)<)<{ lFR6lo1&s/Ǝ :qgoYBSnxgت9dJχ?Nl c}Aiaai!H[7u~=JGhQS'XsƠu  vϭ|>Tlal0ots.=Z_av&SFn[5#mTFFN9t?Wf'L9@@9gqNްX!`0؄f MvK&*$,62r:lc|zNm[qGqs)l t!G(X*K'kt4-ff;|q抲aG\JT 햹:(L8|9uS9%8cGU5p! &zpЧ xr{y <꣥܍#QCm,endģ~ABF 8i7Ԇh]کVvV3H]I ۼdVw͜QCGpǯ[t2,Q<\F 9#ғi6I+b tߘp.$HF (#iv*d|E9< [Xh^pޚa*=],/66L#\7DqY# 8a\1$sCBsO0>-n+y\@Sw; ]/h0EDS(JaQ~7alPpY+\n}ŏz3@]3l@4\.캡gewװMIgkglddwrR%Q'pEGNy(ΏTr(f&)7"B  a(p#YPk JWwu ( p,4L=Z0qNR+K W#h(j>EW^"DHmC1CVD,GjbD;uaо61a^]PO>a\Djr,4?|Np?8޺uWW^!RJNE[/ETRiK0/))y{5F 2d g=۳yu|>=M9ՒY ~Cc1%fAƻo, syĈf))s g-5 s܇rQk` Pj06/.^.nH"3L $E4:rH?xIkA%RW  Wg,夣<7m^Mo hDNE!Y?5iK\b9k\ky~JÄ9fv 츶hU5BN`LWXt #r9H Iя]2-^$#''qQFؙ򊩙ݐip'p^ȂlMvEo]^zRJIebrj )LbfYɁ]`^1-yDPIW~pfT>`‰KQ(Xkg\K"BN4=m}/MP@\< E }݋ZŶB+iPb|` *Ŷ_{CsM n(['.S?''¬!3ć:rtɥ/>SHQn½$9B)jG'pfFX.pP/4< '6!jCZ]ՠhgo0T=C϶6061tXwg,šIyGW_])0|y֩6[Z V|-*jO^|Vz =q0X/r G& OvKv{И@T;QSS| Fqx\Le Xm3#KRD~ڑ~` B>38RFךI\0RzcV=MEp] ׁ'%ȜkF/),<:=|5:,d%|!=bF<཈0|9Jy?<ggA.- &7q9aHȃ$$;ï$-݂'1x(mxZMk.G/x@.e; )9ӵ}r1O( Q҈WTk2" ~LJJ:!PsD'6G~؈oe=?|7!WC{T &qHK"p ,E: ءuLughz$%2BC9buқL>\#hI48B`tK;mö.hI4G3"/{?F$!}^|VڴmSjFˍÎ E>sf3|0IłAkkhm֦xeJ"8*}zϔR=ls,!ѺxVaO'/H Zɝ}W"FXF7n%Fjyt2Ğ={.ƞ=c"ܻwkeQVfV;*áolYɂza!j=oNV:CA)[D7Db밂c2*^w9Ll QgM&4 o E.ܾ}{kJ[ۧS^o_Zn][Q`@ψ.hz½KBCTrl4}I ?=Q_rIDZ`fOrBqt>zuύ%~W\)Rtk]rr|X"D81m4cwtl=^4h g5e*!=S(pTXYBj'9Q!5T?B_y]hxϴ 7^H ψ73FFMMq>lCS:VPk"~vC,:@dlC(ܬt@{n9ނt Փ\t5$G2(d v# n/E/g%7\dUpW]h1bfKt.)Uhbx,j;ZR«\@3veұ0ltw6,_nzåf<-RѤoș@pv($jFtpઝs[*Cr ࠧ:>u]MіoޭI߅8!g Ex*nUiI2,ҦR[_O{r{Qrv6Y$g]^$; rDH-^/g ~ޜORyŌݻ[v" HDؐ#ۍAO$k!\nrö`'n-repk6Ӄ.b /19&3Cb1~\ΜuYNƔ8) J hr* ̍РoSsRīBy7@ڲiN-1BBQrvFcqRO.~o,R8uhȦnXw ' \<$tx.[aY"0t"v${(.K9b&(in$ B Az33XNk"AEnrt~,&Kir\Wu돴Nx\4t.c>'u"c469C!lb1ӹ./򰀿Q&.p,j>X gd΋?šz7R~ȹ7/DgMw[yl&I(M?ZOЀ3UȤ:'LwPpsO$+`EИ t].vwaVtL?rGo_|4]^z?',ksdTWw}jډy,r{@aS_ -˯ze;+>>~A\\W ]W~u&7-m ߌhmgΜ[9Rޏ+:ëq ~}͹x1hN9s.+vP&ِgcBՔ2bnʑe4"=hܭ[+D_XJ/J/r6hQ>+I>w\ ;npU]nnȺP׏hY D*G&6ٍ&\;{RE7dDtO?eZ\C>&`مJF.NK[qqrlRM]]TpJSR*nMxT{Wl6(z p8lܘ8QQeJ{{{ p<=v5)]hO@IU2}A?YwwO;).6F)ި=֓LA;'uEL ?^eBNZJ]7̝ή*{6 3s;:^T> YF9}P6˻ĝ7]_4"f= PUitC <~ԍp@gw,C|2*Gz*p9-/9PF,JŹV2Xpƴ%R]_07b+6$&[U.y܎66v6 ?G}D J0OINt51BLlD}4 t8979Kbh:yYU5xWj/&FHECvwXbz%~V.yjNݬn=Qo|fcsfޔ\\sFt9m-܇M|𧌡jnó0՝&-{a%BM_ȷl'hܝzhx*)Ȗ'ۤĶ¡bA]@9oUuk E#bAI@Eƌ3Ko bȰdn1ȁeH" ?Y0TM+ÇX䠷0 4 Sf$ ? ,f[ΏX`S W(B ܡg*KHJ*TR%T.rI%K*Os@ v@9999999999999US}IENDB`PKwL\H.updraftplus/images/addons-images/morefiles.pngnu[PNG  IHDR,?PLTEi&8N/ɱk'지Ľߡ\p.{jOT6m*cG8։Ny<ܘPG7B>41m'ǿd5y)F6̶ﱎJP2-A,q(pSH=t4/,ӾՄv݄odTmXOD_D9W9~*괧ۗlw_Z+IDATxAkAᙀub" CE! "xJ۴ bmIo\ 5ay]H\sxa'øȆY8K|k=q Wq .@%ϸ*`q68냳OX\;=q=38>-gq䧃18>YXq W}lqtK^PύK'XZ?p W ~g\5Ž~yC.yI#?hqK~ ~]786T+M8r?~{ű GǟM&X\+'hmqCpGq&a%ac xN5uAb&OlVO3}&')oqh }bY h& YDٌg#0B'!K FdH$lW9bIC>2uIL$t8!2צ Y_t\oF~%@7i׆kR wf?K/sG:<P7o_0֚`K__Bu sg4'6wH בMf*<=ýwzmz?(>.紡00{+.05-DZ ipUi9H'R8\ϐ4cuU8NU ^Ymw6k#7;١9DawE-BڈjHPܐU8U3RO[ N"SyjMAnui :`'wWevd [ wӜ 7֬Džpё}Wq1ᄗBo-Ab8UxemqL7+fy'Џޮ hlscl B t.αO"\T[p&w*F.- W77@{ӯ53p3θɣ%8-RC] '\ ֐]h.~ys= Re ;"_11p |䎽n}v@ q8p/)As|bxZ|Ǘ2c0.^Ϡ:'( YRN*e=AB<$u*1L,CTP bRuٹθI)"( )tbZNK(kdӳIt'}zj}Zlp&-A?`%*iOM>>FGmiˬ\(-_((((O#.OFM IENDB`PKwL\H H .updraftplus/images/addons-images/multisite.pngnu[PNG  IHDR,?tPLTEQfii&DZ^OdgG]`^D[_am,j(k)PehɰJ`cLbeg$dwx`ecBY\Xlnr䙥ZnqF㔡f!ǸͶkq2ﴒThkgM{@u7o.v}ZTx;лa׳rĪj|~˳w>UYy9PTꡬYU ̾ƽ:; IDATxIo0?K$-^,? m@}V$z@UsO Nʔi <.E<9999999999999999ԀWRk"xӸV=,o\_8;"o{s*K.P3)"V!8I\p(TAQrzQxr8yAXwiyӤJV{H&}-X1 5*!*xX걙g†w#?q]r@)9~Ga ]VjD𝹲|BNΈ\,ʎR rJNc4MXgQäp9!>[0 #|<Z%)9k/BKr'UaHdEt+sZA7*LÊ(?] vw?'] ? fCDXIB]N(,5'hm|<'EP} ru#WJnj&9)6(GMnZ<1#6@r s/ `fX(:IhOrCWj ~ĵ0$c9=aJӭMCa>ޘ80MeȼɌx:7O(Pyz}kПĵlɽsOgb?yM:Ξ.⯖fcO)UsǏ'2ÇI'BܵTqLiVFwӗt&TL36hFCEn%&џkpl&m\M&Ē?G^ n ᗔ PיAĶK Ե5vƣAƠnm16mc$.;ۆlץ춡PWhםyi}GC|<=3.d ͞x2Tr4AA*MT }`0lLt5oQ,7=Q@j 0˧YhMnlh5:u,R`p5-yjq4Nw%kJ髮Nr249sLq/QN1ښIPt`ނ_O)U8N){XER5JA>F:)Jch\ ĕ!* Ėg3 f4"㸙[?>.|B8^E/'.Źzkyw[7*p4O/ZOБ#`cxDqL!88888888888y#dFQ[Xc{A1mLsMmGH7eo? ,S!\x?!5)xTh"5`$`R>v[#BqM䱢Lh+~ >V Cs2"NY hܷ On]u G4LA<˾qR+Mɬ.5saiϸ88&5;`,]+X>ӹ8[0ge%zqġ9WW7*|gtç1Mqp`Q4rB5~\ZS3wuD=M[zf̄f(9הp_a W7YHq-W7|MKk ! [ɔ%Fԣ0[%&_ 'CZ*^T$,vOG;ۓ2#|:!QJCAAAAİIENDB`PKwL\Qb2updraftplus/images/addons-images/anonymisation.pngnu[PNG  IHDR,?PLTEOdfOdfOdfOdfOdfOdfNdfOdfOdfOdfOdfTddOdfOdfOdfOdfOdfOdfOdfOdfie[\daOdfOdfOdfOdfOdfOdfOdfg>OdfOdfOdfOdfOdfOdfOdfOdfOdfOdfOdfOdfOdfg?OdfOdfOdfOdfh,Odfh6h5OdfOdfgCh0g=gAh/Odfh0h9h;gAg?g?i'h1g6h1g=h5Odfg?h-h4i,h5g8h6h,h6i'h.g=h/i*Odfi&i&i"MdgPdfji$i#j'Kdhi!?cmAcl=cni%i jEdjIdiPde;coi&V ^9cpii(Zg#be]ueUfGi!XT CdkGdjbi,i%j\h5d `_Xdbr2k(h$gDi*i'칒UdcgAh2g8i)6cqh-i#]e`ge[peWfHgEh/jίɩ뱈}vjeZfOfJEg>y;ӷxeSQ}AgTGE?'IDATx Pl"@QKHޠLfFKN$~,JS뒾YuӍ&oWx-g^ymcMӴԣ8<5&uu>~휦 Jus¿u,!5O17Rp?0vH!40|"⣏)r`ɮOBe ɑ2i`qD:$ʭh构ؔZMm'LV2Hv;nCB uiP;=/릵 Ծj(VXx<ÐMNYf! - &\SzPK/9/~/vU}?5Er4eqMg0~^>!yX݀&^<(;8W ɬBp\UᎭm2t #D_{?Λ.7Vk}}qPT]n:>_tKU 9vB`YZlafh?[ hk$W-U{7P*V]a94jo(|Cw۾o O*8( 71\n$MbjW7oiyW UsVhb%+> c0\[tc4V H7yN;q1+Iͤ/\Fkkž&I-`jEa&HRUV=Q,vD$P\಍Εs{|8ʆ9$qqF3b熁YG$m@p@+Ҭus@x =v1i}k$w!kGcA׍aq$0 O!9XW>`̓VA5CkpVLW>;N+ThN _z|?7_(}BH'q,e&L2 jS]H%{W=v mku3s=AECq&dŖ6ݽڒ}vQQloӷ鄑qv*'CĔȺ Sa_Z 84Y2$8V}mAv*k{dD%DȥTW}FzT  䚟ADŽʭ`/z6rr}N4w+g=~p7ҜE3TEL[F_F^.3d2ZBL)a8mQ1d5k";,R.fzU'*)p2<R Fkj+˲vܲqPꍔ%rdۉ}UbD8(!ߕ7k6R=As_ -#uEaˑI>Gr\N%5#)JZl'r`E`'Hn?-7:L$̊ y?깇Y$p]!o9|~z ß'd.Zn [N2( u_r%`V ,74KlS벚~g !2rArfI9;Y~ RDME9o9.-u\I## H6.Zn${Yȩeͮz/f+k ^C]LZ5%MR߷ k7l=sT?f>u.z&!֡{ЄcY~v013;p Z|Ϟ/K` '+= ܨ\+Drέ'^k(@y!4I33Fݪ/OG>C=?ra\0D ~3Sq<}:uN8 @ɥ*¸]4(([ 8t)0t*T\Nlt3,G:mܬ'έY-صir~'9m^|\[`0alw4lDڤ-&*ԽmPtF1I=<^;#WMMn)`)?Ӳ<):^I~0sR^)Xpi Lfr7gHVu}tʅ'z仉WL7Љp91Ǧ~:l}3akہ)v#*inys1 sb+={!K>=U6=9X?gp"Gy1Sev||H¬ѳyr; t9b~)7PSbNFϱ6/ۼT}Na]a2%PC1g,R=rPEs-Su/?˱VČ@uWD~v=NӬKXtrVR`᭒%Vx*{%W\l‡5 7OkN2 jWX𧯙(74= TkA'î!9l~ř/X4>(P)naW?L[4YpFIz+MQgגlALnHp6@/d2eRPG5r Z8!%Q=-;Uƞ[Yw9@mXY%c@Vwn|-$H<XEؑIuYF-CXRy/X6a!P 6z,dzX}9znH/8Uvp"U:_#κ1ށ cB]xd=Sz:B@Ds> #L~ԲfP3>㌕J W.O?=_0 )X}+RQn 8dPц`ZNW7F5p ݾ(+ru2T$nO"6Kw -,_p47*޽ !ūY7Cn {0O՛Iw+w$`ņ鍽f?E8X~)H9"sf?phdgw>DC#BuKnǟ/OkAicВJ)O~^tEw]wn/*dAK`ƣJbS!:%:S;;o2o[UӅ%Լ!wLHqDq,z-DJdI@qd-شIx%$VX|8K+9?oVw]4(D¬+e/J(r7  c}`GhFOE4x;(4)@T0ΕG18aQVH};vlFͺM9^!sL jZvݝ( >b8YnFIxh'^j$MX28% f W`Z$}s똪&BjwY&;$(_VɶM$'KV$rvJTD^E\/w, (7j% 챒4g{E>Uk%<`A,dSYȊAg!lѼ zPOcnP2HDE27!RU 9ּGIvaʭ:28`[0Ohw6wJGZEn peN6 J#͠ߴ'}$9IENDB`PKwL\:hj  0updraftplus/images/addons-images/morestorage.pngnu[PNG  IHDR,?PLTEOdgVi&:j(RfhK5aCY]^VPjn߯@9ӡ4f":Р4;RL/K`cYۧ5OF\_FbkKRq1i'cHWn-i!﯊KdhSoߪ6i#θ7}ewzZorUhki\|Aw977ȯ񻜋vh*¶ItҮt~Spc\dag8׽ҩە`ke[fKgBh0*ҽj،?[d|fS۞wxWVjWMөEàEֽr{\a IDATx`v 5 >Kap"dat 3`ᗸpUtC     aht>-fbV 6V8."ܛ~R1پeqԾYF;L R_Iy:Sf7o#QƭHHM&y䚯 '% oVֳ5}id'?Sٻ!n _^vb܊2,F)gTKYd<„WEngEaEa}„ w( NQ*!M*8&\_&ܩ(L(L(„S /+S&\]&ܫ(LOQfL(LCQp00NEaEa=„WS&\_&H1^E9fM~i5c F +)FB(Y4P(% "y\D2f듞vϞ]…x,b d~mEbڌ,\)]YJ* p%H?p0ÉKV*J…0,\(J>7&*8-M'/o;Uyx{!–&Z)g pY)KPx#w3r Sɵw&"ԿXJMخKёӸ^44ps[SDqex ?'LX^ʭDo V Bٷ!شAB>(dkq>0p/⦞䢰UV ˤ6 ] #(d(v@6 @v=Ϲd&Ʀ@ a(`B&1UM&ažUv^^% I.!TTZK/-mYli{<>ofOSK1UR|W$۹+|??&|VܧJx: ²!ؽuB4|]uv(Rrя< Hal/Rn|g\Tv(2[eQ 'j$7`ⶃ[&^mr<ϥEJԺ]"ۺCÄN6aRmWW$\aq2`3]Ckhl7Qd gӸ J ?;=-rfj. VBp]1B܀ih6I1%+`)AؑU8M$E40rct0JqJ ͐ssnS*1\3bei3Q1L.4MVOTWURZ ASF/X0 U , |:LbYFfP b+jTWP%#"Jkun/!t'T_8&v'rl!OzzL#"U7Qtb!Q)|Xq 硅XYϜVg9LMѢd#BGGkCqS[yo˭ qX;":i9HtܤsoS a ғ("ݞJ?q'6M] dDypx?'K}ay߂~r߿&toKcT;P?{` )[rBA?9qr3C>zKqPcrPp՛1QcZ \ךӣrmSΥB`6zLsȥSrY #r3 x5ʵV"Txcy`^*tTj[,7Vr|$9]-DŽ윩WTnT^1]8- yUrM(kΩ[K-cx5v^ʨQ# :s] %e})_ lrOb7E|t}sI`TP"aŷ_ ØWmra 98ҧ%#POr c9f@Pauµ{C/l n_9Kǘ`L?:1p` rwiHZcV%E-6]k`d5# oZ|V=nBI-bWQE^JsOsL3AH렗W2`X IENDB`PKwL\!Ep-updraftplus/images/addons-images/onedrive.pngnu[PNG  IHDR ߁PLTEJIJIIIIIIIIIIIIIIIIJIIIIIIJJIIIIIIIJIIIIIIIIJIJIJQ1tRNS :ϘoK ɒ5Z+ֈvg_"۸|NDT?1&fvTpIDATx钛0 `8! W\侯Vr- ݝ,;L%"+@!B!B!r^6.H~ș;-d3xiuc< z.C0c̰p/fdX-yuu -x4^ٙFX4)BrN&&fA*X7 Pǖxʹ6Vc\o4܌M?]=+E3g'aM|G0ď e&E94$J8Qbq {*R7ww6l8ᘁ0iA`1>=NaY1|/֟s,ƗflQ&Q-^thq9q #1f(I^ql"@ Ky=lAs:cSi!+UØZ 6M1J|e؂ =Fl V\|s(m+^{mð ? F |+W,?A=N)J(_LHVV ̈́a[&V#ReVCT@Z'5%b_Duۣ2˔獍)!>isTwPϽ,Ǩ;\PÀ$+gT.V$L2؉ HaA+F=7IwV+]#YM;ǯ%ˊʟrQozRlQS/JlqϺɏböQ5TX w=곁*=Q*YK 0zڴvq]'l^R-Pd|I}Tovƾ=Q%jхv=j젥P uTYIv@lcwN3B!B!B!_^&Fw'IENDB`PKwL\Lv,,*updraftplus/images/addons-images/azure.pngnu[PNG  IHDR2PLTEd);t1̘q d .6- yD'%:"QC4 p]GCn2 &쉉^=[07E{WҼdGO~F 2$`0" &rCU ܩ"+lv6͇{4?p{a'M'[oqjض3.8%"0U@X;3!afebDdRw)$1(Ja<$Ii)-lْ𜆖ό~6tli# {/R]Y%kׂz:&,|nOD#9qn #i/85qZUAAfiiT>C9ny*咄ou"Mǡ] IA,i#S[S}Kyy X'T|UW[e\hK6N/JVow5$=Aa4F0N(6"Q*ß}ut޸*X[.4#s)QR0TpC< Jr89uZQNg`/Nj pS_YR6 Yz/VX363BX>Kv:e`.UF;%?WzqBB6Ku:\+Uϒ}.tYqAAfRVHfհ*Ur(r1N%FEIYa˦+4i%9ecf==_ڽ*&^ջwll|jDvD_^m۬ܦ/u)64'6҅32㢠'[q)A0švdqrRE b=HֲphjbZSϩCzQ:k-+3f!{cN2mئIDiW :qѣFAPj̙/<|HA^qQ Yum$C%tc:|hvxڞX xa0޵ׯ?zDA^~uXzU"].ShZv^'چ xӕ[gϝ;%]zcsϚM٬rSZ2FnmmM1œ@  y@zh@\ o]HJT次j Æ"j7;Ufͪto{O.Ѹ}ZLJF͘jjj#+-(@&\)#Db4*3ezO}qyyuQ@VVb;0$;郄ͫ cB1wDzUxufeQQh^Tdɠ.fR)";Y&X ȬB-+cL0k9\Hډ  pV࿌1 7VQZ%]KdB*{]Q#`QAH#uԑ:RGH#uԑ:RGH#uԑ:RAH#uԑ:RG%:vԑᯟ> =cTt- ~}PԳI%Z-u"4i@f8'!1,{c[.KE;i #d2I&{y W9%0zCao}=։-Ϗw=#2r p_ıNu&imc]۶}>MBݺQ64FXgpݿґ]tzȥK]MzepdV@]uw{_ZyS+{]-\b+g>dN̽ i-\kpH;u k^|h=ڎuۂ5:${32ԍ/zَЎAK}8 4S tcfIhrhĵ`TU{_?DDtyK,^<3SKYhվwۄoָ \'b>Z5bϜe'dq2nJhN^b?:KQAH#uԑ:RGH#uԑ:RGH#uԑ:RGH#uԑ:RGH;Z=#u1&Ss1W!K(0laHmVP@ɧVHw[V-2r K#2q2 q02ˤQy'NbO ?)-?\Td +d Fp{B8JR1&Lܷm@dj#>SSY?ָ XwL3qk> r`dj'kr@VW9}7:MdOG{M׫dm;m)Lc.q/:[!(p!ݖNl^va๓jDf5.uJJ#Nf%J.QlLhU()V>_˩ gn߭.lt {lҍI PՎS\x i+ IIT6T%H4z;&M\fk3o8˨KSRdY=0c#.+S''4:.ʐK/x0H-M߾߹_.zUfQ,Zpƌq _~b&~o@ku#I,-MFD$IQ h..O:C ҝEjU\Cr |m 7KBv<MKt6ʝI4m37bK>yւcx?jg~0%y<! ͏):;BD2--[rXz]{ϔs#cc#d|,öε~FW1W @ᢊsnռoacÇy !DMg{Jv}GzͷsԂX  V1*9qxF\mh0Rk^onIYYپ.|[M ߿11j 30dD@wEp :?8nH`pۡ=O~ܔի>SSs]M"9Yѯܾ syw^*_"®$&&",${rzOݿ|Uͫ^?ޜ0*ng߫(ۋVRZk^(ûu+ve:z{VDŁvPg^#L7:ei:AA*b'` t 4X!_I,=gs|6n8qcX`]J|Gw;z((147E;{CONTch<'.-,X$ԇ͞=|x(MZrB&MFwƂX)6lK6fÂh(I]>,n44ǂLdHM5@Z]:P]+P j4`Pxu0uBcOKKanmP::WE$R1̎d;MM;x@ @ @ @ _7 F(`ϊT5Y[-IENDB`PKwL\ CC1updraftplus/images/addons-images/moredatabase.pngnu[PNG  IHDR,?PLTEOdgNV:Pegi&;Qef7D^j脯QKk)WVJqCҡ4KadҁNYVO`cLyAL_ijZNΕSRfiM:<_Jbe Р4{EMpBBX\McgDZ^97h$JJ`cG]`T-vF:L2QQَ^.uEۭBm,ZnqG`iyHv9j{~kZ76֤5q3UikOַ˴ޜOcuxP|A7¦[mc[T[μǩdtHԢ4zo|OyYДм|wtjۇYWشϰӝձ̎،ƀTpxܐfdsw]IpCƿݷڪSd`~\S}QП4ǢǵչVݨ֠zyPjMI=ͳՠώѶrӶlazihfuUͦE?4  IDATxM@!9 xrBVhz=TAu}Y=,^DPND*̟>y{?L %%%%%%%%%%%%%%%%%%%%%%%%%2 W&d#C'TY;uɀ,Kxl{k#{8։2pg;y,ӄ|6 U6lӹyZ]r\w\˺CKY;s2\7GvnȌu1"Cge^c'lt.(hv7\42/F39_3s-0G͞G`: [FW~+e.l@~wQ-n9ٸFSۍRi/ 8LJhU0kT.85d $T4ԛu(( "aSw[j(Jzž Xb2j^oPAdžIFQ@-GiZ2mHQ`=ITbdQ1=;Ȍ\ኪ@Ǣh׫J~(mp:f_>[7&ioR\}@l%Bt%k;54FXTQAiA4a>NY9>l [Ϧ5VBbMrln00f;-dk < cEҫXF648 ,_14At|S=֩(R焑 8Q/Iٔߞ_=߇?pj'e<5^nWebOkhi⡳~zg#7B\W cr 72hz˰DupՏk^0\JOjHz#{hO~^%T8Z;ա$\08G8 ^rx`IRbŬåf-a5aePv^t[N4Mǹy$ɵN#蒴ė+6Gm#mmoQ"+nT7c:IVS&x0/>[}*(B:`xsd4&7Nt ˷N#A>CL(k]}#$.dJrU{9MUO!]rܥv/w +IJ/nduw-?qYY(FOYG`CDZ=( NݹӎzS~8P=vX~qb]QQ)â׮Trd jR])ptJ~~YaIl|Dw `,}az2o(MA|K$ ̈́qyt`[I(I ʮN)2*fŐjZQv?hpЅE"B~xrRרJ̢}_˪*4*{))J/?)))))))))))))))))y2KQ?s {hΤzTy͕\=u|t{ws_p{fţO@Osbѯ:r޽3݋am<ҩ]=rtaA 0pkkshMG8- .p{qZ {]N+G04]5]g{Ei .qK}o\c[~97KKܕVoBK-JSȮgAe˜&*h`UI,*ϼkP[+͘ܒ.9 ZÞBi7zo]G'|27aɭځ-CC{LD/95YʫΉ_|otTy DXZdHʣJb'mJ/)e {7~[L zTSAZGhmۉ7sP1YK*|#e  ׎ 0,m AG=pRȧ;\;LMW9~Įt=+;m5y+ I5:%۫-LPWwʻm2ܻ?bAҷ~{w4R/2+\ ,{Sxk Ԉ^8jXڿnߖe yf{r 1p06lSF#:Q;# #i.e҈ތui9.,&zgaވ5 %U*&:I4q{F/OX%FIDZڃ\)[w4sf_\c8 vQZam?-BO]| rc#:cGg75n7;r&,iD7%w'P"9~hp42;zc."#nF C@ڠ!{srEKm{f!JpA;M}:>vu}Oϝ?-GFKѲ:䎌\ߙ,}N&nKhD7 [RZ$iD'rt?T'\D4K-4}4&l%kKvmyxkKwӡ6nx5"$Ȱ+dvJٓ%Zkd߬JobU;q1n UQ,9ښXe5ٴ{[AL|lS54'ar/l2lS Ԙ{jGJbebF ǻǹQ7w~>n1bNplh) W(((((((((((((((((((((((((((((_<#vIENDB`PKwL\Pmm+updraftplus/images/addons-images/wp-cli.pngnu[PNG  IHDRddGyMYC69[XH*洕3aRO!1vn]bhaᚯrQYh+{hH!F4RB%9ҡ} *bI͐b :?͂NF!uCbĝ}v.O|&9d }.Xh\+,R ÈXEk-.x; }# ߃o"oBkD'_Fk72lNڕ;qKi!p4$Z^4B6EWjW/x.6+A$Ӏ߾.Ut<9Ƌn.dBlre狱'KðZ(*|׆EeWef-G~[//{AY[|b+Y~K>Rl1\(|?#!Sk[V>ժCl[TׇE'fI{-{6ޥ=i-[Mpbbֲ3ZygqcK1b0q G=#i[Z 1l w@lO=p[yǖ|5qNK}f\[\yU),7{nӚ5"UȯpAh /xn3Z1pC *|xqW;B==Ox<O.B#`!Ǒ4Gzoil#`nxrIfXo!WCyyRwrAxnca(o9fBxk Q yN$ 'B|E0N$M H R|ZA&QFP!Śdb% `YZ2t1 lq,@qbϱTKx>fsrrUj&( 2@GrgCru۵"wnGmZ4+T3L:u_9s>ѯwlCl Uy:'ys! Iϴ *5\ʋe ,ír֝wtΙMCk)O+J hoNܒ.HEy)5oܵ @͑e 6V!!4n(䒈! [扆A y2:"Y˰DŽZaX:YG +~.0%P%v@p6RlcUkٞ WRy VjHERڸֲŚ5Em7O KGH>[anVS->폡6t*-'Tժ|.ߕL:O,VJ ZN |{tf{>IkPkO{)Ikє)bWSCKWrk5kǯ@\X>Y;֠ޑ؟D콻Nj==o+wHjS)`3~C{8&&&듈 1n$/!]fb[>XyM$}Z\8NcǠ0h6z,QA댰8DN1O9ysj;'#/{mޘjסHz\׸ĵS_eʔy؀' G HڸyvG`/ayq|yq|l 扆 -X\xd J'j;#8j~ 䊆 *r,g# \ ac6d^߰Ӊ|Jw>pZ~t#?7NMWݨEBkiŹӅu771Y6`ؼ5`s3@_hcٸ6ȯMYeKC#˳ p-`D`,9V +5Vm}=|>3rwVưF48&,50z-b#F欉[1l-ѱ|"["cJsP?(An޵Ԍ% rJ?πwc`c+6r17ȸFlIl$Wnqa`g-gsO1qJ\gJ8 /?c6\,84˨3Lfg¸#Nab (Mtw8:/ WEƺ7no;t64~mj6%mP >ڤxDW ]o1 KP$!S~:OU/q Sj;#1Hc:>-j靮ͬ.9pޙ:ߋ7T]ۄ| n gנּtIKMIm}df@|DwK3iM+&MbS>GLhVآ@?F2?rػ]@VBTG &aTO7\c֐r9#5yZp]ƻokJblou6w1x`?dzt2@xrN~;]W[MgzL7Bulz(&߰ DleddCB´5n+iO5 iMi{biI& N4&UAlp|cr$Ζ=O7> 2k R;!:զq)4\cY,6OE5pO.{i^ ϳ=t)6]KW}h`e`0 wi=Gy1/q28F xeЗ6kboۊ5mDNr9F)F)n6q}؟ְUE͒}f\CYt1 G40}qV${Rlڃ4nowM5ň%DZ~3q.ZDS_߇ػu$-رD7W\k~NdYNM~߽4i~VԸrCE)sB)SL2e ' yl>}Ӌ10q9q ]-+DD;m`kO.yL(㒺C98*.3ur-@ /CܥTWV"4{Y;lx@P]6*08B\:RZ%m~>t՝BTd,x7K_G `] @:TX^@,I Ùdg'C'nԽvRw< ""&`ObN(uZߍM+.]VJ0[AMX׺ALB f+gV +EH%nV1b!6xluIKv>m!nt Pf7!K+&!- 0aaHFך)*Rj_׻?lEhdJW8pe¶l뇽F~=LALͩA$[U[ۡ!\?TCCC1pI:L~ ҂yJo֍HzB`Ŏm .>exR3(RXnv7X2qGlw]>Smq*lE$6&2ȵ ny+~BGS}[,"p]Hl >UfcVy"`t468n ],1h Sm Q 퍴nµ{5Хڽf|V<E>Ȼ]ݐְe$K͂18X-q"㮹moV>S ]gGb*z3=HdJ|[P"Ow*q}x7|%zcݏ@jo:2rUٞdnno*:l=!v9#l[#Xb\sĶcJ|m@o3 7!@|Av. 6Үc{");Ywa+\-·s As)3]gPn@-yD.8H=y!6tTȋT|ʨ9 1jqIGQI;ΎLEB!@b(ڀ[]qdH^%57.1ng9_68gL#Y33st1Uۏ8/&>6= aD<i ]MUyxX3ZN.S b"+1:^韮Eב*8L}GgHM nw;oA.KCW9u-i*r77k]SL2eʔ)SLO~G݅I\ ؛ NئF"p4kNݑC9P^S?rq N:L 2rAPw&Ǐ Ou8C$;C8EI(R sS9̆ωN0Z8ip2#VWn{;jS [9ĆqH_t1g>=ASH23D3՝b|HmBN3 ɻ:#5KI *ZN(s}*nd, u;6&0MO%HO~bn(Yhるgp0's9Z)EYdΛ8qޏ^#$D7"\?TDh2!GA[xSzVkE7Cju"oxNۏP whSo?E8[>.)~1|!9݌LNӽ+]#G@w`3)>vݎfb}mwEgf 4~b 5*2as (F`X]'2Hb!6xX8 $h7$Hb" v 0Cٍg"v$r*&2`C"ԓH8$V=g>pr*6% 4bɄL &VF7HK͆X&@"qka7:GjdewKngs"!E1*Ӊ%s><cqd쭏㉾x<'O"Lc\$S$ x@NF.ԠT}B,2` dctmobz!X%ȻOQ}@`8ÄPw"(җ,2ƢPL'6A}G܁> bqPģF3>`G>oL]>Wty@BAxᫎ/]gmC$3ރLn #Db>M&-䅺î/rBDǓWS~A* }SPQ}R3 kvXC`to;ҙNK?  o'SVm"]eOt@/A iLF($ngQz* bӂ7ܫ- .hzzM ."):EBC:='wa?i #أ>pֈL#i~S#{>!+H :c ȋr=ciƔ:tf/{ F9jH&iI`Dx),b7?$<.R<8;^HUYʣK2NK⊺B'+/Xy&-Ӫ;a)-|lk8tc]*ntm ҇/L 6!2:eBq:GH} N14 Q&R&L1$.:WԘ<퉤&DƋ,VNG'$g5~N>lLѧH㕖mB ++X]{) TևE}.q~$# gmA<ӫ- wb~t%1۹j5r=q@ ,N*!k{?೮~(y|m;o]&Np혯OxVQJVDBE7|]\QaM#ur?F9l.-t*t,'#]B"1+R- &U6Fb%R=IdWf׆K,7"9=ӄ#lPV2E_硺HרC\ ' @J*V*T }JU2U(H4~FS鈵" nI Q:0d#HFE &UTIljQTgIXY %=JL摗Y+U҄RKu汼E\rڍO*נ$լMl[ݺzVQ]:5kS" )H v |]a$ V LuLuyofrmz@֓@P'IZ$S$qCw4?@{>X%ITv؍b[J dz!.JV[)wrrDN KaZ2#_^4[Z&HZ$y֢)I{ь)}uH$X>Uh @BST9t*lj꾑|}//[ZCPVFV͉iboے۵rG]k[L|ذU v>>S+Zy_.S2J[Rn]ϗ n~i0$=ӡ wlK{svw۳)ϴJDBתuu`F#*F}e^U':WR&JAJ|a7\du@;{.Sg(m.iO$AQ1E}qqofl{]ѷqɾ?F콞;Ru"Ѕj~<۬Nҕ}ĥ~Ugq@uowO7FK>1/q zQ@K٧;9NJߨ>$uiއ&R yPu=)?ABw>e^ c1| `qL@CS"*D<<6a X4!b=uai$~8Ǝ q#c(Ha1j% D+uיA .e]*q.XX@$S_n},=a):`UE.1ANرVIkք)Ua]FQq?Ǧ"VQ\%zsq))#쨗qI_._EoEMyߍFSAޣ3.۶IyçXt ~txwjP qKf佻@;۶^OKi>ρhSu]b޷'`^sO<#.AqF:{H{dUATVUwے*t$wt@-L2eʔ)SL2eʔ)SL2er x2ewOtqn(S+ B(S+8D(2e'f4AtQ,{Dp[;ʔeqPU%eʲVtcau)   GP_-e\pDgۀ5]Sl`DLY7_P!2e\Tn2eA0ʔ/d$5CE2_6P?"n*SKp_-Ȗ*Sņ< ސAWʔ+A@߸ [2e  A^TQwX2f#-OaDa5TLوV@3P@၅*e9F#|"&MBkHp`aheŦkcW"~ (@"5 =pC 'XU#m\pT_"b, c 0 Y'v5^m<\ EW"b\&(!33~OnTDo+f8\l&LxÄ ȈXA72?|2jY,r\bN `&Todyh`p~`益ae9^/R=g$*~"P@f c2TVvlZѐS  2 .)^ %dhဿ 0V1!(&ai{ iL|ބ+y"f(3F*HUЩyewf y0@ Qw^h(1^$ۆIE> y%12Z=):bH?@ n9.P$[ B5=+ _ͫn *R^=ʲ YC)ѯsLo; 3fE.D4(6[`0p aX`LZL Uejѐ!fR/ ebonȝb)A8/mFQ;'CYےЈavB"b @ )O{ W,? 3 SM oz:e- pyh,HDR2K `&T~W%}cA>(lxԣ2.'EYʰwdUc%}3 &p B\O.VBkz>&^hǪ'Eۚ=± Xրj7DjX%|'q$pnEb0#WE݆)thTOLۆ"ccXt`Ypc xK7@m!'-b>(dE{A)Qa= 6{Cx ߼w.XA (v}413+zWQO2Ҁ@,2f}W&B7 Co 7ܹ\ŢX- !SO2l[x̃~;2&ɿkRoezSVArE7j"  ʇUSO2+@8vGĺ,nDd_wξ.RM7@:B/JXER#/(i,m,eQDaA1"RBD& w$|( բ s$L9OBm/}xfTŷD|F(>VׇeDXkȧ&0g>i"ua)zN⡝A( 7nUS,y@oޏ`"\ey7*MY"odo8ex Fz(uɼ ǜ*bAf,@2?܏{^=uÿ&("Q!FgE)'V9MjE# MC{_o[(Ⱦ{p@0@=5ێ˞B1Fn1<`o#>Axj`"*qmT bkS>ȸs> .ݳ'lzS=\pM^y~zP GeA&̊O L>@H^ .x?qLL|\ЄSzo{[ ̣>Y<_%#;_A#&PzI3'r̀@!*:~p|U~7b TkL$a"=#O>`V@ BM./ءO1z \L\t_ #" EPcx>O9ƷJZh6x!Q9^n7x7"8]҅o @b$ߋ?,}O!3&W<]yYF~xDټPYxpSpzfOvCNZ ! q#L05*Pq ʕPqs =3 7AR;S2?Qx轣5?鏇dt+K3 ; -;F PSnzafzsXFnB8UF,e(D1ԕD}Wp^q/ pɅqVPSj]zzs f8A SyíF%*q^t1z0 9E.2r^?q}a _Eu7cy1M>祚uO^sGY;F9\d4g8Śb|ǪN1?yݗ CH@n=VXѽfkmr9NY _t٤w9?X_Lp -ei]/gbX俀 bLx|Or@xŕ(y-D瓦wDisѹ *'_nʲ! H<}矗\drA.71DC /r[yhg20S.lr]u[=Tl1Ƈ]ŋU:yW?dQ^i,@AgAtC&0HL/*ބ>̼ߗ30",4g[ :犰񊫧<6 p)ʮkg?(H<x+~ o߁B.X g0 b&<}5?BZ4+ה*9b}PrqZ6:/ =N{]J7x/W5L !6iVE}SK!uºu'f-v4I,gy x;N"{ݺ[ sꩿ]5Csua?[S bMɕk ^|9h*<=S'N# 3r 3Kk >z D  ^=@Hʂ.*/ĥ\tg<=^)ϭiPX=v'Tgs2uwLt!,zꩿbn(O~ۀ[`'7 @NhɩkrTrfx 5͊+s؝,q@\wb n{Lo&!8>,x 怺U$BJ~Q'z,<_7᥸u :aJCAxj^<5P`F2#^!J.|7kM01m[OeOv0x|` 5EW(I> \ P)P":*q Uf?<%VJW<&bkV۾Dgf L9;q6 DGN=9Upɕr |5TDi(*5*Z-bMl5j!0]5jAgVAŚ* ,(@1,E{?E2ֲSȌxsnEaA;nbyaxmiDSY͚ BDPCa̼^J7Ax3ʖٮ\x?J!yKNwTx)Apah&M8DQm hE!g[{6::Y> DkgfBl)`çCė *<-?޼wyt~RfxN5x.ath S;bܞ؟{ػ":{ty}OxovsP(vp6sJg £^uAxZN7o1K!8wl႕ 8-ODB!L={]7O7Wn:z{zv|'Ne/es*> k0Mx5s7AxXxq ~3 9ߍp }F :~S`bד8^Eѿ7}ѿ7|> IE؅ ˳ԃri'͛ 5 g%&w ]S]4{Q& 1/q G1%@x}0avЋ^"j׃*zLxrn唚bNְj*/ J(zV25 b zcz$-Gz{(eE7o EM@ $჈c`508FBctJ9*/DA_` { 6PSvjEbdt֊_aDr gcp78Ə"csXq8V{chHʼnB>z~!'7@xYu{;jܮXPNt*oجIr&:'?|m"q>8JS_#i3La`?O}_kq̘J()A WǃC=&1{;sLteѱb s:>E ClB0/slJukYf-{;)UhLeGbJ^h)_bk:e r.ZtŹ-|k;ބ/|8Υ5Sכ7}bΕܮ뱂ِTK Ұz)sILt| %5н^ ;]-̥2;/ƖYx16y$Kr,IϜ$;Ll1N[;i)}pǢU fDSҗ\Iub-I_/_Eҗ KR ?zOa'\,X` 4ñ?dBgVLiG )v,,F nX`|A|Ez;ELp\v7Dg2l\ɸ"0XzPB=Y|mc7luLk6U eTx ps4j{:,>tpB˖Į 71r$h6Y̼3\#>1ڞAU@)˸yǰwOK߰+jϹx ݼyLtM@XP醼RahiZႦ< \ÕG*&x8.8PtVE=5ʲNm ;b <} hǬ鴺9Z9z{ЩcT3>Fr9MpͤaYprM,xN4Lp9ݿ-nz'CYo"Z/7I78:Ƈ3+uu҇ D5g{B8Ypř gWX%;\?G=vΞU9}Jc Șgx5{wޒ'n.I*!壎!k98ѿχ=8tAs8!s-]Õ#3L<`+p@l=ey=:=`ڟmdo۪Uii-LkLZǫjҕ;M\~ )CթSWVf-z)[me+7J}_+x . ƕ- PWL2eʔ)SL2eʔye cPIENDB`PKwL\s+updraftplus/images/addons-images/pcloud.pngnu[PNG  IHDR(( H_PLTE;^5H|&,Dچ#3=Wg#6Po "HxcK}Z^lh.)$4rS<ذ>rR+tRNSqFΨl}r_ZVN)' ױx3!긘<50g6+IDAT8R@at0ٳE{bz$f2&|!|V{C x E#?X`wS NPkn=.f \cܶA^q1J,Aa{ āO餇OiAlc@+\X/.Z-uZ,u2kpp!8Z$؍I~s4x-0$l'$WЙ+8bs(<1aT!m҈G$iwW6!DB\8fJFN}5?\K=g -˜!\:^%xPF!$ Xp@j_rȈz2tNLYb;yi ؾs)P7A CiԆSz?TƺO|j4o<ϴğ%5|tk o+2h.FxJwX,$RDzI}PfKǶ}4V$Y$.S2ܿːݮ́-aD ^[&VLmhY`$R~IENDB`PKwL\ٴG++4updraftplus/images/addons-images/dropbox-folders.pngnu[PNG  IHDR9ugAMA a cHRMz&u0`:pQ<bKGD#2 pHYs``kBtIME9*IDATx]y@?ϴ W"p5%Kڐ}Zt-JDHf!,W--_B lu-YZ;S4?g<ﳜys_) ׽ҳӶmѭ;wtR/_Bb4 DGY WON}Hѽ@-vho>Jq`V\P|ㆢظ &&uTV^VtZp<2vN)[V}ZR3f`gllۖR{0?_(,/d>HN8;S X~-ZHmlg'@0Ԕ{>]~mJiaG>??Ydn$f`_- /)!؝;CH\򷴤.4`; 29q R uV]TmJ}VY؁O$yHS>Ÿmbee2 g\|'O@EƍkEϟeLo hk׮,Ӕܹ 2Õ+/GjDμ_дiPT\L'll@57\UJ4k أFQQ0e@Z!Ƹd>Nf/^4uPÞOI٦P`ݻ?g5I:v\nbFg'>LVV0AwTcG/rqyZV֘v]Ν:goYϛ'b0ŅRC|U^_|gF*Bd3,ۼi4ڵ:aaAJ^T7QAxҳ'@"4tqډ/*.fhg%be0nZ:%/a}PV2]O'2a^b"xzx$Nݹ391c(텢 v8C'(Ƿ6=]}Ǐ[r|>]* 5?k%ڝ;Ҵ+QS۴)Vଢ"%-Q͏aAЙRDj{7iC=㏶Z"kkl@%GEVS{ @[Y{bz$oތ-턑zr}|KH W_/4[ !"c:Oƍ'G[_egB8)0?yNRݴ$866xܾ́=@傤-[j&tr6o-kܹQSCM `pb(F#G,]OڼB/^ [G;qϟc+~53AH%Jf}<{%Veě7=z Xo۴ tD+6[q͚Ұ;nXj]v voFʶNw' ,\ωRE;/ghc~pt4e`VwfM۷۶iMzcٕ蠪j&, XB!ڕ9wouq 44'sh@L S"e۶ hjB7kϞAhkh UY1R!+<'L֝?CLM!KJuu…th\y(~h(t)\KjC58|R@@jڢ.fkKAUUa/޵t1Qߍ>s 3UX?E"rvC.Bpܜu[C/_ZMMd} /xѣďEGrr&7QQ SUb,ֱ(,Kbv*-E'O'vaUZnjO}[CU5khy#Vk$/Y fJWWt0$PQ^aaTT(z.9=p p"K'OXA˓ZZuj*yB¿JA`G^Hs0ݻq@[$EbhN<M{*Ѐ;n!ر*N_R.>จ%.h)̙{YE.)z@~ߣXl4[1YٍwPeeg틏79{=|8Jeؾ}MMn䥓|Gsj_ 4$-[[~Yo.:7(p.`Acod9(2 ,.P5o -u\^V[2zr m햄 VWWS(3#hrkn.ź?qvM҇BÐ!("* jn$'(Յ7JY.kp*puÿ;F{3vp~ӵJct7~9: P -OX׮H-~ơ!dl/" Hk N::99~ӧ7\o|oP}f6x8+;;[nҴE듒IPLC:QD""yr:de=|ػHԦ (+%;xOfϝ2g8zS`v>hg_I (C Ezz57'3 f^ݽ9BY@RReyq訤5࡯/SY9໔ MБCjAX5Vik ~;vGuO/ ôMD)6tv gjG*F}~'Nо <kvs}X1}zc±֍8w/JH`Z|%07L$ֺ1Oe=21-ݻuCXCB=`OȠ]RR*-,3JkyiiiS' +v-.\.bY ]M/aҥ/d!ODMySv(vq ϓ O ӽXi_ǎB!~5qbc^Ms̙I$ (b42RXҊ)O6RS_@׻ VWW#@y(UQ|wwA]_Ckw. Ratb"b!]h!KNn>ÇjT` 9 WOyeħa(=~Qpzؑw`uP>ҬlM%rvzYn63@}RU\/n벂F(^Fb.FW?m9D^+vuêUWbƴww2_D닻8Ap[$vvfh%E0--`rʇ- ˭{-TV;Y#[E&^y>$M۷o_E)pe7iӚӧ&#@#"<}QFr**h;K Utt!eTSPi CmV] VnjF+֏[;OOJ)A"^JgnRPt :T)MT%; s0pq}!;zx4K(pi^Axn%%vvHM[[8IbزeBA R{-*.inn;.?j>[p3gA^IO`{w ~J[pMc:cJKkS1ݏڴ 1~`/11aY%$6[,Cg̨t'ΝjI4Bn};Nsrj*e[T`w2>.)DyR;vHʦ .107mhٳϑR]ڶ?mF/^B{{~!(yw uV6E ;ȉQЮl!y!LA$r97o2.~vqdOB/)A3,LpAAϙө;{V ;Yu5:t)?iYN5$DLOe_T֬Gqs36G P^JJ-x|ǏFy9:1y2 EH-221JXg۷ܬYBaR&MU__2"M(Ȱ}V۾]bP(̄ 7_,!UDTh@Ǔ,!DFYC\JUT3W TU>efѤ0Qʘ:+dHt.xM3o=۽{qbK&&ۈ:a޽ʕ߭l!CX]##*/N{Nɓ0aPg[>)@hWI 7oغu1n`,"#!c FAal,^!ɥѩS;P/0gvlqҶ5JjEUT#OO8HNU(zsAA`믌G.kK"++?Y\\:wӽ(4L=p %$6zI]E^QGT1ZĻs!ϏK߲ lO rUמQìmߎ548xPd;:>yy͚5)$%I~~TN2mYK(AY܂(RçeXʜ:+p]$g R\-܄B'$؃Y<7QeA,[TAS"+8r}i{Hxg߾F/_9r%ed$d;[[ SϝV{L= .ӦA~Z&BPL颊<  |?VEyyijjxή]_$< fnnu:꼤2$,6MU_Ǔ+gmG$&6m-B(f8S(2A6ԹgJKqBaI \|Yo]ژUWCU?}YNx` (7fp[}{SENx~S BWW=\|]y~y\_ƏEG^ţ,yQ`>DR4m@) klq/]L '&OEf~~ QR>=K{;gvYXw A}ጙY2lXvSnq`VoBOGEԤ-22nh}VkrQZ**Z͛~0N37+Յg{22E#>}RS%n=,-[D+WYڵ+ub}PXR~Ș1Gsmj3-~iw=CCpg~YP 궶pԂ?y@\.u #{x4yZVfoJ|>ovU&Ԏu@ w05M<2:uӧӁ"=]a11Cc??0$륞c)5IQ_IҘta._ޜMAa?ˋ5?⨹s;'6JO[|%=`צ>l?u*:{[޵ yxa!N9~KAtnhRqj /4B:&p)rmBQF UUPX7$ VD|N\H:[= O\;R ,g@ U !OmgW1}8'7 yA<PYX@>W/$ٓ<9m04DIReXd<#3,>B(_\ryx(/ih3v6MX E_v6 CC)k=\Zr Ν-[`D~>\;+?BmS% tA*T_䆐 Nܻ֭$y z\ܓ4KacVÇ=VD?ϚEicSp0YrAhh}}͑"L3X+`c۶׷"ro)cݭZN9>sLL(e]C&&BQFO :ҁ|:2`x*W䐛gܿA[vJF+akݫV|F1 sZIcϞ/VS lm"*-ZSaFEh ;$Oyb́KBvsq, ΜfXZ2X7o`]TH9ӧ)H[RSҒ_>iLk^@ag~+#GbloOɬCH jJH`gKH p`V#G*2M|]~ee OΎ!!Px8g *҂O+&_=]U-6ϴin }H mmX%~ㆨ;e`ܹ02kC *۷Fv l]~2%ѵ;wZIi=5V$Zcc'kSS<=* ZIEʰatR;"+V$\&Q.> "e * &)bbly5e; >ۖƬAH,V2>httڿ 8w^B}䋎y{ yǗ9;nj3?0r6!$- pٚ.X]\ +m vq$9:#TC(x2R*UT࡯۷0C qԣ_N` W20h - e=21adI|HHՒ@ɽ{:)uʂBAQoެcks㐗u^9QIne@b&BMKꚚ2@cFpUG}}p i6m z!!Z33JȔ @Æ=_Z^Z*H>v,x wr8wGFNwC`MM!̯^ y_GO$Н9a~E@ P AZJ :,] 4a,:\5mhbEԴUxd m: YWeV5l`9 52%]8={HG߶4c%OxIIշ  .V*,\;>vl7ZwPkWo}v.u6WRj!xPֿ?ܸ.Z!8[/__D>٦o Z|]j.wO">$$,Iv| 6}S7|_C^66Jn&ӽd;lQ|;xա޶MkS4ߚM|c PZz:q"$ݽK+8aPdq DG?t租km\رŦo IxA %%l'<ܙ6KM?{0Moߴ|;@Sl6}S+@- OдiaZ`75 P ՘KBpm 7QU|S_MlzMMp|Ȣ"ʆSWwQjERj!fgt67o^eXQ Hz{R& KKE@j ۴m޿eqqB5~u>DRS]oQIЀ9ƌ (KJ]p\z:.^+oʉ;Q^먉]8^vvpྛ%xx@~IM(=l DOߵkK]u$]صY:,7c`N썍II>%gfg MLDE Am[]7~,>c=-&Qm 0 n^̓R35̄(a7Š&FR3:AhH5k6ϯ{ITp⭬`0K<.]߅9-U蘙 n]۷a@IuMB  ky  7V}V@J#N>t:dT%o]Y,DL(?j.uTSwHٲ\5#Np1u!:Qe AVdܷϠС[97oҷ?6!"-o.o_z"!0x .KD%oڵhW@萗.͚WwpMS$:-׮/?_*WmD$>oq+,Ufܿ??z>ԩCH;nTI*;ޱoay捸`rry7#\rtij۷GmlMMX\kj*ts^^lV/_-.]ӧyY"ƨ12[YD_G>e 5J@yy0qh};?-]ܥ |Y֧]ß>{ITL†V7n|<6._V: ^~JjWx^_xEgN$%&ꏲEU2 U?(L=:yfǺK~Q΁ qo ".WTӧ'_zxm+il2D 罚1CP#I=go{zzed$*̧>U4/pڭY# "__? rlhq#x'گZ]Dan.'БSxoJ 9^vv9}<`RE枞PՍo(DGG&N_*";@:1ÆQT׮U-a"=.]R[Y<%GG )IUG$&,Jj %i?`@ѣJwEE3gb9s'LS'"A39mRn`ײ&mz?{y s@6&OW]x,F͛+@~ [tI?׮E,(k^ZnH"q֭jЏјѣ)XVI.zT>s۶cT$=1OV^*=q<{Ved^^TQס)J?c׏(Kh!eAפ8Aﮁ [۴!nB|iN׮ҥK̐F][ 0\YYGcqÇt,.,)+QDBk33uס_ժE?ԽY<7/^TwK(lUBu=Aދo+Mo)PFL0|.oP1 /DبO?7PjDOjy T|6PwVj8ZhUVj8ZhUVj8ZhUVj8ZhUND׫Eʪ hSyQ }D_QOhu& Y, h|~aΜ q#46BneN[ϜQ(A *Z>b{sݻ ml `PmOOAQL`>v,/u˩,2`644 II͛&gd@gg;w-&vܙ{X6mZw:m~+C@..D6>`rhKlif6zeS =[6$ƒxPHOCo+2*ƽiuN"#fj)C͸7=z([O*siv6vʔ]bk҃-ܷZsФ2gYv-Zg@uV^y khH?.5{ K+-<>[W;92\RFJ;66C{.αѣQ[{biӨT2*@5y1x0?uuK#߾ȷoP5i*@5#G^a!|vuEAYv;"bOJ P- 9`ClkX|t2EpL&X%rZ[榣]^K2|¬ ƥ?QpW>' p8hХC=?Y P^9 vf$ԯ_(ݱc\%y}E^^[xQr*˗DXUrK[Y\MqIjhj_ LxNWlX'#2 `?wPg@7nhh…Nxs+Opw QI 2{RכywѪ%2"~Q3)*Jj *Ǐes_ȭ}#XӹsCj㯺u tﮨ|G$%o5:3vPlYa9K~U>]B8̣3bbhBԩSreE ^{=cnX6/?n蓛sv{ܰ0>"v/+ {K˖fܗ dY( e P/,,9;ucƀ3%W}Ç>/G4:+}}ȑ9e~byo}$h4SR}Enݭ9NNnP`;;*G nFĉbOFsfM e 33nˠƲ'm'_.{a],P1rPLlm`EKW}r+YO#}([ls(R~b7h9]YbFfxZP=rX!2:~|)>c#"` hiȈɓaѣ$okfhuP T—/WKe!/ 4cx-Y'TlKIAJ v:聹oH݋;zae4ogJTm V@/^`ڦ(];Ee(+O$FbIWSR?l8Q%l[[D\ޯ(@9U_YC$&h' +LMS??l<=9ϐ$:13VfJ DI[b~)SPc?sVbЬv99cBǒ%svmXڢEi|=~ZPrTTmhoėz{zx qڵq53lAE_ΎE|{$>!ܑ,U%H#3euÆёH|* FpxZ )~=/&#:TQO5d ݼo_Ҳi@ $=']wœ &WWݺ1z/s%m%eLH@MU.nn::vӗ۰!^Eӧ\%"Ǐ[S=(m$DG E$Wd=+u;wrp w钴BC%S"2PY^7 JY h/##$22_?үL^r i/K=q!ͱ&ؙ{Jh\ylGR 7v"Z9qbcyiJ8wX6B#Fp grNmeB žpA ܶMU@ c R#@0YX%^Uu +}A{KJ!I\mk+cLjU?\+H S2»^pMz2ݸܻ@ Ё $MnpŅ&6 hƯ>}BÇV1z4x汱AH[,y䍨 ;66PN?FefJ.3Î7>~Ko|@@a[U;J*Yz{Oeifݽ}{z/_}))c+<1p+L7Lul[Z2%ױ%IzTSQQv݌ƍ SJ4>[SSVRm6Ϟ8 - 32X ̧slhton®c^fCKs҄ȷo/)@WPAw~o|d 9yNA6! &'ͦ[*qW Z[Yc,- /IhnbuUӍ:8 -MXA yĽy2cQ {EXAܣOL5*U ۼ\ß6o^ۛS` ֚bϘA"nծ/[f<35[ΟO,tsczl1`+иQN=!Y9bݸQ9ϹI+ݦW/lj9Vڴ)j\냗-nPPiBEmeWO32  aٯ^=Ç3z{A(.\L=4 - __b/RLJ cT_#R&NN nn:: 9;ǎř: ZA'h qq#GT͗k6Уj k>nXŻM^⧱x={3jU{bjhz =?0 ׭k{b"(=#h`ǎFIиQnm_{wպ!d fW RЩQ29а2ppP۸QWh@ ˫"7EKqqVZP5 }}+*,`Lһ #zz Y ~1:ijՂC'ORwe9q99?s"SIE];wVavQ/w!!/ 8Q_yíhc(Bd Jݵ:(&=7W}z}<`ZF#FHH<oL4E6HDxpbG;%Ib12(ȟ;J p@ÎDkݫiJN?`j*xԈO* wqf"n'wwlkDve5a%'*Y"(sZ[U?= oao׏y d7h bʏzU2+X< 79R 5$q θrE8wLJvvn|%`9-03Zo ]\}uBٲ a'wa@(e) (ojXchحDYZc^y KO۷(;v2~ſ';= Wڥ*jѢbvc%tEXtdate:create2021-07-08T18:20:57+00:000%tEXtdate:modify2021-07-08T18:20:57+00:00AIENDB`PKwL\@ʠ0updraftplus/images/addons-images/incremental.pngnu[PNG  IHDRg &PLTENcfPdgSbiPcfNbfOcfi&PddTffOcfOce:OcgezzZ7KM_fOcfOcfOcfOcfOcfPdfNcfOcfOcfObfOcfPbfNbhOcfObfNcfNcfOcfObfNddNbgfAg3OcgOcfOcfOcf}}X_z^OcfOcefESxxROYEƣDh&7LOcfUӪ@g2g6c[jYmWVSwQMJeLTYcbbd]eDf@QzeQTcd]c_vdU|eReFg9g*Potg;TROimidZg0R|f@g1ʷ9tRNSf"3w˧X [SϴG:âa-'o桛MԹd FIDATxVAᓄD1vgLTWRԖB+c$&JE!:L1#>3X1T,P"öR ,e)KY:mOͩY(}SMcbV٣Ur(1=U2N4<,7:*M^M<ɫt"IQ’u3s5[Jږz\\{%'>#+">E%fJe%iPiaPNѦJ,e)KYJ86T!tqcCd'vJʧщRWFAg^X b+ UQBfJ@Z7[O^,ˆRN0kKwe[EU/F]Y71|էnL$>8)`EϝLTPVgCBM J,e)KYi+-Ms֖14l_| ^A8?ЬOU[Yz¬(fΦ3[TsZf@TQC/twUg0:-um+w5ic$Ru\c)EFP nOJmYRJצC_kwy )wyr!͔~9GEsH9x0'׈;RVVϴԁh{*TIDATxӿj0"q"'Q-d xB3i&C.R=~]/wGS?g:hY\v#˨cjuR'4Zןȥ-2ܮS Θ¯%]5.|'9ڌ[N:9[xtcW4OJ'.rXqj\>bb0q'?9dL{mfw!q!q!q!.3~1{^a( K:c*'[]+II@( unV{boC%>uc.O/cgO-c 'q{Bɋn~nfO4p3 7fn,!?SP@&ǀ~PQ%0]R2JٷeY?C{*+tDO[eM!;c8d2uicԏlib*byW^o~.'Nł3(:.J=,\.h:9MѰL 9wq3)\Hpo3 [{Y3"H\LsƋBJ]N&3dR"0Զ'i;+ b!]+vͷT-3cf};_3i[#q-R" Wl`'"^:¹*;{KȥM#&/!`̩r%=V}!9n¬i #JUR2{)+\%4:\1;@*0l#Mդ#V)noE?ȶ$^v DcuQF8uZVc]ћ2-B-{;z;1!*9ч7A,Kidg^Y3nJ-3 @BF:=ZU3|‰7.pfŻ*B r[J#:K[ c/e&|!jӭsi¦qp.h/+Ü |`Ǩ?}kVNϡ0i@s&FcKX:`,tJ  yBAhvm >N7E"us+"]]70ۇl.~] RsS+RvV%i Q7PFIN)AO1fn 7}ilZ0 e ->8?>X(1ƥZy(Z25A3B 9ȅ9Ar~_@p?]ǟg>rtnxA0r r Ox[NƮk_NJf'Ļxyr{&ܢ>.gt"ӃFvL%R萅OhC人AʐUb)N.zceB( \ sWe:rR|nvf{HKz󼨲cWuΞM"֕>h JGG+vOQ4+Pv}f7d¹ϞDr\91r㇎+]2r4iq3RkSqfIFDV߹.K-]pLƝiӭSvf.m2nY[,m 6<óaŊU@lber^'^ŻSSt9\]1ٖv: Ԯ G5w]IENDB`PKwL\y)updraftplus/images/addons-images/sftp.pngnu[PNG  IHDR,?PLTE8i&k)_6=e%h&;8+쨁^y*6ﲐl'86m'{*|3L,9(dY0m+GymjлݛO~C30.ǮaU?w:r2.ֈև|-|*m1 IDATxrP@n9<yd\(ՒE?` 9'+Ź._<'r#sթ ঔK.;9_:'\&\&?@VA "ըsmds7uy`9\[~R?7%V'p~aT?h@9_*wyM. mn. fZK==W\i{KnGQi!ٶϨDHdji#ί̊ﵔZnqp/\׬£dՈ^qsDdkH^a|9^(R(ѝzxLWx=f0EUU(;R $;LTy=./,F%O|σH0i h 濄f J;4?鉟F7Jtr<;(Mn2ݒg;lM377=W=d<0<MPnZ ^)Bn`[Y!(5Ӧl9S[rDO$>̀2˭[%'/ϯo!{^ !GAts'%WQ]W0=HMџ]>`ve/ .v>Lfڢ M*Fnb %[|w{ `_,gvrW얯rZA&uS HvvW *Ged]}np#'"NkHFH.rnp#EJuV Ht{=BQ탮i.39-`~6{1)vu@y]_.}07#v4~Og-wL=X@{Zf8|yAk{)?}nXc[ʥ&&rai|ǨQ}ʱ$,!Hp8pQr1*}wqi^Ļwvfps 61VQ*}7N7!E3ܮͣir9pKdp# x .xêbp_plgE$xdZeNqd˯erzp_emR 8_=E;(VD? k\YVeuP_VOSn+W݆M 2_8QO#X6ȣq8RpJ`%Q{D:<9(+YI&n~h"D2JE!xTel])8bYvKxfcw8<(MCmDP`)} ,ݵ7'阭PX ' V&< .d66y E+@sV*U%Rfg8aЁV_ `h5wϠҺ/#.d#b֣Oj.DA)5ȈQ~F3Q2wyݴ-jn"C4N[f]UZLwTVNՎzgB$DA:dT{W~ 4TPkzBOŀC{AQcUmT^0.[Hd-,Xe:t RHV7V;u9U!YC^}udfr;6$3b̾)$;`ֆ| )A.C^i_u%MS/ZڱY[}RvUzח1L| ֒Z2dI;(uh®;ޫWP.J/VjϑJH+ (KqKe.0t9Ӆ޼Q-T09Pd;%5$w"' MTC:x teFcݢS &!Bll>rʊi׬ŠlHF #{ɻ̦CIUo6)x_[m8Re%:43V#7.4Re]G#vz4Cb9,^^9c1cM-s`VIENDB`PKwL\}//(updraftplus/images/addons-images/all.pngnu[PNG  IHDR9ugAMA a cHRMz&u0`:pQ<bKGD#2 pHYs``kBtIME.{ "IDATxy\G_ A(&D5tPP E/QU#f0A#D(geD%5]?hϫWӯ^@#..Xx}p$i ܓqpI GVOƵF)kAJs|,,֥ఒdjIBBk ad_ĵ26?:cFݻ ŝցu2ɿ5Нe֩Ӱ@:k5ˋ3443C)NN8Ey{?+1Dz PdH+~I9sp85l.K#磧..LFV@G2E.7dC9Էѹ 4 85V1n!ڽ&$4M ͥ}5Mx~*CY&*4a61n9- Ǻ:kkfiIc8^}<׺+MB0RNW/g _z|dd[:9y775b;`rсg`ނsJLvV{)8ipqZAV'I$6ɓ9t(aʷ/@K]\#bL@en>#A!;~<- ߸ˋy uZZ\+6Uq=#AK>8xrx3=Mrt>/WZof1jݩSug_@4_?|dbxJ2srHxŻ'NDW+JqvG7cxbΝDɹsd2&&DQQ` Ly=s>-waԪU`Okk֭e-]:a KG;!+iLu5Riq ;kVe_<kk,޻wsYmB~ַ/;DɕP).,c4wݺ7'Oo4);eTBfy3CFF)"b*swlh\^E\+%0:3,EڒdqL&??LB ژaϟsH/\pAMkY ,V\ֿ?/kx[O\+֙dܿ;U֍ k7orXgr*÷,-֋  DTQb]?,"_q r@3#j C^C+)Qǥn7pYzqķ|byݽ{ /AܹhZl,lSpkƌ66TNNb7DyAABl(,$2S{ݾmcT9WW? %ERΜ Y<|xSN{F7r0mO>0pXzzBcb GFӇp>{Vp41JLIDaYzzF&j$?ټy{{\ Tځk퀰yX;th_hpW&9{?equu.-Ҡ/xzWF#2Irllwo/p&?}u{k>Op)) ]^f}kq$K~4MZĠ;w+$ݻ !] WNn$ЯҪiۛ._0r$dl٢^k__p޻/+.W_'EE w 7  wb,.;S^,Y"gl ΝK;`zut={~ثW| ߕƫF4 dWZH}Ih(5wl3%r0wu4喹u4ľV7.]0j ZBc4\kQt@#_‰7ob]-n=;&0t7 Ϟz+W(!]Xrm)GGX)pG% > m%~$ŊLo!\:yk;Zl#r=--{3s&Z[mh: 9rd lmVUxR^ut_MD#Ax$a IŽÇ7xKd Ӕ)pLJ1*ٮ2~\,VP=j9H@kzb83T]vF1 11׷%ǿ}Wn>OmmbG4{]tHGd-1hŘ1dat0GKmm&O3Jݿ_vփi-MߦMK6u@ LUԒU8ϯ)GS`tܜ$GG L}x΂=Nה<ꎩ4:)IYpp~>Ll_bA6&:)tiZ{SNw26m |e^\ zBA9xC[ d@${Ů^-mb; dWW$:h8:rWj ƆtOR…H;;F(xjcА#V j萎NmGH`[H-YҒ:DGo.Q=oW-#p|<j '$CX~w-/זED;c[qݾh @ Coo\=S wsIa5ZŐA(lRƎOaիT9AlAcJIil*@x.kh==z&'VJvvh'ݦ"**eEЉ L?6-SghPf XX@6|B9"غ$EF 0~x8AEoƫc[ yk acT̄ڏ6;8F ##i`6-e0IIH,kÓeqq`UWcWhkj B m )/OmmC,\ JO}pDiUYmḽzTE$ *oWmYӧvq49kkxgbp2}fI23~JEzSN+\Y[PA )@(:Q\P re%  ]ڽx<>gP FFGzYeo!0 rXxQGLLP>_dLj5a,Eos6llCO!%M*5D @-i9#S0$؀,GǶN}߱[\9?Q 66/vMjgBİ ~L!>~PA]:g(6!ƂfaFFSmQQ|L:Ek #@2E.lo^^2}wwUN*C-II$uBLLwcݸlk5|'+VP(ۻ% qhUQ ^pi`B- g!{hxXm #G`/_ڮZv@bc ^D27+ )-E`pc|ttd<(%5$<6b]E",=k5룏!˭E @&*_ 7lnnm42)'2GĹsonoBKPkxACzψw$g ?mXH^E*joPzvd07 3'nE_|;igF]p=(6m{$N7Ǿmwq1޼`fhõk%;\ 9LWʧZ5p֢Di yT{r9Uhhhf֚4h }[A~/RnxyxLqC#!rn.d__-Fg'M%Nzb@QQ[&p=5iP"1_`éimHOan P`Zf,-ۺi1"j755x*ZI}0P3AH؍ 3mM+h)| B!-}-8=5oJCcv5 Ű!2ihm-\\rg}~mR=ᣆՋDR)[ __R{>云aqD7eGӕix.WVb@Y\j*Ub޵>xYM%/ 7Y婭mESď%tEXtdate:create2021-07-08T17:46:15+00:00%tEXtdate:modify2021-07-08T17:46:15+00:00eXIENDB`PKwL\ Q0updraftplus/images/addons-images/s3-enhanced.pngnu[PNG  IHDR ߁PLTE  2!!! EEE泈Y󂂂%JJJ}}}```[[[;;;)))xxx,,,VmmmŏhhhBBBȨ⠠{{{xVVV跤NNNB&&&م QQQ///Ÿۍ؅uppp???555ޜcccaG׃ܒ888q222,tttmO6һޚ}=iى(IDATxK@m: %|E$ H?R4ej ugX6 fBe)'+^s nI7ȓ,OXRJZ e/KaNXҕ`E>e5Yk ,ces#NrueIxp?϶& БxdNVDCYDH#k ė,a_Ǯ˜te &yS:I&^> WG$KV KTLeXNIkת30Q ~15x2宇+Z]QoSּ}?*g=Z\U^cSv*Lw|@*&<<֧q%r/ZJ}.$b]~EI ٚR,<s#\†dK\7M|pCa3w -Opd@ey#h4ve4թa,S*68%4UޟLyjX G9s:[{08=V 7mYnEK2V(Y-3j#|@7t-t)sE~'"~:&~dZz*e|ұͦMwd< 1 9{m-iy-iwX8E>!VȓCYx+ٕa8oO~5-ˠ޺,K5S? -~ۻl%kM$4WZ"k3"6X6D;# YxyE ?'d= #!kM%u<xD~ lڗIxa=a8[ zp<]O|;ܜUÜb Zam:#'p6kLgbl"ĸW$y &cu7Z^WʃtOL\z,k wՑ4,4Z^ʭZ+ы&ɌwW B\a]sJe$b3?t{Oaan_u]Yi Փ9k\U,'Nb;W=Iyd )]ui|LsvJNv$nVtӣwD 6 5rJ6,A9ʻ[_XzT܇JBWV].+ citM+LNhv)*bosebfHjyxDFLw](sv@yo| ?7+BM4#'j9,L3cf;&ڸX0O|RsaߙꍸPӓPYZb)2Vs6l#@`AƽQ/oar134[q#*u@I ۰`tT#|I;t.NqTGWPFPt=6,)ͳIV1gӶB !q wa[R uYNalY=/[gٖ ^`JͶƾ !Kf$wXf.JiSX/$Ao%w`Q%4.ﭽ..h}s?BmJ[X`1ٰ(Ts2Xp k[?]_WJXtaV+3WkMqKaqIA֒jikš_Qށ>+噬ѨDvߺryGHԢ Iz $>,Ԟ`-W3u7~[[K.Tfv[^qh[&Y_Qa,`&ERE^ӥ/=B0(9;ܒkxsKE ƧJjnR~Aɩ;/ݨˍgeUY|P>?L`/Jө !e\c6]`Z0Gnm{uMhH:C C\6)[ jFJ\5Bs8L&#CI{:fBeˣa GWpl;b"Ef<ظ /QP nVl~ TI햋 >u嗠\Q 'f/.Kf8g쯬<LF\@\g+6췄Tv2nEnnif㰓TU Hf ?ϑ%zqI.Y2-&@^`]W)kfk4ͦv spaZ"r1+?r wi|au{Q>^V9/IҕԳٛ*n72McSweq 苠X:7>"BA8`WBon4ܡ ֚`Y6j8ؔ)O|\eXwoMdd I'GEJ Z_\8UkDZq5 J@.s8_U62hgq_5ٍ /AhHS04']ߧ8,#|yMڵ 0X2jzRt>яrk0<:ڒ!,VoD'VK1!T9kޤ Y>vkvÐ~) gWΰMčEG;+NgR''H{<x,'KfC7A`e+9N3\`PSgwVN„ %jh~˫1BGJ ;oI^ނUfǗ%I7~Tմ~,hւqNY *`6;WHcWG,2{ m4õ&Tu%99j6Kz,ONru KFԲEǭ<lZm;LGo$qSDI>&`dZ)?9؞`rU+\|-fƑ3Iz’ۛa !H~Cl6snL:K`Ca$sM2;PzŌ|` 1u*j2[!n8,/)X-/|c)BMcUFe4b:kΟ r!^@hՅ3P(V6,,znv +.KKg5%~GKd (1@dt3nO;򧘽 ȋ* ,.* Ȱډjma4]+F$vk\fFhJקV%"܅Sr@E>Y K(pKTh,$ٻLZ-,oa,[kQd\-#y k民V,c4wC{i#okU& !TEx.s6A̢*<2X )XX )Mk|N£ޑؠ֍v݀?؜, cʏD8´7{tOGZ, '%:C̠`6E9nKII6A.+F¤m#l선\ܞ6Qiz*u@҉3i)m?8/_􃃽ÿSO?T>OIENDB`PKwL\+($updraftplus/images/icons/dropbox.pngnu[PNG  IHDR((mgAMA a cHRMz&u0`:pQ< pHYs(JtEXtSoftwarepaint.net 4.0.5e2eIDATXGXiEh[1xkx`T',aQѝy] Q QxFB~HPD%B\#WYb4k45՝cz}uz9^? q}Sl+O1BU}&~GTwڒzgEo&@"Hn!Sfs\4Ϙ m͒yXMHxHC5N v(>m b~މ0Km$H5xQƁ:/9EĤjӬ~}ޮH^kUZWQWʨ(I*t~t)B=cuK;g24DlmEم~w\)SRpn1 ~u$(X嬘Oe d\$|JxDba2ZhcpWUCu6&Bi؍t\$^nTJb#\lkTgaP8F >1fUx+6ԣBok* Ǵ}zU}]1'ؒQQ0%vpɶ$*GAM}3vͽ+,Iq9<'lV %D0_6stwQVO5^f2՜r^ /4ZXnnA( w>4>; S.7canNHWD/Ft([i[>/>42ۻ zq4WV:7@(54&9//A(/󆏵cjc*ob\rUMa{1 G$5_5WnL(kB Б/ۀ ]*`]4R0X/8{v8vIB M"~tBIENDB`PKwL\P[  (updraftplus/images/icons/googlecloud.pngnu[PNG  IHDR((bKGD pHYs   IDATX{pյ?k#9'~("G->@ wj[NӇZm+#u;R+UQZ{/贈@+HS1bxW8B۫NN8$Msor Df=֦"{l~MZWWg_>M4֋r"*+SPIo,y Vu['Z[KUUwکg_FQo֢mѿϬ~ӴtI޴-ػ8ŪiY G#bDv=֏vZ=Wjkku5jRޔgǝ9e FظCr6jQl""4>y ЭȠN%q1y-:,v^8`E1XD*9[桪Tl!mOC,f/TVV G~eP7gK8γ1v`-xq/=By|-mmmXkDcȌC9w料1cI6.yM"Ec|pA3TԣtFpYYrE9l'^k1:sAL%s>SVVVfsK)y c}G%mIsZUZBvy|>&Md]@(K&<,VzvN;)K&9Ds9:ԶΨHޘK/~)8|c_Yx :ОG7"vxm4*qf¤'=æ孑*mP4[&XiW+!-zV]NGo#-lHjIɤ+w1&Mf 㫾59#;ͺS(|APzS_U˧U#wiZ ؎j/ X [ &5:SB¹=n~\9 ߎiT#Lٲ=,Rmā51+AF-F;)kd3 X$pjf[nmG_O=^@6 AU)--qJґG(X&zI1]M^A1SRQQɓ2eJ$Eq7oIퟤ'?#q:՜vK! e3RW[aߝ.3*JьZ\:7-fB AmRWVyeSיf^ "(BIj{7555uRFkx|vXomzW5gșyלhii9c KA|>_R܉{mr9ݙMu"8`tZR*, Tg߈aH74[ڲz%H +X}O4X HќOm]})bڇfvvna(`%JEfn=6p~H}cZ%ڞ[:.%g"$X'. T=Pe[?)턂b ̏/?G*' Z_y{[8D}`PKr/~/֭Ȍ*a) /Q)CM wW+5q&ALߢ)v؈Ǽrbno}=-(-;EO髀 E07Onr`<`}>Ç4}kk+jP>!lH14T!w?HQpkcj2 dȺSheєuZ*qDA1mH@4̹vs7Q9q3np Gv3(p˦]͈NCS:C" HEp3`qDuqf]Vrrp qgG7[?3ur:{z.5k~x Lr̼ :v87wdm5jwuqE]M ܴρ"4{-"L0!(+g2LօJr]g\Y=Ǘ0OFnjܗd??r(Ŏ89b=Xk6G?<9/Ʃm˨UX.dd2ٸb@HvQ.k'N?NNSN| FpZ #JE^DfOMsK"1k6LN$"i՘sѠ\:F!~-slΆdI\b=}3{6#u?$2paQ$ 6?y! 8-P-ZdlLxxUk_d\Hy4E0d@tw[BKB1C~k3&(Ša+Gv UUwrChhCSS&_,b5$!:ߞ)ǩ;3IENDB`PKwL\65dd"updraftplus/images/icons/email.pngnu[PNG  IHDR((msRGBgAMA a pHYs  ~tIME+ "tEXtSoftwarepaint.net 4.0.5e2eIDATXG{OA_è3Vk "EZ",<9ǡ/Nr"0slh&dA B샃D"t||L'''(HP*t:MlǡB@b...إR_(L2xo+<`  cٔ! wqPI{&^Sj9p>n(j(p U; 6u)^n0AuPGN9}v)/_M`M2t#67:}vեl$MV0 !+;lكN{ހދkOmJeEp P$AUXr]8Tov^u-6?!ՆK4,!Mp.xz>:=(Z%na&(updraftplus/images/icons/googledrive.pngnu[PNG  IHDR((mgAMA a cHRMz&u0`:pQ< pHYs."."ݒtEXtSoftwarepaint.net 4.0.5e2eIDATXG͗kPU7%K͚R3w3E#uITc3ijDR PE`L$i)x ,읧v}9>真thCBПІ6'? Fs-eoz3vp Ml7V.q6?:#x4La>HXxDr"V7UAhQbIQGl( `=9 6E /~ІbT<6'n9KLlW_ͮCǮ'4D~`b-b~^7rm ۣG<fLBF cD58μG.p.Cm mK hd vW{br"3b<&%fQt_6a0u[Pt2LEIx\jGK~F(zŶim!L7w`ˋx}͆,`>5ovrwmW״6Э$,q] /9##PpTA1|\G:oo_І¸C 0o yrI2Kv;<_/Q0GF~*Foh( W_B sy~ mXX~n9ER*>f%u3.tæ|MNLSqtdɋ'{X8s8ukVPPDzf'731ttXR aP/-5ZiBt Q xye"RL\Aj1p=[Tމwr{[?7K" ޒ\n/{N)Ϳ",+DCWѩfDlD%'aZ_\>fu8Cz/ I$1+B9߼xqi5SUD,+b>b(JFhhb*RŤTp*6iׇ|TY׬X2 X\ܤ5tr6]Ѽ\ш!չr݂N7r*6&6s%Hf/eШX RDb>cjjS M~B?mjG%\ Vae^@DJ#*ryWT+' MTw>_/g*5Kc?\[!hDE5b-2J"W"7$[L-wl*,i{cx }ĖG'w?!UIJ-o ܽlZr1,3nCF8Tfu-Ǻ|~ lժ[%_/>E+6'? mOhCB@qBeIENDB`PKwL\\] #updraftplus/images/icons/webdav.pngnu[PNG  IHDR((mgAMA a cHRMz&u0`:pQ< pHYs  d_tEXtSoftwarepaint.net 4.0.5e2eLIDATXG͗iTTG{{ 4l# 8DvQ1 DL$1#L4h @ډ?ڊ7l-XK6iGmhAK=ttw?Po?C٤"~: I:yXC,C*1%d0VQ;bkѬƲوYqx94kvͿmƬ!!;Ofu}\(TDF΁w -vHg৉Oz "|>6)z@ @@$0DbEooņO$ R_`*"#0AAAX,Ȧu#DpX|!<RUHI9%nP'i05rf> ynAbL' bh Oi1c}:},:\Iq&hS/F=R2T 'g FJx nkȻ GP)vL'jVU?&O PJ🺶}idᏰG"b5Qy\BO_DJh:a:ЂxڼO(RC@ }^2?0 }}u!36]b(|1;V;uwȰP[Y؆B3k_AvE~s|S3s HHLGF /a߁8t0z>~!'cK`M[鯬` `D ~QW@jlss7_ICnJr ^i'cq^]/1E f7_-v~=h PL x7t*)UbJTlėEz:nrRvc #fĎpY;FYPn CL9%kUQ91#esYDK3ľ1ʂNH϶"qpg)%b"|i+z`itHiRn=5[bz̢$O/ M)^NރD,h\m"qp /[\ĶϷc3_^fTR{zYظdw 4Z^>s!2K{'mieS_ &uAAQn;麇>̈($aO ],leG Dg~ME)9B:u[F'c\]\wpu+kdmg CLoc 9L2kX ;)9 Ȼ c)][d'Q001qV7 쁥%FX`4ͥ3Uj0_H7AL47BֆV77һ(0*!+gɮ*|hoƧc0sV _t\1-Vv ǒ}PD-# i95r+km.)׼bF\&3 ƭPL_)LEBKbfƬDxlwpp 7%g5;'Q3% ^BMX ocb{&+L}O'SމvZK* GK޾hjTbh M-]+h;T*Ʀ9/g[Ѡ1 ͨӆv46%],Ⳙ={6=A(--CKK jT`;}wVܙr=yE[ o:ǽ //O(,<[4{)jtoqUܬFCs!)!)!)!)1G7IENDB`PKwL\XFF%updraftplus/images/icons/onedrive.pngnu[PNG  IHDR((msRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.5e2e!tEXtCreation Time2015:08:28 16:43:43N.{IDATXG_hWϹ3ٝIćRm4RPk b)ЍH|h)}OZZh (ا">(AmDJhJ* ZƝM5ǭ&M6{{7;{)!!!!!aF^gΚm3-1w/·XՋjԴ~&a-R\0ּW8O*M0nLU."l* mTa6dczI9&[> oF"$d_.]W!0(e1ɧ0Ңb X;i!sl8Lg5ȑ`gvbJ~n(Ohb;I\F_7E/..-|zLjpcOo2bwoIk65WAx.9Wc 9KH˸Z.K1%fD}kA3KWTG(<.Zk򩞫*oK'}?YlfPY2d'郝}˵eCV%KN',y]x4>WB*on,Q}}B{V?"cv3n?6Uڊ%bY2 ^«on!zaɉ!"# Z(>|*bg,6r,*We\[0^wJM(;[%A]h19ڬ1Xݪ"3]VaHJMaCJ/i2:PeN`KڬRcBi0wxv;F!9/BzdW?G-6}BPdv4US]qw+2݂폍(/8x+|pʨ4QV8ܯf EB{IENDB`PKwL\%`'zz)updraftplus/images/icons/updraftvault.pngnu[PNG  IHDR((mgAMA a pHYs(JtEXtSoftwarepaint.net 4.0.5e2eIDATXGX[hUmE⍢4sd&JDkU>羛K:-hAVAATC} 94ZA+'Mf&|A2|{g}=)tSK!r2/1 Ǟz\lmTkxw&z+b,4M<]Jui(j^?׹Ԑ>G^* wj<h)nz~M Z2cFEܮ|'[XʸX<"+G{C:hWF8 4S nf*Zj<3J0HvyPV(\y0S> Px?0;L̥y(0,n0E a/Ӓ̏4q;oyx„Ϡx v_3u?`:a=S~{wcS7wOf/zynA ꤫a4!Lj_j S#`?XpBOF]c^uRGJt3I11Z]|kAgH qM̠!#}qFjøHwC z o4!Nˣb.Ba IiBNf/1 E"]>iwݎףovOt3#h!}ŎQ)C`/Иhx]6.W:IE^ ,.V޷]Ӭ)t&xcFFE7b+CCq-!4895!so2/fVhٿAc,,c8-E $wL} ;-lfh!;@aU[HK hCt=H{ڣF֠ '蔼iR~AvǦ:*k`9 ))yt(.{?LIyT\z&fz>_tpw[y\^wܒe9= Q?6(&1>y%!;2 ܑV.]hGC{5v68P'%$DiKicG_e=PRBqi% lD؋q]j2>-$&Ap_ KE6 ;Mg!$]eCRcpQ|¬YGbj+B5:a L_+7AZudʐs´>w!nYG_?=&/x59$_]AW[P&tQ;AiMfJlLƻzZn61 ;nA|ByE& n7z4`9 _~~LGOQq|"jԡ$QrR ǯ=%c1]n~.հC:*@Xg6CG]?ޒwY1d`G ugr(C]N!b5ERԤu6K՚~fYnV y<&+GQ]m!`ђ~Dvy S-s7K]b$t=+|@FҲ 1dOV29 ڴoD_Ҽ4s0^y9|~ mlQPr U9BQ2+IENDB`PKwL\A A &updraftplus/images/icons/backblaze.pngnu[PNG  IHDR((bKGD pHYs  IDATXXkTSWIn< G0 >+ZΌu9bUm;u:V;cՖ.S]vٙh*"(PIB# DY|g}>g_Q~3wʙ]hzi( P6{&oJq7ʤ7z5x 1;:>, ]^fv T]`YT>p#ns{e yIwȜv чSs)x/jM@-5SG:^#) IqN@IV!U|74EYw0{6(%\{#5 PGjkB= O?[6V  @n~g5o0E0H8>QRQD-L^ pJ+F ] ?ff Jl0|nT/x+vOkbN`0'U^wE$m)/:"w+"w@Ƨ *XGLM$pɬ#ONO 8+§]Eh(:E!oxp9폘=ӝ֒=VZ6R&4@ш>8ەg]o.3[gbi rcR?6mwqg b:em`2-6;A OKN(Z-pYKff/PGḐK5 q,b,ȷn $(lLAI}k/l eu.9 dv5A 0 yO&ëw(cy7 [4YK7bbx#/)x$r51OLF'H`͜M70mvCnɳN`o FNZ_R< pPQ@MǛ2#cmG|~gHܲ]>EJ 0 ۉeg/MaY wD.%ߔTxJK Ӊg^ -y+mdUDڴ̊f̨t\JnXmQ̂3d0-#<, CkzG`EbS6HjVl @̖dD}zbLbVA$Zˈ 29 IHo:G\־BKln1g/u 1N58>'(JX(+ a&4e8.׆$]-N6@\KלzZ⪭YeN5ڷTŅC;4ufjEZ,.@U龷 GM nئ,zPmW>MnziCν ;;1ffmposD@fNM?ewIh,+"#dPGL^|ɖA>Qݷ AZA2*nந:;aF W__1g=ėVqin "t~HqP4c \`] Ti{bL!RZQX@6+g?u-8V{Uq[8_C r}fK`JڼBL}cz}w#}XerZEPPI^& =TN6VҤVJ~4W郚n\*'Gjb.k{.𫲷~Rfvr3!?CR41|yh7܀@y2`a_*^*Mc%9p 3 ʨpME82t ADl{*TwAШކ>.Br#hέnhzG!Ir7[M!p) ~;7D[1E7X) -UH a=X0/5ȷRHoI'$| nExJibh =^/==2Ǐ;29j}ppUN<$@, $=$ssuH@caZ}9+WCAf֕-\G~IO3\/@R#!):j˭?3<IENDB`PKwL\+ll)updraftplus/images/icons/dreamobjects.pngnu[PNG  IHDR((msRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.5e2eIDATXG͘iHTQDARPPԷATFeAeD-hbIoҸZقib:Yfen{}s&;ssߛw V iM0iM0|jZQáwDG^oɇD=X:l6xa:Q% ^Ŋ~O*EffofOx;u-E u "G;]..'pF; HӁr̢B=B※e0-2c%٥<.sB=Jq vS^;Dur JI "Il'p-lH ^gI  8 % `"~/i1nunT\@.T`YB:";wbŽQqiL7|h%mM񦎊Ia K҂1Ye~9PBT&OU ~ sORyB;y iA[Bznf`ʱ4X>IIyǚtq׳ذHyԭ$ph.;Bn2TxHkh&ņ#oqZI'B#P\VIʲ,/jpJRRyr$ <6C~CG{7)ߔ-9,]m kb|pdIZ=úoqPt JUw KI;ФFwq )LO“d, 0J S੸\g vnxN#& ,~Q͔83 I4%pV+?q+_,)@]hO*b|[|qcv9{TY:D>G-)kΩw0!L''eUrSt+[ս~Nk&N?G&nIENDB`PKwL\ʉ66updraftplus/images/icons/s3.pngnu[PNG  IHDR((msRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.5e2eIDATXGWMhA.&Mlj vŢXE)7K{.z xs UMICKoEA{=n{i5m M=ُyH®ݓ’x<$6BӟeQjі̪y`Y=Ǜ]g[>P̹]{&73L@XiDT{;+L9˭R[fmX pMFbM$|$H`,L&e2$e="ZX%wB!&3gr9˲[S,C%;~p O;[`׼)`}s.Ba+ϒK%P sxfűMp0@-i|MG[j H){Bb">TlWo ;yiqz;zS;zB0\xez;t) H//eqKқ/pa0'rtv( r"Ϫz!xT LpVGhd'% XL7]{(ScJu+ -@]edr>q5efFIbŭ+n}Q<-E`~ptvǚ8ӝ{ )>.$ni dy2ە!qD5@ G9!Y A>Hxb;_^J C Cݳ%"}  fH^GԔ!nIENDB`PKwL\s#updraftplus/images/icons/pcloud.pngnu[PNG  IHDR(( H_PLTE;^5H|&,Dچ#3=Wg#6Po "HxcK}Z^lh.)$4rS<ذ>rR+tRNSqFΨl}r_ZVN)' ױx3!긘<50g6+IDAT8R@at0ٳE{bz$f2&|!|V{C x E#?X`wS NPkn=.f \cܶA^q1J,Aa{ āO餇OiAlc@+\X/.Z-uZ,u2kpp!8Z$؍I~s4x-0$l'$WЙ+8bs(<1aT!m҈G$iwW6!DB\8fJFN}5?\K=g -˜!\:^%xPF!$ Xp@j_rȈz2tNLYb;yi ؾs)P7A CiԆSz?TƺO|j4o<ϴğ%5|tk o+2h.FxJwX,$RDzI}PfKǶ}4V$Y$.S2ܿːݮ́-aD ^[&VLmhY`$R~IENDB`PKwL\|FJJ!updraftplus/images/icons/lock.pngnu[PNG  IHDR(( H_PLTEѰ켼✜|||uuussstRNS@fYIDAT8˵z0jDId1v<$?[I[r,s_?>!@:{gMi9uobҁRZ~Dt¾pv|vx+۷tRa_>ԫu+^/iFxj@9Q>V0|޾HN{TilڕOݏY+Wy+PTA|"޹;HQjVR"tȟ[,[P\JegJ("/\F@@g!ɶHBӝM} MGțXJ"lycV[Φv` +gP""@ d?XXxKn7Q -gqS,ᰅ-5d8| 3ֺ(W I"[ǂdZJξe2/)r|YSJԑsd MsUq%|)pNLagF?AQ,9-/xecc0W d* ҡTQ-yo@7=y)˃,ZusDZs44͹ mM(^ d8E:KIENDB`PKwL\M#updraftplus/images/icons/folder.pngnu[PNG  IHDR((msRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.5e2eiIDATXGӽJP^M@:;%XAPz΂PA+%-dHmArz^p~˟$$52rBFN 9!#'d䄌1hк=NHN kGw+Y0K30w_F`oWo v qEOGtkω|߁,r5>ʡ3T":B]7)!ԓw~-%H102U-%;q^Q$ttttt#] a qZݢ^5tWG d䄌2rBFN 9!#'do3IENDB`PKwL\DT'updraftplus/images/icons/cloudfiles.pngnu[PNG  IHDR((msRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.5e2e!tEXtCreation Time2015:08:28 16:44:344IDATXGŘiEߞ= aP\ ,AY "?0QQ1?C ? 1F%]e/EdQݙ}kg>ɻUlU_U}ոHES2IM#9|r(7ASQg-u/bjI\ь+pN1r) JRkL-`ʯuf.am?>k;pօZ9 ئPxʡr|Ǡn:fsP ]gPqhETDBȩ=m[QQ҉2: ./eџjY{Lrm>`_5ͷjP̎ 6|ݶ w2~90ٝ&wl̬cbНC`bٻԚ٠ %!J5˻gp-aɨp |Va-S =ŝ 5|Ъ"95(AJ[PVȴ\8R^I^rv-2()a {OF8fb, zPIהsEɪԆ˭ Z4dS~=t]YK}up&ϞIn0Pҩn*t4gЋ$$Ap3t_"4=Ț]ig"gg@ qۊf8VmBy]EW1=E_. A9N ,IфBa:=m<3Q8 H;ipYTBA;v?[L-P-NsgnG2( aE6P5TId:]SK"-J[fCtK([){M-2@E8f:whՔQz!+nĮveDgzO[f\Jkj` ]),"Wn&t?)JkTA]G"`:i~}_^42n;l0zש:wI Ք> )9X37=Q /diGnzĻjiNiPA>y\6azm܎}lEGLҗIENDB`PKwL\Y䌂&updraftplus/images/icons/openstack.pngnu[PNG  IHDR((msRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.5e2eIDATXG͖OW?LCDEi\ѩMt,e***xAA9rJK/m skp"M~9{}|x5\ћW&Xul&FGa>ӠM㨏܃ڈmhdTyKE5ס|́pQ)U]R_w4"0 A GIL/8,5KAI^|"(W/p8 HpEi_oi4dTA&-VA~&_%eG+OOy q Ƹ|t`3(_<}3BǑ_`p "gH *去A`0OSǓ<[y#^5ƽy5;\ {sg!cq\z u /)  m0؏5ԄYQJBCs3g<,[i:Aqjg'཭lPSR3SߞXgOɠUY}.znZ ]X jv`JXRys湅,g(p.n:H6c{nVV305o uY75 D>g ;SOsSO3-9,}Ju 5|1IX PNM(_Mu^1y%.yINc+Yr;kq1;[r auẄ́`̸i `5JО!t)`>.Ƭ]U(T5%*n5}T3:&3o/Ю1Rn$z tukX-sNɄHch$6^So|ft@Cr 2|6 0eʁd=~v)spѲ.SfIoUקT917_|oqLW|џiP>Tzԇ!=Z(CzŬ(=]H]UCH-Zf1S2}0܏סJFJZu3UԞJYfg0e\ޑ]s)$½;IRc} ;}zv `vLqjˮ+<`5مF#Cp^=2zf(!\]+#`)$ }9e](iy~HW2.`A *)rJ#ˮy.#Kt:y`ȻO0gN$` >\Ô: L`L/OE0:)`zI.5OKGI9 ~a⨟G)y5%*+ LPn9byCx4PdX ,tc]|'o#z܂WJ.0 thO(o"ŗ sK0hmL:A:o:2'$@Kiw0Ds!=W)= l_J\0 ǹsy '͟O].ZL`zt]caǒyؚ`L.zRم#@rOK ee8ػ`2kSؙ-Nt[qPi1L n]SP; ):.2ݩOe[VBeFЙ~)vkr݇جE<(Z:ϬC"`c%AH5؋@* Q_1-9Tnju`ʲ˽N1j:-).tG'n7"R#30ס=>>o\ 콳B1փ)pnPM;bǬ\뀈]FSϭ1bWq,&JT0en.GE.!Ӎ&)v͢eWn/&IR֊1盦kw^N{~%|4N]"TM;^nF z8LQܽd70e"="j5QSI(UI8 Z0dBD($ܒ|6y $m_ٷjt"gоc`> -I&G0:[ ;$ k/@б-IZ;ν8`Az|eEwhqkY6|ұ8wh V f8' V;^m^Fg3ҧjWOEL* `R&EL`R(IL"x IENDB`PKwL\ &updraftplus/images/notices/support.pngnu[PNG  IHDR,?PLTENE#D#JNNs4 ##N#NN#NNE#v4 H"###y5 #KE"##"#!N###N"!E##LM#LNN#""""EN###MJNE#""#"NNN#"#NMKNLEE!ONE"ENEENN"NNOMEN"N#END#EPEEDHEENDENEEO#|6EENA7 ENEEEENDDOK>LZ0P/c/ )&m2 E@G-.κtRNSװ׳ӸWܤ  ي9VlJ@?$ř|\*"ɿDD&rgb60òn.xx_M+toPH:41۵;弴tj`PH4›iƹylgBĽPDK ;IDATxgwVGR%Hbgo"dLB ePhKH+YӶt%9M򷮮kKr\.r\.zL&1y*lS%7did?=NuoD}b<Ϗ<g> NT)gū{G2W5679XLVǕ4(ۖcN)(M5zA[yJ96{ G l<p_%eoV}, ppD֗ YMJ"^ =CKn59I]ul4 }GcrYZmW$m)cAµyLE-g4s1W Ejx `^/Bx̧3B[p߀x sYZ42R%<Eyt0F0d"z梁HƤQkV͓c/gVWI|jj ,R#(,͠gZC)=kW;AG#vՀXqeVRυF˿ `6vܾ4q(pʄmG/: 8隱 XjS_ya47&Է-=ܡ":vhqhWh,Js􂲮f(י21$  'L]0è{wC9 &/upgix @Сe|[$8v8*\3 Sf˖ET8b]yO@T#_\$ϔS/LNa#v ^oqtDK vXTXdzHq^:2 >a#zDI:NB]c.xf?&2RONIs1H"MX{,AoRGqUI8B|1Mq)qɛ:6A#>yJ!ҸNqD4ⵟ@iu*qu-'KPAB-:8d N\=f ո툻ZtAqB5nqêqD cՈ 툛L}0B#S[q:(_-qydxVyLhƅp!ZqS׭2eOܼfg Y#4nףG4MpAl8Gh= F0N܇vujDZˠϣMq-=Ԏc.wJ'nt-u.繦7 :DW9xqDqo)8w*x˽Љ t}N9̖%K *8rBP&A3OS6%ш}ug^3g_iı&\?J\' g}n]'nq Y\i_{]T QW5WS845WW#Q tBQq;v-iyH{Gڥ׽ EK{VBA-Row+Ł [n\-{J4dqO5%؞(C~'Vq́4ͣq(1>u0w`Qmo!Yqv}=e㍂Gx?),O*θy2>nc"SvA$s<,9S[A.&0yn¨f\N K+\=PZVq 8jbOCDZ] 6vn}29m`qM4`9`~aʸHܤ>uq'e+h,z E=fr., ^U|"CT|CǽP}8W,XLb۸̌t?1ndռ%(ąU|Qo;DL [3mliz*5. Sss(ڤ)SEo%io32s@M^H1^2U-qJpǝCqlJEQ[58r5%'oM3a*ϡ_[ov_ZMBlv'ˠkg|`\eP? 'DMhL6‰2ɉo36d׀ 4I)þ,-('Fq'hL4( J| 71IGTwhYPY;D4kc.{-Wв8Ӆ[-odZ,Q1LykBHޥC&o/2T̙dqt\H~x_=UIU]Fhꛮ5BG?.ݟʴ`ೢ+Rʵjueetr\.r\.&BÂIENDB`PKwL\FQ%%'updraftplus/images/notices/new_year.pngnu[PNG  IHDR,?{PLTE@@@A?F@@O@@BB@@AC@@@@B??@@@@@?@@@@@@@A%\)tRNS qOf,> [ {aUH5lB%09$IDATx\ {G d"%)MSZ/,lq0׉3ΎiLAQ#%qJyl&2&rØ5X>=u {R#J|n_"e<hM(sB$bCS 5mnQ̨Z{\ sn /P4Բ捥aHL݀TbZ=q3' (A:N'ρE@1(QG[` @V[Xz[+tOv:˫_6C x3DyJ #KxUpuBjD|}1 )+4|/u6èS92Iy g!n<8oUuMb#E R)@a cq@E ~[-Ē6P$ N.=KX!g`SAxr6)ȠUƦGL]CIkgDJ!W<@J196A`\fښU4h1暒;TZ.o@pd%4fuZکTpQK|Texop4^- i{٦pdd W̢# *^^TчXFȸ+&atI"BSf+f):vj˷%i\%ּd<[)!_uFzz&Cxg Dg4*| r(Є)|ܬlbh%N paOBjdX e[B^{5+??ɇLlM(*e"PE[NoeJI`\h澟;WH0&oHIT4FpJ&ۉCn?['Bf/nIE0[yPk ;bD紸g-TaK'҈D[?s99L*c4v qXW&gRQYA6B8W!W?ݖEN1ʊWh"#xE']d9wV,6.9Op@|#f] qzꙄ&2!uD}j5 x(}3[ uʝcqfi`L\m4U%V|2paDA2iW$|C{_hl1+AtyM7#e謠{}5dž>bNHSOIvi&O%<焆/RZ<_-~Q)fPH(מ`M8!;[Sm`>uY'ߝ$FM&Bkh޽Y* T$6*qsWa!O|o߉C]T y-kauu!9T]\1 QC chG.xC{f\Hݸ61CE6R(Fk?5hϐg ]o-i|p<{'Ёw8T7t H@3lB 3[2鸑^s8x@tQ4W'ښViXLnOe_fG0i[`d\!K6uڪI"S4ǁ({vqbAKe2'?YLFD} !\xFl!^*YE9l=|-:{hY%T3|Ø5b7$[||!A#x87Rį޴?ĢLW,INjg^37ׅ^޼}pI7 wRWQdCqX._|k?aNazPZZ%rbs~ >'+S2n C Ӥ,Xΰtȣ a\9mHQ)|BA;/7OVDޞrA|ĝ5 V[F 'h9>un [d*RP˦S#&Ni @Hj9I {.];Xi5SBrG M1W7H(Yd+pIͼkl؍/rpqd Lei=eSW_)W9НgP1# VPrfsW.@o"bKX%  2,JtCV0FxAS+[pPVCB[yr1Rl4=6TI klň ;vb+'^qTQ~%%L|]VOܡ]9бWIa1_K)}>t5}64b L(jzADf< !I|UWiG7am8AW鉯/ZcSF?DfW8. (:'X*DG2uN2 y+9eλ|hbQ97(C)FJY6‰; CQtЊp#22wi6p<5 1dn|:&^㺋R63Wafӆ6qU }͚OwžC4)\J] o"#bu{.q7Ndɒ`dK#HV4Ӕ48%աs,V+$\]R˾X-Y?( /3J~M>ʨ%:7ïeM3xB ,naKX^J!Z 5_e5O֮(,Dz%ψːF9! xBC*uQ$eȈP29 +_V썕&:m$*D[f (Sjy(EyKV2Q20qzTnܭ冏׹k UYYAK T"-S<Jxe<:fiV?DLr Uv?"8iGE4kl~7hC=Ʒ Bet'Qq';)=2*'.G.XeM$a,bD9~$>2HrtC]!sR%R&-QaBsѣ"BI_9qKE@m@_\ ;~D!H)$W 3ynlbF[֗GdP=9S(kElz-,CN v O *ևkvw8-[DvU>!Wԓ{ dɀWO?f:AͯKX4o`섬AQ2m)lCi!`j) jyX}{psͤDϤӮ-$\۱hK]GR~&y3qQ,o9_lpd_r~B٢$M̄ GOr"^OX1v9E'a5 g[% R`i3|<ͮU |~`ۊH[SpϢ|zLO aQLyP,1^y>mfwם&&o-ん}{ޒI,OIʫPCTf};<_TTi-6ӗskuDpþZ^gp6~\ >56nʍqֱΝ"˱;=OmЗLq<,b(]ŶT3-Klݞz`zn#ն0Ջ(k)}-[$GB'n! ǬD_znm"G+P]Y6JDT)9?vDI=+ ^hϔXE~| dl\Y᥽ R b̲i&aߢy!|9j7 T:{܅mVMv 0H%?Y-}T>^j!|nBN$iK|°ʁN'iH%f`byjQ/- vpΒgYAߺsz>m7;P՗.)X!W;X0t2F;1-y|-]rE)b~.}?. :2u%#4%^6q]Dh(J\(P )X tɆL~6-eeaGNGxKυN"~j=?k)ZQ (P'eV=T=+E!;,9Ave J2vDX6)!uζ~8zw(N)C  fQ( K$OU;%}?k-rqX!R 'CUI: Ϋ Vos,Ul7@2%#rJҡzpRYv=nX>H0-lV&2Oq9:j=$@T<|Hc C=1 SS'^^I;]^3G H@r7-AS9xqC gqR=m *H\)VxSjTS)Hv5]=OHw2eʴ\PO јә'u;:9-M<"{5J~ӞyncpX{rѦ=P0KO^1d'^] H%"wL+X艄c*|ɖrbgIENDB`PKwL\jmA A +updraftplus/images/notices/updraft_logo.pngnu[PNG  IHDR,?PLTEOOOOTQOOOOPPOOPOPOOPOOQOOOOOOPOOOOOOOOOOOOOOOOOn0tRNS"}ҝ ʹ/BȘꒈr)m5;f_OHUZxo73 0IDATxk@eQP.xC}N)j;|م`0 `0 `0 ^a/t>=̧Em5 S"$s0m^}8OIFiX&?QX&Xx"+B}S>G*}u<7x&\G/p #DFb< r k2[DӊeTrf ;dvFrp>#cO$[x:ؗ7|)O[ΎP\FK(~ Z'^ɋs&h,4RˍCbCu#AEMqHZ|qreS Ըؤg^Lyql%nS2yq4C񛃷ѥqX-e3G_oRSmy:EkNrPj6)+{egvFbMo\i[/g [cFt6(a9kqa |5<uqieI4fUa8CU[ ?amдl`Lpfm Xy}gG.i [bA-x9"V -HLpJG{_"]7s r.װ\vKVJ.{6)5\pƅm?H/l.4{c8RE~FOVNED#cG$:g?ĤΡ &e-)Bx@iCbF*i `jF=ᆢY^D).G3ڎ1%ئӚVNq~mp7)Bu _tV8sN?W^bQ +)rvT'XQL[ۍ7{jY7;_n\t,J¯$p;wh{YN\.GZ}G,Z˨x2G %*+D;c['tsjJ=A&jИBK_<`QiM) n<#t.RD`S] ]4J)sl5NLyjO"TTs6NãDot"R7&֑ƸasM1>aph Il;NYN唠}%4?&d{4M 41HFBݔʏDj\Vz(SP2Z<Z`zQ Dh`yu.z& 0nH4LeB-fxE B MhU;iN1u;);,%:Qθ&;<Ξ!;;v32e*aCNy+ܬ3WBH<_!B'$ɜ.ПWQȍXߪ$DY$#~r K0&_~_v؆x6ex4 }=W2} NhKJ_ 4ɞ^ 6cR}̓_"bzOGl'  :R)c7&ٿ<>}q֮ eڑiIBM.mY00HE)HhB)u¥fo\E~#c6%o" d{M)ax ͡|vo&H,&ɝwz9M@C,`^{G/r;F8}(O8c?^@_B*b>o?&oXoNbH?A3l}^w3z-m**^f>uP"ϣ/y7`0 `0 `0 Ok]IENDB`PKwL\J I I (updraftplus/images/notices/reporting.pngnu[PNG  IHDR,?PLTEOdgVD[^N:KadH^aKpЅWH[orSikG'LD#J+M.RMR3k~HS🪣ДzDՃE]?:.zO=4Fv[gy|x׏x}㼲­iM䐷a~HW9ξܼ۳泝@}cIȸeۀfnSņ^鼧=~P݋rՅldGتʢ±嬕٩⣌n϶Ɏҿ˷w؟חl~dYȬ{j`;RVUGK*˚庢{|Ɇq^S HIDATx Pߺ׍YY%&vMLXˤz0%т.t%Yo$|Mt:Nt:Nt:Nvޜ+ڋ 3Kwط{i7(T6;ȶ0 *m7̧FKui,ȸnSf&Zt2/oۑ dLg 3 <:ps7lg[s6VDu-[AcX%C,0N?;Cc Go=LO(*p'R=qF֓/y+Z&щpS_eİ8DpS8U)Q0{q;13D8IA[VY=H~sdvMMfY7HB:ܵL!v C e eBR!붹%"]͎Ʀp6wskAaͩw-buws 8Wd<'wHɎ젲)Ԧt#ʂC֔k2Warp*?Mnp87N NNqbLk{SNe^:n) gԖL;ubχCYqqZ`"NfOupNpħ PŪ $qdL 6Xi|ֲ~[TJ˶#@ .o"φ!{"'qYtuAtLkP{ p}pYeWPą I.KOuH⦗gpk[K[[2p~sb Nٿ[d u} 4w 2NXͥ! s)0||0<.ށ圻n !Bp(6{tڭG` "0y^I"}?}Vpx) [SgМy]@B97۱9l-8? G4NrƑ_XW!]7>sC\{>?8ܵ.vf2[.Q!5)Rb{!ŤҥS?]Pѵ$%Wi0|M@W?AGKᯏ@u6E׍PMM88l̖JieqvWjپ 4< UE Á R*(ۡM5mh@ m6Ŷ0hG 4'3"٬-mQZ}*d)(!=:[3Rr$ G;Ė?5F KEma( mD9GmDفu-Cm \׍,:y6>pZ[[ȴZ¹HrCuSn22{o延W(<+8RWko.ba? [« ͍=jZqlJVcw]tnSap`'"'FnK^c{\&.!el4诵(L:6Cu?QC(g{+Yciuk2n<# GVjC q`Q#)۵K[&S%t{g8b[atHnMg.%If8v66uwgmdk,Kc/b[I`cJ>pz61ȺŁp?xXcmlQne=.<"ab@[Tk0ڀA5xNlE0Tl cN|  G N3zH\Q70E@ sj=@Pw0r10 t KAЋ:xuCwl$\6|'Fs9k ZPmsȸ`/M"fQ0 F(`@{w0DaxX0ծHe!R ؊Bni2YwbCh1L#gH+r@sqsqsqsWIq2Dqt|{G^▕}.a(ufiwYN.@yHHkc/xl~S5[s}fkpQp%}dgp5/47kD[PQ/ϕSJ(IENDB`PKwL\)updraftplus/images/notices/subscriben.pngnu[PNG  IHDRlg PLTE`_9gtRNS@f+IDATxڴM0Ӌ9B߇#זZBE8 X} d褄xU?mk>~O VjYl RHy)}!R'ɹr NE2,Sِ"C24YO:o&8)D)3@ℙv*!Y͐2QqL~;WR5_5UfR!qš'fugUӷkLҪkV0ҪkVhV 2Lwl^ +Z}l 10Vx&m H/2#0f^^ nf@-⪽1##}b툛ԏ/fZas._ޤZLShͺ4TeypCp;ޚ~ZP[≙ވ6 `4"ftSl'l^}͑fA3957oJठ<49 ٩5/@j9ѱs +)ĭQ#R)nMd5 , I1O@v4H͜"j0dFR̈2}FΎ}̩V?IN"в)_Siex ev*@:F4@1W?,hәԎ $c"M> 4u?)sFQk) Xfp(5{&&~ݠHt8C m^:1jw oE; wma)`^%Ј`l Ԍ{ԌZ`R3->hC HlEAbLr$4BkBGCseWڶ*#76kfoD1Ig;H*K`'fz0ˀz'f3PtwL(ϋ'ncf/[j}Zxj<P( nl9 \iX5sֽcFz%<`93 Edش{7 4*#eѭ#3 ;l NkpncsG_bFi Cj23znT5-~ZZ1p1@ۯ~"Y+PO` NH"\3o$Lhs183'NyacVO#_H-TpLLG] &2 4XWIy ^1Q-æU'bN CWr3T4 w=l&ΏZ0|c,N Feژj=a^1&t*~G眞էg&kD \X19d{fWPQ5r F,/ЩG@ 7fDcઓa&n-0 a6<1ۼ%af|0bV0f^a&1-/i:1T373&"nI*3$`F*7M9]N c=FA}Q1qsC17 0c+Z9r 3ӱ9rL 4q`鶇L"+hPGDCw gfO7W q 6E|OIٜԺZ!G~܆^ˊ}1ԋ10>;#3,U>;:!:Uw}m:CGVԔbvH1%q ha H;< I1ʩ(4쀨[efB 󚨃ӹ W k1N[t#TC!|ߵ=@`\0)CGާ\M5k÷tI 1 s1>בi0qtPƄcEaLd]müY'%~*Le#8o. Řm$"zT \bSy'VCjr2_&s(&7WFR}Q`X-͑b\}&7GBq < s]}o6a^hވvVOR`Rrs8g`F`sb⬘ zc8%1lx&ٹr *18L} I[Acaȹ٩MѤIh1 rRSM5Z0Gf7xcv7#аY=R {ؐItY:!jdxY3n7F>10-G y"'DcKɑ㞂´9LM0gNH1rhFOjI:c30r NU`*P)U7 1y_ORocg1/cuR'pLE0y \&g18#ln T߲b@%nDƘM#;M؆d1 }gm&'[1/D00vؠ̜tsm,i 1+(%9\=h=YS4&,ށ9#x#`b<.])g&9]ɤM&8M3& {?SRvn&4-n6>2%w;-G' n90f`_cnn&]FN !$ʏ,%`zHk7!a$`1dd1лp_W]LdaC1S=Oy'9c'P2133^r}>ax!kbk)`OcޜZh$䌯5p$gMP)P4ge r &(o!b˩CQHs3裘.GQ1~̔;ծ.GvA(2dʸ۸N)k*JyN8D\'3AR =9]ʠIENDB`PKwL\^ū+updraftplus/images/notices/locksettings.pngnu[PNG  IHDRPLTEi&:m)b/^d$9;5N[}+G3ݝ}s*7.20,5y)l6OͷŬuj`~<ֈ-*IDATxQOP ឹNK$!78+`w܈sKܒ.sD>/W$ic+HЛAݚsn&=Z\GR⚄̍}{kuʟ{ydQ8g ?!ȳ{a.F$pwc+xU1,t6`1`( [&Y$&CɤuXAk  M9AwӞu8;m#]4.uXCJNe\o:Y m¸ecs(G3~dqkqU}\% nWm[v[d/qToB9ǯ]ܶs]s>7 9J H:J?G{ʳe |бoَ5BKk< as+s1/йf, \ÝΒ:mhcUPfI/rOi.t}|YUĽTt3"S-\U\4?r[sDeq^ fp(l 9ܷq~p1{W!A ʗusڹa ,"tU!+,n 0QwY}? sKKa8¸?<y %updraftplus/images/notices/summer.pngnu[PNG  IHDR,?PLTE͔3tRNSOɣ4 {#J'ӿuS;\W.eoCm IDATxkw0?rWdSziTs۶U &y6$!T' F٣&Z݊Р qRCcMM3ć!5Lӣf`&(!N $s'95Sj6BAQstpC™5g6>5DMk@S-1XRh’b/G#$r!ZAjFu<]R}1nSRbأ{x1oL]Lw87]J87]Kݧaf7)\Rx8ZDGW7 K\OŜ;2w3rפĩTۢԖQE L&86]fR1UdITEoUў&'E? Db[T3zT@t j&:73ѝ:xjF[yCf&5r<C.bHbIu_3(7H)kr#e\3q#qVJ1\B-d(T$)ڹ.zZ2Fz)1QGbm9xcm% Ս,g4G<ϻ$b]Rl'FYqN+fZ;G|J|d QiJmq ϗԙ?I=yt9یx: xXqڠ"KX7% Gƨ31q#sҡ"&s bME-wpZT&8=c wó'z蔿6q7s^i6NJdUHFP$ GA l8>wu|@q0*N ̹dNk|xFؿ5i5PЦ[7"X ftj>r9RE/=sjrh[},&Ï |z54ZC&42CzZ@-(NthtA kڙkzև_ Rׁ & |h3(WP, Ϩ^Y$T3jܥ:9j礑ϨhZHHړ|WP["Z֕mgg>;r9y^&+ntk9@(z0שWA'y7UוW5~y҉sK8Y<~(ɲX/n'$ bG8I6 {gc}wQ$[{޽܏{IW )Ilc #N!L@@p3ҁxa?/\ -uؓ)^=awl^QIT%Q܊5'Pb!F':y3{x-!Elik[`#t<*~ ŽL/(C ha P%hC@ Y9cd/4CW[c>C3H-@`Ɗ05֊AYjjIut]$FG\qF䱄.lIpQ↔Ap)D-.; 8^ wRiHvu m s#a\M8::'!\c&OL[ ԋ׼2,O|'%H&4]OWJr'̈B0|\~W0HP=F}B g>6 S8ept+6th+4thp\+IENDB`PKwL\­%updraftplus/images/notices/spring.pngnu[PNG  IHDR,?PLTELM܎L]ڂۃPSYPadwڂLT{ۂJo|PqXQg}aYkݎN[ciUhVgԉޏ~PlvjMQ[|xKYU܍ٝSghmi`IuqdVW\֧۲歗PϘ[`޷OgҞgجVbaa۲]ܛ٭͖򾊸ͧKIN͔SJKIJJKISOO‹͓RtRʑROѷ̑gD̓PQKnVRMHӗPg⼅ζ~ː詊xXʾ̤ƁodќͲkW޽΅_ϳ㣚m٬ɞvZݶݙd֡ؖΧ±’Nj}ٵ{א%D~tRNS }9,&a# k\H0=+ KFɯqWNBʧՈQLc?3wW@qb0ȺuL߶-̌˼gWݔmV;鸙(IDATxk`'i6i$d}ٺe[eeZ[FN|QAы x ;<(xVAd ^xf-OͤMN O89qz'S E$T?bJ*HRyt]$`b\*p*akV/ݝq^fbъq{gPb{r728*qNx/Ԧڏ(r{JNqNdgU.-B/>!!Xh7s:9&=ޞ<>w*Cf d;Իվ19}"R K<B}Tija )N@>Dl#2eDk0-̙ 'lI2 tlBcA(B6eZ]-/]W'›?$b /_>t!缇aNA:/x@oYgS.b7d*LtP 8عIvTBWSg/n)yPKv ~06ZEAh]*".`mZIC4Cx)U'#Vйacplj베$Fh-H! JRPVΚ1؈ gѦsb"JcģcΚeXE~D)/#R6̴5 (D:;03J[ȝ@C>QYf]Pa`<0 hN=^oOg<:n0A,Zi f/9k@s ljsRy!Y7ɘqmؙS2u{a!] }XxEw5>Alʨ e 漣(WԧtWG#%1c7\Ɔd[O~}Яr1Fะi 6[xtBR¹Q#TψQdiCLD㊉RJW'gׯ&^v^׫"~(s[\]sJy/ͷoW_mhMzs:G&lLX%:Ϥ]{}}C.$½'+ $v)$4J9zW/l˒m גnƻ3Q<Cܼ_)2SViTׁf XdYqqYY / [flR O2|p?%VIi$;Su ڵoa\Mm?[2qee lZﹶ5mȭZ+J %A3zvՑHNˇF\N lՊM77Me'm?LЈNHKl&*hg֩bˌ5ѮhZm=N&r`3ix\q Q:͠z̺PG hsl&V%2iӵ25AUueƑiSmW`cis_zf ҟ`\FP>c1HK[-H(22, w☌"Uzc%ٚt|j~©QiI-Q/hp'IO,j>_?,SU5RB˜Z7ElX & bZ/eN8} @]-ESrp??IB6P&ˎRpge pP"D [" 'z@(U];)lIlt9WM3OlX8uuBFBb`\ށM1g·ؕ&4?PA mb,&8`ZcDML7Ddz-Er)T )hRB (N  .+.cy/~'/7}r{hV8AL=-' f??'8גwh- X#4.O%Lྭ62YiÛa.Mi׃R~ 0 pqs 9+n-Vl<ΎyKo7'eYA;V3&pшǸf]ٜ p0cxp]h ܟ!70j҆)pYD-fGd!ܕS'(pP+#9qxVՓl{}Ss6Qi &J9MMc|k+'(sbl'dD&jˠMw5= /E7tK<%.eŭvNd&.=>]\UEh`|%m`e?צڠʶAkwp*N'ۙa ӎK,ӎӨ8A;n_+ю㶍)AgD٫>4q=\U+ݸj;k;m,up?RUS\vV ;Jj;M 8@K )["RPQ72Ix/F +g!.K\־qs7st|ë`/r|dUv\^/RgӠi?{i3.;H%X7<.y;`_]U%I^ZΣܽ"y1ltC 6_) Rot2|\~7\9.JYtQ&i˟<]@(~k슬a9,u(jfNteL`Nd5vPYia.6Z7cpG@&s9G2q٪ý a+{530vG贯"4 TB Kׄ ^ŁpvIH+Mgi ?-79v ~\OC$zɨ@ 2ukiytXi1t0Cbif@C/];(^o#(|@eD < {*A+D!S4lN U݆"s=RKU_Hi ٩Sڸ-|^˖'#c]&JcִeuWyŪݴW*A2׀LIENDB`PKwL\kR/updraftplus/images/notices/wp_optimize_logo.pngnu[PNG  IHDRZρbKGD pHYs B(xtIME  XF=IDATxy|U?>i WPI$Ŋ:?qGKS8 MBm\Яˈ3~pe#XmIՍsV(-6$9׋׋}=9{Ͻ                    B>Bb{Yq֯on"x@T'}`w zm7+f XR&H%RKZ,.J(HfOm3uG^ Od|3"yByfDcNji>x>C]A5keu=>U1)gY42:/y|"8G`6n>guo)^`{J/1ή8 pqt;1ԏ mh/eXo.X<oeyyi \*+7X.ɓ٬KNFP3eEiVop%ٮ([[+}(R,"&Wjn+QOnC!M6o0m';sOKi ߉=DpA]w/NE`vO̔W "Y-T~&1!c=5Ђ~?N=X@/mV']{:$Hb.i* #29a̍TpMen.'c5hbLcמp_"!1e oGD7x±Dp>MZ|_;ܳWQU_Y5DB[!;Xv鳼js|`2轔e]i",j aȉleh'KJS7WY \$>`&f/8U4f]"8A=ӛ{9O$~fW (n1z9>Ӂ#߉lي_Anj 2?lT `o2;uw',#RdXƄDX), Wu+ryՀVw4a4á0#Ap^$C(g|+ nM/ts ^@zHdM fH b &PUҖR=^&/ǒpz<ٶf#Kg$^etf#Yr<7xVW 9?5_¹Ķ봡FM_,MaDx' bɲ }ZYrC-\-:u0Z5SL`CgLw_fm s^?u .ֽ±m&&MCONkXR|/9^pM!Tb\ȉt@_I0> {D yR-ƠDj`,f„H=U)=@; 2=\4c8a}iְyJs?Ba{MN{NӖYpVψPO$~C> J.}38)2J&ƣZBٻD)@5ɐT0? `OFDp`ل>il8$iu @A|CFyH''wܒS!6J"umx)l2p) :.:򬭣fd8~\Sj{4>m|p`aP:-h1qm'gHl arnB)KXWFKe ibk@|`6}],~&%_o=2ev[ATtSpل>->]JލC@(?ҊAG2c'_sI$ޔ x"_2y1%CK`uRo<ӎɂ_*`3tJ.*wZ:O$_~. %wc#2ҷ#,<G҆y'o~)}<4_[@2k"T;2׷loGy+AI:?) r~K* ds /xqۏ$CILc"G'2M44{,*/3 aRwMd |EΰϏg5i֏"iR2蛽A=lːچFKJ/YPJ| {u%&-YE`( }V i3,D`,: >^)凳 < ׭`}֊$+Gp-FUQo=Qh SNXȡzsSpOt-Q0> >vSBG/ `a6gC'N_럷iR}O/f#$^FH>.\Mb<;vF%짏2̗Wwmވ~aTKG#L,ق,>AQODFx4́b|V߫102b8Rp_t$1HC?)HY.H`m| X \Jcr㗬>=JZi5QM2Tߎg{)fθ7g-2u͞iS]uq[u]v'ji8+3ml}!ŵKI} (e ;uҚf͈-h\48FU!|5`׉j51]ƞ܉͒SW _IZ^5ErWurjD'vvX1L ~JK_ְSbkKE^llsewÉ[ھdMe@g^5z"r\SA8vG$1],z1D+)}Ixv&X6LQI} l hb6XE0uQ p6RAL!d㚂CxwKŒ.GaK3ؾA߫){M"f3kS@tEi>9V\XV'u&N-S ]<.}Jzr sClB!i =ĸ(e8 &@q`/9IEb qGQ[^o!mkp/nҪ4Dng*_ WR(mPD,Mx" 28ק|doomZ:IaYb4z‰b"vYu_]DޗA ~4+J"N]KHMZݸ}p2ZL%4FH5~:ax") lw%c2軛Dp]&'xo)'OߘZ{r"8Í LeNв;cv?զ ߓ)"NQubDsD O 7W2;G'O$' &|*įU~= [^5X'tH^=B/s"k=X|S8ؼ&.b^`g-:\'KkS; »; ǟ!G}TWG/äޑ`Տ۞ǤM5h&MwZÖl1ZSw* Ǟg3]8 W2~f_=/-$$j tx>L_-6:v+~Ճz7/B\v]*wcYcLt'{ /UpM3~;;1;QԔFwnUQt"j{=kbMs{WQbm/A3 QԕV˓AoJchK+@')ٟ-b~gT__"_Y:1nUĘӭ>\YnBOi)!uO8-e{J1 XDhޱw]_~$+՝I#ඒ5h 㚜ݘ.>p#=: g~m,\{o2O|`K"&; X7x֏ sܑPbL&.`@o2soXr+-stbOM%; g7wX_i_-~0_;|hVz{K"38SٙFwiȜDcpIe'W~ `%5`fQ6";܊x12%8"ɐ/w8v]K`R1`ߜ0E~nםjƖ-z'+R!ĮTmJQ6ޒ-RUCp\3Yxx,oN婥 EMĊ.^ئbP ߱I5gJEtc;(IkÛ^ifpALṣ$D|>:$XNLAmzNYmӷ9)8O>`e7n|N'[N$~ypxw$ @pϰT Zzg,~ޕei>_4fpORff~نu4l4[\$wcS*.NHEOYLysz+7.eCǔR}; FbO4Iþ Ö-4 bksB[O8SpC3?QN)ְNJ #(%]Įx8 h iij#-i88RlJ&oHL*di fbCD3uu;r;lب⾭`q8^qGg V/Rzq&xS8IG܉ ?X %]ۚ/گ-w$~b6$Iq^}Ya ?} T-XΌe >eå%UecljW ]bW8o%oF$`6xmpڮ~ۖ幌MA Sl-@Aξ&V|;Bg54O(}6-Vlz[Ke]VZGPOv.°p/cA"TTďu4|ׂ2=`T&r<]ᘠ`۫]|w)[IךIdb8$RO\[,V;)42 ,}{8>\R`gl ln"Jg,Qub7G nPMZOeךyTGl`~@`$8js00*(Ud~؂s 60Ӕ"mp|43;( _~HB@Kzu9>]:#:Ro&sDB(ɀ̨q_1.4;9D8O?*(1xrމ{&YÁ=4Z|xƉRNkPCɕ̸!1JK"m a[8HlkM6t[^)t5i5/uGsEfmK澾5p[;4IYeU~ `o'[]fﴆUl dcqx" l;GL}10ׁAy"'){ktUpBLwZޖ$ʡ{AK#Or>V IvH+uht;:^pIEzᎌe4+`ً32*N|Ħd=&Ҁo`@n"i?cSRP"ɾ ;v)-K)o90v؆+Sx/be*2sЉKǭ-Mu8w -]Nlj2iچFGl5T#yG: ÍKɇJpEMٶJ#JpcUYXW,v-iil$z1@dq" &6[i 3-}ZTC8ivR۵Wz .c{ A-fuTSڮĀu޽-CLj"o[.ĞP6%+Ga-3x-\ ܛA\*O8@Vw!{mڰh[& yזڒ_ !N0D9r73(ƧJT.tb@iќAsIl930VC5=Y7[1o+U@|7H)Gh,;G5DEo *8R3k=ץй0}㚂csYl9=)`Bڑ{A2mECz;O`מx}tXKG=d0? .}X>-fj*$0OP$o9MҚĻyOǗ𥉉 : [醶۠Y/sMmjX6>wIX:rtQz2ȍ{cNa9O)Dp[*+wq7m~ (|2\^!4rla{K"sDx!f[uwLI('EDpV,5ۊWL""?b~@&" Ѿ24@o0Ps}^8z^Zew^=gdH&lϿr ůkಆCaČc42&OH _@A5kPePp0'͕h?f[T#{i1CE={.? ͈'UYk2*a`4C=nQ[lj֢-;j0/gB )n5S_7}As`AAAAAAAAAAAAAAAAAAAAzi I+IENDB`PKwL\z*  'updraftplus/images/notices/ud_smile.pngnu[PNG  IHDR(GPPLTE//////////////////////////////////////////////////////////)/x+.-*Ω$~SB,(Ţ" -Ԯ%|wa2'!=0.ױ&ʦ#% r\kV jU dQ ZI *!*ql~fK;H9۴'ܴ'ٲ'{dD6|:tRNSgjK5, bR uE"˻|n?Y:죕^'őBir#}LGMNLSqrh68N fu܁{Y-V0m 6Cᆄ횝!b6FNn .s1#3Q$J螃n7`n8'0OCWGM4ԐEzCkZpZVhwK>LԽ܀+Dƨ>aDB/FuFX]R %^RMj4 H+բi*Rx e)S,>KޑLK]g6RPu Τs``{RɆ({̄̀aC\؂]q! ?/%A0,PP̃ ?~/eRPoV#!ܔ HJ e)vA-iCRT@""*R4 ]QiSU%#5.*ļTώQ%$^JT%-zI|[:IsÒ# ),?$d,@⃨,$ςYKN!_J|~/ &I\E !KC$v@d`ʈJ%^pO*> IJDn$2'ⲕUHe?$&#oA)yܠ/-.|^[q$O;$$3w(InJv2w;,Pv,H$jVůP<,ͼ˨M?v Y0 J%ůxuwϨ)EZzdOHY*-.h_]Qh㛿8(kqH JC))A=98U %yF+CZMjD8 <;݄fggP2{tYVENtt[BgP = bK~\$fV9!pLA6cLSIhS~ %Z_vFFo%rơ"[^ =b$/KNoy?V$Aܶ% /n eۗT Ϙd"{Ę^ܗ"TIMq\R%EΆ݅atC6ͤ$\$W}qiyAvJEnTCɖZ5Rꇊ졼\ܣ& Qb%Rk~J\KҦ~J>jɻ>E}*l's=7>ϣNT7XE 5E@]M6UwW!qxΎt]d)81 G#8 2'[uV[%!i?9#臍9e ''Eg`H9Cănr^\Z|1|ssgt-85Ǩd@!3?@_%8xx;ɽ3zve**bMSC73z|)c}kssMhc0 0 0 0 0 0 0 0 0 0 C_Ԭ3)IENDB`PKwL\4U<<+updraftplus/images/notices/black_friday.pngnu[PNG  IHDRp|PLTE$:tRNS "R֮)޴GƩ=1ѹe[B~-tVpM`&95ixlDIIDATxr0 o8wBfB1ؼX2 Ha1y*-}%:~x,ḷv {:E7ݠU.A-r7Z xhM>&UUclZyt#7|-͂c{MڟF~irtbI\G Ǜ5_Vd8Tv_.],l-IQTð ǩռu5#LqC\%tT|F1)f; X+[Q'n(SwB7kt +njsBN+= "Z2ĸ6]5<.ۥDe&>meDp#6m$8bk_ӒNj\ !⍸VOEL*ĵNͥ)qB 1I21]X.qk4Կ|S8۶!oYO1HĹ <y [lo Vrz%nA+|}P/~1D.Cꝸ 73a&^RqO&YS$GȏR!n Qp7 Y"?>q+\B Kx{h+\DoE_'+⚻K8gȇS'uE Io_Qj&7b5dң,R2s}ݙ5kQ,qX B:1Ab")+܆dwW2pdmYȲ ؤz!/zXsM#"YzqI5STw,:C`Rn׊64⾦G55bGEvٗhTEώs1si@^Ǝ Sl3R0TuVɭi^[ek}1-Q"LJػ?+ڼS=oG dHI~P*}TdGt"vE%~*xd!{'!6/3:(7(5nTڏX/VUnd`xhȉw}Q8$CajnެNb9.TĢCSZֈٚI"-?{* N ,ZAׁ"C-~>̹(VPGB˘HlNgX'[rc~?g87EybL_]B[\@3kqcJYZsbcr} Z!^ž2lMKӞ!5`㕷Y-DE`hc&xq >G𗁩69p'i.7k 5]ntq 0r ̥H:v@ XvAi^e5Î._ۚ'ɶ{ h3n<HB\2]gfh GtUtt睭\"(,~4B9 nD6o.A<>ьZ, vfB /lبK83)1]j׬4eY}zgT3 b9E#^@JFE$B{ ֱv|[ bB7B+_cu@l{ NgM6FĶTǑ8wKǜX$|&bN=gȯc؂f%vEl3ىmzf1~]b М 󆟍1X SJY֝Qr< LY֕H3Lm2;).wZĵNW(~[kMa#'Iط (ZMvy# RjEǣna`zoW@P!3eYF{nQs̿nfdn0e!:1z|feQn[[ ˕6}?h ;6YH8 Y= <&GhsA$\ۿ}9lFmQUz3N~= (Df;CjR ~B9,(TʞYR~/)ZL?gm$lQ;(5ړ) +eI [3QfN)YH3<Qz5߁czҪkvwTld/Vy{^%i=dzSAn(5'vvJ.g8fnjVr=\@Q86ÓCLA˓zq| X|۬CMp{LhQt6<{y;b\%@o*"NxS 4(ԾE*Q5q rT5[Xӏ?T[DXJbH^\ltR ՗R|c8}R2 y| m4Pm"TS 05miɔ(4H) jB+x $(ḎV')BMcXGPL|02m|JS颧]=٫z: !Kgh"M:QEy0XϷs1Klxw|Q~U@Ei%37H;x=%gݎ`\\s'ݏ84^uH2$t=IUu@b* 4i̋^ [.}Y4pǬj{,R]AK[IcMp *;R^UBz;aW'ua4@c]FЛĞ( u yhuY@U#++0؃.ٞ=DXɹy8޳(olLbt4|]Hv0*J 3;,﵍֧YZ3Ljt%#EMuGTєlll+pʪ[e4_|wj # U0̪#_ڗjy j4U>3i>]+77|VE V\;B1Z{Bn3z!~p{z k&֕7jw-ਂ3'@oٖmbFn KuHz>)\Kupdraftplus/images/other-plugins/easy-updates-manager-logo.pngnu[PNG  IHDRZW& pHYs+ IDATx}yz]qwYeYB| QF1cDQDT4DcQ$xˋFQVeY{~luMUw ;]sSUO=]]M E!SΗƦ@04`*I M\  € A;dcsh nU r疞`ʾn a7YÈ̱dqc)ki ij AH).K]Ӹ6-&%N3z =?o{Ygֳ2ɺn#)p6Ҳ vٸ(?y[X60<Ӹ,s:&X "Ȃ7j$DQ.K8k74кna&;28?]y1xAC3a8b79-q C-qn}T̐ey+{n|KȔճknT2 ,'oe-`0 =lN<TuᒵPYu+ -Ll]˔ Uj0~*v@$ۺ%!crg7,{0E ݔpR_f76RL[ ^:R,8p@ܴG1(expZ,8}κ;6nXp;W xO`]iYKSh0a܋``^,`dw~^1u2Csa|>ntwn2ߪ)1@fr{d1L/WrLDt0`S`^s7t1%'ˎhɮqJ+?'yde2ɂo]rO%hbƌex Xs2"'k_>lGyOxTx22fk1uUI%/OÎxS&/D\$B[B,% MOƿ&ebZW v8;pm y7`Qv32l_Sۍ*YrY.⹵ n}LE&2YD"^ʷTdNNF׊>)Tٌ3 b՗,{y:~\>,C\n0Agr2~89ÕɂJU)U*SMfne' Tv)f=X:n`(x#)gŴHEe7ݰv.@KS17U?.F&YbJHpT:4qw~o7~JKԷg787P6ftA6g9l9Ye/(npSt*2{|cto+TF'Ph{;Tyɦ+HEd(i6}ԍϊrMvr*n*Qwim?(e*9Ux\2HÎLVh OCF[yvdCOL"]ij(A% D7qLeoA' k1I&񞊶~*|EV8 AGc@ (S,'+߫H='v^2۪gʝ~:Q` @ki i~g',edܶ\ KlQHOYenha ',ѵls-3U(s4UR-`ʜ*_${|WY˲vn oYۄd\^&A*gxvnx&l$@`!j `oXZo/ 8X @k\:Fp^:S/7^CZee2Y)[T+(ժWFI/@ꉁ Ts ]2jAUn>*5_&S] U&Ŏ GbNV mmkUL.U='VNmev_'NibYﺽW,X[L* /(6N9B7N9}v :m:g ėͬX  wֶ<w A@jsC JqfV8|Js8Op3!8e,@w͖/;q 7a3~a(}(Vϫÿt2g5);Ha``/}C~W2Z~287"?@0mu66-HANi?a8 Y,bQSIvVMnpGT!d.dح4E~vPln2 Nh82pjlNtE<dQVn>"]\Xu["7~cI&i,VCk1I7}U%A$+ ؍r܎CvxvFXKSrOdPx;ɞN h{t-M! o\$9 \v`x WaU|n)9))f46_\@<ܾ!˕=׺P(n'i~en'pILN^n:nnpKXWkO` n>Gpp3]]]W7 G?IĐ5Ϥ)tcx>^nn1(N0(A._iơ!lp-AP!͸2fև>9B~ |Q;ӗ>`Mb6X,Lݰvn"Hm%33f(gü)­b&8&M!a0gJ'4fOa{a*}Lna$a8p(##m#Xe]o}^zgbs?0Ҷ, |AFG,g(gc#-^alm:ʗ Gq_8KX _66lS1 ų4e s̴'eaq-lpʤ)˶j;dU`k;~*</y_.yG` Wl~ |?lm3E/l_T6vC 27T΀X ȱ!OY&=EAc4j*Lu|+=o;.A>gO> Ժt?v}e4m|%峎<[ů ;.}Ds"U=P?4/*~T'7.oןsh7|n}數tij_Y|of$2딱ǹn _0DM`|PI2B@0_{/Wϊ^i,!e >0)" &@Jbym?s³1C@^) W87BPNp2p4s6PƦsxɶKe׍hi -a%kIu:~ޔnu@ew/ tƄ__w`YI Ϯ硢' UفNo, v|} َW| ױm$]vō/۵S:gx<Y)Py{3=(֜TvZvkY Phﻱ[d{DJzRw& _pB8f8Ԁ'TS|IRΟe>䫐Y+H4Gosd7z@Eii8=2^7ey![B!80)OA7@VjZB`)cBf & a  f”-KQ,⳴&+&k-rKo>6bAp+wEM[یI ZSB767sO 9_^F?^Vc66mxQxrr;\oS{)jbUѶk' ۭL|NQ)d8*(vR%iq38R`#c{\'v8ߣ4r/gzo+`7LpjJԦZE_^ECoU@6C :VU`Ɖߡσ;74\?tU`gvU )Xؾ1Ap hf`8,}b1lKJ <}}DΕ3pVcsBքܟ,B[U_ ق )RV*^2]tJ^OL*t vg'HOŃ`UFE[vO%=n[p29UdE>Jantbw*:n@12϶ YNnh@6Z:)tzx%=+^zK@ ?!۞n 8u8M!XนpOGݜ"iTK*PB=7D({VE,\6S|S0ySh44Fe;r{e(ZX>%7"N+oB8o"o Y0wzȋI?/HC%ԼDz߼ênenWNUCUWUS̮6VòGW\E*(+.#+VS z"m'ֳPD ]qpyx*y'Z/)B6L/+s#v􋱛jqCOVGK~rswkO,]8s> 9T) hŕm/ FSe]DnS{2]ٵ];zvH];qSgo}'YTmL)svuU6ra /kNmC"b~(eҺ_Vg0}h0oGO+[1~oIq[&`7xelҙC `cS(e8B|Ozf _$f<^q d_:3j䎍H3 2Eaʕb64fs Aq(%e fd#͡lp,L^[&o IDATBj)WL{29E,W[pBVfc!c<*w&d4[ '{sS׍d*pCc,u]WS%niۮI/kt| hD:;*,[.2;.Yq_mYf'P+[2]mzOfBݢZ`evA k7.W 7u܇eaU٠СiuS2oysGqdžܠ$q.[Pd(1yR߲LՌᰖP 0 0 su$[Bm6x k)YhސƦjsegart9k_+2b"&X18-F>q)sj ^@z#SM|w֪oPwc'[AfABƴW]_E{4Tчpߍ"h$w!ջp.pOS^=YT`i,L SGV6 /ڵv=zYUF)-jMU'/z^d ʈFb  TDog%' R&n`XY;*=fKՂ{#㇦鞊St)#}ֈtyVD+- 5DaV` xcծ?U} hꫪM)K'P+I j_>&hy2hD{i:Y hcU}`73&H˺_^7OzFZN^0ep]/6:սh3vN񲥯v?vE=FgTU{iwYv-t/L$1gv)k5 8]xƒ7!HBR\;Tu ꩂ)TzkhEZW{ۏAgidTd XrE{󲷪~YٌCT L;`z ƂyK(Ѵ5ZY蹲|̙}n @rzrs(xx}򚳖{v?v{ՙ,  \C:V*^陎'tMckOϭ_ɛONyoc @k]<{1g9ϿyNwj524d eA%GX&p`ì/l|gӵ'8-M3/C/ ^K|? _ {u"lEput 4*;jkv`s^LIFF`F"T=BieeoOqŇH׏V?vKke'όD%M%#?^wY^BS =+iOLNpY?7L2 4_ZgugIôE~רJ\_0Kl-v&.glPr1SS/}d8FS~o"]ld%_xzQ靟&`,^Hc#=;{̟?(ŎʾI|VdD%MoPK^+.Q_umcV-JT@FEfVK%ZjG3.3M\&aL~ ψt-r_'N_XӿX &"33->ܶ`mEՏ]҉jVLMʕhў6_2uoL׼l|Yٵ oul#ҹ (&jDzs#3'~ö_̺$8㰿U|][Jۡ{"-K^Zv{w1@#%bAKc}otܼen L׵?^jNւ_@]hBzG! y0j~f4<7o?O$׈th=|a͛;n_~NeX2VF `%S 8eq-Mz{Ӑp -XE~iϒQ5JH[ ,d0ԀZw4hlGr7b@_'ԚiI@Ga*m*T&ު2tGD_*xYʻX[O],""-4_ z)=#S1ÌD?_{I} GNА'i,2|J<%eh&~SY&5eRuɠNO$oM5cθnjR= Am<1MKEUEd1%Ђל8F_(5ĊA'bloa(2[3_J725_y:oSVB<{DY& FIdTNU]7Dqm~+dO&ߎhHnx_hڛm >4ki"VGSȡwri텏FSv둮+Y&̏ךFס+6ZoE 4$>~4 ]Ci:v`덳W͋aͳb2aqQ8fq n"}d Ʉ|]ZI-UHtjLcA,kzLsRM-( .76#'Y2֐ |%]-F4ie3h":ZF)X*QɺZx_wI[AO/0]ϞkQ+11G[~:wz*q _ngŵV}@Nd$@+-387U'@7]01Ic}`7EH٢[ctqͤyhM%f~8r`5Ju?MmKAѶiho(eȔ1᎓Y:1u~Q&E715k𑌱=@+w)kes 9 Er 5zvTfZT zS=?Α;OMD*J"Iha;8<4hvOE}VCG/ $>zc##{* =@zs{诙۱%h2v|qSwwNy90n, 9b''FJy3z{K@zFqG'r ]:]ܟՃ3;.`T3}%6u+IQG{'{&x4SZWoY}m+z35ρ }$6NJlxsVVrdvm:BݵQ}%=ZqϨGJ?kǜܓN ŇOtnЈt oh[Yqw}ꑞ[5{B '+qwXjDO7N V#0y3c Pj?#] X2@SMOnn|c }-_m+K@-P \ώuy.G54޷:Pӓ{ui"-P>vU_ޟt==;00(;V?~i6 ě(E`}mfO4{ǵl?ХgT#i[}=+;kF Cߺw3N;!]#ꕟs{V.Ңo>9'4 |Ϩf1N;p}IV}`/n|q3 'ӹ9D}-2;liJZW3Pu~й`5WDzEWh*u4>XXnrI7=e{2s=hqwfl\Lj?(u=e[l:0|Z@wrħkL=) =]sWٌCW 6qw3#?A&SN܎_so~P4{cxueϨ=`[ct@}+Ηe#ii 1\`Nq3&3=>k>6挜,/lY!+fr}Os~'o7 -gq-;ǣY@<[U ,JZ{N? @'OYzWI|t[˽CsKWDl2"Nm-gQ-$6=+V]63aq.N]Jn|&ucz+9Oe=gUrN{v.etMĦ&77}x. kvL]wlLEGx{o|;y_º~aWiͤˍHo<uoiPͦIH1GcpN $6ߝV^U:y?`xW9^p}m0=SH>(j E,&0鿎v`5MwĢck=X~/ k'*Tn {`HIii7=Lӻ.tyB !Wep[4ѿhu_oڌ d RcR?3%.8Tk]EoΖAܺt+ߎNwl}'TTW=qa5/侒R̶/ۙ-^Ԏwx]V㮢!И;xW˞ ̽+<̮Mw뽻fjzom7~k^jEYd<}>ӈK*k;{( 'zg7w~z?fԶKFdS{Mk4 - ˦FL뎿mnZT#?-պ7}p>kZ5wރXIǾy峎Z]9gaG@5BP˟hecscXv%IUbLijuA ֦r-[̺*o@O2p ')`Q7gOVqekUL T'-qQj. ׽E>W>dϯ@0`#$65Sv,=恿f 2U'ތ-ivx`W}ͻǸ%s{X$^׳rfD:ef |Qn_˵ `Uy~N>e)\M je>kOY'rщ'i(R]m@}xS>ZJѩlXlkt¢֖LꡞQ@wbc{ 4do;lN%m1ReP^qeЗ^HKn`__QnαL*dGɞC,!K%jYH꟝$hg7;l+"q i o LugtIuW<;Z,ȪuUZ:sR_#K*z}g"My)g;4-@wl;U9oOL\}ȩP9g!mqJߘd㲎 *c ?⯝|R^^ ry[oiSQ}0J5|'߆T:_x˻g\)s̗ߓi<*_&X&U윧77Ξnw7~ޤ?5[KqZςz_籌| ]KKƦxF[2a7n3Fv@㾇VB;Lm@Q'_X 3O騷J׬`Yc @'\\ Ʀ!r/uU2Me3ֆ>[,vq;߰b7KHB3>Kx}8-_y+dU I kcHW@9*2*3W6nyQUցs',{C[<0L3Tt54 @>%{U/4yB2d!:s,LJZYhmpnSЗsL9PDS/;y3x+W6μi)hLg,&\jo0ў/L-k5{e N>VI%PM>q" k_ipoVAIپ5 Mc<Cl:`t~ IDATL=s%}5N(Q)nu?[ NY_x߱=L,dfI/Pn:-FWzDm\ ,y*z2^:&))V? 2QiH -)ϺhmXʁ=-wVZKީrwGϛ(4||cV^XQ 1MKn $0=uLϊv^&@ex1< Ū i26ߒ=tIP.~4^:e3H CcxϢGkhYSo 9 vczn|cNǫnjWJ 3At︍1d׾WKc4Ȁ;/ +|^HbWeɂ&㲥|}!+fQ-x"")5.`rU,6N9gtM oM6XV.y~GKZ୬{PsYC:e4H 7 e߉FQQ^UYM`n?߆J7 nG0t/!a2;}i(X Sخ]Q+.3=%%_u~ˆ~ہ# 5 SF%4,^yu/ @ya?/gzz2hvVZ^Jո• '_ڱ}332 z=uaG$ Fh՜|UV.(xHik+xi_miu?!j7.yvL@C6'|+i/ *>R;gn#@*O\`fI9|/7p|F+q*A(M2Ȗ=GW|,&Zb*3}6tQ<=E _je)~82=5tm 1CXxc.~SW0۬J>RV߇tlYg$gxV+%h\4GU'?}Dc'=-kgMy`~y*M;b?!,[!׏<*層le d kA2w<ˤ,86dd-oaDt~+Җ]S8?eF2Xr{Zʗ ~&}hOƼ,XYa9R;CcV-iL\?8o噞,ao @}/V+ٵS [Y;)ݾ)+rB< #ϯnhi1,XUx8һk1Kj$ зOLS^׾&J/E:WnXTfNkLy1ӈtg۾,|uW>jMG峥f : -~߂P" &|0* oy1_ķ|_C.iȂ+z0l#qޛg;6zk>wm; rq :SKtOb cM'Һ֚/HOu40tߠkefTï+kk v"=v+=uIZ\N pl^H+cvOG|5Z߸=[H`T kђ:0"j(Π- *>Uyb/O1LO7> <pgv#!^R{c2qϾ9m'Zzzȥ>yصt= _[] OQ_'Հ'gG"]' q"P+IDSӴzGUٴMqW\맩đ@q /_歮\0Aή<ruT x)-aQ$ l t6|JAuLQs uмiBjr@>i2wm]Z54l\yکht@}5ﳓ_;9M%uP n*LϴWRk$~nA?c-X\wS"ݎv 7Jƻ7dVv񗌓ᤷ~8bZl}9u3歪{ [t<޳UfX2VXb[dx?Heژ3LBή^t-dxo1Szmϟ]/S@5_c̐MͿtݷJWZxsrZ2(,ϟ"X|is 3JGLC/fjU5O9; Ѿɣvxhg,6+Ii&&~ч@o$=e?eQ(2,ݾ[dx~Ӛe2"uḾ x@ziK+,74f`Bw\|ٜ-L*he?Nۿh֡44O<$8v< V|[eZ9Md`لdvYuN1[੨iP'OGxQ/c 2E֯3M MV5<&ԗl:'+2lKȾȟkQ#߁ݬ@IJ'?*hB׭eU NN!'Y&~H|nP+)JF4b7e$OX Pyhh"r4MDLo\6jWPw_e q{cD{/5`:]w:(MmS}-L<7]hS:l2d*\s|]\d*mlƷ6؛&5zO{ُ?j֣T! V &1sַ\:}=Ϧ*4hoC6W$>W?qF5nd٦҉rK2_d[t2aٗ<Uow/A0sd~!8ZG&#47 ~\l'0D 2O5!XPػJ8^/FVkZvlPʙlKdYe'!dL$Q=[ `E\~r8!"_+jP*T}f63FgDgw2ۑ*F"MO$Dhz^ ŃO]@toOq)=Ր#?Oa֋'[{)lپtl'K,ψ2ԷF,Ub۔@ߍrw[ZyGfɅ_ ˶5vm# _nB!@d}Zzyԇh4"%uMm,!ļ7߽e-Dr5U\Q #do LG'?B>%9,]Q$.w:<Fa O~I@#H=A/8mSٺ`D5rBBn4EeЮ"2s[W:2H"$٘~y!`ǓMCtrC wR CaW '̌!Gn}$coqű +'7hOQ #ӤNN7 F7k/Y9dWqU?{9z& -PC@UTl9 tn]|2Q^.xS P1BA$ ][:9#Xegcd˛K-a2tXҽ"!޸(2P ĕL>.2f˶xeJo4"eG2?Qlz64y6{yI[|:1)MCb _?d_94ONv?!@ܗ禹Apé ɽ оy5ݣR=M}"~\9!~|̀x m]@;ju@s9q(l0^o߸U%+*^=?$z:=]BF &{2'^oy2j48HGk=7xM3dsV=D :vR͐˿.6Q"*HQ%}eh/ZT1B:AYEmh I=4-bP.MhbOQCu?;x0U)׶XЎgƚ7E*@ot|mm?yVr c"WQo5IԄ$%ZK8yĜo%CCyCƇ=q%4ɵiyRB|20脆 OfmB{D90`T&K}$ukr]C`C]CLp? ^~D(]A+!D0nmlk&My _0orC@;Mh gymJ_"yf`;=39ϊ,ӺsxQVrҋ~Ujh` x?3T]s)*^~l6t>ͽ'{{ yEhpܱۦ?,3[^)xFDv}8c@dQ}L"\.Dh/Ưbîn`2cUZ?aH˒_m cKP+ :!8yM`I]CL&3G1X(Bp0&5~TXLبKsoy e/eu pdtugFˀu hs6 sq5i4VrqVzU73UVsm=l|m_hݣuuxpY~ȬD<<0xx: 9Μ SQu$>Zx,|i7SR_+LXvpFC"}mg*Grrho^h)^#R=f=߽B^sѪw/l[U*D52t! x~wG#rkXF?"4<4>۠hK//UOHKAzBlFc~8Jmƾ@9vWYِ J :;C.FiӴv@%%U JVNk2Dwo;w#p(qy>&Bs4m:HhGʯ~Rp u'M@Xe{2Sƶ*&LJ#nItD]Q\wBU<%ʨ-uoss`ycVV/g,H'3$ 3o;Ē]9 r%co`VUDf9ߙ,xHޯ$AMi[cPC]sk_VOy@Hm"5g15Ü3Y(<7Ba),#FUs| Fx2!?$Ms}uH:[$[(4;䅟1| 3mD/kLz2;V:M\uo;IœgHQ6F]:e5ZG\"Ff*XȔNBIB'\3q%;ɱ*F!]}yOFڏc\='}y]OF棩,O:e%׉/6yg$* d {l%-Ϥ FOB4l; [7YJom77y?@ _B籹:Dt)IOh&wہO**A<޽@c‧5#Ͽa v_ EIl}h##|<- S5俜1hGe=rL}杳9>Xwsȡe]}m]cbwv$[g؆#OWkhh HUuO#3iM)UY9z|Xׇ3 t<+ژ}jƁ2]ק2 =N~Llgx0[s1ZԙFɦU1a5< (8pixIW+j">'o C o gܔ\V]ј[7Dτy&}gґ/U26Bbɭe|\>/WwjVy⭻`0x2:39aQ0M>iObF1fiR2D-Vtf0E`#b5 B*{MOS xFgȭN;]!3X$ɥ/h_~̀56iOβGK%;xSeʠ۲xUjC%Jǯ %%7ZձJD;铻{Q17?q0n(Ni`"!Ѹ#5Dtɂ`7/wqUN wnRxtRgx=[9\ ۻ㡾o-eu'u{).\yvWÁ>T ﲂ18'u@ԡBDt*Gy{tiɅ+! c;p4<߰TZh5$WD,(nׂWOrK˚FU_1l$o&bG}uhy@sc۞dn N⚧|b 21E4\2yM`r)Xd~^&_J9l`WS߿hڜgOpB\9 zxhSmk@ xwHp dƚ|'f+~RCc [|[ (%PI Y"%<߳( «'x G<&Ihܽ4F-]ESW( DT:;7 V"15O况xre-i+Qty8 Vͩɿ6޾ާqlÓ=]u WX<<B]c2NS6:mu/7-o:+ &DP8f6+"W&]˻v#NiJ^OR+uж7yefZbc{?_hۛgek;ۻ㽶OCfpO>S' M,.$7h؍fY]grb G/ݒoABR\qٵQ _W5۞t:[oY6~>3]r!e}tw7I9fj.!w&xDƐk]Ҽ#c!w߰Th@RƼFL2NXT!*{i]|ov>垡/>;;'wݮ-@Ό(&`ȴIj:W]d5@{]CsAp8c(0`xیa6`#1A0\π0?xl@)lc\a K~5Π>jMPڟOmv61GASdz1/Z-q]1ʕoMbA3esuxy]ҿkoZxfrKvUNMm~.cH^G.~|myxˮi"BnIG[uTI<ɍjx4:| cDW]19 \uF[nx]{ yEcJES\y/rj+KsA~|t`Voю#T9g\3Ythɾ%s'O_Jr{/zok]3ybкxu@MX0mԙh¿qI544#usF-2moNԿNc5ѦOg TL\vkuռ)"hB.~ZU8r^& MՠLr JBO/Wy Bn2 L%sPwń\7C)(:lé<57np*KΕg rgӳT@궻N;c4448FCSݟzu={`U[v= F%;G1Oï^Y uZԋ\ ?jġgx[y M Ʃ9RKf0=V)WȳcΧ0sT_S\I st7{pMNX|R# Ϣt^g[t;$Iy,TݿAU:~47St= yEW4Gk+y5UI>V&*YR'g^7Vԟ3nEoh:?;{-UVgAquz ۖ3˯zL6ضO{i7$z[V ?:i IDAT͋pV7x&ӝsZBtU_F꽑*r! >(D>e^[r<$Y,|dd.Cޮ6b[{nǑ[񶻫}3G3^MB7O"O#C_[Y!Y8,^y/0-#'W@Mxh88-ljmwxU1a[/x m]97b~Buh'BgvמW~壡_+K3歴j/k;.mwާ vޖ[htxjȩ>xgٕ'ʽ-sb{>]h5T H~hfA( KZ8~uh=;w\%_y(S4)+gxLK xuJA2k'"//<u 0 5aqOݕ˯zBa\yN ЙHEy:1lvsaަBa z'WNm>u(N&#VB'Ξ<'pI}x @҉Yg=2NǦGxr6k @hEQ>X8׊]e~7a1~ϙrׯhqoPT:.(.z2OeXr!"Ҙ iCɅiSư{ĩ?Z~PW*[%Vz|ccj-9Fg$ ir<Қjٶ9%2MY BTk+$`Ss)㗾~x495/uC D9)#DjM,TO,(@[MfrT+O{Vط`$=ۗΜj='>ECjh#4&GFf y=oZ-*^*fjGXr۳T QcJ=),Ɣx2rG SW`]?4H gzJt},ʲ%|{]Rn" JvMVZn;ley͒x˽QWa")]h,tTE(;OM0C t.VóHL%G&b# Å`n/8W]Qͻ9| xlNt}[ ocNx+CRo^,i/%zTCQ*(rgh fO~Wx΄OK>کdl^LV/ٲ ײR ^ Uq39Vȱpcɧ)tNw+[;u0g,lmӶ]{WP)X"Ofe9v|g*y&5>~mYFfCU XC"Z|k]7W~Sjt}vi,tq u`C<0/^w_x`H%G* p:p1CAk rULzjg\n~{_g*4TUt O@GzGwAb7\e-J_kGyr{) c Jҋu:?<`E#= Cj8F- {N?QnSR|/Tꖷ sv:X0pyCpr5I8)4nW{ e<&O~Zv?&njJ r> Jɩ=kS%khĿ#@ƒ_ usdGKitgLUdrȈoAY+z3w*5~#? >_gQhGF|vr1C x:!7KEkpse L^ȴP7׃9/_}{9=ۏWz/gTNL7!q-|UV[;~J( Z}{-:'ms"ϢrlS#}N!6]Wi+?l1x^}{^ t!?dx)%!ʰk<ع'Yjx JX"&"i&RGbakZ*Rr5o?h IMǵf jp}Kg393$x 4`;s";RqkGm+b3Dޚ@Ms@H β5T>(v psjϭ甗7l 'a5Y}]- `5v_I0igv yxpvSڎȜ۷)Wń(J5LI4ޜcc][^<`'x kY"#;ҀkiGꋼ|EcZ(qGLxn V߰TH6~"Z V2zp;~ģb=ߟdrm# \/P9VJ$wF{܂_MVK>u;&wMh%SL{=$s$u;=nr5(fJݳ}o3cW?e@;-Rtg!'u;oNU*GK*FwyMPKγO}ǖˋx7&Jw$Fܝr{^'>bF!w{42\Mr|^zD+$I@=x.{Z*G+ ͉܃]GZ3(a .5d K2l|.o{o;>he ұ[p;gv؟2}@ҁ9vzbmw ofh{fܹQ|Г=Y~N` Lۏj8#^V]H.{c 2 #{n? k iT; oG0ȭ8`#_ j1rRZ;OsSO_=̰V]qƎ92ۤ]'Ij8Rc'Xҷy^a׮=]g˳km5*3)ifg'ī oeyfߌcѱs,h=O~D>^o&[sZ>ۘh7?8'0>ds]fYՇ6[wBʯ0yDdr yVY/1R>sU97S]C=3ig05`r aUSϫϬ[hezpi{}:+|-hS7c\2|̀9Нk!rl_CR;W7Hkh{xTƓYKjॺ?g'3}³U{KueVg''m xݕw[зO+xx~& =Gϒ5[?_ҷ?44F׉&oE[6@;sZWVxC΍@3ߛFN}9] =3\ztڮ/+lKDoyx_8m63r>h?n5XdblY+8r g5mauv:5L)ߔS}FSpU]7+:ٵ d7Zfs,mcSH6Yѳқ?X^y6+YȖmeo.?P;y_D6ɉ,3g3xN`eGl9 +lsoLu,+d Eoz?9liπ϶jh]C@%4;3Wݣև$0|TnOS'5x>.!(3(hn/^3ꠣt7)wܠ8[ e79NV r'ݘ-H} vߗ`Zn[ej +誨Y:s +? N|,$`q-5``ܳ Gu^h0!7&7dekkbx#z8:چ?iIl+!ngfvۘ`6fǎtrcVmg%:?W<Ҙg,`le;^r'dھ f> 8'62_:+`d1iEI[pp i[ts4ɜ`ٵ<ʬ;I huc%0_j[r⬮s՜[V&z`IJT0%\6˦, kCYݚ@󞹾?@PVsגgzGN50lg_KuBtPh00 R/y.nedǻLGI7򒓨]mپɳ>Nek˄ܦc~x _XH}DC@Hwlw#[]ڐl-[9'X\1~̃Cok+xvc'}-[4 ׮kvx8<)h?O1$='z9c'cv6su 6_t錄f3~FYirמ&zZV,(y{)K_X@C:;ӛi,4%e2B6s1 jͼoKl{}S :c9@a|6rޭg:7> yu Q+-x_##ᡳbazjv{;]j8Nhh[0p3_{"Ult4[MHK,E+Ƃ ҇ , R6ZDEDQCC%BbIns}~;g9np̜{s={|XHtL30Զ|^J`lthr6YeTL ,h]9tzy~#"izANe6jSW޿֓Lzն-_~L[wnwheAW޷[ V[|r{>򽽟vAQ]ڳxN7r 8<}Ĉӓ\*~0؈B:Mu_\|[Du/ANZIq'"%AJo-P҂hlJ/DQ?ZS}Zswqy`* B&ӿ:xߣa;E^Rryk4Vs ͣ]zO>S6 rm\f.Gn%y\sZ&5&T:'R 'BJ疕 1IDATɪ5&Y4G 8-`ā9-rw<ѫ&pa,k,\;.-\Ne,_^/$T޶ӇyV\/i/3Nۓ 5-b$cOuݙmOC#8& '=Ym]eOkֈn'x:tk" f5-17fp8~:Nm5/G+:llNW{W.<_z__Վݯߚ灟Y[j^i_mn5]M)Nk @ڱ0Ѻ~Nf!rKm4:dYנ&dfe 2(OiL,εןau[,{c-u.:&N_ڻx[g_ypñ޸1Vj'ujr/O_4[r1]Bg[hFXuN[N"kIb6@+6PĠ<F(sc2s t 5e>s<9xcv/_3yɽ]*_/L}Lǥب~ sz$.OqvIc=ZIFlqʒl2nUW.RY6ϔFV;6zp1^f{ήoNuϢXYxkcoiTovޕNΗ=KS?$Eu_.io-(~# 4y &c)ڋ6OjrRG!/uC~ӖR+x9iyrQhЁPs 4i8V,oӄ5=:4?֍0[֣L귤7vMϪC 5Kdz$96"72v޺PC.IF@#udQig? aNic>(&]q/oXkz_aXt89sE>0٬fˑq$.157[n6{`a3|[y 9g?%pp"|<g#מK~+Ke L4ltӿM{;@_iQl{|DĶԊ+D7Z@^zc92W."t~w L_tk6yrcg^ɟT6=.IdK.n /[Գ^4\ %s+m޹xJr; [Xm_G Znyst< J+m"x$Z?Fn< PyPRス0kUN _3n8Oc1SW=@FOojH%_:3sݴyۀ65FekvÖm۰^㑾s -Z[kkӵPS|:k4\I9"VMcK|Mc"!͗c<xדj76íz1v+FxbġTI{ZBzһtwp뫧^?Fٌhr ߊfb[(ΒKPh,Ev3.Ulm^$?8ZFo~o?ֵS74i(R%\cMk.Cpl3kJt Ǒb]C7ݣbKNt=lB@;L"}a\ q\%$nqa c01aM%ë IENDB`PKwL\>M@@0updraftplus/images/other-plugins/meta-slider.pngnu[PNG  IHDRcUtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp -= IDATx} \EdfLEPE/@AWW+Ȫ. 9ȝL2}_ILB}ZLիw8'N8$!ĉ'Ɯ8qĉ1'N8q0ĉ'N9qĉ1'N8q`̉'N9qĉcN8q~$O]|.-Am= AkVM=ouh#ڡ,@QcXK*wbl>Q&v"B?DP4]x*# +DKA3dhus=!%N2NG:rI1GzIC1t"KV?(5&ڜ!2ǎxMHV4)|5TĊnI6ڈ޳#rq9Qj6sq!8ךb\S';:Fw}zRQG TXcDjcDe3;uIߋqL݆طx d N-x<{0: C{&-^Ox?~ "πt1&06I:9`EOXvh}̩"#=T]scH3]ֺ{`]6ǡJ"/@ڣкΉ'Ɠi O@{?cp} hO'N8Q:tƳFh;F@)O)N8]ОYhoAʡ3 Sep('NV`<ڟRjjh~ĉ qhLþ] Ih)Ɖ?r ӸFOiƉ OyN'NN0 ڷ~w}O7N8`oc]hW)lj'Xz>8qt<h #q<>Kz8q:GЪN1(=`a@M&;/C5fS`A)$ycd ={9Bx yM9Ae;y_ǰOyTf6㷖Nv1%6U8K1Uqdyg-ХPCv":\EλQ~`wϋʂhp0|AD5gWė灩A\m8Q8݊K>/ kPk 6ALo$ؿֳ Ҁm_§j2GV D K"oD_K:_WwN=-=d0σcI_ !hޜcKcWw]V, T(n!w L2pS{,//du2qdlC'id\* ^;:uLcfqJo(w(6>t[8P׿Ķo9:1Q*JՌ=|ĶV<1;;[Vjn4.*RzVslhղAP5*I:K bsd>rޢh@n1z=N?M> ㌥WV{T\&KBy7)UEh8'6NpH]/RqeAi[KeJ>h@fym\n!h#,%f1ńEGZHT zρwu > tfQH!hߙHoOg"`EᢤhK277:Wa!IvaE']R$xLo(|6C c& Gu@#Y7m >j휯:(*bZAxEbQicN²>I"EZD-0ꅹṙ\N̑ZY"(*:ؠ9|)jgw:\cޔ#)895&HxaN;NSF I:y7Q}"$Ri-yz؅=cƷ|/)~Gc6O/ Ƭ9gc~0)Mc'rl@e"簳gC-WǞ#cIy%|~ϬeD4VI$qp^h2G{\cr-3HG Îs3ȑEW"SX8$P>7Ѻ m18] ↌ J+v80wl`|1.A^sE`6:xV~1㩄1T3˿Xpz@cǙԀ1爪1v&8XUu yAU(f1ΤLu U`aBdb3`_ mtӰ\= qYH>ŶiX`  ^iZ~U1@}pX3=w`i@)j[ 3k>E*߭~ ~IKG9w̅}O~1y803/5-1`ons|xP@e>Vh6aؿ&nyk ߛR ⌻CCg26۳.kӞ%VdN=6(x:Ub2Bd-eჱdIl߫RN!2tjl!Ϭ%߁ȼ]j2[D$fA&\Η>`F6QZA]+A:1{`B/Nvbrb|qJEq0}>h'kaU"˯R2c摣[J g o)n8hycGcGd Qo #jFQo|"G"DI:xTba1sSEE fш1'.҃7}58fnr^73X`,H|k~ >ݢ/% 6.L5<76x\4.5O9Ҝy%,#↑Rn 8|b%Ùk|ctt>bBUIMcRVܡT*MeXEC=wټҝAY\lbw`׀t$ $aYw'պYK? 7ʬ` <131DT=X!+5M|x޻b^ $XִN`<(_b>0r >H1=~ 9arWr4Hu7"N8;.+J&4S0)[jaLNvTk |`Fdt9$dXp_{7]X&V1=, n D/=l&~ʍT"-祸 =-]PQ?+bYWsTTU5"1W狨F% [W@zO[ ΄„}JmgF=\fA72ӭšaϬE/lZ <2!-x|D X A&(JƄ}, "3r6aTyg-,}6u}skݴ4l}E =O/JEzn0s>wڌ<&üOsC5Zݬ}MX~_C=d<`z|v<gt'GEr:t=z0\Zw.Pߕ8r˷ sgU!$?v]3ꤋ?Q•61JUïkNo?ŊI SF7]8L+'C5ĿLq2^Z-^WPG9ſlý87 qtu?)j3_b2>V[kL]G<"Rb f-122ۚxX%C_ɹrɮֆdXIzrgɞ $[W`SXӠ"Mv=YJz$y~'Go5\dCc4CCzbig@_nFeܧd= }5^*^%,}e.a:ߺ`&$suGSsJ1ݐ 9-.&PiiEԪcab$A% Hde ]WQV|A)U$"A @@wb,ก m{۫DE2i>|:cPʪW9Rf UXsVj H+3s\ +w~.A _8}m9<: Wrez7:[X|/^qs(kk0z[ 6<8oQ+pz,y #%W£@p7m|_<_D5蝻Îm(ow5,[]MzJ0R/X"JZlߦ&{۪W?ҕ4TW%5w(w@?9>L oKxS4+0h$Jnp Ԫ hb1>DX@J>E%Bթ 3EFNkZ`tnνTMvG5,@D"cCq'+{GrTiډh # erl= ֿC V/($]sCե+ξ::x=qcD'nT*g^7Ņ>_:up OanӞ&;cޭn-Yw j/5ن0&j>T5d @%+ix/!BfP|F흳}YIܽ$G_߸يnZHB{Lcq7AÜ71- fțO7\_uj}klPz+?;khr\9#i^ջCz ˎQݹzf/91ػi9zvv4(9y9:P[|7Ee.hs0>%WK#,)OO߆vaY>8Z??{>tS;iak}P}%, f/AN:52d}`)uM[yXpnCRk\BŮX@A=7oUijƾEȕ3Ź73p;fRBr XuJ'v<2LXD# 3v.,+ `MI&nu՞z,d:DGG@wO[XsMJ.s1/o|'6*͡w%0{8${/$d+a4=5,5} fF#I9虵.[_ ҄9nDZt ~>0kf)`\ۈ&+ riad 27x/8r 6}M%׸9u_w='~r{Ϡ+ϣ\fkݢ]m^(zÄGZՙ4?)  K1Z_Ye#=A"J NKI9c, #NQa ԛGnI(/EhBLlEB%vt| F9XFdbv HR&(s#p<1˙>YZJ Eisqh> Gݯ`8LbGӍ^'eq0ԌLz;o)3~H)W$Z|e}sW Z 2 `!GOeD?^+T /4a,Ly8ZҌi,lJŌE_@R*~"5FZcj;DhﳝOa (%TuOr?1p}7sko~o1Ͽ~kn; +zPl9=c\nrvks],(ڗ.aZݥ b觠'@/qE)Dm;;M56p96M(Y%V=$ycPOȨ]XetJ-p39*OPE ;4~,knK@ΘG:k6c!> F]7r:P؎_yT̞jTB9 :3_0{Qa⧾`ٯʳͱIv93鱏__yJROxtl$b,n7qKkؔ2 $bnP4(k rIesd⽋4dZosC IV(ChGVѦܭ/q uf 9HzܜU&s gWƴL•]%\@`wch{ߟL?roY 鋑;\WLZm}S։zI T#Iw%[ y1 To?rGH42WM P[,Vk؎rwPKj9s)#al\VK4 ҙ1N޶IOC%hY)5z 65xit/rGHX2dpL )Ѕy)ˇ-b+Ju0Ɇ#%4}5C[瞗?tkcbtsˍ gc[s~Y0dO=5MAY^25v0 ACnchZNz8$Ѻ6%ZDju/ 1MN+}9~y_vAΏe o ƒ,z8)LB8uL!.v_O(Ս5u>(vg^Qg942ĠTQ`0=s6 \[>Zv.L)u}hH+Gopnage"/<","I}Ys١RZbX4d$JݜoMb/Q|W+Zʆn>Xe yh:faD2R= Bp^+=><#2kڥs3d:n'X̓ rw&b[tڵ2ѾZ iYrKO|G*1hyEv8[T}jhԣEl]'rFԹS=5Mc |6:ss% #U+9 {c&xˈ\oO$T{1IglõR+"3 l\)/:v+D/kl 3R{t*DLW 7F{F+A0ZDdM#5D7v^" ]ۗGHiz~ c: #3w !ߔ,NZʽ!Wl ZLF?=5oټ!cִpV1n{\TTN& 變Ujri-QaG#5$eD9*K]O#uh FR5G8&rS]ڰܼ1W麁FEv,$:Q\10숌/1GJrU޹+f.rSD`9ֻ[>ܜ cEIg @]j|+0Ibߦl(K(p+:^LlͮVKnriW9'$GH9}Y.)i[|*Q*g\W |ԈsWjd$nN튚cN2w#[qMI 7PIF/Z) l !u\$Cn`QNկ KwwZp ȿsR]R_QyaPܞ x!8>{Ō&ƹF֢+0u=%oI3R^=]h{]Uև䒪`R"T]4A3\!+vZfd[OjqA$T7>س& ߷>NdA$Z7c&YN?Nۗ{NܿDzJ%h.JϜGxd{I>KVIէC(-(Z@7G,ȯ|~EB14p00Kd(wnY6LuKEÚh';Ip @ˏ,dKt] 6!b{yzwC=gcC^n|ߖO+5@}^}nwEcȶ}Ù#j]jF@p ;&*17_岚/KoU{a؞Wn}0’4X FENwL3- 7Q$RaQ^v}€u%߫oUMlTK%TGya_b3`פi3$j]$gqSJؓa3zS欎ImUjՃЧ_ާZÂO%Z__߻G 31/=_1lt3 } Vo:~3>zt+ۃaw&ቅDQ0NT\rVAZӋaԟ]| (;Ō=.LзMS:_%QLs[ws[Oc>BpdeMV!=d T&w}3g GZHnQXVx{2r 63C%sP )4=ەʆ}py0:I)#5ůsؓ.#Sn(%ya|+zR tލ7 )J,C('gӕV癵vx_Wfk]gdU8=}' $euJ0ex=n{f#lP?eR^8M3S8V,z%{fS*Z9"?o<߷Oɪs%v*J#8_x7Q!́Z`"K䂀<0.Tw]Y ؎ L[$b~&Gv<VdT#Aݞ,U V7",R9/:c '%I౓F24G*. f?AEn|G^ yzW~=AwZӲ/vp\^"JMs7'&_}]/_\HhSϕKn/Sc?%U/ɕZѱ'(DQ"_ lשdCO7Gs|pu] a3{g@/e/TCz歹8goVGkXp?lЏjE/=wEvd\]Vp1̬D,0/qpm׿+N6T>5xw ~YGkQxOmzt tp c$?< Ntթ`??UrM\LE,45 HJqErRZ4DS֪7k!we3Vz~¨=9˯@}-2cMAXRZx,wלXrYE.wzg^46sИ4F{b^*pELf;o ?X҄qpדL劺k@ %:E?YIKdo')[.V#nꁒxͿ7 ٵ$le*P_#9I: H(՚I|c ]:˕f n|E7!y`x0O)hM, H\mخ}1޺*33D/?¸pxgJe]3gof$jS1z[27Qq 4vv]sWXw{*]jHA aҡj@ 8Doѝ頡AhWuwZّ A̓ү U*whjGmS v 0l-h<+ṓgV`NFz琉<(6V(< 㽉g:$ZG*;A6+2|oB;@+T9)_"& sbs> 3IYPSn| $ꡱnK&S3kbQKr;5Q#wcw_9h#=Q6&pmNF?1` |a2uh kfh$|6룱]Qt |StΌ_pkQO̘GO)r Iмc?8G&in"}!%igc ^t\DC}  !о* y?%O W+x/ l ga hc㱽/ЍֆrK x0&۩ѐ~7kiLw<=a qS-'o2EG*ǦL; : (Ml:oDT= Y)1(3g\iz+ S!7Dp0(ORvoY>w6ϗWG}(o']+ؤHS`wYӮ]!e0]gI %a dreN8xqm'ا] ~O=N8o`i*uMӎ'N+#LC: O9N8`j epK 'ĉ sоq.;|qDLXiGL~QhiƉƹd o=.>8qt1&‚B}p/",a<'N8-)-8v1ĉ S.pAvAUX sp |>3n[AXfTc,;&@ă%,>'N8q0.@[v ƧVy4Lw9|{\\;WEp(Ҵg̉'NogpĉcN8q'N8sĉ'Ɯ8q'N8q0ĉ'Ɯ8qĉ1'N8q0ĉ'Ny 0^=nNSIENDB`PKwL\h4updraftplus/images/other-plugins/updraft-central.pngnu[PNG  IHDRcUtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp ^IDATx $E.+,7AYD<`D,(:007F% E# ăcGAA@y#(C\cUnA9tgWekkz{zf >u `Y"11@@b b cc(K֞wXJdHۑ׎ {G(Cd'>gQ@ݏV^3d";Pq"5d%[@g{ !d$;@ַsJ@jQQ ͘1fKdoHIm".Md!E]Sڷ&"Y"A؋b>OxcoHy F FvKɾogHo^i` @^}:gD0s"#wDPMv+mzAE>˳+Yd`"FӠ9 c o/)_jrEFU M'8_u[/#Ij/="$GpU _ү\gq_<<4^q̇5}9M՛żH>,;g-2"|~(n坤d>JXYVɶc1[6b\făl8v{*P'e^ǚmBB]^aCO* do.3mUg>Y U-!7cL1ûxfMS'᚞hP"K|O{@ުq6 QĸjȂrHeRfd8Z=K8#H]ZlX^՘D5g(,/tG_b GCzҖt[~;<#x=m#4DS2aIFD 1qZGOU/Q(ږc֣@\sD>Qx]\=G T{H {`}< /ӄkcHNă6-+=PNI ݸ(78Lẃ6<S';i4v(E\#,bdF(;bG Žl]5mǗY.|/mҗD%"şo%]+˸k:kGP/,,y<{b<^IP_KJFqCXK( [D#}X\,n@.>NA9g{Qe|<d(ͼ&Zcwp<xF1D Y٬ob;{DvMvqQn;k :(<I2 ^LN91G=t496C19\bɿḗ@j%jȩ(ea_t(#=sщq7md?ud':/%Z;G .\9S^$lF.Ia_TVY+뤱XsE{fW\2s2qW~p_ᝎDZ5{zqO̸!~%iq7KK_ބG[ EҨClE2p2c/iquou>7K$[Yyd…NܜBDNsbj=}uDnxA.ؽ:q=^,jx^ω 74y5m/sW!n:ۖNKju>P#{:=]q)IQ1/ycٵ sǐ3dW*(/פ6bI(e⁓w5";R 71x Aŋݟ4mj% ;bBˠcy/mQmUa^LY0Řhө G>9>8m\0dv>[(}1FqcHEiZ xb&9F,ɣF>K/T=b\C k09^_%ܧ"' >^s~j 3<<\KwbZ8&0lb3x̿%d'+Edu{1٭2='_Esr@۰>+:(X䏋`E;k=_"mG͡vyi>.b7ЊȮҎ GIDATx] յ=M28FAQ 5~;5q&!$b0gDe;wڵ^Q]UV^guMwwLTEmm( hMP(J BP2V( %cBP(+ BP( BXP(J BQ~hօ6gH'#ad#; ߽Xg;#+,1wL7HvBH{]Q>d42Fify^sJ;#߯62KF^4!Bi)akF12kC>r׍k䨔؏6FN4wjCt((N*`q#tH(F[]0202UBP42FnǗ[.@ȣP(d2I1e.0W#Q(["?A'B56H ]lF}8Bpl6P(;6{q6ma=#YjdSIޅw/jع$}yZ|2 Fƚv6^]s5y_kdyHS#] ' $ yB6m8q˨U*N NmĩoqSBBs!P(#_'eP#Yp#FaP(1ρz8/elsۍCGP2nNҊ4'NNjpy)/딞m}GyB^W)e3oEi*7-PSU6@`<E~y{Snʳ@},s8~*u?ǥHri2S22?w ~BYrbdO9k4FVH~v- /qW㥁ɳ \eNg^%q$h[Ooiyd|\5:'=RC?AA$xσL.LdRGJYH6&w1'hq78 !ayԌh;X[$ӨoIY n8n.%,N `(NEt1F8Ԗ}nՌ]4ym!gx{qj$]c4;I'X.d)NMaMOBgwY.!(g5l9(NFFUϥ&8t29XaF.K0 y8[}89p}[+ ikƇKۉЛɔ >Og+4z.<~piC4],H>A) &.$ WZ.|.nxD6Wan}pǍ{**S.#NΖ#꩖9C?q i 7/IMjpF3 ً MŃ~Q`UiZ_ߠ1c:›1\<8r/qه$X>|>(E*f̴s5fVJZd-'i=і?a2}řh8~G|Vu&Բ-(A>b_i!{G&GFhHQ@CK#4raP(=G> X]@M(@tS ӹM $x!"ϽyCY~`F-Fn |$/zY} hWX, Eٓq?K4\$)<|o@h׽g[ @"CXR%ڝoKa <bzAX?г)%Oӕ$M]Q,|UԠ[lG)/# ]^&r'"4<IyDϵ=:``m rўXAA3=o}D đC35?f88JE G+_Y4O'~+ľ@^3Hti] ཚqaD#@2߂|7$|+*"rl{53x_|y|% \)T5-Z,ri{:|}n_҄VM?ۣ?~|V2ϧIp*ݨٶܟdNz%B}uWԄ8)g?ܥ &ڔ[g$Qoza%'z I6B&T㐱s7k<`2ƵN|FyV$WkVGQ.xr$T/Ipz;Ϸ \!c;%3iΥ؁1;ݲ|Wut{uz>TOt]K1Zߧ+46Udm{Wڴgt`p!5A k x| ׋MJ\op]%dA5 !骐vB"D;5Q!\o6{5ٞwٙbdz$g=`= Xq{!C߹Ǟ{B~?W7Kݕz ϹTϽM VѬ v-Լ@UK_L$5:ϸ=!.y .tGR)K:[ّq&|Anb@w\ q>809}y -Ѥ=(`ni}j}~I!)>LBLwi/fqbCptR{{j| y$7CIFqߣt,峿@˩,i~.8(0r~'!_KWN$BQXAEh rs> W kzR׿U'?-"/ŮЊlJmޓ{޳5 իrH+Pn}}'cP1pUzQ(f:2x\{4O/f&pFa?e?¯(%!NM/m=VR+Kilk*KDz*Q6h[CZr3~F{.@nL`yͤ[dбl@H~ WU2LZGGx}}.NP7 f!'=K8Ш-ၧRYWC o$oxYɻXq d Nr8; ޒ%"0_H_gq>"m8AN(6DЏ}|7hW<=?-#dU w -5#v,ad][@;o7A埔`a[{ς9!",zx$ .h:÷>0^OP+ZRO~R$\J]_JO\MoY{ż"c5[]:JyKC^E뫄 RZ%~1jm-MYX?n:%P7yJ*<&6p%MjbN Ljw3Wl2 l0&PiۛgJ9^p )yA_A ߭. wxe7VumneƸx?b"/v&^L/Hu"{%WmF(Jsi6fҿ4IClu4Bd=1z~ 5jm6WY]Ga>RE*H %_n?ZU/_d$d2OW%Ab1݄y4~[Jh?l89 VZ%Hrh#I雎iq N#5KI Owf+)w 4ȠaH`3`' dE`$!?w$Q 6'>L$v[&2`. 5 NB6`.YNBe45H*[@^/9(se\rA1NJNkLVn BC"{>H}bAApmwvE rׇ݅h$xC'Rwm )DkXDž' !ij\WKK C·Jxɧfc-'2-i 8Օw,'5?-wT=b\4 [$,+mhsIi"(׷9`1,4@at qQԔ8)߁R>g.c"f19MԌfB&CTN@=8Ւ^`ry4;M -w&RKoA MiR7nAgkICH}z?tԭFE_m`rNH_I]->|cVH,,R̫t =Vp'ɲ!N(/a߀tc{`$Y(@J"d;B}"1Z|_^A+D023|3m8MI`flٰH -M /_P#'F,.(|4"zQaL <ʴv-$ P PYZ\rXIwrYEWvT 32 xV)WZQh*HM_؆/j__Sj鮁߾kHSՖsf5z-~/h.9P%wzHyZ ׄ1o1O&c@$s?NUV@I3+7OqC- a`b$q?]-cOD cV1#Gm +Ot2GS+FZhgi؝TK麫i/"Og}xCC{R쿬noYA &Je+-'B+y$}Kn!o.+P~v.p79 %0Ar(ll 1Jp {\y/g=t\I_A 3N-..>ռbi؆"Xнcr T} 7߉tb8ZK8+ ]9b̢6(jXۚ}QNǠ Fc3Ac4o_]z-5fE+Jr52vZAZ5bР\S.@4xjѤvG|VecϻJ>J2+m#'fKZ8A9YE ~ow3֥1 c<$ro<~oNe,ȴ:!oqam4; SM=n_\X UbdX=D# RQ(qt?{v`+$ ͵Flp@U =x8 mE}%cHAt6B#n :TԚyHYd `JZkXD"DA oJ7Leo \(>}6"+6/iu*+@w>*x$b/uh(B.PQv%Q U&P( CFC@]KĩRxkt8(Rq=#wP_IT"DIҋ?P(J?Pv3r fNa[:n: S /nW(+ "9i( BP( BXP(J BdP( %cBP2V( BP(+ "`VWIENDB`PKwL\»++)updraftplus/images/other-plugins/aios.pngnu[PNG  IHDRBN]hPLTE????????????????????????????????????KF??????????ss??$Γss????;I??ssDBss=CeV??s??cUΓssA@ss"Гs-j??7PWN??tPI??YO=C??>AIE??k[GEMH4Y'xr_`S1^#5V6T??xb*pEC6TnXfW??spljwa ~fԯ ltRNS@ 0`PptՀ@@[𠋀` `L00аPpPpi~ٵbTm)IDATxkA%{C~%F6񳖊&)gǨm-%Yy~=?;#̑O~n9gMӹDǨ6=\o9z4q:xF$7"QULk/d' FlnSan^<[xQRh~~*)< Wb(-Y=V>ȿ,|Z")r8QD"vЁd$@1 92QSK˖:N,y7؉T3 Rer;Gf4,6W(u1<)AhJDG"Dg8J Ms}AdOa~0DW"h*TE̟ Jă ]ZDX,̡FP 뛔DHyD"HYCj֫DߐJD1(be 8Qx 3F+jjђ]M+YAǘE6"Ώ#♕k[v ( yO'A"{w~mdR؝fL U^K'A:=3Cd&;?H7A"Dv5n ~IH8!mHU"]A!$࿟fOwYf5îf,h~ 5$Suk >*\Su`NY} 0/B|VA`na< [ݜCMr3畀m9.1U'Dz nN 4$1ɷ/Bpc؍(-qj__R_D4'g~ k\Y^akA:IJ1g~pTTs]9`?E ]9H.c qSu >yS`w$:-wșt`IمAVb0?J% p p^ p Tkku`ZEezkkvwRu̙Ca)qTd5lPY:2xMC ^- )YRuD P,ElnC]#?ULo=9#(]Bm)M햪"t4m-1Uǜ~ U-!o5͡; Fv_h=Aj G &AtQl9#y3DP*ʞ+n2Ruէbl{',^ӎ"2TsxG4J46*Kֲ8uefhy6l em\ӯX6pL:;T oHAPɾy, i#BJWIKAr=zdHD ėCYH!e5Dxm@T3xvwy> D[hǂRhŠ:z{C"WzA@iIiv,QQlܨڱAv|/˲XbQcb ڈP|dd"҄N ~J"ݒl "3%;*uĂ8˨bB1A(@IJvf<6+d;;E]3k^b-eI;{ʇߠ[Z +rcp(AGͬPENj*Bx4ܡйug y~J̏;W6 fð@IK$m ż{W-̫P; ' 3\%(J%t[~c|Ԗs*Tj j˰P#x99|! f#m0OM5b;T C] VN8@+I@ f'?pIF3*dX7bgAd43Lsoo`l'a| A+'%2I||'/?*OSz5 W!Ä,xBϼ1,Ȼ9+ ] [!wLu@"3<9L)+МUjeŭD!1s";I^PDć+m˯Pp>R|a.H▴?)-<%BwCHih0BӤD?+XaE{2xа+$#N/nO~w( J"\!Bt|Ph3?=+iT0_-Gʎz~H06EB G(krvA!S(Umavȱ:" YfP4C;BM& 6%#%W!9 Τ}o @%zλ99ۿeUF9Ql=k$G2˪I+OZ\82<, 9w L Dq*d<Do;Cˁ%/d < u"a .S֡PRF*C~m&r09B02Is*d\X0ֹ}`R(_iqPMpy:D`.͞"cP5:[߬W(GB8&:Fz6Op)T29pH[FBf&[ qÞui3(ĔUfϬB/GB59evB?R?lpK!#0(ı*clcW'2IB  EtWG5T}y|wPUE!~m_w&'P!r.n]qnֹ*DΤ-f~a:x$xIBBe:K{kpڿ \ђ"CRi7c QK?rgqC*:Mζ=BZ0T:֘}BV W0TOgrBU"{(jdۥ:O2*t7Q6jVRf&Z)SF.!8iD>*ܡ]r9b0]?~Yt={粪5 I4!B)( "7I?391[{ϥ_g2L 5EZ!XG8"($PO_Jzx#AFJ~*{<Z<ԘVR E.܃c13Xl,DMHo61.Bv{e&R cAAǾ7 41k^E*>^ I(t,\frU(uafʅIzfyN议%u._AX8f^F7 }juj\!2B'N |Bwοbx6+BsbQ胤BF)t'M0+4$JZwZy'{G)B`ewug:sv j[g:ҧ:s38fxFsVrS:wÓ =0+02e::U6{Ð+kߊ+at Y3+e-YzVhAIff &Ta~A__N+t\B6|r+jCwY:jlY!;)$RSغtcVC 񥄚Pyq4:.ɍM+|;f٭&ŸP֖rIь;BO6 >4jY w0ϕPyzQzR]Y!sY1`kQrK lE6nͯx.Ah8'fhef"BiR/ϒWhW(BDQ.?VTv@xKBhI "6{nwubfWh@yeұ.ev1N-P4;*i,w-/]!c ZBDy?:(ΐ4:+G;hF}i6WתBA6?ip˩P>k#xK=cKeȏbd`لzŭWDI>tКsK;:ȳ'(jVZB-fJpbIz4nn_(Gi.[J!"9qsƄ`@.pA{S>9-SX1˵!l6a95 OEMx0VZ'r;hq;n¯lq?p W 5PZ[;QvRLb4WIa1s|wI:,((qIHщe^.P+\+taTwo"lfp@F2 ],h(U;˿0\^gCBx|7-UP!eq#Poum-5晉¯GPDߺ@2PwaȡByQ-c#(D菡\(0?J(] =!` ),sPoaȡBwy apOS(O61soPoaHWPks*_3KH xvB! ]g?X*)ByhluF|>= t.9N;~3P/g=!;/MP^$Z %}VG N 9ƺ޲e q'?vv   )DǙ:D,*DgY03h@ #FUP ha-W I[*?dQB# *D3O; 0 Za Vbm@s m5e#z ߒ6O2^&ꢢ0P) ~8:aza g7 _)ߐ]{ńSpw#w =7 '˯bʣBk(_n$76 ݃g,bBvU."BG:9 :A. [SL@QB0VlBG:ޙ57N5h2b}eqqa  (-:f9>d%K(W{X둭җQThPLBURuqj6pB&dPՆV62Lca m.p = S*98ABE0ˋ3;} If'dP5r%ȠBorAp[`R eUh1N>a» mC%)8 S|VqFX$3} yGXb[Q3g`!RQ,٨b8씎 N!Z!W?YQUK6Z-B6d0[aax #®F .vZ`3uh a A#슯eMJް \C_c*^j sH؎jl&qD) 9XBAscCwWm4^"Ll3O mK`J9Զm !!\ yDDF(.BLPG&qH5WX̓T!t,k+1( #MPK_h D'0…uBZO*T+6"D"J[Q2reHh'GGVf???r%a?<]tǿD%oi AG !:^3qD** 2(;aY<T`95^k}LhB6her'P_ܪ؃q1t*t[b dusw&'paddK⤾ EXTOs{ >6P(.]W"b jUsm L{əP/-]{ui@ԇy>ݙo?t,)kPڮ#A2+=qWj6ɣn" s9J!tk$@QR{3_&(spͨ0•LvDwRn1h> 8yc]c{%`f0߯joL֍pDm/FܮZS7O!)W^  Jn ?Kz4 OK+ACoaz<0rkkm@obƥP]6%VlB\I1#Q0#iތk|% u*s#I3g# @bT[f4"N?P.p*]:QD0[&}3=A Jy t2S*nPTm/Q!ji(_ B-8u&4aƧ.=rx6/3m@:AP\PʪItgV+$Y *8=p' E|BFDQ07qm\6wA4,ye- Q/%WT+ғX\D!>Vc O9s ׇu&Aytq0:f@m|RR4#W5UUdBHngȁ"8icl֦s{yr Mf+1:52Q`fUх 0 pHn "n5`WxMu(DSM̘hCB` ))*_RUP#N"M— U)]v(BT(ă9#dpz:ͷ xl}k]ؘ{ Γi"NoW^ 8yu@^ Xv2X|^G-<zvܲWߡ3E39'_՗M]]%^ywuUJ Z@eA V(D˦cNc {½0@z:09䉙bS%^@E-Jp1ӫQ G<krѦ.{+ A46 'T(_0ـv@ʭa?c^c7s0v- ß$ocX!753b2ռ5g#+yO.؜]\tq:D(~B[SBqǛ?8lve =EiB^ QVmeC ݝO)Yi5TZEZ%Rnp}JoS')al QVDt9\@!`!kI,{fTBR.8 QsV5uBJ-o׷ٹl\L@P%#Bu՜r w08,,Egp!*K։V''1\WA=­F&6^۲m0_><$tV(Za;0K\hvtV2`>^ ~-(lI0:^4|N^hANJ+ZfM>a%|;xj+ g̅P>˼9r8By흯}ѝ9< w&҅!]+ÕxA0\e⚊LJsl f2-3Ǡ@Y^-Zo~3$d渲yv w]O4IP'vO-RdÙIP&BX"ܹœr;XjMJ$d8F2z`Pٿt"Դi$~>~{#Zm!W"Q}R`%tZ fG 3qEvZRHdӷjbQRD=!=B)D:=!%-2AV^j_ P֪U _ LK/q\yVR; ^"jPjuZk,ZCvzU+r)([ATKeZJ9HY mB x&jE !BuVRqdKG0/B)ILR9'q ֪ VT̥ |ztoA//J8R&q,R(D+Q2e+t2sCTKPe'Dm6;x zL4vs9 ""Gܟ_Mꚍlj1~yuz.@4T@.66F2xn.6o!z5W"G߿ \"_c'&h}^ n@i)`'n =}.[p:e4H.?^y O05LL IENDB`PKwL\y&&)updraftplus/images/other-plugins/keyy.pngnu[PNG  IHDRcUtEXtSoftwareAdobe ImageReadyqe<$iTXtXML:com.adobe.xmp Z"IDATx} ՝==73 17" #I1.MlbLYnYc6&zAPQT@@a>ޫW 3QSU}iu000. "c@ 1@  Ș@ D@dL "c@8.4dSqdZi>d!E?_'r8uc2޲!FBa0o@ 2& $F|VtۋTa[8)w cWkc$!xJ+:zDB~.5F){gTc2^xy:2,O3,,9wsJ]sGWP. 2dezo?b[סn<7'ի<5Α0cVb`81_y`( "c"㳗N=;o\lg3Wiv\wSU97\yr72Ș,#c-@bzHckS(U˓))`$*X9-^oi5"c"OZo84-$J2Vהw]yknC~."c"K8˯!}"6ՕmD쪂smE@rC̹G"c"AFC;p"uxlBj)a}M#۷Ŝ-De7OJeȘxPqV4ed:\A FlO[x䓨KD"g䯾a#bDFVM `2orf f[)ĮY&ɠcA ?H6G儍*USX˘@sd- PzT˫bjr{VZ2EJhP8("wDOdDH'xy!+kW̪i5O VmҹT#QrΥ)كEK?t Ň$gCV4v^I\m N2crv,inD no zfT9]Z-OlT:^}Jo׏e1"}îրXL6>e*jhٴi!LPUi{I˛E%Fmh?hD;gF*17=cN){"|]|]]\β|="y4&΃V̦cE.[NriJγ~87X3*E'mEdžGPz*0I"cBi?CCSLc%9줬ދο+> QDJ\f]rP2>k5eL̝ͥ?exi .fd)h&!Pl  !jyF3ay]3rg EV뾆|8ڬiV"6MnL "%C'STC uZ*XtWS RBYCQ=w%;';7U3f3hyen6B4˹tl\t{z@dLx,6qDLFs2I 5 .ߐQۜ/1Z:8]qD݋1h}~d[LE09*6uժ 2k:u,=.ls./zO?Ul[#1ȘPOʡH܎GDQqgb}9#Q&2[- l.A Zq!<"]JskȅX3f4a(a* N9Kw_:$Wnr>Նo `ҷ; CǠ}L/ [J>L1x8مT;Jjx-_.A6G˹)D,^ Vԛb,&kfF!c@8(!{\e<&OIjW+1΅lɣ{phy7Ȝji`^QS s94x%4Jnɧ~S*Yݯ$:*#-!8fO (^#u]QEHQڐj Fٴ'Ah3'ضX~S!X}4Qí]RJi{̅!ϏB%s!z FM\%@Cڽ>cRvBŊı-u3.%-_FNgLP#Ծq]6&>D^ү~Dg?@ EMȴ4S_,9"yMBxŽr|f5ߴbrԯv(<Z$kи_ 0cz{x"e#2{1|Uupcg[1@xyz+9q5?\YOYb۞zC;e7Xy3.r>j\ׯLItK,!B0A|m[b.agdSg"Yĺs1J:N8@VSS!*j&(jmyKIPs=Vx)85>˃g"&V@4NI!B˛gdeRDM߃؞mKb@*"J,-kWQ o(=9Sg =iʲ]xҹU{ &[B{Ds.7.c$;Z:w :sFRTKd<:~Жn2oV0g;)߻aÉo;̴؆< 95rj0fVW?vTx8 AS@'d&(ZV(DQo'+].}#nx6]+r [Ⱥ뭗2'媸T xASՒjOUSTžؖ;u!6d3eaW|'̖OCS;7(ʬ!X`\aO| ۧ _ [p٢UĹ,O?vݯ:*Sؤ"}CJTmdk#"24f'XPa.憾n>tvE]'Q6S[5[~2} jb!_CEiX̊mY$E%kSDԂ} %c'Oq"Y]DԄ{7!en-,rF+ 5fz >qrd h*V?Gz|8ضud+l&UDƃOwy}~'jj&9 BE=tU)pk*t' heT->\$qEEOۚ8zJ|mڛSkyWͻϮA׹ZM q )@3W^L3\xH׃UC 3!jd:Eb2ۧ:tiǃԑ}8NUryHߪ+"Tñtaڑ#CtmOݫ5f:<>(\a"Șt{h8+{\T=sQ_Q%'XLijyتG 4f:b;6ʙR#2ž{cWz,NVHi&gK22ysY Oڧж!֋]o+B*c+DJ|mEEڄS|^2zDoG#w' SѥRt8äbEOR- 0d/ɟ HrT,=dZIu6MwbMY03˝<6*6vՋColFj.zN. O,JBm̙@Ϡq&['q㯿uzS!j+^"\5Fd'Kd3> {oc[؇.1dbx饤dy?ܱdbFIV_ <8n7M|}ǎ4#@$to(R>;_+KzL9@UʚiMYPB+FX s]9ȘkȴfqދVņFE&ĞW%NtoFjo&NT;wжT]7=.rɈpK\{) ulm@1f%L}PǮj5N;h\w6޲]Yun+=*uz?䒙Kx{w(g"bҖ*2FϨ)&[Z%ɽSs[NNt &60l""hc/Oh2D\v(oFOA6(uc $dJNUY)gS=.W D%ҥ"MUMϚ%yb7 Hhi $ur#.ԣhzNrPo( r@Kf/՟loXUs`)~%֌BɜK{5\ [i}wf9C!W8g*6kX)dYD, gi“}ѓ傘݋̌G8 *לn.}0+fh)9DF\g+Ur27EzMa!ҍM;Q2>?+n{׈AG,v$ 7?#z2zP?XT$0u [D/z0K(6|(x! ȲiUsLkff9O1#(A l^'+Лn vUYs-BFk_o^@D҅&L͏ y"(%ݪ/DF&̓s_k-t'uG&%>w?I\(zPς8BI؋sabxNpx~%?9ܨʏ/:|\6) |C+e $Q: j%'/8G~l! 0n;>} ?e.`R|0H,'Wx;#3q5cנ:JnDm|٧AU_ώj$3ijU,XרtjG+ X>f) ?pD?bف4W$x?IlXm=W">K&"Y;,Hsz$vlD!ك!p^`DGOM mоH}[,pr=Dg“H՜ǁJn9rnUfpriY?r3p$4A1;3I+žJQ02uMY ^>͢Rӿ9ԋK>ҋVG-ϣ_?Ա}- ^ϾMu9*h/P:]j"z4? J_߯hJu-Gɹ+͎mZ/މL,& 袏)SS+=j˻\RR.rNG jVݺgS11A/(e zBwNHtC[4~yMR'qH-' 8Cڗ ?!U6֫jKI=9v3uzD`}P <@A0W܄+#kJ4ʬa[ŸjTd M>(Q^q3e7`;&r 3}^61kB!DB 6 ?n,Bz5?!0j*Z d2z?JÆ]7dNUPF Bhܬ~qR}%2@h+EwF`<ڱ`2> GhJE= n*c-f\DO``hMuL4x0䑾`H]e kD1PH=AcȄ>B FP3v=|:ڑz ']at4#يLW4_bW}ÿ+5oJ4@>3)2"s鑠e7 H}Lul(bkB\.EKjXEgJlq؃$N.gksX4k]:G|Iku7ܯ7zj׌Fd4Ӄa|IQ$wtwJ3HA)s$"3"

C1ﲂxƃHs(삏e0!C^T]\塹DRjuiKjGy2A%AKrF/l a9sPߥ(5i}72;L=(C 2)IUj>U@j 3f+ktγA` ŷ ;梏b߰EPbY(b^L4bg7JDufJи9@f ') PZY/fǜfI:6?e.S:2.'Rbm&%H\eHwz ]}Ķ='*=$FHǩa|.Ypya%V܌=[AҦͅMSSnJ Z/C*Sm>2mT ~X>Š5KQy-KGvm}!r͘1td;SKum?U}U9yͼ\0!h{iV0YY#;X|/UJvW6Br^~ (92}pX0m'njuƅfHC΍Ȝ|W^^/V\H\.BP|8˯#֨欹"OC-(xuXYrP2Q}cM2ėЃ u{dqU#..qҧ#q`NwVFhP?Ӭ ڛ%=ٷJ(=5R9$\RBj,V&aEF( Tq zUiB$y0'F<ʿ@m2AJ d s1oѳbdBUJJU6s!|˚ņYs8Id52?LtTU"C2\颏*GԯX^p5]RƄ>)sdy_CXTnB`v3sXj8Z]dVa!CJ-aB82\&2muX,[ '/k;8ȳ!?b".\%g_riI{vn4=Ct.XTOE:r@ԮQ&ݍX m>cȪ?7R6-&wӐNc;>e'21ݛd6Z=*W{R?O5sPz>D웄k ?dl2n>|OHa{zFXT%\+IX䫨R"c"㳔-BϠkZtjȓj.rn#Ixy(9);@dLd|d1m#H1ޓGj!b4-{ku`;o=HsimfӕȖF6)LdX 'Ȅ, 0ȘȘȸpE6 -.+Y2ݍeLU&GϤRx} m`Hx*YT0ȘȘȘ@ 2>kAx@dL "c@ 2&1@ Ș@  @dL g m" IENDB`PKwL\ z[+updraftplus/images/updraft_central_logo.pngnu[PNG  IHDR?w pHYs  ~pIDATx{lTW~ǿ6cmb%If ws'kvvđ* B!JGtP:B#B!JGtP:B#B!JGtP:B#B!JGtP:B#B!*H~<RN.f%/Y$֤.cq\BLH@mc߮[ئ8.>Dj,pRt:Vh*@tJQtG*PhrGB6SPhT^5JYxR(Nw'KeI8 [B>v9 +R7A^VGHX7^JLں-f n& 媐9ʫ &Y!Set1 xFc;J(WI<̊YMF;J. B*Fi`/?~8lI8n<8ϧ-"PЭec#!h҉'B¨trL,K2ұ)]»JG޺vJG³)]6.WJ(5tq6k@x5tĕ.`td)!B!J[m%;z&u]Ix>.^RJxD~JYz"]gE<Յ1D5?O@N;|·r +KtzWRMzCSF%i)]t>X'>Mu0,fbnp;מuЪ| (]IٍR*:CX(]"FQgio*M|_wL{)~g1nctF46*R.H `v$s$8Kug1cAP:T%#. 8O%q&(Kxϱ&c2]$&l\IQy, 9n!ؽ  7p⛑. -jv'&?_NQ1ҥBԳ=oդtlD$Z(K__A(k!Y5tG wxSL~vެJhmLS:FqJaܖnudDt$KKpP7vf$tprJG#P:B(!B!JG#P:B(!B!JG#P:B(!B!JG#P:B(!$zL^m]~/&q}ɋ13:_8[Tie'tSU8tHfӝ ;kU> oE~}ft$kc[wg5be:pXq}:ti'eZ7 u \lޱcljj@3K;l5~;/Ch@bDD%+DTΙ92S$bzߪ &X2uW.lX;fEhOD 7ʂh T*h?NlOx{0YܳcoaáTs&ybpi̸=8l Ad(S]U˫P-cT@>+9hE{HIHra/ޓkܴړe͌_NV2;9 `} |ZQɁkEkFlZyoxӎZ7 -Xz,Sn|=umzh ܼ1YYP po${m^95ZWj冑;(ں N'dߗI aC(6^ 7 {hǤjX#mC84N#9vII\ a[M!)5xG,7hv!}ZzV| W['U g hYO345YV6[v>}wUH}ۗi*Co6_jft$kft$krl"xN=%Y]nBDaDR3ap &֡=ZѰD$М|Q4]Zai[Rsa+MY|";I!? x G]:RW#pRygƯqW(2+Ddۂaaáׇ~ &Xj-68)cy0}PZn6Ɔ\[`+Rĩ6*jK푣zߠ)Nwakn0I4˼u68go/9^IN&N$-*t1\% n[Ky*GVjtj6 !i*3CAKQ23YVCw,*|J ޒ$s==[$YǗss"bͦ]fMN!ʢIhfmwW$9dt1F2ѥ-QO۽He->u,8װT!gJw5(_7z`D}]Fs ܘ{X}!YTGPZ)Qr6[(bFHV_ymbE!{6%,9*FNx1dG$]v~ayM`ZyBn`1,6wl27wj[vРrи;R횊&M}v@ ktnصD$]U^ nfs֌grnDL/*\iyBH݇O('Uĭ=bׅZкah./#;ws3y7 ΍-Iqm'@g+oM$}:`鏜qm6JSH;֪EӲ;:C1\ym~Cs [r=E`RtJWU9wmD4O:)?3:5~p3~I5aM+] ('>}[-/;pV[E%.f/8:~p8_×O=eNO'?lzh d)^T0Pz=zVn޸f9c*VÿNL{7 yE]Lj\KqRî8ljVO'(VIh2͸ I5ګԹGX)<]QeO|6ԙё,q~#o"Y>rxgFyo[(pHE%..N#|yV#HVܢ5y+Mή]Kaz3"bqf|Wd[Nq.*{T.2Dr,Oj2s*CyXln$i펗][кaH -Z3d>tоku;z/+_TR4%G.P/oWN,ESy|RhUWvOgoLIW{ǮGv~ZwΧOun|{y|ş)NE4A9Ɖ;#]"s`u'15Oxb(Yt,it+_l"joф*|F !JGtP:B#$9)B!JGtP:B#B!JGtP:B#B!JGtP:B#BXP:B(!B!UtIENDB`PKwL\`n'updraftplus/images/updraftvault-150.pngnu[PNG  IHDRtPS;Y :iCCPPhotoshop ICC profileHwTTϽwz0)C 7Da`(34!EDA"""` `QQy3Vt彗g}k=g}ֺtX 4Jc `23B=ÀH>nL"7w+7tI؂dPĩق }F1(1E";cX| v[="ޚ%qQ-["LqEVaf"+IĦ"&BD)+Rn|nbң2ޜT@`d0l[zZ ?KF\[fFf_nM{H? }_z=YQmv|c34 )[W%I Ȱ316rX7(ݝ ⺱SӅ|zfšyq_0sxpєqyv\7GSa؟8"Q>j1>s@7|8ՉŹ,߳e%9-$H*P*@#`l=p0VHiA>@ vjP @h'@8 .:n``a!2D UH 2!y@PAB&*: :]B=h~L2 p"΃ p\ u6<?g! DCJiA^&2L#PEGQި(j5jU:jGnFQ3Oh2Z mC#щlt݈nC_BF`0FcDa1k0Vy f 3bXl `{ǰCq[3yq<\ww7Zx;| ŗ]8~ M!8Ʉ*B !HT'\b8 q$C'bHBvay=+2Mv&G&Ec[ [bDDĐ I* Zc0&8(&iYH~Ho(%46h0װu wKDŽ7EGGDDōFG7FϮX{xULQ̝:+sV^]*uՙXXf8t\DѸ@f=s6'~_ ˍ̮`Oq8圉D]SINII\7n5ewrm\J`ᔅԈ4\Z\) /ד>aQ1n3|?~c&2S@L uYY5YoóOHrrsNy};_-cZuuk/\?kÑ)*0-(/x)bSWr±^$E[nEmnfmOk%%%JY׾1ꛅ ˬir]+wZiYYGgʿs{?T'U߮qiݧo۾C*זԾ?=xΫ^P֡ 2mjTl,ixwxHȑ&JG˚faԱc7sŨZr}wN>8(mP{nLGRHgT)S]]m?x3g]8wn| ƺc\x'ߥ+=/_u=wvWO]c\n}Ϫ'l:o\:xviMoܺ~{;˾;y/Ylx~XHQc?:b=rf}Icda)iDӤ)ϩV<|~W_}oοDΌ\«ï-_w>~f~#zGPQc'O%wu pHYs.#.#x?vPLTEi&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&j)i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&utRNS  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abcdefgijklnopqrstuvwxyz{|}~?bKGDj6 GIDATxk`ged  ""hMJZEh+>PX-TEQh1@6ɒf33dEf>|Hv=ߜ{>g$zu;vlߴ/2ZJD+n- (e{ܑr`[lXVvkRdq-[n.ֳ19~E 56.&XǖV6aq`g^%6t&M;7`9PKs.5$Yb!0H"N+.%:Mm2|ft *D0O,eXw13Huݫz8"ɹָDy9#-eX_ՙ]$,]b/Vu3)Qr$9*IfXΡx*m}K۷}y䫖 <׵ג~hoA+&L8wvXoY̱h>Uʷ&`eӽ&`-0[Wc0@X*j6n3*3+l,ayO?za#zYjXE驦O60u{]ke6Ȣ\)lͺQ: DZϑTO&驝caQBϺ&&M?s[D&=HCCOl*I-T'czûWf§?b6;W|,l`Cрu!XxP}RgK/7l V=8 Z=I+%zanojzFK̇nȗF-{TDj Gشlo>S^OcT[Cʿ΢9ϼc ,>pX~*x)D0ZTr/@B%wWV$ G Kr:vXYl$P<5[{S_]Ş*򛆱VA^h#Czԙgf2,8I>$y+Ķ4c`˪oc +McM" w!}*VgRdE%1UNRy[j_6KP5>e$"!FZ !CS"P+`$緷V$ G-`&ڻ9?#G_]D6\8\. :gWӁeטUdR]ʐC;@I-:1`E- hih#2 &[$$g)Vىuq[Ow 6\IENDB`PKwL\͍KK2updraftplus/images/upraftplus-clone-screenshot.jpgnu[JFIFC  #!!!$'$ & ! C  RX  xeZ ((@ H((%IDID J$H( @VJ$$I@DQ%J$%( (Q%JPJ TP$  (HADH(IDHP%Q J$%Y(PQ%Q%H(P%P JID DP A@P$I@(J$JQ A@H(P$H(@ PI@ $.GrnydIAD ( (%Z$ADID @(@(vW!fa%鸏@Q (IDH((A@VA@$%JmOnGy׸ْ Q $AD (Q%(%QD %ID  2s[KW9kce@J%DAA@TH(@Q%  NfF7 ?6NmO.bݿym;r>E^h%A@IDH( $ (%Q@@(Q Q yN9s-s>̓hd:o,sN׌j7vx~OB~@@J$ $I@Q JP J$J?OO/dߟ-s>̓hd ovs=0C('5P$HJ Q%((Q wGMO-s>ςhu:]4R_.sN&sM0o;[>h(@(J$ADIA@VADI@Q%J(-wˇgreo|wf;e>N_al1ssԸOC{^2q~ߧf=q}k_GeL;Umy^vq9X}no[p (A@VADI@Q%Gt>Eb'I%YkktR{$P;@::'ѹߕ꾃r?QɗyٲnA9vζĞ "=FDqn(ipDbb:53>ob]UabݾIb{3{ +Sxuټo $@@HP$I@J$%@(( $I@dJ$( $@H(Q%@ID%I@@P$O/^X<`Cy`=0C;@ !126"35T#$`047AP'CQRVa =WfWWfyW:cUOi-<eR~Oi޻>_+N|䛧x- 2e<\Sfy LOU "eHX 1cv^5iz`Czoo?uj ,\J9Դ^G(|77ʝ~Bv<»>]\ӏp_RĜnKΧǝi.!`Me1 ު+c||ں1dIߗ[0u ~5R=&N{$U%ߌ꒶77ʝ`DmV&<6l I8Ldu ,> UZW\M 73!>0`@$~\fTvTfJ | A$';F9m|6fTvTfJ ٠|/3w6Ys~yg1~yg1~r$W|{_I}0x5,f6}s94.,g;(rgAdt=^xO6Adx0b"?%\{r=3 D&mj^ډݦʉ[Qg^K#w6lSr9٦ rIƿK+7ˤPL) o&ufwEw]/s_Yk~Mv/ʦU(0{"zoϗ Ք؉(aUbq9.[4am,ĚLcÜў+@ ݵS̟I.NdzPB^+4LJ0{Y-2w\Zݓ-NSN{2}'b.Em%T6 Yܕl͐UmUGSWvj8XqȌt+ gA),>ȌuydF:#^?UfkwΧL/]A\U&*ۙs1w!M12_Sm{^![t&*۩…s;Ty^{hTqrht fGƨrSEyviE$NOV8VUMt \KZvߊrYlI{2ҋnfjm'!1qZ*DlX iR+BWtxߌBcIɍ gH{EkcQ?)O)*40Y3{1>ֵB^sp>yC".w{J=p  ,-MD*SI?Lϕ:nC,0ƒw?,_1^ȱ1蚮8 OF2hes f;~ßϝe7}s ȧ%#N|Ng7'6erf`7Q!hO SX5%oqb[CwN!#N1`#yo=}ʄE>Z^e=A,N*`ys} &2љAߙqپQe%Uswdz|M_UM|pIg̶!c!=.obǪ)R PǮNZzGٳrhǽuvmQ[2Kavg2qE^՞(D ~4% ]]1^Aq$;(V/3t}USP9"qBYa2M3 }!GXE2B dИ ى9_v |/QO ɹ9q.G,dTE$.5w_2gLqe (Yޝm|*;@1{OzIGkeJ/Pbv8?U8?_ g/M#7cvUsH{9e'4Wuv/{eK7ղtῈMA$ :ӆ~G!gjpjuML(5(WƆZdeVLdz'Oav9O.med vџ+Ɉ,c.X$)jWr4BEM[H4ѰK(toWӚ { &.yOi-0v&&4Lh1cDƉ&4Lh1l1cDƉDƉDƉ&4LhcDƉDƉ&4Lh4Lh1cDƉ&4Lh4Lh1l6h\E !1Q"Aq 2PRasBSbr03#@T`Ccp ?90u޺_?o%\3OW842Xoo Cr<1}$ߨr8Hje144}GbSmT;r+h]S2T̺e7.>\f7|#|#EseA7˜ݣ5!A݇VC+ӌˉ':ѩӵE`{v\Gepn^y7{pXw #"RaJ='y/ʲhP|ܥacB/pR?b6_d,8MDL`P9{:^*n~«n[<*{6t=7Z;\8umuDŽƹ&-^jۻO}9mD-E.!?YDLfzafC*W'LBe!I'V,9:/絖n^(IMQSW+9> C'cZ:mM`FQ=6~kM6 u0W=(4&|A5iϕ%Lu 8;B)KKf p(qԽ;0{M!}k/.^ナ G)ޡڥ{\oՈ*+Q:|P3uj(**]"sPHУ@ڦYFLh2:J9|>ONز)'ZsZ/Pti5aPYJqe`>k+cLQEwJ!v ֠hNuiީTAukv}3Hm,U|!ݹR7&СjfQTC7*oYzd{23G=d|IcGdz'nLhm +*+v!WOS,lV^-PoQr0'$bqEu8;VPϑء_*9 o6iO::[7/G9qV񄔝sgaQ[B4eg19nnnnnnnnnnnn|w|c[s222223̷w̷w̷w̷w̷w̷w̷w̷w>eeeg1----9nnnnnnn&N1r9zu#+.V]˹_A5<jj][!}~=>v _*F z_+? 3 @(cP%(e܎^!>mL}ܛAFHlQ:|΍w_2zU?p$8I}2u pnVW|gEk aDDE 7c̟Ж O{r9zfyg:z}NQ>?{]\ӎ}EzժQOk"=>.r}wJ!C\=>oއ{ww# ﺍ>RQOu7RWz`G/W;=D@>x˹_|3v_D@#onݻvtƅ).5Fn]{Ie܎^zbz:޳Ua[ʰkwb.3^cVm'jS]K=zp*(B]"TwH̻X,$1H>~E_WoHGrs"X] ˹_z\}ks%#N׾EfIW4̳Ѡӻw#U&ߦԹݜ%"wT`>g˹_{3K?c^x=lυW?3UY=]?]=[>c}LFC3-[[}>g˹_{NǨCAq$8HSG/Wsb\{r[O'p~(}>R>STG6.reܙ:˹2ur9zG/Wy y*J0J6؎ 4[A}O/=!Kׂ Ep1aÓ_)gdAQHH~'&|3(')ID-Pe]s}+>V+PO37I%2;KMJlB)֝w7_{vH2s5Xj]~vI[=SmQmɍ~hi//*fsfaJa1NXW@0piŪ^١rۢN&x7L}6tOGݷB`۪QO4~b|9@Ѭj4X+3}4S4ڔ0֥e&.iWb]]֨М2m#6_O\~&[++=+:.!8q/?>mtǦ- E !cZx%É<@kq{j9W8;U~D][$ e[F F>@#*/}\#Vm-^cBsS,絖pMg#cp/z$a}[mϱ Ё8:TvIq$Ryf'RW!s@Zò5KVqE QVuxf! 0 2`Q܎^ȉpC $wn44e3Фi.4az\wϢ^7$Rӳ8j#p[N2┹AFW&T(sz+xT> U6L'X!P%mZM/,7aE%pQPЮ)H 7w<2a`tΈT7Cz r׍Qݎ7Tcr9zՖCDNsP˹_mo8KK>Xf؇VČ>.r} o~`Tk0vKgx rb /qD9S:mf i^̧63lOR!F xD5z[VǍ M]{y%hSQcf:"S׵TcҪne܎^ݓ7ex9K'2ͻ:wC@eW |OE1k}b6Ht]b1?)ŷ+Eޓ4T뿤( ue܎^%:Z&kZcz R'IV7R\jF&TZOR^=2i2_1e[ݵ$|tXpA`X;XK6ECwCEjy*#\0GTՍ<"GN_Xd}]˹_Yw%' lJ6' r ' r ' r ' Q9NA(؜r FNA9J6%%FNA(ؔlNA9NA9br ' r ' r %NA9%J6' '0 14P!#235"0`$pIn_Wö6&bɯJb3DS/ ek#^.>GiC DV0^J,q.?MJ蜛懐B|e7k#+c#e:\ Cxe8yٶ37hywлf~8nA=Xe;?i4hxUjkkBZa^['mNq>|Gr/Z󅗧qHӯ;8K y{IXZq%ۉI+bѲM]pڳXnH+I;b*hRry1֍ink$!{$yK4o? ,Qt :p 7MǷO^X, NuXݒ:>LVkIó)6)yKIWlZǹ{u((&xıV+xnU!ZgҴsU%]U#7^Qx I~wqZ)PTwrvjFK?k7΀b $RFnN]('9*ʲ8CT!3b oVՋYv#Y]rj,7FR͑S#bh-krnIglͩbznj \ 6!T%?7nF~jsro*$:ONY .526*ͳXùkNś!E !cS#b3rg-sI՞#7g斝G/1vՔp~tKIu;Q$ߋ|Q-K-uLtXeT)U H@=g1R,IH%mJ2'a }fMf7I==/u ?ϼ%Q G\"j5#3V/YT6Mٟ/.|F~E?!Y'ԬщqtԞY V;Շ\̕[HqބAչk}hլ\~7B+W~vJf(q{ŗ)VKK1Kohft`K^ݺvCeqB~0Tc$ְٝ3Ē9V[+elV[+elV[+elV[+elV[+elV[+elV[+elV[+elV[+el6!1AQPaqR "0@B`2#bp ?9vgMa@zȦOؿژ~fPẓϚFĬ>Ϣ<(AI+ω\4fFIc!7o{8h>&2M yŢp/uF5z[Asx{quX xh>cQo{s>|56/' 2EOd[I ާ-{"+ps8,ϡ7u'|{o*=yofuy?} :T"q";zjޣڷսGuoP;zjޣڷ;z4' !@&A$@qb0R$& ngAm|-ru B 5^'R V_S3v4LV09J许*3PxqA s^Jᠳ®ǑUٚ0c`#dPoC8p(J@UH5MSB <Ѣפ'L obhn`ƫhxN+t+#E\H <]+5 3(JjgRvP|3oGIo'B:`@@U 3 dAM?X-'SH`M% 0I*B#L$1NPYLpv? ADB4."$uiדFTBC(H$1@ !1254`#03P6ADQ:,S, 6"cX,~=?$!k>HvǺ“_яn \YS9 :+n$Bib~B 9h<^:ݫcAJ-#^G|v *]Զ tvq^gl-eO;>s*C_6.RI%]Ed.sӗn)cn8(/mi>)R-,CȌҌe &0-&lN:8ZB\!>?&YLL1'f|m^6>(Y٥íYF_^G|ZgڠvֿW9UJf3PE 1 Y(|VimÚ }[Ջ,~1uͼi>$ 뽕]Աd=τ ܜl[ 6uqGTg;@crp7лL=hu}%IqPWbqD}5Dun>PNwHAV꿰3DcqTO Z[b3DcsknIUG`I4J#֎Pjin\eWvN]:uw\3kuͮ]:u \Vm40?3com Y6$Wkiny6\\ j6memyn%A@R';P+ :4ea7Wiomem֗q-Zˋ{)/j[k 0oje4SmRuSrxq8iC}%ԲJ弩,9jz9\,ȘD!|KZ`ʻ::q.Mcߧno3#f#5< Pb"xF-\4B$̆^kӺҸ iJG*lx}Cmu\ ((dt##ZgY}ud'i Lo$w;sT,LwbWp Ks\\U [&'ʯ1wɷiWy%.t7O ͶmpbHaV%Tʈ0:b|FS܈ݘv5j`\kĉ "[3\>:^x 7+I,Vs` 7&xZjPH$n>upپ &DƚVj5B_ew&TGB%OE_|GpKVMj1{m{IUlA{uBD׌Ww^*-Zg"dt:ֹM -Z/o[ h8HWYyL+RdlsWryg(.2d?/&lf<."ڍrpD!˔gd~1ePzɵjųe+=p>44k.z* xgS)])!ɹJw#eHN}:Yɐ؋$S8TfzCW  xc\~$*24WĘ(PUqŸ`֐eR% 2^m73yn=[d2R &gmdԘoz^ۡԚo5<2~a>MW\Xi-"}$7|RBRaCn";5&RVێh;%Ã9lt#ҞHif6+JG=%1&CJp:=K(ql7c,n8]ԋ׆ل&^J|ifmV' ^WsU>5$-Dܨ锟Y"5-jy5,31{u嘎+21:iJ{SĺҟZI L%,$paUiA=NԴRBVBJ9ZbU؎8#Lb65d'^wY9Vy7vһ@H VV: EYm;doYt[C>[$gn:2u Wu΂ܶ[O7!S̵uM|նS2ۃv})DG&Asȏoq T-r)vıu͖Cg5Y5Y;dMdMd퓶MdMdMdY5Y5Y5MdMdMdY5MdMdMdMdY;dMdMdMdMdMdY5Y5Y5Y5Y5:!1QAqPRa "2@#BS0`bp ?|ڊijNmE|-ʶmģZKY?-}힏./2r5vTlzc3Sxωۍ\49j}Т V(Tҟが7j} b/4Kk(^J."7›>''~Uݫ};vx=yWvݘ`5w};l%.Yb*2?5*2?5yop7OwG6|ju9"yqS@x=y?vxt;o~zf^)fwUkj2@aڶ^k$c{Z {`[ڶ@t?G vH2clW*A و+P+̏ݮd+e}>wg^JʃJISy%]ZvY3/O>fw~kgJۓb&VðqE}F8W9eZlϕl#KYF+Zprkdir՜]ֻѨQkhj{mϞu ȹMtkژ7wL<9 ٰt/ -|F#Sötnod!!+W߬:Sõ3t lHZ\ J_75uEo-\Sn0i*(D UlxEwtolgF$EW1o{$e 3L4*,dq6J|֣j`r4\*$csk$_xu~; mf.?wϱ$CPpŻA2 /ې̾'^ZrW shc(ӆ![VA{Y,S{FdL^3qK%EYDŵEɋl(^6Ź>5[xV_Vֶ2haP&Vbh+aځL-j=1.Xm4eBߐ$>œws]ZG*&g1%@+>0WZJe|<']]һWJ+עrwON'H\2Ƒne' #$%ĩKL rc+u*dbLG)~ͷ5j\2x5IWjdm'.+4P|6 gS#)ŇRR lȷPKwL\0T!!"updraftplus/images/googlecloud.pngnu[PNG  IHDR~a^bKGD pHYs&?tIME  7%A+ IDATx}y|T9wf2! EvbmkQZĭP[k7T! u`pmAZ۾\E.Q@EY ;HBL23`,s;{yys9.̫oJyI EEl,Ś9AN9&R+egCe1n;AN {Ĝ `$_I|MIS$PJֳckOIU$,qJHv؋:ɫBuAܳ!ras+* yQR?PV" ԁch"|5m#\qzJ3h<ˉ;|'0 !V<\=ϰP؝v }]4<[SIYX!ګL ytwc}."N&le$BJҊ %~ TVɓowQe+>6 @>p҅@ރ5&."Lo&섃$Xǁg >شG"|WU~ԷˢNJ*Holj^f/kn%}b is" FL%yeAcØMlrj2bUnteA[)#@vSJ k2r{e;k6(4ؚP#:[M#ZWUF薓kٰD-]:͌tP3鍐PFU9~yy'dW^7xZYU*{gJə?$AY7:\ڒ*Æڟ ]M8A2[nrYdyZf*-DhW6F^(p5KM;cj9F`腲ä4$٬HYiЈ7O;L$L,h!@,1yء3r UDZsRX4Xe*D0& (GkdJ~:w_HsAHђotN$ǻz,d_9t8$=,O!椈k)s|UEC?' 4|*lr!oI"R"HjD[<u50_ϗ=ҼJ2z ܽ&+D-!q_Սc0}nSWQ7,,!$A"W1 ,>7cMQɁl?C 2L~+F)ˁB;K .OZDLzUH<˷;VbM %2cA+0"nk~A_[ןglx na"iVXc@A߽fHN 2VݺuC||~9<R_lVVkhG&ꣾ' c.!z!7lQAή·u\XzO堘˸bdzyšg C~S )(CܸH]Hnr6QCEF / ?1ѧ[gg2!x:a'Am`QQF8Ed6RXYdlu!_ԙwX6mZzPFǎ߽fU0}\ԣs;cƇ m{|ҽ"vVY*~ ktwj;>Rm2`Ͻw"߻ ? 歭Wl"K z]YNCI ):t}C VvQ*[bPrG,Cl^g`C8J4pH$9ry5lwexpتA8Dxk?TNuu)sB2&C7 5U:痚܀!,?uop^__JHMMMHi۴AI9xG)sE Ҟ={:lf޽PJDg=حC;5$M.Ax4,qׯ(7|'Mu\bǎ!κBjvE\AD[P pAz;<\.رSibx<[7g=ҢG/8&b"~  GY6y=υb֭!)-[rBwڷX]a!$Z֫r! e%4ېHzm6ܹuumowZWWJlݺ5IAQS-ֽr0xͰ?m"n_,r\.) '@t/t9vX7re6>u" 04IY (\+7~ۙtiK&~",udaoẄ< " d1uIu,nc/ǵb>ÜQ (GYVP2Z>[@?+DI83*QVOS$\#0uyP=mD*AhJ$+h8Y[N`#+^ %d<ɺGXcsu{:WiI 9"v/DUQ^ φ^yݢ<5{F8:3Y@afH+aXo&xWDIc9&uJ6R)l|i;)uP.V ՐwfC>*#`HWOtzu-N8M\Ri"HѺ`*1% h'õj^4@U$M1dw¶6Ͽ'*\dfڵn m"փgiB{ i'{lM},&;a=>:(+Odmʨ%_ *X,@Џ }گ0ŕa1 nd!mHDx6j(?Ȓۈ^%@8ʔFC’=h {C%qE7&0 $^KS3j595sABBP 4w>yLt8.h߻o 0}^mQk?ܧ$lThUo`+} wtcPMiݓ>d' =n +#/@PAVP o=m+wJ淇xQIV$<4Bf8]l4!jwY5*VLn J>;knv'u~); qWn8$vDO7q0?yJ ޙ,i3!on%vz :5-. !:ݙ Խ7Pm;n3jMm7[\*S\5uTm!^ HhSmZdG.A|)Iehb:mDbAQў`f`K1#TA!ldvN΅S%b&XfID/J]y?gy0>++οXBX,Hzvu g784ٹϙ2j)L|ڗϚ=Ĺt7=3e%L3: >l}31Y͒ftv$=1/1!Bq:Aw])_,K[#ip800p̟K\X\\A8"A 2++wb6D+ˋN*c%:MΙ&̔#Ggq8£3̰C㇜VN>N_FINq*upYGY\spÑL~9N@4%M(biٹʋ #2sٴW[nlyyw܆q56L[ 7t6PN̽QD$2&lYA7&n#7@$A.(rp.Y\I^M /9e=+3'p@pV-G)e:O j/ _6}Ѣvݐ{E ٴxD1e]"ni˟nΜH[J8 9g%,ӳsdxܹs{  1٘XqLSߕW^^?aRb•-3{ Ȅ[עnӧO&>D1}Qs P&os8W;ΠOIp%!3\JL!|T lAkEhlC1=t:]L|Y%xgӲ^ghAp%$-M32~ג=&7-M,x/L I `Zth?Y'ړ);c.WϾ-G~oM@z:L@w}[zhc !^,/t9h#GB%ǒ%K4-Z P_muy>Zɜ"7@y P^L:Mfp-ӳ8`Fyq}e/% L*/~) 03eNA-+w2?p`>p$am_ 'x5l buZvނZl7j $7}1x #ٰcf PQM# h=R^ FP]Lڻ&Ș??>&N+0r9RdWƯ+N';WbPBIyCGFn6n*x`fI'|үYp>1/`32X p[ ^˥q_\HΛ 8 96T|8.]I e0sxeb2'\:mZKKӲ! ӧ%gI}P]|~CD<<1yomܹ xɇ23S.%Qd, 6CjOl/B[J \dɒ},eO[#&IfoyQFrX̙ha~/-(x@p_MZu΢>N],֨L|(h#-(*x}r໳YPR8Q<=;wVY4f.4<a 96@g ^$ " [A0j44gBjeDsC&ʋvem%…V A M }fN}JMkFx,V>5͑P#rMfg=mM) -~:8MW/3w<HB FA9*H,s o/[ 3fhL#H $6ѕG-p%@ߛp<:M6yU׿щmfA' w ({oИEo!f7\`C/v MkA.0:jx[2AyMdlQ^L ytZDW l1ϟ{,-@  ӭ%̛7o;ibg&8Q GD1H'z%t~#`*&0Q` t+=;Ob~0. t… Ӳ$ &Y?Нyy.b,t:kX~ lRRRRk>vi6}tŋ j5PB0nȑzpبѦuL[0}}?'uq[?!۲~[x.;-[Xgpo]r8RQ3ёL1ӫ>z}{@c˹-ّ#A 0*Dkj~TBUDd̎1£%b-4X@#B1f2 ˃ 2a+g:~i=ǹ\;l8aBS{ A{c`F&idnB\OLa%1񑦃Q4Y{V>ِ Dߡ&%eDt۸"#1F{bii+=1!(=#M8N,b8P^ItLJ3ӳ*c-g)21@\TV\?,'iYFddM-mȪ9윜њ@>% ]ND@[Xp/`UOI^Xx2k6[,X`!G~}<:g [Eܓߌ2Olw|Daq6.JʛϒJ#Lf Zyi9[uD 6? {uf33+qHkyʋnLs7ȉ2>+M仌Pa7Leҳ֧ggޒ;>-3gZZvBZ;?QQnCO{$gEMW*c."P!ߞ_pF򢂜nGLzfV{l(J;]q3]_m  ^`I )_.()XfVLkiLp'燂iɁf3bS z8W[} f&H,w%8$@_`Qx8@III4O!6 J&2$Noc-4F&nS_}˒rYR.G7( ^yL2@ nvc;er3$!`81 8(Uj&[QZZ:]l*퇯q \͂xCA}IsiGO&>l1Wϟ?IjrVVebuYO arEKQqvBC)umoX (=sbY6fFUyy5DԞ(E*D\q";Ҁ1@Z&ct)|!U+!RT,:s!RT,P8RU,"^'U>*pe@íYRU,!&>ҍ(?39اmG1>\d8g- ᜷(V"璸I9s xӜ撸>\Z]2dt"/ElWSޝh Q)`b60{ؗ/Ӧ=iG]Y( 4fh![%K*Eo )k #.XgrAס 3Dq\]bkgO ]C= 9 ĕiC G>qk{CRM0iFWIN&5Sb[遄)>#gO|=0 H=.@^N$LEW'8ry0F,bXH+=rnHAXS9N`rJA 8&X P' ^HSf~??G◢E$LWBjVP'-[fʬ 9) 3)YYǥ67#E1 5B-1N*C?mCJewW{F֩e1eeGm"uzvϤlkE4SR7ACZ՜(;mM:>ixʥS\nB:Kw iE ,m|O$̴eOީ:t鏦H*/(45d {T $LtX45 sM-BP0*rk l} KNOcpHwdKlU( d9 I.n2iBc$+ԌHjvdkoIH<X7LIRk` .Mʆ!QPK%ů+M[vkrotOR ~aoS*6p5ќRB% Ń@ؔI /[!qތ-=h(4|@=!UA:$f-!OOj-YChIL\a`J|l9( =gңhДnp]h<[V3*5w9I&hY}TmDu]Ϩդ{d Y(,t>oIU$;1!*qSd$J~CYπ&I~̸-ehk i'_-cde#m5}qJyIKRn12H*^چė\2I2+ ?LR!5#+24NׄrIm;ɋ^e[d?&yC3 ю;ϢNBxvJBVk-;+){xd=96 ǰ\ ,Ujr`mwaNzkX#MцM8#/7{wTB-ojQ RY*KiӍ7WN-,&Z_r͠@ǖZ\2D$ժErbT DQ)_c8f$a>}ީ݆ +rȪy؝>-q v)sYi,eNl:ˬL-d#LĬxesv#׉xe+m8ҥe/l,/4M¡zyθ(ZOF8~v6k&aߺU-v^kv&dٵl=(NdU.]L+Zثh],&Zs+Q?rwra gi)lQWIU_6 `=>3M& =izOUz.o\Z7vm bOGR璽QM%Z?Y{c3Im#!!XͺlKu&&?6f i\j4ƺGPPGN##Vz դCQ{'(6;Tbщ}0lGŖ:^qr_(6ʻjb[f3zb?"uUckE{H-^;7{OKFHSYEݫQ,z4؁:F!iz;9RN{- 6>ZQ,zib'⡜6۠Xe^ A""*5cb]n٣ɒtOJ)y 5ӋE=7!bbnѴX`o$ͬ)V-Fq>nV1Ŷ@`b렳nmU;c\ n̬;潂XV 1.m/\澂XK@b`]CSlS CņH9]hm>T [hmZ*hmde>Tl/46Ų#Ş#EMM%6"uMߡ0;19O[Krν`s "R$JImCSlՃv+H "Z](]uޚM!~oWΡbHb< ] >Γwfxqܚ.Ż3] OxJ BQl[D44\/ 8T Bey"l,xk^ ;/)zb۾tUʖ]:..ߣDhbgD0]%SJj8ܲuM"VkY<{"> KbCDAj\h!рJ6[O@Ş=rgRlBr*EgSAC05,v v{rcRڋ$(/AKo)փ)۠J60*v"w j:Y~V@z''=o߉ ._Kli~3k%=H\dO*U-ݣkR?Fn>Amזe4z^;\c܄֔ŮoB:%"|(hUŞ;!*4.6G~6gm>Rz}¿-7٬i2H‚ƉfbԒ;=b=E}b؛l|_ĪbZ#ɧ3|EbģΎ|vwDX,,Q߹bHukL0g%++EK%Ng i~bbb3X5smil].U&1 KM}]i.k})PrO.6袤XXUۭv"R,}B`JR C$҈_Wf;Cy3na~?IM 2Ѳ^p̰*S|A~s6+-p-,""\)Hmrk+n%X0C^W.Xذ=3( ,1k%[ݷKMb} RΈ_,l.:S[ߙKON:2\yaIxLZ>|8l3"k7],ӹW_t.ROb!)ָPZ Fq-ŎwPbEOJebbfO@α;vh)(iMVHMk(6KR'8`\Q0MJ+Z]N1܀J΍!@ΐZ/ֹ4gBz4/٤FZ"-d]X-_/8S ]?g^l3>/m|+/bπ.w=5%Fj՚DWXu(b}wH.AF⯰``8.NA.ۂ԰X ic/3}f_.@7Lƺb30w8sС.noRzT-6 >HR ږG(o]]ueK0iރ9݁]|bYDsv{4ml{bc%‹eq- m+cYl ( >bC8؝l)v  XdPP=\fFmnX ֋%K}͉SŶ_= 2{zl(73[lȻDn?Xްg$.Em'*̊Ό=#@<]αۻ4(GVZEx%jzI{&ĽSf65*˲@? akؤr&R !FDZvOQlC69iS.]?̴'Rx8Wj նje'NiXPuLj_Ĭ[~b865{E# x>]@IKKT_lTA},,F'Kծ9?V6}w늋cPz6R=F<,ڀR*|7=uvկB!gb,{PmzXK1<žޥH|@'[+c.vbGxPy1!b=ee&st&r_ v^Z)Oz -:nJjC Ŏ8s/+F pK$`9cqs "Um` 2dBpv)h/߻Za ,&]ҽ4+nיOo^\PCc%Ε+bsn.J5i;]‹ɍ6&m knK:H'{|ay-/V!F; ZH;}TS^< o=;ML AY, ⶨR'X*ovb_􋥘A"N`:Q;iUQ2p2f`P,QYE(dX# \@"b!L2o I| rU(A (YO>xTWV .~uŚ\O{oT,MD-1`;Cң e1հ\,i8=76+^KK6.`ôk%Ũt,_,yAF:¿fx}[Z͟Ly/67Xh.7 1jyC>Q|S!= BRB ¤W,Cx7]辑"a'tv3D[,V4\x`gRMFJfcǰmv?1m K}Vp^ ' ^byCHui" +a(kF+V,LGzŒuԭCFT[,JGR|8lQ:bx6!5\bP:"x5y#FQqج`zO RARF #cjogR:J6t)O-JGR?m)Q:¶t.skF53@|~.XP:eP:BJg,)#Fc #P:B(!Br\ +tI]W~RJxslDJg,|Z"]WEWKqbŚ+ g~@_ҥD:+)dP;$|q".SV/Iwjv=L錅֊]NsmOgOw@ &k76!-R5h6H&,.KFK_^uZ}N둶NiJ3;$H:?; Gc.Kz_4"ų8-‰[EOsS,ia?ŝPےqtpa,ڣjJ ttxX@vzlLD7nG֭G:`t[*͋(M:lꈑ;\^ 0uK^$[ a51}Dd}iͼ-95x]fO++pqrG6h2.;\tW`,@p^MXn@rFk;[qsm객&v3JXz!\rMv)yIAļ^ܼ Nk2K~zt*.)r^.\qY)A6zX St=[+=:nXF&6AHϜORL׈i#bנϙL/ f\'[Zp5N}ϾdN3d Vq@/twJT zhM|"?l*8E@v%-dړHgOITJg o =lJ[g CAP:Qe".8O'su%(Kx/%1LuYT53k.iq.-U Xe\j#<˴./o7#]HjtD/˥J!Uu~oecل)P6J3 ¿Q:Bj"<Û)Vjm<'J&D,Rjqu',o̐ϖ{N͌] H"^+к37'?.,oT~g*)_o^IqwnV>L.T)HrrE/b8lxK*a,Iʊi]|Q=0\}c>]ݳp YTjCWKdiOD.ASgFG/9o/9%;L)yްuhr⳾wSNZ1KE`ңeFBь:u-]%#aS'Rt.)ިq{QqF̒βٓ5~>?8(m\R݇GcM F]j =j9So[;Phs(R=:ާWQ}BI܉N'}~`t;TD2yW:8VTCRdڷwJS+&]N|8WNQbsXWMx{->ݫhRjp V>5#]Zϝ~^ޞr斯_<ҨZq?}uw狧/:;:TLO'?rzW`M-ug$V?+NſWX4.ڲ%B"T*Rpc Kz"ȧ,Q̏ȓD7+vLM޾'NP|"c-5v.|Ό/7hqix͟򩢕U8#+E7Md7|ߩZGʷ~9͌E.,ohUI߹_w~Z䃑XC-R FE$3WFؖmĭ'%*Mq`04(% .`bXW) [Ҽ=Tj]zE=΅چk/,eS(XRGYQ?+޽^aIcR6UjR{mÒgޫNO7$ц\k&y/. mq,l{t_ ۞=yC}h/I)fD,-6N!HCho9|*q[,j"{?*K˥(@:WU %!B!JG#MHGtP:B#B(!JGtP:B#B(!JGtP:B#B(!J& B!JGtd$JkIENDB`PKwL\\ 'updraftplus/images/googledrive_logo.pngnu[PNG  IHDR0 CPLTEuuuvPuuutvuuuuBuuu4S4Sc~uuu4S4SBBuuuuuuuuuuuurxtBuuu]+uuu?BuuuBuuuuuuC5BC5BuuuBK/BBB>BC5C5uuuA2?uuuC5uuuBuuuuuuBuuuBBC5uuuuuuBBBuuuuuuBC5A4C5BC5BuuuC5C5C4uuuBBBBuuuuuuC5C5B5C5uuuC5C5uuuBBBB5BuuuBBBC5C5uuuC5BuuuuuuuuuuuuBBC5uuuA4BC5uuuC5BuuuuuuBBuuuBC5uuuuuuuuuC5C5,TuuuA4uuuuuuC5C5uuuC5uuuC5uuuuuuC5C5uuuuuu4S4S-C54S4SBuuuC54S$CtRNSK#SB"5,u6޿PŪql[KF:(# ƣA4'ʸzuh^رbM>=% ha5.- ȼ}gZWNB:(!ӽo\VI0/,'ð|YU@̳v#D<-zIDAThgWA@_5(B0Ҥj)I*J,(޻ |&Q~$̝Wf, ,0wjaaN.- ,5#]" کWNZ )`-yx 3'm YNKXR*I=Rwjo2焰Vхs;w=KIa LG%y+ P @W(;plrR7Nn"#Zyp W&*r5ĘK} 0GN"oooBY6Mbm6|PD'4x`6"ib0f* 3Ldǜ9- 3^Iyp)xvaD,c'I"$ȟh&t9c 23&u|WWa6j"u p O[^8'4280:ųEj;Ϻ'D>vNgLqucU̗{m"sЃ70" @nN#%ć=!{K֭ⱚF4<^ "J!~-;-Ti+1Էfvbv$^vN˫ib '*U%źBbNI`u"NHW@x~+Zz&ۆ(/oぞ xeA?M9`F'H"do)މĖjZIDV'? b 39S(:q謩T2XK#rm} NxSo: AOFL7:ABNYT\SgC.LC"@%sQYH+pF\gaE~uGo&CCHzf[1e|Y'XppRIb| ^X^Q<D'?fF%XԂs-ڃ5ttà>#Yp0JaS> 8FTSԸz$°r}KC1ڡ1S/8XMwJq4|^դ+Sکǽkh_w$}aG*K1bHb0 4a9%Nqʲu;`\8 9K$Q]NDU+ms=kƈg2p`!Ͻ`.F-J'Բ1%Ѫt$V~_ wmIH"?/Y% :㙅Cgm/mk5`eŻ'؏[(15P\8] 6p$>I3,rBZʒ )?`̢-GuX׭-Su8}8m $+1r:X0ps'%TQ$۟/s KѓL,hMh|vFjZEt= PDJDj{n-@?IOQ+le"<&wc9;wؾ\Kح6$$aG#TJ[6ֳWDjw2>yc3]R1A;(;b3m[b}*'~.eBa 0a1i78t*bG-΄g_7 !8?-"c3,T;: ADVN%pS*)Ri{0eNhc5ׂ9GG=)m{o}ݦ;'B#M.ħFw, ~%&:Gf&$KA`bKuNѨP]C33y{$c)f5 S*(yi ٖ:ږ p`I1vKlce?R{bU*jC,tH\dD&엸;veę: =ԁӧ١/v/n7KV{ &``i7Ok^JNL9@_`' Jvkbn' 4M7'E 6@zgjfifO PIENDB`PKwL\4`!!%updraftplus/images/udp-logo-white.pngnu[PNG  IHDR6A+@PLTE*tRNS  "$&(*,.02468:<>@BDFHJLLNPRTVXZ\^`bdfhjlnprtvxzz|~<]IDATx][ו[B67x6.ơ ġ!. Yue ,%B%Ȋ*;|￶fF3sgF9-4t={9:fW4.l_ W }*6=2η? р%`th{qLRJDY P#ڷ5wh挟A|D3*Z>t!PgJ18.l;5tzL-e3nc(rn8QWjFAW*1-17&> E}R~=ߌ'bB£*xF`ӋyыG7mk5$A|ۉ:l(  {,ٺг鎚)&O&bICųDŽt&=Q3w @L6| P}ie|l,lP'1c1j/tN$s1E8 2~FW0UCulj.ȧ<\5"arij%1R3]yZY_Ԓ*k/<@0BػkBOP@v6'M#wQX0{DZ KOP pt}[d7e6|' }6כy4YvSPxseS>*v{i{!U%䄢f$_ .K֋ՕTR`ٛ՘-tSiKCI E&Jl);^i6NtT#([_IM 0 ! ء67/^]' 5$kmK0N +*;6(lzDםF_W>V+~m{M˃`& ڢ ]TԔT9&@.co7ı[;ܫELt4 lʜVqD?`j] 3g4XߓU<ξ@R#Fr[O(Q[O6T2BؓYjfZԅг|[dPVcƯt'@2J(/m`2 Su.Cڰ;*AtoϤbd TlؤǸ0ؐ]$IY2 \0I0 g##W)Λ*"S *[k%dl,l_IMkLlf`S^B>, FJl6)5{ЁBՒK cæPQxJS7JqT*J$5*-(]P6%[y8؆*!(;&l҅"aS8%6!H4*Wfc*W B°y_\.e lQ].ly8+rl8*ųgT8T͔]QFI*] ((aFx^'c,ZI?Ʉ-^mWMM9y1bۋ!/*S59||Inc^& !X6Jb™go [royo uP֣oǟq퐐CWSy%ǿJ7mR9^ RhN;<.m eL;~\< v")3. CϪU{ES) 9 * TZ|U*Lap֫|MiVj#->R-8=jِSꎾ1.l)%#c&ǃ?mhu>oA#UiKicYׂ[{b!}}6Æ]LIY~zdKFo=6!DY݅斖 ue'2 j =lSo)6̙f28֋w#u4i+Ћҝqqә!|Z{qӝZǣjMŅKxC i|iR C4M:(ף|%7_ Dk{ט6d;=jy4Rdi yB.ٿJr-/V#3~ 8ph~e ܼ+uH'ޥNi(pN9֟U"'jp-P#Ȣ5՞;JՁMWL@ߤR1{󀎈eWpb1+b pdPPx6iHşanMtri:F6-RHAR} y~:F\6 Fc];k.V28@)Y? ̄Vn2bHՀ2xnb,U֜oj05饢E qH|6#3k;713c7بIƀ<PbJ&nX ?wr9=֤鏳+^[(S΂;e"o9j q׮ғzq U|"N,7ܧ O,lzDg K_$J4O 4g!ٺ})g&wFJf j82dݶG6hiǨ7=)@o^1G+*^`zFҩUL8z~y#I֫Mo4[#J߆[-H]lQPi4d"ljJi2 W=p8D:4vCGrNeDŽewCAV<;_e#JzVCYBk?+Ǐ > /w $Ca7Ds$llqqGٗ6|TI7.9$qTtoNtRY$ma|bͭ6b^:aB,ޔ[wW6EV{6Wfݬ5uNOQPp>C-W F l!mH#4H#4H#4H#4H#4H#4H#4H#4H#4H#4H#4H#4H4C%:ZU|Sbf*ŇСԜw}W On}co]T8v}WD+DN^;[QՊ̃ws [vEag1)F0Bʷt\4> ~g~백o hҧAη{7o6x@زBl5?-' ՙe)DōI/,$ئ 6flTPRo Vcؾx&<3!;L؀l:szg8ؠmJ + tRam\)Il3W߆ Mv*$-mAT{a܃q@"P`{r24V6_+)+)8%-gT@$J ܡ;lYm`{Mgv-xIo;3z6Y:FIuF(tәl99Q$v\%UئGlߋ#TySsާOoV+ $ZF'>Qa*iFsseh/0eV6 ̌v_)*^_]c,S6W%T6`tvRElZ- %Ci]s3 U@o0)@xu{En4>Qa@msF(mwh J+ QO*l`)-|ĺE my6yD 2^dt d̻vG [cuX`R#ScdzX=IN`VR;4*<5AlAn^՟Y^l6QY: X7 Mg >va*&l ߹xOg|\ǖ6I`eyYu ӊLPlJ=]Á>uW[ucKi!"f<%f]侹jǩÖ.%]uPs-WV*6'lkETv/s9az YϔҔlyF$u " sfA`kf?eBwa,FE}Ws1hVD-o7r"ɟkj/@wbV˻yXDgA MpwkBeΙ8{.8c/2 %7&V1ҝ'菼}>ggyuJW@ܰ="`5qf{ݜUlQ=Rl a#κ[Q8~2b0myCm icoe cB4M2U-_4()ުcUF׸8Qb7 IVFyܭ [/ol==4@|[DfogڝgFƳk>{aϮyzP6'?qe[1J@6*?j郞xa!I$V(szMт,lA& !5?Ћ obl$g;zkOpE4 h%>؞%>O/#6\y*)3ih ]b$/ވ ?ѵpA- ~[dv0lQJtǏ\\|wX +VKy\Gf)ln~6 3W=o t,i#̝AɷM,aӵEG4e.5_Gv,N1~d4&$R]{/C-B?>?U!Ni#[Znj\ 4=@p^v,Mͬiln]E.lBL苺KhK]5XKϗ;,LY󥥥4 f^Zw(\l[3G"3wO01 ep*)OWT:YFZr-£;F5WE?Ց!cfwF{ٓ8{ƸeB`c alIƭm%&mlL>ӠФMMQ˗^E"dc+=gs%1IENDB`PKwL\km m 3updraftplus/images/dreamobjects_logo-horiz-2013.pngnu[PNG  IHDR:DtEXtSoftwareAdobe ImageReadyqe< IDATx][dGpB:b\@ kd{t-" ;3/B`HfA__,z]#h<UN %!f 5uԹtaRU3F @ @ @ ,q" y,唿˻oQ39 /<Q7L[\Ga y< ĩ<ݼ65Q_98LF swUbfى[xUj@nj䞉' ~ ld̂zοͧkc_L@'~zK@_;X/NP@tz ."[v7-v&{L1h: 5>5}aЊ/&'/icч$W>ڿFo%3, d >&7dSB*nA+Y*noǠ ~X[=)3ɣTہʧ5NMi*|=+Řϻ`axǠ)Z8׉ӏ1Qk׮|>F E8[DDXU\M+Y`8HH.<< ]Rׯz?t)`6ӭÑ.>'x;T WS^0kbm>n@ٻ‘F]l #{4Q߸n)?3lvC.:jR`h^5RVyY8?C@ٹzf&v'O&{Wyٳ/>{\(Z&:A7FG<+Ib>n{GK7sQ8}znth|*:ّ%'xs25l7L;ׇ8 ~JN(.s sYԫ'M*G!w4{껩 UP7P%{0 `kw?<"#ֆʈo2ri] [BvPW#uğhsIH҅eW!Q%~W,Cj>~iRs%:8L釕t HgA ]<g vFlPeIR\4;M9-`eBD$wXÀ(_oEňrۊF V//H# At*EzC|."HȖ˔˺ET}5ŚUGC}dKSWs @҂'dbnM㞰+!.)8$J j:gKE|Vŵ6Gr{0*@y A0lCBhB($W9A[U> +Tmc[#x]\U'hp0~Si"`- w$.7s:ltziI+P;mGv\mNIK߯ hJcV8/exI1hg"=j:NG%7TrEXWW/wA#XB"9DNq~Yk4 ^& ə<Xط XfʮL&dSeA%mb9;v)#IYrN;/`TG֚;fۺl,6j|m N m5ߛ`so8wQ݋ MME[idYتLo,^V I.f d6k/{@U#X Dߍ.ȋ7IΌϮ?Sc$y`Zj_c(?!hp5 Y-rpוSy*Dِ$> != t\D?AKtNfbye!6aLn V~g$\Bj;cL" 2dPñUwG`#GbC!!L<\e^=o Y8?vR3)&b5soMLl~<k krX3 yj0wb{~5De9Ӯoqat`-@-@O+ xJPsp ߼`xśpC8TԢ@;WI]m@hf$VTwvƁ H& { No"$DS5X, We5*zQ`.杆pX<_ΉZ?HX'9qшyv+̢h{ &8 "%lԻ$9ֻ?a*f_r} q {O<8N7'y\)UU"i Lvzyn`At\WB-WsVЖ[7ߦSh3UH4<Š՘lxAw#6{ =@{\UIw6{V D ! Q kO¼q/B=v53:VϪZ^5&RIhBX@GTD(6SYa=y !.to;@@S82dhvU5jrAQ Fw)D;P,̫f!8Ha,QK3jˆ::Oט569a":{V eD %r3C32OJ ۉ$YHĘJk:GP}OcGR½v 6)߁یIeAJٱM\@ߊ'I:&*IL(϶7pzEA/^bo&,}C 0}~zR7ӳJ`}:UሡLU@D'M< YHIu'&oE,4!It1@N82ͅN [@0P*@ @ @  `RD@IENDB`PKwL\唽yy$updraftplus/images/updraft_cross.pngnu[PNG  IHDR;0sRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.3PIDATHKc@+W2z {m6̴  w $suunRS.++WQTq`̙\Pi_?F|||0+)PcyVZUBpsRUR 3dPyZZZ @ "VVP (doarGy@"dj&A?l怰2G*++E]"5: ؂LX'(auUs2)|ڵb1Q8}rZl/Z[[[;5X} ҫvZ]][N8)!8Xcoo4'3 H614Ղlذw v80_*e{=vbZZ\SMccjJ&|>u5ꚓH vsq5t`gc31(TTTC GdrDr`ceՁ"dXRRZ2dlmaPr_ GƶV֯dZY> p /q+> ui aP+r ll`xCjq`Jϱ ege3t*V5 loˋlsIy{ P)#hgM-k?חl0re ` 􀰚#qrTҎv8-4",b>rV )\@ gG' ¡!J!:www`êM̙3':6 J%E%` Vlhh%@)bjjcDhHy8 &0E|x R@jRj.i9ױi'}=al c.(,Jf1P2Y bd(@,f1P2Y bd(@,f1P2Ybd%@,f1P2Ybd%@,Jf1Ybd%@,Jf1Y b%(ln 0p'&--xC g1P2̙)v&]2LusҤyd9-sm-uFUA?ޱʿhD~(쳹ҭS$[^}:K>>dtY(IGW-v=uM A+oHsoWS|ץۦ_='.HxP4F [& %y7 EEe[ՠm4ɋ)u1oDڲoKw̐|4Y'UfK(h qM~QD_$_Ez?iN +$=hhj.YG5'՜PupSg_y P|``!QH8q8qxœ,0C=7n*| % xN0R GJৠ-/!> v y9D s$z6W)dHުV}s B5lҞ#1s#aQ7J9wĖH{u1"07K <3؎K?{0E# \/Q-LLA$zOޫQX813>R͝ÕҜ *9^sȪjaAԫW+lB9gub["AS祕qtNBFTLRnN:d"ҘK7-\ P$kAˍiH6d}nQFy KC^ꞥ(:W s۪W؄r%UyIAAQy^l@pLn\pQ3JԙZLjU,__ؘ~w|>q%l!9Gy z%O"bbԫ8h\pM]ߤ"+ b86WPXXTRF1/"]rPE #Qg6#Z_iT ӵ9Tn0,}2K˔>1,$Ig$&a.ArO7:J.W*U8?>)** JS+J>{ FNOpY Hr}qab45V7W$H&S>uT/+tkvv&]D98kIt:׆?)JaJS @_BYRRє+UjVS{||p)`Y;c(- EU7T^D]D*Kt϶$,ޫޫ3n,&e'#T **uWP* Wk*҇SpDZZ4fW[Cg R%s(ŭP*GC7>#bl%Ҩ(.ɘpF slKOC@9p0! #$DA!քk6v;#[(%P JX鶩pR.L }G c6u -~#Q 1jC?G OٔjmʶB RZD *SBdyJwR N/>  )_?Q\Wf'*3_h26$$6U%~TbzFJA@D!!}9a3a`>AcCDKC5@FAmS 2#VUQCS ߼2\>-,.2(QH#PJ͌ / PP"Iܿf)X{ȹ䷎( RImϪzTzrv妈7(ej:%5dtKDkt'ůwIq;wJZ$%rr [eW5X$&eTj_yU ݋%]^'b:=\4RccJMM*NP)>cKY6Pba odkQEwCy쓙(6}J.,,2XHeyyə7,t0v!pF! OK-I냄")mcYYy %Mb"&qPCl"|"I  6;6rigplW 9 I/={#;~u#>x+MT&yBeI  eP Vb+ PIm!aOmԩ^|׳M_uϤm?*[Y[IF3%R PC9_ `@$ZXXĒOxNl"7 Yy%ܮE@|!$فl}7v: Nڬhh$q]Q8==36.$"DRRDR.K\A|rFf ; k!nYzZxH/(PE@ˑPk5IBbʣGyPY2yNJhl{ KZZ-E VPmhAq acW\r+:Mfb-,E<)9-7 -vgMw=q%TSv̵b78QKpTׇz66\J.rԹJzBBPA;t%'^=ÉKq"@"55ڝ8?X W `Σw\q!_@m#p 6yC*SsD}Um6PR[&`>sip2:wCiyob?H4ɭIkp)TS_NEOWCpPφOkrӡaWjhyu? !vR2:[JCԕgPˏY2xJD /EU#$h;`"RO:}-d'֮"@Q'DnxAAc۠T]h3e#]nA\)75֚zdD0d$h[}_/)k1אJ\ypSs*dۧ)յ:PШΖHQ.G6eCSck3VbQQY< JRT/F_}:Kg HYy{GRvf 3)xfY5+sfND4]CܛNdVUC)~/BQDݣAQZܿP 7MuEA#yړh QO›`'1 ʾ\alTu"*+hR@y޿guP̙c U\ &EDs3RyvK"P;eoJ^(ٿ4BT \+Jywe|V${鶈:!$|,.0sUVP':}QC ~dԈ[ꫨy=uv&8AMC- oPP@Pi8)V[4|֋iޣKCH~#r6?65c̯m{#o # uev5ahK[7PW偵!pI 3#%i`ԨmG%Ħ(RJ+qeQ°D7EäkbkmgOϸqPIV;2kģ#s YP cg;  i_[ʥ I[#Qg6$BѴwS b{k 5$br쯽ObSmdS h5T휓3*-{LXKq$pN ֔`{?6ol[zVc`{-aM5je/|oC$48"R2 "IY}ڏ;9tԯy_|媙, \> 0eM* h#; Oƛb;=~ PsSڗi8D&F@mu7~៎`km5ߒ]O Džh+ ,\m>%L\զK..,X&*bf{)ctb JOjl: w#kZ -Fz(cjn  aO{Fq%8=v :%8]_X@)ʢyj&u 2K 0(n(M,13T8ɨrccze]]}plflT4''7򂤛}./躦U :/D~"GͅҖ E^BVKTJ<0--'O.}ʼnIPՇ~T#KpeQ(@X?yk;DLJLd4?-^˝}-H.srzb'?m|@w\jFEhHOJjt>;sgM)0ǥ6BTe7<4u LLBGDzҮeB,v TVVv"#1'ܙHO@S\~hKB,mH,Աgui:|}&fEUFqIaIX+3A|bP=&;Cǝm!A Ssx1HSU>q6r.5g~:ٳuȗt7ZoBcYմKFLb:  EDcb~1p%KR}NRzzzgD6EOty:\]Rrw?139RK55 KKń%E).1!1)y}MiVHقSwI$-(m蛁~-'4u6( FhVC{lR, g]n,&y &TI.=ϳ"[[3w6ye::L, tȗZw yX5fEQ#v5'] JeRr9T J4z%@XzN$\D j4f'GSw5#A;H\p)/ e#>Bk58QZkM#q4gQuܹi%|*Z%&p_,n͜s9}p(q(:$Rl5(nu7""w7W0AU5K(J )#5ٍ)!4eO}5l753Z:P En+:  ~E ێKzƪ$naK(N`OELJ)Qc!4+F:Vw~,pg4.[CBBBPFݚlW}2J\^əҔݓf-]ic\~tOHÉGK-uRaٓy.w ecT"NQ|=UdM-/\IK& ݞ8u"uf Sһi8-~eۢ☪M6E"0 ZfDB׬=hN:#B, _2{Mw#%mVܥզD9cVMMӹ9T6Sc- Qkp wZ-cK:\e/u>`y -u-(@Nͥ#?tIy2W&T @6 d@[(ESoVGuGhW܎EN{suku'xH(G3s<~L<6.`h hv$;h 0ݥPNu!R-B˙mM6h~*x] K쉵V}ǠX{rP-,:O;]bA;M{q%a7rXl~rPB,˨/J(UB*0˥AIJ-uP@N%k7W8d%!R~ ".:۱(.AJ(4EnQ6n0G,+v*s K\Ej[4NQeFSyiM⫆Ֆ T|ՖuE(-hBk":0C [-D^>լrI|~[1Ѽ䂨OZWCiiHˍ[%vO]-K T \ܹ%wբbK$ oԘJBdڀkK?N=-wƀs9D93ZɥC$˧}1JA.$Z[vC{w,#v~빳9^7J\z<$ak%wVKEBCicWv>x9E.VX6ަz )<1!¥Bs9Cmͪ|C r^K n7F, ¸3_̐Fu;@Xǻ-)5efmK2.?ot~R'K)X^z;wgScc3RR3Ҧ&㓎Oyhm 4̢g;1V;-w!˚G(z! BKzsFBι@*<}k;BIM7m֕[y<}l2[֊ŬcH&KeϒD5FN꫔B׍Z*A%$1ge g Q eɶ,C=2B^YoMhDaf.6k80ӟ1h~^n]TCK-g (C-\ c;x9V:AXjB ^0 |5+ddxm\!*N%%JD7:"܁ ͺ>ROgNOɮOsILjpI:^^:+UE}CAKzYhyHC>vQ/B(c!d,niP%i9t(-²NGJ- ~#$_/=KS$*Z%)sSs~[}4yl x`av;+Wڸc'ҢѤI '0mD".ñ?7ڋM Hw!((Mw3@0 ne7~V5ZZ.W*UU%T>OGIJDiA-\.H<ӣIߠ#n~KtFI%͐ T!2}SȡR;儨htOPbrS뛐tT(TJhb qĬ3_X .ry kyPȻ~əYqIJqQHu<} O 3!:C_7ÉKQЬҬW:.%zSpx蘿A #r -5e|B2>3Ϗry߿M0.%P~.#1ǥ̐8^KQ9 5Uw&SC`!Tԩ%D&1HWXx v}8piwg(׋AYcUV+2mO:Kb\m=° P[,Eex~[r =%eZB xOFQbP"vע$Y@I#>2{_5anv1Kx~wN!; EŏB=-W4 zH ?  g/~5BdDLՙKƒƒc͢- gjw R <["A;,.%1."7<8c%:V<%%&jLV&y@{K 3Gű{(D^3o4>u:@*YLD=j֎| ܎z(0W"2!=`AbaYjB'}Trӈ)i=V*+ǕJJ^RiXc8 A,%|2 H6= &AR >x'e$*P1RVS233"($enr|%Hc^g޴2Jb\.-ұ: }( P1yٷ6l2lA_} 5eظV'](IUQ[.W%XLI$#㓔 JTK?W$MsX2(Nɋأ )wd""#[j`WwB2^vV^LjZ sV.!Uª+ ?D6nӗ::m^18t&ov\qp / AeC`.N( sǁZnkMYzXq/ \^w1.] J^ !XoL_u /NOTk%!)A/3YKWN[j #}{EHp"PW*Yb)'\n+~sի]nغqժ__|Y<#Bf?^n7D|P&Ƹtj(s.hs 4s.d%+.Y5mɪKW#"gӕG>[~glnf熒}NgS+zo V}cWr5F0'Ҷ0NCI̯˷ǹ ˃BZ ҅m<>Z. JBdrCڴ1X!`1ɠ$VR6Þh ;jji$4Sgml;M;@مfiJ:`(rQN%1%esdd;=A"^B"Qwh(x>pp!S2"\X,a䥃BI+hjhYbw?hu pPCJ;q#(JN^ubKQq {z%'fd2\:DF t8A@P0N CIںzh}k)`tD=:~ۗ%H{ըtܓ]s9P%uν!t!/!kp_3AI$č\>N޻К|*A\ݿFQ!lJv@tւ :F kPL W`3UOҵAr= 3 C*,z7 j:qRHLT6S\245A ){/]qם{)"h|0P*x=ڋ+9Y--oe8,b%(,Jf1P2Y bd(@,f1P2Y bd(@,f1P2YeLZ zIENDB`PKwL\Յupdraftplus/images/ud-logo.pngnu[PNG  IHDR<q OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs.#.#x?vtIME  l6eIDATx{_Eu?_rsC < 0N1#(BAWT]vJ|BKBʣU^T%=-4M$ycޛ}wkݕܛ=3sٳgUSI5wTUҦg)oIW6_UZ`fX~q[c $i/`O`5nf;A +cJgG{oсo 7o+m5VCA&cshWX lS 4͒҆$GפTڬh \MXf'ְ o ,*m~^w jT9K5';`fe]nX <\|+^Jhok̬X6lޅF~:uM} 3}E$MVXj6~D]<ѧ8:\Mkxju$L"`Mk+U>JJm%qtCGW|zGSW $VX@GQ `Ch|͎'q4lJc9wzXiWJ{^$.vPPHr!#|$$շ풠]8Sv2w6;:yW7$$-v PM< Bi)zbDg$q4hCpvCc#Go`fI5z9kG֙4BGBrя]:'$q գOcJ9#͖|;GDr^,7TZO2}'~FۛދS[8*s;;zgJfz6Τ |:eV-Jߦ$nsSߠ뻚v{|> Rkkn`ݝyp/a`+XϠ: {~ci`A#u 6P,XWP~:p՚D_5Y(q"QX)UX} K+d7!a# ֏w3,PD^,` G֗Y–nZGH_T1dVvB`mEj $Bo_6-YD,`m=U+5kf@X = P#EfW՚AWXiZ^X[B8>p=k`+Ih2Qy2e%(,/ zZy f+#<5ZBMz_+\ *x v 6䌬o<+$ X8X^"ؐO 9rjJABH)>$߶$ Tšڈ=#sW`2xz - ;z?2YwXoUYJYK3zP(xoI`m]Axk|M竦;%>/9 GA],4Nؓ]7Wgdmg$BpxKLY I$>"wxY˪J2SYہgYXigI&7ZPqG^Rdp"s).љ%6;6+Kj%0Cil(Xb* ٘RVCP܍Rd*V,NV`ɑZ`ą2WsI-t=2μ xfq.s&0KEBH-F o8{GGs? xAݣelL(mD y$>^V*Q >åVlѽfp͓ے8ڻJHbV}s5ߐ`+ x"_ &7+9+2x ٘UXa.dsN͂<ιXѱdJ\sj.Ϲb7O, 7Sy*mj.E>"ߩ=I}+{nxAP-*b)Uԛѻsj؍ ka,GY-،I³Ey:셂O>u<[%򸅆w7+B.V,.ͭ:!^[`I bnV؝ٳ np/i&q4:8Ճj4GQ=$sC%N5.{q`uWKsXJ[F=VW3Ö;zvl\%ϭ! ,PPHPIg8뽪\(gRd2gpj9qH tjHIFe&cL.m5RO򌶒K[s7"|}~xqviL.JcrzhkaO A,Rf 7 &EX{Դvw3MϮ((4[ޛIc֦CtVPKA нe2"V%J;Ѥ#*\Qm#;|5{ :CCyJG}f)5C-]a4 [ 2쵗}RlٵZݢ5KSKT˕b X5xҠtVbŅxl+._Gs\5 ]t0iQNQEai{ͷ/ڑ0fŽMC! ,OPH-H 8ɧ`t$%VD08 ,e g+rAȐU%UKW+\D9yjX4O2p]_s݌Ժ}|JGtxwjzK5J_N8LC3#yVKBoPɕΫCTُԭܤә"0rtsmlP`J PT`h 0 n4` [>];2 ;x.=ٸ'zHAD$b$oa6+]1QF KY$&o lqO,e⥺m,nŒWDy FO3( i'T馣n`Z RdzIŝ<{t.8^aS *{$zS>E *K`I* Nk5ꕥ@asҖ(tt7Djmqb%%! ,PPH.I%8M'hhk n]q<欞 (SҬr kͪ1dU؅ E/gw~P%625.Kt--p''#p+y-},4&u{Dk/(dIĹ(Z$­s[֡YNR᥿a[ھ^溘_HsNc 'n:|O]C(2,8b2,i$ cK/ mcʊܭ7q2jGҔ Lh#Q޼T랚9[גM8Ű.WFD+r5=յ̀ U};߶rd@ZOo yo>؉dFEX?787O._(t; ,6q |M#lT%Jy-.|P·ȾhVȸ&[RԨ`ҳ=ʗڹaDm %~8 1%sOݺdƕͰ}H8*h^Nj PE&O΂/9<iA#OΞ%AB|5U =эK]̈Ě*wz h"9v&TzZOqs|\[ҍҽ +`΄;6ƆbBHJNO2ӽܜE@bM} !_u+$ ! ,OOH0 89&hhv*?<:o bȢ$eJJ ,hJAdTd#um1mLʇEC}8=L?>>~S4S=78`B9$8/1w. 6'X.k-gT.q(-T¾ͪZYQbvYf`O^ WF JVMwp":]zpvEV\ʖ`z8FJ""'x$5SXdM[4QhODLָLMݬ#XjN( kXbv5Tl~| 5..'#nWmP@Zv &lP:\vZR7=yh…OBGNŮ/%y! ,PPH.I%8=E&hE*+?ߠ7D7 _DqyJ^P>vz< AmeՌ>$;8 ak,SST}wH r4@8O770u0zR+ m.-M# i"jLɆ%VӲ=k&ۭQMZRgKoTb  z-$B^'~2214xnC$9tۇ^`Qf>Rs2L KSQg"͟!/f<r*K\ Ҭæέ5r ! ` ,رJRh֫qm*fO=VnԺy+!+>5:$.G;;@*y姯<%'P1})w_ (ԉ9%! ,PPX/I&8뭦čXclt*uߤM+~qJ6P3Z$jG7]bUZT,M9r!8~5| zB:3J/4gOJ -@% 6/>yt&i;PnVu\)*Wp`x铇ܶ.J C+z@8M?dA<ƄcF$a`#-eCRɐș"5idU opgk#C 5<3^F" KWŸ%\ʂW9 '4uXX\[ 'Z\ZBhp!)=CDʻ͡/o=(x* >GJdh&EX;:ΧU~ ۔O$y4m5;/%,U<{ƘڬY 5KF_pÛ7)߾6IeTgC&fTt^d楄?s&%҆NJ! ,OOX*I8 `pdhjd+;o- ڼ:No fHU IDS(hq.Vg-ųmY֝qy%Ͼ'{|}t.BO6/GJ/w84ql5L.@ZryVm;NOb*/|zV &4#da"}E ͘ϪhYEPSaʕ>݋05X;(prJ!@ln؋(Qd*bAY@#&[P| 56(-髕NB? ʜY҄>Q1}I$OF'Q&jؤjX\-e1GEAN:%6&]WpZb"B(bCXrSam-kH! ,PPH/I8M'hd*,Q+,rV mFYl.m{ ԶTfFS-!7~6)qjzBa \P iODI3~'}c2(p,RJ; 1Ľ¾ʓ&UυԌҍ 8S : < !ѩ raEumgaC)g8±f*+zyM<) =g軦 M>9CT:Z=u֭\.ke#ˌ+R m۔=Q͙%ّ-{W&O Vq2f.F'ήpt֌Ix1ڜ&!,PPH.I'8k=E&hh{*_ޟ7:[1aXd4FK5a{HmkU<wUSt:~g|nx2)t.{I%mFc=6+V(~+hYaħ6]zoςӁW}զoۖjeɸ?wTg?>_;)R;Ȥ114X.ĉ!H/FO*2)QF\ ̼EBkINJnk(B6? K͚%a8vdQD5$t/*Y%߄wv skӱ pY+k/DV٠%ЎOkG),f ^L37b} )&weѭR۫Ds`X;PKwL\2#updraftplus/images/updraft_tick.pngnu[PNG  IHDR$DSsRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0.3PIDATXGŗOA+$A#`4l " !(%FT 5~?AK[fmm*c,xi&*0#Nû~#ހ&&W֕ UIs4R:r|r̤ħ=Hɞ3t/{M$.@2bf+NQ6St?4/yͥrn6=U^sVU7S:+rGJj|ʈӳMMS:_]?5HVX)x?z! :B..})z@_ktu';4ZtYj}&sXx|’lf6A /y1w]1CS'עTKoѤN67L N3!x{BϿuژ_+IENDB`PKwL\s{${$"updraftplus/images/ud-logo-150.pngnu[PNG  IHDRKAtgAMA a :iCCPPhotoshop ICC profileHwTTϽwz0)C 7Da`(34!EDA"""` `QQy3Vt彗g}k=g}ֺtX 4Jc `23B=ÀH>nL"7w+7tI؂dPĩق }F1(1E";cX| v[="ޚ%qQ-["LqEVaf"+IĦ"&BD)+Rn|nbң2ޜT@`d0l[zZ ?KF\[fFf_nM{H? }_z=YQmv|c34 )[W%I Ȱ316rX7(ݝ ⺱SӅ|zfšyq_0sxpєqyv\7GSa؟8"Q>j1>s@7|8ՉŹ,߳e%9-$H*P*@#`l=p0VHiA>@ vjP @h'@8 .:n``a!2D UH 2!y@PAB&*: :]B=h~L2 p"΃ p\ u6<?g! DCJiA^&2L#PEGQި(j5jU:jGnFQ3Oh2Z mC#щlt݈nC_BF`0FcDa1k0Vy f 3bXl `{ǰCq[3yq<\ww7Zx;| ŗ]8~ M!8Ʉ*B !HT'\b8 q$C'bHBvay=+2Mv&G&Ec[ [bDDĐ I* Zc0&8(&iYH~Ho(%46h0װu wKDŽ7EGGDDōFG7FϮX{xULQ̝:+sV^]*uՙXXf8t\DѸ@f=s6'~_ ˍ̮`Oq8圉D]SINII\7n5ewrm\J`ᔅԈ4\Z\) /ד>aQ1n3|?~c&2S@L uYY5YoóOHrrsNy};_-cZuuk/\?kÑ)*0-(/x)bSWr±^$E[nEmnfmOk%%%JY׾1ꛅ ˬir]+wZiYYGgʿs{?T'U߮qiݧo۾C*זԾ?=xΫ^P֡ 2mjTl,ixwxHȑ&JG˚faԱc7sŨZr}wN>8(mP{nLGRHgT)S]]m?x3g]8wn| ƺc\x'ߥ+=/_u=wvWO]c\n}Ϫ'l:o\:xviMoܺ~{;˾;y/Ylx~XHQc?:b=rf}Icda)iDӤ)ϩV<|~W_}oοDΌ\«ï-_w>~f~#zGPQc'O%wu cHRMz&u0`:pQ<bKGD pHYs.#.#x?vIDATxyeõǿܴnn4Z5 :"Ӌ)2 #B"ĐePȄ$/ƗghAL4B 2nA辭}ںz;=sݿ|9{]{ժUV Zzxʺ{:>'ot5Jj]XjkFV~\0i{ʺyGsFD.91xTX^C쭽ChcHU -p0p20DYץD<7QVr *^SMD-U)+-?*o7'5ON-~Axl…)nr…y43j…=89- 7 !GH. :{ Pq~HWHkzFG"=s=P6|pCtqbaR)_y/n3 h g%ߓѺfu*'pc +rYΔIC.WzHܕMj;zb/?)1}y=:C{eGPֽT]e8h`wo{;>{ʩg`0-"e*2={ <  ,[!GgDJ= |#%TI;dt㌖JM>;. Len10Wv%J(^J5rVK6=ٚrʺw65 -8y.MYw@]UPꃂ:bixuV)oc4R1 +?+uZEG֛˸J)N~,xV.JU(Mͭ:yF>o5sY0v9tTZh*r!+6ʺӚ)ZB85u:,=lt/)ImyzMwG=53 )c FTF7 MǢ=P=~X:T0-הuc 0VVU֍+~ FOF|:kR[VYW^#5| ̍́s2g?{f<]7tUFGT{CYwp7zyBen2RQclV9zjTD urD%x7eQ~L.TSw{Yʺ/ hb ŧz QK޵`,Sۇih2&6dM95Z*"T3F )c̢[_hbϮ?^&q}l(n4g=bniڠu+b4cd)kb2/q#e۸{(3rĒgӏW^Y7Ct)׍H[2{IYfNw;g[YwcAֈ׫>Q*n;pkoojxVZiʺEY<0'GyW5cBlb%vX?GYw€1xw',6RAXkzRpV'ث=:D%Jh?VGd ;z3u'YʺU{1I?8vxק#ͽ /eݎH%+YפWLѕ$/U|.0T\Fq]%5)pB lzOW#ugMe~I:gsCы:E ‡Jqv3 >4U,$$U#]ugSѣNt+Gs%c7z:jt)}Oz;u#SǶS&tz4Nu/2+fe%Ku}F},!=ŶʺѼSYy )na[Vq7r!t`.񞼖Ҟ SkDp/Jݳp7:evFߧVxLFH$\O0h,K(QD%Jo{V"5^IBvR-H_7%e:.-"\?8 ?`1OL7W&jĄ߀OI7zA[+Zh#"12=-%ZY6o$o7 {Y)O{8N/Y,bjb@HA~&95X譐M-K(g g$B;δi~џlibyI1$Qd8OѲќ)ԳQ  m4֢D%7zkUZ5UuH Ҫڲg葭H3p8>F ,}`tHeߦ YS2ߊĺ.xVj/Y#@37#e[c1@Z 3_ӝ-Bn2;(뎩FtIXjF9㫼 ʺn1LAH{/p8]/T%ZCÕU+ |˸(`nY8 @BZP4PM!5N&(%Ԏ5.۶Gji%Hi *lSYv"7z7zl 5kPY^[0ps2C  AqlNPi;Rӓ`g'=^r$ۆ R֭Vӝ]CE5MUĊ֥[BomLP& W\o@<瀓uW}[YV.lB0"ք.BjKx,(QD%J(Q]$YDH(֑NXf_GY7S_6T=ۋ)ʺ2},V)7fX ijxHu٩,/ ;^ U%u}q AÉq-G9qPԐ8[N[QYw$!@s2AYw=a0W=rV"DN )ǧ+불{TBۮiRS1232;eued?ɿ^PegWyuKΏ7 eFRa:ukwoI3X 72=,>\2K6&l a' ߺcdpՔuk{'MyBVx=>IZ}8aU{QM2ma[F2 8&"NwzĪGVd)#TII{(SD{)S:w*}~Yo+qЎ:oCLNU`TSeT? &qkN5@ủϋ=[Y7Po1HSוh)81JZ1E@bE|#Je]ʺwu^*N;7N8{J%7zXɂBZ{/.X|rޯ#rbŠt-$"$ [!!s2zAe;]!d 'ߜzY l&KaA5ir^)\}k-/AD5J""_XA9\og+#oddi"֧sD~B)pكunAW}%J(QD%J(QD%J(1WaC`fx=t F#a\Z<9"$}!p1x2Șike73fE"4e]`aA'oofIB^'u*B zF IWBu\*Y +]gsXzK⍁'$evgc(cCoUڐ*+%+:7I`(Fڹ!?FBXR-V֭G7H=-yRjGF[^֒ nr)Oc|ppinhsqGM4"YAT?G*%VQImX6`dʃuDNJܕ*%VJx)mO&|ye% 1EtN%~ɰڲLuo 7ahjm7:Yˡ0 aOP%ćb%cXQcJYsX1(FLlުgX2} Ca~VLnl(+:-@]}ƒeX)[VY]_W6,%VN<_pV 8}s{kG4\R94KjLCW+e}.R=R$K[vVtqnUƺ;6uGj_L.=c%DŦNu[m;;D97`xYYǒ+㝄,Eӭ7z (뮗<4H?;XQ:/vmթm.頬GßчtaгH9ew13 y%v|40P=ݪmo,I7*~=bx*4=.}mQ[LH; >]Yww+m@[Cn Nc4p7H'OQS_]<`+d\sbM{H ' [ůuēVFyx7"D o|b/X#˔~ Ey_oh*|;m܎('VnBTֽ>+lOOz7[jz myF_Oa^mcՐ^P&=+E˄&״k\M˶\{bac пb%(N gYZu,pK6l66\x+@`LNj;ẁM9|!ÄpSzfA2v%J(QD%J(QD%J1>\$jxLY~֍bLpMyXY_0%ZT/d0UeMZf!:g^ear S8EY KOf{|~؆f u&!1m;{&BqeF-e݄!z'D_FHo _D*x'm:%2FʺG3up}EDekBM"$`[jÁkSr|oa*_H`'`s@I ܯW1rH?u6oфׅr|,5a v)HmS):X^WhKͼ c{#}S \J;5dEwkGvxQYU&lq!- Q>F7MbmF3B&a^ Bn1ut,B(ނS]BozSI= erTwFJJ#m_^v:5NgGyʺߧ)ʺ5y;|+Ҁqߊv^M1^mD*"V__$+NT=!%Re]EYwWYY|0N1_1VS`D%Уteql@i ݔu.yYYnfJ4VuE"naUow FERcE{g+&y!6̌aoEO{(-Sʺw:Ƙ[gf Sm 75% F{΄R\oI")z^W5&Xr]Lz$T+Gڑ#oغ-SEXAD*a[dBHH _!s#QOiO~RKS=_Y7VxÆFr1% {]f87z{ (l&+z? ]7 NTB jB;OI&mV\;+^.œeNF?9ܫL[-!f üwL;bJx}#p7'rE" -uCȱя=n Iʺ{e)^g79PxO(UF'Iֽ5yۣ)_ r>?xrG&JhPD%J(QD%Jh’GIENDB`PKwL\a<updraftplus/images/onedrive.pngnu[PNG  IHDR@6@bKGDBIDATx{[Uǿs3dRBlRhEd&LY< PTtTPVtWQTaj$Ӗ*#+V⫀+-}Mr3IʽyLn&ɴsEjw*j:p;idʓIFU MR힯vG9ufB^*)_5UywЊ+E咭FS*VL/I/ۤE:-(Ӝ5jԘTllPUzZa7 =m*45UxN /=:5jԨRJzڱ2'sd>GMz5jԨ"d 0Bc0qu1k֨QJнr,r( bH7? ;t) Ǔou_FЦ Y ǖ潓-R%)t5u ]Lk@}c0oR),hS+Cyya猄THD6.C=; }!ojz]hzyŪ(Q+6{TE'ԕeΉ E,[lAJAu/ć |!B fK$ddΉs?)`~&#D$@O*/=Tv7kͭ \<)MN9D(o< LʀXesV 7 }Fx7ޭr‚qKlS {hp"C bD,= lRX}+::dD.z !¸vN\Ǭ Ow]VY:ugAr;85\-a#o3i4=kSeCuKo?H))LS}fopDL_X꼇"P# zOO# +ݿ9Re16#A?(?T~궅8>Q_)tpcL+0c`|V+{[)?nJݜlx4-47y㙻F齭c !x;I0"s8ǫ(>o~6 [fd! EH#ZݺE P[!_h6X/:.EFhpE֘u)t6 l'U㝿FnlpxQכn~i@HY-̌R}K-խR˩ gLHb+O|S" EGGbRf, :fXLJ~M`ZnW!!L 4^euUf5L-a7 yu()xo);$q3=3SH4Fے7tJX <a>@>-Cm*Gq{N"UĘV8`0S\ EwX"fXT zCK9w#yц9&ezH<4qS4{eЇѝnSa7'[ߵY|loxPZH*3U!׾fc=T!26't'R;Y(μG[oO,tTbB`\\ n/"ɉJP`9> s?2t{V-4SIt%범m]g}T@W3J*4;Hn뮨}wf1z֤tNΒMy:%ņ 4z}74)+;Tc'|W9(Jg`N<&`PqV!_QDKBNH*{V63}Ép/ojy 6v6he2j@uvW%%\de{y Xֻ-6LdmetZKCr2[ڙX~;:AϚP^8g{fQKL\&'"|Sk4ީ~m3:Xpe 3Rr->JO V$%|=naNf1put4vV2AYnV$rX5 *^u`_Z6zN̊kkzIı1|IdPvt$]}&g'"[3[]M]sTv =Ɯ{XLjuS("R:e8*iVPag39-vY=A&muQ<iYK{H!FX.L< 3֗k,-K]xgμಹW/g|p  R!v@B KR’_16ݿM 2K܋ d^>k{MHR4D}tt|~xB"E ǻ@_A]|]I(,uJPEܠX/ٞ,?{/Ms=Z*ς.VAT :)O8`yd;]&s8 g_3FUDgZE0QHljۥ_gyഖiC3pOز [7ه.)W|gu'_ލ'x k4B,vS(zN8/zs˽SɎ8B^. ,Mىa"q3}/#-aN:\.Alq)!qcf &&ݯj"`pL:^zXW|ڂroiޥ7 |oR*7ƹM9! taJ$Eq=*jtB)we pbm \B׏[a;<A_u?0Uir29i#;o&u9T)uH3F+V<2l?ٻu~4V-mN\QS9K Pp_֝ef:ոs5[L5;4r)V@ծc X^#"VB=LhF#(hTHbUFˉh࿊ؔtL (h)FVN+Mu$4wAWhN_yJ`\dyM\y dE"׶ŕwW:m&7t GvI;n(Y 1L5D%lT U.8Rut{Ѓ쬩B9+aC*Nb + SV~W5>pH)Η[-+d!S?%k _R}ڍvQUcgRZZ`vwת>qčYZŠ{ad$`)$?ˀ"c?Lsni}Ԝ-:ag뾇6׾0X4$IެgVY+]r5u-#!~ l$CUo d,ڈBc.;~,QzMVg@"x4|]kWM~r7>mnM,$MsLzH9eMZ s\^-g&Ap1x:@3?ttmOңL6N§ ``:>8َw&O;uAU6]:șCxgd& @kw >zht5szƔLG5d:[d@1etxԀq]fbнŸm6c/eν[Ww9-(x]Կ=«,#ΐ#A 90v:5CJYEu{eKN {v_&k x`Λ f½XX & ~D7"MAf|WO: 1&=bHflMhpš`(SsZKDZ7~X[3q,sp*0.,3V#.T# p_w۾zKT2s(,=:)=C܊2ĉBʂD$xhTB$IKgs>OG</6j(bn7V}G)g;G7YY/t;,5I@O^=q1G]aϲ(}Kv?VbPC5ToAc_qa Љzz< U*OnhIQR0 F^47Z$AMtfaпq?gv@Sz^;aU(}E WbTR)%p+h1!S7p:MtU/MuUJuƣpjݶ HzD0*-0a=ϬFnoPeO 8L2jrBw5jT c2Dh3 p2re'ِ%6nRa(~(„{`ըqRqo8W PĢG5jTk~<-{*g?IZ>t6UF*cBveH0sD]+a,)5Se A |h<&x^ #fnIDATx\ tTݻMIؼ !!@D(DK ՂJU|U= jKV=xڨIZ (!$GHB/n{Ifd6?;{ܹsgM?Wj8_@R&(0<^(յ+3bk*v?BJiU寭kv4]ё,뾕+W |b5X)JJ|& s5X--`cJtol_p Dt)1{^W3cuxp[OK]*k1qP8mK8Exh@|`6`iqqP;6oq[ˁJć%'۠qLnJ um 7!}ӈ Cs2)=] \H!81mp鳢4ۘ qMڦUqGB)N @G.b=m9Uj'e פo?/VKbK*`ncX 8֍'ٚ38%3F&)+yQ*t(9[!@7*п6$]}b_ߞ9_M^QL HZ<:Iᛜ2Եp쟁ġ\Ī`b:Z+o@EfggX$&Y!<:Cxp?*'-Zk,xH=iH@Qo '^+򧅻#|TdžcfCn@xaWqQcrUeՎbՅh6mic 0:\I``f5ը_&ZgcIN uK[?LJyc%˝OhfN&CȈ3C'(jX=h8v;+8❣Y+<}GZ"_" r*-86k-s|z.L7AB(/8?NTuo_ڻ ]bjz86j3<ۏv8Yb,K죹iHЯ!1V_l:kiq2iʢd=ZT Pcfw{d1 ׺:s+ukjfyɛr=ބ!4 wܷj/{;"}D_ybi)+"^1QXHYIH< 2OsD*}+aouf 5C$ኹ@ 88H הSC9=TYN0Gy3+>Y WyDiOS!IU{jm,ʦYT=FeT^AH&&l‹jĚvA_!V6vk{Zxmekk Iζ* FCwdex穲2qaHb֫I'$qR(b *S֪ƒ0pv@s%ij^UnuơVhH T;H1ߐ[&ָ%%rlpKG۠C[KlP&u͌Y&:u߁qzh6g}c9C8Uo Y픢1Ǽ'doaZ`M b r|'yGɵe9aAyO0Iw2myϋ_ALEq7 nx=:?uu{ =.ul AT*zqw W8Xp2 ,2铩zH'9>5ՆGaY:66PGU; sg/T#'M@]K(eq];+8.!ДT섍vh裞C Mfzq%j(]OMr>efUXZe~ϴݧ쫦GiAhRj8u5wErEXxZV @qVW/5٤: ?B?1t?z1yʰQ ]_ Qw7edC^bV:S3 kqwHj\Hia"6 IކdwhmPD$ )Oe[/Kd@כץf},֏v1 ( $j 1b0N0k6WJxhrdfoTFCK4D_DTKx*b.'QEӆVBj[Mc>5Fl~RmyƐM8o԰6iBBUBJ(Cȃy{$_b 2I[fӭ}j") [EȌ6_&Ƒ">#:h%J i|bP=Z6rPH(?$qո#R9-*/ǺO@+ʹH!3\3*&QCm`[}2UʬOQK7[l 3H Ar'E/A1; ]/D4}Mr+CaM0x-yF=I^H<'Yj/$/k5]}|^{{nÓe熀R\P'^o$]\|Ӣ-݌y5uHOUI?/Xے=' ri8iE͞ k{8W?jA+㺇io`0i_&I5Ԁ#sLk0 iS3Z|1 ) Ƹ`d؍DĨF*,Dl6Ұf1f0^א&'[9pbh.fP adIu S;GC&HÚ4YH>C]@@@@@@*fd f5iV(t}QBpwǼ/4PDa 4HsN0!id]oF4YWn6 `lP!mVw2 * `@aHPˉ\{V00.ZGځw#ݙlnO Xou0xSQ5K#}V7 "0>Tqjm(W hc*~&u"3U3\>0CntyC~ig6"0p(#0c95F3{|sFҵ+};>Ȍ ]X3|E&{ [КD)5`pccZǀ"0cLo74˨:JK%7 M@̬l d>HȀ"lhugWCo3ݵ}8Sh lzi2Z]_DO_ʌ0Nr\6>Cp>pBv i}CnCE/"n~[s3 M?PZo&"mws_gB-SllcQaUXsdAD~6! L?:< w Y󓴦O}w} F6>|vہ_φ`WG@0Ey'aB,DLxYgD^.ͅC|vKw7YKhv 0Y#"+G< \r!=mU_Ț-(p£ ERMfo :c,qh0w=p!0c;# 4{ 7h2zP4sQi>hDZ]͎a6(9vUM;Dl֟`Bt"x{um|?F@P hUvc8\!nKrss {=UQ3t"RcOĸ3'%pk۴ōm1g9+ڵ2_zjHډyPny[6 qNd{5}sRXà-@|=ߗA7ZgOn eXZ}Dv{QhCЦv သ \iA$Rݦ*"x.~|?MU59$~~GeB9=eg8 E^| pq pG_l ;Jkp 3:EM!"y~{3}f"BXh4jdsOkߴw&tj 0g:lscwbSo:Z89dDsQu^Acq.FXϻPR>=w rtC }Ƶy1PUj |(p3ZsIscGc'PɈ! ~}0Nt; }D ܽdsCbf!Ҟ"NB#j=A*[S1rYhDmhx"S$ ~8ڏhcm(4Uy?$"K^7:ߔy)Js %jE^\g t1 {'(Xݎ˴Չ~w4.8d2jصp;q~(V|ky# .~|Mgd= Rw 1h-H%#ݽ?c1!z:>EՇ 6mi3 >A \E N zfikQw}ȠB>Qam(Ҳa(q*`s%J3.f\D53ϥ<KbbE}ݸxqבbMï" mȇdu|L,sjYwЉ GPԆkFϠ-V )i܏4/5uI?xT] b`&NG3)ʕۋlsii0iL$IoDZLL>NQ1Zw~BQoːP(K7וH`_|1X!!hdzEyӏMYu=hƵӍ_{|l%2v )fE#L\z_5[R0~a{ Vdm]\N:f11?̍xBƮr#y3 kZAFE$?]"5N&ZfV"KhFD' ;qMDe۸"3 Os2os ">mB5 !HSZj/w&Xq7!b5I#M4 lI;bKMw2q?1$_DZ]"]=]?O~xp#21]|:Hi! (x提!1wߢ5MkE~<^>w" L6#%|҇b>aoFAHG4e2E@dZ3]G"A2dx=fwhGB2ty/T;*`9I7H/CHf`?F􄸙#GЙa N[U8;lG h_? c ٱ[_d2) 3&HNsQb_IקQ1_ߝMnʞ{J^7Q=X#c3.ا}K$[+ӵ*u<?H{9qb8 5]L6<& H04q{g1ABم^o&U#Fj}Ko>tӞ~m4&YD6?܈$0 2ؽ`7 ާ#ߜ];c@ґx^$%'Nbھ̘lfa-JNQBM{B%BmYH+.Z\Fug MGɬ8?6g~r1[WrQsfƏRD1A!,q_FBȊL67(Z`TϴfXd>p ɽ]FN?Zʬ7>둰w< ; 1]ɴ8xjP`grkG ,mgC)k{ ${}膑KDI)!Ǐ._!m6zO,=%skCH7fہ|KEMBc~81BRwf?+ͮ' ݵyȜv!pqhxC&rtYd\bc\eB 5'U߉nʙ5psm%{6@BG͘D@9FօljM6wٌoF!)7D@M joDBWSQݙlnL!ȇOѢ sE?:T (pfuqmiBGD ) {g؃ +=H?+ːb18FԭFY1ABD)oA W]m,j30>O=Gdk~| kÇ$xTZ#kC*i%>j.A4߳FqBi~RA8xHlVڗbs2'6 柳?$H1E}{;z7ھܒ6@Q-kq)w'ngtO|WZqE9W!#ʣq>{_{2C &-sKO@{VZAhahq!%x ގN)63]8I|=D j M n7qF+ԃ<}HڌjNĐ\EQޘd_@3:bןJZTcr5Ll)ʟ(#hM*NG:WҸ<40e ' izYN%.nAՕ dP=FiG[wV*/|1p<@u%h.KǶCd~oSCxMkID~͵P΃AuGzڐI&Fz< >ioF'2d"xl1i蚐ۓ?2țc&|9wZ4TEyq/qVzFăj U ڈ fg!_Ϫ46}UF[_Re $VҀZ'#Dw".GUihT\Z,Dm=$)z- T) d1UQ܌"} ͥsQX-y5 S`!qfKh́lD{f՛J(|*"F?姭$+E(ÛDjs{&{Uю?в(KME#xE<1{dor8'K@A-kC|%W(LjLDBi$c4 m pϣ(pNG"-w *ĈC}+q`0yy((ȦV?b?2NwHg:, z`;R9z^@h (tDTl|`_Bp|q4?LWT{z`ƣ0o a}DfuEyNf6j !`#{#R5\Mu',XA<o Fd߆JesgBlO#.6 ihD7Gz1{ܻ$BYa#C`m}p[4~B<}*t;ב:OEyGE$q7J7H5Wi3JBd zyh0yRb#n|-ip܋hhZR|P|E_W3W,.6Vv0'R\D>GvjlC ]߅3;ꠅzFE]vb!1qp: H}!VWg"sIΕ-D^^[ӘS b{"*hhqCuqWR8@o4]5|Db0&: z5Pypg7߽LlAs`qΏ_Zu3kB`dfAiՋJ ,~Gꪴ݂q$ Z茤*msѱLS@&!6WoGģ'E=HJzÈYZfw 2KO3n.>ќ=Ө6E<͟V]QJȶW!M;7sm-Dp1V޹UqՓ?_IRx R]7k3;#3VLss5l1TOŅ?f3: iK6Wwayy 3EpuaHiq6vo2-蜲'QL݃"la' ?'?f)ځHrck}cwӼs^B¦<oЉO!#?%pO" DL6ݬ>ۛFjm#@8݌y \et(mPzZ"x<%S ~L62S=:ܳ gH?܉$eFȚzt%!BDRf h]V.#ps7x{>SI#A0NB뻗р GDiNoG c/J a]fV"kD4 c|$4wRhs}KF=qo?{/a.B0K˶iJV,QvD8/B]{G#V6c͘b3 (3pԴ(WiDD fS8NKw*\-^%^[*\nCÈd|y@Tfed,5yI:M%0ڬ8 IS~kH $X;Q/^Ť}H gD{v%| u!hd+H懧#Zai0Tޝ? w;L~oBw IN$ ^|dN@{1͈h)i*=c]CT=Dޏ|O#i׵_@ZDUߺU6smy$6QNu:2].E,d@0 0UD5xkk"Z{LJaԫ/#!2AZrmC+,_*d=iD_Ff!qh]/CYyUy" 6BN6֠zJ,hl1d (0Q[&pᯐꣴL|ʵT 1Lc2}"Dl"b 1XY V f x1~tGte|Meھ_34o;Y HYvgG8#nw؉ *«HNVOL6˦@ڋ'b#H\Ouɽ0ˆ<6]-~ ڋDQ5L61~`ma {S}(9~Cl.:MNoCEla*N}ISqyd٦"n;}/ (C T41y,@RBw͛ks;̽rE0)0`oaB!xkG l{Abd?Ly뀀QhXԢDaPss 4Pذ; 4Zxqiav0/yu4blQ9}:!2 MqG<vXՙ7("F~<_M"hr(#KP&t!&a,Fo2Q*O* 8q0b0'V#ͭ5?)P||2׽/D|jL hޔ :BW&$D .*IENDB`PKwL\H H +updraftplus/images/updraftcentral_cloud.pngnu[PNG  IHDR,?tPLTEQfii&DZ^OdgG]`^D[_am,j(k)PehɰJ`cLbeg$dwx`ecBY\Xlnr䙥ZnqF㔡f!ǸͶkq2ﴒThkgM{@u7o.v}ZTx;лa׳rĪj|~˳w>UYy9PTꡬYU ̾ƽ:; IDATxIo0?K$-^,? m@}V$z@UsO Nʔi <.E<9999999999999999ԀWRk"xӸV=,o\_8;"o{s*K.P3)"V!8I\p(TAQrzQxr8yAXwiyӤJV{H&}-X1 5*!*xX걙g†w#?q]r@)9~Ga ]VjD𝹲|BNΈ\,ʎR rJNc4MXgQäp9!>[0 #|<Z%)9k/BKr'UaHdEt+sZA7*LÊ(?] vw?'] ? fCDXIB]N(,5'hm|<'EP} ru#WJnj&9)6(GMnZ<1#6@r s/ `fX(:IhOrCWj ~ĵ0$c9=aJӭMCa>ޘ80MeȼɌx:7O(Pyz}kПĵlɽsOgb?yM:Ξ.⯖fcO)UsǏ'2ÇI'BܵTqLiVFwӗt&TL36hFCEn%&џkpl&m\M&Ē?G^ n ᗔ PיAĶK Ե5vƣAƠnm16mc$.;ۆlץ춡PWhםyi}GC|<=3.d ͞x2Tr4AA*MT }`0lLt5oQ,7=Q@j 0˧YhMnlh5:u,R`p5-yjq4Nw%kJ髮Nr249sLq/QN1ښIPt`ނ_O)U8N){XER5JA>F:)Jch\ ĕ!* Ėg3 f4"㸙[?>.|B8^E/'.Źzkyw[7*p4O/ZOБ#`cxDqL!88888888888y#dFQ[Xc{A1mLsMmGH7eo? ,S!\x?!5)xTh"5`$`R>v[#BqM䱢Lh+~ >V Cs2"NY hܷ On]u G4LA<˾qR+Mɬ.5saiϸ88&5;`,]+X>ӹ8[0ge%zqġ9WW7*|gtç1Mqp`Q4rB5~\ZS3wuD=M[zf̄f(9הp_a W7YHq-W7|MKk ! [ɔ%Fԣ0[%&_ 'CZ*^T$,vOG;ۓ2#|:!QJCAAAAİIENDB`PKwL\JI[I[ updraftplus/images/backblaze.pngnu[PNG  IHDR^1 pHYs  bKGDZIDATx}xTWpҾ}o_k)nBPF H;n Hl5b!`?swf7w[d aLCYaD=~vv.6lJG٫Vn=02{b{=rQR{ e\G(rGn#Xjooョހʢq#n0}v`}#&np}'OUF,Y\HŞ:ܾ9~!J, 3vF!rq\aol\R< }A~W܀!o(KGleLKKV[U;RJ_Th*ٲ3LPx&;عhfl} V2h۶+|^=?swvai6ŝ:ݖ.qg8wlIrw#̠sؠIrsr֊]7haZp1̞=7n3"Fi_Sm"DC*Q͙3gp UwG#`UNt0T!ك@*V/ţ{:Z'54iCFI:58fhfˈD4mX 1{[aHOOЛk_}Gyion_Y?%f:+H!K E=q,N t4Β+u4ܢTXk驳<6Bn6%{OmjY_ ;[ iJlPde "P \x,3T iLV<)@Ѷd4$(Gve b6 57Iy6B}C*Tn@/#!US4oq9ً RW(b %y`܀)E8/#wm-UڍM 7j!ͬ䃛NΜ%|8/MD ,Y\g|_cB<=7?;痸xxXͬ oV7-o"8;=Btt\wTL'&&vBn{7 X`AVf._Z!zCﱍZtXXXS[oZ7`]gh0+Ks9]P >M3|ǎ};` _ȶ 06FP۩~4iC ؽ{Rv1Yw֮jVK-4[/xwfUM 9E:G]qgmڰՍN5F'{,&K2`tCر& r/&PLgm{Ri}&,=u+mZbg6u}e$vhێYEB!XJc:|gg]m8439zRA޵[9{@3fN5c^ 4l8D$]㜜Z'Oq UO IS f4l6 %EfSäέ3ځFi .[H?Ƞ|'s64;i~=>=SL: atRM_A*S\.7iXlQ,[f#<ۂoB٪})J4Ϟj*{*؇L ?]JIʧtA@ܩ=N;;u _L0$Ҽ_mpf͞vQ1r0ڙ׮*IVHQftJKK;p;v cE)`1,\e˲ӂX r Tc|jcK"ݡ݆ceݾGjTuji{%C 08^Y5St,{@B I= ݮ5Ơh*fC3Mch]i"UR*nr[7HoիW-mo^i}GLUhW.gm4O,Ё9ٷj?.yd17s,/sܰ/,SCɓG~o-7-srrggvon|_1sUˤ$U.c*I I:eah]IJeje>WD,Zi!"փf R'x|a+вN15_dUL:u!qOB6cş0,wkUf:)'!1hnڸ*48;$RD#M5 ;ibV*n?9f0L,B}5d\|;:._ʨA9R>hnRƬ MI11Sqcڹdɚ3/AڸBc ~/$ó7F >F6$q$ʸ=^smj9U6Qg&",n $hNxЗaɽ1kɖQ̤ɍW

~4tkmG5v[_"Z'ސL\@ &Q OO_iR$U !{pI!$c#e )G'K+KZzγY&*f9la}t\E`"#,UfedZd\D#<922]WHé {)xDCGzs=i 'V֝;w=<'iL!RBu}" &[7?fhaayw|YA HGJϘ{>x^&!Y ^ޤE"Y~ DOQ:mf~gԈz')Iť p&xG3XfGҔK#͏0ɌdvSEr-Eqgj $SCyEH9'A2Yn n+gfvT(Wv}1oӻ3ΉP=gL"rIS:F2Ê2C)l=?-g>NX(4llU bi'-?0ɏ]vT>M#,ׯ&Gf6kXUPPSk$RR"ˠHP!RY#VTTA)'νZ)>|EA7i So3?dҡ+֐ޥ/TXuj"!*<DDh|ͷ8tb:o׵v\Ĥ\vUΆ1 Es;u09sqK`SuhoWƫ=da!U |31&a:mj~&uZOՍRy!$c!q@V-aڶR>,"zIw+OP0doA1urBhMߝIxtA$o)B8O҄DkݚRаD&^ }AI'^ ?o^e2e tl@3,>睈idhqR|?2jTU|2i󎏏7B -+WnF#c@+|Dd4G®={Qaaizݢ;{w䓖 ̻c9ظ~EjjknٙYx^]dW"1&&-Z"soA&3&RvynnI}i[wOE%%o,tg~~X)==̈́dqr+֚5'޹_9 XFQ75 ۥS@A(Bd#I8Ys1J^qƗ-8F=d۩O&@"J7 }/9iXCc;HRE /Hq%_/wyA췰[z 3dZk,7&<Ga|gC} zBfgx/8oaOہLx:Ҁ}G.AN.g5P6qD9$ЈxC(SH=!wl /C]B dBG&n*WxIΐ&$Hʸ+<x#Hth֌SewH?2C]I2Eҋdv@ǟ3SH٥T+=2+g^VSv "<)iTi S|C6jeY딶U\3##yVL23"\ R'd^[X$P6WxE q9r"OH{@Ѭo6@9E( d<` >^bĿ+D^ZWB٤( <#<e'Pط1߃PAO2[tC P0fZ"Y8&dΜ,yea\/ӱ#GkeLLlˤĦ֬EL pv*˯4Yԇtquwc1 dSm o%Ln+qbݬq'2q#ߍ M|2,ցwԤx('JBF=YFvB$;$Btn>g]ZYM6ͬ+FPжtFy.7n0y/]hyպi3&-Ӛgee jR[H*ݗHڅn֬Z1mvonrkO0OОU&4>CBa0}L8-wXN^ZHT/ȑcJS7Ҧ+4<" 盝}lL3H9*5< AY;a7_ID#+ع^NdBm|>n2S@nt裿ÇՈJ4*VkX݈ct)S;q<~ܥ&#S}CJV,[`C2Kz=qq81|ll5Suxb0}XS},9kQQ5T#ًT&\,Mi"g:E wg~ h>[O{GX,S.e[_ 'f!;+MʎieCH65f%zQzY2BCԟd8]t*;,{sG15B2¾Z5(0uz򵳦,\].,UltL֢i!חPp\8Sb&xTk+:Cs7J߰=?`FlҰ9']FMZX_,en9ֵ7CCi:0K̦dcwY=>ʄU(! I8!e=|X23(`t@$„H6sGudVzKoEXFO<7"LKbC(ƭdM>=F:d6!ѝۓHrd!;g~2z*:@IIeB$#3S-Y΍1\$u' Dd/?$ GzΝ@~!d#:Rc߯Zl F*ZD"a "D"-~ACܿ7ݿ?Sʹi\+5밚? |G =,~ r Hҳg6e1u"pcO(Sָ8]7=$,o޸sUC20FVA202+c} YzzG_(Rbb"՚S  щy*҇d 1d[ӂKn̞X mE8' >Umۭ vjbO\\M.OE0ùsߘ5s^"3&N^f* +ɖ,] eߨ/.Bl#>;s17ٳS֐"3j.TXhH6ad<&Oj0-]O%dv#/(%[F˔ a@eIbwk$>ڠ{>'͞]xS v8 )Xfu=!&P3'_}PN/uJ5s*P~4m<$WGcݺkiOںRe&jeKyaވTlmI2C2vH_C1c='Z@2 r%ȡ+!ͮ=H9&i&B{wk$cS{ΤCklҸa#<6n#ws]jty$ ڴs$+;l-޷nҔ)… f#Y; e&i3!/Ю왋Njn>8JNDHVL8y{b+Dރ ސ =(,(-%du\Id0Q, A6kMomɨkDY)0ap*+pb|B1֯_SϠ@#VNJ8 /߲. 9<<{Q$lZ _ʏ/,I5B8;, 0ǙU7b8 zO? ]c{""4!ݰ quStj'sxSHBj& ؽb5dFhUw(LLzPPgHFN'GqGd޽zݞlXf~֑Dd溦dX߮uټe˖ ei۴|vQ<3f>>{8"F9k#71g츓WPk$s'7$X7eWa<T!%d7~b=q2>$9k.̟_Ԟ`Ia&u7\|ί);%N qd;4vfT'8{Mr4i [(XM}jodϞ> L@DSu޷hš֗p lڬrP}-*(Z_*|\ds7flU=bV0 5Gƍ)mڼZ!aԙU  #,͛#Y*|.[xx}ݙ˪T 7OO_*/*>ˏR$Ju΃{6r<J_4wY,]Jeī\\$[zCBTX -|}ulGW\kWk$S6s#c˨U٢ tSe HWhp/7c4l3sѩdx8rúmŀP9"lVIfϘ9;qmC͢5IVz>s`"2,M$]P{s$'·pmlz",W"c9}wxlFOns{$ Q-ED Q& 4ӓ|&Plm߰l*gY•TE2BD^#H7*٭b'H3Q.n V]u§k5ơuĦ '!kyAOD+n|u=fϙH6+HGYU6B#/R28*Em?my%HFW~**C2im2ÆiμUmgdԐ\M"[}o7oނ61_C>,D9Q:zsِFR;7Z4֙LJAk)vf(BYiv^C*jEJv>_הRqeo}3$&uWуtS ٳ,1ȣc7rH+W4mXEOW^}5y T.5mrL';<}ʕGN#voeek&Qvaŋ^Gb9+C|yĩ[!MQ՛AA!kDD(l"YQQ4705V&v2eadJlZ{y-'lάE/GLd'Z@|dah}6m>+kk{&7nz. 53~.]UOaCd!? ]i;QߢN;n9azZ3@sj\nXrKRw h& z,Wn:"%݃Ckdf͞âd~ 6Ֆ2jѦLw$+] oxhSm A2Ũ9I9S,rrrzizSvfs%P/^JKI-'yy2<3=JsrSӘ&f|tzV)Ci措WqɣX9i~{7Ym'}%%-nSJ/L#h$)OLL.ͽ]W3oL/vEEwz)0-ecjO~~]&yfv=tg2 t76 y!=ܽ8MoR[7ȟ8rOcǎNw")ɮeb<0%C{F"Gt𺰰( $dx`lbȰ:ft"v7 +h2~at+Ax4b5߻<@~'$;aS8QP- %7jJnuiz@=HbspRKgyw%E/ƍOi )A2Tϛv EjEX| ; o6L@;NJ?lJvptBդl:۹XJ{LES'~S4qdg.Ɉ|N Q9(rGO{:d {_q#-#<<فӌ0#;۽ySg<ßHA x퇼i3d}J$ [CJOw&<<4!A̅𶮐c;G%̉N< E9 XJ+HΛ\A)]^ȴ/^x]lP0i&$:1[P*S@`t|O{xZCxFݗ7yUE΄`9A PHt%Pb{"yի:9 ,aiQFh rQk !1yxlx Qߘ_N!CD3ض ֐,leI@!OeJ|Ɲ,:x*+|ȉ/r4 (ocd|d"1nj <CѲ51PHfդ섇a^<ͿqPQ#ȵ߸DL8zCƭxWxhXc h* H d̊I ϿeK>Y.O=Hxp::q똾3gi ͇5V֤R-[ fΘ-wϘQ͛N1&)z~N^J ޵&s5=Y/{O =8H"sȪqdL|ڄ 4,?ZMØ4k2EU1}¶a&M`nOBB []Xx8pF[7n0^j/@&t7h@a ҳ,xds '#RY2z$"gC;[kg%d#Ztd06Ѣ46)gYGwI R +{Fi/dn?0ڹc'nfbHQbat mH9:tD}qT-!7~xu]LƌmI:KBrŬyMZƆVkglC $ u g+\uwH AEojmϟWOV%c~wBFs.ȤC5̔ .No'J<"$7_.]4 dK7zVM vD:諯hх!H"~R>]B"F?ᢗ.] .]q)-}!dQ Pah;01FNM"m0U" “[JyLbWHuڽ۷I4&R$"Ѱ 0r K%D-E 'ig'd a0H%pH7]gDݱ zDh VD"2F肌?_ V\CäXQKa`FϞ3 c]飇%'[9J $XB#EF42a=zsNWivhԁFkfO2M"d'`5 5jOv{j@ZfwO}Y!Å ;bUY iiLJOd \[+P&j\GaApiHd^1]APP%`2p">cw@0?v ?z~m*׺J˖&8#F%թ'NTkB6/|I? \KD‡!!#˟8M"LQg -HHR_%f ) f 2V|pHy!7JB?+!߯Ruy%&&UM}-1CԼ<aëkygV֭}M*(Po!]|WWgi_P,Y ~bBƍÇ! ]@.;B:3^=@J /r*cPHu]-IJ'c,r&< Yd $T箝}W,cP/g> #{8q¬lڰ1]`emPّ͆$R!عc3Oz5׈CmMYI.u=CX q-h{d(umapj "Ǝ9*jc^A᜽0ǯn~/'dyJ:4 먖4uTBc ;w#ڵm'dy.]VسY"F,f<(9{޸quΘ1BD1X Ue)>/%Bզ{^QiLm(GfFOe) ⭛߻3y:ȬURV۹1Q`2+(wS>ifɓc*Ԓcը(hCgΚ._iP25(777ֆ&x9K+2m ]d6-Rs JYF !pHM ɍzVu% 9?m&d\l3k.7Ͻ>Æ^=?CG =4\KI~Pء#hћ֟^GK:%a)k7ɘP]ʞ>nj1ޭ[Y`q=g)Ccf{oB^{)zGب:|`EwvٳⷑJ5NCDeluVRwF]( RQB RRp&Ҙ &υ8`&L9w;-+i^|+ rZB*B|;[R[&p}4{'}˧Ԙ)! >"e$)٠1pthn$j"e8p۷m+}0}̋VKې1ųꅲ>baQ%Gh͵­\8IJw?vVV dyyuٲBC"> 'M.Ϩ#?h<N>S'swQtڗ]~Ae:]MؖtԄ0*7R,YgNi9C^AT'!Pn 2DP$D"9 l/(˜gW-? 0s_B(noNjߴ9<=m5߿ OqQ]-5x`OxS4{mƒ/zz`01W~#4[#"AU-GO.,o2Hȴ7gsB㟑%%lٲ" 0pP"||M2n||Ϥ)}֬CSq%9]!LAmƌgx(ƺ,LP͛,XNy%pR;g!s1sI*}|Tqqq{*+IVh :gL@]Xn<+{aSB6vDzgϞqOH*-}>51=ѣ'1[#)NaNE@eLj_lFe.\7 nCF ͽ[R7_W<|9A} 92yr+Eᦝ#ՙDV r Y ^BVsdٙYZzVMr=|X7iڰvԉJb "12ܙ-T_nmmRӡt3jȴvU{d\{!9 b91zKaW}C7y2*-?չj6Ο?oqv)Sgh&3y*!rõV{;7QH\""GŽ;wS'OJ=n0V Bu舱pk,B6sd {4BOH91k6%+6(oxSI?ހ=LK: w3B&`ڂԦ#d?|sjȶ*dﵡٻoS)[,F5>VB7]k'½"JjT% JCG͵| xP}.=A Am緉1l6b;.Y2IJJ #ET륣 U3bbMII3XףG3ן~ڦ5J!$nmGeP{h:Afƒi@޸%ѳB~*f-7  .(R7աDlvPvK8͆_win[DN_VQ_swU OvG /FD ?ʄiaca;*m  U6mM11w@OoǎFPE(L7\rzMa3DiF3f`{Щ/BV1NHH<5|A/t_r-dddv!BqO+" nj@lӈQPZZ:[OMT9 =uZh9ܹ]u~w&U+Hr@sy46$f Nܰ%H:Azˎ =2C^hH4*^F2SƌR~ du +Xyq /m%d P qS'OO8);uZ1<~B|`+t"ƻ5Tvvx4i6n'FCNڽ-)S+d򬴔lrV&'I3RR9ډG|(>hYi\"kl͘+;6|u+;[9ͿzPcTz*,$5nZjhМ %H=!dmKRO+%c1⵾&ż$h=¸R/m*C}an+W~5%dQ`C1tI=v \@áE+:)Z 4k2  x$"B7Ibg&lK^VKGnΠ&覂Q>mDH$F-U|﹦H`OڻZ+wob2fh(/`\mvhi,ɳo>w 2 u$)}ذ=?C_}Є;C+>1;, ]^IDrAD7E=Fժ B`$qcQex)+{nUV i(N9է1Ձ;)B,/\a3w]e?{~Jd22HfϞ[+B>c67?3zja^ 5Țb<יd [NO_4(+Qo؛tesd)Onfޠ@SQdZ$ Ć&eYSf?f6rw1GF5Ż`n(V,qNзWJZoVWQ"gw.]ĻQzzzKLߖ,ͫrlݴjŲ<whG_nKBD\YG hMn_ 6< 4ւ(XWLL޾69gbpT![MT*eo}M׀ؾægg׃ 0/̳f<%~޵[& ߷OF=Ƴ_303V,_CK%6miWZ6.Y ~a( :af m D̕^[.E&v)4Kޘ]nGtwj '·?BU0k~ OxxЕxdW!޳H^bI$+7DDB E՝ds-YD7Hېzҿ /Gx觭jV,(wd\ 6uk4`,1G2uFȘQ*tE3Gt[㧞b<&zt!P㻌L^hNDjE[-@٭+dvɯ@L˫yx6k\am5|~G쁂C uΝ@F$d[wb;!oxxHm$A<<nL"7w+7tI؂dPĩق }F1(1E";cX| v[="ޚ%qQ-["LqEVaf"+IĦ"&BD)+Rn|nbң2ޜT@`d0l[zZ ?KF\[fFf_nM{H? }_z=YQmv|c34 )[W%I Ȱ316rX7(ݝ ⺱SӅ|zfšyq_0sxpєqyv\7GSa؟8"Q>j1>s@7|8ՉŹ,߳e%9-$H*P*@#`l=p0VHiA>@ vjP @h'@8 .:n``a!2D UH 2!y@PAB&*: :]B=h~L2 p"΃ p\ u6<?g! DCJiA^&2L#PEGQި(j5jU:jGnFQ3Oh2Z mC#щlt݈nC_BF`0FcDa1k0Vy f 3bXl `{ǰCq[3yq<\ww7Zx;| ŗ]8~ M!8Ʉ*B !HT'\b8 q$C'bHBvay=+2Mv&G&Ec[ [bDDĐ I* Zc0&8(&iYH~Ho(%46h0װu wKDŽ7EGGDDōFG7FϮX{xULQ̝:+sV^]*uՙXXf8t\DѸ@f=s6'~_ ˍ̮`Oq8圉D]SINII\7n5ewrm\J`ᔅԈ4\Z\) /ד>aQ1n3|?~c&2S@L uYY5YoóOHrrsNy};_-cZuuk/\?kÑ)*0-(/x)bSWr±^$E[nEmnfmOk%%%JY׾1ꛅ ˬir]+wZiYYGgʿs{?T'U߮qiݧo۾C*זԾ?=xΫ^P֡ 2mjTl,ixwxHȑ&JG˚faԱc7sŨZr}wN>8(mP{nLGRHgT)S]]m?x3g]8wn| ƺc\x'ߥ+=/_u=wvWO]c\n}Ϫ'l:o\:xviMoܺ~{;˾;y/Ylx~XHQc?:b=rf}Icda)iDӤ)ϩV<|~W_}oοDΌ\«ï-_w>~f~#zGPQc'OVe cHRMz&u0`:pQ<bKGD pHYs.#.#x?vIDAT8˭=hQ9 _pd < ;+)gU0 \p(ЊyhE*Fu+H;o. `-2+R d1끍?*[vx]}eL 'or @&j_\5@Sp9'p ?ym>ps)༨Řb/:]H_0tzO5g$aQ{r>=3J#}hڇq3M[Q EZa U{Oy}vl翈 } >p Dm)eL/vL"K9o'u*.4)b IENDB`PKwL\YQQ"updraftplus/images/padlock-150.pngnu[PNG  IHDRKAt pHYs^bKGDQ5IDATxZ}lTY?s޼NgveٸP(m&V"D\J׬_Q7q51&FpMt5 " PbE- (%Ж~>sg-3iix뼙w{ι߽ $8q;;;u]ܸq5mCb_ܳx;800Et~|;26<Ѳv]GmG(4dMCISB!B&zhCCòTsS/^<߲,v#1;wZ<+g_hn=w_d޹s8{5k#GpŊ٪U$ɓFG )8k>cBSSSJ++z {3k' }"1HHRv%T pj鑹ɥ3X WNkse[Ô2HV'wR6a(WqE%RBf70 ;^jD3w|@TIǃՇJgM~p}F+Q@M#=ɉUunƟ'f.xvf_5@UAXTPR* H"kRVets$)1Mc ٢l.弢FFd *^J\6n:upp;そRв%t WFy!((+Oy^rWFi&՘Aiwp,[ .\,ꬤf1WKK01JZ_VH1L%8P-C9m~%8<^Zz,kҥKLq+jŸ|\[[*%K\C( /ŋqͳ{{{Kc{7n,("8y2?.իW.\555rJi P+Lϥf ,+a.Z'ѵMTQmQU}džus#z@z5:s Ѧ,JȎ ڗ~dj>`<}zl(fx}ކt?H-њd mkBM"^80v1 9\KdRHnSE.%zBQٖ[ĦgMv#V㼱 BDN"J>$C0?O-賗Q}1'm ;EעJ4N\x'GݒF"ND0{VΪgG)hSiŘK# Ȉ=>Sl ֕e^LLmnO@+DrtH#1ZN80Lӫ&UOg'BFw pO})8p z$Vߤ#6x45Kd){Q1i $545.t`"xZFfF#Q,yP"P)P˂!b ׵PB5m6̙3:_h*DZ#,T @Yxd$I8LEfi0 ETx:FEx0M) 466V9/_v V8Z'5FqQhs*)葢򝾗;d@j}4{ir!d_3h6mڴ }v8vKs:A" 3Ǐ-!Ϳy!qĺ:{+)O X  >h0 fm=zf>usC±7Wyeڼ#Bxlٲeh |}RSQM ?IԬ"?} _4]r;m=z7{Y}6.%uH͌9=p`ߺu 45'X>?cPT}Ҭ zx޾~%ݺu$-9w܌ÀɚgDSB'|bĩvJ\&D"Oc'T1 sx/Ϧ9SƢfPO}t,ޜ'u,T$PrK;)dAA @\/N[D0iӞvϟO&H6ɨP:n"Ar,`j8$W+| TR7Iȥ7YOc9Mb"@\9=`D^@yy9Dpe5UH˲PsYI~@P>p]RI&l7}Pȣz6V"f0J%"ϗtHIب*~ofZZJQF),)51npaÓ(Qy#0$_ECxh֘"aWE@wС;߽n]R7tfzΟι5,KYSY@IM6 .k f8nsu N~aļ,`w]pI_|lP"1qS9tX,o+Vf'HoCҼP-&4S~C*XBA /6>0VwB;9h*fS V"zM+ n Bo7qa}@WB1e =ɍM*KG0k%' KaC p6XLV ~P4G'3:+Cۣ 9|SJ g̡:Y'Gښ>0?>.J" сf9hȕ j i.TK4X.M->O^ 0t,y$~N+M6%<43kg*3U`번hZ$;02Ì!yC[h)G MӬ;Xj YX#l pADx~GI},5"@pu-kή"Z*`XZ YATs9<6~q/^{?eS H25I4!m"eŠJ 1/պ+T›*,Hl?.{%s?| -gz,w'a)4% Iw'T؇\eƈЬRyqMem5 0 A#g iDڱ:zL IݖxZe~Ŗf>Z5'ëW@,˪RZ$MVA';wLN>'ڵk{8^U6~{z(lvޭ兊=ql@݃T#ˍ72-'N&&&>%JY[n=y3m*V:&w$ +:\Wsy H[@T!+?Q>:496ٳgȑ#߾vڷZe8p  ",2vMi20yQJ;rw6?Nso~ :|Ty d|5?ίmgJyz 2c m٢cСCM(oS{N9sf~s|uOHzoR7G+Wu?KwV_}I߾}[/.kehؾ}/ɈΧݷdvg~]"s;Ti.\˱cǖM[͢'Oک)ׯ_/{O o}ܿW^? b1D"*+R3;wN^=~BϽ{##,FRQ0*sV;u6*' ˹m۶Ǐ[D׮](=FJ t钾PV~󋌌X4ڙ|AAڲP+!HD;y^vQl', QU]1u5Ep0.M(r9b~*yɕŖiє<듐iQLqȴ-Ob`)յAW{.Mڽ{ }҈~HGsd+īPNT,BzGăֆW#zW-{F|LlvɊ9%5b9):M1yز _z+5*9LXQV "w(Xޞۺ'I%Q(2`GV m(gPZ5:rz>7 gΠȍ nh`bvl_J25.B $/su9Yr\4)8&⶛>\rH^^k+JcEg@$c 8 @W i%ҞVMɲ榚*/̓CBy[Lё&WB CR5I~ JJN( 7Dߺİ#41N6"ReKb3x"zIVK[:H{zRw&h5%C'rEBs/DvGm" +Ϋҩ-H>܌2HZX.`Z* ^嶔#kLs-tF"W + D H[ 6,Ё\ bD]Q:|'/K+""<q-)6gWkbS1i[;s lsefUE'MRB!H =ehgj^y:?7q9+=A *ґ]4)"z]6(bqYBLLaØFM ŲAQaqZJiYKˣ/vf̽sfa:f=w;}G = d@#Al VVbQ][g q%dB ْ 7?AEF;-yY&DiL@Hd8Y:1M\[*U!2LfH=[0ٚ? ʢ҉VnB =a`-RL='!TT,*zaY +T+ZZ[A*(c_"m$P<g!vG,iH)VhJc3x;|ႜ YOz5%Ѿ $ZwW ZEE0fi[ϊ(X|DCK$R]Nl(OwsXQSr}Rv/=2g x%ɑTb"AհuleA ,"ů [S2u$j)5>tEL[cs,+#C<5Y2T^ij5b( f%jwK YIV%)˚>rOOE^&3 :K#|uPY'M򠤡8e f+0J>%49AsqR~C-:JJBbE%a4HbY\zSlgp, ( |+-, ?0tO`5TLW&:^ʬZ%|t6C@Q) kTQ5AA8Kmy԰>t5Dd[t'PYQ'gjj*F!޹pBIao ɳ.=lB>A Bl%,C!}ں)G?k񣩟 V 6 K c,ڒmpr|3CkO1ßEv=y߇fHeț_E,Y,繧˹!Jkٲe+W,e)li 6oLtjmm!|(bzl_޶m544d!x[[[&\f-+@ϝ;G--- [n}yǎJȳ@@gȈZ#PWWG ,s"aO8AxJ[޽{\@Odvw޿. )=)*ࣀ#"N/]H1-Z**++x,?jj,7JW˖ӳȰ SGPTAwOMG&5~ov59sе?a^}g Kfe ]v5 ~DžwhzFx:n8ꊧ홌MxܥɤRl^ȉl_l(< aY7:.IcWGqchnw֭[3X0vH#ѻ=GtЕIzo=£m*;s 9*5g ;6lP?|1ҥnLxyիWdžc.KG!OcCX9\GG,T䧹HE:Ò:K wW/^,;o nq[(  ڵk,4RkϜ9#sV.zX#ojjBgX@? E֜ЦѠD9Z*Jì6%x|MX:CU3G`c9h%)WU\`-9Ku/8y$V} U ?sT"eh,ma>UUN[ё.~^`ifJ~*p a ̫t',kԿyVdғcn7%k۔Uo餳ݦ^>cš΢ee `c|:fQ~hSVl}VM}ׁoܯ]VKVa(=pHS)܀G= IZ"*{KjU沖ΌR5Jߡ0rjY2ӠUTAB6lu+e BQ2EZ{3EEl~U&(6`ykh:ӢݸlgEy${RoSzFIMnb o|PݢK)Ul>OO'SZ%!ρbC앒B g;6\P|*[AJ%T;ϹN3} ?`0)R)Toթ]Sc|jIJ*R@%n@=a00TPeԿVGk(H9 ET[Z5O׀Rrٛӻ"h@Ŀii lSjf;Q\:=~ |xv!,@Ӿ$ŖLEA!I+񥯕 J'0xinқXJт&ˈ33<GW 3K-HuHR-/0#|"PzX- IVx! Vq0VL2NVbuY_^ڦЄ`=K(lljTM'47>K,w.=RmUgsȍHbȘHL ΝiG0" CWUյ}jR]@ʩGSUgk[wsn4gÈH]l0WTX=w4]|Ҋ5իBk`?3'3^X[+MK{ W׼"]4*UU'"W7x<.vsg$/t3‡k׌O/=Cnjsr0nhS-L MQC ?E hfvu@V01˿`NPJ{%ñ}Cotkϲ6+ӽl$>)Q`8Y G:h165 f[B% V5e>A(6CKdyd8й#֫e+HL[ mQ뉐5 q܁ǹCxу+Pͺy˲!`qSOZ>Rlcu,ۋn{Y&{oM6+g"SIBOw%?|%lTYvt׽[*II3aG̀ێ:<AsxZ'?+mlQ~V^pN{-i֖`]Uר75qNh]N=].zYI$2lhxD(+GrfJ0rx77̖3ƳH0hR+:ȼ~\^i/p}#e1ƣcɕkQEp(Ĉ'TT]QX.EU [`X1z9çd`!p v!c.T)W,ڀ);TƸ LPߌklUIFk" b0`\+In)Щ^F+עYNj|!Ċv!Z °M5LJD+dð(+!h,Gj[{f1@5)lId-"n !֎n 6 ^g>U͢WK+VE~X%aZYl ,!b -Z-9ײ37 AVeYf݆QI g>]N^4@U9}qZ䃅 3XF[jA(f%u;uN8y)JVo>Rne6BR\!4G"۬"F%aE,BucTiH\enG^bh#‚F0SH+RM),j}^(rJ5 >Ƒo;xmLy\Es> bzd- C4iͦ17DrO,yFxIP2c:;hi۠9hSHnAΜ9jG, _K53cԖuM?le њU3攗62p҈?/(`bU C_$l ^= | E?JymHGNUk ֚ZEiż! R5޲Lh ~OWKЉ-'\uL~cs5~w|TJfZ*T/s؃.gTLN26 Epn/Ig.R:{<d,$ V/ɦYBRp!ǝNO%AŪ:cD/x~Z e"Lq0-fE,iILw üamsf3<[FMcr{J_|?D@~4tj0T5jHVbBY}iqn l37X8㬪K YaF hmtNHoj T W-%Cx^~{  ͛ݻo߂7:RU-V7qMf[AKUOШ4RApҢlW/p~(-wg=Ʌ݅G<;(-.\ɓ')" ֭[ҥKCm0d$ ocܳ_ΩA WjHQX}`kO0VJ|oDF)K3=mky]pkxak2Iܝ>M;x{|vkBXS9FQݼ{58AD=g!Iׂnۉ:y>m+_# >DvvfiiRV?F<ףhT\Qt@[<@Xm3lwwwQ#Y1=|0}HK.Qex@{QiI: DSlC²#TDu?o~%}I/8}k׮:HQc+*!/*%&OE_&䳝"@оsN( g}ֲxG,:i\sdcF-wgq2 \~0ϟ?'`B?KSyO s:73{wX. *T*BFXlsJմP6PO-6g!;zh-]]]7=a}ʍ /8p |)+}]);p (fPH/Bf|bǠI]|`\= eo6@$q Ex P4YCZJ.u7{cە+/^H?::\"焰6m{dd(z;oMQQ.4U@胸vy,_b_n nuLA#TeXBVU.6uuu70EgΜǏ>yZڽ{w4Z (Lө u4*Uk Maׯs[O6GeNqEiQAב?mmmA >0o?tCkGGG3[n= D  tC*o31J sZփ^\濺7m O,.a(T-_!NS`vdhVsKnK^Cq̉l>%gʪ/&s+DRj %2755x&C_96n0>7E03L-`uG7{{6cvsT'(Y~E&@T`&ҪU{{{Hnʞ,m۶MB  Xi6]p_n2 m|:;;Ϟ=+XXXwЈ+5 -Ŀ;qEOքz 5R?v{vpo+Wj 9YN!; ą!}v{-kxR H>ǹ{Nq>b( Ο?_zͷL۽{FGIRԚX8GL&0V oT{RSwYP!tToB@=+l}-Y ԑrvd 6 !&kƍbY/x" eʕ+Ekf ZV;:6C"ΈG޸ :TP;H (K=7BRbcc+l^DFFd}zOX5a gowt"X8@r#pّ ,̦ qV{{;zZ,⓴0t##nB)ϱ2c嵙tga! _OqnB>-tX^{8%nX'7wB;D RФn0 ˁzzr Ϟz)β'-N1cن^{rtcf}ƫ 92"0ԩ+8)9ʤ3®gHوiɤ4V RW#O-13-eBHOxSx39AQ}iDiغaӗmF.A4{u+}K,SӃ ^8mGY)4Tdn7'^Yri WA0.OEG@5HQxaFPX S@e.`)`Sq_/!gB,ef<-RzԔo$iv閪 zݛ5eljQ%eLjqST8?"'392c`+oE%~+,)Qh:W-` SYf@EiX}Z yK"tV8_a(lT繲㕄JI&*:dAѴY|YP,aU3pΆ} ."#\CP ?n{"[m/zl_/J}u5l)7pI_7Hㆮ^s>~LQV!E9s $HTS| kj(}J Xy-,x9V: ,`.K`.tbabVK*Ohg)C4(šdf {"MSt2u]5]7%&]QB$;x:KW " Qܩ(\ PF[QI ~?!Y45,Ŗ4☓C/ Z;@sMB:+ ' kQD8+(% 1%]]s# $9#>'JoL]./iHn]*݃k%[3hLG0H?'ڝ\DWVav2}`"liQEi S jWt՞ؖ6MYW1pX&G"PuOfon^=SB0:5mI;{Ñzf!kddaC6^dx}>A7 V77X{e;Y 4GwzH1~؂p\h4}MtRIt!Hڢ=xM”&enoYer_%`g w]/TB)Y c"+pee^V7Չ>t`===s|yIK^v\y8x*LJWinR ;ߏ%HbVqg>Il(Oz_P 1}'|=~4@W\ y|5IN`xLځsl՜ L8qP*,Xx7F'׫4KkT&N*ppdoG6[ThhfwNj'#-/Îc9VI߭ w& J+~`!ym(%,w>BGNKbny_`Q* |1 ?8{7OJ:50OĪN`ȁ.zᬏYya uǻwXD:\5d AHvyg0 p`:2 sr]V<bH4NqUF# 2-47Bsh&y?ìMx|IRV4 wvZc6#) 0ưyaZ_ ެ R`hgiFs!<`mg 䤄zҮen8 Zbmw;Z~MG @'Y!۲L $9ec n)L>;9IMdY*[9\vKtю&?=y/T礐0`Đ+|Ek:m2+z(5Ԝ;ȾEedĬl{"b-+qVcP{bGNajQ$"Zy.F盦ՃB+nPvMWo1CNڅvk4~r+OD -Q f|R!N"`v:BcLiZ:KS,S.ZB炬96cTFSiJf%K8,I]0HEokLUExjA{Қ>($>Se1j17 |*NYXUv bgi@φ|ur+dXanLxKbq獴㒼V ԥ&Lѯ"&Ff"KHKA=A·Ujλ OQN+LoF+uh$mxLkL2M<`wT\#AUq& AWd/hPum'QNy UFhYH?n ^}}X,KrV)Vk~=Th̵@%7nHQ;v6ުn*Ԝo%zl:qӭ?7mxͧ}gvm{;?ӤJhgQ&¨ Q ]-wXcPx}}= >GB" X,bJI><+&|3ҟy%|+<~^z^v1hyEIm-tm ! T]EN= r5d~-U, q_ߒL亗2Gy|}=;kkhc[xe+>y2%HBJ% / ,ҋʞ bњH<9<Ljoa|?>K>`@#$$ʟK_q .u=@*QM\{<^uߦ Ŗ#umDXR[dG;z@qw>$u543b " pf}E|CrAg Ym}:puu'H.C)H0?B8s8Ölq "߈m*.* ג6Ŏ+O*(Q'|H2D `ׇF;?Yp(丂%۾(0>m惁6\Ag}ƻFAsqoMSغEKfflH))Y i"p$&iSlN-77ђ`f9!Fo%̷ܬlWDwKB"eY~o^{H>ª |= rٳk3m*=M1ߏ.]:Cx矱OսketѭC@x~ԖoirNU=F`<ݻȾ(x0(HjGP pZ]tNods@ʾv8s!sط(Nǀ[66l$eضmK׭Y՝=k6য়~á4ds"RtSFܔ3٬ ?DJB"k*aI0sŲسk7&^xʲnZ#9$ , f$&qN>%[7:rZtD9  O<۷ N&M% 4^mSKжoA!MkD^,}%$ *ucABTvVrʡ( rEJbY8`IN k[ÿu)?{jk[bՎ;{Xf5w/gcN[-CoUd$|Ι%~oiIsf{ԤD_8By_xgOI#e/ CvZ8„hޮ;8SX mInü6:qyGĥP؁IiP׿/LȔ$9 "H"7\q|[(A!d 1ܺyΟ/Dtt,Nd(xjtmX{1ځ:y W_~ ݻusog }/*<x{ᖹa27^nƚJEAMM _,GakY3q@ !@}Gȶqgw\)`>$B!2ssc۴D3I-ٜ@ՆB!)f"|}=JE`w>1T:)I,//Džb׻X\\?#37[11kkׯGREڕ!IBсR]$ l &2 H]K5Z!C$,ukPCףx8.Hq0@b\۷nE!=*z⋘5k&$B%!Zh @BD@yuqe0GRoF߾}SԱM'36&Ng]QZ2Ų1@#yIM(L } N@S>'4p)nX^z 9l`@i}H5kJѥ3ͱ1zMG8F޻pެ/roQAʶi-if0}.><~%[xð.F>0˙Ieee۷mQЩl5VUt$QSU$/^m\G9H"IʟgfsZSN$VKQߵ?}/O;FXxwmߦfNg$۫=8PS7]z*IȲl!Gbcx]ciK[KLa<ȰPzy_pNѐ(3&b_lb ꮽ9 ͎ds_ {`H΀fFgV :_7ĭk? /hr26>FP>GL'*yI9GĠ$ ABU:I Rwxyj ͉د$5Րes* ` `IgLT@[6'';nI!LHXf$IBnV&tE{O?HYxI@'<eFDYE(+- A;o%@~}`;Ak7lо(jZ6o&)$#G֓օ$ "24n Idvy͸ƃ$6o&$j6(V@c)GDc]wP0m@\'3O+(+EQPRRN*8BLxa]t p3 rswuDŚE```=/cn-\2HbW.%%IBUE%z! `.#v;|kBz, to/t:ЦUK !!:6 ~~!CϿ`eeu]{vQQ3O?Iaˆ/ѷ,&YZS Y$ﵢ8t8SؐeOMj",q^7:uqL>̉ ذy42`Yư>gvVƍ3g)CJK/R$&p $QUU !4v@#L̳\t)HBXƉ| 2ΈyKIT jtx݄u ^lCS,)-id5ff慎[G46"WgvٵNxil*Q\|ƛ7k¨PΛ%;zdn]䣏 bGأG,l֒w#GHoNC0;;?3S|g٧QĒ$֬YE/}{[F~vr&O?2ײp5=ahT=ǗѸUB.? 'N$.T V(5HРb=70** Z~t1'O|$c'E?#""`NǀuNt:N=+3L-9|pPUVcqӈ[}6 ÇyԷ$$PtTWcʟ"YSZV(_ZR2+#EQh"h̙࣏?$I5ݒccij9gaۂB;&YҒjJkt:z{ O5#yy9޹,c݈3m+ӎw݁tHnV& n{yvَ3gc uط}zFPө5jBW)ݩS\v-H 55)E|tz-Z >gi+H*l?Vp:${_8l,c]B,n ڵ(XnzySߩ #}i)S2uj3 Jiǜ6jDhI+sۈ"FErƒ!2):I1 jݓ'3*,a!F9pkז}{`=ԟLEE3h)Ȉ0~H^(:5kV9t 0?~̣8__4CS߻7C4WsfkuoƘZ\c3xc`EsUW;Gpi͛fcwӫ;uؠnЧwOBh 62´͸ Q=0յ?:<7 'OzܟW][lG;ǎaq=^=/(,\BQˑu1/st/Z?5OVi-4)%1 ggNi.G&I9[tQ||g7[5o}wqώ팉gNi .;=go-7PQpm 6Ӹ{6Mp㺵eN8 _ݹD6pO?2B2ne$g|C~"+PZk5N$!g rvߦu+:SN!'N;z1cUEŒgygdxkuoy .Q eFΟ7x] |ysgԩ3K;g8Ʊ͂!IX=\GMAAխ+ɔD3 f\T$zp##Bأ|~u[ܳ>I7cL~q6IJeȳgriNb9ޱ wOf0"}7lq^]{Gy<Lb)p p G#B{E@/C 4Aڵ"+ڻt:^өQwW@+Xk>~E*$N~[| EdxM|Rx)NTeC26:e㶹xbh#ŭ[Y/ػbJb<- 4bqi#Z\9lEٴ~p$Y#9zoIfdRVD]Mm)na<.T;]^~O7vN2 (SX-n'@:U_!yM6p.+/y'>T> j$ڵm׈=S1B悀bIr.*O閛[6odXXӶ? HO+h֢e#F\ 9Ė <"WZ=w}Ѡ f󕟹l $e>] O>oLn.76 IDATbm7'gm6Xk!C8xtMm͛IIׯ"##lqgΜּys6l޽{ѱcG 87۽fj:tio3gT kW4ImP';;6l@yy9:w={^B=gԝ{B Lp"9o6HShUv,v t.ocbt:q4/[ѣ/\$`^|GHhZW^>Ԡ #`,I/!#3[<4n<ׯ] (--cGoV?w߅$ H@Jj*V]'͙yAˁ$I\;Z|♧ಥ8fc Bҥ2ڽ ͚7jNtPOE ֮YŻ %cyU^{~~|W wϡl 75dZD|o Eb u5@ rx{{UW1p@@m 00^ ?]Pc03ˠۚ@V*KOߧM׭)SI$xyyaubo𕿽Ex?~Bs? D`@G`msoXhzRbH~~~^ϬڷC#((PAN':t8&[8b{ǎmȐ֞Ϧ? Bi>)u07ơCG~U*UT\ ^}5Bs6|8Fr +]>$NG3>D`pk #^y%9x`CI&;"l< ɚ4kn[Y햛IPUSNG@Uu5^{uxQU] KJʿXY] c+)5WJK5/ v;?f=F(_ӾKJ 8%IUh٪%_^ݺR :\k׭՛#be9z@ ==y xC?m+q0X7MRbM=Xkkʈ7&޾#|t1""B9qݻv@`¸'R$$qh|{4XzKKJa0xC{=HI!($)w[7(Xa}jp[$Im *2 ⹭x]j,{ xɔmvMBŋ+/"##=GYQqWَi߮Ŏ՗j!I k߾{|( rss=oݺ5f~EK/_]=p@)dYY!2l6,\VmhhI-ҴELY{U"3;RCP` Ic0u4 j up}u̓njf8z!:2:F:]ob'N?-`ǫW~j 7Eۿ?YD=WVVj[kӦM=rl!pQXF㕥s]B/nݺwAVN(<_t9|N%:q7xd/H>$e[,׊EQrʫN޽^;H+*eB)P^V(81B($׸ӦKɈ uuM^&>R]}EDhƨɲOGDG ! Ʊbt1b7s)P^2pWx !P]F= Ѥie}(a^CHz̟7wSOTݻ-܂.֢ D6cI(++=uj_c޽YVV-"BBB&NSkhjE >ж͎oYP> +Z*4OIFjL{!;Ռw9Z۶3*2#(X2[H+y:˿]Z#hHjPsER9{{MJ54j/"<2W#!&Y>8qңGyzsK)KH*{}x;y-`0\QzR{?W/ BY={*GCiMӱtw.M 50]Yԭ텗_BUU=㏹l6 -Y'cO<)k,>_ZcyȲ NsТiS:L5bsNMදq/n7~f5JKJ+_\jNM%S@g~762G@@ .B ti*Zd)Ƚ?ZSc Uuݻ&ylA 8s~iԸVNᅬH:r߻w{Kr=np#3>!̙=55T922v75%U+s<#\T;[wݰIfb޼yСcGUS!B!0@wEWk{_\H6nބ_]FYYnf9r7o}åKt 97fKaINBuay1qi(//GyEJJK8aّMO4UzEj4i L<H(-+GEUZm="/7G<;9XVWV *\lٺMK},㔘7.|(Ee(++O=ϨI? ֲ%L&>c}RZa$fOdb w>DyH|'V.0-% IQp#ZHmLUT41:w6M cع3CX.ahæ=vq1ؾc )MS  R4Ÿ 9F?54?ug󵿽Fp~-I(/Kp1Z5S뗫 ~9|5.O?=ߟq,:WQyq۶ln}Wf,i܅:6mejΞǴG"Ι3p28:w;};{&'OcJ~;X GBaq{Ν/dEyYzIu.;|)Є/r ܸv Ӛ6S'١}[>y6ob]y\i=mۺa|qL2s$`?&8a8qܵm+C֔7ĒwMի{1%{XvԑC\@ʲl͛Kk8!4$3LS=d.7a`>cLftx3N֥}Gc}XҪy3Λ;2h$I<6a0'4#L!L2y*㢣XtxfuCsŊ$_{G7 [@qqqܰa_~ ϘC8}:/ܹC_zvyF 6 .]⥊,łǟzJSI&F)c JKSbΝh 9pZj}qv>.]R6x"~hp4i (8z(bb=nmC4-ՙgF3~:xڛ6n@Xx8v;S`#vήݺ)SDmm-z̟?7 _l9z4`̙X<رGS :\ٙ"5խ+Ib]$[GՋ/bbl 'Pw;m*Sޥ{I;gx~tFEF$"gDN컥#oafM9{Li͞E7puCپu+Zx͚}6L$1Е?|=cɇƍc|t76i}{wL^=pI" #a݇H}{GZk55m¬ֵ3O:JGEV[;iJV󘓝IhݬCMp/vsܷ.mC &}\PdB?G:h ߟ.3Oe4]zL.-\s\;nўv!ej$V\9*/Tp<}\mݲkxfWXrúi$qF%GFFbEHLNi$$CZ‰% ~1:D@$ PvBR] `PK>pBNH(!2j$C`21ذyxbᏀ9fjGxҜ),hybK ]?t>A!us~2 J$ ^W7BAIJ߲On0\zCA~!ڴl9s̜eǀ ފ K@V=o'ou–q 7Բ5{:'=_E]cdQUR APx8}9NbIŘFh Uvs $x!*z" PpHN a߾^@5pXHw^,NVP#RމǟEa9n(/"(ȨrS?g,նZHMM4B#4QzD$:PAPr0N*Qt[D0>y > M rX:`3^#N~=b38t">>wj$_:뉽Nj’_W?V$@BBR%$g Mi/h*_ 7LȲfD%,nKoS5")+ bexP@!\XxI7`л7bds"S͉l Wǰqλhۺ N/tW0!A:"~W1Nǀ3_N g0j۞=0> g;!ϴ:yY۫}LƝ8ؾ};Fvk, 9|ǎG@%:vXѺuAjO<9zoo>BrUC*'΄oO B>Prl08cG!ztGжG"q >!~ց8vԏ:W AlvEV:wmF}ģfF  a DY!%p@Axp`a*HBX^Q_eqsB~N)$qۋtFD7_tQQzFmG͎,^8԰: ԝ>A6 Oݏm-Yg n0ةoݿo/CLO%LKILI4G&hU 62.2ӛ|9xvԙa 62*,1LetDCFDFqqn}|ؾuF1<0DD2:<P3hd֭¯rrs%6rsZDvݿFF11.qqL%!Iq4[o;,\(,Ǟ]02,ThG062a43&,lߺ #f a)Qaጉbb˦͸aګ~ܹN&iמPx{txCL6'򹧟ffd 4,&T|@'?TUU.:m*BC_}oq9֯fGp^#6aׯ^yNc( BL&PQ냎#<.ɓ9uk U=1|/ocYXwz ???X@ c#HlVrd2Q~{1ge^kE%m֕boތn60lHKׯGPPk;Ɯ^jEHHMmm-""`ԨIG8yΆ`@` 'nCuu5t0M92 ob !q0_%r8s L&|}+nܾ! A If7֩Cґ#0d5GuǓKspaZԛ߅dv_{'N/|ylUi!F 諩P۪7@FQЦݵ6ݵYWz @@ĉ8u$EqB"  BRWH?;ǍgVqN#(V8!sC :$a0h@@VF:ݙGsʊBWT@(TL&|f뛀>ve?h( ¿̆:y$jl5^WʲaK ϝӧl6x C]VVDGG읷ٵK7'Nmm-GbæyE";@|g0U@*ȜV+WsǎkRQA_`dffC!BfNÏ>>j;p\:;<~¸3z4JKKy !PQQMb"'/_0 Ήcv:Æ CZ/fIp'M{v#5=Ci"5=Cye.4$]~套xO^*tERʪJ,X.\"P܂B1ꑿA8iiXeo|54NBccW˘g;vz6 6 {+ڠ>{AA!4^͜$Î|axm0*\iAr `b<Μ1+V@DD8dYVJ͆?<7mX!r}cٲe qURM.7\ZE}eO +2 t.,^ׯ5oC)@LlS\x1t:/cH(**ڼy;?Z֣l' ϟÅ )o6oR4oqMp铨\%ٖ^9ڬƎ}\$ym@yy{q \dFbx,4SlX] !$l*)@'O& ~ fyUUNM{݆M[aՈ)LiSƍ&TdԞ={nHY@TUVЁê0% ))i( (+ߴiS=Ǭ[m3Qk7lȺ޲e SPJPP<CGlwU@\ͽ1xGO?7nDhh\!*X++#ndLI9gCstw'T[Oo>u'*<_EEZn֬An]oXw˸VI&u ^ziVN!JHB '+j5^aUÁPeغeE;w.N͛7oURWscS6Vk*+*Q^^r(???U˯o@qI /~-th˪\猩K\P !JR0|)F6l4y3XM`7I 4i uf5$AbM-$I@VdD5űD@P*ܱ꣠/#FMt^6BBH­rNHNѩn88t0 S 6[5"8YAA!._5IiY쁙f޲i~GZ Eq8},F3H)Z+ٳgp#^ (6H$TYXQUUylou?F$ vZİ#.IhUMm ]؝[б#v3nw kE"..^{NL{TWWCMJ B^{ϼx{=vݎ 1qXhG{$IBJJ .+9().]^7dsa F;uBIEh֢MXZN_pjjj0 5OޭzQ4so߾uW蛖q}xṭس?,dfC```=-GeDFFb޼yⷷG!j{RWWW#,, zAVflޢnu%22ww&.]FnnꋨZ4iuM:ÉX,FC?E@|^7-~F\L,6*ةuvܼ;{O=$h^<?΋/sӽ+ |͛7 o#33;w n&  ={nլ.EQШQ#q^J PoAiiFJ 6 Em[9}֝E>10]TUQ.77įk5\ VVVra^ky%wl8$Y4IJivh W_QNܘ*.١GF͘EN?kx\*$a8x ^-1ܫ8th0.G/fMȄVxVFnTP @T믾իt\ 88\5ՠ sT)ǑIr %'+*ѺmmC<]uk FΜ>Eo.@rr h۾vq __ Eq@QBq ǂ n23<,;XZ@lL|lA*P(ZONgUǭ,!$"7?_y M5.Cx,$cVq&Lv}d 33epZ-]¡`v.~͒v ?/o33DjzpHMO2Ejz# JE~q8|B̙3WDD4%>@dT[NGqc T $uUn7LIIx;68pgϜ" :웄޽F򮫆%!᫯_DPp-uXQ[znb`21tЛM\& 99T-I@ ǏAPVD4ls7D`PP}Mb7cysЍtq.;]n. h4KPmr't N?;pϞ=6 qqqhޢ= i4hn+WĬ/T]m]cVDG@PH`q8tp˳_!7ˏ>L=Pe"\-(ER HHZ|_?;{VwKzf|xWd_dN\;`bg߶͟+IaCBuZ#2z_i۶nÇ!$$:0}(UUU0u&Rxn55V 1 #ܹتcaX`6Q[[RWL$I“O?f?ḡ`\DE3f#cF{˸ͅrmYmCQQs_Fè(;@4Z=Yf0MHOKڵ --M]β++ХG7,Y3k62UUU àA`4O?!55:N"SY]UACԾ.Y?^ʹu*i=G5D1UqB7><FKEQP^^PFİZ0L(,)ĪUG3O\kQP7ij Z111sF[C^^;ft:0`@?>bv;>c}Un/Ͽ9 H h't1 ωa6B=ѣX2Λ7^^^c梷@3gz1эvfL0'N@ee%`6;wRSSzQeDYh=v=H'rss1G0{ˈh)V~BFsɄr|;cOrjD^^!O^|aJ˝q޵z[5kf3v5j<5O]mYףw{<|b裏`ZksQ_ o$ :NS!!!׺5&$$IFVVd2!I TSSpBgT,c4i6m؀& <ζ4 EL@֩}h;cq7p)⎪j D=ߊu<%KpG 5=#6PU#//[6o dg$P<gcHYS&~޽ UU@*n H ?V^AjeHZ 8>ʨFFS{|ZX ,] t|$IFq9XEq Х{wkNJ<B*@H 4@vhsC:Ϙ5KL8EEP B a0xChQmuÝiH%Y$<‹(V> #ŕLMf$$ݷ+Zn 5UT  d@;JʋWA*fϝ+񧟉X o6j?BQZ^ ڻ:ux24 ݻ73mtq.2z8w2eȐceoQTT!C#$ZTph8~w(-۠ VI[(24ʊ DFV G ܹ;vD~~|-UThqÛjE TᒎB#nШ:֢>jƏ #WOq]ZF81B,+~oMKWsr輼81Z_Kպ ӋQkhaa 9 v"壼BHChh0Gߴ{e%4B|':bl^p%h$7hwt$Wsr,K`Fttc忒J,,,, GPP Dzd1'7eP&~ DHX*sXPX͚{^ܳG>)x_/mBjϞݻw?v ǏGvN6*+`@faa!hٲ%۴A|||ɺrӕ.P"wJ_- 0$8&cQAm[oeq:h h0ׇ۴Çؿ__i1k21<8/͘;w ?0!Aӫ3K?hϟ~rӶKi݊f|gaD0.Y%ʧN셋뮻Γ}Ŷmcv~cfxH01U߾4 ! ̭CDžoΧ!C}v_v@? ^:>(.Uh*|V@?Ξ9yu.>, &uZ-mZ~ӊm|,Z8jV|r$'blLc꽴iإs'=lݪ%~%tFB6hWQɓ'٭[WZ|}J4$6_#SOMa]E  F48lV[ge ]p_=Foϥ¥ui[Ʀ1Ѽc˗yu /`qA~إs'Ő2*26_ϘHnzed񙧦[e{a<2| ٮuk^0gzZޮ;xg۶ k/!Iz1YV\DwH BŋR\0>:x Ϟ=]G'& /TϰRp`2;3I}E-n:ȡC̺ɁA#qhJ9GW}964GsΪy| ۷iKVӞgAz}vZF6yI|*n=Iby&ѾoA8qVVo-\H g^Nvpk!k8'W|pPd]-٠1b4Eq2afzLM߮՟26*ǒ}i;ю7c$xoFEGy$ڊ{[6m!ut8yW]p+H>`tÆ^ Ev 2g<|ϜfxH0zŵjW^yAǒăe;dG-d m'ΞF ™s%IGؤqc4cRxIDAT'&qЮ^:~نf7O:Q;۶.Vw#w?[co#I=l7mx'&cB{H~Æ\["38?ITv0X0ѵ & ̆a0זּVQVZŎ-CCy.CiSk=nh/\ϧGק~֯[-$2}'9(we(d\$ݻ1K^ RA~N6GEF1F1/'̝C {11ѩiH>{{C:}n];SwߦT*/ǘƐ''߰/O`||~UQ [5 gO3q_++Al{rQ6n.>3_|۵auۖ͛ ȘF\ j5#1* z>0?Ϟ9uSf5#2ׇ~f}lKũO=I^)&9}>fY| Ȅ^=yP7zr'0(lӧNpl׊Q~55fKJ3,5پm<ؼɣ'Lŗ~Z|1d0;oO R{%3N? ,446p Ёn:?ڶF i{1Q׮矛J_BVݺkQ۸8>TZU ~;lӫ/{9w,D7fj*Muk٢I6fÈpj5۶iS'NTıcI.]? &>>-6,1t8A~t1?O~ݡ##o~w p9l@>#߱ʋҔ>HB%-?%*lz;>Fǣ!Qb3(.Txi*V'cCd!m(0*s5hw':5)/M^i]-/p}0P&O4 SV@GK0XYH9S4*y`j@ m_>d'!MnA#~;,SWj-Fbg@xMF|-Jd,p7[(h/]lc>acSV"+du1mmi J@"ЇSn$)*MeE$p.#c 6y]Hlhl3 J}mðk'??PKwL\5̄ ( ($updraftplus/images/updraft_premv.pngnu[PNG  IHDRxgAMA a pHYs(JtEXtSoftwarepaint.net 4.0.3P'IDATx^}UafVw״]O$IFɊD $9! S3 s uέn[nZtS]F75迩yo(Ba9 *MNOVIPeјU"Yf4Y/`Oqp贛JIaիY6NB IfUj * YVUΪeGV4,YU SFǦ|0LY Qs6л!wk %RhD/j:://ˢ1e = ٵ.~Ǥx}::~N!'Փ\[R< Łh;X$mA:}_jMiW oml&t}>E";>rQQL3RNNYu]BX1/Ioo~ZgGGߤA WrBNtЛX賷NλWty|sKdL*xKR-~Ge" ) I?v!…-3t:JCE4FI{#Il1ɴvӟi o^UuRZm42Y\(Wѱn,{gS>ń~^\ōqH=X3hElC'\O#Z=^p  z&=&qO?# +Bgc}ӋW* GEՓ 8D ;:We{R_<dX9ޘ:ƦVcpL3ӜVy~͗3Wwij5u / ~<+XV{~}7W ~_|:KQí#s_Uݱ؄_˽F5VsK7yR3)yOE8)B_bqu\t j{ow"qXdžMXGɊ5vpK.۰?+* Y"`-\EZu؏_dsT5FYk#x&*.O?M URgF *KA\?Qi'T&z=ʲ|67. ~-Dr00$\C>? yO:y/+D3y*Zׄik]_Dg\  Dj(/TVO&B>\ F>Hq WC~(-oUa`cbI;~dG~MgRA? ϊRgV< +@s6mk?y戳.na-hh&FmY_:P (ŤdAḿ0 }mT`Tj:4LUg[P*VѫYUPWt69bG&zM2Yv㬚ЖIVȄ[߮~שlTRUѝ٬^V?g fU`YIRXVWo<lc؍J1椔UhC&Ns Zt8޾=9.Ge>^Y 3ȎѰTc!l(M&ʃ֋@)pEZ~U.X-,@Hd*N۷1StГIE4gu nSF0HׂpYY8&eDk*KMͤ28e#SNrh]m[T=*z5k bp5ύmd4y2XVsL,}}"a\Mx,|Nh+}Xe" X)&ImuXlr*le> ADJTC S/1V<@NbyW"04jDS&gQ : YPe fm`jj VϬ"W%gdP&ݿD3y-wE r0#h+[P6ξ+Y%Z}_ԧK ox'aNp a)s_ 5v,kDYJ1Ij#bPe{K?z`WTְIE[&Y)+>FC 㛳ZJZg=U7dYU X)&Imkږ `q7 ԄLBȢ1epVHiNm׊Һl E1o6((ؤBʚ`@HV8el5Gd$قڕ5H :7p= SRR샔,kDYJ1Ij#p83T]디 e@<%DRLn1 UG:%eA->HY/OɲF6[3CQ4&S(t GpO;}VvU *d*[Nw@T VUA޹;Yɽ`QUq0`o'ty*DJHB>7"G9{b?"0MEC ?~'~D^m o[(oj&|'$WAbi|\TeӶ{#xsH_-ӚV+Pݵ>~d{  xg#rbwIҡ U5d1;L1]G~%o8'+y#DΤlM"gIL/"Mn\ ζ4mR_@9) $NX~i9؜]@gEd@YlD0@4P^ ;ii*LVzeq(~0M4oWXD.JtulL:pzQ~"<3^pg|TIZ=D+}{rTS I= \!R`&?AnW*)mQ F[j@mv<גΓoۻ``FOgM ~4B;KD~?5y`/gBގ-ݽ;\v˷62^l6}nhW@<X5 k#Ouc-KVDŽ~N?;8knmȝRD*J\cvM+b*uSё-o ­`IGB[u(VL4b.]*8t:چ͟wTN9>;cۈAVGPtקhHQ4n_84xӏ3 lVPG#>/>A?zB0}sg(e6TK [a*[Eu*k}dĩ7vp{#ƮPѨQ *=' &2/]Ѐ#:g|Q#f2RDU)qGAGݓw=yi>OPog3):B!P$ud 4}0~solƤ3T[n<Dolr/sCR;޴qeÀ2GyO~y&U ^ϡ_B?" )pY_\W޼ u”%Lr*63#^Sr~^dЏ1gtaKɚLbYďvyQ+}5[tx=৳-!w|9ƅX=Rȶ6-J @xb'>N_ڦ5WRpGܛhCVB?Onð#,Mzjo&"ڵϐOw{\҆oq9P^~.{>nzg(oF ~j?FVtlq;'|-/ o\ǡ"U&vZ5dK 8ď?ɡ_x@tU]=黤kCd*tsV6W?v4ߪnWnt+jϯ~0ފ_8S%0V[qտ;W?rr | LV7.QF%TUy&=?/錟7D??HՏ ;7"u7gJ9y%tKYW?3c' ȷ [\dLLoݩ+}k)Ӈqs'MگU?~L* %q:CʄuɋRg<j(&3(XL[꫿VV`q~h}_S88/3rQ:[jʭBsqA0LB#:l]E,ו)O}RH3_=ol 7~؁o4şZ2t<) b\";[PAk9p`V *1suq_H4L2[/k 7zx~OM(yU"߼Gq.zg;>\bD?3M֗C&"߭39 6kuoosSqc9D?w p<1 xZVdǚ я:ڏY'޴]6z"?};t0&ɿlsqQԳIY>7 [28[G\Caǜy7q2k/?'L'VmQ$⇶R)@_BͲipڐb72FWɃЕ~^K+B]qýVy)ě>_8'j/g9w1W&E;wnо я%d?UTy{gwȉZ-9{DTtNyf؀6oEPkHn5d#~Giw#cU3):qCsԇ+i%zc$]g|@, o^I&b6ӏm!WV_RQ,eÔjƔ.$iO Rʽ_6c`j5fb;11c*E`c7хPg(%~~9qOD?ZOWO JE0*)sW볟Ž@2|U6_Rb̏o.(9t |8:8ݷ.~ُ+qJEEvP#z2(׉ԃ)<lϾwkJQ~%I^ЪTWYB4kNҚ~4 Jh=~lѷ֫D0[+|BSA>=+"cKbR?6s=IO6.Iy|8gox{#t3ä{?unS!FH G5u>M݁F$@/p =i-G!Lj'R!w~5Q;w';ժsWT؏?SH_~rԌ)Կ6smݽs^ږ x҉8mpFlkJ ey7/ wz?Ly'5,]Qbl]58jA@O%N@U $]@{Vo^yp)0 a s%7{m0~(u0k "&Q! /~4w 'q!rU=A;;78Rg}"@{ӞϸF=+K\#?zJ"CY"=EeM'GL |8;ympH⺁ጴ^'C>_pJ+j70t<@N0zҿ3h0\|R&dbY>,0eVd嬠FpvCi:pǽܣ5k3N:[vx{=&C;G._a}㳇7_p%}y」҅5a1;yO]ny`2Ctr[ׂLv|T &{dx? q0fIŃLkot 1M:&s{Z1A<䬻S\9+}*|o|m=ZMDs3;W-_nz7wPY݊Ͷ7VӉj|!kIǨ*Ey{M+ת!;]5**#`@$yb*rĘ(nkyK!*O Bdp1S.^@KgFlH 0"Dá)[7OZZ!"em"Ԣ4duq߱ [Ngc'v]rҥ3j9ĆܒMK-dя'cBC) xscn~7~3_C@*́sL ΢NҹF4a7! ZSzmq(MSD?=;>KRO[/oB߾]L@48GVᆕןk=q[Ha%Nw.`18In[Xc\L 5)%f!gӻ?Aĥ(ֿR߯ 8%ޒM'S/6iBKX-@$ ,>4x 9(xDt~KkOxecf<4A/_p2XZ"x BЃgA%b"! /FLxRtpE~~l, gbhG۱3"Ճ=C%8!31ºxDGG|ƱrU#ڱp*C0Mmr Ѐ Gw.#[9?;O6ܶsp,A/5rٖ=cAT ~xLJRZ4:sh3.*~ҏroT;9 hN|caGlep̜ܲta`ȔCWM:q%^:&cQUŪM_kJG2S_.V8^S?ҏ9c)I#,أcweCTseIy&>G1":߰?D`m ~"׈{\4*߅'ɛNa.{x LtUuЏu5tT0B?"8$@= Lz4?0Yk:UXMe8MཽЏ &=b"t#"~4GP~;[3eT=`6 I=cWM?-1[DŽ@}l'}#.HBHOZĔڹKnAE ֨ ܪBtôJGpts]jŵӯ u!.*0:luX6+sd-t#H5G)hfJ9S+Ƌ.|! *GN?Y%+nV+p?f> lԘyNnU5 ~h#Wx|'TjC-لXNU4es 琻й_zqSc8pTIWtfqƞK W.o&G?.M骍hi"7ŮY r,49h)S8gTad +#7cF騺z XNW,V?ZgSaA'aE|lz֌`)أc鵥~-RX]~dd{> <-bUz)\@t77hT`_;%]6P@@EW{V`K)<#=RUo} q-F~!u/q VV; TѻԊ]D ]F75迩EM.ojtS?}rw IENDB`PKwL\$updraftplus/images/updraft_freev.pngnu[PNG  IHDRxgAMA a pHYs(JtEXtSoftwarepaint.net 4.0.3PAIDATx^]{E޿$ .*+|\wuw]pȍ@ADQ9!rd3US$D=LUuwU_}U]:AaЯkAaЯkAaЯkl6O?iG̞59dz^藳鴥1t'-^S:/58û;dytП_!R^Rl n {YNMC7?}Ht;b@Yb5 ݌RΣ*;SM R*J" c=5)IݱEg跍?㺎{pY_9`h ?mZhvLQ>Cz!}0 zj4/iOELEQ&^YpQ$d* Akw-#X,y2P{ab!ۘ)7Aa*eYΤ;4)M|t=&muxׇ,lӟU7-/q*A?@KC6=_[4%hڡ?~jS臃a vn!T!mwiiP;Vyw">=yUZXZχ_/'ߪQ,B9&=.5,6YZχ'#E< `  hPJ҅S뚘Jz>C`T'UkD ?HfAAV:.)ei=ڡ?f'H KSkt0j"3<|+DgX&>sXZg0x6x)2TA.Gwm_Leiv臫wL~B>Q)fy9gq=rBnĆ,9xC* COυ2$F?|:o!y!>t謧v8]n*,h~qtYcv??E!)O T3"%"Xc" m~qHQu0ؾ-ʹ8 XA#1 tF< E<-B* Ar*ٻ! ޻̔v\a5 O!q{O`PplJC/sșTʏC[P X;#p2 =AwaЯkAaЯk$sQkap0m@t$zd]-]v7Nv~7:_ 6AtՆ<[WF}4 m tDOf׉xJ=.g31p#{a!Of BrL%t5~9,7sQ`9/w+=L+TCyWDzMU bvm5@xMՖlxώZFM7q035~Od'ylb۝J`We!pѣ_ZF =Z\ ;n6OD/0mvGTy$.}GFN5@oO9iiGۧ=$|GʹLQTWO`Lwpۄu^D͖ fcM '#֋(DCk؉֌˅܈{VJ0f.`&ul 0l6bhlPO7/lD '#>I ONS_M7VV!:~rN[CH!mb?`j:vhdg[8{?& Gz}S0RYZǍC~RD\p/7;KFYY~4ip]o ৽MڙJ:tw;S"iJJ:v C:  e߷%F鏝4iS / 8Yԍ3fE?iOL3q1j2A%5zSַO_4#t ke7q^EitT3d˨D}/hO5TZpkQ͍υv.v\I.E`޽$*BJr_x*ȣpotM;`. A]Bo#+.2: CPT/]/d9I%GgPF$LI~='a qyxeٽMZ*uXD!KÑIYPcLt DվQ]BXYnRbN,w%j$%P"JԒO>P=jqnTt& O{QngKG!el&)s#KЏEo=бcgO$c8ĹK˕ioHR*Z3F}L>mJO~T w mR7m_[V߂WAdZYv 7p/wDAA=F#*dmUxjG cǷp}]E? G~ɗ%)F>ms;U_e7P@+ K"F@i؂&̕(V\b'.~ܿTo yt 2m\s^n)y6prr*δ%1s߻bX>"#*u *~ jwڑ ?{>[0#ϲ];R>T9VyWN/:!ӶD~=RV%\C?; 6up1LUӏٚ8ӅXG߇hx@cs~m#5c݋yT@\Zp1BOOFI\ֻbX`S4 OP~@%jIr B{?"هp;R7ζlGYjou!R[0Clɫ'D2)5 )DM5p=~ԁ]ArJ!+b<%Xm0W@?zDlЕ أ? $po̢4ʢH[.`&桷OKq*=ˇh@inp% 碇dCn}qH~n/:Vp|8z#> p!!Ȯ]P>Ne:åNW \\S\W0" \RjAE?yl'?YèYb.qso6 ?n5Hh"nP%,Od [O`B Ea[承= A}SBuhBz^FMKfTװ74??IU|!lrF`9Z7skhP?~F~~]à_05 u ҟx1S 4p렂aЯkAaЯkAaЯkAM>}9*ɒ+8Ku ݋$by ؉m'G]7Z.UJ"z0Zz&뵰@d8yb9~s],HU#JCo'a>O {Cz9f*!ks!POA7AHw%PJ=*"%"wԐiԧu}W{ >KE|C[Nų>k9ꋋU i+ߞmwkQ'@Džb}:Yx?2掫KtPS-R9%h@EF!PZ O4#qΥ0,3AV2zr~䂕:n~_J:fXFݣ\dAIԍ3($vbkIiFulWᷧ?~vawPoww:܋ߌ?h TY_'. XA!A±j]I 8`2=8Y<`tc 8o(j*ߧc-#X{s.@ lSGǡRi+DEnjphh@$EV0enĹwp˼7Fr#93,咺v Id+6:m+|lG dE[]zxJ{v!ˠ|7țfR߲/NBBdQJ ?[GP~#N.2^eĝ5~8b H`7_[e{珶Ix$Q=KZ9޽ʌF9~BLM.+o Τ%Y[T9/+SbQӰ~Gj_rUH?E*M |4T\mwo ?6x?v v/Dl+P@@YSɾYU#X0g}6-Ōxʏ((eӗY@DRPSȮs^&-82D3桽1ISЎENGh Umώ[ZJ{\@s$H{z!GE9$qMBcBQQ;3MJ7]m)oodꅒV  GM ;.Zh1f9n~x0:!gtq"b"!@A %P<ܯ}@prۏg\Cz"y'?auo ]ĔxRWTd{x{9U0BsO?9) {a'#b@87Z~G# d`:miD'4탐.I0XtJb4Ge(*t 8gy.~/KY8'\ t^EFݕSH?wa#d!RVw-mЏZΦᓑJ$[˘jD*ۤV! r&<"nhB@,a,( SL? &ߍ9=fSh~ u4ِ#s!OoGf! osu|-ESm wmΡU[r.j:|Dd7Ckqm獟 vyNc2Hԍ8Y?.`1XGH!ݵM5aЯkAaЯkA< G MIENDB`PKwL\60updraftplus/images/aws_logo.pngnu[PNG  IHDR8>;PLTEfff333OOO%%% BBBXXX?& }}}`:0````@@@ppptVN.IIIW4 C(ևEEE[www)))~b\\\TTT,,,MÑzzznnn===܄j}K-ttt999(XPqDj?qnRuFc;p{fzJ8" QQQ^Wm*IDATXiw@_dB$B"-J[h]}p\Q>B,'8w&f3;f&Xs$ɋt &o־Os-,׏7<Ʋ_PugsoqYU~-o

k!Tʆ74 Ͷܔ0fsA'#™>XR\x{G(F)D}5v  |B_P`cyw™ qT*3oNSg H%uc(Ry 엃W(3p^Eל?A7qlSRr]V1@޴8"jV ED)@DkXU}tUmĺmQs@h,?s!_L]+ `~ͅ~Zp6D14)7m4ڟY=t/_z< x5H:}$2uIR#뺮~&ʮAԴS?dWQH}iCT{~^Շj=пs7)yr3/ v;K@Ћ!/oY@1E8nVU+/8I #͙ YĤ~A58o7]fvʿ =3~(M:9=ëUgkb>̖ Lx~1OŚ*(gRU.CzQ 𨽺^toM6La[T'ON-c1[]PdnƤhLZS.E9͇Ft|QaWgDdzIQ{SuI!;4`o)#\kR~^6 ZBt8(PH{|3MPlE}3љx~i]7[ t r]uP%>4~ƍAO!:3&E^Y[2!Kh<ys6Y zT.6W]83@>Mѥ&RM(M@f=AAU+8eJ8N1񪿡IENDB`PKwL\"@::"updraftplus/images/pcloud-logo.pngnu[PNG  IHDR+SPLTE#'08\#ǣ+P?jyrDJюUc׻DHtRNSDU{ n#w֤)ci=77#JD2-Oَ·\pN-U`ƁgyW 8IDATx`@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU}{M8ђ%obCX\jR $KO5RC4@-\zc?_K>+>0]7°W@wQsrêf۶ mkaɪy#)~U25WP[3%QGRh~SD=׫SssQZdFϋ`o-?lX GS]*#;佊Fo!P^Q$ǯnA7sj'7-{ ir)(J G''g`)N>`AfZ#O v"UM6I(iRDz(hkz;FjV E v;?Z~EL/OvT\-}T9ʚ,XlF[ f9&%JmUFME[#ۢ8yqkǃ?6HEwogjڻ>>>/ZbȘV?9:]]vS|;7Gݵ€\Ъls nu4Sj'_ӣ9|@F$n|rvj=qxMJ@FZHۧ%U~K f dB+j?>zo_Rz\EA^}OgQ Ozib@f1<)\.`ujt`DXX{Vǽil:YQRW~oI/4}] 6G ?>^Z&g '8ZA 6Fi-)0}qg^/tu<'S,nh HԲcO@y$2Oo*͞N.Ч/%r#@7]|}dPUwrw{Os:L t_g.-=/y^EI@,Z0';6^8K]*%]BGMgo.Z~I$˷>]Hv$kYMZɵf 6` a=-='>< cE_rwx%3xy2-^J#/Y> eSx4Q=k&u%͞_9 > :ng 0.:+;F}@|WۖӔ?sΓ/'ߡ $:wmYs J2)bcf/z>]PD }u6 >tpuW=rH pwmZB|.u"My@;"o=5/e(! 'Z~?̐kW."WΌ`']i#vt= [(a"Buyo/ PN', LyZ6'j,p,.M(znd?Һ<@Nw`<ѱm_o:H9=J*7eK`ғMj[F5@ @AT|% ~yJZг &urs#E!EC1 @Fԉj,QUW!Ɠѹ%tvgOܬc?G9zT@l=) C p 0M9%LS?VoBi$j<ѻ`-t'2gV Tp 'o0 y98@ݜ;\d Y4w\M1y'x *r B뚴jU*ղ~fW"@ pt |\ t_]3k(t PqY?wXUTSۀfI-%ǀ"[b#D 0<"zwKaR~Fg)'fg: @M]gM@rdpbQ;Ee"Jb/Z|Mw]g,s0;H!)cO_B#4fE'e>Xy~C0u:=A?N9D/ '}.$p u, U=ZJ e)$g1_87w@͸\3e,mlNps-ϽgVV[@$ .gxZ5IMVӺ )b{hjD9f?穴@ׯ3iGz:&枂` sl??B %fǗ7h",:j8E̥qPA'QQ(  סj w[ټQqЁW2A=nMم,˦f "!!^^CUjtaA: :-ЌC27&z 99Q(`p,!J'M$ Җ&VRiܹ͊Q-*[Ȓs=p|@?;cC3k)PDpx&'|x_Xt DA;;R骈ɷ,-͂iO4"Qh[խX(w`2{H6>K#Xd2@x(v; Zy1U6? FEH?z V|EݪBH^&p5֟GCrN3 7S8w'UcU 9hO/.Th5')rߏ<ݲYm@ov~ ;DWy =R,VV/biЉ$>$/=!44@eby@gEp{[8l$(Nftۗ)9eA:4O/J`Hu% $!u>>>=J:5I"!iPBڎG(iCLn ys=0Sҋ -xޣ/B3.zx|L6*`211W\ƪ/.{lC(B#sV ySt)@:^ 꿁uZ@Gm.WX :vV*s9u/k0Wo?.CT(ՔZInRWFc3hw mq3*aCD<*qyfTSbK/'g%zy;{0@ յR-' ɒV7ʝs-5EmՆj@R9) 2=~4b k+\}{ B.Y!Gm+ln|>b{m^SKiFcj*Ss 0:r0yZz|rmpihn:̡{ͪ\"Q' Ux"1Y[04Tx/+@p\@d4fMd"!b$H Y ԛc3j=BWz W'zc}]@,jDž534@nWDS"G6%.ysg1#:۟OŒu;k<6ykL~^ȅOy7U0ny q`lx\q`n@jDeA$|˓5(@屙dXS,+Du YbY#w@xp[~ۼ?CȊ/#$G|Gr; 햗9 @g%he ק4yn*m`y Qaa~$`' շƑJ Gjs^`mDwVvW-Bt)hRgQF̉YЛ>d#9O @@.V+A0`VwVgp:4촇28{w F .M-Q~(ҋ6H2Sx ;)dI'Dz@g`vpӀ\rTEfsn:D("I#VNdmdjlȸA#@%k0ᄃC6hQ#33GJGu0G4 k Fʈ NExrI3ܜkEφ;-u޾ F'" Spy@ $%~7i'.42H s^Yi^cp7sK_V1s{=#X դ_k1~B2I*De#^ɂ TM,G |G?DOm6[>>O+YSR7Ǒ2x *qB@&`zp7=;}=w6X&{>p `<Γ_ʁc.F[J=y{4S0r,#ҭa]]^Jy;`)m2@j㶅@~+~<8>a?pvXr8g/44?-/"g l W3{utGgVOA#{.(gƘ`$[dQh  Jbg$0+FR+ApA;^ ?Ϳ: OaI㫋󏠧Rs$jbZj!G9qC A05@a\w\Яi;e }>\v@6-]vҁ>V.b6b F -bkojy iy UE, g,yW@EJٻ7}2 5.j5ĉA).0$T C?`ƾu8P*[X(1@ȍi@ƏS'׻iD#7${0IV@6'i[*oo㳫#qլ3KG%mՌjvxBј,e Gγp5 7l857}?/O>p#P"I5,J IwkR ٭_nB%@ΰ`n;Fyu*OPv`7 =n=q<0GVGud%XN@dJ=O+OS;/v7YnҞR?TtmlNmErYNՇ`7er^(x& @xN jW&8i-y/S}rɚ | #ƾ0}.*JCly&M B,z~Sg½1v :Hb!N J9[@I|*@p icn5@BBvR.NgƁjt4]!x0pT'@ZQN@Iz/Dst)'Z0M>‘HIk[L %%#'_i!7v;89 g \@`v0[@=Q~W3@䷈SC*o9 *͒R^[!r$h^1d%4R{]pi(˶n@s'қ 7E`a K~qN6 F9&ՋUL@.C }"\ C@MG!"e s:+Y&&a{d:yHN{Fͱ@kw֐+`$54+he2==O~^ =FI$.# 00 ph28I?uV0s^Qu~@\RpeԴMXʄUr3F+&_\HSAm!1j61cYCm(?x h pö![;, PZ0$+ ɒ≨bpL(v LvO7{4dbلW(pójkEVmժOko IvO?dR7wcFYrHptTWb7y "hcHM`ۭIk6 t@?@0 3q"?+_$ K`Sp3YD^Q`c`22BD`!P* em=oIY2#&Vp jtnua;%Ab@rmˤ/ h]%gpHCO@㤒.Dta\p(H$9QT(B..Z0\yWǃoК^y=.ݱH{7)@$wbܴ`Y1֐bD+ig~*r*zdؖ' C>tÃ"Fg7;[䙭9Gg3H [Mh8CFjɑ`ٰLqJ>H;,4XRU2!VJw <-H"$1q \~{AbtOꏬ>@kp;#H?_"UYPH,!؜+j`S&]%< :[\H<R"ul!E\D^tϠGw|܁M;?n/hr'T*%Qx1T%ɕB{"z%Hﺎ!S%تJFNcKerkEp1 Kٍ 7-Y޻aݗ&?=kA~1!÷=/_;.wi jM(ʍ,k'/+^ؤ \竆U 4=/wpju3Ԁ/: KDv'eBω0hf+|ZKo[/xmK4rcІ܄e8|a TY*@]e&bn]\,z} 77=kQɻ-6Wܤ)*vDy;lRr\ vV\՟* 8/o8\ !=Kz%Z/>_ϗ*pȵrl٦A#=+H (?A7?9T#As'TG`e= Gf ˱Ul).2kjsF/OTٞ6d໮  Z)֛acҲ/.C1vNb(^\<x5*Y |w 4လ3`c98$I l#@j hـ'#U%xp]`_qN#]> `y̸):b @:CCTvgZ'_+ |CX{tŠL͌ ?'ںtZ-Tl0`bz*gXeWW h @[z<ȺV^<3!>9Ou?zeW9] BY-,ps˱ 6oKjZVeΤ  kE U0"$Ɩ/ S8|K[zgۋ@*5ǿ@*jJq 6ݷ7iuU_O8)M_εcf%%Jɦ f(]J KTѡ7r9){C]K $_i2iy,OvˠNwsvΫ#j+CO@p_`jz<".+q<*r#0Ε8P=@%Ln $|ag%yK4s)b4?>iɇ1yvg7mlWv"&X&,Q-7 f<eDn)%'\M rUw;Y7+j,ejXy)˙W p$2و$d)}ϗmGw͠NoxܞY<;RtΎC( <3hJd-T] Ѓ䑒o&jF4 ī%ej-"gcZ!j\V볣ONW0L1㛛N/J^sMɀ]IreS꧗l+P\JDUy緍) Q~@Kr§stNŒ 6Gtg^k,pR{ ( #](N$y<124|#bok蜔?[ͬtF>d ɴ@n O&1?4SonqnݚȻՂ]WܽO_ NaF?M;|4 ph2< t{S=?a~rK/۝7p$}p3w7w^K.W*;" x|Jn88]ǑkpE mh܀xtTo2/_7i(UQq>b:;QkflB4q57MS*`Е[j9[%\b: $&u"ruڰmKⲟl?ED x aZTD)Wo5߮Bn>3cb) 0 "rkAPiZ=@Hr_tCxM:cZRcTY(_ᠴH@Q3_֟$ڦEMl̏ 0,F:$Q%<,mJgTMJ@jq%{accountId = $accountId; $this->applicationKey = $applicationKey; $this->singleBucketKeyId = $singleBucketKeyId; if (isset($options['ssl_verify'])) $this->sslVerify = $options['ssl_verify']; if (isset($options['ssl_ca_certs'])) $this->useCACerts = $options['ssl_ca_certs']; $this->authorizeAccount(); } protected function request($method = 'GET', $uri = '', array $options = array(), $as_json = true) { $session = curl_init($uri); $headers = array(); if (isset($options['auth'])) { $account_id = empty($this->singleBucketKeyId) ? $this->accountId : $this->singleBucketKeyId; $headers[] = 'Authorization: Basic ' . base64_encode($account_id . ':' . $this->applicationKey); } if (isset($options['headers'])) { foreach ($options['headers'] as $key => $header) { $headers[] = $key . ': ' . $header; } } if ($this->sslVerify) { curl_setopt($session, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($session, CURLOPT_SSL_VERIFYHOST, 2); } else { curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($session, CURLOPT_SSL_VERIFYHOST, 0); } if ($this->useCACerts) { curl_setopt($session, CURLOPT_CAINFO, $this->useCACerts); } if ('GET' == $method) { curl_setopt($session, CURLOPT_HTTPGET, true); } else { $data = array(); if (isset($options['json'])) { $headers[] = "Accept: application/json"; $data = json_encode($options['json']); } if (isset($options['body'])) { $data = $options['body']; } curl_setopt($session, CURLOPT_POSTFIELDS, $data); curl_setopt($session, CURLOPT_POST, true); } curl_setopt($session, CURLOPT_HTTPHEADER, $headers); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); if (isset($options['sink'])) { $sink = fopen($options['sink'], 'w+'); curl_setopt($session, CURLOPT_FILE, $sink); curl_setopt($session, CURLOPT_FOLLOWLOCATION, true); } if (isset($options['session'])) { return $session; } $response = curl_exec($session); if (0 != ($curl_error = curl_errno($session))) { throw new Exception("Curl error ($curl_error): ".curl_error($session), $curl_error); } $decode_response = json_decode($response, true); if (isset($decode_response['status']) && 200 !== $decode_response['status']) { throw new Exception($decode_response['message'], $decode_response['status']); } curl_close($session); if (!empty($sink)) @fclose($sink); if ($as_json) return $decode_response; return $response; } public function uploadLargeStart($options) { // Request body parameters if ('/' === substr($options['FileName'], 0, 1)) { $options['FileName'] = ltrim($options['FileName'], '/'); } if (!isset($options['BucketId']) && isset($options['BucketName'])) { $options['BucketId'] = $this->getBucketIdFromName($options['BucketName']); } if (!isset($options['FileContentType'])) { $options['FileContentType'] = 'b2/x-auto'; } // Request start large file upload $response = $this->request('POST', $this->apiUrl . '/b2_start_large_file', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'bucketId' => $options['BucketId'], 'fileName' => $options['FileName'], 'contentType' => $options['FileContentType'], ), )); /* * fileId * fileName * accountId * bucketId * contentType * fileInfo * uploadTimestamp */ return $response; } public function uploadLargeUrl($options) { if (!isset($options['FileId'])) { throw new Exception('FileId required'); } $response = $this->request('POST', $this->apiUrl . '/b2_get_upload_part_url', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'fileId' => $options['FileId'], ), )); /* * authorizationToken * fileId * uploadUrl */ return $response; } public function uploadLargePart($options) { if (!isset($options['AuthorizationToken'])) { throw new Exception('AuthorizationToken required'); } if (!isset($options['FilePartNo'])) { throw new Exception('FilePartNo required'); } if (!isset($options['UploadUrl'])) { throw new Exception('UploadUrl required'); } if (!isset($options['Body'])) { throw new Exception('Body required'); } if (is_resource($options['Body'])) { // We need to calculate the file's hash incrementally from the stream. $context = hash_init('sha1'); hash_update_stream($context, $options['Body']); $hash = hash_final($context); // Similarly, we have to use fstat to get the size of the stream. $fstat = fstat($options['Body']); $size = $fstat['size']; // Rewind the stream before passing it to the HTTP client. rewind($options['Body']); } else { // We've been given a simple string body, it's super simple to calculate the hash and size. $hash = sha1($options['Body']); $size = mb_strlen($options['Body'], '8bit'); } $response = $this->request('POST', $options['UploadUrl'], array( 'headers' => array( 'Authorization' => $options['AuthorizationToken'], 'X-Bz-Part-Number' => $options['FilePartNo'], 'Content-Length' => $size, 'X-Bz-Content-Sha1' => $hash, ), 'body' => $options['Body'], )); /* * fileId * partNumber * contentLength * contentSha1 */ return $response; } public function uploadLargeFinish($options) { if (!isset($options['FileId'])) { throw new Exception('FileId required'); } if (!isset($options['FilePartSha1Array'])) { throw new Exception('FilePartSha1Array required'); } if (!is_array($options['FilePartSha1Array'])) { throw new Exception("FilePartSha1Array must be an array"); } $response = $this->request('POST', $this->apiUrl . '/b2_finish_large_file', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'fileId' => (string) $options['FileId'], 'partSha1Array' => $options['FilePartSha1Array'], ), )); if (empty($response['contentLength'])) { throw new Exception('B2: uploadLargeFinish error: contentLength returned was empty ('.serialize($response).')'); } return new UpdraftPlus_Backblaze_File( $response['fileId'], $response['fileName'], $response['contentSha1'], $response['contentLength'], $response['contentType'], $response['fileInfo'] ); } protected function authorizeAccount() { $response = $this->request("GET", 'https://api.backblazeb2.com/b2api/v1/b2_authorize_account', array( 'auth' => array($this->accountId, $this->applicationKey), )); $this->authToken = $response['authorizationToken']; $this->apiUrl = $response['apiUrl'] . '/b2api/v1'; $this->downloadUrl = $response['downloadUrl']; } public function listBuckets() { $buckets = array(); $response = $this->request('POST', $this->apiUrl . '/b2_list_buckets', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'accountId' => $this->accountId, ), )); if (!isset($response['buckets'])) throw new Exception('Failed to list buckets: '.serialize($response)); foreach ($response['buckets'] as $bucket) { $buckets[] = new UpdraftPlus_Backblaze_Bucket($bucket['bucketId'], $bucket['bucketName'], $bucket['bucketType']); } return $buckets; } protected function getBucketIdFromName($name) { $buckets = $this->listBuckets(); foreach ($buckets as $bucket) { if ($bucket->getName() === $name) { return $bucket->getId(); } } return null; } protected function getBucketNameFromId($id) { $buckets = $this->listBuckets(); foreach ($buckets as $bucket) { if ($bucket->getId() === $id) { return $bucket->getName(); } } return null; } protected function getFileIdFromBucketAndFileName($bucketName, $fileName) { $files = $this->listFiles(array( 'BucketName' => $bucketName, 'FileName' => $fileName, )); foreach ($files as $file) { if ($file->getName() === $fileName) { return $file->getId(); } } return null; } public function listFiles($options) { // if FileName is set, we only attempt to retrieve information about that single file. $fileName = !empty($options['FileName']) ? $options['FileName'] : null; $nextFileName = null; $maxFileCount = 1000; $files = array(); if (!isset($options['BucketId']) && isset($options['BucketName'])) { $options['BucketId'] = $this->getBucketIdFromName($options['BucketName']); } if ($fileName) { $nextFileName = $fileName; $maxFileCount = 1; } $json = array( 'bucketId' => $options['BucketId'], 'startFileName' => $nextFileName, 'maxFileCount' => $maxFileCount, ); if (!empty($options['Prefix'])) $json['prefix'] = $options['Prefix']; // B2 returns, at most, 1000 files per "page". Loop through the pages and compile an array of File objects. while (true) { $response = $this->request('POST', $this->apiUrl . '/b2_list_file_names', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => $json )); if (!isset($response['files'])) throw new Exception('Failed to list files. '.serialize($files)); foreach ($response['files'] as $file) { // if we have a file name set, only retrieve information if the file name matches if (!$fileName || ($fileName === $file['fileName'])) { $files[] = new UpdraftPlus_Backblaze_File($file['fileId'], $file['fileName'], null, $file['size']); } } if ($fileName || $response['nextFileName'] === null) { // We've got all the files - break out of loop. break; } $json['startFileName'] = $response['nextFileName']; } return $files; } public function upload($options) { // Clean the path if it starts with /. if (substr($options['FileName'], 0, 1) === '/') { $options['FileName'] = ltrim($options['FileName'], '/'); } if (!isset($options['BucketId']) && isset($options['BucketName'])) { $options['BucketId'] = $this->getBucketIdFromName($options['BucketName']); } // Retrieve the URL that we should be uploading to. $response = $this->request('POST', $this->apiUrl . '/b2_get_upload_url', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'bucketId' => $options['BucketId'], ), )); $uploadEndpoint = $response['uploadUrl']; $uploadAuthToken = $response['authorizationToken']; if (is_resource($options['Body'])) { // We need to calculate the file's hash incrementally from the stream. $context = hash_init('sha1'); hash_update_stream($context, $options['Body']); $hash = hash_final($context); // Similarly, we have to use fstat to get the size of the stream. $fstat = fstat($options['Body']); $size = $fstat['size']; // Rewind the stream before passing it to the HTTP client. rewind($options['Body']); } else { // We've been given a simple string body, it's super simple to calculate the hash and size. $hash = sha1($options['Body']); $size = mb_strlen($options['Body'], '8bit'); } if (!isset($options['FileLastModified'])) { $options['FileLastModified'] = round(microtime(true) * 1000); } if (!isset($options['FileContentType'])) { $options['FileContentType'] = 'b2/x-auto'; } $response = $this->request('POST', $uploadEndpoint, array( 'headers' => array( 'Authorization' => $uploadAuthToken, 'Content-Type' => $options['FileContentType'], 'Content-Length' => $size, 'X-Bz-File-Name' => $options['FileName'], 'X-Bz-Content-Sha1' => $hash, 'X-Bz-Info-src_last_modified_millis' => $options['FileLastModified'], ), 'body' => $options['Body'], )); return new UpdraftPlus_Backblaze_File( $response['fileId'], $response['fileName'], $response['contentSha1'], $response['contentLength'], $response['contentType'], $response['fileInfo'] ); } public function download($options) { $requestUrl = null; $requestOptions = array( 'headers' => array( 'Authorization' => $this->authToken, ), 'sink' => isset($options['SaveAs']) ? $options['SaveAs'] : null, ); if (isset($options['FileId'])) { $requestOptions['query'] = array('fileId' => $options['FileId']); $requestUrl = $this->downloadUrl . '/b2api/v1/b2_download_file_by_id'; } else { if (!isset($options['BucketName']) && isset($options['BucketId'])) { $options['BucketName'] = $this->getBucketNameFromId($options['BucketId']); } $requestUrl = sprintf('%s/file/%s/%s', $this->downloadUrl, $options['BucketName'], $options['FileName']); } if (isset($options['headers'])) { $requestOptions['headers'] = array_merge($requestOptions['headers'], $options['headers']); } $response = $this->request('GET', $requestUrl, $requestOptions, false); return isset($options['SaveAs']) ? true : $response; } public function getFile($options) { if (!isset($options['FileId']) && isset($options['BucketName']) && isset($options['FileName'])) { $options['FileId'] = $this->getFileIdFromBucketAndFileName($options['BucketName'], $options['FileName']); if (!$options['FileId']) { throw new UpdraftPlus_Backblaze_NotFoundException(); } } $response = $this->request('POST', $this->apiUrl . '/b2_get_file_info', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'fileId' => $options['FileId'], ), )); return new UpdraftPlus_Backblaze_File( $response['fileId'], $response['fileName'], $response['contentSha1'], $response['contentLength'], $response['contentType'], $response['fileInfo'], $response['bucketId'], $response['action'], $response['uploadTimestamp'] ); } /** * Delete a file * * @param Array $options - possible keys are FileName, FileId, BucketName * * @return Boolean. Can also throw an exception; including UpdraftPlus_Backblaze_NotFoundException if the file was not found. */ public function deleteFile($options) { if (!isset($options['FileName'])) { $file = $this->getFile($options); $options['FileName'] = $file->getName(); } if (!isset($options['FileId']) && isset($options['BucketName']) && isset($options['FileName'])) { $file = $this->getFile($options); $options['FileId'] = $file->getId(); } $delete_result = $this->request('POST', $this->apiUrl . '/b2_delete_file_version', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'fileName' => $options['FileName'], 'fileId' => $options['FileId'], ), )); return (is_array($delete_result) && !empty($delete_result['fileId'])) ? true : false; } /** * Delete multiple files * * @param Array $files_to_delete - array of possible files to delete; sub-keys are FileName, FileId, BucketName * @param String $bucket_name - the bucket that files are being deleted from * @param String|Null - path prefix (to prevent unnecessary scanning of other paths) * * @return Array|Boolean */ public function deleteMultipleFiles($files_to_delete, $bucket_name, $path_prefix = null) { if (count($files_to_delete) == 0) { return false; } $active = null; $sessions = []; $result = []; $bulk_session = curl_multi_init(); $list_options = array( 'BucketName' => $bucket_name ); if (is_string($path_prefix) && '' !== $path_prefix) $list_options['Prefix'] = $path_prefix; $files = $this->listFiles($list_options); $files_lookup = array(); foreach ($files as $file_object) { $file_name = $file_object->getName(); $file_id = $file_object->getId(); $files_lookup[$file_name] = $file_id; } foreach ($files_to_delete as $file_identification) { try { if (!isset($file_identification['FileName'])) { // We should not enter here as we always pass a file name but just in case $file = $this->getFile($file_identification); $file_identification['FileName'] = $file->getName(); $file_identification['FileId'] = $file->getId(); } elseif (!isset($file_identification['FileId'])) { if (isset($files_lookup[$file_identification['FileName']])) { $file_identification['FileId'] = $files_lookup[$file_identification['FileName']]; } else { // We should not enter here as all the files should be in the same bucket but just in case $file = $this->getFile($file_identification); $file_identification['FileId'] = $file->getId(); } } } catch (UpdraftPlus_Backblaze_NotFoundException $e) { array_push($sessions, true); continue; } $session = $this->request('POST', $this->apiUrl . '/b2_delete_file_version', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'fileName' => $file_identification['FileName'], 'fileId' => $file_identification['FileId'], ), 'session' => true )); array_push($sessions, $session); curl_multi_add_handle($bulk_session, $session); } do { $status = curl_multi_exec($bulk_session, $active); if ($active) { curl_multi_select($bulk_session); } } while ($active && $status == CURLM_OK); foreach ($sessions as $session) { if (is_bool($session)) { array_push($result, $session); continue; } $response = curl_multi_getcontent($session); array_push($result, $response); curl_multi_remove_handle($bulk_session, $session); } curl_multi_close($bulk_session); return (is_array($result) && !empty($result)) ? $result : false; } /** * Create a private bucket with the given name. * * @param String $bucket_name - valid bucket name * @throws Exception * * @return boolean - If bucket created successfully, it returns true otherwise false. */ public function createPrivateBucket($bucket_name) { try { $response = $this->request('POST', $this->apiUrl.'/b2_create_bucket', array( 'headers' => array( 'Authorization' => $this->authToken, ), 'json' => array( 'accountId' => $this->accountId, 'bucketName' => $bucket_name, 'bucketType' => 'allPrivate' ) ) ); } catch (Exception $e) { if (400 == $e->getCode()) { throw new Exception("Bucket can't be created because Bucket name is already in use.", $e->getCode()); } else { throw $e; } return false; } if (isset($response['bucketId']) && isset($response['bucketName']) && isset($response['bucketType'])) { return true; } return false; } } final class UpdraftPlus_Backblaze_Bucket { const TYPE_PUBLIC = 'allPublic'; const TYPE_PRIVATE = 'allPrivate'; protected $id; protected $name; protected $type; /** * Bucket constructor. * * @param $id * @param $name * @param $type */ public function __construct($id, $name, $type) { $this->id = $id; $this->name = $name; $this->type = $type; } public function getId() { return $this->id; } public function getName() { return $this->name; } public function getType() { return $this->type; } } final class UpdraftPlus_Backblaze_File { protected $id; protected $name; protected $hash; protected $size; protected $type; protected $info; protected $bucketId; protected $action; protected $uploadTimestamp; /** * File constructor. * * @param $id * @param $name * @param $hash * @param $size * @param $type * @param $info * @param $bucketId * @param $action * @param $uploadTimestamp */ public function __construct($id, $name, $hash = null, $size = null, $type = null, $info = null, $bucketId = null, $action = null, $uploadTimestamp = null) { $this->id = $id; $this->name = $name; $this->hash = $hash; $this->size = $size; $this->type = $type; $this->info = $info; $this->bucketId = $bucketId; $this->action = $action; $this->uploadTimestamp = $uploadTimestamp; } /** * @return string */ public function getId() { return $this->id; } /** * @return string */ public function getName() { return $this->name; } /** * @return string */ public function getHash() { return $this->hash; } /** * @return int */ public function getSize() { return $this->size; } /** * @return string */ public function getType() { return $this->type; } /** * @return array */ public function getInfo() { return $this->info; } /** * @return string */ public function getBucketId() { return $this->bucketId; } /** * @return string */ public function getAction() { return $this->action; } /** * @return string */ public function getUploadTimestamp() { return $this->uploadTimestamp; } } class UpdraftPlus_Backblaze_NotFoundException extends Exception { } PKwL\(9Z9ZAupdraftplus/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.phpnu[ * @link https://github.com/benthedesigner/dropbox * @package Dropbox\OAuth * @subpackage Consumer */ abstract class Dropbox_ConsumerAbstract { // Dropbox web endpoint. v2 API has just dropped the 1/ suffix to the below. const WEB_URL = 'https://www.dropbox.com/'; // OAuth flow methods const AUTHORISE_METHOD = 'oauth2/authorize'; // Beware - the documentation in one place says oauth2/token/revoke, but that appears to be wrong const DEAUTHORISE_METHOD = '2/auth/token/revoke'; const ACCESS_TOKEN_METHOD = 'oauth2/token'; // The next endpoint only exists with APIv1 const OAUTH_UPGRADE = 'oauth2/token_from_oauth1'; private $scopes = array( 'account_info.read', 'files.content.write', 'files.content.read', 'files.metadata.read', ); /** * Signature method, either PLAINTEXT or HMAC-SHA1 * @var string */ private $sigMethod = 'PLAINTEXT'; /** * Output file handle * @var null|resource */ protected $outFile = null; /** * Input file handle * @var null|resource */ protected $inFile = null; /** * Authenticate using 3-legged OAuth flow, firstly * checking we don't already have tokens to use * @return void */ protected function authenticate() { global $updraftplus; $access_token = $this->storage->get('access_token'); //Check if the new token type is set if not they need to be upgraded to OAuth2 if (!empty($access_token) && isset($access_token->oauth_token) && !isset($access_token->token_type)) { $updraftplus->log('OAuth v1 token found: upgrading to v2'); $this->upgradeOAuth(); $updraftplus->log('OAuth token upgrade successful'); } if (!empty($access_token) && isset($access_token->refresh_token) && isset($access_token->expires_in)) { if ($access_token->expires_in < time()) $this->refreshAccessToken(); } if (empty($access_token) || !isset($access_token->oauth_token)) { try { $this->getAccessToken(); } catch(Exception $e) { $excep_class = get_class($e); // 04-Sep-2015 - Dropbox started throwing a 400, which caused a Dropbox_BadRequestException which previously wasn't being caught if ('Dropbox_BadRequestException' == $excep_class || 'Dropbox_Exception' == $excep_class) { global $updraftplus; $updraftplus->log($e->getMessage().' - need to reauthenticate this site with Dropbox (if this fails, then you can also try wiping your settings from the Expert Settings section)'); //$this->getRequestToken(); $this->authorise(); } else { throw $e; } } } } /** * Upgrade the user's OAuth1 token to a OAuth2 token * @return void */ private function upgradeOAuth() { // N.B. This call only exists under API v1 - i.e. there is no APIv2 equivalent. Hence the APIv1 endpoint (API_URL) is used, and not the v2 (API_URL_V2) $url = 'https://api.dropbox.com/1/' . self::OAUTH_UPGRADE; $response = $this->fetch('POST', $url, ''); $token = new stdClass(); /* oauth token secret and oauth token were needed by oauth1 these are replaced in oauth2 with an access token currently they are still there just in case a method somewhere is expecting them to both be set as far as I can tell only the oauth token is used after more testing token secret can be removed. */ $token->oauth_token_secret = $response['body']->access_token; $token->oauth_token = $response['body']->access_token; $token->token_type = $response['body']->token_type; $this->storage->set($token, 'access_token'); $this->storage->set('true','upgraded'); $this->storage->do_unset('request_token'); } /** * Obtain user authorisation * The user will be redirected to Dropbox' web endpoint * @link http://tools.ietf.org/html/rfc5849#section-2.2 * @return void */ private function authorise() { // Only redirect if not using CLI if (PHP_SAPI !== 'cli' && (!defined('DOING_CRON') || !DOING_CRON) && (!defined('DOING_AJAX') || !DOING_AJAX)) { $url = $this->getAuthoriseUrl(); if (!headers_sent()) { header('Location: ' . $url); exit; } else { throw new Dropbox_Exception(sprintf(__('The %s authentication could not go ahead, because something else on your site is breaking it. Try disabling your other plugins and switching to a default theme. (Specifically, you are looking for the component that sends output (most likely PHP warnings/errors) before the page begins. Turning off any debugging settings may also help).', 'updraftplus'), 'Dropbox')); } ?>log('Dropbox reauthorisation needed; but we are running from cron, AJAX or the CLI, so this is not possible'); $this->storage->do_unset('access_token'); throw new Dropbox_Exception(sprintf(__('You need to re-authenticate with %s, as your existing credentials are not working.', 'updraftplus'), 'Dropbox')); #$updraftplus->log(sprintf(__('You need to re-authenticate with %s, as your existing credentials are not working.', 'updraftplus'), 'Dropbox'), 'error'); return false; } /** * Build the user authorisation URL * @return string */ public function getAuthoriseUrl() { /* Generate a random key to be passed to Dropbox and stored in session to be checked to prevent CSRF Uses OpenSSL or Mcrypt or defaults to pure PHP implementaion if neither are available. */ global $updraftplus; if (!function_exists('crypt_random_string')) $updraftplus->ensure_phpseclib('Crypt_Random'); $CSRF = base64_encode(crypt_random_string(16)); $this->storage->set($CSRF,'CSRF'); // Prepare request parameters /* For OAuth v2 Dropbox needs to use a authorisation url that matches one that is set inside the Dropbox developer console. In order to check this it needs the client ID for the OAuth v2 app This will use the default one unless the user is using their own Dropbox App For users that use their own Dropbox App there is also no need to provide the callbackhome as part of the CSRF as there is no need to go to auth.updraftplus.com also the redirect uri can then be set to the home as default Check if the key has dropbox: if so then remove it to stop the request from being invalid */ $appkey = $this->storage->get('appkey'); if (!empty($appkey) && 'dropbox:' == substr($appkey, 0, 8)) { $key = substr($appkey, 8); } else if (!empty($appkey)) { $key = $appkey; } if ('' != $this->instance_id) $this->instance_id = ':'.$this->instance_id; $params = array( 'client_id' => empty($key) ? $this->oauth2_id : $key, 'response_type' => 'code', 'redirect_uri' => empty($key) ? $this->callback : $this->callbackhome, 'state' => empty($key) ? "POST:".$CSRF.$this->instance_id.$this->callbackhome : $CSRF.$this->instance_id, 'scope' => implode(' ', $this->scopes), 'token_access_type' => 'offline' ); // Build the URL and redirect the user $query = '?' . http_build_query($params, '', '&'); $url = self::WEB_URL . self::AUTHORISE_METHOD . $query; return $url; } protected function deauthenticate() { $url = UpdraftPlus_Dropbox_API::API_URL_V2 . self::DEAUTHORISE_METHOD; $response = $this->fetch('POST', $url, '', array('api_v2' => true)); $this->storage->delete(); } /** * Acquire an access token * Tokens acquired at this point should be stored to * prevent having to request new tokens for each API call * @link http://tools.ietf.org/html/rfc5849#section-2.3 */ public function getAccessToken() { // If this is non-empty, then we just received a code. It is stored in 'code' - our next job is to put it into the proper place. $code = $this->storage->get('code'); /* Checks to see if the user is using their own Dropbox App if so then they need to get a request token. If they are using our App then we just need to save these details */ if (!empty($code)){ $appkey = $this->storage->get('appkey'); if (!empty($appkey)){ // Get the signed request URL $url = UpdraftPlus_Dropbox_API::API_URL_V2 . self::ACCESS_TOKEN_METHOD; $params = array( 'code' => $code, 'grant_type' => 'authorization_code', 'redirect_uri' => $this->callbackhome, 'client_id' => $this->consumerKey, 'client_secret' => $this->consumerSecret, ); $response = $this->fetch('POST', $url, '' , $params); $code = json_decode(json_encode($response['body']),true); } else { $code = base64_decode($code); $code = json_decode($code, true); } /* Again oauth token secret and oauth token were needed by oauth1 these are replaced in oauth2 with an access token currently they are still there just in case a method somewhere is expecting them to both be set as far as I can tell only the oauth token is used after more testing token secret can be removed. */ $token = new stdClass(); $token->oauth_token_secret = $code['access_token']; $token->oauth_token = $code['access_token']; $token->account_id = $code['account_id']; $token->token_type = $code['token_type']; $token->uid = $code['uid']; $token->refresh_token = $code['refresh_token']; $token->expires_in = time() + $code['expires_in'] - 30; $this->storage->set($token, 'access_token'); $this->storage->do_unset('upgraded'); //reset code $this->storage->do_unset('code'); } else { throw new Dropbox_BadRequestException("No Dropbox Code found, will try to get one now", 400); } } /** * This function will make a request to the auth server sending the users refresh token to get a new access token * * @return void */ public function refreshAccessToken() { global $updraftplus; $access_token = $this->storage->get('access_token'); if ($this->callback == $this->callbackhome) { $url = UpdraftPlus_Dropbox_API::API_URL_V2 . self::ACCESS_TOKEN_METHOD; $params = array( 'grant_type' => 'refresh_token', 'refresh_token' => $access_token->refresh_token, 'client_id' => $this->consumerKey, 'client_secret' => $this->consumerSecret, ); } else { $url = $this->callback; $params = array( 'code' => 'ud_dropbox_code', 'refresh_token' => $access_token->refresh_token, 'headers' => apply_filters('updraftplus_auth_headers', ''), ); } $response = $this->fetch('POST', $url, '' , $params); if ("200" != $response['code']) { $updraftplus->log('Failed to refresh access token error code: '.$response['code']); return; } if (empty($response['body'])) { $updraftplus->log('Failed to refresh access token empty response body'); return; } // If the request comes from the auth server (master app refreshing a token) then we need to decode the response into an object before we can use it. $body = is_object($response['body']) ? $response['body'] : json_decode(base64_decode($response['body'])); if (isset($body->access_token) && isset($body->expires_in)) { $access_token->oauth_token_secret = $body->access_token; $access_token->oauth_token = $body->access_token; $access_token->expires_in = time() + $body->expires_in - 30; $this->storage->set($access_token, 'access_token'); $updraftplus->log('Successfully updated and refreshed the access token'); } else { $updraftplus->log('Failed to refresh access token missing token and expiry: '.json_encode($body)); return; } } /** * Get the request/access token * This will return the access/request token depending on * which stage we are at in the OAuth flow, or a dummy object * if we have not yet started the authentication process * @return object stdClass */ private function getToken() { if (!$token = $this->storage->get('access_token')) { if (!$token = $this->storage->get('request_token')) { $token = new stdClass(); $token->oauth_token = null; $token->oauth_token_secret = null; } } return $token; } /** * Generate signed request URL * See inline comments for description * @link http://tools.ietf.org/html/rfc5849#section-3.4 * @param string $method HTTP request method * @param string $url API endpoint to send the request to * @param string $call API call to send * @param array $additional Additional parameters as an associative array * @return array */ protected function getSignedRequest($method, $url, $call, array $additional = array()) { // Get the request/access token $token = $this->getToken(); // Prepare the standard request parameters differently for OAuth1 and OAuth2; we still need OAuth1 to make the request to the upgrade token endpoint if (isset($token->token_type)) { $params = array( 'access_token' => $token->oauth_token, ); /* To keep this API backwards compatible with the API v1 endpoints all v2 endpoints will also send to this method a api_v2 parameter this will then return just the access token as the signed request is not needed for any calls. */ if (isset($additional['api_v2']) && $additional['api_v2'] == true) { unset($additional['api_v2']); if (isset($additional['timeout'])) unset($additional['timeout']); if (isset($additional['content_download']) && $additional['content_download'] == true) { unset($additional['content_download']); $extra_headers = array(); if (isset($additional['headers'])) { foreach ($additional['headers'] as $key => $header) { $extra_headers[] = $header; } unset($additional['headers']); } $headers = array( 'Authorization: Bearer '.$params['access_token'], 'Content-Type:', 'Dropbox-API-Arg: '.json_encode($additional), ); $headers = array_merge($headers, $extra_headers); $additional = ''; } else if (isset($additional['content_upload']) && $additional['content_upload'] == true) { unset($additional['content_upload']); $headers = array( 'Authorization: Bearer '.$params['access_token'], 'Content-Type: application/octet-stream', 'Dropbox-API-Arg: '.json_encode($additional), ); $additional = ''; } else { $headers = array( 'Authorization: Bearer '.$params['access_token'], 'Content-Type: application/json', ); } return array( 'url' => $url . $call, 'postfields' => $additional, 'headers' => $headers, ); } elseif (isset($additional['code']) && isset($additional['refresh_token'])) { $extra_headers = array(); if (isset($additional['headers']) && !empty($additional['headers'])) { foreach ($additional['headers'] as $key => $header) { $extra_headers[] = $key.': '.$header; } unset($additional['headers']); } $headers = array(); $headers = array_merge($headers, $extra_headers); return array( 'url' => $url . $call, 'postfields' => $additional, 'headers' => $headers, ); } // if grant_type is set and it's value is refresh_token, then this is a custom app trying to get a new access token using their refresh token. So we don't want to send an access token and break the request. if (isset($additional['grant_type']) && 'refresh_token' == $additional['grant_type']) unset($params['access_token']); } else { // Generate a random string for the request $nonce = md5(microtime(true) . uniqid('', true)); $params = array( 'oauth_consumer_key' => $this->consumerKey, 'oauth_token' => $token->oauth_token, 'oauth_signature_method' => $this->sigMethod, 'oauth_version' => '1.0', // Generate nonce and timestamp if signature method is HMAC-SHA1 'oauth_timestamp' => ($this->sigMethod == 'HMAC-SHA1') ? time() : null, 'oauth_nonce' => ($this->sigMethod == 'HMAC-SHA1') ? $nonce : null, ); } // Merge with the additional request parameters $params = array_merge($params, $additional); ksort($params); // URL encode each parameter to RFC3986 for use in the base string $encoded = array(); foreach($params as $param => $value) { if ($value !== null) { // If the value is a file upload (prefixed with @), replace it with // the destination filename, the file path will be sent in POSTFIELDS if (isset($value[0]) && $value[0] === '@') $value = $params['filename']; # Prevent spurious PHP warning by only doing non-arrays if (!is_array($value)) $encoded[] = $this->encode($param) . '=' . $this->encode($value); } else { unset($params[$param]); } } // Build the first part of the string $base = $method . '&' . $this->encode($url . $call) . '&'; // Re-encode the encoded parameter string and append to $base $base .= $this->encode(implode('&', $encoded)); // Concatenate the secrets with an ampersand $key = $this->consumerSecret . '&' . $token->oauth_token_secret; // Get the signature string based on signature method $signature = $this->getSignature($base, $key); $params['oauth_signature'] = $signature; // Build the signed request URL $query = '?' . http_build_query($params, '', '&'); return array( 'url' => $url . $call . $query, 'postfields' => $params, ); } /** * Generate the oauth_signature for a request * @param string $base Signature base string, used by HMAC-SHA1 * @param string $key Concatenated consumer and token secrets */ private function getSignature($base, $key) { switch ($this->sigMethod) { case 'PLAINTEXT': $signature = $key; break; case 'HMAC-SHA1': $signature = base64_encode(hash_hmac('sha1', $base, $key, true)); break; } return $signature; } /** * Set the OAuth signature method * @param string $method Either PLAINTEXT or HMAC-SHA1 * @return void */ public function setSignatureMethod($method) { $method = strtoupper($method); switch ($method) { case 'PLAINTEXT': case 'HMAC-SHA1': $this->sigMethod = $method; break; default: throw new Dropbox_Exception('Unsupported signature method ' . $method); } } /** * Set the output file * @param resource Resource to stream response data to * @return void */ public function setOutFile($handle) { if (!is_resource($handle) || get_resource_type($handle) != 'stream') { throw new Dropbox_Exception('Outfile must be a stream resource'); } $this->outFile = $handle; } /** * Set the input file * @param resource Resource to read data from * @return void */ public function setInFile($handle) { $this->inFile = $handle; } /** * Parse response parameters for a token into an object * Dropbox returns tokens in the response parameters, and * not a JSON encoded object as per other API requests * @link http://oauth.net/core/1.0/#response_parameters * @param string $response * @return object stdClass */ private function parseTokenString($response) { $parts = explode('&', $response); $token = new stdClass(); foreach ($parts as $part) { list($k, $v) = explode('=', $part, 2); $k = strtolower($k); $token->$k = $v; } return $token; } /** * Encode a value to RFC3986 * This is a convenience method to decode ~ symbols encoded * by rawurldecode. This will encode all characters except * the unreserved set, ALPHA, DIGIT, '-', '.', '_', '~' * @link http://tools.ietf.org/html/rfc5849#section-3.6 * @param mixed $value */ private function encode($value) { return str_replace('%7E', '~', rawurlencode($value)); } } PKwL\ :updraftplus/includes/Dropbox2/OAuth/Consumer/WordPress.phpnu[ * @link https://github.com/DavidAnderson684/Dropbox * @package Dropbox\OAuth * @subpackage Consumer */ class Dropbox_ConsumerWordPress extends Dropbox_ConsumerAbstract { /** * Set properties and begin authentication * @param string $key * @param string $secret * @param \Dropbox\OAuth\Consumer\StorageInterface $storage * @param string $callback */ public function __construct($key, $secret, Dropbox_StorageInterface $storage, $callback = null) { // Check we are in a WordPress environment if (!defined('ABSPATH')) { throw new Dropbox_Exception('The WordPress OAuth consumer requires a WordPress environment'); } $this->consumerKey = $key; $this->consumerSecret = $secret; $this->storage = $storage; $this->callback = $callback; $this->authenticate(); } /** * Execute an API call * @param string $method The HTTP method * @param string $url The API endpoint * @param string $call The API method to call * @param array $additional Additional parameters * @return array */ public function fetch($method, $url, $call, array $additional = array()) { // Get the signed request URL $request = $this->getSignedRequest($method, $url, $call, $additional); if ($method == 'GET') { $args = array ( ); $response = wp_remote_get($request['url'], $args); $this->outFile = null; } elseif ($method == 'POST') { $args = array( 'body' => $request['postfields'] ); $response = wp_remote_post($request['url'], $args ); } elseif ($method == 'PUT' && $this->inFile) { return new WP_Error('unsupported', "WordPress does not have a native HTTP PUT function"); } // If the response body is not a JSON encoded string // we'll return the entire response body // Important to do this first, as the next section relies on the decoding having taken place if (!$body = json_decode(wp_remote_retrieve_body($response))) { $body = wp_remote_retrieve_body($response); } // Check if an error occurred and throw an Exception. This is part of the authentication process - don't modify. if (!empty($body->error)) { $message = $body->error . ' (Status Code: ' . wp_remote_retrieve_response_code($response) . ')'; throw new Dropbox_Exception($message); } if (is_wp_error($response)) { $message = $response->get_error_message(); throw new Dropbox_Exception($message); } $results = array ( 'body' => $body, 'code' => wp_remote_retrieve_response_code($response), 'headers' => $response['headers'] ); return $results; } } PKwL\&"S8S85updraftplus/includes/Dropbox2/OAuth/Consumer/Curl.phpnu[ * @link https://github.com/benthedesigner/dropbox * @package Dropbox\OAuth * @subpackage Consumer */ class Dropbox_Curl extends Dropbox_ConsumerAbstract { /** * Dropbox consumer key * @var String */ protected $consumerKey; /** * Dropbox oauth2_id * @var String */ protected $oauth2_id; /** * Dropbox consumer secret * @var String */ protected $consumerSecret; /** * Dropbox storage object * @var \Dropbox\OAuth\Consumer\StorageInterface|Dropbox_StorageInterface */ protected $storage; /** * Not used anywhere but it is set * @var Callable|Null */ protected $callback; /** * Callback URL * @var String|null */ protected $callbackhome; /** * Dropbox storage instance id * @var String */ protected $instance_id; /** * Default cURL options * @var array */ protected $defaultOptions = array( CURLOPT_VERBOSE => true, CURLOPT_HEADER => true, CURLINFO_HEADER_OUT => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, ); /** * Store the last response form the API * @var mixed */ protected $lastResponse = null; /** * Set properties and begin authentication * @param string $key * @param string $secret * @param \Dropbox\OAuth\Consumer\StorageInterface $storage * @param string $callback */ public function __construct($key, $oauth2_id, $secret, Dropbox_StorageInterface $storage, $callback = null, $callbackhome = null, $deauthenticate = false, $instance_id = '') { // Check the cURL extension is loaded if (!extension_loaded('curl')) { throw new Dropbox_Exception('The cURL OAuth consumer requires the cURL extension. Please speak to your web hosting provider so that this missing PHP component can be installed.'); } $this->consumerKey = $key; $this->oauth2_id = $oauth2_id; $this->consumerSecret = $secret; $this->storage = $storage; $this->callback = $callback; $this->callbackhome = $callbackhome; $this->instance_id = $instance_id; if ($deauthenticate) { $this->deauthenticate(); } else { $this->authenticate(); } } /** * Execute an API call * @todo Improve error handling * @param string $method The HTTP method * @param string $url The API endpoint * @param string $call The API method to call * @param array $additional Additional parameters * @return string|object stdClass */ public function fetch($method, $url, $call, array $additional = array(), $retry_with_header = false) { // Get the signed request URL $request = $this->getSignedRequest($method, $url, $call, $additional); // Initialise and execute a cURL request $handle = curl_init($request['url']); // Get the default options array $options = $this->defaultOptions; if (!UpdraftPlus_Options::get_updraft_option('updraft_ssl_useservercerts')) { $options[CURLOPT_CAINFO] = UPDRAFTPLUS_DIR.'/includes/cacert.pem'; } if (UpdraftPlus_Options::get_updraft_option('updraft_ssl_disableverify')) { $options[CURLOPT_SSL_VERIFYPEER] = false; } else { $options[CURLOPT_SSL_VERIFYPEER] = true; } if (!class_exists('WP_HTTP_Proxy')) require_once(ABSPATH.WPINC.'/class-http.php'); $proxy = new WP_HTTP_Proxy(); if ($proxy->is_enabled()) { # WP_HTTP_Proxy returns empty strings if nothing is set $user = $proxy->username(); $pass = $proxy->password(); $host = $proxy->host(); $port = (int)$proxy->port(); if (empty($port)) $port = 8080; if (!empty($host) && $proxy->send_through_proxy($request['url'])) { $options[CURLOPT_PROXY] = $host; $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP; $options[CURLOPT_PROXYPORT] = $port; if (!empty($user) && !empty($pass)) { $options[CURLOPT_PROXYAUTH] = CURLAUTH_ANY; $options[CURLOPT_PROXYUSERPWD] = sprintf('%s:%s', $user, $pass); } } } /* Add check to see if it's an API v2 call if so then json encode the contents. This is so that it is backwards compatible with API v1 endpoints. */ if (isset($additional['api_v2']) && !empty($request['postfields'])) { $request['postfields'] = json_encode($request['postfields']); } if (isset($request['headers']) && !empty($request['headers'])) $options[CURLOPT_HTTPHEADER] = $request['headers']; if ($method == 'GET' && $this->outFile) { // GET $options[CURLOPT_RETURNTRANSFER] = false; $options[CURLOPT_HEADER] = false; $options[CURLOPT_FILE] = $this->outFile; $options[CURLOPT_BINARYTRANSFER] = true; $options[CURLOPT_FAILONERROR] = true; $this->outFile = null; } elseif ($method == 'POST' && $this->outFile) { // POST $options[CURLOPT_POST] = true; $options[CURLOPT_RETURNTRANSFER] = false; $options[CURLOPT_HEADER] = false; $options[CURLOPT_FILE] = $this->outFile; $options[CURLOPT_BINARYTRANSFER] = true; $options[CURLOPT_FAILONERROR] = true; $this->outFile = null; } elseif ($method == 'POST' && $this->inFile) { // POST $options[CURLOPT_POST] = true; $options[CURLOPT_POSTFIELDS] = $this->inFile; } elseif ($method == 'POST') { // POST $options[CURLOPT_POST] = true; if (!empty($request['postfields'])) { $options[CURLOPT_POSTFIELDS] = $request['postfields']; } elseif (empty($additional['content_upload'])) { // JSON representation of nullity $options[CURLOPT_POSTFIELDS] = 'null'; } elseif ($retry_with_header) { // It's a content upload, and there's no data. Versions of php-curl differ as to whether they add a Content-Length header automatically or not. Dropbox complains if it's not there. Here we have had a Dropbox 400 bad request returned so we try again with the header $options[CURLOPT_HTTPHEADER] = array_merge($options[CURLOPT_HTTPHEADER], array('Content-Length: 0')); } } elseif ($method == 'PUT' && $this->inFile) { // PUT $options[CURLOPT_PUT] = true; $options[CURLOPT_INFILE] = $this->inFile; // @todo Update so the data is not loaded into memory to get its size $options[CURLOPT_INFILESIZE] = strlen(stream_get_contents($this->inFile)); fseek($this->inFile, 0); $this->inFile = null; } if (isset($additional['timeout'])) { $options[CURLOPT_TIMEOUT] = $additional['timeout']; } if (function_exists('apply_filters')) $options = apply_filters('updraftplus_dropbox_fetch_curl_options', $options, $method, $url, $call, $additional); // Set the cURL options at once curl_setopt_array($handle, $options); // Execute, get any error and close $response = curl_exec($handle); $error = curl_error($handle); $getinfo = curl_getinfo($handle); curl_close($handle); //Check if a cURL error has occured if ($response === false) { throw new Dropbox_CurlException($error); } else { // Parse the response if it is a string if (is_string($response)) { $response = $this->parse($response); } // Set the last response $this->lastResponse = $response; $code = (!empty($response['code'])) ? $response['code'] : $getinfo['http_code']; // The API doesn't return an error message for the 304 status code... // 304's are only returned when the path supplied during metadata calls has not been modified if ($code == 304) { $response['body'] = new stdClass; $response['body']->error = 'The folder contents have not changed'; } // Check if an error occurred and throw an Exception if (!empty($response['body']->error) || $code >= 400) { // Dropbox returns error messages inconsistently... if (!empty($response['body']->error) && $response['body']->error instanceof stdClass) { $array = array_values((array) $response['body']->error); // Dropbox API v2 only throws 409 errors if this error is a incorrect_offset then we need the entire error array not just the message. PHP Exception messages have to be a string so JSON encode the array. $extract_message = (is_object($array[0]) && isset($array[0]->{'.tag'})) ? $array[0]->{'.tag'} : $array[0]; if (strpos($extract_message, 'incorrect_offset') !== false) { $message = json_encode($array); } elseif (strpos($extract_message, 'lookup_failed') !== false ) { // re-structure the array so it is correctly formatted for API // Note: Dropbox v2 returns different errors at different stages hence this fix $correctOffset = array( '0' => $array[1]->{'.tag'}, ); // the lookup_failed response doesn't always return a correct_offset this happens when the lookup fails because the session has been closed e.g the file has already been uploaded but the response didn't make it back to the client so we try again if (isset($array[1]->correct_offset)) $correctOffset['1'] = $array[1]->correct_offset; $message = json_encode($correctOffset); } else { $message = $extract_message; } } elseif (!empty($response['body']->error)) { $message = $response['body']->error; } elseif (is_string($response['body'])) { // 31 Mar 2017 - This case has been found to exist; though the docs imply that there's always an 'error' property and that what is returned in JSON, we found a case of this being returned just as a simple string, but detectable via an HTTP 400: Error in call to API function "files/upload_session/append_v2": HTTP header "Dropbox-API-Arg": cursor.offset: expected integer, got string $message = $response['body']; } else { $message = "HTTP bad response code: $code"; } // Throw an Exception with the appropriate with the appropriate message and code switch ($code) { case 304: throw new Dropbox_NotModifiedException($message, 304); case 400: if (!$retry_with_header) return $this->fetch($method, $url, $call, $additional, true); throw new Dropbox_BadRequestException($message, 400); case 404: throw new Dropbox_NotFoundException($message, 404); case 406: throw new Dropbox_NotAcceptableException($message, 406); case 415: throw new Dropbox_UnsupportedMediaTypeException($message, 415); case 401: //401 means oauth token is expired continue to manually handle the exception depending on the situation break; case 409: //409 in API V2 every error will return with a 409 to find out what the error is the error description should be checked. throw new Dropbox_Exception($message, $code); default: throw new Dropbox_Exception($message, $code); } } return $response; } } /** * Parse a cURL response * @param string $response * @return array */ private function parse($response) { // Explode the response into headers and body parts (separated by double EOL) list($headers, $response) = explode("\r\n\r\n", $response, 2); // Explode response headers $lines = explode("\r\n", $headers); // If the status code is 100, the API server must send a final response // We need to explode the response again to get the actual response if (preg_match('#^HTTP/[\.\d]+ 100#i', $lines[0])) { list($headers, $response) = explode("\r\n\r\n", $response, 2); $lines = explode("\r\n", $headers); } // Get the HTTP response code from the first line $first = array_shift($lines); $pattern = '#^HTTP/[\.\d]+ ([0-9]{3})#i'; preg_match($pattern, $first, $matches); $code = $matches[1]; // Parse the remaining headers into an associative array $headers = array(); foreach ($lines as $line) { list($k, $v) = explode(': ', $line, 2); $headers[strtolower($k)] = $v; } // If the response body is not a JSON encoded string // we'll return the entire response body if (!$body = json_decode($response)) { $body = $response; } if (is_string($body)) { $body_lines = explode("\r\n", $body); if (preg_match('#^HTTP/[\.\d]+ 100#i', $body_lines[0]) && preg_match('#^HTTP/\d#i', $body_lines[2])) { return $this->parse($body); } } return array('code' => $code, 'body' => $body, 'headers' => $headers); } /** * Return the response for the last API request * @return mixed */ public function getlastResponse() { return $this->lastResponse; } } PKwL\(;~~9updraftplus/includes/Dropbox2/OAuth/Storage/Encrypter.phpnu[ * @link https://github.com/benthedesigner/dropbox * @package Dropbox\Oauth * @subpackage Storage */ /* UpdraftPlus notes Using this was fairly pointless (it encrypts storage credentials at rest). But, it's implemented now, so needs supporting. Investigation shows that mcrypt and phpseclib native encryption using different padding schemes. As a result, that which is encrypted by phpseclib native can be decrypted by mcrypt, but not vice-versa. Each can (as you'd expect) decrypt the results of their own encryption. As a consequence, it makes sense to always encrypt with phpseclib native, and prefer decrypting with with mcrypt if it is available and otherwise fall back to phpseclib. We could deliberately re-encrypt all loaded information with phpseclib native, but there seems little need for that yet. There can only be a problem if mcrypt is disabled - which pre-July-2015 meant that Dropbox wouldn't work at all. Now, it will force a re-authorisation. */ class Dropbox_Encrypter { // Encryption settings - default settings yield encryption to AES (256-bit) standard // @todo Provide PHPDOC for each class constant const KEY_SIZE = 32; const IV_SIZE = 16; /** * Encryption key * @var null|string */ private $key = null; /** * Check Mcrypt is loaded and set the encryption key * @param string $key * @return void */ public function __construct($key) { if (preg_match('/^[A-Za-z0-9]+$/', $key) && $length = strlen($key) === self::KEY_SIZE) { # Short-cut so that the mbstring extension is not required $this->key = $key; } elseif (($length = mb_strlen($key, '8bit')) !== self::KEY_SIZE) { throw new Dropbox_Exception('Expecting a ' . self::KEY_SIZE . ' byte key, got ' . $length); } else { // Set the encryption key $this->key = $key; } } /** * Encrypt the OAuth token * @param \stdClass $token Serialized token object * @return string */ public function encrypt($token) { // Encryption: we always use phpseclib for this global $updraftplus; $ensure_phpseclib = $updraftplus->ensure_phpseclib('Crypt_AES'); if (is_wp_error($ensure_phpseclib)) { $updraftplus->log("Failed to load phpseclib classes (".$ensure_phpseclib->get_error_code()."): ".$ensure_phpseclib->get_error_message()); $updraftplus->log("Failed to load phpseclib classes (".$ensure_phpseclib->get_error_code()."): ".$ensure_phpseclib->get_error_message(), 'error'); return false; } $updraftplus->ensure_phpseclib('Crypt_Rijndael'); if (!function_exists('crypt_random_string')) updraft_try_include_file('vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php', 'require_once'); $iv = crypt_random_string(self::IV_SIZE); // Defaults to CBC mode $rijndael = new Crypt_Rijndael(); $rijndael->setKey($this->key); $rijndael->setIV($iv); $cipherText = $rijndael->encrypt($token); return base64_encode($iv . $cipherText); } /** * Decrypt the ciphertext * @param string $cipherText * @return object \stdClass Unserialized token */ public function decrypt($cipherText) { // Decryption: prefer mcrypt, if available (since it can decrypt data encrypted by either mcrypt or phpseclib) $cipherText = base64_decode($cipherText); $iv = substr($cipherText, 0, self::IV_SIZE); $cipherText = substr($cipherText, self::IV_SIZE); $decrypted = false; if (function_exists('mcrypt_decrypt')) { // @codingStandardsIgnoreLine $token = @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->key, $cipherText, MCRYPT_MODE_CBC, $iv); // Some plugins provide their own version of mcrypt_* functions and they don't provide the functionality that the original method has, so try and detect if the decryption has failed and if so try rijndael if (false != $token) $decrypted = true; } if (!$decrypted) { global $updraftplus; $updraftplus->ensure_phpseclib('Crypt_Rijndael'); $rijndael = new Crypt_Rijndael(); $rijndael->setKey($this->key); $rijndael->setIV($iv); $token = $rijndael->decrypt($cipherText); } return $token; } } PKwL\P%c@updraftplus/includes/Dropbox2/OAuth/Storage/StorageInterface.phpnu[ * @link https://github.com/benthedesigner/dropbox * @package Dropbox\OAuth * @subpackage Storage */ interface Dropbox_StorageInterface { /** * Get a token by type * @param string $type Token type to retrieve */ public function get($type); /** * Set a token by type * @param \stdClass $token Token object to set * @param string $type Token type */ public function set($token, $type); /** * Delete tokens for the current session/user */ public function delete(); } PKwL\ρ9updraftplus/includes/Dropbox2/OAuth/Storage/WordPress.phpnu[ * @link https://updraftplus.com * @package Dropbox\Oauth * @subpackage Storage */ class Dropbox_WordPress implements Dropbox_StorageInterface { /** * Option name * @var string */ protected $option_name_prefix = 'dropbox_token'; /** * Option name (array storage) * @var string */ protected $option_array = ''; /** * Encyption object * @var Encrypter|null */ protected $encrypter = null; /** * Backup module object * @var Backup_module_object|null */ protected $backup_module_object = null; /** * Check if an instance of the encrypter is passed, set the encryption object * @return void */ public function __construct(Dropbox_Encrypter $encrypter = null, $option_name_prefix = 'dropbox_token', $option_array = 'dropbox', $backup_module_object = null) { if ($encrypter instanceof Dropbox_Encrypter) { $this->encrypter = $encrypter; } if ($backup_module_object instanceof UpdraftPlus_BackupModule) { $this->backup_module_object = $backup_module_object; } $this->option_name_prefix = $option_name_prefix; $this->option_array = $option_array; } /** * Get an entry from the Dropbox options in the database * If the encryption object is set then decrypt the token before returning * @param string $type is the key to retrieve * @return array|bool */ public function get($type) { if ($type != 'request_token' && $type != 'access_token' && $type != 'appkey' && $type != 'CSRF' && $type != 'code') { throw new Dropbox_Exception("Expected a type of either 'request_token', 'access_token', 'CSRF' or 'code', got '$type'"); } else { if (false !== ($opts = $this->backup_module_object->get_options())) { if ($type == 'request_token' || $type == 'access_token'){ if (!empty($opts[$this->option_name_prefix.$type])) { $gettoken = $opts[$this->option_name_prefix.$type]; $token = $this->decrypt($gettoken); return $token; } } else { if (!empty($opts[$type])) { return $opts[$type]; } } } return false; } } /** * Set a value in the database by type * If the value is a token and the encryption object is set then encrypt the token before storing * @param \stdClass Token object to set * @param string $type Token type * @return void */ public function set($token, $type) { if ($type != 'request_token' && $type != 'access_token' && $type != 'upgraded' && $type != 'CSRF' && $type != 'code') { throw new Dropbox_Exception("Expected a type of either 'request_token', 'access_token', 'CSRF', 'upgraded' or 'code', got '$type'"); } else { $opts = $this->backup_module_object->get_options(); if ($type == 'access_token'){ $token = $this->encrypt($token); $opts[$this->option_name_prefix.$type] = $token; } else if ($type == 'request_token' ) { $opts[$this->option_name_prefix.$type] = $token; } else { $opts[$type] = $token; } $this->backup_module_object->set_options($opts, true); } } /** * Remove a value in the database by type rather than setting to null / empty * set the value to null here so that when it gets to the options filter it will * unset the value there, this avoids a bug where if the value is not set then * the option filter will take the value from the database and save that version back. * * N.B. Before PHP 7.0, you can't call a method name unset() * * @param string $type Token type * @return void */ public function do_unset($type) { if ($type != 'request_token' && $type != 'access_token' && $type != 'upgraded' && $type != 'CSRF' && $type != 'code') { throw new Dropbox_Exception("Expected a type of either 'request_token', 'access_token', 'CSRF', 'upgraded' or 'code', got '$type'"); } else { $opts = $this->backup_module_object->get_options(); if ($type == 'access_token' || $type == 'request_token'){ $opts[$this->option_name_prefix.$type] = null; } else { $opts[$type] = null; } $this->backup_module_object->set_options($opts, true); } } /** * Delete the request and access tokens currently stored in the database * @return bool */ public function delete() { $opts = $this->backup_module_object->get_options(); $opts[$this->option_name_prefix.'request_token'] = null; $opts[$this->option_name_prefix.'access_token'] = null; unset($opts['ownername']); unset($opts['upgraded']); $this->backup_module_object->set_options($opts, true); return true; } /** * Use the Encrypter to encrypt a token and return it * If there is not encrypter object, return just the * serialized token object for storage * @param stdClass $token OAuth token to encrypt * @return stdClass|string */ protected function encrypt($token) { // Serialize the token object $token = serialize($token); // Encrypt the token if there is an Encrypter instance if ($this->encrypter instanceof Dropbox_Encrypter) { $token = $this->encrypter->encrypt($token); } // Return the token return $token; } /** * Decrypt a token using the Encrypter object and return it * If there is no Encrypter object, assume the token was stored * serialized and return the unserialized token object * @param stdClass $token OAuth token to encrypt * @return stdClass|string */ protected function decrypt($token) { // Decrypt the token if there is an Encrypter instance if ($this->encrypter instanceof Dropbox_Encrypter) { $token = $this->encrypter->decrypt($token); } // Return the unserialized token return @unserialize($token); } } PKwL\{|h;;%updraftplus/includes/Dropbox2/API.phpnu[ * @link https://github.com/benthedesigner/dropbox * @link https://www.dropbox.com/developers * @link https://status.dropbox.com Dropbox status * @package Dropbox */ class UpdraftPlus_Dropbox_API { // API Endpoints const API_URL_V2 = 'https://api.dropboxapi.com/'; const CONTENT_URL_V2 = 'https://content.dropboxapi.com/2/'; /** * OAuth consumer object * @var null|OAuth\Consumer */ private $OAuth; /** * The root level for file paths * Either `dropbox` or `sandbox` (preferred) * @var null|string */ private $root; /** * JSONP callback * @var string */ private $callback = 'dropboxCallback'; /** * Chunk size used for chunked uploads * @see \Dropbox\API::chunkedUpload() */ private $chunkSize = 4194304; /** * Set the OAuth consumer object * See 'General Notes' at the link below for information on access type * @link https://www.dropbox.com/developers/reference/api * @param OAuth\Consumer\ConsumerAbstract $OAuth * @param string $root Dropbox app access type */ public function __construct(Dropbox_ConsumerAbstract $OAuth, $root = 'sandbox') { $this->OAuth = $OAuth; $this->setRoot($root); } /** * Set the root level * @param mixed $root * @throws Exception * @return void */ public function setRoot($root) { if ($root !== 'sandbox' && $root !== 'dropbox') { throw new Exception("Expected a root of either 'dropbox' or 'sandbox', got '$root'"); } else { $this->root = $root; } } /** * This function will make a request to refresh the access token * * @return void */ public function refreshAccessToken() { $this->OAuth->refreshAccessToken(); } /** * Retrieves information about the user's account * @return object stdClass */ public function accountInfo() { $call = '2/users/get_current_account'; $params = array('api_v2' => true); $response = $this->fetch('POST', self::API_URL_V2, $call, $params); return $response; } /** * Retrieves information about the user's quota * @param array $options - valid keys are 'timeout' * @return object stdClass */ public function quotaInfo($options = array()) { $call = '2/users/get_space_usage'; // Cases have been seen (Apr 2019) where a response came back (HTTP/2.0 response header - suspected outgoing web hosting proxy, as everyone else seems to get HTTP/1.0 and I'm not aware that current Curl versions would do HTTP/2.0 without specifically being told to) after 180 seconds; a valid response, but took a long time. $params = array( 'api_v2' => true, 'timeout' => isset($options['timeout']) ? $options['timeout'] : 20 ); $response = $this->fetch('POST', self::API_URL_V2, $call, $params); return $response; } /** * Uploads large files to Dropbox in mulitple chunks * @param string $file Absolute path to the file to be uploaded * @param string|bool $filename The destination filename of the uploaded file * @param string $path Path to upload the file to, relative to root * @param boolean $overwrite Should the file be overwritten? (Default: true) * @param integer $offset position to seek to when opening the file * @param string $uploadID existing upload_id to resume an upload * @param string|array function to call back to upon each chunk * @return stdClass */ public function chunkedUpload($file, $filename = false, $path = '', $overwrite = true, $offset = 0, $uploadID = null, $callback = null) { if (file_exists($file)) { if ($handle = @fopen($file, 'r')) { // Set initial upload ID and offset if ($offset > 0) { fseek($handle, $offset); } /* Set firstCommit to true so that the upload session start endpoint is called. */ $firstCommit = (0 == $offset); // Read from the file handle until EOF, uploading each chunk while ($data = fread($handle, $this->chunkSize)) { // Set the file, request parameters and send the request $this->OAuth->setInFile($data); if ($firstCommit) { $params = array( 'close' => false, 'api_v2' => true, 'content_upload' => true ); $response = $this->fetch('POST', self::CONTENT_URL_V2, 'files/upload_session/start', $params); $firstCommit = false; } else { $params = array( 'cursor' => array( 'session_id' => $uploadID, // If you send it as a string, Dropbox will be unhappy 'offset' => (int)$offset ), 'api_v2' => true, 'content_upload' => true ); $response = $this->append_upload($params, false); } // On subsequent chunks, use the upload ID returned by the previous request if (isset($response['body']->session_id)) { $uploadID = $response['body']->session_id; } /* API v2 no longer returns the offset, we need to manually work this out. So check that there are no errors and update the offset as well as calling the callback method. */ if (!isset($response['body']->error)) { $offset = ftell($handle); if ($callback) { call_user_func($callback, $offset, $uploadID, $file); } $this->OAuth->setInFile(null); } } // Complete the chunked upload $filename = (is_string($filename)) ? $filename : basename($file); $params = array( 'cursor' => array( 'session_id' => $uploadID, 'offset' => $offset ), 'commit' => array( 'path' => '/' . $this->encodePath($path . $filename), 'mode' => 'add' ), 'api_v2' => true, 'content_upload' => true ); $response = $this->append_upload($params, true); return $response; } else { throw new Exception('Could not open ' . $file . ' for reading'); } } // Throw an Exception if the file does not exist throw new Exception('Local file ' . $file . ' does not exist'); } private function append_upload($params, $last_call) { try { if ($last_call){ $response = $this->fetch('POST', self::CONTENT_URL_V2, 'files/upload_session/finish', $params); } else { $response = $this->fetch('POST', self::CONTENT_URL_V2, 'files/upload_session/append_v2', $params); } } catch (Exception $e) { $responseCheck = json_decode($e->getMessage()); if (empty($responseCheck)) { throw $e; } else { $extract_message = (is_object($responseCheck[0]) && isset($responseCheck[0]->{'.tag'})) ? $responseCheck[0]->{'.tag'} : $responseCheck[0]; if (strpos($extract_message, 'incorrect_offset') !== false) { $expected_offset = $responseCheck[1]; throw new Exception('Submitted input out of alignment: got ['.$params['cursor']['offset'].'] expected ['.$expected_offset.']'); // $params['cursor']['offset'] = $responseCheck[1]; // $response = $this->append_upload($params, $last_call); } elseif (strpos($extract_message, 'closed') !== false) { throw new Exception("Upload with upload_id {$params['cursor']['session_id']} already completed"); } elseif (strpos($extract_message, 'too_many_requests') !== false) { throw new Exception("Dropbox API error: too_many_requests"); } } } return $response; } /** * Chunked downloads a file from Dropbox, it will return false if a file handle is not passed and will return true if the call was successful. * * @param string $file Path - to file, relative to root, including path * @param resource $outFile - the local file handle * @param array $options - any extra options to be passed e.g headers * @return boolean - a boolean to indicate success or failure */ public function download($file, $outFile = null, $options = array()) { if ($outFile) { $this->OAuth->setOutFile($outFile); $params = array('path' => '/' . $file, 'api_v2' => true, 'content_download' => true); if (isset($options['headers'])) { foreach ($options['headers'] as $key => $header) { $headers[] = $key . ': ' . $header; } $params['headers'] = $headers; } $file = $this->encodePath($file); $call = 'files/download'; $response = $this->fetch('GET', self::CONTENT_URL_V2, $call, $params); fclose($outFile); return true; } else { return false; } } /** * Calls the relevant method to return metadata for all files and folders that match the search query * @param mixed $query The search string. Must be at least 3 characters long * @param string [$path=''] The path to the folder you want to search in * @param integer [$limit=1000] Maximum number of results to return (1-1000) * @param integer [$cursor=''] A Dropbox ID to start the search from * @return array */ public function search($query, $path = '', $limit = 1000, $cursor = '') { if (empty($cursor)) { return $this->start_search($query, $path, $limit); } else { return $this->continue_search($cursor); } } /** * This method will start a search for all files and folders that match the search query * * @param mixed $query - the search string, must be at least 3 characters long * @param string $path - the path to the folder you want to search in * @param integer $limit - maximum number of results to return (1-1000) * * @return array - an array of search results */ private function start_search($query, $path, $limit) { $call = '2/files/search_v2'; $path = $this->encodePath($path); // APIv2 requires that the path match this regex: String(pattern="(/(.|[\r\n])*)?|(ns:[0-9]+(/.*)?)") if ($path && '/' != substr($path, 0, 1)) $path = "/$path"; $params = array( 'query' => $query, 'options' => array( 'path' => $path, 'max_results' => ($limit < 1) ? 1 : (($limit > 1000) ? 1000 : (int) $limit), ), 'api_v2' => true, ); $response = $this->fetch('POST', self::API_URL_V2, $call, $params); return $response; } /** * This method will continue a previous search for all files and folders that match the previous search query * * @param string $cursor - a Dropbox ID to continue the search * * @return array - an array of search results */ private function continue_search($cursor) { $call = '2/files/search/continue_v2'; $params = array( 'cursor' => $cursor, 'api_v2' => true, ); $response = $this->fetch('POST', self::API_URL_V2, $call, $params); return $response; } /** * Deletes a file or folder * @param string $path The path to the file or folder to be deleted * @return object stdClass */ public function delete($path) { $call = '2/files/delete_v2'; $params = array('path' => '/' . $this->normalisePath($path), 'api_v2' => true); $response = $this->fetch('POST', self::API_URL_V2, $call, $params); return $response; } /** * Intermediate fetch function * @param string $method The HTTP method * @param string $url The API endpoint * @param string $call The API method to call * @param array $params Additional parameters * @return mixed */ private function fetch($method, $url, $call, array $params = array()) { // Make the API call via the consumer return $this->OAuth->fetch($method, $url, $call, $params); } /** * Set the chunk size for chunked uploads * If $chunkSize is empty, set to 4194304 bytes (4 MB) * @see \Dropbox\API\chunkedUpload() */ public function setChunkSize($chunkSize = 4194304) { if (!is_int($chunkSize)) { throw new Exception('Expecting chunk size to be an integer, got ' . gettype($chunkSize)); } elseif ($chunkSize > 157286400) { throw new Exception('Chunk size must not exceed 157286400 bytes, got ' . $chunkSize); } else { $this->chunkSize = $chunkSize; } } /** * Set the JSONP callback function * @param string $function * @return void */ public function setCallback($function) { $this->callback = $function; } /** * Get the mime type of downloaded file * If the Fileinfo extension is not loaded, return false * @param string $data File contents as a string or filename * @param string $isFilename Is $data a filename? * @return boolean|string Mime type and encoding of the file */ private function getMimeType($data, $isFilename = false) { if (extension_loaded('fileinfo')) { $finfo = new finfo(FILEINFO_MIME); if ($isFilename !== false) { return $finfo->file($data); } return $finfo->buffer($data); } return false; } /** * Trim the path of forward slashes and replace * consecutive forward slashes with a single slash * @param string $path The path to normalise * @return string */ private function normalisePath($path) { $path = preg_replace('#/+#', '/', trim($path, '/')); return $path; } /** * Encode the path, then replace encoded slashes * with literal forward slash characters * @param string $path The path to encode * @return string */ private function encodePath($path) { // in APIv1, encoding was needed because parameters were passed as part of the URL; this is no longer done in our APIv2 SDK; hence, all that we now do here is normalise. return $this->normalisePath($path); } } PKwL\8..+updraftplus/includes/Dropbox2/Exception.phpnu[ * @link https://github.com/benthedesigner/dropbox * @package Dropbox */ class Dropbox_Exception extends Exception { } class Dropbox_BadRequestException extends Exception { } class Dropbox_CurlException extends Exception { } class Dropbox_NotAcceptableException extends Exception { } class Dropbox_NotFoundException extends Exception { } class Dropbox_NotModifiedException extends Exception { } class Dropbox_UnsupportedMediaTypeException extends Exception { } PKwL\p(+updraftplus/includes/Google/Auth/Simple.phpnu[client = $client; } /** * Perform an authenticated / signed apiHttpRequest. * This function takes the apiHttpRequest, calls apiAuth->sign on it * (which can modify the request in what ever way fits the auth mechanism) * and then calls apiCurlIO::makeRequest on the signed request * * @param Google_Http_Request $request * @return Google_Http_Request The resulting HTTP response including the * responseHttpCode, responseHeaders and responseBody. */ public function authenticatedRequest(UDP_Google_Http_Request $request) { $request = $this->sign($request); return $this->io->makeRequest($request); } public function sign(UDP_Google_Http_Request $request) { $key = $this->client->getClassConfig($this, 'developer_key'); if ($key) { $this->client->getLogger()->debug( 'Simple API Access developer key authentication' ); $request->setQueryParam('key', $key); } return $request; } } PKwL\9updraftplus/includes/Google/Auth/AssertionCredentials.phpnu[serviceAccountName = $serviceAccountName; $this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes); $this->privateKey = $privateKey; $this->privateKeyPassword = $privateKeyPassword; $this->assertionType = $assertionType; $this->sub = $sub; $this->prn = $sub; $this->useCache = $useCache; } /** * Generate a unique key to represent this credential. * @return string */ public function getCacheKey() { if (!$this->useCache) { return false; } $h = $this->sub; $h .= $this->assertionType; $h .= $this->privateKey; $h .= $this->scopes; $h .= $this->serviceAccountName; return md5($h); } public function generateAssertion() { $now = time(); $jwtParams = array( 'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI, 'scope' => $this->scopes, 'iat' => $now, 'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS, 'iss' => $this->serviceAccountName, ); if ($this->sub !== false) { $jwtParams['sub'] = $this->sub; } else if ($this->prn !== false) { $jwtParams['prn'] = $this->prn; } return $this->makeSignedJwt($jwtParams); } /** * Creates a signed JWT. * @param array $payload * @return string The signed JWT. */ private function makeSignedJwt($payload) { $header = array('typ' => 'JWT', 'alg' => 'RS256'); $payload = json_encode($payload); // Handle some overzealous escaping in PHP json that seemed to cause some errors // with claimsets. $payload = str_replace('\/', '/', $payload); $segments = array( Google_Utils::urlSafeB64Encode(json_encode($header)), Google_Utils::urlSafeB64Encode($payload) ); $signingInput = implode('.', $segments); $signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword); $signature = $signer->sign($signingInput); $segments[] = Google_Utils::urlSafeB64Encode($signature); return implode(".", $segments); } } PKwL\x -updraftplus/includes/Google/Auth/Abstract.phpnu[ * */ abstract class Google_Auth_Abstract { /** * An utility function that first calls $this->auth->sign($request) and then * executes makeRequest() on that signed request. Used for when a request * should be authenticated * @param Google_Http_Request $request * @return Google_Http_Request $request */ abstract public function authenticatedRequest(UDP_Google_Http_Request $request); abstract public function sign(UDP_Google_Http_Request $request); } PKwL\2updraftplus/includes/Google/Auth/ComputeEngine.phpnu[ */ class Google_Auth_ComputeEngine extends Google_Auth_Abstract { const METADATA_AUTH_URL = 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'; private $client; private $token; public function __construct(UDP_Google_Client $client, $config = null) { $this->client = $client; } /** * Perform an authenticated / signed apiHttpRequest. * This function takes the apiHttpRequest, calls apiAuth->sign on it * (which can modify the request in what ever way fits the auth mechanism) * and then calls apiCurlIO::makeRequest on the signed request * * @param Google_Http_Request $request * @return Google_Http_Request The resulting HTTP response including the * responseHttpCode, responseHeaders and responseBody. */ public function authenticatedRequest(UDP_Google_Http_Request $request) { $request = $this->sign($request); return $this->client->getIo()->makeRequest($request); } /** * @param string $token * @throws Google_Auth_Exception */ public function setAccessToken($token) { $token = json_decode($token, true); if ($token == null) { throw new Google_Auth_Exception('Could not json decode the token'); } if (! isset($token['access_token'])) { throw new Google_Auth_Exception("Invalid token format"); } $token['created'] = time(); $this->token = $token; } public function getAccessToken() { return json_encode($this->token); } /** * Acquires a new access token from the compute engine metadata server. * @throws Google_Auth_Exception */ public function acquireAccessToken() { $request = new UDP_Google_Http_Request( self::METADATA_AUTH_URL, 'GET', array( 'Metadata-Flavor' => 'Google' ) ); $request->disableGzip(); $response = $this->client->getIo()->makeRequest($request); if ($response->getResponseHttpCode() == 200) { $this->setAccessToken($response->getResponseBody()); $this->token['created'] = time(); return $this->getAccessToken(); } else { throw new Google_Auth_Exception( sprintf( "Error fetching service account access token, message: '%s'", $response->getResponseBody() ), $response->getResponseHttpCode() ); } } /** * Include an accessToken in a given apiHttpRequest. * @param Google_Http_Request $request * @return Google_Http_Request * @throws Google_Auth_Exception */ public function sign(UDP_Google_Http_Request $request) { if ($this->isAccessTokenExpired()) { $this->acquireAccessToken(); } $this->client->getLogger()->debug('Compute engine service account authentication'); $request->setRequestHeaders( array('Authorization' => 'Bearer ' . $this->token['access_token']) ); return $request; } /** * Returns if the access_token is expired. * @return bool Returns True if the access_token is expired. */ public function isAccessTokenExpired() { if (!$this->token || !isset($this->token['created'])) { return true; } // If the token is set to expire in the next 30 seconds. $expired = ($this->token['created'] + ($this->token['expires_in'] - 30)) < time(); return $expired; } } PKwL\GJJ+updraftplus/includes/Google/Auth/OAuth2.phpnu[client = $client; } /** * Perform an authenticated / signed apiHttpRequest. * This function takes the apiHttpRequest, calls apiAuth->sign on it * (which can modify the request in what ever way fits the auth mechanism) * and then calls apiCurlIO::makeRequest on the signed request * * @param Google_Http_Request $request * @return Google_Http_Request The resulting HTTP response including the * responseHttpCode, responseHeaders and responseBody. */ public function authenticatedRequest(UDP_Google_Http_Request $request) { $request = $this->sign($request); return $this->client->getIo()->makeRequest($request); } /** * @param string $code * @throws Google_Auth_Exception * @return string */ public function authenticate($code) { if (strlen($code) == 0) { throw new Google_Auth_Exception("Invalid code"); } // We got here from the redirect from a successful authorization grant, // fetch the access token $request = new UDP_Google_Http_Request( self::OAUTH2_TOKEN_URI, 'POST', array(), array( 'code' => $code, 'grant_type' => 'authorization_code', 'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'), 'client_id' => $this->client->getClassConfig($this, 'client_id'), 'client_secret' => $this->client->getClassConfig($this, 'client_secret') ) ); $request->disableGzip(); $response = $this->client->getIo()->makeRequest($request); if ($response->getResponseHttpCode() == 200) { $this->setAccessToken($response->getResponseBody()); $this->token['created'] = time(); return $this->getAccessToken(); } else { $decodedResponse = json_decode($response->getResponseBody(), true); if ($decodedResponse != null && $decodedResponse['error']) { $errorText = $decodedResponse['error']; if (isset($decodedResponse['error_description'])) { $errorText .= ": " . $decodedResponse['error_description']; } } throw new Google_Auth_Exception( sprintf( "Error fetching OAuth2 access token, message: '%s'", $errorText ), $response->getResponseHttpCode() ); } } /** * Create a URL to obtain user authorization. * The authorization endpoint allows the user to first * authenticate, and then grant/deny the access request. * @param string $scope The scope is expressed as a list of space-delimited strings. * @return string */ public function createAuthUrl($scope) { $params = array( 'response_type' => 'code', 'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'), 'client_id' => $this->client->getClassConfig($this, 'client_id'), 'scope' => $scope, 'access_type' => $this->client->getClassConfig($this, 'access_type'), ); // Prefer prompt to approval prompt. if ($this->client->getClassConfig($this, 'prompt')) { $params = $this->maybeAddParam($params, 'prompt'); } else { $params = $this->maybeAddParam($params, 'approval_prompt'); } $params = $this->maybeAddParam($params, 'login_hint'); $params = $this->maybeAddParam($params, 'hd'); $params = $this->maybeAddParam($params, 'openid.realm'); $params = $this->maybeAddParam($params, 'include_granted_scopes'); // If the list of scopes contains plus.login, add request_visible_actions // to auth URL. $rva = $this->client->getClassConfig($this, 'request_visible_actions'); if (strpos($scope, 'plus.login') && strlen($rva) > 0) { $params['request_visible_actions'] = $rva; } if (isset($this->state)) { $params['state'] = $this->state; } return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&'); } /** * @param string $token * @throws Google_Auth_Exception */ public function setAccessToken($token) { $token = json_decode($token, true); if ($token == null) { throw new Google_Auth_Exception('Could not json decode the token'); } if (! isset($token['access_token'])) { throw new Google_Auth_Exception("Invalid token format"); } $this->token = $token; } public function getAccessToken() { return json_encode($this->token); } public function getRefreshToken() { if (array_key_exists('refresh_token', $this->token)) { return $this->token['refresh_token']; } else { return null; } } public function setState($state) { $this->state = $state; } public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds) { $this->assertionCredentials = $creds; } /** * Include an accessToken in a given apiHttpRequest. * @param Google_Http_Request $request * @return Google_Http_Request * @throws Google_Auth_Exception */ public function sign(UDP_Google_Http_Request $request) { // add the developer key to the request before signing it if ($this->client->getClassConfig($this, 'developer_key')) { $request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key')); } // Cannot sign the request without an OAuth access token. if (null == $this->token && null == $this->assertionCredentials) { return $request; } // Check if the token is set to expire in the next 30 seconds // (or has already expired). if ($this->isAccessTokenExpired()) { if ($this->assertionCredentials) { $this->refreshTokenWithAssertion(); } else { $this->client->getLogger()->debug('OAuth2 access token expired'); if (! array_key_exists('refresh_token', $this->token)) { $error = "The OAuth 2.0 access token has expired," ." and a refresh token is not available. Refresh tokens" ." are not returned for responses that were auto-approved."; $this->client->getLogger()->error($error); throw new Google_Auth_Exception($error); } $this->refreshToken($this->token['refresh_token']); } } $this->client->getLogger()->debug('OAuth2 authentication'); // Add the OAuth2 header to the request $request->setRequestHeaders( array('Authorization' => 'Bearer ' . $this->token['access_token']) ); return $request; } /** * Fetches a fresh access token with the given refresh token. * @param string $refreshToken * @return void */ public function refreshToken($refreshToken) { $this->refreshTokenRequest( array( 'client_id' => $this->client->getClassConfig($this, 'client_id'), 'client_secret' => $this->client->getClassConfig($this, 'client_secret'), 'refresh_token' => $refreshToken, 'grant_type' => 'refresh_token' ) ); } /** * Fetches a fresh access token with a given assertion token. * @param Google_Auth_AssertionCredentials $assertionCredentials optional. * @return void */ public function refreshTokenWithAssertion($assertionCredentials = null) { if (!$assertionCredentials) { $assertionCredentials = $this->assertionCredentials; } $cacheKey = $assertionCredentials->getCacheKey(); if ($cacheKey) { // We can check whether we have a token available in the // cache. If it is expired, we can retrieve a new one from // the assertion. $token = $this->client->getCache()->get($cacheKey); if ($token) { $this->setAccessToken($token); } if (!$this->isAccessTokenExpired()) { return; } } $this->client->getLogger()->debug('OAuth2 access token expired'); $this->refreshTokenRequest( array( 'grant_type' => 'assertion', 'assertion_type' => $assertionCredentials->assertionType, 'assertion' => $assertionCredentials->generateAssertion(), ) ); if ($cacheKey) { // Attempt to cache the token. $this->client->getCache()->set( $cacheKey, $this->getAccessToken() ); } } private function refreshTokenRequest($params) { if (isset($params['assertion'])) { $this->client->getLogger()->info( 'OAuth2 access token refresh with Signed JWT assertion grants.' ); } else { $this->client->getLogger()->info('OAuth2 access token refresh'); } $http = new UDP_Google_Http_Request( self::OAUTH2_TOKEN_URI, 'POST', array(), $params ); $http->disableGzip(); $request = $this->client->getIo()->makeRequest($http); $code = $request->getResponseHttpCode(); $body = $request->getResponseBody(); if (200 == $code) { $token = json_decode($body, true); if ($token == null) { throw new Google_Auth_Exception("Could not json decode the access token"); } if (! isset($token['access_token']) || ! isset($token['expires_in'])) { throw new Google_Auth_Exception("Invalid token format"); } if (isset($token['id_token'])) { $this->token['id_token'] = $token['id_token']; } $this->token['access_token'] = $token['access_token']; $this->token['expires_in'] = $token['expires_in']; $this->token['created'] = time(); } else { throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code); } } /** * Revoke an OAuth2 access token or refresh token. This method will revoke the current access * token, if a token isn't provided. * @throws Google_Auth_Exception * @param string|null $token The token (access token or a refresh token) that should be revoked. * @return boolean Returns True if the revocation was successful, otherwise False. */ public function revokeToken($token = null) { if (!$token) { if (!$this->token) { // Not initialized, no token to actually revoke return false; } elseif (array_key_exists('refresh_token', $this->token)) { $token = $this->token['refresh_token']; } else { $token = $this->token['access_token']; } } $request = new UDP_Google_Http_Request( self::OAUTH2_REVOKE_URI, 'POST', array(), "token=$token" ); $request->disableGzip(); $response = $this->client->getIo()->makeRequest($request); $code = $response->getResponseHttpCode(); if ($code == 200) { $this->token = null; return true; } return false; } /** * Returns if the access_token is expired. * @return bool Returns True if the access_token is expired. */ public function isAccessTokenExpired() { if (!$this->token || !isset($this->token['created'])) { return true; } // If the token is set to expire in the next 30 seconds. $expired = ($this->token['created'] + ($this->token['expires_in'] - 30)) < time(); return $expired; } // Gets federated sign-on certificates to use for verifying identity tokens. // Returns certs as array structure, where keys are key ids, and values // are PEM encoded certificates. private function getFederatedSignOnCerts() { return $this->retrieveCertsFromLocation( $this->client->getClassConfig($this, 'federated_signon_certs_url') ); } /** * Retrieve and cache a certificates file. * * @param $url string location * @throws Google_Auth_Exception * @return array certificates */ public function retrieveCertsFromLocation($url) { // If we're retrieving a local file, just grab it. if ("http" != substr($url, 0, 4)) { $file = file_get_contents($url); if ($file) { return json_decode($file, true); } else { throw new Google_Auth_Exception( "Failed to retrieve verification certificates: '" . $url . "'." ); } } // This relies on makeRequest caching certificate responses. $request = $this->client->getIo()->makeRequest( new UDP_Google_Http_Request( $url ) ); if ($request->getResponseHttpCode() == 200) { $certs = json_decode($request->getResponseBody(), true); if ($certs) { return $certs; } } throw new Google_Auth_Exception( "Failed to retrieve verification certificates: '" . $request->getResponseBody() . "'.", $request->getResponseHttpCode() ); } /** * Verifies an id token and returns the authenticated apiLoginTicket. * Throws an exception if the id token is not valid. * The audience parameter can be used to control which id tokens are * accepted. By default, the id token must have been issued to this OAuth2 client. * * @param $id_token * @param $audience * @return Google_Auth_LoginTicket */ public function verifyIdToken($id_token = null, $audience = null) { if (!$id_token) { $id_token = $this->token['id_token']; } $certs = $this->getFederatedSignonCerts(); if (!$audience) { $audience = $this->client->getClassConfig($this, 'client_id'); } return $this->verifySignedJwtWithCerts($id_token, $certs, $audience, self::OAUTH2_ISSUER); } /** * Verifies the id token, returns the verified token contents. * * @param $jwt string the token * @param $certs array of certificates * @param $required_audience string the expected consumer of the token * @param [$issuer] the expected issues, defaults to Google * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS * @throws Google_Auth_Exception * @return mixed token information if valid, false if not */ public function verifySignedJwtWithCerts( $jwt, $certs, $required_audience, $issuer = null, $max_expiry = null ) { if (!$max_expiry) { // Set the maximum time we will accept a token for. $max_expiry = self::MAX_TOKEN_LIFETIME_SECS; } $segments = explode(".", $jwt); if (count($segments) != 3) { throw new Google_Auth_Exception("Wrong number of segments in token: $jwt"); } $signed = $segments[0] . "." . $segments[1]; $signature = Google_Utils::urlSafeB64Decode($segments[2]); // Parse envelope. $envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true); if (!$envelope) { throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]); } // Parse token $json_body = Google_Utils::urlSafeB64Decode($segments[1]); $payload = json_decode($json_body, true); if (!$payload) { throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]); } // Check signature $verified = false; foreach ($certs as $keyName => $pem) { $public_key = new Google_Verifier_Pem($pem); if ($public_key->verify($signed, $signature)) { $verified = true; break; } } if (!$verified) { throw new Google_Auth_Exception("Invalid token signature: $jwt"); } // Check issued-at timestamp $iat = 0; if (array_key_exists("iat", $payload)) { $iat = $payload["iat"]; } if (!$iat) { throw new Google_Auth_Exception("No issue time in token: $json_body"); } $earliest = $iat - self::CLOCK_SKEW_SECS; // Check expiration timestamp $now = time(); $exp = 0; if (array_key_exists("exp", $payload)) { $exp = $payload["exp"]; } if (!$exp) { throw new Google_Auth_Exception("No expiration time in token: $json_body"); } if ($exp >= $now + $max_expiry) { throw new Google_Auth_Exception( sprintf("Expiration time too far in future: %s", $json_body) ); } $latest = $exp + self::CLOCK_SKEW_SECS; if ($now < $earliest) { throw new Google_Auth_Exception( sprintf( "Token used too early, %s < %s: %s", $now, $earliest, $json_body ) ); } if ($now > $latest) { throw new Google_Auth_Exception( sprintf( "Token used too late, %s > %s: %s", $now, $latest, $json_body ) ); } $iss = $payload['iss']; if ($issuer && $iss != $issuer) { throw new Google_Auth_Exception( sprintf( "Invalid issuer, %s != %s: %s", $iss, $issuer, $json_body ) ); } // Check audience $aud = $payload["aud"]; if ($aud != $required_audience) { throw new Google_Auth_Exception( sprintf( "Wrong recipient, %s != %s:", $aud, $required_audience, $json_body ) ); } // All good. return new Google_Auth_LoginTicket($envelope, $payload); } /** * Add a parameter to the auth params if not empty string. */ private function maybeAddParam($params, $name) { $param = $this->client->getClassConfig($this, $name); if ($param != '') { $params[$name] = $param; } return $params; } } PKwL\w..updraftplus/includes/Google/Auth/Exception.phpnu[client = $client; } /** * Retrieve an access token for the scopes supplied. */ public function authenticateForScope($scopes) { if ($this->token && $this->tokenScopes == $scopes) { return $this->token; } $cacheKey = self::CACHE_PREFIX; if (is_string($scopes)) { $cacheKey .= $scopes; } else if (is_array($scopes)) { $cacheKey .= implode(":", $scopes); } $this->token = $this->client->getCache()->get($cacheKey); if (!$this->token) { $this->retrieveToken($scopes, $cacheKey); } else if ($this->token['expiration_time'] < time()) { $this->client->getCache()->delete($cacheKey); $this->retrieveToken($scopes, $cacheKey); } $this->tokenScopes = $scopes; return $this->token; } /** * Retrieve a new access token and store it in cache * @param mixed $scopes * @param string $cacheKey */ private function retrieveToken($scopes, $cacheKey) { $this->token = AppIdentityService::getAccessToken($scopes); if ($this->token) { $this->client->getCache()->set( $cacheKey, $this->token ); } } /** * Perform an authenticated / signed apiHttpRequest. * This function takes the apiHttpRequest, calls apiAuth->sign on it * (which can modify the request in what ever way fits the auth mechanism) * and then calls apiCurlIO::makeRequest on the signed request * * @param Google_Http_Request $request * @return Google_Http_Request The resulting HTTP response including the * responseHttpCode, responseHeaders and responseBody. */ public function authenticatedRequest(UDP_Google_Http_Request $request) { $request = $this->sign($request); return $this->client->getIo()->makeRequest($request); } public function sign(UDP_Google_Http_Request $request) { if (!$this->token) { // No token, so nothing to do. return $request; } $this->client->getLogger()->debug('App Identity authentication'); // Add the OAuth2 header to the request $request->setRequestHeaders( array('Authorization' => 'Bearer ' . $this->token['access_token']) ); return $request; } } PKwL\*5% 0updraftplus/includes/Google/Auth/LoginTicket.phpnu[ */ class Google_Auth_LoginTicket { const USER_ATTR = "sub"; // Information from id token envelope. private $envelope; // Information from id token payload. private $payload; /** * Creates a user based on the supplied token. * * @param string $envelope Header from a verified authentication token. * @param string $payload Information from a verified authentication token. */ public function __construct($envelope, $payload) { $this->envelope = $envelope; $this->payload = $payload; } /** * Returns the numeric identifier for the user. * @throws Google_Auth_Exception * @return */ public function getUserId() { if (array_key_exists(self::USER_ATTR, $this->payload)) { return $this->payload[self::USER_ATTR]; } throw new Google_Auth_Exception("No user_id in token"); } /** * Returns attributes from the login ticket. This can contain * various information about the user session. * @return array */ public function getAttributes() { return array("envelope" => $this->envelope, "payload" => $this->payload); } } PKwL\ *updraftplus/includes/Google/Cache/Null.phpnu[ */ abstract class Google_Cache_Abstract { abstract public function __construct(UDP_Google_Client $client); /** * Retrieves the data for the given key, or false if they * key is unknown or expired * * @param String $key The key who's data to retrieve * @param boolean|int $expiration Expiration time in seconds * */ abstract public function get($key, $expiration = false); /** * Store the key => $value set. The $value is serialized * by this function so can be of any type * * @param string $key Key of the data * @param string $value data */ abstract public function set($key, $value); /** * Removes the key/data pair for the given $key * * @param String $key */ abstract public function delete($key); } PKwL\%G.updraftplus/includes/Google/Cache/Memcache.phpnu[ */ class Google_Cache_Memcache extends Google_Cache_Abstract { private $connection = false; private $mc = false; private $host; private $port; /** * @var Google_Client the current client */ private $client; public function __construct(UDP_Google_Client $client) { if (!function_exists('memcache_connect') && !class_exists("Memcached")) { $error = "Memcache functions not available"; $client->getLogger()->error($error); throw new Google_Cache_Exception($error); } $this->client = $client; if ($client->isAppEngine()) { // No credentials needed for GAE. $this->mc = new Memcached(); $this->connection = true; } else { $this->host = $client->getClassConfig($this, 'host'); $this->port = $client->getClassConfig($this, 'port'); if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) { $error = "You need to supply a valid memcache host and port"; $client->getLogger()->error($error); throw new Google_Cache_Exception($error); } } } /** * @inheritDoc */ public function get($key, $expiration = false) { $this->connect(); $ret = false; if ($this->mc) { $ret = $this->mc->get($key); } else { $ret = memcache_get($this->connection, $key); } if ($ret === false) { $this->client->getLogger()->debug( 'Memcache cache miss', array('key' => $key) ); return false; } if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) { $this->client->getLogger()->debug( 'Memcache cache miss (expired)', array('key' => $key, 'var' => $ret) ); $this->delete($key); return false; } $this->client->getLogger()->debug( 'Memcache cache hit', array('key' => $key, 'var' => $ret) ); return $ret['data']; } /** * @inheritDoc * @param string $key * @param string $value * @throws Google_Cache_Exception */ public function set($key, $value) { $this->connect(); // we store it with the cache_time default expiration so objects will at // least get cleaned eventually. $data = array('time' => time(), 'data' => $value); $rc = false; if ($this->mc) { $rc = $this->mc->set($key, $data); } else { $rc = memcache_set($this->connection, $key, $data, false); } if ($rc == false) { $this->client->getLogger()->error( 'Memcache cache set failed', array('key' => $key, 'var' => $data) ); throw new Google_Cache_Exception("Couldn't store data in cache"); } $this->client->getLogger()->debug( 'Memcache cache set', array('key' => $key, 'var' => $data) ); } /** * @inheritDoc * @param String $key */ public function delete($key) { $this->connect(); if ($this->mc) { $this->mc->delete($key, 0); } else { memcache_delete($this->connection, $key, 0); } $this->client->getLogger()->debug( 'Memcache cache delete', array('key' => $key) ); } /** * Lazy initialiser for memcache connection. Uses pconnect for to take * advantage of the persistence pool where possible. */ private function connect() { if ($this->connection) { return; } if (class_exists("Memcached")) { $this->mc = new Memcached(); $this->mc->addServer($this->host, $this->port); $this->connection = true; } else { $this->connection = memcache_pconnect($this->host, $this->port); } if (! $this->connection) { $error = "Couldn't connect to memcache server"; $this->client->getLogger()->error($error); throw new Google_Cache_Exception($error); } } } PKwL\_Z  )updraftplus/includes/Google/Cache/Apc.phpnu[ */ class Google_Cache_Apc extends Google_Cache_Abstract { /** * @var Google_Client the current client */ private $client; public function __construct(UDP_Google_Client $client) { if (! function_exists('apc_add') ) { $error = "Apc functions not available"; $client->getLogger()->error($error); throw new Google_Cache_Exception($error); } $this->client = $client; } /** * @inheritDoc */ public function get($key, $expiration = false) { $ret = apc_fetch($key); if ($ret === false) { $this->client->getLogger()->debug( 'APC cache miss', array('key' => $key) ); return false; } if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) { $this->client->getLogger()->debug( 'APC cache miss (expired)', array('key' => $key, 'var' => $ret) ); $this->delete($key); return false; } $this->client->getLogger()->debug( 'APC cache hit', array('key' => $key, 'var' => $ret) ); return $ret['data']; } /** * @inheritDoc */ public function set($key, $value) { $var = array('time' => time(), 'data' => $value); $rc = apc_store($key, $var); if ($rc == false) { $this->client->getLogger()->error( 'APC cache set failed', array('key' => $key, 'var' => $var) ); throw new Google_Cache_Exception("Couldn't store data"); } $this->client->getLogger()->debug( 'APC cache set', array('key' => $key, 'var' => $var) ); } /** * @inheritDoc * @param String $key */ public function delete($key) { $this->client->getLogger()->debug( 'APC cache delete', array('key' => $key) ); apc_delete($key); } } PKwL\?Loaa*updraftplus/includes/Google/Cache/File.phpnu[ */ class Google_Cache_File extends Google_Cache_Abstract { const MAX_LOCK_RETRIES = 10; private $path; private $fh; /** * @var Google_Client the current client */ private $client; public function __construct(UDP_Google_Client $client) { $this->client = $client; $this->path = $this->client->getClassConfig($this, 'directory'); } public function get($key, $expiration = false) { $storageFile = $this->getCacheFile($key); $data = false; if (!file_exists($storageFile)) { $this->client->getLogger()->debug( 'File cache miss', array('key' => $key, 'file' => $storageFile) ); return false; } if ($expiration) { $mtime = filemtime($storageFile); if ((time() - $mtime) >= $expiration) { $this->client->getLogger()->debug( 'File cache miss (expired)', array('key' => $key, 'file' => $storageFile) ); $this->delete($key); return false; } } if ($this->acquireReadLock($storageFile)) { if (filesize($storageFile) > 0) { $data = fread($this->fh, filesize($storageFile)); $data = unserialize($data); } else { $this->client->getLogger()->debug( 'Cache file was empty', array('file' => $storageFile) ); } $this->unlock($storageFile); } $this->client->getLogger()->debug( 'File cache hit', array('key' => $key, 'file' => $storageFile, 'var' => $data) ); return $data; } public function set($key, $value) { $storageFile = $this->getWriteableCacheFile($key); if ($this->acquireWriteLock($storageFile)) { // We serialize the whole request object, since we don't only want the // responseContent but also the postBody used, headers, size, etc. $data = serialize($value); $result = fwrite($this->fh, $data); $this->unlock($storageFile); $this->client->getLogger()->debug( 'File cache set', array('key' => $key, 'file' => $storageFile, 'var' => $value) ); } else { $this->client->getLogger()->notice( 'File cache set failed', array('key' => $key, 'file' => $storageFile) ); } } public function delete($key) { $file = $this->getCacheFile($key); if (file_exists($file) && !unlink($file)) { $this->client->getLogger()->error( 'File cache delete failed', array('key' => $key, 'file' => $file) ); throw new Google_Cache_Exception("Cache file could not be deleted"); } $this->client->getLogger()->debug( 'File cache delete', array('key' => $key, 'file' => $file) ); } private function getWriteableCacheFile($file) { return $this->getCacheFile($file, true); } private function getCacheFile($file, $forWrite = false) { return $this->getCacheDir($file, $forWrite) . '/' . md5($file); } private function getCacheDir($file, $forWrite) { // use the first 2 characters of the hash as a directory prefix // this should prevent slowdowns due to huge directory listings // and thus give some basic amount of scalability $storageDir = $this->path . '/' . substr(md5($file), 0, 2); if ($forWrite && ! is_dir($storageDir)) { if (! mkdir($storageDir, 0755, true)) { $this->client->getLogger()->error( 'File cache creation failed', array('dir' => $storageDir) ); throw new Google_Cache_Exception("Could not create storage directory: $storageDir"); } } return $storageDir; } private function acquireReadLock($storageFile) { return $this->acquireLock(LOCK_SH, $storageFile); } private function acquireWriteLock($storageFile) { $rc = $this->acquireLock(LOCK_EX, $storageFile); if (!$rc) { $this->client->getLogger()->notice( 'File cache write lock failed', array('file' => $storageFile) ); $this->delete($storageFile); } return $rc; } private function acquireLock($type, $storageFile) { $mode = $type == LOCK_EX ? "w" : "r"; $this->fh = fopen($storageFile, $mode); if (!$this->fh) { $this->client->getLogger()->error( 'Failed to open file during lock acquisition', array('file' => $storageFile) ); return false; } $count = 0; while (!flock($this->fh, $type | LOCK_NB)) { // Sleep for 10ms. usleep(10000); if (++$count < self::MAX_LOCK_RETRIES) { return false; } } return true; } public function unlock($storageFile) { if ($this->fh) { flock($this->fh, LOCK_UN); } } } PKwL\g~/updraftplus/includes/Google/Cache/Exception.phpnu[getRequestMethod(), $req->getUrl()), array(get_class(), 'doExecute'), array($client, $req) ); return $runner->run(); } /** * Executes a Google_Http_Request * * @param UDP_Google_Client $client * @param Google_Http_Request $req * @return array decoded result * @throws UDP_Google_Service_Exception on server side error (ie: not authenticated, * invalid or malformed post body, invalid url) */ public static function doExecute(UDP_Google_Client $client, UDP_Google_Http_Request $req) { $httpRequest = $client->getIo()->makeRequest($req); $httpRequest->setExpectedClass($req->getExpectedClass()); return self::decodeHttpResponse($httpRequest, $client); } /** * Decode an HTTP Response. * @static * @throws UDP_Google_Service_Exception * @param Google_Http_Request $response The http response to be decoded. * @param UDP_Google_Client $client * @return mixed|null */ public static function decodeHttpResponse($response, UDP_Google_Client $client = null) { $code = $response->getResponseHttpCode(); $body = $response->getResponseBody(); $decoded = null; if ((intVal($code)) >= 300) { $decoded = json_decode($body, true); $err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl(); if (isset($decoded['error']) && isset($decoded['error']['message']) && isset($decoded['error']['code'])) { // if we're getting a json encoded error definition, use that instead of the raw response // body for improved readability $err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}"; } else { $err .= ": ($code) $body"; } $errors = null; // Specific check for APIs which don't return error details, such as Blogger. if (isset($decoded['error']) && isset($decoded['error']['errors'])) { $errors = $decoded['error']['errors']; } $map = null; if ($client) { $client->getLogger()->error( $err, array('code' => $code, 'errors' => $errors) ); $map = $client->getClassConfig( 'UDP_Google_Service_Exception', 'retry_map' ); } throw new UDP_Google_Service_Exception($err, $code, null, $errors, $map); } // Only attempt to decode the response, if the response code wasn't (204) 'no content' if ($code != '204') { if ($response->getExpectedRaw()) { return $body; } $decoded = json_decode($body, true); if ($decoded === null || $decoded === "") { # UpdraftPlus patch $error = "Invalid json in service response ($code): $body"; if ($client) { $client->getLogger()->error($error); } throw new UDP_Google_Service_Exception($error); } if ($response->getExpectedClass()) { $class = $response->getExpectedClass(); $decoded = new $class($decoded); } } return $decoded; } /** * Parse/expand request parameters and create a fully qualified * request uri. * @static * @param string $servicePath * @param string $restPath * @param array $params * @return string $requestUrl */ public static function createRequestUri($servicePath, $restPath, $params) { $requestUrl = $servicePath . $restPath; $uriTemplateVars = array(); $queryVars = array(); foreach ($params as $paramName => $paramSpec) { if ($paramSpec['type'] == 'boolean') { $paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false'; } if ($paramSpec['location'] == 'path') { $uriTemplateVars[$paramName] = $paramSpec['value']; } else if ($paramSpec['location'] == 'query') { if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) { foreach ($paramSpec['value'] as $value) { $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value)); } } else { $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value'])); } } } if (count($uriTemplateVars)) { $uriTemplateParser = new Google_Utils_URITemplate(); $requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars); } if (count($queryVars)) { $requestUrl .= '?' . implode('&', $queryVars); } return $requestUrl; } } PKwL\%ƚ 4updraftplus/includes/Google/Http/MediaFileUpload.phpnu[client = $client; $this->request = $request; $this->mimeType = $mimeType; $this->data = $data; $this->size = strlen($this->data); $this->resumable = $resumable; if (!$chunkSize) { $chunkSize = 256 * 1024; } $this->chunkSize = $chunkSize; $this->progress = 0; $this->boundary = $boundary; // Process Media Request $this->process(); } /** * Set the size of the file that is being uploaded. * @param $size - int file size in bytes */ public function setFileSize($size) { $this->size = $size; } /** * Return the progress on the upload * @return int progress in bytes uploaded. */ public function getProgress() { return $this->progress; } /** * Return the HTTP result code from the last call made. * @return int code */ public function getHttpResultCode() { return $this->httpResultCode; } /** * Send the next part of the file to upload. * @param [$chunk] the next set of bytes to send. If false will used $data passed * at construct time. */ public function nextChunk($chunk = false) { if (false == $this->resumeUri) { $this->resumeUri = $this->getResumeUri(); } if (false == $chunk) { $chunk = substr($this->data, $this->progress, $this->chunkSize); } $lastBytePos = $this->progress + strlen($chunk) - 1; $headers = array( 'content-range' => "bytes $this->progress-$lastBytePos/$this->size", 'content-type' => $this->request->getRequestHeader('content-type'), 'content-length' => $this->chunkSize, 'expect' => '', ); $httpRequest = new UDP_Google_Http_Request( $this->resumeUri, 'PUT', $headers, $chunk ); if ($this->client->getClassConfig("UDP_Google_Http_Request", "enable_gzip_for_uploads")) { $httpRequest->enableGzip(); } else { $httpRequest->disableGzip(); } $response = $this->client->getIo()->makeRequest($httpRequest); $response->setExpectedClass($this->request->getExpectedClass()); $code = $response->getResponseHttpCode(); $this->httpResultCode = $code; if (308 == $code) { // Track the amount uploaded. $range = explode('-', $response->getResponseHeader('range')); $this->progress = $range[1] + 1; // Allow for changing upload URLs. $location = $response->getResponseHeader('location'); if ($location) { $this->resumeUri = $location; } // No problems, but upload not complete. return false; } else { return UDP_Google_Http_REST::decodeHttpResponse($response, $this->client); } } /** * @param $meta * @param $params * @return array|bool * @visible for testing */ private function process() { $postBody = false; $contentType = false; $meta = $this->request->getPostBody(); $meta = is_string($meta) ? json_decode($meta, true) : $meta; $uploadType = $this->getUploadType($meta); $this->request->setQueryParam('uploadType', $uploadType); $this->transformToUploadUrl(); $mimeType = $this->mimeType ? $this->mimeType : $this->request->getRequestHeader('content-type'); if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) { $contentType = $mimeType; $postBody = is_string($meta) ? $meta : json_encode($meta); } else if (self::UPLOAD_MEDIA_TYPE == $uploadType) { $contentType = $mimeType; $postBody = $this->data; } else if (self::UPLOAD_MULTIPART_TYPE == $uploadType) { // This is a multipart/related upload. $boundary = $this->boundary ? $this->boundary : mt_rand(); $boundary = str_replace('"', '', $boundary); $contentType = 'multipart/related; boundary=' . $boundary; $related = "--$boundary\r\n"; $related .= "Content-Type: application/json; charset=UTF-8\r\n"; $related .= "\r\n" . json_encode($meta) . "\r\n"; $related .= "--$boundary\r\n"; $related .= "Content-Type: $mimeType\r\n"; $related .= "Content-Transfer-Encoding: base64\r\n"; $related .= "\r\n" . base64_encode($this->data) . "\r\n"; $related .= "--$boundary--"; $postBody = $related; } $this->request->setPostBody($postBody); if (isset($contentType) && $contentType) { $contentTypeHeader['content-type'] = $contentType; $this->request->setRequestHeaders($contentTypeHeader); } } private function transformToUploadUrl() { $base = $this->request->getBaseComponent(); $this->request->setBaseComponent($base . '/upload'); } /** * Valid upload types: * - resumable (UPLOAD_RESUMABLE_TYPE) * - media (UPLOAD_MEDIA_TYPE) * - multipart (UPLOAD_MULTIPART_TYPE) * @param $meta * @return string * @visible for testing */ public function getUploadType($meta) { if ($this->resumable) { return self::UPLOAD_RESUMABLE_TYPE; } if (false == $meta && $this->data) { return self::UPLOAD_MEDIA_TYPE; } return self::UPLOAD_MULTIPART_TYPE; } private function getResumeUri() { $result = null; $body = $this->request->getPostBody(); if ($body) { $headers = array( 'content-type' => 'application/json; charset=UTF-8', 'content-length' => Google_Utils::getStrLen($body), 'x-upload-content-type' => $this->mimeType, 'x-upload-content-length' => $this->size, 'expect' => '', ); $this->request->setRequestHeaders($headers); } $response = $this->client->getIo()->makeRequest($this->request); $location = $response->getResponseHeader('location'); $code = $response->getResponseHttpCode(); if (200 == $code && true == $location) { return $location; } $message = $code; $body = @json_decode($response->getResponseBody()); if (!empty( $body->error->errors ) ) { $message .= ': '; foreach ($body->error->errors as $error) { $message .= "{$error->domain}, {$error->message};"; } $message = rtrim($message, ';'); } $error = "Failed to start the resumable upload (HTTP {$message})"; $this->client->getLogger()->error($error); throw new Google_Exception($error); } } PKwL\U/U/,updraftplus/includes/Google/Http/Request.phpnu[ * @author Chirag Shah * */ class UDP_Google_Http_Request { const GZIP_UA = " (gzip)"; private $batchHeaders = array( 'Content-Type' => 'application/http', 'Content-Transfer-Encoding' => 'binary', 'MIME-Version' => '1.0', ); protected $queryParams; protected $requestMethod; protected $requestHeaders; protected $baseComponent = null; protected $path; protected $postBody; // UpdraftPlus tweak: added default value to prevent type notices protected $userAgent = ''; protected $canGzip = null; protected $responseHttpCode; protected $responseHeaders; protected $responseBody; protected $expectedClass; protected $expectedRaw = false; public $accessKey; public function __construct( $url, $method = 'GET', $headers = array(), $postBody = null ) { $this->setUrl($url); $this->setRequestMethod($method); $this->setRequestHeaders($headers); $this->setPostBody($postBody); } /** * Misc function that returns the base url component of the $url * used by the OAuth signing class to calculate the base string * @return string The base url component of the $url. */ public function getBaseComponent() { return $this->baseComponent; } /** * Set the base URL that path and query parameters will be added to. * @param $baseComponent string */ public function setBaseComponent($baseComponent) { $this->baseComponent = $baseComponent; } /** * Enable support for gzipped responses with this request. */ public function enableGzip() { $this->setRequestHeaders(array("Accept-Encoding" => "gzip")); $this->canGzip = true; $this->setUserAgent($this->userAgent); } /** * Disable support for gzip responses with this request. */ public function disableGzip() { if ( isset($this->requestHeaders['accept-encoding']) && $this->requestHeaders['accept-encoding'] == "gzip" ) { unset($this->requestHeaders['accept-encoding']); } $this->canGzip = false; $this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent); } /** * Can this request accept a gzip response? * @return bool */ public function canGzip() { return $this->canGzip; } /** * Misc function that returns an array of the query parameters of the current * url used by the OAuth signing class to calculate the signature * @return array Query parameters in the query string. */ public function getQueryParams() { return $this->queryParams; } /** * Set a new query parameter. * @param $key - string to set, does not need to be URL encoded * @param $value - string to set, does not need to be URL encoded */ public function setQueryParam($key, $value) { $this->queryParams[$key] = $value; } /** * @return string HTTP Response Code. */ public function getResponseHttpCode() { return (int) $this->responseHttpCode; } /** * @param int $responseHttpCode HTTP Response Code. */ public function setResponseHttpCode($responseHttpCode) { $this->responseHttpCode = $responseHttpCode; } /** * @return $responseHeaders (array) HTTP Response Headers. */ public function getResponseHeaders() { return $this->responseHeaders; } /** * @return string HTTP Response Body */ public function getResponseBody() { return $this->responseBody; } /** * Set the class the response to this request should expect. * * @param $class string the class name */ public function setExpectedClass($class) { $this->expectedClass = $class; } /** * Retrieve the expected class the response should expect. * @return string class name */ public function getExpectedClass() { return $this->expectedClass; } /** * Enable expected raw response */ public function enableExpectedRaw() { $this->expectedRaw = true; } /** * Disable expected raw response */ public function disableExpectedRaw() { $this->expectedRaw = false; } /** * Expected raw response or not. * @return boolean expected raw response */ public function getExpectedRaw() { return $this->expectedRaw; } /** * @param array $headers The HTTP response headers * to be normalized. */ public function setResponseHeaders($headers) { $headers = Google_Utils::normalize($headers); if ($this->responseHeaders) { $headers = array_merge($this->responseHeaders, $headers); } $this->responseHeaders = $headers; } /** * @param string $key * @return array|boolean Returns the requested HTTP header or * false if unavailable. */ public function getResponseHeader($key) { return isset($this->responseHeaders[$key]) ? $this->responseHeaders[$key] : false; } /** * @param string $responseBody The HTTP response body. */ public function setResponseBody($responseBody) { $this->responseBody = $responseBody; } /** * @return string $url The request URL. */ public function getUrl() { return $this->baseComponent . $this->path . (count($this->queryParams) ? "?" . $this->buildQuery($this->queryParams) : ''); } /** * @return string $method HTTP Request Method. */ public function getRequestMethod() { return $this->requestMethod; } /** * @return array $headers HTTP Request Headers. */ public function getRequestHeaders() { return $this->requestHeaders; } /** * @param string $key * @return array|boolean Returns the requested HTTP header or * false if unavailable. */ public function getRequestHeader($key) { return isset($this->requestHeaders[$key]) ? $this->requestHeaders[$key] : false; } /** * @return string $postBody HTTP Request Body. */ public function getPostBody() { return $this->postBody; } /** * @param string $url the url to set */ public function setUrl($url) { if (substr($url, 0, 4) != 'http') { // Force the path become relative. if (substr($url, 0, 1) !== '/') { $url = '/' . $url; } } $parts = parse_url($url); if (isset($parts['host'])) { $this->baseComponent = sprintf( "%s%s%s", isset($parts['scheme']) ? $parts['scheme'] . "://" : '', isset($parts['host']) ? $parts['host'] : '', isset($parts['port']) ? ":" . $parts['port'] : '' ); } $this->path = isset($parts['path']) ? $parts['path'] : ''; $this->queryParams = array(); if (isset($parts['query'])) { $this->queryParams = $this->parseQuery($parts['query']); } } /** * @param string $method Set he HTTP Method and normalize * it to upper-case, as required by HTTP. * */ public function setRequestMethod($method) { $this->requestMethod = strtoupper($method); } /** * @param array $headers The HTTP request headers * to be set and normalized. */ public function setRequestHeaders($headers) { $headers = Google_Utils::normalize($headers); if ($this->requestHeaders) { $headers = array_merge($this->requestHeaders, $headers); } $this->requestHeaders = $headers; } /** * @param string $postBody the postBody to set */ public function setPostBody($postBody) { $this->postBody = $postBody; } /** * Set the User-Agent Header. * @param string $userAgent The User-Agent. */ public function setUserAgent($userAgent) { $this->userAgent = $userAgent; if ($this->canGzip) { $this->userAgent = $userAgent . self::GZIP_UA; } } /** * @return string The User-Agent. */ public function getUserAgent() { return $this->userAgent; } /** * Returns a cache key depending on if this was an OAuth signed request * in which case it will use the non-signed url and access key to make this * cache key unique per authenticated user, else use the plain request url * @return string The md5 hash of the request cache key. */ public function getCacheKey() { $key = $this->getUrl(); if (isset($this->accessKey)) { $key .= $this->accessKey; } if (isset($this->requestHeaders['authorization'])) { $key .= $this->requestHeaders['authorization']; } return md5($key); } public function getParsedCacheControl() { $parsed = array(); $rawCacheControl = $this->getResponseHeader('cache-control'); if ($rawCacheControl) { $rawCacheControl = str_replace(', ', '&', $rawCacheControl); parse_str($rawCacheControl, $parsed); } return $parsed; } /** * @param string $id * @return string A string representation of the HTTP Request. */ public function toBatchString($id) { $str = ''; $path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" . http_build_query($this->queryParams); $str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n"; foreach ($this->getRequestHeaders() as $key => $val) { $str .= $key . ': ' . $val . "\n"; } if ($this->getPostBody()) { $str .= "\n"; $str .= $this->getPostBody(); } $headers = ''; foreach ($this->batchHeaders as $key => $val) { $headers .= $key . ': ' . $val . "\n"; } $headers .= "Content-ID: $id\n"; $str = $headers . "\n" . $str; return $str; } /** * Our own version of parse_str that allows for multiple variables * with the same name. * @param $string - the query string to parse */ private function parseQuery($string) { $return = array(); $parts = explode("&", $string); foreach ($parts as $part) { list($key, $value) = explode('=', $part, 2); $value = urldecode($value); if (isset($return[$key])) { if (!is_array($return[$key])) { $return[$key] = array($return[$key]); } $return[$key][] = $value; } else { $return[$key] = $value; } } return $return; } /** * A version of build query that allows for multiple * duplicate keys. * @param $parts array of key value pairs */ private function buildQuery($parts) { $return = array(); foreach ($parts as $key => $value) { if (is_array($value)) { foreach ($value as $v) { $return[] = urlencode($key) . "=" . urlencode($v); } } else { $return[] = urlencode($key) . "=" . urlencode($value); } } return implode('&', $return); } /** * If we're POSTing and have no body to send, we can send the query * parameters in there, which avoids length issues with longer query * params. */ public function maybeMoveParametersToBody() { if ($this->getRequestMethod() == "POST" && empty($this->postBody)) { $this->setRequestHeaders( array( "content-type" => "application/x-www-form-urlencoded; charset=UTF-8" ) ); $this->setPostBody($this->buildQuery($this->queryParams)); $this->queryParams = array(); } } } PKwL\_v990updraftplus/includes/Google/Http/CacheParser.phpnu[getRequestMethod(); if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) { return false; } // Don't cache authorized requests/responses. // [rfc2616-14.8] When a shared cache receives a request containing an // Authorization field, it MUST NOT return the corresponding response // as a reply to any other request... if ($resp->getRequestHeader("authorization")) { return false; } return true; } /** * Check if an HTTP response can be cached by a private local cache. * * @static * @param Google_Http_Request $resp * @return bool True if the response is cacheable. * False if the response is un-cacheable. */ public static function isResponseCacheable(UDP_Google_Http_Request $resp) { // First, check if the HTTP request was cacheable before inspecting the // HTTP response. if (false == self::isRequestCacheable($resp)) { return false; } $code = $resp->getResponseHttpCode(); if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) { return false; } // The resource is uncacheable if the resource is already expired and // the resource doesn't have an ETag for revalidation. $etag = $resp->getResponseHeader("etag"); if (self::isExpired($resp) && $etag == false) { return false; } // [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT // store any part of either this response or the request that elicited it. $cacheControl = $resp->getParsedCacheControl(); if (isset($cacheControl['no-store'])) { return false; } // Pragma: no-cache is an http request directive, but is occasionally // used as a response header incorrectly. $pragma = $resp->getResponseHeader('pragma'); if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) { return false; } // [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that // a cache cannot determine from the request headers of a subsequent request // whether this response is the appropriate representation." // Given this, we deem responses with the Vary header as uncacheable. $vary = $resp->getResponseHeader('vary'); if ($vary) { return false; } return true; } /** * @static * @param Google_Http_Request $resp * @return bool True if the HTTP response is considered to be expired. * False if it is considered to be fresh. */ public static function isExpired(UDP_Google_Http_Request $resp) { // HTTP/1.1 clients and caches MUST treat other invalid date formats, // especially including the value “0”, as in the past. $parsedExpires = false; $responseHeaders = $resp->getResponseHeaders(); if (isset($responseHeaders['expires'])) { $rawExpires = $responseHeaders['expires']; // Check for a malformed expires header first. if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) { return true; } // See if we can parse the expires header. $parsedExpires = strtotime($rawExpires); if (false == $parsedExpires || $parsedExpires <= 0) { return true; } } // Calculate the freshness of an http response. $freshnessLifetime = false; $cacheControl = $resp->getParsedCacheControl(); if (isset($cacheControl['max-age'])) { $freshnessLifetime = $cacheControl['max-age']; } $rawDate = $resp->getResponseHeader('date'); $parsedDate = strtotime($rawDate); if (empty($rawDate) || false == $parsedDate) { // We can't default this to now, as that means future cache reads // will always pass with the logic below, so we will require a // date be injected if not supplied. throw new Google_Exception("All cacheable requests must have creation dates."); } if (false == $freshnessLifetime && isset($responseHeaders['expires'])) { $freshnessLifetime = $parsedExpires - $parsedDate; } if (false == $freshnessLifetime) { return true; } // Calculate the age of an http response. $age = max(0, time() - $parsedDate); if (isset($responseHeaders['age'])) { $age = max($age, strtotime($responseHeaders['age'])); } return $freshnessLifetime <= $age; } /** * Determine if a cache entry should be revalidated with by the origin. * * @param Google_Http_Request $response * @return bool True if the entry is expired, else return false. */ public static function mustRevalidate(UDP_Google_Http_Request $response) { // [13.3] When a cache has a stale entry that it would like to use as a // response to a client's request, it first has to check with the origin // server to see if its cached entry is still usable. return self::isExpired($response); } } PKwL\6*updraftplus/includes/Google/Http/Batch.phpnu[client = $client; $this->base_path = $this->client->getBasePath(); $this->expected_classes = array(); $boundary = (false == $boundary) ? mt_rand() : $boundary; $this->boundary = str_replace('"', '', $boundary); } public function add(UDP_Google_Http_Request $request, $key = false) { if (false == $key) { $key = mt_rand(); } $this->requests[$key] = $request; } public function execute() { $body = ''; /** @var Google_Http_Request $req */ foreach ($this->requests as $key => $req) { $body .= "--{$this->boundary}\n"; $body .= $req->toBatchString($key) . "\n"; $this->expected_classes["response-" . $key] = $req->getExpectedClass(); } $body = rtrim($body); $body .= "\n--{$this->boundary}--"; $url = $this->base_path . '/batch'; $httpRequest = new UDP_Google_Http_Request($url, 'POST'); $httpRequest->setRequestHeaders( array('Content-Type' => 'multipart/mixed; boundary=' . $this->boundary) ); $httpRequest->setPostBody($body); $response = $this->client->getIo()->makeRequest($httpRequest); return $this->parseResponse($response); } public function parseResponse(UDP_Google_Http_Request $response) { $contentType = $response->getResponseHeader('content-type'); $contentType = explode(';', $contentType); $boundary = false; foreach ($contentType as $part) { $part = (explode('=', $part, 2)); if (isset($part[0]) && 'boundary' == trim($part[0])) { $boundary = $part[1]; } } $body = $response->getResponseBody(); if ($body) { $body = str_replace("--$boundary--", "--$boundary", $body); $parts = explode("--$boundary", $body); $responses = array(); foreach ($parts as $part) { $part = trim($part); if (!empty($part)) { list($metaHeaders, $part) = explode("\r\n\r\n", $part, 2); $metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders); $status = substr($part, 0, strpos($part, "\n")); $status = explode(" ", $status); $status = $status[1]; list($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false); $response = new UDP_Google_Http_Request(""); $response->setResponseHttpCode($status); $response->setResponseHeaders($partHeaders); $response->setResponseBody($partBody); // Need content id. $key = $metaHeaders['content-id']; if (isset($this->expected_classes[$key]) && strlen($this->expected_classes[$key]) > 0) { $class = $this->expected_classes[$key]; $response->setExpectedClass($class); } try { $response = UDP_Google_Http_REST::decodeHttpResponse($response, $this->client); $responses[$key] = $response; } catch (UDP_Google_Service_Exception $e) { // Store the exception as the response, so successful responses // can be processed. $responses[$key] = $e; } } } return $responses; } return null; } } PKwL\78:*updraftplus/includes/Google/IO/cacerts.pemnu[# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. # Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. # Label: "GTE CyberTrust Global Root" # Serial: 421 # MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db # SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 # SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 -----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- # Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division # Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division # Label: "Thawte Server CA" # Serial: 1 # MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d # SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c # SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ qdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- # Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division # Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division # Label: "Thawte Premium Server CA" # Serial: 1 # MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a # SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a # SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- # Issuer: O=Equifax OU=Equifax Secure Certificate Authority # Subject: O=Equifax OU=Equifax Secure Certificate Authority # Label: "Equifax Secure CA" # Serial: 903804111 # MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 # SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a # SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- # Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority # Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority # Label: "Verisign Class 3 Public Primary Certification Authority" # Serial: 149843929435818692848040365716851702463 # MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 # SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 # SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 -----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k -----END CERTIFICATE----- # Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network # Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network # Label: "Verisign Class 3 Public Primary Certification Authority - G2" # Serial: 167285380242319648451154478808036881606 # MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 # SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f # SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY oJ2daZH9 -----END CERTIFICATE----- # Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA # Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA # Label: "GlobalSign Root CA" # Serial: 4835703278459707669005204 # MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a # SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c # SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 # Label: "GlobalSign Root CA - R2" # Serial: 4835703278459682885658125 # MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 # SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe # SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- # Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority # Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority # Label: "ValiCert Class 1 VA" # Serial: 1 # MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb # SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e # SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI -----END CERTIFICATE----- # Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority # Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority # Label: "ValiCert Class 2 VA" # Serial: 1 # MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 # SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 # SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- # Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority # Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority # Label: "RSA Root Certificate 1" # Serial: 1 # MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 # SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb # SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs 2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu -----END CERTIFICATE----- # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Label: "Verisign Class 3 Public Primary Certification Authority - G3" # Serial: 206684696279472310254277870180966723415 # MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 # SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 # SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- # Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Label: "Verisign Class 4 Public Primary Certification Authority - G3" # Serial: 314531972711909413743075096039378935511 # MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df # SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d # SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06 -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- # Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Secure Server CA" # Serial: 927650371 # MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee # SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 # SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 -----BEGIN CERTIFICATE----- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Premium 2048 Secure Server CA" # Serial: 946059622 # MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc # SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe # SHA256 Fingerprint: d1:c3:39:ea:27:84:eb:87:0f:93:4f:c5:63:4e:4a:a9:ad:55:05:01:64:01:f2:64:65:d3:7a:57:46:63:35:9f -----BEGIN CERTIFICATE----- MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH 4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy vUxFnmG6v4SBkgPR0ml8xQ== -----END CERTIFICATE----- # Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust # Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust # Label: "Baltimore CyberTrust Root" # Serial: 33554617 # MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 # SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 # SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- # Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. # Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. # Label: "Equifax Secure Global eBusiness CA" # Serial: 1 # MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc # SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 # SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 -----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- # Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. # Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. # Label: "Equifax Secure eBusiness CA 1" # Serial: 4 # MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d # SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 # SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 -----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- # Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 # Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 # Label: "Equifax Secure eBusiness CA 2" # Serial: 930140085 # MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca # SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc # SHA256 Fingerprint: 2f:27:4e:48:ab:a4:ac:7b:76:59:33:10:17:75:50:6d:c3:0e:e3:8e:f6:ac:d5:c0:49:32:cf:e0:41:23:42:20 -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN -----END CERTIFICATE----- # Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network # Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network # Label: "AddTrust Low-Value Services Root" # Serial: 1 # MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc # SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d # SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC +Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X 7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz 43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- # Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network # Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network # Label: "AddTrust External Root" # Serial: 1 # MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f # SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 # SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- # Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network # Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network # Label: "AddTrust Public Services Root" # Serial: 1 # MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f # SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 # SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV 6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH 1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF 62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh 4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- # Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network # Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network # Label: "AddTrust Qualified Certificates Root" # Serial: 1 # MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb # SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf # SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G 87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i 2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no xqE= -----END CERTIFICATE----- # Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Label: "Entrust Root Certification Authority" # Serial: 1164660820 # MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 # SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 # SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m 0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- # Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. # Subject: CN=GeoTrust Global CA O=GeoTrust Inc. # Label: "GeoTrust Global CA" # Serial: 144470 # MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 # SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 # SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- # Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. # Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. # Label: "GeoTrust Global CA 2" # Serial: 1 # MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 # SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d # SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL 5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe 2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv /NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz 4iIprn2DQKi6bA== -----END CERTIFICATE----- # Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. # Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. # Label: "GeoTrust Universal CA" # Serial: 1 # MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 # SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 # SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB /wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG 9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- # Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. # Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. # Label: "GeoTrust Universal CA 2" # Serial: 1 # MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 # SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 # SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m 1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH 6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- # Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. # Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. # Label: "America Online Root Certification Authority 1" # Serial: 1 # MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e # SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a # SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym 1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb 2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- # Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. # Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. # Label: "America Online Root Certification Authority 2" # Serial: 1 # MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf # SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 # SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC 206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 +L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- # Issuer: CN=AAA Certificate Services O=Comodo CA Limited # Subject: CN=AAA Certificate Services O=Comodo CA Limited # Label: "Comodo AAA Services root" # Serial: 1 # MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 # SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 # SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe 3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- # Issuer: CN=Secure Certificate Services O=Comodo CA Limited # Subject: CN=Secure Certificate Services O=Comodo CA Limited # Label: "Comodo Secure Services root" # Serial: 1 # MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd # SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 # SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk 3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz 6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= -----END CERTIFICATE----- # Issuer: CN=Trusted Certificate Services O=Comodo CA Limited # Subject: CN=Trusted Certificate Services O=Comodo CA Limited # Label: "Comodo Trusted Services root" # Serial: 1 # MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 # SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd # SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW 1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- # Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com # Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com # Label: "UTN DATACorp SGC Root CA" # Serial: 91374294542884689855167577680241077609 # MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06 # SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4 # SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48 -----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK 4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv 2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- # Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com # Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com # Label: "UTN USERFirst Hardware Root CA" # Serial: 91374294542884704022267039221184531197 # MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 # SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 # SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn 0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t 3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== -----END CERTIFICATE----- # Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Label: "XRamp Global CA Root" # Serial: 107108908803651509692980124233745014957 # MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 # SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 # SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- # Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority # Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority # Label: "Go Daddy Class 2 CA" # Serial: 0 # MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 # SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 # SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- # Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Label: "Starfield Class 2 CA" # Serial: 0 # MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 # SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a # SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf 8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN +lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA 1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- # Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing # Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing # Label: "StartCom Certification Authority" # Serial: 1 # MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 # SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f # SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ 9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= -----END CERTIFICATE----- # Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Assured ID Root CA" # Serial: 17154717934120587862167794914071425081 # MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 # SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 # SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- # Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Global Root CA" # Serial: 10944719598952040374951832963794454346 # MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e # SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 # SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- # Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert High Assurance EV Root CA" # Serial: 3553400076410547919724730734378100087 # MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a # SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 # SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- # Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. # Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. # Label: "GeoTrust Primary Certification Authority" # Serial: 32798226551256963324313806436981982369 # MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf # SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 # SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- # Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only # Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only # Label: "thawte Primary Root CA" # Serial: 69529181992039203566298953787712940909 # MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 # SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 # SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 jVaMaA== -----END CERTIFICATE----- # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only # Label: "VeriSign Class 3 Public Primary Certification Authority - G5" # Serial: 33037644167568058970164719475676101450 # MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c # SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 # SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- # Issuer: CN=COMODO Certification Authority O=COMODO CA Limited # Subject: CN=COMODO Certification Authority O=COMODO CA Limited # Label: "COMODO Certification Authority" # Serial: 104350513648249232941998508985834464573 # MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 # SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b # SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI 2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp +2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW /zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB ZQ== -----END CERTIFICATE----- # Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. # Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. # Label: "Network Solutions Certificate Authority" # Serial: 116697915152937497490437556386812487904 # MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e # SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce # SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH /nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- # Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Label: "COMODO ECC Certification Authority" # Serial: 41578283867086692638256921589707938090 # MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 # SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 # SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- # Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA # Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA # Label: "TC TrustCenter Class 2 CA II" # Serial: 941389028203453866782103406992443 # MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 # SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e # SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK 8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== -----END CERTIFICATE----- # Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA # Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA # Label: "TC TrustCenter Class 3 CA II" # Serial: 1506523511417715638772220530020799 # MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e # SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 # SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB 95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== -----END CERTIFICATE----- # Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA # Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA # Label: "TC TrustCenter Universal CA I" # Serial: 601024842042189035295619584734726 # MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c # SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 # SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn 8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ 2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- # Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc # Subject: CN=Cybertrust Global Root O=Cybertrust, Inc # Label: "Cybertrust Global Root" # Serial: 4835703278459682877484360 # MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 # SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 # SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- # Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only # Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only # Label: "GeoTrust Primary Certification Authority - G3" # Serial: 28809105769928564313984085209975885599 # MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 # SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd # SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz +uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn 5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G spki4cErx5z481+oghLrGREt -----END CERTIFICATE----- # Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only # Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only # Label: "thawte Primary Root CA - G2" # Serial: 71758320672825410020661621085256472406 # MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f # SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 # SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- # Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only # Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only # Label: "thawte Primary Root CA - G3" # Serial: 127614157056681299805556476275995414779 # MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 # SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 # SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA 2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu MdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- # Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only # Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only # Label: "GeoTrust Primary Certification Authority - G2" # Serial: 80682863203381065782177908751794619243 # MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a # SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 # SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz rD6ogRLQy7rQkgu2npaqBA+K -----END CERTIFICATE----- # Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only # Label: "VeriSign Universal Root Certification Authority" # Serial: 85209574734084581917763752644031726877 # MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 # SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 # SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF 9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN /BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz 4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 7M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only # Label: "VeriSign Class 3 Public Primary Certification Authority - G4" # Serial: 63143484348153506665311985501458640051 # MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 # SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a # SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC 4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- # Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority # Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority # Label: "Verisign Class 3 Public Primary Certification Authority" # Serial: 80507572722862485515306429940691309246 # MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 # SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b # SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 -----BEGIN CERTIFICATE----- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i 2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ 2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ -----END CERTIFICATE----- # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Label: "GlobalSign Root CA - R3" # Serial: 4835703278459759426209954 # MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 # SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad # SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK 6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH WD9f -----END CERTIFICATE----- # Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA # Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA # Label: "TC TrustCenter Universal CA III" # Serial: 2010889993983507346460533407902964 # MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b # SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87 # SHA256 Fingerprint: 30:9b:4a:87:f6:ca:56:c9:31:69:aa:a9:9c:6d:98:88:54:d7:89:2b:d5:43:7e:2d:07:b2:9c:be:da:55:d3:5d -----BEGIN CERTIFICATE----- MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF 5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI 4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== -----END CERTIFICATE----- # Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. # Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. # Label: "Go Daddy Root Certificate Authority - G2" # Serial: 0 # MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 # SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b # SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI 4uJEvlz36hz1 -----END CERTIFICATE----- # Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Label: "Starfield Root Certificate Authority - G2" # Serial: 0 # MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 # SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e # SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg 8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- # Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. # Label: "Starfield Services Root Certificate Authority - G2" # Serial: 0 # MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 # SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f # SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk 6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn 0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN sSi6 -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Commercial O=AffirmTrust # Subject: CN=AffirmTrust Commercial O=AffirmTrust # Label: "AffirmTrust Commercial" # Serial: 8608355977964138876 # MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 # SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 # SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Networking O=AffirmTrust # Subject: CN=AffirmTrust Networking O=AffirmTrust # Label: "AffirmTrust Networking" # Serial: 8957382827206547757 # MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f # SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f # SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp 6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Premium O=AffirmTrust # Subject: CN=AffirmTrust Premium O=AffirmTrust # Label: "AffirmTrust Premium" # Serial: 7893706540734352110 # MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 # SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 # SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ +jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S 5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B 8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc 0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e KeC2uAloGRwYQw== -----END CERTIFICATE----- # Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust # Subject: CN=AffirmTrust Premium ECC O=AffirmTrust # Label: "AffirmTrust Premium ECC" # Serial: 8401224907861490260 # MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d # SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb # SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D 0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== -----END CERTIFICATE----- # Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing # Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing # Label: "StartCom Certification Authority" # Serial: 45 # MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 # SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 # SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst 0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK 1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ 8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm fyWl8kgAwKQB2j8= -----END CERTIFICATE----- # Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. # Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. # Label: "StartCom Certification Authority G2" # Serial: 59 # MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 # SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 # SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM 0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl 6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK 9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- PKwL\P̳**+updraftplus/includes/Google/IO/Abstract.phpnu[ null, "PUT" => null); private static $HOP_BY_HOP = array( 'connection' => true, 'keep-alive' => true, 'proxy-authenticate' => true, 'proxy-authorization' => true, 'te' => true, 'trailers' => true, 'transfer-encoding' => true, 'upgrade' => true ); /** @var UDP_Google_Client */ protected $client; public function __construct(UDP_Google_Client $client) { $this->client = $client; $timeout = $client->getClassConfig('UDP_Google_IO_Abstract', 'request_timeout_seconds'); if ($timeout > 0) { $this->setTimeout($timeout); } } /** * Executes a Google_Http_Request * @param Google_Http_Request $request the http request to be executed * @return array containing response headers, body, and http code * @throws UDP_Google_IO_Exception on curl or IO error */ abstract public function executeRequest(UDP_Google_Http_Request $request); /** * Set options that update the transport implementation's behavior. * @param $options */ abstract public function setOptions($options); /** * Set the maximum request time in seconds. * @param $timeout in seconds */ abstract public function setTimeout($timeout); /** * Get the maximum request time in seconds. * @return timeout in seconds */ abstract public function getTimeout(); /** * Test for the presence of a cURL header processing bug * * The cURL bug was present in versions prior to 7.30.0 and caused the header * length to be miscalculated when a "Connection established" header added by * some proxies was present. * * @return boolean */ abstract protected function needsQuirk(); /** * @visible for testing. * Cache the response to an HTTP request if it is cacheable. * @param Google_Http_Request $request * @return bool Returns true if the insertion was successful. * Otherwise, return false. */ public function setCachedRequest(UDP_Google_Http_Request $request) { // Determine if the request is cacheable. if (Google_Http_CacheParser::isResponseCacheable($request)) { $this->client->getCache()->set($request->getCacheKey(), $request); return true; } return false; } /** * Execute an HTTP Request * * @param Google_Http_Request $request the http request to be executed * @return Google_Http_Request http request with the response http code, * response headers and response body filled in * @throws UDP_Google_IO_Exception on curl or IO error */ public function makeRequest(UDP_Google_Http_Request $request) { // First, check to see if we have a valid cached version. $cached = $this->getCachedRequest($request); if ($cached !== false && $cached instanceof UDP_Google_Http_Request) { if (!$this->checkMustRevalidateCachedRequest($cached, $request)) { return $cached; } } if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) { $request = $this->processEntityRequest($request); } list($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request); if ($respHttpCode == 304 && $cached) { // If the server responded NOT_MODIFIED, return the cached request. $this->updateCachedRequest($cached, $responseHeaders); return $cached; } if (!isset($responseHeaders['Date']) && !isset($responseHeaders['date'])) { $responseHeaders['date'] = date("r"); } $request->setResponseHttpCode($respHttpCode); $request->setResponseHeaders($responseHeaders); $request->setResponseBody($responseData); // Store the request in cache (the function checks to see if the request // can actually be cached) $this->setCachedRequest($request); return $request; } /** * @visible for testing. * @param Google_Http_Request $request * @return Google_Http_Request|bool Returns the cached object or * false if the operation was unsuccessful. */ public function getCachedRequest(UDP_Google_Http_Request $request) { if (false === Google_Http_CacheParser::isRequestCacheable($request)) { return false; } return $this->client->getCache()->get($request->getCacheKey()); } /** * @visible for testing * Process an http request that contains an enclosed entity. * @param Google_Http_Request $request * @return Google_Http_Request Processed request with the enclosed entity. */ public function processEntityRequest(UDP_Google_Http_Request $request) { $postBody = $request->getPostBody(); $contentType = $request->getRequestHeader("content-type"); // Set the default content-type as application/x-www-form-urlencoded. if (false == $contentType) { $contentType = self::FORM_URLENCODED; $request->setRequestHeaders(array('content-type' => $contentType)); } // Force the payload to match the content-type asserted in the header. if ($contentType == self::FORM_URLENCODED && is_array($postBody)) { $postBody = http_build_query($postBody, '', '&'); $request->setPostBody($postBody); } // Make sure the content-length header is set. if (!$postBody || is_string($postBody)) { $postsLength = strlen($postBody); $request->setRequestHeaders(array('content-length' => $postsLength)); } return $request; } /** * Check if an already cached request must be revalidated, and if so update * the request with the correct ETag headers. * @param Google_Http_Request $cached A previously cached response. * @param Google_Http_Request $request The outbound request. * return bool If the cached object needs to be revalidated, false if it is * still current and can be re-used. */ protected function checkMustRevalidateCachedRequest($cached, $request) { if (Google_Http_CacheParser::mustRevalidate($cached)) { $addHeaders = array(); if ($cached->getResponseHeader('etag')) { // [13.3.4] If an entity tag has been provided by the origin server, // we must use that entity tag in any cache-conditional request. $addHeaders['If-None-Match'] = $cached->getResponseHeader('etag'); } elseif ($cached->getResponseHeader('date')) { $addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date'); } $request->setRequestHeaders($addHeaders); return true; } else { return false; } } /** * Update a cached request, using the headers from the last response. * @param Google_Http_Request $cached A previously cached response. * @param mixed Associative array of response headers from the last request. */ protected function updateCachedRequest($cached, $responseHeaders) { $hopByHop = self::$HOP_BY_HOP; if (!empty($responseHeaders['connection'])) { $connectionHeaders = array_map( 'strtolower', array_filter( array_map('trim', explode(',', $responseHeaders['connection'])) ) ); $hopByHop += array_fill_keys($connectionHeaders, true); } $endToEnd = array_diff_key($responseHeaders, $hopByHop); $cached->setResponseHeaders($endToEnd); } /** * Used by the IO lib and also the batch processing. * * @param $respData * @param $headerSize * @return array */ public function parseHttpResponse($respData, $headerSize) { // check proxy header foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) { if (stripos($respData, $established_header) !== false) { // existed, remove it $respData = str_ireplace($established_header, '', $respData); // Subtract the proxy header size unless the cURL bug prior to 7.30.0 // is present which prevented the proxy header size from being taken into // account. if (!$this->needsQuirk()) { $headerSize -= strlen($established_header); } break; } } if ($headerSize) { $responseBody = substr($respData, $headerSize); $responseHeaders = substr($respData, 0, $headerSize); } else { $responseSegments = explode("\r\n\r\n", $respData, 2); $responseHeaders = $responseSegments[0]; $responseBody = isset($responseSegments[1]) ? $responseSegments[1] : null; } $responseHeaders = $this->getHttpResponseHeaders($responseHeaders); return array($responseHeaders, $responseBody); } /** * Parse out headers from raw headers * @param rawHeaders array or string * @return array */ public function getHttpResponseHeaders($rawHeaders) { if (is_array($rawHeaders)) { return $this->parseArrayHeaders($rawHeaders); } else { return $this->parseStringHeaders($rawHeaders); } } private function parseStringHeaders($rawHeaders) { $headers = array(); $responseHeaderLines = explode("\r\n", $rawHeaders); foreach ($responseHeaderLines as $headerLine) { if ($headerLine && strpos($headerLine, ':') !== false) { list($header, $value) = explode(': ', $headerLine, 2); $header = strtolower($header); if (isset($headers[$header])) { $headers[$header] .= "\n" . $value; } else { $headers[$header] = $value; } } } return $headers; } private function parseArrayHeaders($rawHeaders) { $header_count = count($rawHeaders); $headers = array(); for ($i = 0; $i < $header_count; $i++) { $header = $rawHeaders[$i]; // Times will have colons in - so we just want the first match. $header_parts = explode(': ', $header, 2); if (count($header_parts) == 2) { $headers[strtolower($header_parts[0])] = $header_parts[1]; } } return $headers; } } PKwL\j\CWW)updraftplus/includes/Google/IO/Stream.phpnu[ */ if (!class_exists('UDP_Google_Client')) { require_once dirname(__FILE__) . '/../autoload.php'; } class UDP_Google_IO_Stream extends UDP_Google_IO_Abstract { const TIMEOUT = "timeout"; const ZLIB = "compress.zlib://"; private $options = array(); private $trappedErrorNumber; private $trappedErrorString; private static $DEFAULT_HTTP_CONTEXT = array( "follow_location" => 0, "ignore_errors" => 1, ); private static $DEFAULT_SSL_CONTEXT = array( "verify_peer" => true, ); public function __construct(UDP_Google_Client $client) { if (!ini_get('allow_url_fopen')) { $error = 'The stream IO handler requires the allow_url_fopen runtime ' . 'configuration to be enabled'; $client->getLogger()->critical($error); throw new UDP_Google_IO_Exception($error); } parent::__construct($client); } /** * Execute an HTTP Request * * @param Google_Http_Request $request the http request to be executed * @return array containing response headers, body, and http code * @throws UDP_Google_IO_Exception on curl or IO error */ public function executeRequest(UDP_Google_Http_Request $request) { $default_options = stream_context_get_options(stream_context_get_default()); $requestHttpContext = array_key_exists('http', $default_options) ? $default_options['http'] : array(); if ($request->getPostBody()) { $requestHttpContext["content"] = $request->getPostBody(); } $requestHeaders = $request->getRequestHeaders(); if ($requestHeaders && is_array($requestHeaders)) { $headers = ""; foreach ($requestHeaders as $k => $v) { $headers .= "$k: $v\r\n"; } $requestHttpContext["header"] = $headers; } $requestHttpContext["method"] = $request->getRequestMethod(); $requestHttpContext["user_agent"] = $request->getUserAgent(); $requestSslContext = array_key_exists('ssl', $default_options) ? $default_options['ssl'] : array(); # UpdraftPlus patch // if (!array_key_exists("cafile", $requestSslContext)) { // $requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem'; // } $url = $request->getUrl(); if (preg_match('#^https?://([^/]+)/#', $url, $umatches)) { $cname = $umatches[1]; } else { $cname = false; } # UpdraftPlus patch // Added if (empty($this->options['disable_verify_peer'])) { $requestSslContext['verify_peer'] = true; if (version_compare(PHP_VERSION, '5.6.0', '>=')) { if (!empty($cname)) $requestSslContext['peer_name'] = $cname; } else { if (!empty($cname)) { $requestSslContext['CN_match'] = $cname; $retry_on_fail = true; } } } else { $requestSslContext['allow_self_signed'] = true; } if (!empty($this->options['cafile'])) $requestSslContext['cafile'] = $this->options['cafile']; $options = array( "http" => array_merge( self::$DEFAULT_HTTP_CONTEXT, $requestHttpContext ), "ssl" => array_merge( # UpdraftPlus patch // self::$DEFAULT_SSL_CONTEXT, $requestSslContext ) ); $context = stream_context_create($options); # UpdraftPlus patch // $url = $request->getUrl(); if ($request->canGzip()) { $url = self::ZLIB . $url; } $this->client->getLogger()->debug( 'Stream request', array( 'url' => $url, 'method' => $request->getRequestMethod(), 'headers' => $requestHeaders, 'body' => $request->getPostBody() ) ); // We are trapping any thrown errors in this method only and // throwing an exception. $this->trappedErrorNumber = null; $this->trappedErrorString = null; // START - error trap. set_error_handler(array($this, 'trapError')); $fh = fopen($url, 'r', false, $context); # UpdraftPLus patch if (!$fh && isset($retry_on_fail) && !empty($cname) && 'www.googleapis.com' == $cname) { // Reset $this->trappedErrorNumber = null; $this->trappedErrorString = null; global $updraftplus; $updraftplus->log("Using Stream, and fopen failed; retrying different CN match to try to overcome"); // www.googleapis.com does not match the cert now being presented - *.storage.googleapis.com; presumably, PHP's stream handler isn't handling alternative names properly. Rather than turn off all verification, let's retry with a new name to match. $options['ssl']['CN_match'] = 'www.storage.googleapis.com'; $context = stream_context_create($options); $fh = fopen($url, 'r', false, $context); } restore_error_handler(); // END - error trap. if ($this->trappedErrorNumber) { $error = sprintf( "HTTP Error: Unable to connect: '%s'", $this->trappedErrorString ); $this->client->getLogger()->error('Stream ' . $error); throw new UDP_Google_IO_Exception($error, $this->trappedErrorNumber); } $response_data = false; $respHttpCode = self::UNKNOWN_CODE; if ($fh) { if (isset($this->options[self::TIMEOUT])) { stream_set_timeout($fh, $this->options[self::TIMEOUT]); } $response_data = stream_get_contents($fh); fclose($fh); $respHttpCode = $this->getHttpResponseCode($http_response_header); } if (false === $response_data) { $error = sprintf( "HTTP Error: Unable to connect: '%s'", $respHttpCode ); $this->client->getLogger()->error('Stream ' . $error); throw new UDP_Google_IO_Exception($error, $respHttpCode); } $responseHeaders = $this->getHttpResponseHeaders($http_response_header); $this->client->getLogger()->debug( 'Stream response', array( 'code' => $respHttpCode, 'headers' => $responseHeaders, 'body' => $response_data, ) ); return array($response_data, $responseHeaders, $respHttpCode); } /** * Set options that update the transport implementation's behavior. * @param $options */ public function setOptions($options) { $this->options = $options + $this->options; } /** * Method to handle errors, used for error handling around * stream connection methods. */ public function trapError($errno, $errstr) { $this->trappedErrorNumber = $errno; $this->trappedErrorString = $errstr; } /** * Set the maximum request time in seconds. * @param $timeout in seconds */ public function setTimeout($timeout) { $this->options[self::TIMEOUT] = $timeout; } /** * Get the maximum request time in seconds. * @return timeout in seconds */ public function getTimeout() { return $this->options[self::TIMEOUT]; } /** * Test for the presence of a cURL header processing bug * * {@inheritDoc} * * @return boolean */ protected function needsQuirk() { return false; } protected function getHttpResponseCode($response_headers) { $header_count = count($response_headers); for ($i = 0; $i < $header_count; $i++) { $header = $response_headers[$i]; if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) { $response = explode(' ', $header); return $response[1]; } } return self::UNKNOWN_CODE; } } PKwL\?D= 0) { parent::__construct($message, $code, $previous); } else { parent::__construct($message, $code); } if (is_array($retryMap)) { $this->retryMap = $retryMap; } } /** * Gets the number of times the associated task can be retried. * * NOTE: -1 is returned if the task can be retried indefinitely * * @return integer */ public function allowedRetries() { if (isset($this->retryMap[$this->code])) { return $this->retryMap[$this->code]; } return 0; } } PKwL\``'updraftplus/includes/Google/IO/Curl.phpnu[ */ if (!class_exists('UDP_Google_Client')) { require_once dirname(__FILE__) . '/../autoload.php'; } class UDP_Google_IO_Curl extends UDP_Google_IO_Abstract { // cURL hex representation of version 7.30.0 const NO_QUIRK_VERSION = 0x071E00; private $options = array(); public function __construct(UDP_Google_Client $client) { if (!extension_loaded('curl')) { $error = 'The cURL IO handler requires the cURL extension to be enabled'; $client->getLogger()->critical($error); throw new UDP_Google_IO_Exception($error); } parent::__construct($client); } /** * Execute an HTTP Request * * @param Google_Http_Request $request the http request to be executed * @return array containing response headers, body, and http code * @throws UDP_Google_IO_Exception on curl or IO error */ public function executeRequest(UDP_Google_Http_Request $request) { $curl = curl_init(); if ($request->getPostBody()) { curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody()); } $requestHeaders = $request->getRequestHeaders(); if ($requestHeaders && is_array($requestHeaders)) { $curlHeaders = array(); foreach ($requestHeaders as $k => $v) { $curlHeaders[] = "$k: $v"; } curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders); } curl_setopt($curl, CURLOPT_URL, $request->getUrl()); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod()); curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent()); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); // 1 is CURL_SSLVERSION_TLSv1, which is not always defined in PHP. // UpdraftPlus patch // The SDK leaves this on the default setting in later releases // curl_setopt($curl, CURLOPT_SSLVERSION, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, true); if ($request->canGzip()) { curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); } $options = $this->client->getClassConfig('UDP_Google_IO_Curl', 'options'); if (is_array($options)) { $this->setOptions($options); } foreach ($this->options as $key => $var) { curl_setopt($curl, $key, $var); } if (!isset($this->options[CURLOPT_CAINFO])) { curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem'); } $this->client->getLogger()->debug( 'cURL request', array( 'url' => $request->getUrl(), 'method' => $request->getRequestMethod(), 'headers' => $requestHeaders, 'body' => $request->getPostBody() ) ); $response = curl_exec($curl); if ($response === false) { $error = curl_error($curl); $code = curl_errno($curl); $map = $this->client->getClassConfig('UDP_Google_IO_Exception', 'retry_map'); $this->client->getLogger()->error('cURL ' . $error); throw new UDP_Google_IO_Exception($error, $code, null, $map); } $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); list($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize); $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); $this->client->getLogger()->debug( 'cURL response', array( 'code' => $responseCode, 'headers' => $responseHeaders, 'body' => $responseBody, ) ); return array($responseBody, $responseHeaders, $responseCode); } /** * Set options that update the transport implementation's behavior. * @param $options */ public function setOptions($options) { $this->options = $options + $this->options; } /** * Set the maximum request time in seconds. * @param $timeout in seconds */ public function setTimeout($timeout) { // Since this timeout is really for putting a bound on the time // we'll set them both to the same. If you need to specify a longer // CURLOPT_TIMEOUT, or a higher CONNECTTIMEOUT, the best thing to // do is use the setOptions method for the values individually. $this->options[CURLOPT_CONNECTTIMEOUT] = $timeout; $this->options[CURLOPT_TIMEOUT] = $timeout; } /** * Get the maximum request time in seconds. * @return timeout in seconds */ public function getTimeout() { return $this->options[CURLOPT_TIMEOUT]; } /** * Test for the presence of a cURL header processing bug * * {@inheritDoc} * * @return boolean */ protected function needsQuirk() { $ver = curl_version(); $versionNum = $ver['version_number']; return $versionNum < UDP_Google_IO_Curl::NO_QUIRK_VERSION; } } PKwL\*%%+updraftplus/includes/Google/Logger/Null.phpnu[ 600, self::ALERT => 550, self::CRITICAL => 500, self::ERROR => 400, self::WARNING => 300, self::NOTICE => 250, self::INFO => 200, self::DEBUG => 100, ); /** * @var integer $level The minimum logging level */ protected $level = self::DEBUG; /** * @var string $logFormat The current log format */ protected $logFormat = self::DEFAULT_LOG_FORMAT; /** * @var string $dateFormat The current date format */ protected $dateFormat = self::DEFAULT_DATE_FORMAT; /** * @var boolean $allowNewLines If newlines are allowed */ protected $allowNewLines = false; /** * @param UDP_Google_Client $client The current Google client */ public function __construct(UDP_Google_Client $client) { $this->setLevel( $client->getClassConfig('Google_Logger_Abstract', 'level') ); $format = $client->getClassConfig('Google_Logger_Abstract', 'log_format'); $this->logFormat = $format ? $format : self::DEFAULT_LOG_FORMAT; $format = $client->getClassConfig('Google_Logger_Abstract', 'date_format'); $this->dateFormat = $format ? $format : self::DEFAULT_DATE_FORMAT; $this->allowNewLines = (bool) $client->getClassConfig( 'Google_Logger_Abstract', 'allow_newlines' ); } /** * Sets the minimum logging level that this logger handles. * * @param integer $level */ public function setLevel($level) { $this->level = $this->normalizeLevel($level); } /** * Checks if the logger should handle messages at the provided level. * * @param integer $level * @return boolean */ public function shouldHandle($level) { return $this->normalizeLevel($level) >= $this->level; } /** * System is unusable. * * @param string $message The log message * @param array $context The log context */ public function emergency($message, array $context = array()) { $this->log(self::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message The log message * @param array $context The log context */ public function alert($message, array $context = array()) { $this->log(self::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message The log message * @param array $context The log context */ public function critical($message, array $context = array()) { $this->log(self::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message The log message * @param array $context The log context */ public function error($message, array $context = array()) { $this->log(self::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message The log message * @param array $context The log context */ public function warning($message, array $context = array()) { $this->log(self::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message The log message * @param array $context The log context */ public function notice($message, array $context = array()) { $this->log(self::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message The log message * @param array $context The log context */ public function info($message, array $context = array()) { $this->log(self::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message The log message * @param array $context The log context */ public function debug($message, array $context = array()) { $this->log(self::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level The log level * @param string $message The log message * @param array $context The log context */ public function log($level, $message, array $context = array()) { if (!$this->shouldHandle($level)) { return false; } $levelName = is_int($level) ? array_search($level, self::$levels) : $level; $message = $this->interpolate( array( 'message' => $message, 'context' => $context, 'level' => strtoupper($levelName), 'datetime' => new DateTime(), ) ); $this->write($message); } /** * Interpolates log variables into the defined log format. * * @param array $variables The log variables. * @return string */ protected function interpolate(array $variables = array()) { $template = $this->logFormat; if (!$variables['context']) { $template = str_replace('%context%', '', $template); unset($variables['context']); } else { $this->reverseJsonInContext($variables['context']); } foreach ($variables as $key => $value) { if (strpos($template, '%'. $key .'%') !== false) { $template = str_replace( '%' . $key . '%', $this->export($value), $template ); } } return $template; } /** * Reverses JSON encoded PHP arrays and objects so that they log better. * * @param array $context The log context */ protected function reverseJsonInContext(array &$context) { if (!$context) { return; } foreach ($context as $key => $val) { if (!$val || !is_string($val) || !($val[0] == '{' || $val[0] == '[')) { continue; } $json = @json_decode($val); if (is_object($json) || is_array($json)) { $context[$key] = $json; } } } /** * Exports a PHP value for logging to a string. * * @param mixed $value The value to */ protected function export($value) { if (is_string($value)) { if ($this->allowNewLines) { return $value; } return preg_replace('/[\r\n]+/', ' ', $value); } if (is_resource($value)) { return sprintf( 'resource(%d) of type (%s)', $value, get_resource_type($value) ); } if ($value instanceof DateTime) { return $value->format($this->dateFormat); } if (version_compare(PHP_VERSION, '5.4.0', '>=')) { // @codingStandardsIgnoreLine $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; if ($this->allowNewLines) { // @codingStandardsIgnoreLine $options |= JSON_PRETTY_PRINT; } return @json_encode($value, $options); } return str_replace('\\/', '/', @json_encode($value)); } /** * Converts a given log level to the integer form. * * @param mixed $level The logging level * @return integer $level The normalized level * @throws Google_Logger_Exception If $level is invalid */ protected function normalizeLevel($level) { if (is_int($level) && array_search($level, self::$levels) !== false) { return $level; } if (is_string($level) && isset(self::$levels[$level])) { return self::$levels[$level]; } throw new Google_Logger_Exception( sprintf("Unknown LogLevel: '%s'", $level) ); } /** * Writes a message to the current log implementation. * * @param string $message The message */ abstract protected function write($message); } PKwL\.{a *updraftplus/includes/Google/Logger/Psr.phpnu[setLogger($logger); } } /** * Sets the PSR-3 logger where logging will be delegated. * * NOTE: The `$logger` should technically implement * `Psr\Log\LoggerInterface`, but we don't explicitly require this so that * we can be compatible with PHP 5.2. * * @param Psr\Log\LoggerInterface $logger The PSR-3 logger */ public function setLogger(/*Psr\Log\LoggerInterface*/ $logger) { $this->logger = $logger; } /** * {@inheritdoc} */ public function shouldHandle($level) { return isset($this->logger) && parent::shouldHandle($level); } /** * {@inheritdoc} */ public function log($level, $message, array $context = array()) { if (!$this->shouldHandle($level)) { return false; } if ($context) { $this->reverseJsonInContext($context); } $levelName = is_int($level) ? array_search($level, self::$levels) : $level; $this->logger->log($levelName, $message, $context); } /** * {@inheritdoc} */ protected function write($message, array $context = array()) { } } PKwL\;nn+updraftplus/includes/Google/Logger/File.phpnu[getClassConfig('Google_Logger_File', 'file'); if (!is_string($file) && !is_resource($file)) { throw new Google_Logger_Exception( 'File logger requires a filename or a valid file pointer' ); } $mode = $client->getClassConfig('Google_Logger_File', 'mode'); if (!$mode) { $this->mode = $mode; } $this->lock = (bool) $client->getClassConfig('Google_Logger_File', 'lock'); $this->file = $file; } /** * {@inheritdoc} */ protected function write($message) { if (is_string($this->file)) { $this->open(); } elseif (!is_resource($this->file)) { throw new Google_Logger_Exception('File pointer is no longer available'); } if ($this->lock) { flock($this->file, LOCK_EX); } fwrite($this->file, (string) $message); if ($this->lock) { flock($this->file, LOCK_UN); } } /** * Opens the log for writing. * * @return resource */ private function open() { // Used for trapping `fopen()` errors. $this->trappedErrorNumber = null; $this->trappedErrorString = null; $old = set_error_handler(array($this, 'trapError')); $needsChmod = !file_exists($this->file); $fh = fopen($this->file, 'a'); restore_error_handler(); // Handles trapped `fopen()` errors. if ($this->trappedErrorNumber) { throw new Google_Logger_Exception( sprintf( "Logger Error: '%s'", $this->trappedErrorString ), $this->trappedErrorNumber ); } if ($needsChmod) { @chmod($this->file, $this->mode & ~umask()); } return $this->file = $fh; } /** * Closes the log stream resource. */ private function close() { if (is_resource($this->file)) { fclose($this->file); } } /** * Traps `fopen()` errors. * * @param integer $errno The error number * @param string $errstr The error string */ private function trapError($errno, $errstr) { $this->trappedErrorNumber = $errno; $this->trappedErrorString = $errstr; } public function __destruct() { $this->close(); } } PKwL\Nҍ0updraftplus/includes/Google/Logger/Exception.phpnu[ * Lets you access OAuth2 protocol related APIs.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class UDP_Google_Service_Oauth2 extends UDP_Google_Service { /** Know your basic profile info and list of people in your circles.. */ const PLUS_LOGIN = "https://www.googleapis.com/auth/plus.login"; /** Know who you are on Google. */ const PLUS_ME = "https://www.googleapis.com/auth/plus.me"; /** View your email address. */ const USERINFO_EMAIL = "https://www.googleapis.com/auth/userinfo.email"; /** View your basic profile info. */ const USERINFO_PROFILE = "https://www.googleapis.com/auth/userinfo.profile"; public $userinfo; public $userinfo_v2_me; private $serviceName; private $base_methods; /** * Constructs the internal representation of the Oauth2 service. * * @param UDP_Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = ''; $this->version = 'v2'; $this->serviceName = 'oauth2'; $this->userinfo = new Google_Service_Oauth2_Userinfo_Resource( $this, $this->serviceName, 'userinfo', array( 'methods' => array( 'get' => array( 'path' => 'oauth2/v2/userinfo', 'httpMethod' => 'GET', 'parameters' => array(), ), ) ) ); $this->userinfo_v2_me = new Google_Service_Oauth2_UserinfoV2Me_Resource( $this, $this->serviceName, 'me', array( 'methods' => array( 'get' => array( 'path' => 'userinfo/v2/me', 'httpMethod' => 'GET', 'parameters' => array(), ), ) ) ); $this->base_methods = new UDP_Google_Service_Resource( $this, $this->serviceName, '', array( 'methods' => array( 'getCertForOpenIdConnect' => array( 'path' => 'oauth2/v2/certs', 'httpMethod' => 'GET', 'parameters' => array(), ),'tokeninfo' => array( 'path' => 'oauth2/v2/tokeninfo', 'httpMethod' => 'POST', 'parameters' => array( 'access_token' => array( 'location' => 'query', 'type' => 'string', ), 'id_token' => array( 'location' => 'query', 'type' => 'string', ), 'token_handle' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); } /** * (getCertForOpenIdConnect) * * @param array $optParams Optional parameters. * @return Google_Service_Oauth2_Jwk */ public function getCertForOpenIdConnect($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->base_methods->call('getCertForOpenIdConnect', array($params), "Google_Service_Oauth2_Jwk"); } /** * (tokeninfo) * * @param array $optParams Optional parameters. * * @opt_param string access_token * @opt_param string id_token * @opt_param string token_handle * @return Google_Service_Oauth2_Tokeninfo */ public function tokeninfo($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->base_methods->call('tokeninfo', array($params), "Google_Service_Oauth2_Tokeninfo"); } } /** * The "userinfo" collection of methods. * Typical usage is: * * $oauth2Service = new UDP_Google_Service_Oauth2(...); * $userinfo = $oauth2Service->userinfo; * */ class Google_Service_Oauth2_Userinfo_Resource extends UDP_Google_Service_Resource { /** * (userinfo.get) * * @param array $optParams Optional parameters. * @return Google_Service_Oauth2_Userinfoplus */ public function get($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Oauth2_Userinfoplus"); } } /** * The "v2" collection of methods. * Typical usage is: * * $oauth2Service = new UDP_Google_Service_Oauth2(...); * $v2 = $oauth2Service->v2; * */ class Google_Service_Oauth2_UserinfoV2_Resource extends UDP_Google_Service_Resource { } /** * The "me" collection of methods. * Typical usage is: * * $oauth2Service = new UDP_Google_Service_Oauth2(...); * $me = $oauth2Service->me; * */ class Google_Service_Oauth2_UserinfoV2Me_Resource extends UDP_Google_Service_Resource { /** * (me.get) * * @param array $optParams Optional parameters. * @return Google_Service_Oauth2_Userinfoplus */ public function get($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Oauth2_Userinfoplus"); } } class Google_Service_Oauth2_Jwk extends Google_Collection { protected $collection_key = 'keys'; protected $internal_gapi_mappings = array( ); protected $keysType = 'Google_Service_Oauth2_JwkKeys'; protected $keysDataType = 'array'; public function setKeys($keys) { $this->keys = $keys; } public function getKeys() { return $this->keys; } } class Google_Service_Oauth2_JwkKeys extends Google_Model { protected $internal_gapi_mappings = array( ); public $alg; public $e; public $kid; public $kty; public $n; public $use; public function setAlg($alg) { $this->alg = $alg; } public function getAlg() { return $this->alg; } public function setE($e) { $this->e = $e; } public function getE() { return $this->e; } public function setKid($kid) { $this->kid = $kid; } public function getKid() { return $this->kid; } public function setKty($kty) { $this->kty = $kty; } public function getKty() { return $this->kty; } public function setN($n) { $this->n = $n; } public function getN() { return $this->n; } public function setUse($use) { $this->use = $use; } public function getUse() { return $this->use; } } class Google_Service_Oauth2_Tokeninfo extends Google_Model { protected $internal_gapi_mappings = array( "accessType" => "access_type", "expiresIn" => "expires_in", "issuedTo" => "issued_to", "tokenHandle" => "token_handle", "userId" => "user_id", "verifiedEmail" => "verified_email", ); public $accessType; public $audience; public $email; public $expiresIn; public $issuedTo; public $scope; public $tokenHandle; public $userId; public $verifiedEmail; public function setAccessType($accessType) { $this->accessType = $accessType; } public function getAccessType() { return $this->accessType; } public function setAudience($audience) { $this->audience = $audience; } public function getAudience() { return $this->audience; } public function setEmail($email) { $this->email = $email; } public function getEmail() { return $this->email; } public function setExpiresIn($expiresIn) { $this->expiresIn = $expiresIn; } public function getExpiresIn() { return $this->expiresIn; } public function setIssuedTo($issuedTo) { $this->issuedTo = $issuedTo; } public function getIssuedTo() { return $this->issuedTo; } public function setScope($scope) { $this->scope = $scope; } public function getScope() { return $this->scope; } public function setTokenHandle($tokenHandle) { $this->tokenHandle = $tokenHandle; } public function getTokenHandle() { return $this->tokenHandle; } public function setUserId($userId) { $this->userId = $userId; } public function getUserId() { return $this->userId; } public function setVerifiedEmail($verifiedEmail) { $this->verifiedEmail = $verifiedEmail; } public function getVerifiedEmail() { return $this->verifiedEmail; } } class Google_Service_Oauth2_Userinfoplus extends Google_Model { protected $internal_gapi_mappings = array( "familyName" => "family_name", "givenName" => "given_name", "verifiedEmail" => "verified_email", ); public $email; public $familyName; public $gender; public $givenName; public $hd; public $id; public $link; public $locale; public $name; public $picture; public $verifiedEmail; public function setEmail($email) { $this->email = $email; } public function getEmail() { return $this->email; } public function setFamilyName($familyName) { $this->familyName = $familyName; } public function getFamilyName() { return $this->familyName; } public function setGender($gender) { $this->gender = $gender; } public function getGender() { return $this->gender; } public function setGivenName($givenName) { $this->givenName = $givenName; } public function getGivenName() { return $this->givenName; } public function setHd($hd) { $this->hd = $hd; } public function getHd() { return $this->hd; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setLink($link) { $this->link = $link; } public function getLink() { return $this->link; } public function setLocale($locale) { $this->locale = $locale; } public function getLocale() { return $this->locale; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setPicture($picture) { $this->picture = $picture; } public function getPicture() { return $this->picture; } public function setVerifiedEmail($verifiedEmail) { $this->verifiedEmail = $verifiedEmail; } public function getVerifiedEmail() { return $this->verifiedEmail; } } PKwL\@2yLL/updraftplus/includes/Google/Service/Logging.phpnu[ * Google Cloud Logging API lets you create logs, ingest log entries, and manage * log sinks.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Google_Service_Logging extends UDP_Google_Service { /** View and manage your data across Google Cloud Platform services. */ const CLOUD_PLATFORM = "https://www.googleapis.com/auth/cloud-platform"; public $projects_logServices; public $projects_logServices_indexes; public $projects_logServices_sinks; public $projects_logs; public $projects_logs_entries; public $projects_logs_sinks; /** * Constructs the internal representation of the Logging service. * * @param Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = ''; $this->version = 'v1beta3'; $this->serviceName = 'logging'; $this->projects_logServices = new Google_Service_Logging_ProjectsLogServices_Resource( $this, $this->serviceName, 'logServices', array( 'methods' => array( 'list' => array( 'path' => 'v1beta3/projects/{projectsId}/logServices', 'httpMethod' => 'GET', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'log' => array( 'location' => 'query', 'type' => 'string', ), 'pageSize' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->projects_logServices_indexes = new Google_Service_Logging_ProjectsLogServicesIndexes_Resource( $this, $this->serviceName, 'indexes', array( 'methods' => array( 'list' => array( 'path' => 'v1beta3/projects/{projectsId}/logServices/{logServicesId}/indexes', 'httpMethod' => 'GET', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logServicesId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'log' => array( 'location' => 'query', 'type' => 'string', ), 'pageSize' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'depth' => array( 'location' => 'query', 'type' => 'integer', ), 'indexPrefix' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->projects_logServices_sinks = new Google_Service_Logging_ProjectsLogServicesSinks_Resource( $this, $this->serviceName, 'sinks', array( 'methods' => array( 'create' => array( 'path' => 'v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks', 'httpMethod' => 'POST', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logServicesId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'delete' => array( 'path' => 'v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logServicesId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sinksId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}', 'httpMethod' => 'GET', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logServicesId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sinksId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks', 'httpMethod' => 'GET', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logServicesId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}', 'httpMethod' => 'PUT', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logServicesId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sinksId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->projects_logs = new Google_Service_Logging_ProjectsLogs_Resource( $this, $this->serviceName, 'logs', array( 'methods' => array( 'delete' => array( 'path' => 'v1beta3/projects/{projectsId}/logs/{logsId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'v1beta3/projects/{projectsId}/logs', 'httpMethod' => 'GET', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'serviceName' => array( 'location' => 'query', 'type' => 'string', ), 'serviceIndexPrefix' => array( 'location' => 'query', 'type' => 'string', ), 'pageSize' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->projects_logs_entries = new Google_Service_Logging_ProjectsLogsEntries_Resource( $this, $this->serviceName, 'entries', array( 'methods' => array( 'write' => array( 'path' => 'v1beta3/projects/{projectsId}/logs/{logsId}/entries:write', 'httpMethod' => 'POST', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->projects_logs_sinks = new Google_Service_Logging_ProjectsLogsSinks_Resource( $this, $this->serviceName, 'sinks', array( 'methods' => array( 'create' => array( 'path' => 'v1beta3/projects/{projectsId}/logs/{logsId}/sinks', 'httpMethod' => 'POST', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'delete' => array( 'path' => 'v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sinksId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}', 'httpMethod' => 'GET', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sinksId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'v1beta3/projects/{projectsId}/logs/{logsId}/sinks', 'httpMethod' => 'GET', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}', 'httpMethod' => 'PUT', 'parameters' => array( 'projectsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'logsId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sinksId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); } } /** * The "projects" collection of methods. * Typical usage is: * * $loggingService = new Google_Service_Logging(...); * $projects = $loggingService->projects; * */ class Google_Service_Logging_Projects_Resource extends UDP_Google_Service_Resource { } /** * The "logServices" collection of methods. * Typical usage is: * * $loggingService = new Google_Service_Logging(...); * $logServices = $loggingService->logServices; * */ class Google_Service_Logging_ProjectsLogServices_Resource extends UDP_Google_Service_Resource { /** * Lists log services associated with log entries ingested for a project. * (logServices.listProjectsLogServices) * * @param string $projectsId Part of `projectName`. The project resource whose * services are to be listed. * @param array $optParams Optional parameters. * * @opt_param string pageToken An opaque token, returned as `nextPageToken` by a * prior `ListLogServices` operation. If `pageToken` is supplied, then the other * fields of this request are ignored, and instead the previous * `ListLogServices` operation is continued. * @opt_param string log The name of the log resource whose services are to be * listed. log for which to list services. When empty, all services are listed. * @opt_param int pageSize The maximum number of `LogService` objects to return * in one operation. * @return Google_Service_Logging_ListLogServicesResponse */ public function listProjectsLogServices($projectsId, $optParams = array()) { $params = array('projectsId' => $projectsId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Logging_ListLogServicesResponse"); } } /** * The "indexes" collection of methods. * Typical usage is: * * $loggingService = new Google_Service_Logging(...); * $indexes = $loggingService->indexes; * */ class Google_Service_Logging_ProjectsLogServicesIndexes_Resource extends UDP_Google_Service_Resource { /** * Lists log service indexes associated with a log service. * (indexes.listProjectsLogServicesIndexes) * * @param string $projectsId Part of `serviceName`. A log service resource of * the form `/projects/logServices`. The service indexes of the log service are * returned. Example: `"/projects/myProj/logServices/appengine.googleapis.com"`. * @param string $logServicesId Part of `serviceName`. See documentation of * `projectsId`. * @param array $optParams Optional parameters. * * @opt_param string log A log resource like * `/projects/project_id/logs/log_name`, identifying the log for which to list * service indexes. * @opt_param int pageSize The maximum number of log service index resources to * return in one operation. * @opt_param string pageToken An opaque token, returned as `nextPageToken` by a * prior `ListLogServiceIndexes` operation. If `pageToken` is supplied, then the * other fields of this request are ignored, and instead the previous * `ListLogServiceIndexes` operation is continued. * @opt_param int depth A limit to the number of levels of the index hierarchy * that are expanded. If `depth` is 0, it defaults to the level specified by the * prefix field (the number of slash separators). The default empty prefix * implies a `depth` of 1. It is an error for `depth` to be any non-zero value * less than the number of components in `indexPrefix`. * @opt_param string indexPrefix Restricts the indexes returned to be those with * a specified prefix. The prefix has the form `"/label_value/label_value/..."`, * in order corresponding to the [`LogService * indexKeys`][google.logging.v1.LogService.index_keys]. Non-empty prefixes must * begin with `/` . Example prefixes: + `"/myModule/"` retrieves App Engine * versions associated with `myModule`. The trailing slash terminates the value. * + `"/myModule"` retrieves App Engine modules with names beginning with * `myModule`. + `""` retrieves all indexes. * @return Google_Service_Logging_ListLogServiceIndexesResponse */ public function listProjectsLogServicesIndexes($projectsId, $logServicesId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logServicesId' => $logServicesId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Logging_ListLogServiceIndexesResponse"); } } /** * The "sinks" collection of methods. * Typical usage is: * * $loggingService = new Google_Service_Logging(...); * $sinks = $loggingService->sinks; * */ class Google_Service_Logging_ProjectsLogServicesSinks_Resource extends UDP_Google_Service_Resource { /** * Creates the specified log service sink resource. (sinks.create) * * @param string $projectsId Part of `serviceName`. The name of the service in * which to create a sink. * @param string $logServicesId Part of `serviceName`. See documentation of * `projectsId`. * @param Google_LogSink $postBody * @param array $optParams Optional parameters. * @return Google_Service_Logging_LogSink */ public function create($projectsId, $logServicesId, Google_Service_Logging_LogSink $postBody, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logServicesId' => $logServicesId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('create', array($params), "Google_Service_Logging_LogSink"); } /** * Deletes the specified log service sink. (sinks.delete) * * @param string $projectsId Part of `sinkName`. The name of the sink to delete. * @param string $logServicesId Part of `sinkName`. See documentation of * `projectsId`. * @param string $sinksId Part of `sinkName`. See documentation of `projectsId`. * @param array $optParams Optional parameters. * @return Google_Service_Logging_Empty */ public function delete($projectsId, $logServicesId, $sinksId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logServicesId' => $logServicesId, 'sinksId' => $sinksId); $params = array_merge($params, $optParams); return $this->call('delete', array($params), "Google_Service_Logging_Empty"); } /** * Gets the specified log service sink resource. (sinks.get) * * @param string $projectsId Part of `sinkName`. The name of the sink to return. * @param string $logServicesId Part of `sinkName`. See documentation of * `projectsId`. * @param string $sinksId Part of `sinkName`. See documentation of `projectsId`. * @param array $optParams Optional parameters. * @return Google_Service_Logging_LogSink */ public function get($projectsId, $logServicesId, $sinksId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logServicesId' => $logServicesId, 'sinksId' => $sinksId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Logging_LogSink"); } /** * Lists log service sinks associated with the specified service. * (sinks.listProjectsLogServicesSinks) * * @param string $projectsId Part of `serviceName`. The name of the service for * which to list sinks. * @param string $logServicesId Part of `serviceName`. See documentation of * `projectsId`. * @param array $optParams Optional parameters. * @return Google_Service_Logging_ListLogServiceSinksResponse */ public function listProjectsLogServicesSinks($projectsId, $logServicesId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logServicesId' => $logServicesId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Logging_ListLogServiceSinksResponse"); } /** * Creates or update the specified log service sink resource. (sinks.update) * * @param string $projectsId Part of `sinkName`. The name of the sink to update. * @param string $logServicesId Part of `sinkName`. See documentation of * `projectsId`. * @param string $sinksId Part of `sinkName`. See documentation of `projectsId`. * @param Google_LogSink $postBody * @param array $optParams Optional parameters. * @return Google_Service_Logging_LogSink */ public function update($projectsId, $logServicesId, $sinksId, Google_Service_Logging_LogSink $postBody, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logServicesId' => $logServicesId, 'sinksId' => $sinksId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Logging_LogSink"); } } /** * The "logs" collection of methods. * Typical usage is: * * $loggingService = new Google_Service_Logging(...); * $logs = $loggingService->logs; * */ class Google_Service_Logging_ProjectsLogs_Resource extends UDP_Google_Service_Resource { /** * Deletes the specified log resource and all log entries contained in it. * (logs.delete) * * @param string $projectsId Part of `logName`. The log resource to delete. * @param string $logsId Part of `logName`. See documentation of `projectsId`. * @param array $optParams Optional parameters. * @return Google_Service_Logging_Empty */ public function delete($projectsId, $logsId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logsId' => $logsId); $params = array_merge($params, $optParams); return $this->call('delete', array($params), "Google_Service_Logging_Empty"); } /** * Lists log resources belonging to the specified project. * (logs.listProjectsLogs) * * @param string $projectsId Part of `projectName`. The project name for which * to list the log resources. * @param array $optParams Optional parameters. * * @opt_param string pageToken An opaque token, returned as `nextPageToken` by a * prior `ListLogs` operation. If `pageToken` is supplied, then the other fields * of this request are ignored, and instead the previous `ListLogs` operation is * continued. * @opt_param string serviceName A service name for which to list logs. Only * logs containing entries whose metadata includes this service name are * returned. If `serviceName` and `serviceIndexPrefix` are both empty, then all * log names are returned. To list all log names, regardless of service, leave * both the `serviceName` and `serviceIndexPrefix` empty. To list log names * containing entries with a particular service name (or explicitly empty * service name) set `serviceName` to the desired value and `serviceIndexPrefix` * to `"/"`. * @opt_param string serviceIndexPrefix A log service index prefix for which to * list logs. Only logs containing entries whose metadata that includes these * label values (associated with index keys) are returned. The prefix is a slash * separated list of values, and need not specify all index labels. An empty * index (or a single slash) matches all log service indexes. * @opt_param int pageSize The maximum number of results to return. * @return Google_Service_Logging_ListLogsResponse */ public function listProjectsLogs($projectsId, $optParams = array()) { $params = array('projectsId' => $projectsId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Logging_ListLogsResponse"); } } /** * The "entries" collection of methods. * Typical usage is: * * $loggingService = new Google_Service_Logging(...); * $entries = $loggingService->entries; * */ class Google_Service_Logging_ProjectsLogsEntries_Resource extends UDP_Google_Service_Resource { /** * Creates one or more log entries in a log. You must supply a list of * `LogEntry` objects, named `entries`. Each `LogEntry` object must contain a * payload object and a `LogEntryMetadata` object that describes the entry. You * must fill in all the fields of the entry, metadata, and payload. You can also * supply a map, `commonLabels`, that supplies default (key, value) data for the * `entries[].metadata.labels` maps, saving you the trouble of creating * identical copies for each entry. (entries.write) * * @param string $projectsId Part of `logName`. The name of the log resource * into which to insert the log entries. * @param string $logsId Part of `logName`. See documentation of `projectsId`. * @param Google_WriteLogEntriesRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_Logging_WriteLogEntriesResponse */ public function write($projectsId, $logsId, Google_Service_Logging_WriteLogEntriesRequest $postBody, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logsId' => $logsId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('write', array($params), "Google_Service_Logging_WriteLogEntriesResponse"); } } /** * The "sinks" collection of methods. * Typical usage is: * * $loggingService = new Google_Service_Logging(...); * $sinks = $loggingService->sinks; * */ class Google_Service_Logging_ProjectsLogsSinks_Resource extends UDP_Google_Service_Resource { /** * Creates the specified log sink resource. (sinks.create) * * @param string $projectsId Part of `logName`. The log in which to create a * sink resource. * @param string $logsId Part of `logName`. See documentation of `projectsId`. * @param Google_LogSink $postBody * @param array $optParams Optional parameters. * @return Google_Service_Logging_LogSink */ public function create($projectsId, $logsId, Google_Service_Logging_LogSink $postBody, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logsId' => $logsId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('create', array($params), "Google_Service_Logging_LogSink"); } /** * Deletes the specified log sink resource. (sinks.delete) * * @param string $projectsId Part of `sinkName`. The name of the sink to delete. * @param string $logsId Part of `sinkName`. See documentation of `projectsId`. * @param string $sinksId Part of `sinkName`. See documentation of `projectsId`. * @param array $optParams Optional parameters. * @return Google_Service_Logging_Empty */ public function delete($projectsId, $logsId, $sinksId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logsId' => $logsId, 'sinksId' => $sinksId); $params = array_merge($params, $optParams); return $this->call('delete', array($params), "Google_Service_Logging_Empty"); } /** * Gets the specified log sink resource. (sinks.get) * * @param string $projectsId Part of `sinkName`. The name of the sink resource * to return. * @param string $logsId Part of `sinkName`. See documentation of `projectsId`. * @param string $sinksId Part of `sinkName`. See documentation of `projectsId`. * @param array $optParams Optional parameters. * @return Google_Service_Logging_LogSink */ public function get($projectsId, $logsId, $sinksId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logsId' => $logsId, 'sinksId' => $sinksId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Logging_LogSink"); } /** * Lists log sinks associated with the specified log. * (sinks.listProjectsLogsSinks) * * @param string $projectsId Part of `logName`. The log for which to list sinks. * @param string $logsId Part of `logName`. See documentation of `projectsId`. * @param array $optParams Optional parameters. * @return Google_Service_Logging_ListLogSinksResponse */ public function listProjectsLogsSinks($projectsId, $logsId, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logsId' => $logsId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Logging_ListLogSinksResponse"); } /** * Creates or updates the specified log sink resource. (sinks.update) * * @param string $projectsId Part of `sinkName`. The name of the sink to update. * @param string $logsId Part of `sinkName`. See documentation of `projectsId`. * @param string $sinksId Part of `sinkName`. See documentation of `projectsId`. * @param Google_LogSink $postBody * @param array $optParams Optional parameters. * @return Google_Service_Logging_LogSink */ public function update($projectsId, $logsId, $sinksId, Google_Service_Logging_LogSink $postBody, $optParams = array()) { $params = array('projectsId' => $projectsId, 'logsId' => $logsId, 'sinksId' => $sinksId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Logging_LogSink"); } } class Google_Service_Logging_Empty extends Google_Model { } class Google_Service_Logging_ListLogServiceIndexesResponse extends Google_Collection { protected $collection_key = 'serviceIndexPrefixes'; protected $internal_gapi_mappings = array( ); public $nextPageToken; public $serviceIndexPrefixes; public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setServiceIndexPrefixes($serviceIndexPrefixes) { $this->serviceIndexPrefixes = $serviceIndexPrefixes; } public function getServiceIndexPrefixes() { return $this->serviceIndexPrefixes; } } class Google_Service_Logging_ListLogServiceSinksResponse extends Google_Collection { protected $collection_key = 'sinks'; protected $internal_gapi_mappings = array( ); protected $sinksType = 'Google_Service_Logging_LogSink'; protected $sinksDataType = 'array'; public function setSinks($sinks) { $this->sinks = $sinks; } public function getSinks() { return $this->sinks; } } class Google_Service_Logging_ListLogServicesResponse extends Google_Collection { protected $collection_key = 'logServices'; protected $internal_gapi_mappings = array( ); protected $logServicesType = 'Google_Service_Logging_LogService'; protected $logServicesDataType = 'array'; public $nextPageToken; public function setLogServices($logServices) { $this->logServices = $logServices; } public function getLogServices() { return $this->logServices; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_Logging_ListLogSinksResponse extends Google_Collection { protected $collection_key = 'sinks'; protected $internal_gapi_mappings = array( ); protected $sinksType = 'Google_Service_Logging_LogSink'; protected $sinksDataType = 'array'; public function setSinks($sinks) { $this->sinks = $sinks; } public function getSinks() { return $this->sinks; } } class Google_Service_Logging_ListLogsResponse extends Google_Collection { protected $collection_key = 'logs'; protected $internal_gapi_mappings = array( ); protected $logsType = 'Google_Service_Logging_Log'; protected $logsDataType = 'array'; public $nextPageToken; public function setLogs($logs) { $this->logs = $logs; } public function getLogs() { return $this->logs; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_Logging_Log extends Google_Model { protected $internal_gapi_mappings = array( ); public $displayName; public $name; public $payloadType; public function setDisplayName($displayName) { $this->displayName = $displayName; } public function getDisplayName() { return $this->displayName; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setPayloadType($payloadType) { $this->payloadType = $payloadType; } public function getPayloadType() { return $this->payloadType; } } class Google_Service_Logging_LogEntry extends Google_Model { protected $internal_gapi_mappings = array( ); public $insertId; public $log; protected $metadataType = 'Google_Service_Logging_LogEntryMetadata'; protected $metadataDataType = ''; public $protoPayload; public $structPayload; public $textPayload; public function setInsertId($insertId) { $this->insertId = $insertId; } public function getInsertId() { return $this->insertId; } public function setLog($log) { $this->log = $log; } public function getLog() { return $this->log; } public function setMetadata(Google_Service_Logging_LogEntryMetadata $metadata) { $this->metadata = $metadata; } public function getMetadata() { return $this->metadata; } public function setProtoPayload($protoPayload) { $this->protoPayload = $protoPayload; } public function getProtoPayload() { return $this->protoPayload; } public function setStructPayload($structPayload) { $this->structPayload = $structPayload; } public function getStructPayload() { return $this->structPayload; } public function setTextPayload($textPayload) { $this->textPayload = $textPayload; } public function getTextPayload() { return $this->textPayload; } } class Google_Service_Logging_LogEntryMetadata extends Google_Model { protected $internal_gapi_mappings = array( ); public $labels; public $projectId; public $region; public $serviceName; public $severity; public $timestamp; public $userId; public $zone; public function setLabels($labels) { $this->labels = $labels; } public function getLabels() { return $this->labels; } public function setProjectId($projectId) { $this->projectId = $projectId; } public function getProjectId() { return $this->projectId; } public function setRegion($region) { $this->region = $region; } public function getRegion() { return $this->region; } public function setServiceName($serviceName) { $this->serviceName = $serviceName; } public function getServiceName() { return $this->serviceName; } public function setSeverity($severity) { $this->severity = $severity; } public function getSeverity() { return $this->severity; } public function setTimestamp($timestamp) { $this->timestamp = $timestamp; } public function getTimestamp() { return $this->timestamp; } public function setUserId($userId) { $this->userId = $userId; } public function getUserId() { return $this->userId; } public function setZone($zone) { $this->zone = $zone; } public function getZone() { return $this->zone; } } class Google_Service_Logging_LogEntryMetadataLabels extends Google_Model { } class Google_Service_Logging_LogEntryProtoPayload extends Google_Model { } class Google_Service_Logging_LogEntryStructPayload extends Google_Model { } class Google_Service_Logging_LogError extends Google_Model { protected $internal_gapi_mappings = array( ); public $resource; protected $statusType = 'Google_Service_Logging_Status'; protected $statusDataType = ''; public $timeNanos; public function setResource($resource) { $this->resource = $resource; } public function getResource() { return $this->resource; } public function setStatus(Google_Service_Logging_Status $status) { $this->status = $status; } public function getStatus() { return $this->status; } public function setTimeNanos($timeNanos) { $this->timeNanos = $timeNanos; } public function getTimeNanos() { return $this->timeNanos; } } class Google_Service_Logging_LogService extends Google_Collection { protected $collection_key = 'indexKeys'; protected $internal_gapi_mappings = array( ); public $indexKeys; public $name; public function setIndexKeys($indexKeys) { $this->indexKeys = $indexKeys; } public function getIndexKeys() { return $this->indexKeys; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Google_Service_Logging_LogSink extends Google_Collection { protected $collection_key = 'errors'; protected $internal_gapi_mappings = array( ); public $destination; protected $errorsType = 'Google_Service_Logging_LogError'; protected $errorsDataType = 'array'; public $name; public function setDestination($destination) { $this->destination = $destination; } public function getDestination() { return $this->destination; } public function setErrors($errors) { $this->errors = $errors; } public function getErrors() { return $this->errors; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Google_Service_Logging_Status extends Google_Collection { protected $collection_key = 'details'; protected $internal_gapi_mappings = array( ); public $code; public $details; public $message; public function setCode($code) { $this->code = $code; } public function getCode() { return $this->code; } public function setDetails($details) { $this->details = $details; } public function getDetails() { return $this->details; } public function setMessage($message) { $this->message = $message; } public function getMessage() { return $this->message; } } class Google_Service_Logging_StatusDetails extends Google_Model { } class Google_Service_Logging_WriteLogEntriesRequest extends Google_Collection { protected $collection_key = 'entries'; protected $internal_gapi_mappings = array( ); public $commonLabels; protected $entriesType = 'Google_Service_Logging_LogEntry'; protected $entriesDataType = 'array'; public function setCommonLabels($commonLabels) { $this->commonLabels = $commonLabels; } public function getCommonLabels() { return $this->commonLabels; } public function setEntries($entries) { $this->entries = $entries; } public function getEntries() { return $this->entries; } } class Google_Service_Logging_WriteLogEntriesRequestCommonLabels extends Google_Model { } class Google_Service_Logging_WriteLogEntriesResponse extends Google_Model { } PKwL\Ovdd+updraftplus/includes/Google/Service/Dns.phpnu[ * The Google Cloud DNS API provides services for configuring and serving * authoritative DNS records.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Google_Service_Dns extends UDP_Google_Service { /** View and manage your data across Google Cloud Platform services. */ const CLOUD_PLATFORM = "https://www.googleapis.com/auth/cloud-platform"; /** View your DNS records hosted by Google Cloud DNS. */ const NDEV_CLOUDDNS_READONLY = "https://www.googleapis.com/auth/ndev.clouddns.readonly"; /** View and manage your DNS records hosted by Google Cloud DNS. */ const NDEV_CLOUDDNS_READWRITE = "https://www.googleapis.com/auth/ndev.clouddns.readwrite"; public $changes; public $managedZones; public $projects; public $resourceRecordSets; /** * Constructs the internal representation of the Dns service. * * @param Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = 'dns/v1/projects/'; $this->version = 'v1'; $this->serviceName = 'dns'; $this->changes = new Google_Service_Dns_Changes_Resource( $this, $this->serviceName, 'changes', array( 'methods' => array( 'create' => array( 'path' => '{project}/managedZones/{managedZone}/changes', 'httpMethod' => 'POST', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'managedZone' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => '{project}/managedZones/{managedZone}/changes/{changeId}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'managedZone' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'changeId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{project}/managedZones/{managedZone}/changes', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'managedZone' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'sortBy' => array( 'location' => 'query', 'type' => 'string', ), 'sortOrder' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->managedZones = new Google_Service_Dns_ManagedZones_Resource( $this, $this->serviceName, 'managedZones', array( 'methods' => array( 'create' => array( 'path' => '{project}/managedZones', 'httpMethod' => 'POST', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'delete' => array( 'path' => '{project}/managedZones/{managedZone}', 'httpMethod' => 'DELETE', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'managedZone' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => '{project}/managedZones/{managedZone}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'managedZone' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{project}/managedZones', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->projects = new Google_Service_Dns_Projects_Resource( $this, $this->serviceName, 'projects', array( 'methods' => array( 'get' => array( 'path' => '{project}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->resourceRecordSets = new Google_Service_Dns_ResourceRecordSets_Resource( $this, $this->serviceName, 'resourceRecordSets', array( 'methods' => array( 'list' => array( 'path' => '{project}/managedZones/{managedZone}/rrsets', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'managedZone' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'name' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'type' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); } } /** * The "changes" collection of methods. * Typical usage is: * * $dnsService = new Google_Service_Dns(...); * $changes = $dnsService->changes; * */ class Google_Service_Dns_Changes_Resource extends UDP_Google_Service_Resource { /** * Atomically update the ResourceRecordSet collection. (changes.create) * * @param string $project Identifies the project addressed by this request. * @param string $managedZone Identifies the managed zone addressed by this * request. Can be the managed zone name or id. * @param Google_Change $postBody * @param array $optParams Optional parameters. * @return Google_Service_Dns_Change */ public function create($project, $managedZone, Google_Service_Dns_Change $postBody, $optParams = array()) { $params = array('project' => $project, 'managedZone' => $managedZone, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('create', array($params), "Google_Service_Dns_Change"); } /** * Fetch the representation of an existing Change. (changes.get) * * @param string $project Identifies the project addressed by this request. * @param string $managedZone Identifies the managed zone addressed by this * request. Can be the managed zone name or id. * @param string $changeId The identifier of the requested change, from a * previous ResourceRecordSetsChangeResponse. * @param array $optParams Optional parameters. * @return Google_Service_Dns_Change */ public function get($project, $managedZone, $changeId, $optParams = array()) { $params = array('project' => $project, 'managedZone' => $managedZone, 'changeId' => $changeId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Dns_Change"); } /** * Enumerate Changes to a ResourceRecordSet collection. (changes.listChanges) * * @param string $project Identifies the project addressed by this request. * @param string $managedZone Identifies the managed zone addressed by this * request. Can be the managed zone name or id. * @param array $optParams Optional parameters. * * @opt_param int maxResults Optional. Maximum number of results to be returned. * If unspecified, the server will decide how many results to return. * @opt_param string pageToken Optional. A tag returned by a previous list * request that was truncated. Use this parameter to continue a previous list * request. * @opt_param string sortBy Sorting criterion. The only supported value is * change sequence. * @opt_param string sortOrder Sorting order direction: 'ascending' or * 'descending'. * @return Google_Service_Dns_ChangesListResponse */ public function listChanges($project, $managedZone, $optParams = array()) { $params = array('project' => $project, 'managedZone' => $managedZone); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Dns_ChangesListResponse"); } } /** * The "managedZones" collection of methods. * Typical usage is: * * $dnsService = new Google_Service_Dns(...); * $managedZones = $dnsService->managedZones; * */ class Google_Service_Dns_ManagedZones_Resource extends UDP_Google_Service_Resource { /** * Create a new ManagedZone. (managedZones.create) * * @param string $project Identifies the project addressed by this request. * @param Google_ManagedZone $postBody * @param array $optParams Optional parameters. * @return Google_Service_Dns_ManagedZone */ public function create($project, Google_Service_Dns_ManagedZone $postBody, $optParams = array()) { $params = array('project' => $project, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('create', array($params), "Google_Service_Dns_ManagedZone"); } /** * Delete a previously created ManagedZone. (managedZones.delete) * * @param string $project Identifies the project addressed by this request. * @param string $managedZone Identifies the managed zone addressed by this * request. Can be the managed zone name or id. * @param array $optParams Optional parameters. */ public function delete($project, $managedZone, $optParams = array()) { $params = array('project' => $project, 'managedZone' => $managedZone); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Fetch the representation of an existing ManagedZone. (managedZones.get) * * @param string $project Identifies the project addressed by this request. * @param string $managedZone Identifies the managed zone addressed by this * request. Can be the managed zone name or id. * @param array $optParams Optional parameters. * @return Google_Service_Dns_ManagedZone */ public function get($project, $managedZone, $optParams = array()) { $params = array('project' => $project, 'managedZone' => $managedZone); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Dns_ManagedZone"); } /** * Enumerate ManagedZones that have been created but not yet deleted. * (managedZones.listManagedZones) * * @param string $project Identifies the project addressed by this request. * @param array $optParams Optional parameters. * * @opt_param string pageToken Optional. A tag returned by a previous list * request that was truncated. Use this parameter to continue a previous list * request. * @opt_param int maxResults Optional. Maximum number of results to be returned. * If unspecified, the server will decide how many results to return. * @return Google_Service_Dns_ManagedZonesListResponse */ public function listManagedZones($project, $optParams = array()) { $params = array('project' => $project); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Dns_ManagedZonesListResponse"); } } /** * The "projects" collection of methods. * Typical usage is: * * $dnsService = new Google_Service_Dns(...); * $projects = $dnsService->projects; * */ class Google_Service_Dns_Projects_Resource extends UDP_Google_Service_Resource { /** * Fetch the representation of an existing Project. (projects.get) * * @param string $project Identifies the project addressed by this request. * @param array $optParams Optional parameters. * @return Google_Service_Dns_Project */ public function get($project, $optParams = array()) { $params = array('project' => $project); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Dns_Project"); } } /** * The "resourceRecordSets" collection of methods. * Typical usage is: * * $dnsService = new Google_Service_Dns(...); * $resourceRecordSets = $dnsService->resourceRecordSets; * */ class Google_Service_Dns_ResourceRecordSets_Resource extends UDP_Google_Service_Resource { /** * Enumerate ResourceRecordSets that have been created but not yet deleted. * (resourceRecordSets.listResourceRecordSets) * * @param string $project Identifies the project addressed by this request. * @param string $managedZone Identifies the managed zone addressed by this * request. Can be the managed zone name or id. * @param array $optParams Optional parameters. * * @opt_param string name Restricts the list to return only records with this * fully qualified domain name. * @opt_param int maxResults Optional. Maximum number of results to be returned. * If unspecified, the server will decide how many results to return. * @opt_param string pageToken Optional. A tag returned by a previous list * request that was truncated. Use this parameter to continue a previous list * request. * @opt_param string type Restricts the list to return only records of this * type. If present, the "name" parameter must also be present. * @return Google_Service_Dns_ResourceRecordSetsListResponse */ public function listResourceRecordSets($project, $managedZone, $optParams = array()) { $params = array('project' => $project, 'managedZone' => $managedZone); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Dns_ResourceRecordSetsListResponse"); } } class Google_Service_Dns_Change extends Google_Collection { protected $collection_key = 'deletions'; protected $internal_gapi_mappings = array( ); protected $additionsType = 'Google_Service_Dns_ResourceRecordSet'; protected $additionsDataType = 'array'; protected $deletionsType = 'Google_Service_Dns_ResourceRecordSet'; protected $deletionsDataType = 'array'; public $id; public $kind; public $startTime; public $status; public function setAdditions($additions) { $this->additions = $additions; } public function getAdditions() { return $this->additions; } public function setDeletions($deletions) { $this->deletions = $deletions; } public function getDeletions() { return $this->deletions; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setStartTime($startTime) { $this->startTime = $startTime; } public function getStartTime() { return $this->startTime; } public function setStatus($status) { $this->status = $status; } public function getStatus() { return $this->status; } } class Google_Service_Dns_ChangesListResponse extends Google_Collection { protected $collection_key = 'changes'; protected $internal_gapi_mappings = array( ); protected $changesType = 'Google_Service_Dns_Change'; protected $changesDataType = 'array'; public $kind; public $nextPageToken; public function setChanges($changes) { $this->changes = $changes; } public function getChanges() { return $this->changes; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_Dns_ManagedZone extends Google_Collection { protected $collection_key = 'nameServers'; protected $internal_gapi_mappings = array( ); public $creationTime; public $description; public $dnsName; public $id; public $kind; public $name; public $nameServerSet; public $nameServers; public function setCreationTime($creationTime) { $this->creationTime = $creationTime; } public function getCreationTime() { return $this->creationTime; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setDnsName($dnsName) { $this->dnsName = $dnsName; } public function getDnsName() { return $this->dnsName; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setNameServerSet($nameServerSet) { $this->nameServerSet = $nameServerSet; } public function getNameServerSet() { return $this->nameServerSet; } public function setNameServers($nameServers) { $this->nameServers = $nameServers; } public function getNameServers() { return $this->nameServers; } } class Google_Service_Dns_ManagedZonesListResponse extends Google_Collection { protected $collection_key = 'managedZones'; protected $internal_gapi_mappings = array( ); public $kind; protected $managedZonesType = 'Google_Service_Dns_ManagedZone'; protected $managedZonesDataType = 'array'; public $nextPageToken; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setManagedZones($managedZones) { $this->managedZones = $managedZones; } public function getManagedZones() { return $this->managedZones; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_Dns_Project extends Google_Model { protected $internal_gapi_mappings = array( ); public $id; public $kind; public $number; protected $quotaType = 'Google_Service_Dns_Quota'; protected $quotaDataType = ''; public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNumber($number) { $this->number = $number; } public function getNumber() { return $this->number; } public function setQuota(Google_Service_Dns_Quota $quota) { $this->quota = $quota; } public function getQuota() { return $this->quota; } } class Google_Service_Dns_Quota extends Google_Model { protected $internal_gapi_mappings = array( ); public $kind; public $managedZones; public $resourceRecordsPerRrset; public $rrsetAdditionsPerChange; public $rrsetDeletionsPerChange; public $rrsetsPerManagedZone; public $totalRrdataSizePerChange; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setManagedZones($managedZones) { $this->managedZones = $managedZones; } public function getManagedZones() { return $this->managedZones; } public function setResourceRecordsPerRrset($resourceRecordsPerRrset) { $this->resourceRecordsPerRrset = $resourceRecordsPerRrset; } public function getResourceRecordsPerRrset() { return $this->resourceRecordsPerRrset; } public function setRrsetAdditionsPerChange($rrsetAdditionsPerChange) { $this->rrsetAdditionsPerChange = $rrsetAdditionsPerChange; } public function getRrsetAdditionsPerChange() { return $this->rrsetAdditionsPerChange; } public function setRrsetDeletionsPerChange($rrsetDeletionsPerChange) { $this->rrsetDeletionsPerChange = $rrsetDeletionsPerChange; } public function getRrsetDeletionsPerChange() { return $this->rrsetDeletionsPerChange; } public function setRrsetsPerManagedZone($rrsetsPerManagedZone) { $this->rrsetsPerManagedZone = $rrsetsPerManagedZone; } public function getRrsetsPerManagedZone() { return $this->rrsetsPerManagedZone; } public function setTotalRrdataSizePerChange($totalRrdataSizePerChange) { $this->totalRrdataSizePerChange = $totalRrdataSizePerChange; } public function getTotalRrdataSizePerChange() { return $this->totalRrdataSizePerChange; } } class Google_Service_Dns_ResourceRecordSet extends Google_Collection { protected $collection_key = 'rrdatas'; protected $internal_gapi_mappings = array( ); public $kind; public $name; public $rrdatas; public $ttl; public $type; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setRrdatas($rrdatas) { $this->rrdatas = $rrdatas; } public function getRrdatas() { return $this->rrdatas; } public function setTtl($ttl) { $this->ttl = $ttl; } public function getTtl() { return $this->ttl; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Dns_ResourceRecordSetsListResponse extends Google_Collection { protected $collection_key = 'rrsets'; protected $internal_gapi_mappings = array( ); public $kind; public $nextPageToken; protected $rrsetsType = 'Google_Service_Dns_ResourceRecordSet'; protected $rrsetsDataType = 'array'; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setRrsets($rrsets) { $this->rrsets = $rrsets; } public function getRrsets() { return $this->rrsets; } } PKwL\ARR-updraftplus/includes/Google/Service/Drive.phpnu[ * The API to interact with Drive.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class UDP_Google_Service_Drive extends UDP_Google_Service { /** View and manage the files in your Google Drive. */ const DRIVE = "https://www.googleapis.com/auth/drive"; /** View and manage its own configuration data in your Google Drive. */ const DRIVE_APPDATA = "https://www.googleapis.com/auth/drive.appdata"; /** View your Google Drive apps. */ const DRIVE_APPS_READONLY = "https://www.googleapis.com/auth/drive.apps.readonly"; /** View and manage Google Drive files that you have opened or created with this app. */ const DRIVE_FILE = "https://www.googleapis.com/auth/drive.file"; /** View and manage metadata of files in your Google Drive. */ const DRIVE_METADATA = "https://www.googleapis.com/auth/drive.metadata"; /** View metadata for files in your Google Drive. */ const DRIVE_METADATA_READONLY = "https://www.googleapis.com/auth/drive.metadata.readonly"; /** View the files in your Google Drive. */ const DRIVE_READONLY = "https://www.googleapis.com/auth/drive.readonly"; /** Modify your Google Apps Script scripts' behavior. */ const DRIVE_SCRIPTS = "https://www.googleapis.com/auth/drive.scripts"; public $about; public $apps; public $changes; public $channels; public $children; public $comments; public $files; public $parents; public $permissions; public $properties; public $realtime; public $replies; public $revisions; /** * Google Drive service name. The default value is drive. * @var String */ protected $serviceName; /** * Constructs the internal representation of the Drive service. * * @param UDP_Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = 'drive/v2/'; $this->version = 'v2'; $this->serviceName = 'drive'; $this->about = new Google_Service_Drive_About_Resource( $this, $this->serviceName, 'about', array( 'methods' => array( 'get' => array( 'path' => 'about', 'httpMethod' => 'GET', 'parameters' => array( 'includeSubscribed' => array( 'location' => 'query', 'type' => 'boolean', ), 'maxChangeIdCount' => array( 'location' => 'query', 'type' => 'string', ), 'startChangeId' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->apps = new Google_Service_Drive_Apps_Resource( $this, $this->serviceName, 'apps', array( 'methods' => array( 'get' => array( 'path' => 'apps/{appId}', 'httpMethod' => 'GET', 'parameters' => array( 'appId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'apps', 'httpMethod' => 'GET', 'parameters' => array( 'languageCode' => array( 'location' => 'query', 'type' => 'string', ), 'appFilterExtensions' => array( 'location' => 'query', 'type' => 'string', ), 'appFilterMimeTypes' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->changes = new Google_Service_Drive_Changes_Resource( $this, $this->serviceName, 'changes', array( 'methods' => array( 'get' => array( 'path' => 'changes/{changeId}', 'httpMethod' => 'GET', 'parameters' => array( 'changeId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'changes', 'httpMethod' => 'GET', 'parameters' => array( 'includeSubscribed' => array( 'location' => 'query', 'type' => 'boolean', ), 'startChangeId' => array( 'location' => 'query', 'type' => 'string', ), 'includeDeleted' => array( 'location' => 'query', 'type' => 'boolean', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), ), ),'watch' => array( 'path' => 'changes/watch', 'httpMethod' => 'POST', 'parameters' => array( 'includeSubscribed' => array( 'location' => 'query', 'type' => 'boolean', ), 'startChangeId' => array( 'location' => 'query', 'type' => 'string', ), 'includeDeleted' => array( 'location' => 'query', 'type' => 'boolean', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->channels = new Google_Service_Drive_Channels_Resource( $this, $this->serviceName, 'channels', array( 'methods' => array( 'stop' => array( 'path' => 'channels/stop', 'httpMethod' => 'POST', 'parameters' => array(), ), ) ) ); $this->children = new Google_Service_Drive_Children_Resource( $this, $this->serviceName, 'children', array( 'methods' => array( 'delete' => array( 'path' => 'files/{folderId}/children/{childId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'folderId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'childId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'files/{folderId}/children/{childId}', 'httpMethod' => 'GET', 'parameters' => array( 'folderId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'childId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => 'files/{folderId}/children', 'httpMethod' => 'POST', 'parameters' => array( 'folderId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'files/{folderId}/children', 'httpMethod' => 'GET', 'parameters' => array( 'folderId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'q' => array( 'location' => 'query', 'type' => 'string', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->comments = new Google_Service_Drive_Comments_Resource( $this, $this->serviceName, 'comments', array( 'methods' => array( 'delete' => array( 'path' => 'files/{fileId}/comments/{commentId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'files/{fileId}/comments/{commentId}', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'includeDeleted' => array( 'location' => 'query', 'type' => 'boolean', ), ), ),'insert' => array( 'path' => 'files/{fileId}/comments', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'files/{fileId}/comments', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'updatedMin' => array( 'location' => 'query', 'type' => 'string', ), 'includeDeleted' => array( 'location' => 'query', 'type' => 'boolean', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ),'patch' => array( 'path' => 'files/{fileId}/comments/{commentId}', 'httpMethod' => 'PATCH', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'files/{fileId}/comments/{commentId}', 'httpMethod' => 'PUT', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->files = new Google_Service_Drive_Files_Resource( $this, $this->serviceName, 'files', array( 'methods' => array( 'copy' => array( 'path' => 'files/{fileId}/copy', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'convert' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocrLanguage' => array( 'location' => 'query', 'type' => 'string', ), 'visibility' => array( 'location' => 'query', 'type' => 'string', ), 'pinned' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocr' => array( 'location' => 'query', 'type' => 'boolean', ), 'timedTextTrackName' => array( 'location' => 'query', 'type' => 'string', ), 'timedTextLanguage' => array( 'location' => 'query', 'type' => 'string', ), ), ),'delete' => array( 'path' => 'files/{fileId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'emptyTrash' => array( 'path' => 'files/trash', 'httpMethod' => 'DELETE', 'parameters' => array(), ),'get' => array( 'path' => 'files/{fileId}', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'acknowledgeAbuse' => array( 'location' => 'query', 'type' => 'boolean', ), 'updateViewedDate' => array( 'location' => 'query', 'type' => 'boolean', ), 'revisionId' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ),'insert' => array( 'path' => 'files', 'httpMethod' => 'POST', 'parameters' => array( 'convert' => array( 'location' => 'query', 'type' => 'boolean', ), 'useContentAsIndexableText' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocrLanguage' => array( 'location' => 'query', 'type' => 'string', ), 'visibility' => array( 'location' => 'query', 'type' => 'string', ), 'pinned' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocr' => array( 'location' => 'query', 'type' => 'boolean', ), 'timedTextTrackName' => array( 'location' => 'query', 'type' => 'string', ), 'timedTextLanguage' => array( 'location' => 'query', 'type' => 'string', ), ), ),'list' => array( 'path' => 'files', 'httpMethod' => 'GET', 'parameters' => array( 'q' => array( 'location' => 'query', 'type' => 'string', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'corpus' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ),'patch' => array( 'path' => 'files/{fileId}', 'httpMethod' => 'PATCH', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'addParents' => array( 'location' => 'query', 'type' => 'string', ), 'updateViewedDate' => array( 'location' => 'query', 'type' => 'boolean', ), 'removeParents' => array( 'location' => 'query', 'type' => 'string', ), 'setModifiedDate' => array( 'location' => 'query', 'type' => 'boolean', ), 'convert' => array( 'location' => 'query', 'type' => 'boolean', ), 'useContentAsIndexableText' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocrLanguage' => array( 'location' => 'query', 'type' => 'string', ), 'pinned' => array( 'location' => 'query', 'type' => 'boolean', ), 'newRevision' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocr' => array( 'location' => 'query', 'type' => 'boolean', ), 'timedTextLanguage' => array( 'location' => 'query', 'type' => 'string', ), 'timedTextTrackName' => array( 'location' => 'query', 'type' => 'string', ), ), ),'touch' => array( 'path' => 'files/{fileId}/touch', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'trash' => array( 'path' => 'files/{fileId}/trash', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'untrash' => array( 'path' => 'files/{fileId}/untrash', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'files/{fileId}', 'httpMethod' => 'PUT', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'addParents' => array( 'location' => 'query', 'type' => 'string', ), 'updateViewedDate' => array( 'location' => 'query', 'type' => 'boolean', ), 'removeParents' => array( 'location' => 'query', 'type' => 'string', ), 'setModifiedDate' => array( 'location' => 'query', 'type' => 'boolean', ), 'convert' => array( 'location' => 'query', 'type' => 'boolean', ), 'useContentAsIndexableText' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocrLanguage' => array( 'location' => 'query', 'type' => 'string', ), 'pinned' => array( 'location' => 'query', 'type' => 'boolean', ), 'newRevision' => array( 'location' => 'query', 'type' => 'boolean', ), 'ocr' => array( 'location' => 'query', 'type' => 'boolean', ), 'timedTextLanguage' => array( 'location' => 'query', 'type' => 'string', ), 'timedTextTrackName' => array( 'location' => 'query', 'type' => 'string', ), ), ),'watch' => array( 'path' => 'files/{fileId}/watch', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'acknowledgeAbuse' => array( 'location' => 'query', 'type' => 'boolean', ), 'updateViewedDate' => array( 'location' => 'query', 'type' => 'boolean', ), 'revisionId' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->parents = new Google_Service_Drive_Parents_Resource( $this, $this->serviceName, 'parents', array( 'methods' => array( 'delete' => array( 'path' => 'files/{fileId}/parents/{parentId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'parentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'files/{fileId}/parents/{parentId}', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'parentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => 'files/{fileId}/parents', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'files/{fileId}/parents', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->permissions = new Google_Service_Drive_Permissions_Resource( $this, $this->serviceName, 'permissions', array( 'methods' => array( 'delete' => array( 'path' => 'files/{fileId}/permissions/{permissionId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'permissionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'files/{fileId}/permissions/{permissionId}', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'permissionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'getIdForEmail' => array( 'path' => 'permissionIds/{email}', 'httpMethod' => 'GET', 'parameters' => array( 'email' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => 'files/{fileId}/permissions', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'emailMessage' => array( 'location' => 'query', 'type' => 'string', ), 'sendNotificationEmails' => array( 'location' => 'query', 'type' => 'boolean', ), ), ),'list' => array( 'path' => 'files/{fileId}/permissions', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'patch' => array( 'path' => 'files/{fileId}/permissions/{permissionId}', 'httpMethod' => 'PATCH', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'permissionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'transferOwnership' => array( 'location' => 'query', 'type' => 'boolean', ), ), ),'update' => array( 'path' => 'files/{fileId}/permissions/{permissionId}', 'httpMethod' => 'PUT', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'permissionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'transferOwnership' => array( 'location' => 'query', 'type' => 'boolean', ), ), ), ) ) ); $this->properties = new Google_Service_Drive_Properties_Resource( $this, $this->serviceName, 'properties', array( 'methods' => array( 'delete' => array( 'path' => 'files/{fileId}/properties/{propertyKey}', 'httpMethod' => 'DELETE', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'propertyKey' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'visibility' => array( 'location' => 'query', 'type' => 'string', ), ), ),'get' => array( 'path' => 'files/{fileId}/properties/{propertyKey}', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'propertyKey' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'visibility' => array( 'location' => 'query', 'type' => 'string', ), ), ),'insert' => array( 'path' => 'files/{fileId}/properties', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'files/{fileId}/properties', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'patch' => array( 'path' => 'files/{fileId}/properties/{propertyKey}', 'httpMethod' => 'PATCH', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'propertyKey' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'visibility' => array( 'location' => 'query', 'type' => 'string', ), ), ),'update' => array( 'path' => 'files/{fileId}/properties/{propertyKey}', 'httpMethod' => 'PUT', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'propertyKey' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'visibility' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->realtime = new Google_Service_Drive_Realtime_Resource( $this, $this->serviceName, 'realtime', array( 'methods' => array( 'get' => array( 'path' => 'files/{fileId}/realtime', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'revision' => array( 'location' => 'query', 'type' => 'integer', ), ), ),'update' => array( 'path' => 'files/{fileId}/realtime', 'httpMethod' => 'PUT', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'baseRevision' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->replies = new Google_Service_Drive_Replies_Resource( $this, $this->serviceName, 'replies', array( 'methods' => array( 'delete' => array( 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'replyId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'replyId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'includeDeleted' => array( 'location' => 'query', 'type' => 'boolean', ), ), ),'insert' => array( 'path' => 'files/{fileId}/comments/{commentId}/replies', 'httpMethod' => 'POST', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'files/{fileId}/comments/{commentId}/replies', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'includeDeleted' => array( 'location' => 'query', 'type' => 'boolean', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ),'patch' => array( 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', 'httpMethod' => 'PATCH', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'replyId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', 'httpMethod' => 'PUT', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'commentId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'replyId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->revisions = new Google_Service_Drive_Revisions_Resource( $this, $this->serviceName, 'revisions', array( 'methods' => array( 'delete' => array( 'path' => 'files/{fileId}/revisions/{revisionId}', 'httpMethod' => 'DELETE', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'revisionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'files/{fileId}/revisions/{revisionId}', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'revisionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'files/{fileId}/revisions', 'httpMethod' => 'GET', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'patch' => array( 'path' => 'files/{fileId}/revisions/{revisionId}', 'httpMethod' => 'PATCH', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'revisionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'files/{fileId}/revisions/{revisionId}', 'httpMethod' => 'PUT', 'parameters' => array( 'fileId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'revisionId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); } } /** * The "about" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $about = $driveService->about; * */ class Google_Service_Drive_About_Resource extends UDP_Google_Service_Resource { /** * Gets the information about the current user along with Drive API settings * (about.get) * * @param array $optParams Optional parameters. * * @opt_param bool includeSubscribed When calculating the number of remaining * change IDs, whether to include public files the user has opened and shared * files. When set to false, this counts only change IDs for owned files and any * shared or public files that the user has explicitly added to a folder they * own. * @opt_param string maxChangeIdCount Maximum number of remaining change IDs to * count * @opt_param string startChangeId Change ID to start counting from when * calculating number of remaining change IDs * @return Google_Service_Drive_About */ public function get($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_About"); } } /** * The "apps" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $apps = $driveService->apps; * */ class Google_Service_Drive_Apps_Resource extends UDP_Google_Service_Resource { /** * Gets a specific app. (apps.get) * * @param string $appId The ID of the app. * @param array $optParams Optional parameters. * @return Google_Service_Drive_App */ public function get($appId, $optParams = array()) { $params = array('appId' => $appId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_App"); } /** * Lists a user's installed apps. (apps.listApps) * * @param array $optParams Optional parameters. * * @opt_param string languageCode A language or locale code, as defined by BCP * 47, with some extensions from Unicode's LDML format * (http://www.unicode.org/reports/tr35/). * @opt_param string appFilterExtensions A comma-separated list of file * extensions for open with filtering. All apps within the given app query scope * which can open any of the given file extensions will be included in the * response. If appFilterMimeTypes are provided as well, the result is a union * of the two resulting app lists. * @opt_param string appFilterMimeTypes A comma-separated list of MIME types for * open with filtering. All apps within the given app query scope which can open * any of the given MIME types will be included in the response. If * appFilterExtensions are provided as well, the result is a union of the two * resulting app lists. * @return Google_Service_Drive_AppList */ public function listApps($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_AppList"); } } /** * The "changes" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $changes = $driveService->changes; * */ class Google_Service_Drive_Changes_Resource extends UDP_Google_Service_Resource { /** * Gets a specific change. (changes.get) * * @param string $changeId The ID of the change. * @param array $optParams Optional parameters. * @return Google_Service_Drive_Change */ public function get($changeId, $optParams = array()) { $params = array('changeId' => $changeId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_Change"); } /** * Lists the changes for a user. (changes.listChanges) * * @param array $optParams Optional parameters. * * @opt_param bool includeSubscribed Whether to include public files the user * has opened and shared files. When set to false, the list only includes owned * files plus any shared or public files the user has explicitly added to a * folder they own. * @opt_param string startChangeId Change ID to start listing changes from. * @opt_param bool includeDeleted Whether to include deleted items. * @opt_param int maxResults Maximum number of changes to return. * @opt_param string pageToken Page token for changes. * @return Google_Service_Drive_ChangeList */ public function listChanges($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_ChangeList"); } /** * Subscribe to changes for a user. (changes.watch) * * @param Google_Channel $postBody * @param array $optParams Optional parameters. * * @opt_param bool includeSubscribed Whether to include public files the user * has opened and shared files. When set to false, the list only includes owned * files plus any shared or public files the user has explicitly added to a * folder they own. * @opt_param string startChangeId Change ID to start listing changes from. * @opt_param bool includeDeleted Whether to include deleted items. * @opt_param int maxResults Maximum number of changes to return. * @opt_param string pageToken Page token for changes. * @return Google_Service_Drive_Channel */ public function watch(Google_Service_Drive_Channel $postBody, $optParams = array()) { $params = array('postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('watch', array($params), "Google_Service_Drive_Channel"); } } /** * The "channels" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $channels = $driveService->channels; * */ class Google_Service_Drive_Channels_Resource extends UDP_Google_Service_Resource { /** * Stop watching resources through this channel (channels.stop) * * @param Google_Channel $postBody * @param array $optParams Optional parameters. */ public function stop(Google_Service_Drive_Channel $postBody, $optParams = array()) { $params = array('postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('stop', array($params)); } } /** * The "children" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $children = $driveService->children; * */ class Google_Service_Drive_Children_Resource extends UDP_Google_Service_Resource { /** * Removes a child from a folder. (children.delete) * * @param string $folderId The ID of the folder. * @param string $childId The ID of the child. * @param array $optParams Optional parameters. */ public function delete($folderId, $childId, $optParams = array()) { $params = array('folderId' => $folderId, 'childId' => $childId); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Gets a specific child reference. (children.get) * * @param string $folderId The ID of the folder. * @param string $childId The ID of the child. * @param array $optParams Optional parameters. * @return Google_Service_Drive_ChildReference */ public function get($folderId, $childId, $optParams = array()) { $params = array('folderId' => $folderId, 'childId' => $childId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_ChildReference"); } /** * Inserts a file into a folder. (children.insert) * * @param string $folderId The ID of the folder. * @param Google_ChildReference $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_ChildReference */ public function insert($folderId, Google_Service_Drive_ChildReference $postBody, $optParams = array()) { $params = array('folderId' => $folderId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Drive_ChildReference"); } /** * Lists a folder's children. (children.listChildren) * * @param string $folderId The ID of the folder. * @param array $optParams Optional parameters. * * @opt_param string q Query string for searching children. * @opt_param string pageToken Page token for children. * @opt_param int maxResults Maximum number of children to return. * @return Google_Service_Drive_ChildList */ public function listChildren($folderId, $optParams = array()) { $params = array('folderId' => $folderId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_ChildList"); } } /** * The "comments" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $comments = $driveService->comments; * */ class Google_Service_Drive_Comments_Resource extends UDP_Google_Service_Resource { /** * Deletes a comment. (comments.delete) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param array $optParams Optional parameters. */ public function delete($fileId, $commentId, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Gets a comment by ID. (comments.get) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param array $optParams Optional parameters. * * @opt_param bool includeDeleted If set, this will succeed when retrieving a * deleted comment, and will include any deleted replies. * @return Google_Service_Drive_Comment */ public function get($fileId, $commentId, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_Comment"); } /** * Creates a new comment on the given file. (comments.insert) * * @param string $fileId The ID of the file. * @param Google_Comment $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_Comment */ public function insert($fileId, Google_Service_Drive_Comment $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Drive_Comment"); } /** * Lists a file's comments. (comments.listComments) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * * @opt_param string pageToken The continuation token, used to page through * large result sets. To get the next page of results, set this parameter to the * value of "nextPageToken" from the previous response. * @opt_param string updatedMin Only discussions that were updated after this * timestamp will be returned. Formatted as an RFC 3339 timestamp. * @opt_param bool includeDeleted If set, all comments and replies, including * deleted comments and replies (with content stripped) will be returned. * @opt_param int maxResults The maximum number of discussions to include in the * response, used for paging. * @return Google_Service_Drive_CommentList */ public function listComments($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_CommentList"); } /** * Updates an existing comment. This method supports patch semantics. * (comments.patch) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param Google_Comment $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_Comment */ public function patch($fileId, $commentId, Google_Service_Drive_Comment $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Drive_Comment"); } /** * Updates an existing comment. (comments.update) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param Google_Comment $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_Comment */ public function update($fileId, $commentId, Google_Service_Drive_Comment $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Drive_Comment"); } } /** * The "files" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $files = $driveService->files; * */ class Google_Service_Drive_Files_Resource extends UDP_Google_Service_Resource { /** * Creates a copy of the specified file. (files.copy) * * @param string $fileId The ID of the file to copy. * @param Google_DriveFile $postBody * @param array $optParams Optional parameters. * * @opt_param bool convert Whether to convert this file to the corresponding * Google Docs format. * @opt_param string ocrLanguage If ocr is true, hints at the language to use. * Valid values are ISO 639-1 codes. * @opt_param string visibility The visibility of the new file. This parameter * is only relevant when the source is not a native Google Doc and * convert=false. * @opt_param bool pinned Whether to pin the head revision of the new copy. A * file can have a maximum of 200 pinned revisions. * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf * uploads. * @opt_param string timedTextTrackName The timed text track name. * @opt_param string timedTextLanguage The language of the timed text. * @return UDP_Google_Service_Drive_DriveFile */ public function copy($fileId, UDP_Google_Service_Drive_DriveFile $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('copy', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Permanently deletes a file by ID. Skips the trash. The currently * authenticated user must own the file. (files.delete) * * @param string $fileId The ID of the file to delete. * @param array $optParams Optional parameters. */ public function delete($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Permanently deletes all of the user's trashed files. (files.emptyTrash) * * @param array $optParams Optional parameters. */ public function emptyTrash($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->call('emptyTrash', array($params)); } /** * Gets a file's metadata by ID. (files.get) * * @param string $fileId The ID for the file in question. * @param array $optParams Optional parameters. * * @opt_param bool acknowledgeAbuse Whether the user is acknowledging the risk * of downloading known malware or other abusive files. * @opt_param bool updateViewedDate Whether to update the view date after * successfully retrieving the file. * @opt_param string revisionId Specifies the Revision ID that should be * downloaded. Ignored unless alt=media is specified. * @opt_param string projection This parameter is deprecated and has no * function. * @return UDP_Google_Service_Drive_DriveFile */ public function get($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Insert a new file. (files.insert) * * @param Google_DriveFile $postBody * @param array $optParams Optional parameters. * * @opt_param bool convert Whether to convert this file to the corresponding * Google Docs format. * @opt_param bool useContentAsIndexableText Whether to use the content as * indexable text. * @opt_param string ocrLanguage If ocr is true, hints at the language to use. * Valid values are ISO 639-1 codes. * @opt_param string visibility The visibility of the new file. This parameter * is only relevant when convert=false. * @opt_param bool pinned Whether to pin the head revision of the uploaded file. * A file can have a maximum of 200 pinned revisions. * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf * uploads. * @opt_param string timedTextTrackName The timed text track name. * @opt_param string timedTextLanguage The language of the timed text. * @return UDP_Google_Service_Drive_DriveFile */ public function insert(UDP_Google_Service_Drive_DriveFile $postBody, $optParams = array()) { $params = array('postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Lists the user's files. (files.listFiles) * * @param array $optParams Optional parameters. * * @opt_param string q Query string for searching files. * @opt_param string pageToken Page token for files. * @opt_param string corpus The body of items (files/documents) to which the * query applies. * @opt_param string projection This parameter is deprecated and has no * function. * @opt_param int maxResults Maximum number of files to return. * @return Google_Service_Drive_FileList */ public function listFiles($optParams = array()) { $params = array(); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_FileList"); } /** * Updates file metadata and/or content. This method supports patch semantics. * (files.patch) * * @param string $fileId The ID of the file to update. * @param Google_DriveFile $postBody * @param array $optParams Optional parameters. * * @opt_param string addParents Comma-separated list of parent IDs to add. * @opt_param bool updateViewedDate Whether to update the view date after * successfully updating the file. * @opt_param string removeParents Comma-separated list of parent IDs to remove. * @opt_param bool setModifiedDate Whether to set the modified date with the * supplied modified date. * @opt_param bool convert Whether to convert this file to the corresponding * Google Docs format. * @opt_param bool useContentAsIndexableText Whether to use the content as * indexable text. * @opt_param string ocrLanguage If ocr is true, hints at the language to use. * Valid values are ISO 639-1 codes. * @opt_param bool pinned Whether to pin the new revision. A file can have a * maximum of 200 pinned revisions. * @opt_param bool newRevision Whether a blob upload should create a new * revision. If false, the blob data in the current head revision is replaced. * If true or not set, a new blob is created as head revision, and previous * revisions are preserved (causing increased use of the user's data storage * quota). * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf * uploads. * @opt_param string timedTextLanguage The language of the timed text. * @opt_param string timedTextTrackName The timed text track name. * @return UDP_Google_Service_Drive_DriveFile */ public function patch($fileId, UDP_Google_Service_Drive_DriveFile $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Set the file's updated time to the current server time. (files.touch) * * @param string $fileId The ID of the file to update. * @param array $optParams Optional parameters. * @return UDP_Google_Service_Drive_DriveFile */ public function touch($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('touch', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Moves a file to the trash. (files.trash) * * @param string $fileId The ID of the file to trash. * @param array $optParams Optional parameters. * @return UDP_Google_Service_Drive_DriveFile */ public function trash($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('trash', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Restores a file from the trash. (files.untrash) * * @param string $fileId The ID of the file to untrash. * @param array $optParams Optional parameters. * @return UDP_Google_Service_Drive_DriveFile */ public function untrash($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('untrash', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Updates file metadata and/or content. (files.update) * * @param string $fileId The ID of the file to update. * @param Google_DriveFile $postBody * @param array $optParams Optional parameters. * * @opt_param string addParents Comma-separated list of parent IDs to add. * @opt_param bool updateViewedDate Whether to update the view date after * successfully updating the file. * @opt_param string removeParents Comma-separated list of parent IDs to remove. * @opt_param bool setModifiedDate Whether to set the modified date with the * supplied modified date. * @opt_param bool convert Whether to convert this file to the corresponding * Google Docs format. * @opt_param bool useContentAsIndexableText Whether to use the content as * indexable text. * @opt_param string ocrLanguage If ocr is true, hints at the language to use. * Valid values are ISO 639-1 codes. * @opt_param bool pinned Whether to pin the new revision. A file can have a * maximum of 200 pinned revisions. * @opt_param bool newRevision Whether a blob upload should create a new * revision. If false, the blob data in the current head revision is replaced. * If true or not set, a new blob is created as head revision, and previous * revisions are preserved (causing increased use of the user's data storage * quota). * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf * uploads. * @opt_param string timedTextLanguage The language of the timed text. * @opt_param string timedTextTrackName The timed text track name. * @return UDP_Google_Service_Drive_DriveFile */ public function update($fileId, UDP_Google_Service_Drive_DriveFile $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "UDP_Google_Service_Drive_DriveFile"); } /** * Subscribe to changes on a file (files.watch) * * @param string $fileId The ID for the file in question. * @param Google_Channel $postBody * @param array $optParams Optional parameters. * * @opt_param bool acknowledgeAbuse Whether the user is acknowledging the risk * of downloading known malware or other abusive files. * @opt_param bool updateViewedDate Whether to update the view date after * successfully retrieving the file. * @opt_param string revisionId Specifies the Revision ID that should be * downloaded. Ignored unless alt=media is specified. * @opt_param string projection This parameter is deprecated and has no * function. * @return Google_Service_Drive_Channel */ public function watch($fileId, Google_Service_Drive_Channel $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('watch', array($params), "Google_Service_Drive_Channel"); } } /** * The "parents" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $parents = $driveService->parents; * */ class Google_Service_Drive_Parents_Resource extends UDP_Google_Service_Resource { /** * Removes a parent from a file. (parents.delete) * * @param string $fileId The ID of the file. * @param string $parentId The ID of the parent. * @param array $optParams Optional parameters. */ public function delete($fileId, $parentId, $optParams = array()) { $params = array('fileId' => $fileId, 'parentId' => $parentId); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Gets a specific parent reference. (parents.get) * * @param string $fileId The ID of the file. * @param string $parentId The ID of the parent. * @param array $optParams Optional parameters. * @return UDP_Google_Service_Drive_ParentReference */ public function get($fileId, $parentId, $optParams = array()) { $params = array('fileId' => $fileId, 'parentId' => $parentId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "UDP_Google_Service_Drive_ParentReference"); } /** * Adds a parent folder for a file. (parents.insert) * * @param string $fileId The ID of the file. * @param Google_ParentReference $postBody * @param array $optParams Optional parameters. * @return UDP_Google_Service_Drive_ParentReference */ public function insert($fileId, UDP_Google_Service_Drive_ParentReference $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "UDP_Google_Service_Drive_ParentReference"); } /** * Lists a file's parents. (parents.listParents) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * @return Google_Service_Drive_ParentList */ public function listParents($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_ParentList"); } } /** * The "permissions" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $permissions = $driveService->permissions; * */ class Google_Service_Drive_Permissions_Resource extends UDP_Google_Service_Resource { /** * Deletes a permission from a file. (permissions.delete) * * @param string $fileId The ID for the file. * @param string $permissionId The ID for the permission. * @param array $optParams Optional parameters. */ public function delete($fileId, $permissionId, $optParams = array()) { $params = array('fileId' => $fileId, 'permissionId' => $permissionId); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Gets a permission by ID. (permissions.get) * * @param string $fileId The ID for the file. * @param string $permissionId The ID for the permission. * @param array $optParams Optional parameters. * @return Google_Service_Drive_Permission */ public function get($fileId, $permissionId, $optParams = array()) { $params = array('fileId' => $fileId, 'permissionId' => $permissionId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_Permission"); } /** * Returns the permission ID for an email address. (permissions.getIdForEmail) * * @param string $email The email address for which to return a permission ID * @param array $optParams Optional parameters. * @return Google_Service_Drive_PermissionId */ public function getIdForEmail($email, $optParams = array()) { $params = array('email' => $email); $params = array_merge($params, $optParams); return $this->call('getIdForEmail', array($params), "Google_Service_Drive_PermissionId"); } /** * Inserts a permission for a file. (permissions.insert) * * @param string $fileId The ID for the file. * @param Google_Permission $postBody * @param array $optParams Optional parameters. * * @opt_param string emailMessage A custom message to include in notification * emails. * @opt_param bool sendNotificationEmails Whether to send notification emails * when sharing to users or groups. This parameter is ignored and an email is * sent if the role is owner. * @return Google_Service_Drive_Permission */ public function insert($fileId, Google_Service_Drive_Permission $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Drive_Permission"); } /** * Lists a file's permissions. (permissions.listPermissions) * * @param string $fileId The ID for the file. * @param array $optParams Optional parameters. * @return Google_Service_Drive_PermissionList */ public function listPermissions($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_PermissionList"); } /** * Updates a permission. This method supports patch semantics. * (permissions.patch) * * @param string $fileId The ID for the file. * @param string $permissionId The ID for the permission. * @param Google_Permission $postBody * @param array $optParams Optional parameters. * * @opt_param bool transferOwnership Whether changing a role to 'owner' * downgrades the current owners to writers. Does nothing if the specified role * is not 'owner'. * @return Google_Service_Drive_Permission */ public function patch($fileId, $permissionId, Google_Service_Drive_Permission $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'permissionId' => $permissionId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Drive_Permission"); } /** * Updates a permission. (permissions.update) * * @param string $fileId The ID for the file. * @param string $permissionId The ID for the permission. * @param Google_Permission $postBody * @param array $optParams Optional parameters. * * @opt_param bool transferOwnership Whether changing a role to 'owner' * downgrades the current owners to writers. Does nothing if the specified role * is not 'owner'. * @return Google_Service_Drive_Permission */ public function update($fileId, $permissionId, Google_Service_Drive_Permission $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'permissionId' => $permissionId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Drive_Permission"); } } /** * The "properties" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $properties = $driveService->properties; * */ class Google_Service_Drive_Properties_Resource extends UDP_Google_Service_Resource { /** * Deletes a property. (properties.delete) * * @param string $fileId The ID of the file. * @param string $propertyKey The key of the property. * @param array $optParams Optional parameters. * * @opt_param string visibility The visibility of the property. */ public function delete($fileId, $propertyKey, $optParams = array()) { $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Gets a property by its key. (properties.get) * * @param string $fileId The ID of the file. * @param string $propertyKey The key of the property. * @param array $optParams Optional parameters. * * @opt_param string visibility The visibility of the property. * @return Google_Service_Drive_Property */ public function get($fileId, $propertyKey, $optParams = array()) { $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_Property"); } /** * Adds a property to a file. (properties.insert) * * @param string $fileId The ID of the file. * @param Google_Property $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_Property */ public function insert($fileId, Google_Service_Drive_Property $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Drive_Property"); } /** * Lists a file's properties. (properties.listProperties) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * @return Google_Service_Drive_PropertyList */ public function listProperties($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_PropertyList"); } /** * Updates a property. This method supports patch semantics. (properties.patch) * * @param string $fileId The ID of the file. * @param string $propertyKey The key of the property. * @param Google_Property $postBody * @param array $optParams Optional parameters. * * @opt_param string visibility The visibility of the property. * @return Google_Service_Drive_Property */ public function patch($fileId, $propertyKey, Google_Service_Drive_Property $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Drive_Property"); } /** * Updates a property. (properties.update) * * @param string $fileId The ID of the file. * @param string $propertyKey The key of the property. * @param Google_Property $postBody * @param array $optParams Optional parameters. * * @opt_param string visibility The visibility of the property. * @return Google_Service_Drive_Property */ public function update($fileId, $propertyKey, Google_Service_Drive_Property $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Drive_Property"); } } /** * The "realtime" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $realtime = $driveService->realtime; * */ class Google_Service_Drive_Realtime_Resource extends UDP_Google_Service_Resource { /** * Exports the contents of the Realtime API data model associated with this file * as JSON. (realtime.get) * * @param string $fileId The ID of the file that the Realtime API data model is * associated with. * @param array $optParams Optional parameters. * * @opt_param int revision The revision of the Realtime API data model to * export. Revisions start at 1 (the initial empty data model) and are * incremented with each change. If this parameter is excluded, the most recent * data model will be returned. */ public function get($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('get', array($params)); } /** * Overwrites the Realtime API data model associated with this file with the * provided JSON data model. (realtime.update) * * @param string $fileId The ID of the file that the Realtime API data model is * associated with. * @param array $optParams Optional parameters. * * @opt_param string baseRevision The revision of the model to diff the uploaded * model against. If set, the uploaded model is diffed against the provided * revision and those differences are merged with any changes made to the model * after the provided revision. If not set, the uploaded model replaces the * current model on the server. */ public function update($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('update', array($params)); } } /** * The "replies" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $replies = $driveService->replies; * */ class Google_Service_Drive_Replies_Resource extends UDP_Google_Service_Resource { /** * Deletes a reply. (replies.delete) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param string $replyId The ID of the reply. * @param array $optParams Optional parameters. */ public function delete($fileId, $commentId, $replyId, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Gets a reply. (replies.get) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param string $replyId The ID of the reply. * @param array $optParams Optional parameters. * * @opt_param bool includeDeleted If set, this will succeed when retrieving a * deleted reply. * @return Google_Service_Drive_CommentReply */ public function get($fileId, $commentId, $replyId, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_CommentReply"); } /** * Creates a new reply to the given comment. (replies.insert) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param Google_CommentReply $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_CommentReply */ public function insert($fileId, $commentId, Google_Service_Drive_CommentReply $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Drive_CommentReply"); } /** * Lists all of the replies to a comment. (replies.listReplies) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param array $optParams Optional parameters. * * @opt_param string pageToken The continuation token, used to page through * large result sets. To get the next page of results, set this parameter to the * value of "nextPageToken" from the previous response. * @opt_param bool includeDeleted If set, all replies, including deleted replies * (with content stripped) will be returned. * @opt_param int maxResults The maximum number of replies to include in the * response, used for paging. * @return Google_Service_Drive_CommentReplyList */ public function listReplies($fileId, $commentId, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_CommentReplyList"); } /** * Updates an existing reply. This method supports patch semantics. * (replies.patch) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param string $replyId The ID of the reply. * @param Google_CommentReply $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_CommentReply */ public function patch($fileId, $commentId, $replyId, Google_Service_Drive_CommentReply $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Drive_CommentReply"); } /** * Updates an existing reply. (replies.update) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param string $replyId The ID of the reply. * @param Google_CommentReply $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_CommentReply */ public function update($fileId, $commentId, $replyId, Google_Service_Drive_CommentReply $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Drive_CommentReply"); } } /** * The "revisions" collection of methods. * Typical usage is: * * $driveService = new Google_Service_Drive(...); * $revisions = $driveService->revisions; * */ class Google_Service_Drive_Revisions_Resource extends UDP_Google_Service_Resource { /** * Removes a revision. (revisions.delete) * * @param string $fileId The ID of the file. * @param string $revisionId The ID of the revision. * @param array $optParams Optional parameters. */ public function delete($fileId, $revisionId, $optParams = array()) { $params = array('fileId' => $fileId, 'revisionId' => $revisionId); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Gets a specific revision. (revisions.get) * * @param string $fileId The ID of the file. * @param string $revisionId The ID of the revision. * @param array $optParams Optional parameters. * @return Google_Service_Drive_Revision */ public function get($fileId, $revisionId, $optParams = array()) { $params = array('fileId' => $fileId, 'revisionId' => $revisionId); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Drive_Revision"); } /** * Lists a file's revisions. (revisions.listRevisions) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * @return Google_Service_Drive_RevisionList */ public function listRevisions($fileId, $optParams = array()) { $params = array('fileId' => $fileId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Drive_RevisionList"); } /** * Updates a revision. This method supports patch semantics. (revisions.patch) * * @param string $fileId The ID for the file. * @param string $revisionId The ID for the revision. * @param Google_Revision $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_Revision */ public function patch($fileId, $revisionId, Google_Service_Drive_Revision $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'revisionId' => $revisionId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Drive_Revision"); } /** * Updates a revision. (revisions.update) * * @param string $fileId The ID for the file. * @param string $revisionId The ID for the revision. * @param Google_Revision $postBody * @param array $optParams Optional parameters. * @return Google_Service_Drive_Revision */ public function update($fileId, $revisionId, Google_Service_Drive_Revision $postBody, $optParams = array()) { $params = array('fileId' => $fileId, 'revisionId' => $revisionId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Drive_Revision"); } } class Google_Service_Drive_About extends Google_Collection { protected $collection_key = 'quotaBytesByService'; protected $internal_gapi_mappings = array( ); protected $additionalRoleInfoType = 'Google_Service_Drive_AboutAdditionalRoleInfo'; protected $additionalRoleInfoDataType = 'array'; public $domainSharingPolicy; public $etag; protected $exportFormatsType = 'Google_Service_Drive_AboutExportFormats'; protected $exportFormatsDataType = 'array'; protected $featuresType = 'Google_Service_Drive_AboutFeatures'; protected $featuresDataType = 'array'; public $folderColorPalette; protected $importFormatsType = 'Google_Service_Drive_AboutImportFormats'; protected $importFormatsDataType = 'array'; public $isCurrentAppInstalled; public $kind; public $languageCode; public $largestChangeId; protected $maxUploadSizesType = 'Google_Service_Drive_AboutMaxUploadSizes'; protected $maxUploadSizesDataType = 'array'; public $name; public $permissionId; protected $quotaBytesByServiceType = 'Google_Service_Drive_AboutQuotaBytesByService'; protected $quotaBytesByServiceDataType = 'array'; public $quotaBytesTotal; public $quotaBytesUsed; public $quotaBytesUsedAggregate; public $quotaBytesUsedInTrash; public $quotaType; public $remainingChangeIds; public $rootFolderId; public $selfLink; protected $userType = 'Google_Service_Drive_User'; protected $userDataType = ''; public function setAdditionalRoleInfo($additionalRoleInfo) { $this->additionalRoleInfo = $additionalRoleInfo; } public function getAdditionalRoleInfo() { return $this->additionalRoleInfo; } public function setDomainSharingPolicy($domainSharingPolicy) { $this->domainSharingPolicy = $domainSharingPolicy; } public function getDomainSharingPolicy() { return $this->domainSharingPolicy; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setExportFormats($exportFormats) { $this->exportFormats = $exportFormats; } public function getExportFormats() { return $this->exportFormats; } public function setFeatures($features) { $this->features = $features; } public function getFeatures() { return $this->features; } public function setFolderColorPalette($folderColorPalette) { $this->folderColorPalette = $folderColorPalette; } public function getFolderColorPalette() { return $this->folderColorPalette; } public function setImportFormats($importFormats) { $this->importFormats = $importFormats; } public function getImportFormats() { return $this->importFormats; } public function setIsCurrentAppInstalled($isCurrentAppInstalled) { $this->isCurrentAppInstalled = $isCurrentAppInstalled; } public function getIsCurrentAppInstalled() { return $this->isCurrentAppInstalled; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setLanguageCode($languageCode) { $this->languageCode = $languageCode; } public function getLanguageCode() { return $this->languageCode; } public function setLargestChangeId($largestChangeId) { $this->largestChangeId = $largestChangeId; } public function getLargestChangeId() { return $this->largestChangeId; } public function setMaxUploadSizes($maxUploadSizes) { $this->maxUploadSizes = $maxUploadSizes; } public function getMaxUploadSizes() { return $this->maxUploadSizes; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setPermissionId($permissionId) { $this->permissionId = $permissionId; } public function getPermissionId() { return $this->permissionId; } public function setQuotaBytesByService($quotaBytesByService) { $this->quotaBytesByService = $quotaBytesByService; } public function getQuotaBytesByService() { return $this->quotaBytesByService; } public function setQuotaBytesTotal($quotaBytesTotal) { $this->quotaBytesTotal = $quotaBytesTotal; } public function getQuotaBytesTotal() { return $this->quotaBytesTotal; } public function setQuotaBytesUsed($quotaBytesUsed) { $this->quotaBytesUsed = $quotaBytesUsed; } public function getQuotaBytesUsed() { return $this->quotaBytesUsed; } public function setQuotaBytesUsedAggregate($quotaBytesUsedAggregate) { $this->quotaBytesUsedAggregate = $quotaBytesUsedAggregate; } public function getQuotaBytesUsedAggregate() { return $this->quotaBytesUsedAggregate; } public function setQuotaBytesUsedInTrash($quotaBytesUsedInTrash) { $this->quotaBytesUsedInTrash = $quotaBytesUsedInTrash; } public function getQuotaBytesUsedInTrash() { return $this->quotaBytesUsedInTrash; } public function setQuotaType($quotaType) { $this->quotaType = $quotaType; } public function getQuotaType() { return $this->quotaType; } public function setRemainingChangeIds($remainingChangeIds) { $this->remainingChangeIds = $remainingChangeIds; } public function getRemainingChangeIds() { return $this->remainingChangeIds; } public function setRootFolderId($rootFolderId) { $this->rootFolderId = $rootFolderId; } public function getRootFolderId() { return $this->rootFolderId; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setUser(Google_Service_Drive_User $user) { $this->user = $user; } public function getUser() { return $this->user; } } class Google_Service_Drive_AboutAdditionalRoleInfo extends Google_Collection { protected $collection_key = 'roleSets'; protected $internal_gapi_mappings = array( ); protected $roleSetsType = 'Google_Service_Drive_AboutAdditionalRoleInfoRoleSets'; protected $roleSetsDataType = 'array'; public $type; public function setRoleSets($roleSets) { $this->roleSets = $roleSets; } public function getRoleSets() { return $this->roleSets; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Drive_AboutAdditionalRoleInfoRoleSets extends Google_Collection { protected $collection_key = 'additionalRoles'; protected $internal_gapi_mappings = array( ); public $additionalRoles; public $primaryRole; public function setAdditionalRoles($additionalRoles) { $this->additionalRoles = $additionalRoles; } public function getAdditionalRoles() { return $this->additionalRoles; } public function setPrimaryRole($primaryRole) { $this->primaryRole = $primaryRole; } public function getPrimaryRole() { return $this->primaryRole; } } class Google_Service_Drive_AboutExportFormats extends Google_Collection { protected $collection_key = 'targets'; protected $internal_gapi_mappings = array( ); public $source; public $targets; public function setSource($source) { $this->source = $source; } public function getSource() { return $this->source; } public function setTargets($targets) { $this->targets = $targets; } public function getTargets() { return $this->targets; } } class Google_Service_Drive_AboutFeatures extends Google_Model { protected $internal_gapi_mappings = array( ); public $featureName; public $featureRate; public function setFeatureName($featureName) { $this->featureName = $featureName; } public function getFeatureName() { return $this->featureName; } public function setFeatureRate($featureRate) { $this->featureRate = $featureRate; } public function getFeatureRate() { return $this->featureRate; } } class Google_Service_Drive_AboutImportFormats extends Google_Collection { protected $collection_key = 'targets'; protected $internal_gapi_mappings = array( ); public $source; public $targets; public function setSource($source) { $this->source = $source; } public function getSource() { return $this->source; } public function setTargets($targets) { $this->targets = $targets; } public function getTargets() { return $this->targets; } } class Google_Service_Drive_AboutMaxUploadSizes extends Google_Model { protected $internal_gapi_mappings = array( ); public $size; public $type; public function setSize($size) { $this->size = $size; } public function getSize() { return $this->size; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Drive_AboutQuotaBytesByService extends Google_Model { protected $internal_gapi_mappings = array( ); public $bytesUsed; public $serviceName; public function setBytesUsed($bytesUsed) { $this->bytesUsed = $bytesUsed; } public function getBytesUsed() { return $this->bytesUsed; } public function setServiceName($serviceName) { $this->serviceName = $serviceName; } public function getServiceName() { return $this->serviceName; } } class Google_Service_Drive_App extends Google_Collection { protected $collection_key = 'secondaryMimeTypes'; protected $internal_gapi_mappings = array( ); public $authorized; public $createInFolderTemplate; public $createUrl; public $hasDriveWideScope; protected $iconsType = 'Google_Service_Drive_AppIcons'; protected $iconsDataType = 'array'; public $id; public $installed; public $kind; public $longDescription; public $name; public $objectType; public $openUrlTemplate; public $primaryFileExtensions; public $primaryMimeTypes; public $productId; public $productUrl; public $secondaryFileExtensions; public $secondaryMimeTypes; public $shortDescription; public $supportsCreate; public $supportsImport; public $supportsMultiOpen; public $supportsOfflineCreate; public $useByDefault; public function setAuthorized($authorized) { $this->authorized = $authorized; } public function getAuthorized() { return $this->authorized; } public function setCreateInFolderTemplate($createInFolderTemplate) { $this->createInFolderTemplate = $createInFolderTemplate; } public function getCreateInFolderTemplate() { return $this->createInFolderTemplate; } public function setCreateUrl($createUrl) { $this->createUrl = $createUrl; } public function getCreateUrl() { return $this->createUrl; } public function setHasDriveWideScope($hasDriveWideScope) { $this->hasDriveWideScope = $hasDriveWideScope; } public function getHasDriveWideScope() { return $this->hasDriveWideScope; } public function setIcons($icons) { $this->icons = $icons; } public function getIcons() { return $this->icons; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setInstalled($installed) { $this->installed = $installed; } public function getInstalled() { return $this->installed; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setLongDescription($longDescription) { $this->longDescription = $longDescription; } public function getLongDescription() { return $this->longDescription; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setObjectType($objectType) { $this->objectType = $objectType; } public function getObjectType() { return $this->objectType; } public function setOpenUrlTemplate($openUrlTemplate) { $this->openUrlTemplate = $openUrlTemplate; } public function getOpenUrlTemplate() { return $this->openUrlTemplate; } public function setPrimaryFileExtensions($primaryFileExtensions) { $this->primaryFileExtensions = $primaryFileExtensions; } public function getPrimaryFileExtensions() { return $this->primaryFileExtensions; } public function setPrimaryMimeTypes($primaryMimeTypes) { $this->primaryMimeTypes = $primaryMimeTypes; } public function getPrimaryMimeTypes() { return $this->primaryMimeTypes; } public function setProductId($productId) { $this->productId = $productId; } public function getProductId() { return $this->productId; } public function setProductUrl($productUrl) { $this->productUrl = $productUrl; } public function getProductUrl() { return $this->productUrl; } public function setSecondaryFileExtensions($secondaryFileExtensions) { $this->secondaryFileExtensions = $secondaryFileExtensions; } public function getSecondaryFileExtensions() { return $this->secondaryFileExtensions; } public function setSecondaryMimeTypes($secondaryMimeTypes) { $this->secondaryMimeTypes = $secondaryMimeTypes; } public function getSecondaryMimeTypes() { return $this->secondaryMimeTypes; } public function setShortDescription($shortDescription) { $this->shortDescription = $shortDescription; } public function getShortDescription() { return $this->shortDescription; } public function setSupportsCreate($supportsCreate) { $this->supportsCreate = $supportsCreate; } public function getSupportsCreate() { return $this->supportsCreate; } public function setSupportsImport($supportsImport) { $this->supportsImport = $supportsImport; } public function getSupportsImport() { return $this->supportsImport; } public function setSupportsMultiOpen($supportsMultiOpen) { $this->supportsMultiOpen = $supportsMultiOpen; } public function getSupportsMultiOpen() { return $this->supportsMultiOpen; } public function setSupportsOfflineCreate($supportsOfflineCreate) { $this->supportsOfflineCreate = $supportsOfflineCreate; } public function getSupportsOfflineCreate() { return $this->supportsOfflineCreate; } public function setUseByDefault($useByDefault) { $this->useByDefault = $useByDefault; } public function getUseByDefault() { return $this->useByDefault; } } class Google_Service_Drive_AppIcons extends Google_Model { protected $internal_gapi_mappings = array( ); public $category; public $iconUrl; public $size; public function setCategory($category) { $this->category = $category; } public function getCategory() { return $this->category; } public function setIconUrl($iconUrl) { $this->iconUrl = $iconUrl; } public function getIconUrl() { return $this->iconUrl; } public function setSize($size) { $this->size = $size; } public function getSize() { return $this->size; } } class Google_Service_Drive_AppList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $defaultAppIds; public $etag; protected $itemsType = 'Google_Service_Drive_App'; protected $itemsDataType = 'array'; public $kind; public $selfLink; public function setDefaultAppIds($defaultAppIds) { $this->defaultAppIds = $defaultAppIds; } public function getDefaultAppIds() { return $this->defaultAppIds; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_Change extends Google_Model { protected $internal_gapi_mappings = array( ); public $deleted; protected $fileType = 'UDP_Google_Service_Drive_DriveFile'; protected $fileDataType = ''; public $fileId; public $id; public $kind; public $modificationDate; public $selfLink; public function setDeleted($deleted) { $this->deleted = $deleted; } public function getDeleted() { return $this->deleted; } public function setFile(UDP_Google_Service_Drive_DriveFile $file) { $this->file = $file; } public function getFile() { return $this->file; } public function setFileId($fileId) { $this->fileId = $fileId; } public function getFileId() { return $this->fileId; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setModificationDate($modificationDate) { $this->modificationDate = $modificationDate; } public function getModificationDate() { return $this->modificationDate; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_ChangeList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $etag; protected $itemsType = 'Google_Service_Drive_Change'; protected $itemsDataType = 'array'; public $kind; public $largestChangeId; public $nextLink; public $nextPageToken; public $selfLink; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setLargestChangeId($largestChangeId) { $this->largestChangeId = $largestChangeId; } public function getLargestChangeId() { return $this->largestChangeId; } public function setNextLink($nextLink) { $this->nextLink = $nextLink; } public function getNextLink() { return $this->nextLink; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_Channel extends Google_Model { protected $internal_gapi_mappings = array( ); public $address; public $expiration; public $id; public $kind; public $params; public $payload; public $resourceId; public $resourceUri; public $token; public $type; public function setAddress($address) { $this->address = $address; } public function getAddress() { return $this->address; } public function setExpiration($expiration) { $this->expiration = $expiration; } public function getExpiration() { return $this->expiration; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setParams($params) { $this->params = $params; } public function getParams() { return $this->params; } public function setPayload($payload) { $this->payload = $payload; } public function getPayload() { return $this->payload; } public function setResourceId($resourceId) { $this->resourceId = $resourceId; } public function getResourceId() { return $this->resourceId; } public function setResourceUri($resourceUri) { $this->resourceUri = $resourceUri; } public function getResourceUri() { return $this->resourceUri; } public function setToken($token) { $this->token = $token; } public function getToken() { return $this->token; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Drive_ChannelParams extends Google_Model { } class Google_Service_Drive_ChildList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $etag; protected $itemsType = 'Google_Service_Drive_ChildReference'; protected $itemsDataType = 'array'; public $kind; public $nextLink; public $nextPageToken; public $selfLink; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextLink($nextLink) { $this->nextLink = $nextLink; } public function getNextLink() { return $this->nextLink; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_ChildReference extends Google_Model { protected $internal_gapi_mappings = array( ); public $childLink; public $id; public $kind; public $selfLink; public function setChildLink($childLink) { $this->childLink = $childLink; } public function getChildLink() { return $this->childLink; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_Comment extends Google_Collection { protected $collection_key = 'replies'; protected $internal_gapi_mappings = array( ); public $anchor; protected $authorType = 'Google_Service_Drive_User'; protected $authorDataType = ''; public $commentId; public $content; protected $contextType = 'Google_Service_Drive_CommentContext'; protected $contextDataType = ''; public $createdDate; public $deleted; public $fileId; public $fileTitle; public $htmlContent; public $kind; public $modifiedDate; protected $repliesType = 'Google_Service_Drive_CommentReply'; protected $repliesDataType = 'array'; public $selfLink; public $status; public function setAnchor($anchor) { $this->anchor = $anchor; } public function getAnchor() { return $this->anchor; } public function setAuthor(Google_Service_Drive_User $author) { $this->author = $author; } public function getAuthor() { return $this->author; } public function setCommentId($commentId) { $this->commentId = $commentId; } public function getCommentId() { return $this->commentId; } public function setContent($content) { $this->content = $content; } public function getContent() { return $this->content; } public function setContext(Google_Service_Drive_CommentContext $context) { $this->context = $context; } public function getContext() { return $this->context; } public function setCreatedDate($createdDate) { $this->createdDate = $createdDate; } public function getCreatedDate() { return $this->createdDate; } public function setDeleted($deleted) { $this->deleted = $deleted; } public function getDeleted() { return $this->deleted; } public function setFileId($fileId) { $this->fileId = $fileId; } public function getFileId() { return $this->fileId; } public function setFileTitle($fileTitle) { $this->fileTitle = $fileTitle; } public function getFileTitle() { return $this->fileTitle; } public function setHtmlContent($htmlContent) { $this->htmlContent = $htmlContent; } public function getHtmlContent() { return $this->htmlContent; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setModifiedDate($modifiedDate) { $this->modifiedDate = $modifiedDate; } public function getModifiedDate() { return $this->modifiedDate; } public function setReplies($replies) { $this->replies = $replies; } public function getReplies() { return $this->replies; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setStatus($status) { $this->status = $status; } public function getStatus() { return $this->status; } } class Google_Service_Drive_CommentContext extends Google_Model { protected $internal_gapi_mappings = array( ); public $type; public $value; public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_Drive_CommentList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); protected $itemsType = 'Google_Service_Drive_Comment'; protected $itemsDataType = 'array'; public $kind; public $nextLink; public $nextPageToken; public $selfLink; public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextLink($nextLink) { $this->nextLink = $nextLink; } public function getNextLink() { return $this->nextLink; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_CommentReply extends Google_Model { protected $internal_gapi_mappings = array( ); protected $authorType = 'Google_Service_Drive_User'; protected $authorDataType = ''; public $content; public $createdDate; public $deleted; public $htmlContent; public $kind; public $modifiedDate; public $replyId; public $verb; public function setAuthor(Google_Service_Drive_User $author) { $this->author = $author; } public function getAuthor() { return $this->author; } public function setContent($content) { $this->content = $content; } public function getContent() { return $this->content; } public function setCreatedDate($createdDate) { $this->createdDate = $createdDate; } public function getCreatedDate() { return $this->createdDate; } public function setDeleted($deleted) { $this->deleted = $deleted; } public function getDeleted() { return $this->deleted; } public function setHtmlContent($htmlContent) { $this->htmlContent = $htmlContent; } public function getHtmlContent() { return $this->htmlContent; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setModifiedDate($modifiedDate) { $this->modifiedDate = $modifiedDate; } public function getModifiedDate() { return $this->modifiedDate; } public function setReplyId($replyId) { $this->replyId = $replyId; } public function getReplyId() { return $this->replyId; } public function setVerb($verb) { $this->verb = $verb; } public function getVerb() { return $this->verb; } } class Google_Service_Drive_CommentReplyList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); protected $itemsType = 'Google_Service_Drive_CommentReply'; protected $itemsDataType = 'array'; public $kind; public $nextLink; public $nextPageToken; public $selfLink; public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextLink($nextLink) { $this->nextLink = $nextLink; } public function getNextLink() { return $this->nextLink; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class UDP_Google_Service_Drive_DriveFile extends Google_Collection { protected $collection_key = 'properties'; protected $internal_gapi_mappings = array( ); public $alternateLink; public $appDataContents; public $copyable; public $createdDate; public $defaultOpenWithLink; public $description; public $downloadUrl; public $editable; public $embedLink; public $etag; public $explicitlyTrashed; public $exportLinks; public $fileExtension; public $fileSize; public $folderColorRgb; public $headRevisionId; public $iconLink; public $id; protected $imageMediaMetadataType = 'UDP_Google_Service_Drive_DriveFileImageMediaMetadata'; protected $imageMediaMetadataDataType = ''; protected $indexableTextType = 'UDP_Google_Service_Drive_DriveFileIndexableText'; protected $indexableTextDataType = ''; public $kind; protected $labelsType = 'UDP_Google_Service_Drive_DriveFileLabels'; protected $labelsDataType = ''; protected $lastModifyingUserType = 'Google_Service_Drive_User'; protected $lastModifyingUserDataType = ''; public $lastModifyingUserName; public $lastViewedByMeDate; public $markedViewedByMeDate; public $md5Checksum; public $mimeType; public $modifiedByMeDate; public $modifiedDate; public $openWithLinks; public $originalFilename; public $ownerNames; protected $ownersType = 'Google_Service_Drive_User'; protected $ownersDataType = 'array'; protected $parentsType = 'UDP_Google_Service_Drive_ParentReference'; protected $parentsDataType = 'array'; protected $permissionsType = 'Google_Service_Drive_Permission'; protected $permissionsDataType = 'array'; protected $propertiesType = 'Google_Service_Drive_Property'; protected $propertiesDataType = 'array'; public $quotaBytesUsed; public $selfLink; public $shared; public $sharedWithMeDate; protected $sharingUserType = 'Google_Service_Drive_User'; protected $sharingUserDataType = ''; protected $thumbnailType = 'UDP_Google_Service_Drive_DriveFileThumbnail'; protected $thumbnailDataType = ''; public $thumbnailLink; public $title; protected $userPermissionType = 'Google_Service_Drive_Permission'; protected $userPermissionDataType = ''; public $version; protected $videoMediaMetadataType = 'UDP_Google_Service_Drive_DriveFileVideoMediaMetadata'; /** * Parent resource * * @var Google_Service_Drive_Parents_Resource */ public $parents; protected $videoMediaMetadataDataType = ''; public $webContentLink; public $webViewLink; public $writersCanShare; public function setAlternateLink($alternateLink) { $this->alternateLink = $alternateLink; } public function getAlternateLink() { return $this->alternateLink; } public function setAppDataContents($appDataContents) { $this->appDataContents = $appDataContents; } public function getAppDataContents() { return $this->appDataContents; } public function setCopyable($copyable) { $this->copyable = $copyable; } public function getCopyable() { return $this->copyable; } public function setCreatedDate($createdDate) { $this->createdDate = $createdDate; } public function getCreatedDate() { return $this->createdDate; } public function setDefaultOpenWithLink($defaultOpenWithLink) { $this->defaultOpenWithLink = $defaultOpenWithLink; } public function getDefaultOpenWithLink() { return $this->defaultOpenWithLink; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setDownloadUrl($downloadUrl) { $this->downloadUrl = $downloadUrl; } public function getDownloadUrl() { return $this->downloadUrl; } public function setEditable($editable) { $this->editable = $editable; } public function getEditable() { return $this->editable; } public function setEmbedLink($embedLink) { $this->embedLink = $embedLink; } public function getEmbedLink() { return $this->embedLink; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setExplicitlyTrashed($explicitlyTrashed) { $this->explicitlyTrashed = $explicitlyTrashed; } public function getExplicitlyTrashed() { return $this->explicitlyTrashed; } public function setExportLinks($exportLinks) { $this->exportLinks = $exportLinks; } public function getExportLinks() { return $this->exportLinks; } public function setFileExtension($fileExtension) { $this->fileExtension = $fileExtension; } public function getFileExtension() { return $this->fileExtension; } public function setFileSize($fileSize) { $this->fileSize = $fileSize; } public function getFileSize() { return $this->fileSize; } public function setFolderColorRgb($folderColorRgb) { $this->folderColorRgb = $folderColorRgb; } public function getFolderColorRgb() { return $this->folderColorRgb; } public function setHeadRevisionId($headRevisionId) { $this->headRevisionId = $headRevisionId; } public function getHeadRevisionId() { return $this->headRevisionId; } public function setIconLink($iconLink) { $this->iconLink = $iconLink; } public function getIconLink() { return $this->iconLink; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setImageMediaMetadata(UDP_Google_Service_Drive_DriveFileImageMediaMetadata $imageMediaMetadata) { $this->imageMediaMetadata = $imageMediaMetadata; } public function getImageMediaMetadata() { return $this->imageMediaMetadata; } public function setIndexableText(UDP_Google_Service_Drive_DriveFileIndexableText $indexableText) { $this->indexableText = $indexableText; } public function getIndexableText() { return $this->indexableText; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setLabels(UDP_Google_Service_Drive_DriveFileLabels $labels) { $this->labels = $labels; } public function getLabels() { return $this->labels; } public function setLastModifyingUser(Google_Service_Drive_User $lastModifyingUser) { $this->lastModifyingUser = $lastModifyingUser; } public function getLastModifyingUser() { return $this->lastModifyingUser; } public function setLastModifyingUserName($lastModifyingUserName) { $this->lastModifyingUserName = $lastModifyingUserName; } public function getLastModifyingUserName() { return $this->lastModifyingUserName; } public function setLastViewedByMeDate($lastViewedByMeDate) { $this->lastViewedByMeDate = $lastViewedByMeDate; } public function getLastViewedByMeDate() { return $this->lastViewedByMeDate; } public function setMarkedViewedByMeDate($markedViewedByMeDate) { $this->markedViewedByMeDate = $markedViewedByMeDate; } public function getMarkedViewedByMeDate() { return $this->markedViewedByMeDate; } public function setMd5Checksum($md5Checksum) { $this->md5Checksum = $md5Checksum; } public function getMd5Checksum() { return $this->md5Checksum; } public function setMimeType($mimeType) { $this->mimeType = $mimeType; } public function getMimeType() { return $this->mimeType; } public function setModifiedByMeDate($modifiedByMeDate) { $this->modifiedByMeDate = $modifiedByMeDate; } public function getModifiedByMeDate() { return $this->modifiedByMeDate; } public function setModifiedDate($modifiedDate) { $this->modifiedDate = $modifiedDate; } public function getModifiedDate() { return $this->modifiedDate; } public function setOpenWithLinks($openWithLinks) { $this->openWithLinks = $openWithLinks; } public function getOpenWithLinks() { return $this->openWithLinks; } public function setOriginalFilename($originalFilename) { $this->originalFilename = $originalFilename; } public function getOriginalFilename() { return $this->originalFilename; } public function setOwnerNames($ownerNames) { $this->ownerNames = $ownerNames; } public function getOwnerNames() { return $this->ownerNames; } public function setOwners($owners) { $this->owners = $owners; } public function getOwners() { return $this->owners; } public function setParents($parents) { $this->parents = $parents; } public function getParents() { return $this->parents; } public function setPermissions($permissions) { $this->permissions = $permissions; } public function getPermissions() { return $this->permissions; } public function setProperties($properties) { $this->properties = $properties; } public function getProperties() { return $this->properties; } public function setQuotaBytesUsed($quotaBytesUsed) { $this->quotaBytesUsed = $quotaBytesUsed; } public function getQuotaBytesUsed() { return $this->quotaBytesUsed; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setShared($shared) { $this->shared = $shared; } public function getShared() { return $this->shared; } public function setSharedWithMeDate($sharedWithMeDate) { $this->sharedWithMeDate = $sharedWithMeDate; } public function getSharedWithMeDate() { return $this->sharedWithMeDate; } public function setSharingUser(Google_Service_Drive_User $sharingUser) { $this->sharingUser = $sharingUser; } public function getSharingUser() { return $this->sharingUser; } public function setThumbnail(UDP_Google_Service_Drive_DriveFileThumbnail $thumbnail) { $this->thumbnail = $thumbnail; } public function getThumbnail() { return $this->thumbnail; } public function setThumbnailLink($thumbnailLink) { $this->thumbnailLink = $thumbnailLink; } public function getThumbnailLink() { return $this->thumbnailLink; } public function setTitle($title) { $this->title = $title; } public function getTitle() { return $this->title; } public function setUserPermission(Google_Service_Drive_Permission $userPermission) { $this->userPermission = $userPermission; } public function getUserPermission() { return $this->userPermission; } public function setVersion($version) { $this->version = $version; } public function getVersion() { return $this->version; } public function setVideoMediaMetadata(UDP_Google_Service_Drive_DriveFileVideoMediaMetadata $videoMediaMetadata) { $this->videoMediaMetadata = $videoMediaMetadata; } public function getVideoMediaMetadata() { return $this->videoMediaMetadata; } public function setWebContentLink($webContentLink) { $this->webContentLink = $webContentLink; } public function getWebContentLink() { return $this->webContentLink; } public function setWebViewLink($webViewLink) { $this->webViewLink = $webViewLink; } public function getWebViewLink() { return $this->webViewLink; } public function setWritersCanShare($writersCanShare) { $this->writersCanShare = $writersCanShare; } public function getWritersCanShare() { return $this->writersCanShare; } } class UDP_Google_Service_Drive_DriveFileExportLinks extends Google_Model { } class UDP_Google_Service_Drive_DriveFileImageMediaMetadata extends Google_Model { protected $internal_gapi_mappings = array( ); public $aperture; public $cameraMake; public $cameraModel; public $colorSpace; public $date; public $exposureBias; public $exposureMode; public $exposureTime; public $flashUsed; public $focalLength; public $height; public $isoSpeed; public $lens; protected $locationType = 'UDP_Google_Service_Drive_DriveFileImageMediaMetadataLocation'; protected $locationDataType = ''; public $maxApertureValue; public $meteringMode; public $rotation; public $sensor; public $subjectDistance; public $whiteBalance; public $width; public function setAperture($aperture) { $this->aperture = $aperture; } public function getAperture() { return $this->aperture; } public function setCameraMake($cameraMake) { $this->cameraMake = $cameraMake; } public function getCameraMake() { return $this->cameraMake; } public function setCameraModel($cameraModel) { $this->cameraModel = $cameraModel; } public function getCameraModel() { return $this->cameraModel; } public function setColorSpace($colorSpace) { $this->colorSpace = $colorSpace; } public function getColorSpace() { return $this->colorSpace; } public function setDate($date) { $this->date = $date; } public function getDate() { return $this->date; } public function setExposureBias($exposureBias) { $this->exposureBias = $exposureBias; } public function getExposureBias() { return $this->exposureBias; } public function setExposureMode($exposureMode) { $this->exposureMode = $exposureMode; } public function getExposureMode() { return $this->exposureMode; } public function setExposureTime($exposureTime) { $this->exposureTime = $exposureTime; } public function getExposureTime() { return $this->exposureTime; } public function setFlashUsed($flashUsed) { $this->flashUsed = $flashUsed; } public function getFlashUsed() { return $this->flashUsed; } public function setFocalLength($focalLength) { $this->focalLength = $focalLength; } public function getFocalLength() { return $this->focalLength; } public function setHeight($height) { $this->height = $height; } public function getHeight() { return $this->height; } public function setIsoSpeed($isoSpeed) { $this->isoSpeed = $isoSpeed; } public function getIsoSpeed() { return $this->isoSpeed; } public function setLens($lens) { $this->lens = $lens; } public function getLens() { return $this->lens; } public function setLocation(UDP_Google_Service_Drive_DriveFileImageMediaMetadataLocation $location) { $this->location = $location; } public function getLocation() { return $this->location; } public function setMaxApertureValue($maxApertureValue) { $this->maxApertureValue = $maxApertureValue; } public function getMaxApertureValue() { return $this->maxApertureValue; } public function setMeteringMode($meteringMode) { $this->meteringMode = $meteringMode; } public function getMeteringMode() { return $this->meteringMode; } public function setRotation($rotation) { $this->rotation = $rotation; } public function getRotation() { return $this->rotation; } public function setSensor($sensor) { $this->sensor = $sensor; } public function getSensor() { return $this->sensor; } public function setSubjectDistance($subjectDistance) { $this->subjectDistance = $subjectDistance; } public function getSubjectDistance() { return $this->subjectDistance; } public function setWhiteBalance($whiteBalance) { $this->whiteBalance = $whiteBalance; } public function getWhiteBalance() { return $this->whiteBalance; } public function setWidth($width) { $this->width = $width; } public function getWidth() { return $this->width; } } class UDP_Google_Service_Drive_DriveFileImageMediaMetadataLocation extends Google_Model { protected $internal_gapi_mappings = array( ); public $altitude; public $latitude; public $longitude; public function setAltitude($altitude) { $this->altitude = $altitude; } public function getAltitude() { return $this->altitude; } public function setLatitude($latitude) { $this->latitude = $latitude; } public function getLatitude() { return $this->latitude; } public function setLongitude($longitude) { $this->longitude = $longitude; } public function getLongitude() { return $this->longitude; } } class UDP_Google_Service_Drive_DriveFileIndexableText extends Google_Model { protected $internal_gapi_mappings = array( ); public $text; public function setText($text) { $this->text = $text; } public function getText() { return $this->text; } } class UDP_Google_Service_Drive_DriveFileLabels extends Google_Model { protected $internal_gapi_mappings = array( ); public $hidden; public $restricted; public $starred; public $trashed; public $viewed; public function setHidden($hidden) { $this->hidden = $hidden; } public function getHidden() { return $this->hidden; } public function setRestricted($restricted) { $this->restricted = $restricted; } public function getRestricted() { return $this->restricted; } public function setStarred($starred) { $this->starred = $starred; } public function getStarred() { return $this->starred; } public function setTrashed($trashed) { $this->trashed = $trashed; } public function getTrashed() { return $this->trashed; } public function setViewed($viewed) { $this->viewed = $viewed; } public function getViewed() { return $this->viewed; } } class UDP_Google_Service_Drive_DriveFileOpenWithLinks extends Google_Model { } class UDP_Google_Service_Drive_DriveFileThumbnail extends Google_Model { protected $internal_gapi_mappings = array( ); public $image; public $mimeType; public function setImage($image) { $this->image = $image; } public function getImage() { return $this->image; } public function setMimeType($mimeType) { $this->mimeType = $mimeType; } public function getMimeType() { return $this->mimeType; } } class UDP_Google_Service_Drive_DriveFileVideoMediaMetadata extends Google_Model { protected $internal_gapi_mappings = array( ); public $durationMillis; public $height; public $width; public function setDurationMillis($durationMillis) { $this->durationMillis = $durationMillis; } public function getDurationMillis() { return $this->durationMillis; } public function setHeight($height) { $this->height = $height; } public function getHeight() { return $this->height; } public function setWidth($width) { $this->width = $width; } public function getWidth() { return $this->width; } } class Google_Service_Drive_FileList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $etag; protected $itemsType = 'UDP_Google_Service_Drive_DriveFile'; protected $itemsDataType = 'array'; public $kind; public $nextLink; public $nextPageToken; public $selfLink; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextLink($nextLink) { $this->nextLink = $nextLink; } public function getNextLink() { return $this->nextLink; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_ParentList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $etag; protected $itemsType = 'UDP_Google_Service_Drive_ParentReference'; protected $itemsDataType = 'array'; public $kind; public $selfLink; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class UDP_Google_Service_Drive_ParentReference extends Google_Model { protected $internal_gapi_mappings = array( ); public $id; public $isRoot; public $kind; public $parentLink; public $selfLink; public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setIsRoot($isRoot) { $this->isRoot = $isRoot; } public function getIsRoot() { return $this->isRoot; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setParentLink($parentLink) { $this->parentLink = $parentLink; } public function getParentLink() { return $this->parentLink; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_Permission extends Google_Collection { protected $collection_key = 'additionalRoles'; protected $internal_gapi_mappings = array( ); public $additionalRoles; public $authKey; public $domain; public $emailAddress; public $etag; public $id; public $kind; public $name; public $photoLink; public $role; public $selfLink; public $type; public $value; public $withLink; public function setAdditionalRoles($additionalRoles) { $this->additionalRoles = $additionalRoles; } public function getAdditionalRoles() { return $this->additionalRoles; } public function setAuthKey($authKey) { $this->authKey = $authKey; } public function getAuthKey() { return $this->authKey; } public function setDomain($domain) { $this->domain = $domain; } public function getDomain() { return $this->domain; } public function setEmailAddress($emailAddress) { $this->emailAddress = $emailAddress; } public function getEmailAddress() { return $this->emailAddress; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setPhotoLink($photoLink) { $this->photoLink = $photoLink; } public function getPhotoLink() { return $this->photoLink; } public function setRole($role) { $this->role = $role; } public function getRole() { return $this->role; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } public function setWithLink($withLink) { $this->withLink = $withLink; } public function getWithLink() { return $this->withLink; } } class Google_Service_Drive_PermissionId extends Google_Model { protected $internal_gapi_mappings = array( ); public $id; public $kind; public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_Drive_PermissionList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $etag; protected $itemsType = 'Google_Service_Drive_Permission'; protected $itemsDataType = 'array'; public $kind; public $selfLink; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_Property extends Google_Model { protected $internal_gapi_mappings = array( ); public $etag; public $key; public $kind; public $selfLink; public $value; public $visibility; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setKey($key) { $this->key = $key; } public function getKey() { return $this->key; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } public function setVisibility($visibility) { $this->visibility = $visibility; } public function getVisibility() { return $this->visibility; } } class Google_Service_Drive_PropertyList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $etag; protected $itemsType = 'Google_Service_Drive_Property'; protected $itemsDataType = 'array'; public $kind; public $selfLink; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_Revision extends Google_Model { protected $internal_gapi_mappings = array( ); public $downloadUrl; public $etag; public $exportLinks; public $fileSize; public $id; public $kind; protected $lastModifyingUserType = 'Google_Service_Drive_User'; protected $lastModifyingUserDataType = ''; public $lastModifyingUserName; public $md5Checksum; public $mimeType; public $modifiedDate; public $originalFilename; public $pinned; public $publishAuto; public $published; public $publishedLink; public $publishedOutsideDomain; public $selfLink; public function setDownloadUrl($downloadUrl) { $this->downloadUrl = $downloadUrl; } public function getDownloadUrl() { return $this->downloadUrl; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setExportLinks($exportLinks) { $this->exportLinks = $exportLinks; } public function getExportLinks() { return $this->exportLinks; } public function setFileSize($fileSize) { $this->fileSize = $fileSize; } public function getFileSize() { return $this->fileSize; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setLastModifyingUser(Google_Service_Drive_User $lastModifyingUser) { $this->lastModifyingUser = $lastModifyingUser; } public function getLastModifyingUser() { return $this->lastModifyingUser; } public function setLastModifyingUserName($lastModifyingUserName) { $this->lastModifyingUserName = $lastModifyingUserName; } public function getLastModifyingUserName() { return $this->lastModifyingUserName; } public function setMd5Checksum($md5Checksum) { $this->md5Checksum = $md5Checksum; } public function getMd5Checksum() { return $this->md5Checksum; } public function setMimeType($mimeType) { $this->mimeType = $mimeType; } public function getMimeType() { return $this->mimeType; } public function setModifiedDate($modifiedDate) { $this->modifiedDate = $modifiedDate; } public function getModifiedDate() { return $this->modifiedDate; } public function setOriginalFilename($originalFilename) { $this->originalFilename = $originalFilename; } public function getOriginalFilename() { return $this->originalFilename; } public function setPinned($pinned) { $this->pinned = $pinned; } public function getPinned() { return $this->pinned; } public function setPublishAuto($publishAuto) { $this->publishAuto = $publishAuto; } public function getPublishAuto() { return $this->publishAuto; } public function setPublished($published) { $this->published = $published; } public function getPublished() { return $this->published; } public function setPublishedLink($publishedLink) { $this->publishedLink = $publishedLink; } public function getPublishedLink() { return $this->publishedLink; } public function setPublishedOutsideDomain($publishedOutsideDomain) { $this->publishedOutsideDomain = $publishedOutsideDomain; } public function getPublishedOutsideDomain() { return $this->publishedOutsideDomain; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_RevisionExportLinks extends Google_Model { } class Google_Service_Drive_RevisionList extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $etag; protected $itemsType = 'Google_Service_Drive_Revision'; protected $itemsDataType = 'array'; public $kind; public $selfLink; public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Drive_User extends Google_Model { protected $internal_gapi_mappings = array( ); public $displayName; public $emailAddress; public $isAuthenticatedUser; public $kind; public $permissionId; protected $pictureType = 'Google_Service_Drive_UserPicture'; protected $pictureDataType = ''; public function setDisplayName($displayName) { $this->displayName = $displayName; } public function getDisplayName() { return $this->displayName; } public function setEmailAddress($emailAddress) { $this->emailAddress = $emailAddress; } public function getEmailAddress() { return $this->emailAddress; } public function setIsAuthenticatedUser($isAuthenticatedUser) { $this->isAuthenticatedUser = $isAuthenticatedUser; } public function getIsAuthenticatedUser() { return $this->isAuthenticatedUser; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setPermissionId($permissionId) { $this->permissionId = $permissionId; } public function getPermissionId() { return $this->permissionId; } public function setPicture(Google_Service_Drive_UserPicture $picture) { $this->picture = $picture; } public function getPicture() { return $this->picture; } } class Google_Service_Drive_UserPicture extends Google_Model { protected $internal_gapi_mappings = array( ); public $url; public function setUrl($url) { $this->url = $url; } public function getUrl() { return $this->url; } } PKwL\tV!!0updraftplus/includes/Google/Service/Resource.phpnu[ array('type' => 'string', 'location' => 'query'), 'fields' => array('type' => 'string', 'location' => 'query'), 'trace' => array('type' => 'string', 'location' => 'query'), 'userIp' => array('type' => 'string', 'location' => 'query'), 'quotaUser' => array('type' => 'string', 'location' => 'query'), 'data' => array('type' => 'string', 'location' => 'body'), 'mimeType' => array('type' => 'string', 'location' => 'header'), 'uploadType' => array('type' => 'string', 'location' => 'query'), 'mediaUpload' => array('type' => 'complex', 'location' => 'query'), 'prettyPrint' => array('type' => 'string', 'location' => 'query'), ); /** @var string $rootUrl */ private $rootUrl; /** @var Google_Client $client */ private $client; /** @var string $serviceName */ private $serviceName; /** @var string $servicePath */ private $servicePath; /** @var string $resourceName */ private $resourceName; /** @var array $methods */ private $methods; public function __construct($service, $serviceName, $resourceName, $resource) { $this->rootUrl = $service->rootUrl; $this->client = $service->getClient(); $this->servicePath = $service->servicePath; $this->serviceName = $serviceName; $this->resourceName = $resourceName; $this->methods = is_array($resource) && isset($resource['methods']) ? $resource['methods'] : array($resourceName => $resource); } /** * TODO(ianbarber): This function needs simplifying. * @param $name * @param $arguments * @param $expected_class - optional, the expected class name * @return Google_Http_Request|expected_class * @throws Google_Exception */ public function call($name, $arguments, $expected_class = null) { if (! isset($this->methods[$name])) { $this->client->getLogger()->error( 'Service method unknown', array( 'service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name ) ); throw new Google_Exception( "Unknown function: " . "{$this->serviceName}->{$this->resourceName}->{$name}()" ); } $method = $this->methods[$name]; $parameters = $arguments[0]; // postBody is a special case since it's not defined in the discovery // document as parameter, but we abuse the param entry for storing it. $postBody = null; if (isset($parameters['postBody'])) { if ($parameters['postBody'] instanceof Google_Model) { // In the cases the post body is an existing object, we want // to use the smart method to create a simple object for // for JSONification. $parameters['postBody'] = $parameters['postBody']->toSimpleObject(); } else if (is_object($parameters['postBody'])) { // If the post body is another kind of object, we will try and // wrangle it into a sensible format. $parameters['postBody'] = $this->convertToArrayAndStripNulls($parameters['postBody']); } $postBody = json_encode($parameters['postBody']); unset($parameters['postBody']); } // TODO(ianbarber): optParams here probably should have been // handled already - this may well be redundant code. if (isset($parameters['optParams'])) { $optParams = $parameters['optParams']; unset($parameters['optParams']); $parameters = array_merge($parameters, $optParams); } if (!isset($method['parameters'])) { $method['parameters'] = array(); } $method['parameters'] = array_merge( $method['parameters'], $this->stackParameters ); foreach ($parameters as $key => $val) { if ($key != 'postBody' && ! isset($method['parameters'][$key])) { $this->client->getLogger()->error( 'Service parameter unknown', array( 'service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name, 'parameter' => $key ) ); throw new Google_Exception("($name) unknown parameter: '$key'"); } } foreach ($method['parameters'] as $paramName => $paramSpec) { if (isset($paramSpec['required']) && $paramSpec['required'] && ! isset($parameters[$paramName]) ) { $this->client->getLogger()->error( 'Service parameter missing', array( 'service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name, 'parameter' => $paramName ) ); throw new Google_Exception("($name) missing required param: '$paramName'"); } if (isset($parameters[$paramName])) { $value = $parameters[$paramName]; $parameters[$paramName] = $paramSpec; $parameters[$paramName]['value'] = $value; unset($parameters[$paramName]['required']); } else { // Ensure we don't pass nulls. unset($parameters[$paramName]); } } $this->client->getLogger()->info( 'Service Call', array( 'service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name, 'arguments' => $parameters, ) ); $url = UDP_Google_Http_REST::createRequestUri( $this->servicePath, $method['path'], $parameters ); $httpRequest = new UDP_Google_Http_Request( $url, $method['httpMethod'], null, $postBody ); if ($this->rootUrl) { $httpRequest->setBaseComponent($this->rootUrl); } else { $httpRequest->setBaseComponent($this->client->getBasePath()); } if ($postBody) { $contentTypeHeader = array(); $contentTypeHeader['content-type'] = 'application/json; charset=UTF-8'; $httpRequest->setRequestHeaders($contentTypeHeader); $httpRequest->setPostBody($postBody); } $httpRequest = $this->client->getAuth()->sign($httpRequest); $httpRequest->setExpectedClass($expected_class); if (isset($parameters['data']) && ($parameters['uploadType']['value'] == 'media' || $parameters['uploadType']['value'] == 'multipart')) { // If we are doing a simple media upload, trigger that as a convenience. $mfu = new Google_Http_MediaFileUpload( $this->client, $httpRequest, isset($parameters['mimeType']) ? $parameters['mimeType']['value'] : 'application/octet-stream', $parameters['data']['value'] ); } if (isset($parameters['alt']) && $parameters['alt']['value'] == 'media') { $httpRequest->enableExpectedRaw(); } if ($this->client->shouldDefer()) { // If we are in batch or upload mode, return the raw request. return $httpRequest; } return $this->client->execute($httpRequest); } protected function convertToArrayAndStripNulls($o) { $o = (array) $o; foreach ($o as $k => $v) { if ($v === null) { unset($o[$k]); } elseif (is_object($v) || is_array($v)) { $o[$k] = $this->convertToArrayAndStripNulls($o[$k]); } } return $o; } } PKwL\/,hh3updraftplus/includes/Google/Service/Cloudsearch.phpnu[ * The Google Cloud Search API defines an application interface to index * documents that contain structured data and to search those indexes. It * supports full text search.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Google_Service_Cloudsearch extends UDP_Google_Service { /** * Constructs the internal representation of the Cloudsearch service. * * @param Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = ''; $this->version = 'v1'; $this->serviceName = 'cloudsearch'; } } PKwL\".P}}/updraftplus/includes/Google/Service/Manager.phpnu[ * The Deployment Manager API allows users to declaratively configure, deploy * and run complex solutions on the Google Cloud Platform.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Google_Service_Manager extends UDP_Google_Service { /** View and manage your applications deployed on Google App Engine. */ const APPENGINE_ADMIN = "https://www.googleapis.com/auth/appengine.admin"; /** View and manage your data across Google Cloud Platform services. */ const CLOUD_PLATFORM = "https://www.googleapis.com/auth/cloud-platform"; /** View and manage your Google Compute Engine resources. */ const COMPUTE = "https://www.googleapis.com/auth/compute"; /** Manage your data in Google Cloud Storage. */ const DEVSTORAGE_READ_WRITE = "https://www.googleapis.com/auth/devstorage.read_write"; /** View and manage your Google Cloud Platform management resources and deployment status information. */ const NDEV_CLOUDMAN = "https://www.googleapis.com/auth/ndev.cloudman"; /** View your Google Cloud Platform management resources and deployment status information. */ const NDEV_CLOUDMAN_READONLY = "https://www.googleapis.com/auth/ndev.cloudman.readonly"; public $deployments; public $templates; /** * Constructs the internal representation of the Manager service. * * @param Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = 'manager/v1beta2/projects/'; $this->version = 'v1beta2'; $this->serviceName = 'manager'; $this->deployments = new Google_Service_Manager_Deployments_Resource( $this, $this->serviceName, 'deployments', array( 'methods' => array( 'delete' => array( 'path' => '{projectId}/regions/{region}/deployments/{deploymentName}', 'httpMethod' => 'DELETE', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'region' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deploymentName' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => '{projectId}/regions/{region}/deployments/{deploymentName}', 'httpMethod' => 'GET', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'region' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deploymentName' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => '{projectId}/regions/{region}/deployments', 'httpMethod' => 'POST', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'region' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{projectId}/regions/{region}/deployments', 'httpMethod' => 'GET', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'region' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->templates = new Google_Service_Manager_Templates_Resource( $this, $this->serviceName, 'templates', array( 'methods' => array( 'delete' => array( 'path' => '{projectId}/templates/{templateName}', 'httpMethod' => 'DELETE', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'templateName' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => '{projectId}/templates/{templateName}', 'httpMethod' => 'GET', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'templateName' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => '{projectId}/templates', 'httpMethod' => 'POST', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{projectId}/templates', 'httpMethod' => 'GET', 'parameters' => array( 'projectId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); } } /** * The "deployments" collection of methods. * Typical usage is: * * $managerService = new Google_Service_Manager(...); * $deployments = $managerService->deployments; * */ class Google_Service_Manager_Deployments_Resource extends UDP_Google_Service_Resource { /** * (deployments.delete) * * @param string $projectId * @param string $region * @param string $deploymentName * @param array $optParams Optional parameters. */ public function delete($projectId, $region, $deploymentName, $optParams = array()) { $params = array('projectId' => $projectId, 'region' => $region, 'deploymentName' => $deploymentName); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * (deployments.get) * * @param string $projectId * @param string $region * @param string $deploymentName * @param array $optParams Optional parameters. * @return Google_Service_Manager_Deployment */ public function get($projectId, $region, $deploymentName, $optParams = array()) { $params = array('projectId' => $projectId, 'region' => $region, 'deploymentName' => $deploymentName); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Manager_Deployment"); } /** * (deployments.insert) * * @param string $projectId * @param string $region * @param Google_Deployment $postBody * @param array $optParams Optional parameters. * @return Google_Service_Manager_Deployment */ public function insert($projectId, $region, Google_Service_Manager_Deployment $postBody, $optParams = array()) { $params = array('projectId' => $projectId, 'region' => $region, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Manager_Deployment"); } /** * (deployments.listDeployments) * * @param string $projectId * @param string $region * @param array $optParams Optional parameters. * * @opt_param string pageToken Specifies a nextPageToken returned by a previous * list request. This token can be used to request the next page of results from * a previous list request. * @opt_param int maxResults Maximum count of results to be returned. Acceptable * values are 0 to 100, inclusive. (Default: 50) * @return Google_Service_Manager_DeploymentsListResponse */ public function listDeployments($projectId, $region, $optParams = array()) { $params = array('projectId' => $projectId, 'region' => $region); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Manager_DeploymentsListResponse"); } } /** * The "templates" collection of methods. * Typical usage is: * * $managerService = new Google_Service_Manager(...); * $templates = $managerService->templates; * */ class Google_Service_Manager_Templates_Resource extends UDP_Google_Service_Resource { /** * (templates.delete) * * @param string $projectId * @param string $templateName * @param array $optParams Optional parameters. */ public function delete($projectId, $templateName, $optParams = array()) { $params = array('projectId' => $projectId, 'templateName' => $templateName); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * (templates.get) * * @param string $projectId * @param string $templateName * @param array $optParams Optional parameters. * @return Google_Service_Manager_Template */ public function get($projectId, $templateName, $optParams = array()) { $params = array('projectId' => $projectId, 'templateName' => $templateName); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Manager_Template"); } /** * (templates.insert) * * @param string $projectId * @param Google_Template $postBody * @param array $optParams Optional parameters. * @return Google_Service_Manager_Template */ public function insert($projectId, Google_Service_Manager_Template $postBody, $optParams = array()) { $params = array('projectId' => $projectId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Manager_Template"); } /** * (templates.listTemplates) * * @param string $projectId * @param array $optParams Optional parameters. * * @opt_param string pageToken Specifies a nextPageToken returned by a previous * list request. This token can be used to request the next page of results from * a previous list request. * @opt_param int maxResults Maximum count of results to be returned. Acceptable * values are 0 to 100, inclusive. (Default: 50) * @return Google_Service_Manager_TemplatesListResponse */ public function listTemplates($projectId, $optParams = array()) { $params = array('projectId' => $projectId); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Manager_TemplatesListResponse"); } } class Google_Service_Manager_AccessConfig extends Google_Model { protected $internal_gapi_mappings = array( ); public $name; public $natIp; public $type; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setNatIp($natIp) { $this->natIp = $natIp; } public function getNatIp() { return $this->natIp; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Manager_Action extends Google_Collection { protected $collection_key = 'commands'; protected $internal_gapi_mappings = array( ); public $commands; public $timeoutMs; public function setCommands($commands) { $this->commands = $commands; } public function getCommands() { return $this->commands; } public function setTimeoutMs($timeoutMs) { $this->timeoutMs = $timeoutMs; } public function getTimeoutMs() { return $this->timeoutMs; } } class Google_Service_Manager_AllowedRule extends Google_Collection { protected $collection_key = 'ports'; protected $internal_gapi_mappings = array( "iPProtocol" => "IPProtocol", ); public $iPProtocol; public $ports; public function setIPProtocol($iPProtocol) { $this->iPProtocol = $iPProtocol; } public function getIPProtocol() { return $this->iPProtocol; } public function setPorts($ports) { $this->ports = $ports; } public function getPorts() { return $this->ports; } } class Google_Service_Manager_AutoscalingModule extends Google_Model { protected $internal_gapi_mappings = array( ); public $coolDownPeriodSec; public $description; public $maxNumReplicas; public $minNumReplicas; public $signalType; public $targetModule; public $targetUtilization; public function setCoolDownPeriodSec($coolDownPeriodSec) { $this->coolDownPeriodSec = $coolDownPeriodSec; } public function getCoolDownPeriodSec() { return $this->coolDownPeriodSec; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setMaxNumReplicas($maxNumReplicas) { $this->maxNumReplicas = $maxNumReplicas; } public function getMaxNumReplicas() { return $this->maxNumReplicas; } public function setMinNumReplicas($minNumReplicas) { $this->minNumReplicas = $minNumReplicas; } public function getMinNumReplicas() { return $this->minNumReplicas; } public function setSignalType($signalType) { $this->signalType = $signalType; } public function getSignalType() { return $this->signalType; } public function setTargetModule($targetModule) { $this->targetModule = $targetModule; } public function getTargetModule() { return $this->targetModule; } public function setTargetUtilization($targetUtilization) { $this->targetUtilization = $targetUtilization; } public function getTargetUtilization() { return $this->targetUtilization; } } class Google_Service_Manager_AutoscalingModuleStatus extends Google_Model { protected $internal_gapi_mappings = array( ); public $autoscalingConfigUrl; public function setAutoscalingConfigUrl($autoscalingConfigUrl) { $this->autoscalingConfigUrl = $autoscalingConfigUrl; } public function getAutoscalingConfigUrl() { return $this->autoscalingConfigUrl; } } class Google_Service_Manager_DeployState extends Google_Model { protected $internal_gapi_mappings = array( ); public $details; public $status; public function setDetails($details) { $this->details = $details; } public function getDetails() { return $this->details; } public function setStatus($status) { $this->status = $status; } public function getStatus() { return $this->status; } } class Google_Service_Manager_Deployment extends Google_Collection { protected $collection_key = 'overrides'; protected $internal_gapi_mappings = array( ); public $creationDate; public $description; protected $modulesType = 'Google_Service_Manager_ModuleStatus'; protected $modulesDataType = 'map'; public $name; protected $overridesType = 'Google_Service_Manager_ParamOverride'; protected $overridesDataType = 'array'; protected $stateType = 'Google_Service_Manager_DeployState'; protected $stateDataType = ''; public $templateName; public function setCreationDate($creationDate) { $this->creationDate = $creationDate; } public function getCreationDate() { return $this->creationDate; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setModules($modules) { $this->modules = $modules; } public function getModules() { return $this->modules; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setOverrides($overrides) { $this->overrides = $overrides; } public function getOverrides() { return $this->overrides; } public function setState(Google_Service_Manager_DeployState $state) { $this->state = $state; } public function getState() { return $this->state; } public function setTemplateName($templateName) { $this->templateName = $templateName; } public function getTemplateName() { return $this->templateName; } } class Google_Service_Manager_DeploymentModules extends Google_Model { } class Google_Service_Manager_DeploymentsListResponse extends Google_Collection { protected $collection_key = 'resources'; protected $internal_gapi_mappings = array( ); public $nextPageToken; protected $resourcesType = 'Google_Service_Manager_Deployment'; protected $resourcesDataType = 'array'; public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setResources($resources) { $this->resources = $resources; } public function getResources() { return $this->resources; } } class Google_Service_Manager_DiskAttachment extends Google_Model { protected $internal_gapi_mappings = array( ); public $deviceName; public $index; public function setDeviceName($deviceName) { $this->deviceName = $deviceName; } public function getDeviceName() { return $this->deviceName; } public function setIndex($index) { $this->index = $index; } public function getIndex() { return $this->index; } } class Google_Service_Manager_EnvVariable extends Google_Model { protected $internal_gapi_mappings = array( ); public $hidden; public $value; public function setHidden($hidden) { $this->hidden = $hidden; } public function getHidden() { return $this->hidden; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_Manager_ExistingDisk extends Google_Model { protected $internal_gapi_mappings = array( ); protected $attachmentType = 'Google_Service_Manager_DiskAttachment'; protected $attachmentDataType = ''; public $source; public function setAttachment(Google_Service_Manager_DiskAttachment $attachment) { $this->attachment = $attachment; } public function getAttachment() { return $this->attachment; } public function setSource($source) { $this->source = $source; } public function getSource() { return $this->source; } } class Google_Service_Manager_FirewallModule extends Google_Collection { protected $collection_key = 'targetTags'; protected $internal_gapi_mappings = array( ); protected $allowedType = 'Google_Service_Manager_AllowedRule'; protected $allowedDataType = 'array'; public $description; public $network; public $sourceRanges; public $sourceTags; public $targetTags; public function setAllowed($allowed) { $this->allowed = $allowed; } public function getAllowed() { return $this->allowed; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setNetwork($network) { $this->network = $network; } public function getNetwork() { return $this->network; } public function setSourceRanges($sourceRanges) { $this->sourceRanges = $sourceRanges; } public function getSourceRanges() { return $this->sourceRanges; } public function setSourceTags($sourceTags) { $this->sourceTags = $sourceTags; } public function getSourceTags() { return $this->sourceTags; } public function setTargetTags($targetTags) { $this->targetTags = $targetTags; } public function getTargetTags() { return $this->targetTags; } } class Google_Service_Manager_FirewallModuleStatus extends Google_Model { protected $internal_gapi_mappings = array( ); public $firewallUrl; public function setFirewallUrl($firewallUrl) { $this->firewallUrl = $firewallUrl; } public function getFirewallUrl() { return $this->firewallUrl; } } class Google_Service_Manager_HealthCheckModule extends Google_Model { protected $internal_gapi_mappings = array( ); public $checkIntervalSec; public $description; public $healthyThreshold; public $host; public $path; public $port; public $timeoutSec; public $unhealthyThreshold; public function setCheckIntervalSec($checkIntervalSec) { $this->checkIntervalSec = $checkIntervalSec; } public function getCheckIntervalSec() { return $this->checkIntervalSec; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setHealthyThreshold($healthyThreshold) { $this->healthyThreshold = $healthyThreshold; } public function getHealthyThreshold() { return $this->healthyThreshold; } public function setHost($host) { $this->host = $host; } public function getHost() { return $this->host; } public function setPath($path) { $this->path = $path; } public function getPath() { return $this->path; } public function setPort($port) { $this->port = $port; } public function getPort() { return $this->port; } public function setTimeoutSec($timeoutSec) { $this->timeoutSec = $timeoutSec; } public function getTimeoutSec() { return $this->timeoutSec; } public function setUnhealthyThreshold($unhealthyThreshold) { $this->unhealthyThreshold = $unhealthyThreshold; } public function getUnhealthyThreshold() { return $this->unhealthyThreshold; } } class Google_Service_Manager_HealthCheckModuleStatus extends Google_Model { protected $internal_gapi_mappings = array( ); public $healthCheckUrl; public function setHealthCheckUrl($healthCheckUrl) { $this->healthCheckUrl = $healthCheckUrl; } public function getHealthCheckUrl() { return $this->healthCheckUrl; } } class Google_Service_Manager_LbModule extends Google_Collection { protected $collection_key = 'targetModules'; protected $internal_gapi_mappings = array( ); public $description; public $healthChecks; public $ipAddress; public $ipProtocol; public $portRange; public $sessionAffinity; public $targetModules; public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setHealthChecks($healthChecks) { $this->healthChecks = $healthChecks; } public function getHealthChecks() { return $this->healthChecks; } public function setIpAddress($ipAddress) { $this->ipAddress = $ipAddress; } public function getIpAddress() { return $this->ipAddress; } public function setIpProtocol($ipProtocol) { $this->ipProtocol = $ipProtocol; } public function getIpProtocol() { return $this->ipProtocol; } public function setPortRange($portRange) { $this->portRange = $portRange; } public function getPortRange() { return $this->portRange; } public function setSessionAffinity($sessionAffinity) { $this->sessionAffinity = $sessionAffinity; } public function getSessionAffinity() { return $this->sessionAffinity; } public function setTargetModules($targetModules) { $this->targetModules = $targetModules; } public function getTargetModules() { return $this->targetModules; } } class Google_Service_Manager_LbModuleStatus extends Google_Model { protected $internal_gapi_mappings = array( ); public $forwardingRuleUrl; public $targetPoolUrl; public function setForwardingRuleUrl($forwardingRuleUrl) { $this->forwardingRuleUrl = $forwardingRuleUrl; } public function getForwardingRuleUrl() { return $this->forwardingRuleUrl; } public function setTargetPoolUrl($targetPoolUrl) { $this->targetPoolUrl = $targetPoolUrl; } public function getTargetPoolUrl() { return $this->targetPoolUrl; } } class Google_Service_Manager_Metadata extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $fingerPrint; protected $itemsType = 'Google_Service_Manager_MetadataItem'; protected $itemsDataType = 'array'; public function setFingerPrint($fingerPrint) { $this->fingerPrint = $fingerPrint; } public function getFingerPrint() { return $this->fingerPrint; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } } class Google_Service_Manager_MetadataItem extends Google_Model { protected $internal_gapi_mappings = array( ); public $key; public $value; public function setKey($key) { $this->key = $key; } public function getKey() { return $this->key; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_Manager_Module extends Google_Model { protected $internal_gapi_mappings = array( ); protected $autoscalingModuleType = 'Google_Service_Manager_AutoscalingModule'; protected $autoscalingModuleDataType = ''; protected $firewallModuleType = 'Google_Service_Manager_FirewallModule'; protected $firewallModuleDataType = ''; protected $healthCheckModuleType = 'Google_Service_Manager_HealthCheckModule'; protected $healthCheckModuleDataType = ''; protected $lbModuleType = 'Google_Service_Manager_LbModule'; protected $lbModuleDataType = ''; protected $networkModuleType = 'Google_Service_Manager_NetworkModule'; protected $networkModuleDataType = ''; protected $replicaPoolModuleType = 'Google_Service_Manager_ReplicaPoolModule'; protected $replicaPoolModuleDataType = ''; public $type; public function setAutoscalingModule(Google_Service_Manager_AutoscalingModule $autoscalingModule) { $this->autoscalingModule = $autoscalingModule; } public function getAutoscalingModule() { return $this->autoscalingModule; } public function setFirewallModule(Google_Service_Manager_FirewallModule $firewallModule) { $this->firewallModule = $firewallModule; } public function getFirewallModule() { return $this->firewallModule; } public function setHealthCheckModule(Google_Service_Manager_HealthCheckModule $healthCheckModule) { $this->healthCheckModule = $healthCheckModule; } public function getHealthCheckModule() { return $this->healthCheckModule; } public function setLbModule(Google_Service_Manager_LbModule $lbModule) { $this->lbModule = $lbModule; } public function getLbModule() { return $this->lbModule; } public function setNetworkModule(Google_Service_Manager_NetworkModule $networkModule) { $this->networkModule = $networkModule; } public function getNetworkModule() { return $this->networkModule; } public function setReplicaPoolModule(Google_Service_Manager_ReplicaPoolModule $replicaPoolModule) { $this->replicaPoolModule = $replicaPoolModule; } public function getReplicaPoolModule() { return $this->replicaPoolModule; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Manager_ModuleStatus extends Google_Model { protected $internal_gapi_mappings = array( ); protected $autoscalingModuleStatusType = 'Google_Service_Manager_AutoscalingModuleStatus'; protected $autoscalingModuleStatusDataType = ''; protected $firewallModuleStatusType = 'Google_Service_Manager_FirewallModuleStatus'; protected $firewallModuleStatusDataType = ''; protected $healthCheckModuleStatusType = 'Google_Service_Manager_HealthCheckModuleStatus'; protected $healthCheckModuleStatusDataType = ''; protected $lbModuleStatusType = 'Google_Service_Manager_LbModuleStatus'; protected $lbModuleStatusDataType = ''; protected $networkModuleStatusType = 'Google_Service_Manager_NetworkModuleStatus'; protected $networkModuleStatusDataType = ''; protected $replicaPoolModuleStatusType = 'Google_Service_Manager_ReplicaPoolModuleStatus'; protected $replicaPoolModuleStatusDataType = ''; protected $stateType = 'Google_Service_Manager_DeployState'; protected $stateDataType = ''; public $type; public function setAutoscalingModuleStatus(Google_Service_Manager_AutoscalingModuleStatus $autoscalingModuleStatus) { $this->autoscalingModuleStatus = $autoscalingModuleStatus; } public function getAutoscalingModuleStatus() { return $this->autoscalingModuleStatus; } public function setFirewallModuleStatus(Google_Service_Manager_FirewallModuleStatus $firewallModuleStatus) { $this->firewallModuleStatus = $firewallModuleStatus; } public function getFirewallModuleStatus() { return $this->firewallModuleStatus; } public function setHealthCheckModuleStatus(Google_Service_Manager_HealthCheckModuleStatus $healthCheckModuleStatus) { $this->healthCheckModuleStatus = $healthCheckModuleStatus; } public function getHealthCheckModuleStatus() { return $this->healthCheckModuleStatus; } public function setLbModuleStatus(Google_Service_Manager_LbModuleStatus $lbModuleStatus) { $this->lbModuleStatus = $lbModuleStatus; } public function getLbModuleStatus() { return $this->lbModuleStatus; } public function setNetworkModuleStatus(Google_Service_Manager_NetworkModuleStatus $networkModuleStatus) { $this->networkModuleStatus = $networkModuleStatus; } public function getNetworkModuleStatus() { return $this->networkModuleStatus; } public function setReplicaPoolModuleStatus(Google_Service_Manager_ReplicaPoolModuleStatus $replicaPoolModuleStatus) { $this->replicaPoolModuleStatus = $replicaPoolModuleStatus; } public function getReplicaPoolModuleStatus() { return $this->replicaPoolModuleStatus; } public function setState(Google_Service_Manager_DeployState $state) { $this->state = $state; } public function getState() { return $this->state; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Manager_NetworkInterface extends Google_Collection { protected $collection_key = 'accessConfigs'; protected $internal_gapi_mappings = array( ); protected $accessConfigsType = 'Google_Service_Manager_AccessConfig'; protected $accessConfigsDataType = 'array'; public $name; public $network; public $networkIp; public function setAccessConfigs($accessConfigs) { $this->accessConfigs = $accessConfigs; } public function getAccessConfigs() { return $this->accessConfigs; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setNetwork($network) { $this->network = $network; } public function getNetwork() { return $this->network; } public function setNetworkIp($networkIp) { $this->networkIp = $networkIp; } public function getNetworkIp() { return $this->networkIp; } } class Google_Service_Manager_NetworkModule extends Google_Model { protected $internal_gapi_mappings = array( "iPv4Range" => "IPv4Range", ); public $iPv4Range; public $description; public $gatewayIPv4; public function setIPv4Range($iPv4Range) { $this->iPv4Range = $iPv4Range; } public function getIPv4Range() { return $this->iPv4Range; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setGatewayIPv4($gatewayIPv4) { $this->gatewayIPv4 = $gatewayIPv4; } public function getGatewayIPv4() { return $this->gatewayIPv4; } } class Google_Service_Manager_NetworkModuleStatus extends Google_Model { protected $internal_gapi_mappings = array( ); public $networkUrl; public function setNetworkUrl($networkUrl) { $this->networkUrl = $networkUrl; } public function getNetworkUrl() { return $this->networkUrl; } } class Google_Service_Manager_NewDisk extends Google_Model { protected $internal_gapi_mappings = array( ); protected $attachmentType = 'Google_Service_Manager_DiskAttachment'; protected $attachmentDataType = ''; public $autoDelete; public $boot; protected $initializeParamsType = 'Google_Service_Manager_NewDiskInitializeParams'; protected $initializeParamsDataType = ''; public function setAttachment(Google_Service_Manager_DiskAttachment $attachment) { $this->attachment = $attachment; } public function getAttachment() { return $this->attachment; } public function setAutoDelete($autoDelete) { $this->autoDelete = $autoDelete; } public function getAutoDelete() { return $this->autoDelete; } public function setBoot($boot) { $this->boot = $boot; } public function getBoot() { return $this->boot; } public function setInitializeParams(Google_Service_Manager_NewDiskInitializeParams $initializeParams) { $this->initializeParams = $initializeParams; } public function getInitializeParams() { return $this->initializeParams; } } class Google_Service_Manager_NewDiskInitializeParams extends Google_Model { protected $internal_gapi_mappings = array( ); public $diskSizeGb; public $diskType; public $sourceImage; public function setDiskSizeGb($diskSizeGb) { $this->diskSizeGb = $diskSizeGb; } public function getDiskSizeGb() { return $this->diskSizeGb; } public function setDiskType($diskType) { $this->diskType = $diskType; } public function getDiskType() { return $this->diskType; } public function setSourceImage($sourceImage) { $this->sourceImage = $sourceImage; } public function getSourceImage() { return $this->sourceImage; } } class Google_Service_Manager_ParamOverride extends Google_Model { protected $internal_gapi_mappings = array( ); public $path; public $value; public function setPath($path) { $this->path = $path; } public function getPath() { return $this->path; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_Manager_ReplicaPoolModule extends Google_Collection { protected $collection_key = 'healthChecks'; protected $internal_gapi_mappings = array( ); protected $envVariablesType = 'Google_Service_Manager_EnvVariable'; protected $envVariablesDataType = 'map'; public $healthChecks; public $numReplicas; protected $replicaPoolParamsType = 'Google_Service_Manager_ReplicaPoolParams'; protected $replicaPoolParamsDataType = ''; public $resourceView; public function setEnvVariables($envVariables) { $this->envVariables = $envVariables; } public function getEnvVariables() { return $this->envVariables; } public function setHealthChecks($healthChecks) { $this->healthChecks = $healthChecks; } public function getHealthChecks() { return $this->healthChecks; } public function setNumReplicas($numReplicas) { $this->numReplicas = $numReplicas; } public function getNumReplicas() { return $this->numReplicas; } public function setReplicaPoolParams(Google_Service_Manager_ReplicaPoolParams $replicaPoolParams) { $this->replicaPoolParams = $replicaPoolParams; } public function getReplicaPoolParams() { return $this->replicaPoolParams; } public function setResourceView($resourceView) { $this->resourceView = $resourceView; } public function getResourceView() { return $this->resourceView; } } class Google_Service_Manager_ReplicaPoolModuleEnvVariables extends Google_Model { } class Google_Service_Manager_ReplicaPoolModuleStatus extends Google_Model { protected $internal_gapi_mappings = array( ); public $replicaPoolUrl; public $resourceViewUrl; public function setReplicaPoolUrl($replicaPoolUrl) { $this->replicaPoolUrl = $replicaPoolUrl; } public function getReplicaPoolUrl() { return $this->replicaPoolUrl; } public function setResourceViewUrl($resourceViewUrl) { $this->resourceViewUrl = $resourceViewUrl; } public function getResourceViewUrl() { return $this->resourceViewUrl; } } class Google_Service_Manager_ReplicaPoolParams extends Google_Model { protected $internal_gapi_mappings = array( ); protected $v1beta1Type = 'Google_Service_Manager_ReplicaPoolParamsV1Beta1'; protected $v1beta1DataType = ''; public function setV1beta1(Google_Service_Manager_ReplicaPoolParamsV1Beta1 $v1beta1) { $this->v1beta1 = $v1beta1; } public function getV1beta1() { return $this->v1beta1; } } class Google_Service_Manager_ReplicaPoolParamsV1Beta1 extends Google_Collection { protected $collection_key = 'serviceAccounts'; protected $internal_gapi_mappings = array( ); public $autoRestart; public $baseInstanceName; public $canIpForward; public $description; protected $disksToAttachType = 'Google_Service_Manager_ExistingDisk'; protected $disksToAttachDataType = 'array'; protected $disksToCreateType = 'Google_Service_Manager_NewDisk'; protected $disksToCreateDataType = 'array'; public $initAction; public $machineType; protected $metadataType = 'Google_Service_Manager_Metadata'; protected $metadataDataType = ''; protected $networkInterfacesType = 'Google_Service_Manager_NetworkInterface'; protected $networkInterfacesDataType = 'array'; public $onHostMaintenance; protected $serviceAccountsType = 'Google_Service_Manager_ServiceAccount'; protected $serviceAccountsDataType = 'array'; protected $tagsType = 'Google_Service_Manager_Tag'; protected $tagsDataType = ''; public $zone; public function setAutoRestart($autoRestart) { $this->autoRestart = $autoRestart; } public function getAutoRestart() { return $this->autoRestart; } public function setBaseInstanceName($baseInstanceName) { $this->baseInstanceName = $baseInstanceName; } public function getBaseInstanceName() { return $this->baseInstanceName; } public function setCanIpForward($canIpForward) { $this->canIpForward = $canIpForward; } public function getCanIpForward() { return $this->canIpForward; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setDisksToAttach($disksToAttach) { $this->disksToAttach = $disksToAttach; } public function getDisksToAttach() { return $this->disksToAttach; } public function setDisksToCreate($disksToCreate) { $this->disksToCreate = $disksToCreate; } public function getDisksToCreate() { return $this->disksToCreate; } public function setInitAction($initAction) { $this->initAction = $initAction; } public function getInitAction() { return $this->initAction; } public function setMachineType($machineType) { $this->machineType = $machineType; } public function getMachineType() { return $this->machineType; } public function setMetadata(Google_Service_Manager_Metadata $metadata) { $this->metadata = $metadata; } public function getMetadata() { return $this->metadata; } public function setNetworkInterfaces($networkInterfaces) { $this->networkInterfaces = $networkInterfaces; } public function getNetworkInterfaces() { return $this->networkInterfaces; } public function setOnHostMaintenance($onHostMaintenance) { $this->onHostMaintenance = $onHostMaintenance; } public function getOnHostMaintenance() { return $this->onHostMaintenance; } public function setServiceAccounts($serviceAccounts) { $this->serviceAccounts = $serviceAccounts; } public function getServiceAccounts() { return $this->serviceAccounts; } public function setTags(Google_Service_Manager_Tag $tags) { $this->tags = $tags; } public function getTags() { return $this->tags; } public function setZone($zone) { $this->zone = $zone; } public function getZone() { return $this->zone; } } class Google_Service_Manager_ServiceAccount extends Google_Collection { protected $collection_key = 'scopes'; protected $internal_gapi_mappings = array( ); public $email; public $scopes; public function setEmail($email) { $this->email = $email; } public function getEmail() { return $this->email; } public function setScopes($scopes) { $this->scopes = $scopes; } public function getScopes() { return $this->scopes; } } class Google_Service_Manager_Tag extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $fingerPrint; public $items; public function setFingerPrint($fingerPrint) { $this->fingerPrint = $fingerPrint; } public function getFingerPrint() { return $this->fingerPrint; } public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } } class Google_Service_Manager_Template extends Google_Model { protected $internal_gapi_mappings = array( ); protected $actionsType = 'Google_Service_Manager_Action'; protected $actionsDataType = 'map'; public $description; protected $modulesType = 'Google_Service_Manager_Module'; protected $modulesDataType = 'map'; public $name; public function setActions($actions) { $this->actions = $actions; } public function getActions() { return $this->actions; } public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setModules($modules) { $this->modules = $modules; } public function getModules() { return $this->modules; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Google_Service_Manager_TemplateActions extends Google_Model { } class Google_Service_Manager_TemplateModules extends Google_Model { } class Google_Service_Manager_TemplatesListResponse extends Google_Collection { protected $collection_key = 'resources'; protected $internal_gapi_mappings = array( ); public $nextPageToken; protected $resourcesType = 'Google_Service_Manager_Template'; protected $resourcesDataType = 'array'; public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setResources($resources) { $this->resources = $resources; } public function getResources() { return $this->resources; } } PKwL\4ܞ77/updraftplus/includes/Google/Service/Storage.phpnu[ * Lets you store and retrieve potentially-large, immutable data objects.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class UDP_Google_Service_Storage extends UDP_Google_Service { /** View and manage your data across Google Cloud Platform services. */ const CLOUD_PLATFORM = "https://www.googleapis.com/auth/cloud-platform"; /** Manage your data and permissions in Google Cloud Storage. */ const DEVSTORAGE_FULL_CONTROL = "https://www.googleapis.com/auth/devstorage.full_control"; /** View your data in Google Cloud Storage. */ const DEVSTORAGE_READ_ONLY = "https://www.googleapis.com/auth/devstorage.read_only"; /** Manage your data in Google Cloud Storage. */ const DEVSTORAGE_READ_WRITE = "https://www.googleapis.com/auth/devstorage.read_write"; /** * Google storage service name. The default value is drive. * @var String */ protected $serviceName; public $bucketAccessControls; public $buckets; public $channels; public $defaultObjectAccessControls; public $objectAccessControls; public $objects; /** * Constructs the internal representation of the Storage service. * * @param UDP_Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = 'storage/v1/'; $this->version = 'v1'; $this->serviceName = 'storage'; $this->bucketAccessControls = new Google_Service_Storage_BucketAccessControls_Resource( $this, $this->serviceName, 'bucketAccessControls', array( 'methods' => array( 'delete' => array( 'path' => 'b/{bucket}/acl/{entity}', 'httpMethod' => 'DELETE', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'b/{bucket}/acl/{entity}', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => 'b/{bucket}/acl', 'httpMethod' => 'POST', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'b/{bucket}/acl', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'patch' => array( 'path' => 'b/{bucket}/acl/{entity}', 'httpMethod' => 'PATCH', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'b/{bucket}/acl/{entity}', 'httpMethod' => 'PUT', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->buckets = new Google_Service_Storage_Buckets_Resource( $this, $this->serviceName, 'buckets', array( 'methods' => array( 'delete' => array( 'path' => 'b/{bucket}', 'httpMethod' => 'DELETE', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), ), ),'get' => array( 'path' => 'b/{bucket}', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ),'insert' => array( 'path' => 'b', 'httpMethod' => 'POST', 'parameters' => array( 'project' => array( 'location' => 'query', 'type' => 'string', 'required' => true, ), 'predefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'predefinedDefaultObjectAcl' => array( 'location' => 'query', 'type' => 'string', ), ), ),'list' => array( 'path' => 'b', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'query', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'prefix' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ),'patch' => array( 'path' => 'b/{bucket}', 'httpMethod' => 'PATCH', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'predefinedDefaultObjectAcl' => array( 'location' => 'query', 'type' => 'string', ), 'predefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), ), ),'update' => array( 'path' => 'b/{bucket}', 'httpMethod' => 'PUT', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'predefinedDefaultObjectAcl' => array( 'location' => 'query', 'type' => 'string', ), 'predefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->channels = new Google_Service_Storage_Channels_Resource( $this, $this->serviceName, 'channels', array( 'methods' => array( 'stop' => array( 'path' => 'channels/stop', 'httpMethod' => 'POST', 'parameters' => array(), ), ) ) ); $this->defaultObjectAccessControls = new Google_Service_Storage_DefaultObjectAccessControls_Resource( $this, $this->serviceName, 'defaultObjectAccessControls', array( 'methods' => array( 'delete' => array( 'path' => 'b/{bucket}/defaultObjectAcl/{entity}', 'httpMethod' => 'DELETE', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => 'b/{bucket}/defaultObjectAcl/{entity}', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => 'b/{bucket}/defaultObjectAcl', 'httpMethod' => 'POST', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => 'b/{bucket}/defaultObjectAcl', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), ), ),'patch' => array( 'path' => 'b/{bucket}/defaultObjectAcl/{entity}', 'httpMethod' => 'PATCH', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'update' => array( 'path' => 'b/{bucket}/defaultObjectAcl/{entity}', 'httpMethod' => 'PUT', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->objectAccessControls = new Google_Service_Storage_ObjectAccessControls_Resource( $this, $this->serviceName, 'objectAccessControls', array( 'methods' => array( 'delete' => array( 'path' => 'b/{bucket}/o/{object}/acl/{entity}', 'httpMethod' => 'DELETE', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), ), ),'get' => array( 'path' => 'b/{bucket}/o/{object}/acl/{entity}', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), ), ),'insert' => array( 'path' => 'b/{bucket}/o/{object}/acl', 'httpMethod' => 'POST', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), ), ),'list' => array( 'path' => 'b/{bucket}/o/{object}/acl', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), ), ),'patch' => array( 'path' => 'b/{bucket}/o/{object}/acl/{entity}', 'httpMethod' => 'PATCH', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), ), ),'update' => array( 'path' => 'b/{bucket}/o/{object}/acl/{entity}', 'httpMethod' => 'PUT', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'entity' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->objects = new Google_Service_Storage_Objects_Resource( $this, $this->serviceName, 'objects', array( 'methods' => array( 'compose' => array( 'path' => 'b/{destinationBucket}/o/{destinationObject}/compose', 'httpMethod' => 'POST', 'parameters' => array( 'destinationBucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'destinationObject' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'destinationPredefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), ), ),'copy' => array( 'path' => 'b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}', 'httpMethod' => 'POST', 'parameters' => array( 'sourceBucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sourceObject' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'destinationBucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'destinationObject' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifSourceGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifSourceMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'sourceGeneration' => array( 'location' => 'query', 'type' => 'string', ), 'destinationPredefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'ifSourceGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifSourceMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ),'delete' => array( 'path' => 'b/{bucket}/o/{object}', 'httpMethod' => 'DELETE', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), ), ),'get' => array( 'path' => 'b/{bucket}/o/{object}', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ),'insert' => array( 'path' => 'b/{bucket}/o', 'httpMethod' => 'POST', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'predefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'contentEncoding' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'name' => array( 'location' => 'query', 'type' => 'string', ), ), ),'list' => array( 'path' => 'b/{bucket}/o', 'httpMethod' => 'GET', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'versions' => array( 'location' => 'query', 'type' => 'boolean', ), 'prefix' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'delimiter' => array( 'location' => 'query', 'type' => 'string', ), ), ),'patch' => array( 'path' => 'b/{bucket}/o/{object}', 'httpMethod' => 'PATCH', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'predefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ),'rewrite' => array( 'path' => 'b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}', 'httpMethod' => 'POST', 'parameters' => array( 'sourceBucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'sourceObject' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'destinationBucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'destinationObject' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'ifSourceGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'rewriteToken' => array( 'location' => 'query', 'type' => 'string', ), 'ifSourceMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'sourceGeneration' => array( 'location' => 'query', 'type' => 'string', ), 'destinationPredefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'ifSourceGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'maxBytesRewrittenPerCall' => array( 'location' => 'query', 'type' => 'string', ), 'ifSourceMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ),'update' => array( 'path' => 'b/{bucket}/o/{object}', 'httpMethod' => 'PUT', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'object' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'predefinedAcl' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'generation' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifGenerationMatch' => array( 'location' => 'query', 'type' => 'string', ), 'ifMetagenerationNotMatch' => array( 'location' => 'query', 'type' => 'string', ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), ), ),'watchAll' => array( 'path' => 'b/{bucket}/o/watch', 'httpMethod' => 'POST', 'parameters' => array( 'bucket' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'projection' => array( 'location' => 'query', 'type' => 'string', ), 'versions' => array( 'location' => 'query', 'type' => 'boolean', ), 'prefix' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'delimiter' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); } } /** * The "bucketAccessControls" collection of methods. * Typical usage is: * * $storageService = new UDP_Google_Service_Storage(...); * $bucketAccessControls = $storageService->bucketAccessControls; * */ class Google_Service_Storage_BucketAccessControls_Resource extends UDP_Google_Service_Resource { /** * Permanently deletes the ACL entry for the specified entity on the specified * bucket. (bucketAccessControls.delete) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param array $optParams Optional parameters. */ public function delete($bucket, $entity, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Returns the ACL entry for the specified entity on the specified bucket. * (bucketAccessControls.get) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param array $optParams Optional parameters. * @return Google_Service_Storage_BucketAccessControl */ public function get($bucket, $entity, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Storage_BucketAccessControl"); } /** * Creates a new ACL entry on the specified bucket. * (bucketAccessControls.insert) * * @param string $bucket Name of a bucket. * @param Google_BucketAccessControl $postBody * @param array $optParams Optional parameters. * @return Google_Service_Storage_BucketAccessControl */ public function insert($bucket, Google_Service_Storage_BucketAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Storage_BucketAccessControl"); } /** * Retrieves ACL entries on the specified bucket. * (bucketAccessControls.listBucketAccessControls) * * @param string $bucket Name of a bucket. * @param array $optParams Optional parameters. * @return Google_Service_Storage_BucketAccessControls */ public function listBucketAccessControls($bucket, $optParams = array()) { $params = array('bucket' => $bucket); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Storage_BucketAccessControls"); } /** * Updates an ACL entry on the specified bucket. This method supports patch * semantics. (bucketAccessControls.patch) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param Google_BucketAccessControl $postBody * @param array $optParams Optional parameters. * @return Google_Service_Storage_BucketAccessControl */ public function patch($bucket, $entity, Google_Service_Storage_BucketAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Storage_BucketAccessControl"); } /** * Updates an ACL entry on the specified bucket. (bucketAccessControls.update) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param Google_BucketAccessControl $postBody * @param array $optParams Optional parameters. * @return Google_Service_Storage_BucketAccessControl */ public function update($bucket, $entity, Google_Service_Storage_BucketAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Storage_BucketAccessControl"); } } /** * The "buckets" collection of methods. * Typical usage is: * * $storageService = new UDP_Google_Service_Storage(...); * $buckets = $storageService->buckets; * */ class Google_Service_Storage_Buckets_Resource extends UDP_Google_Service_Resource { /** * Permanently deletes an empty bucket. (buckets.delete) * * @param string $bucket Name of a bucket. * @param array $optParams Optional parameters. * * @opt_param string ifMetagenerationMatch If set, only deletes the bucket if * its metageneration matches this value. * @opt_param string ifMetagenerationNotMatch If set, only deletes the bucket if * its metageneration does not match this value. */ public function delete($bucket, $optParams = array()) { $params = array('bucket' => $bucket); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Returns metadata for the specified bucket. (buckets.get) * * @param string $bucket Name of a bucket. * @param array $optParams Optional parameters. * * @opt_param string ifMetagenerationMatch Makes the return of the bucket * metadata conditional on whether the bucket's current metageneration matches * the given value. * @opt_param string ifMetagenerationNotMatch Makes the return of the bucket * metadata conditional on whether the bucket's current metageneration does not * match the given value. * @opt_param string projection Set of properties to return. Defaults to noAcl. * @return UDP_Google_Service_Storage_Bucket */ public function get($bucket, $optParams = array()) { $params = array('bucket' => $bucket); $params = array_merge($params, $optParams); return $this->call('get', array($params), "UDP_Google_Service_Storage_Bucket"); } /** * Creates a new bucket. (buckets.insert) * * @param string $project A valid API project identifier. * @param Google_Bucket $postBody * @param array $optParams Optional parameters. * * @opt_param string predefinedAcl Apply a predefined set of access controls to * this bucket. * @opt_param string projection Set of properties to return. Defaults to noAcl, * unless the bucket resource specifies acl or defaultObjectAcl properties, when * it defaults to full. * @opt_param string predefinedDefaultObjectAcl Apply a predefined set of * default object access controls to this bucket. * @return UDP_Google_Service_Storage_Bucket */ public function insert($project, UDP_Google_Service_Storage_Bucket $postBody, $optParams = array()) { $params = array('project' => $project, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "UDP_Google_Service_Storage_Bucket"); } /** * Retrieves a list of buckets for a given project. (buckets.listBuckets) * * @param string $project A valid API project identifier. * @param array $optParams Optional parameters. * * @opt_param string pageToken A previously-returned page token representing * part of the larger set of results to view. * @opt_param string prefix Filter results to buckets whose names begin with * this prefix. * @opt_param string projection Set of properties to return. Defaults to noAcl. * @opt_param string maxResults Maximum number of buckets to return. * @return Google_Service_Storage_Buckets */ public function listBuckets($project, $optParams = array()) { $params = array('project' => $project); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Storage_Buckets"); } /** * Updates a bucket. This method supports patch semantics. (buckets.patch) * * @param string $bucket Name of a bucket. * @param Google_Bucket $postBody * @param array $optParams Optional parameters. * * @opt_param string projection Set of properties to return. Defaults to full. * @opt_param string ifMetagenerationMatch Makes the return of the bucket * metadata conditional on whether the bucket's current metageneration matches * the given value. * @opt_param string predefinedDefaultObjectAcl Apply a predefined set of * default object access controls to this bucket. * @opt_param string predefinedAcl Apply a predefined set of access controls to * this bucket. * @opt_param string ifMetagenerationNotMatch Makes the return of the bucket * metadata conditional on whether the bucket's current metageneration does not * match the given value. * @return UDP_Google_Service_Storage_Bucket */ public function patch($bucket, UDP_Google_Service_Storage_Bucket $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "UDP_Google_Service_Storage_Bucket"); } /** * Updates a bucket. (buckets.update) * * @param string $bucket Name of a bucket. * @param Google_Bucket $postBody * @param array $optParams Optional parameters. * * @opt_param string projection Set of properties to return. Defaults to full. * @opt_param string ifMetagenerationMatch Makes the return of the bucket * metadata conditional on whether the bucket's current metageneration matches * the given value. * @opt_param string predefinedDefaultObjectAcl Apply a predefined set of * default object access controls to this bucket. * @opt_param string predefinedAcl Apply a predefined set of access controls to * this bucket. * @opt_param string ifMetagenerationNotMatch Makes the return of the bucket * metadata conditional on whether the bucket's current metageneration does not * match the given value. * @return UDP_Google_Service_Storage_Bucket */ public function update($bucket, UDP_Google_Service_Storage_Bucket $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "UDP_Google_Service_Storage_Bucket"); } } /** * The "channels" collection of methods. * Typical usage is: * * $storageService = new UDP_Google_Service_Storage(...); * $channels = $storageService->channels; * */ class Google_Service_Storage_Channels_Resource extends UDP_Google_Service_Resource { /** * Stop watching resources through this channel (channels.stop) * * @param Google_Channel $postBody * @param array $optParams Optional parameters. */ public function stop(Google_Service_Storage_Channel $postBody, $optParams = array()) { $params = array('postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('stop', array($params)); } } /** * The "defaultObjectAccessControls" collection of methods. * Typical usage is: * * $storageService = new UDP_Google_Service_Storage(...); * $defaultObjectAccessControls = $storageService->defaultObjectAccessControls; * */ class Google_Service_Storage_DefaultObjectAccessControls_Resource extends UDP_Google_Service_Resource { /** * Permanently deletes the default object ACL entry for the specified entity on * the specified bucket. (defaultObjectAccessControls.delete) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param array $optParams Optional parameters. */ public function delete($bucket, $entity, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Returns the default object ACL entry for the specified entity on the * specified bucket. (defaultObjectAccessControls.get) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param array $optParams Optional parameters. * @return Google_Service_Storage_ObjectAccessControl */ public function get($bucket, $entity, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Storage_ObjectAccessControl"); } /** * Creates a new default object ACL entry on the specified bucket. * (defaultObjectAccessControls.insert) * * @param string $bucket Name of a bucket. * @param Google_ObjectAccessControl $postBody * @param array $optParams Optional parameters. * @return Google_Service_Storage_ObjectAccessControl */ public function insert($bucket, Google_Service_Storage_ObjectAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Storage_ObjectAccessControl"); } /** * Retrieves default object ACL entries on the specified bucket. * (defaultObjectAccessControls.listDefaultObjectAccessControls) * * @param string $bucket Name of a bucket. * @param array $optParams Optional parameters. * * @opt_param string ifMetagenerationMatch If present, only return default ACL * listing if the bucket's current metageneration matches this value. * @opt_param string ifMetagenerationNotMatch If present, only return default * ACL listing if the bucket's current metageneration does not match the given * value. * @return Google_Service_Storage_ObjectAccessControls */ public function listDefaultObjectAccessControls($bucket, $optParams = array()) { $params = array('bucket' => $bucket); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Storage_ObjectAccessControls"); } /** * Updates a default object ACL entry on the specified bucket. This method * supports patch semantics. (defaultObjectAccessControls.patch) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param Google_ObjectAccessControl $postBody * @param array $optParams Optional parameters. * @return Google_Service_Storage_ObjectAccessControl */ public function patch($bucket, $entity, Google_Service_Storage_ObjectAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Storage_ObjectAccessControl"); } /** * Updates a default object ACL entry on the specified bucket. * (defaultObjectAccessControls.update) * * @param string $bucket Name of a bucket. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param Google_ObjectAccessControl $postBody * @param array $optParams Optional parameters. * @return Google_Service_Storage_ObjectAccessControl */ public function update($bucket, $entity, Google_Service_Storage_ObjectAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'entity' => $entity, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Storage_ObjectAccessControl"); } } /** * The "objectAccessControls" collection of methods. * Typical usage is: * * $storageService = new UDP_Google_Service_Storage(...); * $objectAccessControls = $storageService->objectAccessControls; * */ class Google_Service_Storage_ObjectAccessControls_Resource extends UDP_Google_Service_Resource { /** * Permanently deletes the ACL entry for the specified entity on the specified * object. (objectAccessControls.delete) * * @param string $bucket Name of a bucket. * @param string $object Name of the object. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param array $optParams Optional parameters. * * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). */ public function delete($bucket, $object, $entity, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object, 'entity' => $entity); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Returns the ACL entry for the specified entity on the specified object. * (objectAccessControls.get) * * @param string $bucket Name of a bucket. * @param string $object Name of the object. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param array $optParams Optional parameters. * * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @return Google_Service_Storage_ObjectAccessControl */ public function get($bucket, $object, $entity, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object, 'entity' => $entity); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Storage_ObjectAccessControl"); } /** * Creates a new ACL entry on the specified object. * (objectAccessControls.insert) * * @param string $bucket Name of a bucket. * @param string $object Name of the object. * @param Google_ObjectAccessControl $postBody * @param array $optParams Optional parameters. * * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @return Google_Service_Storage_ObjectAccessControl */ public function insert($bucket, $object, Google_Service_Storage_ObjectAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Storage_ObjectAccessControl"); } /** * Retrieves ACL entries on the specified object. * (objectAccessControls.listObjectAccessControls) * * @param string $bucket Name of a bucket. * @param string $object Name of the object. * @param array $optParams Optional parameters. * * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @return Google_Service_Storage_ObjectAccessControls */ public function listObjectAccessControls($bucket, $object, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Storage_ObjectAccessControls"); } /** * Updates an ACL entry on the specified object. This method supports patch * semantics. (objectAccessControls.patch) * * @param string $bucket Name of a bucket. * @param string $object Name of the object. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param Google_ObjectAccessControl $postBody * @param array $optParams Optional parameters. * * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @return Google_Service_Storage_ObjectAccessControl */ public function patch($bucket, $object, $entity, Google_Service_Storage_ObjectAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object, 'entity' => $entity, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "Google_Service_Storage_ObjectAccessControl"); } /** * Updates an ACL entry on the specified object. (objectAccessControls.update) * * @param string $bucket Name of a bucket. * @param string $object Name of the object. * @param string $entity The entity holding the permission. Can be user-userId, * user-emailAddress, group-groupId, group-emailAddress, allUsers, or * allAuthenticatedUsers. * @param Google_ObjectAccessControl $postBody * @param array $optParams Optional parameters. * * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @return Google_Service_Storage_ObjectAccessControl */ public function update($bucket, $object, $entity, Google_Service_Storage_ObjectAccessControl $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object, 'entity' => $entity, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "Google_Service_Storage_ObjectAccessControl"); } } /** * The "objects" collection of methods. * Typical usage is: * * $storageService = new UDP_Google_Service_Storage(...); * $objects = $storageService->objects; * */ class Google_Service_Storage_Objects_Resource extends UDP_Google_Service_Resource { /** * Concatenates a list of existing objects into a new object in the same bucket. * (objects.compose) * * @param string $destinationBucket Name of the bucket in which to store the new * object. * @param string $destinationObject Name of the new object. * @param Google_ComposeRequest $postBody * @param array $optParams Optional parameters. * * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the object's current generation matches the given value. * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the object's current metageneration matches the given value. * @opt_param string destinationPredefinedAcl Apply a predefined set of access * controls to the destination object. * @return UDP_Google_Service_Storage_StorageObject */ public function compose($destinationBucket, $destinationObject, Google_Service_Storage_ComposeRequest $postBody, $optParams = array()) { $params = array('destinationBucket' => $destinationBucket, 'destinationObject' => $destinationObject, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('compose', array($params), "UDP_Google_Service_Storage_StorageObject"); } /** * Copies an object to a specified location. Optionally overrides metadata. * (objects.copy) * * @param string $sourceBucket Name of the bucket in which to find the source * object. * @param string $sourceObject Name of the source object. * @param string $destinationBucket Name of the bucket in which to store the new * object. Overrides the provided object metadata's bucket value, if any. * @param string $destinationObject Name of the new object. Required when the * object metadata is not otherwise provided. Overrides the object metadata's * name value, if any. * @param Google_StorageObject $postBody * @param array $optParams Optional parameters. * * @opt_param string ifSourceGenerationNotMatch Makes the operation conditional * on whether the source object's generation does not match the given value. * @opt_param string ifGenerationNotMatch Makes the operation conditional on * whether the destination object's current generation does not match the given * value. * @opt_param string ifSourceMetagenerationNotMatch Makes the operation * conditional on whether the source object's current metageneration does not * match the given value. * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the destination object's current metageneration matches the given * value. * @opt_param string sourceGeneration If present, selects a specific revision of * the source object (as opposed to the latest version, the default). * @opt_param string destinationPredefinedAcl Apply a predefined set of access * controls to the destination object. * @opt_param string ifSourceGenerationMatch Makes the operation conditional on * whether the source object's generation matches the given value. * @opt_param string ifSourceMetagenerationMatch Makes the operation conditional * on whether the source object's current metageneration matches the given * value. * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the destination object's current generation matches the given value. * @opt_param string ifMetagenerationNotMatch Makes the operation conditional on * whether the destination object's current metageneration does not match the * given value. * @opt_param string projection Set of properties to return. Defaults to noAcl, * unless the object resource specifies the acl property, when it defaults to * full. * @return UDP_Google_Service_Storage_StorageObject */ public function copy($sourceBucket, $sourceObject, $destinationBucket, $destinationObject, UDP_Google_Service_Storage_StorageObject $postBody, $optParams = array()) { $params = array('sourceBucket' => $sourceBucket, 'sourceObject' => $sourceObject, 'destinationBucket' => $destinationBucket, 'destinationObject' => $destinationObject, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('copy', array($params), "UDP_Google_Service_Storage_StorageObject"); } /** * Deletes an object and its metadata. Deletions are permanent if versioning is * not enabled for the bucket, or if the generation parameter is used. * (objects.delete) * * @param string $bucket Name of the bucket in which the object resides. * @param string $object Name of the object. * @param array $optParams Optional parameters. * * @opt_param string ifGenerationNotMatch Makes the operation conditional on * whether the object's current generation does not match the given value. * @opt_param string generation If present, permanently deletes a specific * revision of this object (as opposed to the latest version, the default). * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the object's current metageneration matches the given value. * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the object's current generation matches the given value. * @opt_param string ifMetagenerationNotMatch Makes the operation conditional on * whether the object's current metageneration does not match the given value. */ public function delete($bucket, $object, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object); $params = array_merge($params, $optParams); return $this->call('delete', array($params)); } /** * Retrieves an object or its metadata. (objects.get) * * @param string $bucket Name of the bucket in which the object resides. * @param string $object Name of the object. * @param array $optParams Optional parameters. * * @opt_param string ifGenerationNotMatch Makes the operation conditional on * whether the object's generation does not match the given value. * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the object's current metageneration matches the given value. * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the object's generation matches the given value. * @opt_param string ifMetagenerationNotMatch Makes the operation conditional on * whether the object's current metageneration does not match the given value. * @opt_param string projection Set of properties to return. Defaults to noAcl. * @return UDP_Google_Service_Storage_StorageObject */ public function get($bucket, $object, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object); $params = array_merge($params, $optParams); return $this->call('get', array($params), "UDP_Google_Service_Storage_StorageObject"); } /** * Stores a new object and metadata. (objects.insert) * * @param string $bucket Name of the bucket in which to store the new object. * Overrides the provided object metadata's bucket value, if any. * @param Google_StorageObject $postBody * @param array $optParams Optional parameters. * * @opt_param string predefinedAcl Apply a predefined set of access controls to * this object. * @opt_param string projection Set of properties to return. Defaults to noAcl, * unless the object resource specifies the acl property, when it defaults to * full. * @opt_param string ifGenerationNotMatch Makes the operation conditional on * whether the object's current generation does not match the given value. * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the object's current metageneration matches the given value. * @opt_param string contentEncoding If set, sets the contentEncoding property * of the final object to this value. Setting this parameter is equivalent to * setting the contentEncoding metadata property. This can be useful when * uploading an object with uploadType=media to indicate the encoding of the * content being uploaded. * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the object's current generation matches the given value. * @opt_param string ifMetagenerationNotMatch Makes the operation conditional on * whether the object's current metageneration does not match the given value. * @opt_param string name Name of the object. Required when the object metadata * is not otherwise provided. Overrides the object metadata's name value, if * any. * @return UDP_Google_Service_Storage_StorageObject */ public function insert($bucket, UDP_Google_Service_Storage_StorageObject $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "UDP_Google_Service_Storage_StorageObject"); } /** * Retrieves a list of objects matching the criteria. (objects.listObjects) * * @param string $bucket Name of the bucket in which to look for objects. * @param array $optParams Optional parameters. * * @opt_param string projection Set of properties to return. Defaults to noAcl. * @opt_param bool versions If true, lists all versions of an object as distinct * results. The default is false. For more information, see Object Versioning. * @opt_param string prefix Filter results to objects whose names begin with * this prefix. * @opt_param string maxResults Maximum number of items plus prefixes to return. * As duplicate prefixes are omitted, fewer total results may be returned than * requested. The default value of this parameter is 1,000 items. * @opt_param string pageToken A previously-returned page token representing * part of the larger set of results to view. * @opt_param string delimiter Returns results in a directory-like mode. items * will contain only objects whose names, aside from the prefix, do not contain * delimiter. Objects whose names, aside from the prefix, contain delimiter will * have their name, truncated after the delimiter, returned in prefixes. * Duplicate prefixes are omitted. * @return Google_Service_Storage_Objects */ public function listObjects($bucket, $optParams = array()) { $params = array('bucket' => $bucket); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Storage_Objects"); } /** * Updates an object's metadata. This method supports patch semantics. * (objects.patch) * * @param string $bucket Name of the bucket in which the object resides. * @param string $object Name of the object. * @param Google_StorageObject $postBody * @param array $optParams Optional parameters. * * @opt_param string predefinedAcl Apply a predefined set of access controls to * this object. * @opt_param string ifGenerationNotMatch Makes the operation conditional on * whether the object's current generation does not match the given value. * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the object's current metageneration matches the given value. * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the object's current generation matches the given value. * @opt_param string ifMetagenerationNotMatch Makes the operation conditional on * whether the object's current metageneration does not match the given value. * @opt_param string projection Set of properties to return. Defaults to full. * @return UDP_Google_Service_Storage_StorageObject */ public function patch($bucket, $object, UDP_Google_Service_Storage_StorageObject $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('patch', array($params), "UDP_Google_Service_Storage_StorageObject"); } /** * Rewrites a source object to a destination object. Optionally overrides * metadata. (objects.rewrite) * * @param string $sourceBucket Name of the bucket in which to find the source * object. * @param string $sourceObject Name of the source object. * @param string $destinationBucket Name of the bucket in which to store the new * object. Overrides the provided object metadata's bucket value, if any. * @param string $destinationObject Name of the new object. Required when the * object metadata is not otherwise provided. Overrides the object metadata's * name value, if any. * @param Google_StorageObject $postBody * @param array $optParams Optional parameters. * * @opt_param string ifSourceGenerationNotMatch Makes the operation conditional * on whether the source object's generation does not match the given value. * @opt_param string ifGenerationNotMatch Makes the operation conditional on * whether the destination object's current generation does not match the given * value. * @opt_param string rewriteToken Include this field (from the previous Rewrite * response) on each Rewrite request after the first one, until the Rewrite * response 'done' flag is true. Calls that provide a rewriteToken can omit all * other request fields, but if included those fields must match the values * provided in the first rewrite request. * @opt_param string ifSourceMetagenerationNotMatch Makes the operation * conditional on whether the source object's current metageneration does not * match the given value. * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the destination object's current metageneration matches the given * value. * @opt_param string sourceGeneration If present, selects a specific revision of * the source object (as opposed to the latest version, the default). * @opt_param string destinationPredefinedAcl Apply a predefined set of access * controls to the destination object. * @opt_param string ifSourceGenerationMatch Makes the operation conditional on * whether the source object's generation matches the given value. * @opt_param string maxBytesRewrittenPerCall The maximum number of bytes that * will be rewritten per Rewrite request. Most callers shouldn't need to specify * this parameter - it is primarily in place to support testing. If specified * the value must be an integral multiple of 1 MiB (1048576). Also, this only * applies to requests where the source and destination span locations and/or * storage classes. Finally, this value must not change across Rewrite calls * else you'll get an error that the rewrite token is invalid. * @opt_param string ifSourceMetagenerationMatch Makes the operation conditional * on whether the source object's current metageneration matches the given * value. * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the destination object's current generation matches the given value. * @opt_param string ifMetagenerationNotMatch Makes the operation conditional on * whether the destination object's current metageneration does not match the * given value. * @opt_param string projection Set of properties to return. Defaults to noAcl, * unless the object resource specifies the acl property, when it defaults to * full. * @return Google_Service_Storage_RewriteResponse */ public function rewrite($sourceBucket, $sourceObject, $destinationBucket, $destinationObject, UDP_Google_Service_Storage_StorageObject $postBody, $optParams = array()) { $params = array('sourceBucket' => $sourceBucket, 'sourceObject' => $sourceObject, 'destinationBucket' => $destinationBucket, 'destinationObject' => $destinationObject, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('rewrite', array($params), "Google_Service_Storage_RewriteResponse"); } /** * Updates an object's metadata. (objects.update) * * @param string $bucket Name of the bucket in which the object resides. * @param string $object Name of the object. * @param Google_StorageObject $postBody * @param array $optParams Optional parameters. * * @opt_param string predefinedAcl Apply a predefined set of access controls to * this object. * @opt_param string ifGenerationNotMatch Makes the operation conditional on * whether the object's current generation does not match the given value. * @opt_param string generation If present, selects a specific revision of this * object (as opposed to the latest version, the default). * @opt_param string ifMetagenerationMatch Makes the operation conditional on * whether the object's current metageneration matches the given value. * @opt_param string ifGenerationMatch Makes the operation conditional on * whether the object's current generation matches the given value. * @opt_param string ifMetagenerationNotMatch Makes the operation conditional on * whether the object's current metageneration does not match the given value. * @opt_param string projection Set of properties to return. Defaults to full. * @return UDP_Google_Service_Storage_StorageObject */ public function update($bucket, $object, UDP_Google_Service_Storage_StorageObject $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'object' => $object, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('update', array($params), "UDP_Google_Service_Storage_StorageObject"); } /** * Watch for changes on all objects in a bucket. (objects.watchAll) * * @param string $bucket Name of the bucket in which to look for objects. * @param Google_Channel $postBody * @param array $optParams Optional parameters. * * @opt_param string projection Set of properties to return. Defaults to noAcl. * @opt_param bool versions If true, lists all versions of an object as distinct * results. The default is false. For more information, see Object Versioning. * @opt_param string prefix Filter results to objects whose names begin with * this prefix. * @opt_param string maxResults Maximum number of items plus prefixes to return. * As duplicate prefixes are omitted, fewer total results may be returned than * requested. The default value of this parameter is 1,000 items. * @opt_param string pageToken A previously-returned page token representing * part of the larger set of results to view. * @opt_param string delimiter Returns results in a directory-like mode. items * will contain only objects whose names, aside from the prefix, do not contain * delimiter. Objects whose names, aside from the prefix, contain delimiter will * have their name, truncated after the delimiter, returned in prefixes. * Duplicate prefixes are omitted. * @return Google_Service_Storage_Channel */ public function watchAll($bucket, Google_Service_Storage_Channel $postBody, $optParams = array()) { $params = array('bucket' => $bucket, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('watchAll', array($params), "Google_Service_Storage_Channel"); } } class UDP_Google_Service_Storage_Bucket extends Google_Collection { protected $collection_key = 'defaultObjectAcl'; protected $internal_gapi_mappings = array( ); protected $aclType = 'Google_Service_Storage_BucketAccessControl'; protected $aclDataType = 'array'; protected $corsType = 'Google_Service_Storage_BucketCors'; protected $corsDataType = 'array'; protected $defaultObjectAclType = 'Google_Service_Storage_ObjectAccessControl'; protected $defaultObjectAclDataType = 'array'; public $etag; public $id; public $kind; protected $lifecycleType = 'Google_Service_Storage_BucketLifecycle'; protected $lifecycleDataType = ''; public $location; protected $loggingType = 'Google_Service_Storage_BucketLogging'; protected $loggingDataType = ''; public $metageneration; public $name; protected $ownerType = 'Google_Service_Storage_BucketOwner'; protected $ownerDataType = ''; public $projectNumber; public $selfLink; public $storageClass; public $timeCreated; protected $versioningType = 'Google_Service_Storage_BucketVersioning'; protected $versioningDataType = ''; protected $websiteType = 'Google_Service_Storage_BucketWebsite'; protected $websiteDataType = ''; public function setAcl($acl) { $this->acl = $acl; } public function getAcl() { return $this->acl; } public function setCors($cors) { $this->cors = $cors; } public function getCors() { return $this->cors; } public function setDefaultObjectAcl($defaultObjectAcl) { $this->defaultObjectAcl = $defaultObjectAcl; } public function getDefaultObjectAcl() { return $this->defaultObjectAcl; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setLifecycle(Google_Service_Storage_BucketLifecycle $lifecycle) { $this->lifecycle = $lifecycle; } public function getLifecycle() { return $this->lifecycle; } public function setLocation($location) { $this->location = $location; } public function getLocation() { return $this->location; } public function setLogging(Google_Service_Storage_BucketLogging $logging) { $this->logging = $logging; } public function getLogging() { return $this->logging; } public function setMetageneration($metageneration) { $this->metageneration = $metageneration; } public function getMetageneration() { return $this->metageneration; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setOwner(Google_Service_Storage_BucketOwner $owner) { $this->owner = $owner; } public function getOwner() { return $this->owner; } public function setProjectNumber($projectNumber) { $this->projectNumber = $projectNumber; } public function getProjectNumber() { return $this->projectNumber; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setStorageClass($storageClass) { $this->storageClass = $storageClass; } public function getStorageClass() { return $this->storageClass; } public function setTimeCreated($timeCreated) { $this->timeCreated = $timeCreated; } public function getTimeCreated() { return $this->timeCreated; } public function setVersioning(Google_Service_Storage_BucketVersioning $versioning) { $this->versioning = $versioning; } public function getVersioning() { return $this->versioning; } public function setWebsite(Google_Service_Storage_BucketWebsite $website) { $this->website = $website; } public function getWebsite() { return $this->website; } } class Google_Service_Storage_BucketAccessControl extends Google_Model { protected $internal_gapi_mappings = array( ); public $bucket; public $domain; public $email; public $entity; public $entityId; public $etag; public $id; public $kind; protected $projectTeamType = 'Google_Service_Storage_BucketAccessControlProjectTeam'; protected $projectTeamDataType = ''; public $role; public $selfLink; public function setBucket($bucket) { $this->bucket = $bucket; } public function getBucket() { return $this->bucket; } public function setDomain($domain) { $this->domain = $domain; } public function getDomain() { return $this->domain; } public function setEmail($email) { $this->email = $email; } public function getEmail() { return $this->email; } public function setEntity($entity) { $this->entity = $entity; } public function getEntity() { return $this->entity; } public function setEntityId($entityId) { $this->entityId = $entityId; } public function getEntityId() { return $this->entityId; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setProjectTeam(Google_Service_Storage_BucketAccessControlProjectTeam $projectTeam) { $this->projectTeam = $projectTeam; } public function getProjectTeam() { return $this->projectTeam; } public function setRole($role) { $this->role = $role; } public function getRole() { return $this->role; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Storage_BucketAccessControlProjectTeam extends Google_Model { protected $internal_gapi_mappings = array( ); public $projectNumber; public $team; public function setProjectNumber($projectNumber) { $this->projectNumber = $projectNumber; } public function getProjectNumber() { return $this->projectNumber; } public function setTeam($team) { $this->team = $team; } public function getTeam() { return $this->team; } } class Google_Service_Storage_BucketAccessControls extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); protected $itemsType = 'Google_Service_Storage_BucketAccessControl'; protected $itemsDataType = 'array'; public $kind; public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_Storage_BucketCors extends Google_Collection { protected $collection_key = 'responseHeader'; protected $internal_gapi_mappings = array( ); public $maxAgeSeconds; public $method; public $origin; public $responseHeader; public function setMaxAgeSeconds($maxAgeSeconds) { $this->maxAgeSeconds = $maxAgeSeconds; } public function getMaxAgeSeconds() { return $this->maxAgeSeconds; } public function setMethod($method) { $this->method = $method; } public function getMethod() { return $this->method; } public function setOrigin($origin) { $this->origin = $origin; } public function getOrigin() { return $this->origin; } public function setResponseHeader($responseHeader) { $this->responseHeader = $responseHeader; } public function getResponseHeader() { return $this->responseHeader; } } class Google_Service_Storage_BucketLifecycle extends Google_Collection { protected $collection_key = 'rule'; protected $internal_gapi_mappings = array( ); protected $ruleType = 'Google_Service_Storage_BucketLifecycleRule'; protected $ruleDataType = 'array'; public function setRule($rule) { $this->rule = $rule; } public function getRule() { return $this->rule; } } class Google_Service_Storage_BucketLifecycleRule extends Google_Model { protected $internal_gapi_mappings = array( ); protected $actionType = 'Google_Service_Storage_BucketLifecycleRuleAction'; protected $actionDataType = ''; protected $conditionType = 'Google_Service_Storage_BucketLifecycleRuleCondition'; protected $conditionDataType = ''; public function setAction(Google_Service_Storage_BucketLifecycleRuleAction $action) { $this->action = $action; } public function getAction() { return $this->action; } public function setCondition(Google_Service_Storage_BucketLifecycleRuleCondition $condition) { $this->condition = $condition; } public function getCondition() { return $this->condition; } } class Google_Service_Storage_BucketLifecycleRuleAction extends Google_Model { protected $internal_gapi_mappings = array( ); public $type; public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Storage_BucketLifecycleRuleCondition extends Google_Model { protected $internal_gapi_mappings = array( ); public $age; public $createdBefore; public $isLive; public $numNewerVersions; public function setAge($age) { $this->age = $age; } public function getAge() { return $this->age; } public function setCreatedBefore($createdBefore) { $this->createdBefore = $createdBefore; } public function getCreatedBefore() { return $this->createdBefore; } public function setIsLive($isLive) { $this->isLive = $isLive; } public function getIsLive() { return $this->isLive; } public function setNumNewerVersions($numNewerVersions) { $this->numNewerVersions = $numNewerVersions; } public function getNumNewerVersions() { return $this->numNewerVersions; } } class Google_Service_Storage_BucketLogging extends Google_Model { protected $internal_gapi_mappings = array( ); public $logBucket; public $logObjectPrefix; public function setLogBucket($logBucket) { $this->logBucket = $logBucket; } public function getLogBucket() { return $this->logBucket; } public function setLogObjectPrefix($logObjectPrefix) { $this->logObjectPrefix = $logObjectPrefix; } public function getLogObjectPrefix() { return $this->logObjectPrefix; } } class Google_Service_Storage_BucketOwner extends Google_Model { protected $internal_gapi_mappings = array( ); public $entity; public $entityId; public function setEntity($entity) { $this->entity = $entity; } public function getEntity() { return $this->entity; } public function setEntityId($entityId) { $this->entityId = $entityId; } public function getEntityId() { return $this->entityId; } } class Google_Service_Storage_BucketVersioning extends Google_Model { protected $internal_gapi_mappings = array( ); public $enabled; public function setEnabled($enabled) { $this->enabled = $enabled; } public function getEnabled() { return $this->enabled; } } class Google_Service_Storage_BucketWebsite extends Google_Model { protected $internal_gapi_mappings = array( ); public $mainPageSuffix; public $notFoundPage; public function setMainPageSuffix($mainPageSuffix) { $this->mainPageSuffix = $mainPageSuffix; } public function getMainPageSuffix() { return $this->mainPageSuffix; } public function setNotFoundPage($notFoundPage) { $this->notFoundPage = $notFoundPage; } public function getNotFoundPage() { return $this->notFoundPage; } } class Google_Service_Storage_Buckets extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); protected $itemsType = 'UDP_Google_Service_Storage_Bucket'; protected $itemsDataType = 'array'; public $kind; public $nextPageToken; public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_Storage_Channel extends Google_Model { protected $internal_gapi_mappings = array( ); public $address; public $expiration; public $id; public $kind; public $params; public $payload; public $resourceId; public $resourceUri; public $token; public $type; public function setAddress($address) { $this->address = $address; } public function getAddress() { return $this->address; } public function setExpiration($expiration) { $this->expiration = $expiration; } public function getExpiration() { return $this->expiration; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setParams($params) { $this->params = $params; } public function getParams() { return $this->params; } public function setPayload($payload) { $this->payload = $payload; } public function getPayload() { return $this->payload; } public function setResourceId($resourceId) { $this->resourceId = $resourceId; } public function getResourceId() { return $this->resourceId; } public function setResourceUri($resourceUri) { $this->resourceUri = $resourceUri; } public function getResourceUri() { return $this->resourceUri; } public function setToken($token) { $this->token = $token; } public function getToken() { return $this->token; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } } class Google_Service_Storage_ChannelParams extends Google_Model { } class Google_Service_Storage_ComposeRequest extends Google_Collection { protected $collection_key = 'sourceObjects'; protected $internal_gapi_mappings = array( ); protected $destinationType = 'UDP_Google_Service_Storage_StorageObject'; protected $destinationDataType = ''; public $kind; protected $sourceObjectsType = 'Google_Service_Storage_ComposeRequestSourceObjects'; protected $sourceObjectsDataType = 'array'; public function setDestination(UDP_Google_Service_Storage_StorageObject $destination) { $this->destination = $destination; } public function getDestination() { return $this->destination; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setSourceObjects($sourceObjects) { $this->sourceObjects = $sourceObjects; } public function getSourceObjects() { return $this->sourceObjects; } } class Google_Service_Storage_ComposeRequestSourceObjects extends Google_Model { protected $internal_gapi_mappings = array( ); public $generation; public $name; protected $objectPreconditionsType = 'Google_Service_Storage_ComposeRequestSourceObjectsObjectPreconditions'; protected $objectPreconditionsDataType = ''; public function setGeneration($generation) { $this->generation = $generation; } public function getGeneration() { return $this->generation; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setObjectPreconditions(Google_Service_Storage_ComposeRequestSourceObjectsObjectPreconditions $objectPreconditions) { $this->objectPreconditions = $objectPreconditions; } public function getObjectPreconditions() { return $this->objectPreconditions; } } class Google_Service_Storage_ComposeRequestSourceObjectsObjectPreconditions extends Google_Model { protected $internal_gapi_mappings = array( ); public $ifGenerationMatch; public function setIfGenerationMatch($ifGenerationMatch) { $this->ifGenerationMatch = $ifGenerationMatch; } public function getIfGenerationMatch() { return $this->ifGenerationMatch; } } class Google_Service_Storage_ObjectAccessControl extends Google_Model { protected $internal_gapi_mappings = array( ); public $bucket; public $domain; public $email; public $entity; public $entityId; public $etag; public $generation; public $id; public $kind; public $object; protected $projectTeamType = 'Google_Service_Storage_ObjectAccessControlProjectTeam'; protected $projectTeamDataType = ''; public $role; public $selfLink; public function setBucket($bucket) { $this->bucket = $bucket; } public function getBucket() { return $this->bucket; } public function setDomain($domain) { $this->domain = $domain; } public function getDomain() { return $this->domain; } public function setEmail($email) { $this->email = $email; } public function getEmail() { return $this->email; } public function setEntity($entity) { $this->entity = $entity; } public function getEntity() { return $this->entity; } public function setEntityId($entityId) { $this->entityId = $entityId; } public function getEntityId() { return $this->entityId; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setGeneration($generation) { $this->generation = $generation; } public function getGeneration() { return $this->generation; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setObject($object) { $this->object = $object; } public function getObject() { return $this->object; } public function setProjectTeam(Google_Service_Storage_ObjectAccessControlProjectTeam $projectTeam) { $this->projectTeam = $projectTeam; } public function getProjectTeam() { return $this->projectTeam; } public function setRole($role) { $this->role = $role; } public function getRole() { return $this->role; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Storage_ObjectAccessControlProjectTeam extends Google_Model { protected $internal_gapi_mappings = array( ); public $projectNumber; public $team; public function setProjectNumber($projectNumber) { $this->projectNumber = $projectNumber; } public function getProjectNumber() { return $this->projectNumber; } public function setTeam($team) { $this->team = $team; } public function getTeam() { return $this->team; } } class Google_Service_Storage_ObjectAccessControls extends Google_Collection { protected $collection_key = 'items'; protected $internal_gapi_mappings = array( ); public $items; public $kind; public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_Storage_Objects extends Google_Collection { protected $collection_key = 'prefixes'; protected $internal_gapi_mappings = array( ); protected $itemsType = 'UDP_Google_Service_Storage_StorageObject'; protected $itemsDataType = 'array'; public $kind; public $nextPageToken; public $prefixes; public function setItems($items) { $this->items = $items; } public function getItems() { return $this->items; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setPrefixes($prefixes) { $this->prefixes = $prefixes; } public function getPrefixes() { return $this->prefixes; } } class Google_Service_Storage_RewriteResponse extends Google_Model { protected $internal_gapi_mappings = array( ); public $done; public $kind; public $objectSize; protected $resourceType = 'UDP_Google_Service_Storage_StorageObject'; protected $resourceDataType = ''; public $rewriteToken; public $totalBytesRewritten; public function setDone($done) { $this->done = $done; } public function getDone() { return $this->done; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setObjectSize($objectSize) { $this->objectSize = $objectSize; } public function getObjectSize() { return $this->objectSize; } public function setResource(UDP_Google_Service_Storage_StorageObject $resource) { $this->resource = $resource; } public function getResource() { return $this->resource; } public function setRewriteToken($rewriteToken) { $this->rewriteToken = $rewriteToken; } public function getRewriteToken() { return $this->rewriteToken; } public function setTotalBytesRewritten($totalBytesRewritten) { $this->totalBytesRewritten = $totalBytesRewritten; } public function getTotalBytesRewritten() { return $this->totalBytesRewritten; } } class UDP_Google_Service_Storage_StorageObject extends Google_Collection { protected $collection_key = 'acl'; protected $internal_gapi_mappings = array( ); protected $aclType = 'Google_Service_Storage_ObjectAccessControl'; protected $aclDataType = 'array'; public $bucket; public $cacheControl; public $componentCount; public $contentDisposition; public $contentEncoding; public $contentLanguage; public $contentType; public $crc32c; public $etag; public $generation; public $id; public $kind; public $md5Hash; public $mediaLink; public $metadata; public $metageneration; public $name; protected $ownerType = 'Google_Service_Storage_StorageObjectOwner'; protected $ownerDataType = ''; public $selfLink; public $size; public $storageClass; public $timeDeleted; public $updated; public function setAcl($acl) { $this->acl = $acl; } public function getAcl() { return $this->acl; } public function setBucket($bucket) { $this->bucket = $bucket; } public function getBucket() { return $this->bucket; } public function setCacheControl($cacheControl) { $this->cacheControl = $cacheControl; } public function getCacheControl() { return $this->cacheControl; } public function setComponentCount($componentCount) { $this->componentCount = $componentCount; } public function getComponentCount() { return $this->componentCount; } public function setContentDisposition($contentDisposition) { $this->contentDisposition = $contentDisposition; } public function getContentDisposition() { return $this->contentDisposition; } public function setContentEncoding($contentEncoding) { $this->contentEncoding = $contentEncoding; } public function getContentEncoding() { return $this->contentEncoding; } public function setContentLanguage($contentLanguage) { $this->contentLanguage = $contentLanguage; } public function getContentLanguage() { return $this->contentLanguage; } public function setContentType($contentType) { $this->contentType = $contentType; } public function getContentType() { return $this->contentType; } public function setCrc32c($crc32c) { $this->crc32c = $crc32c; } public function getCrc32c() { return $this->crc32c; } public function setEtag($etag) { $this->etag = $etag; } public function getEtag() { return $this->etag; } public function setGeneration($generation) { $this->generation = $generation; } public function getGeneration() { return $this->generation; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setMd5Hash($md5Hash) { $this->md5Hash = $md5Hash; } public function getMd5Hash() { return $this->md5Hash; } public function setMediaLink($mediaLink) { $this->mediaLink = $mediaLink; } public function getMediaLink() { return $this->mediaLink; } public function setMetadata($metadata) { $this->metadata = $metadata; } public function getMetadata() { return $this->metadata; } public function setMetageneration($metageneration) { $this->metageneration = $metageneration; } public function getMetageneration() { return $this->metageneration; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setOwner(Google_Service_Storage_StorageObjectOwner $owner) { $this->owner = $owner; } public function getOwner() { return $this->owner; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setSize($size) { $this->size = $size; } public function getSize() { return $this->size; } public function setStorageClass($storageClass) { $this->storageClass = $storageClass; } public function getStorageClass() { return $this->storageClass; } public function setTimeDeleted($timeDeleted) { $this->timeDeleted = $timeDeleted; } public function getTimeDeleted() { return $this->timeDeleted; } public function setUpdated($updated) { $this->updated = $updated; } public function getUpdated() { return $this->updated; } } class Google_Service_Storage_StorageObjectMetadata extends Google_Model { } class Google_Service_Storage_StorageObjectOwner extends Google_Model { protected $internal_gapi_mappings = array( ); public $entity; public $entityId; public function setEntity($entity) { $this->entity = $entity; } public function getEntity() { return $this->entity; } public function setEntityId($entityId) { $this->entityId = $entityId; } public function getEntityId() { return $this->entityId; } } PKwL\Tv# 1updraftplus/includes/Google/Service/Exception.phpnu[= 0) { parent::__construct($message, $code, $previous); } else { parent::__construct($message, $code); } $this->errors = $errors; if (is_array($retryMap)) { $this->retryMap = $retryMap; } } /** * An example of the possible errors returned. * * { * "domain": "global", * "reason": "authError", * "message": "Invalid Credentials", * "locationType": "header", * "location": "Authorization", * } * * @return [{string, string}] List of errors return in an HTTP response or []. */ public function getErrors() { return $this->errors; } /** * Gets the number of times the associated task can be retried. * * NOTE: -1 is returned if the task can be retried indefinitely * * @return integer */ public function allowedRetries() { if (isset($this->retryMap[$this->code])) { return $this->retryMap[$this->code]; } $errors = $this->getErrors(); if (!empty($errors) && isset($errors[0]['reason']) && isset($this->retryMap[$errors[0]['reason']])) { return $this->retryMap[$errors[0]['reason']]; } return 0; } } PKwL\~C;TT1updraftplus/includes/Google/Service/Datastore.phpnu[ * API for accessing Google Cloud Datastore.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Google_Service_Datastore extends UDP_Google_Service { /** View and manage your data across Google Cloud Platform services. */ const CLOUD_PLATFORM = "https://www.googleapis.com/auth/cloud-platform"; /** View and manage your Google Cloud Datastore data. */ const DATASTORE = "https://www.googleapis.com/auth/datastore"; /** View your email address. */ const USERINFO_EMAIL = "https://www.googleapis.com/auth/userinfo.email"; public $datasets; /** * Constructs the internal representation of the Datastore service. * * @param Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = 'datastore/v1beta2/datasets/'; $this->version = 'v1beta2'; $this->serviceName = 'datastore'; $this->datasets = new Google_Service_Datastore_Datasets_Resource( $this, $this->serviceName, 'datasets', array( 'methods' => array( 'allocateIds' => array( 'path' => '{datasetId}/allocateIds', 'httpMethod' => 'POST', 'parameters' => array( 'datasetId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'beginTransaction' => array( 'path' => '{datasetId}/beginTransaction', 'httpMethod' => 'POST', 'parameters' => array( 'datasetId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'commit' => array( 'path' => '{datasetId}/commit', 'httpMethod' => 'POST', 'parameters' => array( 'datasetId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'lookup' => array( 'path' => '{datasetId}/lookup', 'httpMethod' => 'POST', 'parameters' => array( 'datasetId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'rollback' => array( 'path' => '{datasetId}/rollback', 'httpMethod' => 'POST', 'parameters' => array( 'datasetId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'runQuery' => array( 'path' => '{datasetId}/runQuery', 'httpMethod' => 'POST', 'parameters' => array( 'datasetId' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); } } /** * The "datasets" collection of methods. * Typical usage is: * * $datastoreService = new Google_Service_Datastore(...); * $datasets = $datastoreService->datasets; * */ class Google_Service_Datastore_Datasets_Resource extends UDP_Google_Service_Resource { /** * Allocate IDs for incomplete keys (useful for referencing an entity before it * is inserted). (datasets.allocateIds) * * @param string $datasetId Identifies the dataset. * @param Google_AllocateIdsRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_Datastore_AllocateIdsResponse */ public function allocateIds($datasetId, Google_Service_Datastore_AllocateIdsRequest $postBody, $optParams = array()) { $params = array('datasetId' => $datasetId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('allocateIds', array($params), "Google_Service_Datastore_AllocateIdsResponse"); } /** * Begin a new transaction. (datasets.beginTransaction) * * @param string $datasetId Identifies the dataset. * @param Google_BeginTransactionRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_Datastore_BeginTransactionResponse */ public function beginTransaction($datasetId, Google_Service_Datastore_BeginTransactionRequest $postBody, $optParams = array()) { $params = array('datasetId' => $datasetId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('beginTransaction', array($params), "Google_Service_Datastore_BeginTransactionResponse"); } /** * Commit a transaction, optionally creating, deleting or modifying some * entities. (datasets.commit) * * @param string $datasetId Identifies the dataset. * @param Google_CommitRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_Datastore_CommitResponse */ public function commit($datasetId, Google_Service_Datastore_CommitRequest $postBody, $optParams = array()) { $params = array('datasetId' => $datasetId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('commit', array($params), "Google_Service_Datastore_CommitResponse"); } /** * Look up some entities by key. (datasets.lookup) * * @param string $datasetId Identifies the dataset. * @param Google_LookupRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_Datastore_LookupResponse */ public function lookup($datasetId, Google_Service_Datastore_LookupRequest $postBody, $optParams = array()) { $params = array('datasetId' => $datasetId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('lookup', array($params), "Google_Service_Datastore_LookupResponse"); } /** * Roll back a transaction. (datasets.rollback) * * @param string $datasetId Identifies the dataset. * @param Google_RollbackRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_Datastore_RollbackResponse */ public function rollback($datasetId, Google_Service_Datastore_RollbackRequest $postBody, $optParams = array()) { $params = array('datasetId' => $datasetId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('rollback', array($params), "Google_Service_Datastore_RollbackResponse"); } /** * Query for entities. (datasets.runQuery) * * @param string $datasetId Identifies the dataset. * @param Google_RunQueryRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_Datastore_RunQueryResponse */ public function runQuery($datasetId, Google_Service_Datastore_RunQueryRequest $postBody, $optParams = array()) { $params = array('datasetId' => $datasetId, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('runQuery', array($params), "Google_Service_Datastore_RunQueryResponse"); } } class Google_Service_Datastore_AllocateIdsRequest extends Google_Collection { protected $collection_key = 'keys'; protected $internal_gapi_mappings = array( ); protected $keysType = 'Google_Service_Datastore_Key'; protected $keysDataType = 'array'; public function setKeys($keys) { $this->keys = $keys; } public function getKeys() { return $this->keys; } } class Google_Service_Datastore_AllocateIdsResponse extends Google_Collection { protected $collection_key = 'keys'; protected $internal_gapi_mappings = array( ); protected $headerType = 'Google_Service_Datastore_ResponseHeader'; protected $headerDataType = ''; protected $keysType = 'Google_Service_Datastore_Key'; protected $keysDataType = 'array'; public function setHeader(Google_Service_Datastore_ResponseHeader $header) { $this->header = $header; } public function getHeader() { return $this->header; } public function setKeys($keys) { $this->keys = $keys; } public function getKeys() { return $this->keys; } } class Google_Service_Datastore_BeginTransactionRequest extends Google_Model { protected $internal_gapi_mappings = array( ); public $isolationLevel; public function setIsolationLevel($isolationLevel) { $this->isolationLevel = $isolationLevel; } public function getIsolationLevel() { return $this->isolationLevel; } } class Google_Service_Datastore_BeginTransactionResponse extends Google_Model { protected $internal_gapi_mappings = array( ); protected $headerType = 'Google_Service_Datastore_ResponseHeader'; protected $headerDataType = ''; public $transaction; public function setHeader(Google_Service_Datastore_ResponseHeader $header) { $this->header = $header; } public function getHeader() { return $this->header; } public function setTransaction($transaction) { $this->transaction = $transaction; } public function getTransaction() { return $this->transaction; } } class Google_Service_Datastore_CommitRequest extends Google_Model { protected $internal_gapi_mappings = array( ); public $ignoreReadOnly; public $mode; protected $mutationType = 'Google_Service_Datastore_Mutation'; protected $mutationDataType = ''; public $transaction; public function setIgnoreReadOnly($ignoreReadOnly) { $this->ignoreReadOnly = $ignoreReadOnly; } public function getIgnoreReadOnly() { return $this->ignoreReadOnly; } public function setMode($mode) { $this->mode = $mode; } public function getMode() { return $this->mode; } public function setMutation(Google_Service_Datastore_Mutation $mutation) { $this->mutation = $mutation; } public function getMutation() { return $this->mutation; } public function setTransaction($transaction) { $this->transaction = $transaction; } public function getTransaction() { return $this->transaction; } } class Google_Service_Datastore_CommitResponse extends Google_Model { protected $internal_gapi_mappings = array( ); protected $headerType = 'Google_Service_Datastore_ResponseHeader'; protected $headerDataType = ''; protected $mutationResultType = 'Google_Service_Datastore_MutationResult'; protected $mutationResultDataType = ''; public function setHeader(Google_Service_Datastore_ResponseHeader $header) { $this->header = $header; } public function getHeader() { return $this->header; } public function setMutationResult(Google_Service_Datastore_MutationResult $mutationResult) { $this->mutationResult = $mutationResult; } public function getMutationResult() { return $this->mutationResult; } } class Google_Service_Datastore_CompositeFilter extends Google_Collection { protected $collection_key = 'filters'; protected $internal_gapi_mappings = array( ); protected $filtersType = 'Google_Service_Datastore_Filter'; protected $filtersDataType = 'array'; public $operator; public function setFilters($filters) { $this->filters = $filters; } public function getFilters() { return $this->filters; } public function setOperator($operator) { $this->operator = $operator; } public function getOperator() { return $this->operator; } } class Google_Service_Datastore_Entity extends Google_Model { protected $internal_gapi_mappings = array( ); protected $keyType = 'Google_Service_Datastore_Key'; protected $keyDataType = ''; protected $propertiesType = 'Google_Service_Datastore_Property'; protected $propertiesDataType = 'map'; public function setKey(Google_Service_Datastore_Key $key) { $this->key = $key; } public function getKey() { return $this->key; } public function setProperties($properties) { $this->properties = $properties; } public function getProperties() { return $this->properties; } } class Google_Service_Datastore_EntityProperties extends Google_Model { } class Google_Service_Datastore_EntityResult extends Google_Model { protected $internal_gapi_mappings = array( ); protected $entityType = 'Google_Service_Datastore_Entity'; protected $entityDataType = ''; public function setEntity(Google_Service_Datastore_Entity $entity) { $this->entity = $entity; } public function getEntity() { return $this->entity; } } class Google_Service_Datastore_Filter extends Google_Model { protected $internal_gapi_mappings = array( ); protected $compositeFilterType = 'Google_Service_Datastore_CompositeFilter'; protected $compositeFilterDataType = ''; protected $propertyFilterType = 'Google_Service_Datastore_PropertyFilter'; protected $propertyFilterDataType = ''; public function setCompositeFilter(Google_Service_Datastore_CompositeFilter $compositeFilter) { $this->compositeFilter = $compositeFilter; } public function getCompositeFilter() { return $this->compositeFilter; } public function setPropertyFilter(Google_Service_Datastore_PropertyFilter $propertyFilter) { $this->propertyFilter = $propertyFilter; } public function getPropertyFilter() { return $this->propertyFilter; } } class Google_Service_Datastore_GqlQuery extends Google_Collection { protected $collection_key = 'numberArgs'; protected $internal_gapi_mappings = array( ); public $allowLiteral; protected $nameArgsType = 'Google_Service_Datastore_GqlQueryArg'; protected $nameArgsDataType = 'array'; protected $numberArgsType = 'Google_Service_Datastore_GqlQueryArg'; protected $numberArgsDataType = 'array'; public $queryString; public function setAllowLiteral($allowLiteral) { $this->allowLiteral = $allowLiteral; } public function getAllowLiteral() { return $this->allowLiteral; } public function setNameArgs($nameArgs) { $this->nameArgs = $nameArgs; } public function getNameArgs() { return $this->nameArgs; } public function setNumberArgs($numberArgs) { $this->numberArgs = $numberArgs; } public function getNumberArgs() { return $this->numberArgs; } public function setQueryString($queryString) { $this->queryString = $queryString; } public function getQueryString() { return $this->queryString; } } class Google_Service_Datastore_GqlQueryArg extends Google_Model { protected $internal_gapi_mappings = array( ); public $cursor; public $name; protected $valueType = 'Google_Service_Datastore_Value'; protected $valueDataType = ''; public function setCursor($cursor) { $this->cursor = $cursor; } public function getCursor() { return $this->cursor; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setValue(Google_Service_Datastore_Value $value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_Datastore_Key extends Google_Collection { protected $collection_key = 'path'; protected $internal_gapi_mappings = array( ); protected $partitionIdType = 'Google_Service_Datastore_PartitionId'; protected $partitionIdDataType = ''; protected $pathType = 'Google_Service_Datastore_KeyPathElement'; protected $pathDataType = 'array'; public function setPartitionId(Google_Service_Datastore_PartitionId $partitionId) { $this->partitionId = $partitionId; } public function getPartitionId() { return $this->partitionId; } public function setPath($path) { $this->path = $path; } public function getPath() { return $this->path; } } class Google_Service_Datastore_KeyPathElement extends Google_Model { protected $internal_gapi_mappings = array( ); public $id; public $kind; public $name; public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Google_Service_Datastore_KindExpression extends Google_Model { protected $internal_gapi_mappings = array( ); public $name; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Google_Service_Datastore_LookupRequest extends Google_Collection { protected $collection_key = 'keys'; protected $internal_gapi_mappings = array( ); protected $keysType = 'Google_Service_Datastore_Key'; protected $keysDataType = 'array'; protected $readOptionsType = 'Google_Service_Datastore_ReadOptions'; protected $readOptionsDataType = ''; public function setKeys($keys) { $this->keys = $keys; } public function getKeys() { return $this->keys; } public function setReadOptions(Google_Service_Datastore_ReadOptions $readOptions) { $this->readOptions = $readOptions; } public function getReadOptions() { return $this->readOptions; } } class Google_Service_Datastore_LookupResponse extends Google_Collection { protected $collection_key = 'missing'; protected $internal_gapi_mappings = array( ); protected $deferredType = 'Google_Service_Datastore_Key'; protected $deferredDataType = 'array'; protected $foundType = 'Google_Service_Datastore_EntityResult'; protected $foundDataType = 'array'; protected $headerType = 'Google_Service_Datastore_ResponseHeader'; protected $headerDataType = ''; protected $missingType = 'Google_Service_Datastore_EntityResult'; protected $missingDataType = 'array'; public function setDeferred($deferred) { $this->deferred = $deferred; } public function getDeferred() { return $this->deferred; } public function setFound($found) { $this->found = $found; } public function getFound() { return $this->found; } public function setHeader(Google_Service_Datastore_ResponseHeader $header) { $this->header = $header; } public function getHeader() { return $this->header; } public function setMissing($missing) { $this->missing = $missing; } public function getMissing() { return $this->missing; } } class Google_Service_Datastore_Mutation extends Google_Collection { protected $collection_key = 'upsert'; protected $internal_gapi_mappings = array( ); protected $deleteType = 'Google_Service_Datastore_Key'; protected $deleteDataType = 'array'; public $force; protected $insertType = 'Google_Service_Datastore_Entity'; protected $insertDataType = 'array'; protected $insertAutoIdType = 'Google_Service_Datastore_Entity'; protected $insertAutoIdDataType = 'array'; protected $updateType = 'Google_Service_Datastore_Entity'; protected $updateDataType = 'array'; protected $upsertType = 'Google_Service_Datastore_Entity'; protected $upsertDataType = 'array'; public function setDelete($delete) { $this->delete = $delete; } public function getDelete() { return $this->delete; } public function setForce($force) { $this->force = $force; } public function getForce() { return $this->force; } public function setInsert($insert) { $this->insert = $insert; } public function getInsert() { return $this->insert; } public function setInsertAutoId($insertAutoId) { $this->insertAutoId = $insertAutoId; } public function getInsertAutoId() { return $this->insertAutoId; } public function setUpdate($update) { $this->update = $update; } public function getUpdate() { return $this->update; } public function setUpsert($upsert) { $this->upsert = $upsert; } public function getUpsert() { return $this->upsert; } } class Google_Service_Datastore_MutationResult extends Google_Collection { protected $collection_key = 'insertAutoIdKeys'; protected $internal_gapi_mappings = array( ); public $indexUpdates; protected $insertAutoIdKeysType = 'Google_Service_Datastore_Key'; protected $insertAutoIdKeysDataType = 'array'; public function setIndexUpdates($indexUpdates) { $this->indexUpdates = $indexUpdates; } public function getIndexUpdates() { return $this->indexUpdates; } public function setInsertAutoIdKeys($insertAutoIdKeys) { $this->insertAutoIdKeys = $insertAutoIdKeys; } public function getInsertAutoIdKeys() { return $this->insertAutoIdKeys; } } class Google_Service_Datastore_PartitionId extends Google_Model { protected $internal_gapi_mappings = array( ); public $datasetId; public $namespace; public function setDatasetId($datasetId) { $this->datasetId = $datasetId; } public function getDatasetId() { return $this->datasetId; } public function setNamespace($namespace) { $this->namespace = $namespace; } public function getNamespace() { return $this->namespace; } } class Google_Service_Datastore_Property extends Google_Collection { protected $collection_key = 'listValue'; protected $internal_gapi_mappings = array( ); public $blobKeyValue; public $blobValue; public $booleanValue; public $dateTimeValue; public $doubleValue; protected $entityValueType = 'Google_Service_Datastore_Entity'; protected $entityValueDataType = ''; public $indexed; public $integerValue; protected $keyValueType = 'Google_Service_Datastore_Key'; protected $keyValueDataType = ''; protected $listValueType = 'Google_Service_Datastore_Value'; protected $listValueDataType = 'array'; public $meaning; public $stringValue; public function setBlobKeyValue($blobKeyValue) { $this->blobKeyValue = $blobKeyValue; } public function getBlobKeyValue() { return $this->blobKeyValue; } public function setBlobValue($blobValue) { $this->blobValue = $blobValue; } public function getBlobValue() { return $this->blobValue; } public function setBooleanValue($booleanValue) { $this->booleanValue = $booleanValue; } public function getBooleanValue() { return $this->booleanValue; } public function setDateTimeValue($dateTimeValue) { $this->dateTimeValue = $dateTimeValue; } public function getDateTimeValue() { return $this->dateTimeValue; } public function setDoubleValue($doubleValue) { $this->doubleValue = $doubleValue; } public function getDoubleValue() { return $this->doubleValue; } public function setEntityValue(Google_Service_Datastore_Entity $entityValue) { $this->entityValue = $entityValue; } public function getEntityValue() { return $this->entityValue; } public function setIndexed($indexed) { $this->indexed = $indexed; } public function getIndexed() { return $this->indexed; } public function setIntegerValue($integerValue) { $this->integerValue = $integerValue; } public function getIntegerValue() { return $this->integerValue; } public function setKeyValue(Google_Service_Datastore_Key $keyValue) { $this->keyValue = $keyValue; } public function getKeyValue() { return $this->keyValue; } public function setListValue($listValue) { $this->listValue = $listValue; } public function getListValue() { return $this->listValue; } public function setMeaning($meaning) { $this->meaning = $meaning; } public function getMeaning() { return $this->meaning; } public function setStringValue($stringValue) { $this->stringValue = $stringValue; } public function getStringValue() { return $this->stringValue; } } class Google_Service_Datastore_PropertyExpression extends Google_Model { protected $internal_gapi_mappings = array( ); public $aggregationFunction; protected $propertyType = 'Google_Service_Datastore_PropertyReference'; protected $propertyDataType = ''; public function setAggregationFunction($aggregationFunction) { $this->aggregationFunction = $aggregationFunction; } public function getAggregationFunction() { return $this->aggregationFunction; } public function setProperty(Google_Service_Datastore_PropertyReference $property) { $this->property = $property; } public function getProperty() { return $this->property; } } class Google_Service_Datastore_PropertyFilter extends Google_Model { protected $internal_gapi_mappings = array( ); public $operator; protected $propertyType = 'Google_Service_Datastore_PropertyReference'; protected $propertyDataType = ''; protected $valueType = 'Google_Service_Datastore_Value'; protected $valueDataType = ''; public function setOperator($operator) { $this->operator = $operator; } public function getOperator() { return $this->operator; } public function setProperty(Google_Service_Datastore_PropertyReference $property) { $this->property = $property; } public function getProperty() { return $this->property; } public function setValue(Google_Service_Datastore_Value $value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_Datastore_PropertyOrder extends Google_Model { protected $internal_gapi_mappings = array( ); public $direction; protected $propertyType = 'Google_Service_Datastore_PropertyReference'; protected $propertyDataType = ''; public function setDirection($direction) { $this->direction = $direction; } public function getDirection() { return $this->direction; } public function setProperty(Google_Service_Datastore_PropertyReference $property) { $this->property = $property; } public function getProperty() { return $this->property; } } class Google_Service_Datastore_PropertyReference extends Google_Model { protected $internal_gapi_mappings = array( ); public $name; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Google_Service_Datastore_Query extends Google_Collection { protected $collection_key = 'projection'; protected $internal_gapi_mappings = array( ); public $endCursor; protected $filterType = 'Google_Service_Datastore_Filter'; protected $filterDataType = ''; protected $groupByType = 'Google_Service_Datastore_PropertyReference'; protected $groupByDataType = 'array'; protected $kindsType = 'Google_Service_Datastore_KindExpression'; protected $kindsDataType = 'array'; public $limit; public $offset; protected $orderType = 'Google_Service_Datastore_PropertyOrder'; protected $orderDataType = 'array'; protected $projectionType = 'Google_Service_Datastore_PropertyExpression'; protected $projectionDataType = 'array'; public $startCursor; public function setEndCursor($endCursor) { $this->endCursor = $endCursor; } public function getEndCursor() { return $this->endCursor; } public function setFilter(Google_Service_Datastore_Filter $filter) { $this->filter = $filter; } public function getFilter() { return $this->filter; } public function setGroupBy($groupBy) { $this->groupBy = $groupBy; } public function getGroupBy() { return $this->groupBy; } public function setKinds($kinds) { $this->kinds = $kinds; } public function getKinds() { return $this->kinds; } public function setLimit($limit) { $this->limit = $limit; } public function getLimit() { return $this->limit; } public function setOffset($offset) { $this->offset = $offset; } public function getOffset() { return $this->offset; } public function setOrder($order) { $this->order = $order; } public function getOrder() { return $this->order; } public function setProjection($projection) { $this->projection = $projection; } public function getProjection() { return $this->projection; } public function setStartCursor($startCursor) { $this->startCursor = $startCursor; } public function getStartCursor() { return $this->startCursor; } } class Google_Service_Datastore_QueryResultBatch extends Google_Collection { protected $collection_key = 'entityResults'; protected $internal_gapi_mappings = array( ); public $endCursor; public $entityResultType; protected $entityResultsType = 'Google_Service_Datastore_EntityResult'; protected $entityResultsDataType = 'array'; public $moreResults; public $skippedResults; public function setEndCursor($endCursor) { $this->endCursor = $endCursor; } public function getEndCursor() { return $this->endCursor; } public function setEntityResultType($entityResultType) { $this->entityResultType = $entityResultType; } public function getEntityResultType() { return $this->entityResultType; } public function setEntityResults($entityResults) { $this->entityResults = $entityResults; } public function getEntityResults() { return $this->entityResults; } public function setMoreResults($moreResults) { $this->moreResults = $moreResults; } public function getMoreResults() { return $this->moreResults; } public function setSkippedResults($skippedResults) { $this->skippedResults = $skippedResults; } public function getSkippedResults() { return $this->skippedResults; } } class Google_Service_Datastore_ReadOptions extends Google_Model { protected $internal_gapi_mappings = array( ); public $readConsistency; public $transaction; public function setReadConsistency($readConsistency) { $this->readConsistency = $readConsistency; } public function getReadConsistency() { return $this->readConsistency; } public function setTransaction($transaction) { $this->transaction = $transaction; } public function getTransaction() { return $this->transaction; } } class Google_Service_Datastore_ResponseHeader extends Google_Model { protected $internal_gapi_mappings = array( ); public $kind; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_Datastore_RollbackRequest extends Google_Model { protected $internal_gapi_mappings = array( ); public $transaction; public function setTransaction($transaction) { $this->transaction = $transaction; } public function getTransaction() { return $this->transaction; } } class Google_Service_Datastore_RollbackResponse extends Google_Model { protected $internal_gapi_mappings = array( ); protected $headerType = 'Google_Service_Datastore_ResponseHeader'; protected $headerDataType = ''; public function setHeader(Google_Service_Datastore_ResponseHeader $header) { $this->header = $header; } public function getHeader() { return $this->header; } } class Google_Service_Datastore_RunQueryRequest extends Google_Model { protected $internal_gapi_mappings = array( ); protected $gqlQueryType = 'Google_Service_Datastore_GqlQuery'; protected $gqlQueryDataType = ''; protected $partitionIdType = 'Google_Service_Datastore_PartitionId'; protected $partitionIdDataType = ''; protected $queryType = 'Google_Service_Datastore_Query'; protected $queryDataType = ''; protected $readOptionsType = 'Google_Service_Datastore_ReadOptions'; protected $readOptionsDataType = ''; public function setGqlQuery(Google_Service_Datastore_GqlQuery $gqlQuery) { $this->gqlQuery = $gqlQuery; } public function getGqlQuery() { return $this->gqlQuery; } public function setPartitionId(Google_Service_Datastore_PartitionId $partitionId) { $this->partitionId = $partitionId; } public function getPartitionId() { return $this->partitionId; } public function setQuery(Google_Service_Datastore_Query $query) { $this->query = $query; } public function getQuery() { return $this->query; } public function setReadOptions(Google_Service_Datastore_ReadOptions $readOptions) { $this->readOptions = $readOptions; } public function getReadOptions() { return $this->readOptions; } } class Google_Service_Datastore_RunQueryResponse extends Google_Model { protected $internal_gapi_mappings = array( ); protected $batchType = 'Google_Service_Datastore_QueryResultBatch'; protected $batchDataType = ''; protected $headerType = 'Google_Service_Datastore_ResponseHeader'; protected $headerDataType = ''; public function setBatch(Google_Service_Datastore_QueryResultBatch $batch) { $this->batch = $batch; } public function getBatch() { return $this->batch; } public function setHeader(Google_Service_Datastore_ResponseHeader $header) { $this->header = $header; } public function getHeader() { return $this->header; } } class Google_Service_Datastore_Value extends Google_Collection { protected $collection_key = 'listValue'; protected $internal_gapi_mappings = array( ); public $blobKeyValue; public $blobValue; public $booleanValue; public $dateTimeValue; public $doubleValue; protected $entityValueType = 'Google_Service_Datastore_Entity'; protected $entityValueDataType = ''; public $indexed; public $integerValue; protected $keyValueType = 'Google_Service_Datastore_Key'; protected $keyValueDataType = ''; protected $listValueType = 'Google_Service_Datastore_Value'; protected $listValueDataType = 'array'; public $meaning; public $stringValue; public function setBlobKeyValue($blobKeyValue) { $this->blobKeyValue = $blobKeyValue; } public function getBlobKeyValue() { return $this->blobKeyValue; } public function setBlobValue($blobValue) { $this->blobValue = $blobValue; } public function getBlobValue() { return $this->blobValue; } public function setBooleanValue($booleanValue) { $this->booleanValue = $booleanValue; } public function getBooleanValue() { return $this->booleanValue; } public function setDateTimeValue($dateTimeValue) { $this->dateTimeValue = $dateTimeValue; } public function getDateTimeValue() { return $this->dateTimeValue; } public function setDoubleValue($doubleValue) { $this->doubleValue = $doubleValue; } public function getDoubleValue() { return $this->doubleValue; } public function setEntityValue(Google_Service_Datastore_Entity $entityValue) { $this->entityValue = $entityValue; } public function getEntityValue() { return $this->entityValue; } public function setIndexed($indexed) { $this->indexed = $indexed; } public function getIndexed() { return $this->indexed; } public function setIntegerValue($integerValue) { $this->integerValue = $integerValue; } public function getIntegerValue() { return $this->integerValue; } public function setKeyValue(Google_Service_Datastore_Key $keyValue) { $this->keyValue = $keyValue; } public function getKeyValue() { return $this->keyValue; } public function setListValue($listValue) { $this->listValue = $listValue; } public function getListValue() { return $this->listValue; } public function setMeaning($meaning) { $this->meaning = $meaning; } public function getMeaning() { return $this->meaning; } public function setStringValue($stringValue) { $this->stringValue = $stringValue; } public function getStringValue() { return $this->stringValue; } } PKwL\9updraftplus/includes/Google/Service/Deploymentmanager.phpnu[ * The Deployment Manager API allows users to declaratively configure, deploy * and run complex solutions on the Google Cloud Platform.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Google_Service_Deploymentmanager extends UDP_Google_Service { /** View and manage your data across Google Cloud Platform services. */ const CLOUD_PLATFORM = "https://www.googleapis.com/auth/cloud-platform"; /** View and manage your Google Cloud Platform management resources and deployment status information. */ const NDEV_CLOUDMAN = "https://www.googleapis.com/auth/ndev.cloudman"; /** View your Google Cloud Platform management resources and deployment status information. */ const NDEV_CLOUDMAN_READONLY = "https://www.googleapis.com/auth/ndev.cloudman.readonly"; public $deployments; public $manifests; public $operations; public $resources; public $types; /** * Constructs the internal representation of the Deploymentmanager service. * * @param Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = 'deploymentmanager/v2beta1/projects/'; $this->version = 'v2beta1'; $this->serviceName = 'deploymentmanager'; $this->deployments = new Google_Service_Deploymentmanager_Deployments_Resource( $this, $this->serviceName, 'deployments', array( 'methods' => array( 'delete' => array( 'path' => '{project}/global/deployments/{deployment}', 'httpMethod' => 'DELETE', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deployment' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'get' => array( 'path' => '{project}/global/deployments/{deployment}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deployment' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'insert' => array( 'path' => '{project}/global/deployments', 'httpMethod' => 'POST', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{project}/global/deployments', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->manifests = new Google_Service_Deploymentmanager_Manifests_Resource( $this, $this->serviceName, 'manifests', array( 'methods' => array( 'get' => array( 'path' => '{project}/global/deployments/{deployment}/manifests/{manifest}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deployment' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'manifest' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{project}/global/deployments/{deployment}/manifests', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deployment' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->operations = new Google_Service_Deploymentmanager_Operations_Resource( $this, $this->serviceName, 'operations', array( 'methods' => array( 'get' => array( 'path' => '{project}/global/operations/{operation}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'operation' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{project}/global/operations', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->resources = new Google_Service_Deploymentmanager_Resources_Resource( $this, $this->serviceName, 'resources', array( 'methods' => array( 'get' => array( 'path' => '{project}/global/deployments/{deployment}/resources/{resource}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deployment' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'resource' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{project}/global/deployments/{deployment}/resources', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'deployment' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); $this->types = new Google_Service_Deploymentmanager_Types_Resource( $this, $this->serviceName, 'types', array( 'methods' => array( 'list' => array( 'path' => '{project}/global/types', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'maxResults' => array( 'location' => 'query', 'type' => 'integer', ), ), ), ) ) ); } } /** * The "deployments" collection of methods. * Typical usage is: * * $deploymentmanagerService = new Google_Service_Deploymentmanager(...); * $deployments = $deploymentmanagerService->deployments; * */ class Google_Service_Deploymentmanager_Deployments_Resource extends UDP_Google_Service_Resource { /** * ! Deletes a deployment and all of the resources in the deployment. * (deployments.delete) * * @param string $project ! The project ID for this request. * @param string $deployment ! The name of the deployment for this request. * @param array $optParams Optional parameters. * @return Google_Service_Deploymentmanager_Operation */ public function delete($project, $deployment, $optParams = array()) { $params = array('project' => $project, 'deployment' => $deployment); $params = array_merge($params, $optParams); return $this->call('delete', array($params), "Google_Service_Deploymentmanager_Operation"); } /** * ! Gets information about a specific deployment. (deployments.get) * * @param string $project ! The project ID for this request. * @param string $deployment ! The name of the deployment for this request. * @param array $optParams Optional parameters. * @return Google_Service_Deploymentmanager_Deployment */ public function get($project, $deployment, $optParams = array()) { $params = array('project' => $project, 'deployment' => $deployment); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Deploymentmanager_Deployment"); } /** * ! Creates a deployment and all of the resources described by the ! deployment * manifest. (deployments.insert) * * @param string $project ! The project ID for this request. * @param Google_Deployment $postBody * @param array $optParams Optional parameters. * @return Google_Service_Deploymentmanager_Operation */ public function insert($project, Google_Service_Deploymentmanager_Deployment $postBody, $optParams = array()) { $params = array('project' => $project, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('insert', array($params), "Google_Service_Deploymentmanager_Operation"); } /** * ! Lists all deployments for a given project. (deployments.listDeployments) * * @param string $project ! The project ID for this request. * @param array $optParams Optional parameters. * * @opt_param string pageToken ! Specifies a nextPageToken returned by a * previous list request. This ! token can be used to request the next page of * results from a previous ! list request. * @opt_param int maxResults ! Maximum count of results to be returned. ! * Acceptable values are 0 to 100, inclusive. (Default: 50) * @return Google_Service_Deploymentmanager_DeploymentsListResponse */ public function listDeployments($project, $optParams = array()) { $params = array('project' => $project); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Deploymentmanager_DeploymentsListResponse"); } } /** * The "manifests" collection of methods. * Typical usage is: * * $deploymentmanagerService = new Google_Service_Deploymentmanager(...); * $manifests = $deploymentmanagerService->manifests; * */ class Google_Service_Deploymentmanager_Manifests_Resource extends UDP_Google_Service_Resource { /** * ! Gets information about a specific manifest. (manifests.get) * * @param string $project ! The project ID for this request. * @param string $deployment ! The name of the deployment for this request. * @param string $manifest ! The name of the manifest for this request. * @param array $optParams Optional parameters. * @return Google_Service_Deploymentmanager_Manifest */ public function get($project, $deployment, $manifest, $optParams = array()) { $params = array('project' => $project, 'deployment' => $deployment, 'manifest' => $manifest); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Deploymentmanager_Manifest"); } /** * ! Lists all manifests for a given deployment. (manifests.listManifests) * * @param string $project ! The project ID for this request. * @param string $deployment ! The name of the deployment for this request. * @param array $optParams Optional parameters. * * @opt_param string pageToken ! Specifies a nextPageToken returned by a * previous list request. This ! token can be used to request the next page of * results from a previous ! list request. * @opt_param int maxResults ! Maximum count of results to be returned. ! * Acceptable values are 0 to 100, inclusive. (Default: 50) * @return Google_Service_Deploymentmanager_ManifestsListResponse */ public function listManifests($project, $deployment, $optParams = array()) { $params = array('project' => $project, 'deployment' => $deployment); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Deploymentmanager_ManifestsListResponse"); } } /** * The "operations" collection of methods. * Typical usage is: * * $deploymentmanagerService = new Google_Service_Deploymentmanager(...); * $operations = $deploymentmanagerService->operations; * */ class Google_Service_Deploymentmanager_Operations_Resource extends UDP_Google_Service_Resource { /** * ! Gets information about a specific Operation. (operations.get) * * @param string $project ! The project ID for this request. * @param string $operation ! The name of the operation for this request. * @param array $optParams Optional parameters. * @return Google_Service_Deploymentmanager_Operation */ public function get($project, $operation, $optParams = array()) { $params = array('project' => $project, 'operation' => $operation); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Deploymentmanager_Operation"); } /** * ! Lists all Operations for a project. (operations.listOperations) * * @param string $project ! The project ID for this request. * @param array $optParams Optional parameters. * * @opt_param string pageToken ! Specifies a nextPageToken returned by a * previous list request. This ! token can be used to request the next page of * results from a previous ! list request. * @opt_param int maxResults ! Maximum count of results to be returned. ! * Acceptable values are 0 to 100, inclusive. (Default: 50) * @return Google_Service_Deploymentmanager_OperationsListResponse */ public function listOperations($project, $optParams = array()) { $params = array('project' => $project); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Deploymentmanager_OperationsListResponse"); } } /** * The "resources" collection of methods. * Typical usage is: * * $deploymentmanagerService = new Google_Service_Deploymentmanager(...); * $resources = $deploymentmanagerService->resources; * */ class Google_Service_Deploymentmanager_Resources_Resource extends UDP_Google_Service_Resource { /** * ! Gets information about a single resource. (resources.get) * * @param string $project ! The project ID for this request. * @param string $deployment ! The name of the deployment for this request. * @param string $resource ! The name of the resource for this request. * @param array $optParams Optional parameters. * @return Google_Service_Deploymentmanager_DeploymentmanagerResource */ public function get($project, $deployment, $resource, $optParams = array()) { $params = array('project' => $project, 'deployment' => $deployment, 'resource' => $resource); $params = array_merge($params, $optParams); return $this->call('get', array($params), "Google_Service_Deploymentmanager_DeploymentmanagerResource"); } /** * ! Lists all resources in a given deployment. (resources.listResources) * * @param string $project ! The project ID for this request. * @param string $deployment ! The name of the deployment for this request. * @param array $optParams Optional parameters. * * @opt_param string pageToken ! Specifies a nextPageToken returned by a * previous list request. This ! token can be used to request the next page of * results from a previous ! list request. * @opt_param int maxResults ! Maximum count of results to be returned. ! * Acceptable values are 0 to 100, inclusive. (Default: 50) * @return Google_Service_Deploymentmanager_ResourcesListResponse */ public function listResources($project, $deployment, $optParams = array()) { $params = array('project' => $project, 'deployment' => $deployment); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Deploymentmanager_ResourcesListResponse"); } } /** * The "types" collection of methods. * Typical usage is: * * $deploymentmanagerService = new Google_Service_Deploymentmanager(...); * $types = $deploymentmanagerService->types; * */ class Google_Service_Deploymentmanager_Types_Resource extends UDP_Google_Service_Resource { /** * ! Lists all Types for Deployment Manager. (types.listTypes) * * @param string $project ! The project ID for this request. * @param array $optParams Optional parameters. * * @opt_param string pageToken ! Specifies a nextPageToken returned by a * previous list request. This ! token can be used to request the next page of * results from a previous ! list request. * @opt_param int maxResults ! Maximum count of results to be returned. ! * Acceptable values are 0 to 100, inclusive. (Default: 50) * @return Google_Service_Deploymentmanager_TypesListResponse */ public function listTypes($project, $optParams = array()) { $params = array('project' => $project); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_Deploymentmanager_TypesListResponse"); } } class Google_Service_Deploymentmanager_Deployment extends Google_Model { protected $internal_gapi_mappings = array( ); public $description; public $id; public $manifest; public $name; public $targetConfig; public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setManifest($manifest) { $this->manifest = $manifest; } public function getManifest() { return $this->manifest; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setTargetConfig($targetConfig) { $this->targetConfig = $targetConfig; } public function getTargetConfig() { return $this->targetConfig; } } class Google_Service_Deploymentmanager_DeploymentmanagerResource extends Google_Collection { protected $collection_key = 'errors'; protected $internal_gapi_mappings = array( ); public $errors; public $id; public $intent; public $manifest; public $name; public $state; public $type; public $url; public function setErrors($errors) { $this->errors = $errors; } public function getErrors() { return $this->errors; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setIntent($intent) { $this->intent = $intent; } public function getIntent() { return $this->intent; } public function setManifest($manifest) { $this->manifest = $manifest; } public function getManifest() { return $this->manifest; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setState($state) { $this->state = $state; } public function getState() { return $this->state; } public function setType($type) { $this->type = $type; } public function getType() { return $this->type; } public function setUrl($url) { $this->url = $url; } public function getUrl() { return $this->url; } } class Google_Service_Deploymentmanager_DeploymentsListResponse extends Google_Collection { protected $collection_key = 'deployments'; protected $internal_gapi_mappings = array( ); protected $deploymentsType = 'Google_Service_Deploymentmanager_Deployment'; protected $deploymentsDataType = 'array'; public $nextPageToken; public function setDeployments($deployments) { $this->deployments = $deployments; } public function getDeployments() { return $this->deployments; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_Deploymentmanager_Manifest extends Google_Model { protected $internal_gapi_mappings = array( ); public $config; public $evaluatedConfig; public $id; public $name; public $selfLink; public function setConfig($config) { $this->config = $config; } public function getConfig() { return $this->config; } public function setEvaluatedConfig($evaluatedConfig) { $this->evaluatedConfig = $evaluatedConfig; } public function getEvaluatedConfig() { return $this->evaluatedConfig; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } } class Google_Service_Deploymentmanager_ManifestsListResponse extends Google_Collection { protected $collection_key = 'manifests'; protected $internal_gapi_mappings = array( ); protected $manifestsType = 'Google_Service_Deploymentmanager_Manifest'; protected $manifestsDataType = 'array'; public $nextPageToken; public function setManifests($manifests) { $this->manifests = $manifests; } public function getManifests() { return $this->manifests; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_Deploymentmanager_Operation extends Google_Collection { protected $collection_key = 'warnings'; protected $internal_gapi_mappings = array( ); public $creationTimestamp; public $endTime; protected $errorType = 'Google_Service_Deploymentmanager_OperationError'; protected $errorDataType = ''; public $httpErrorMessage; public $httpErrorStatusCode; public $id; public $insertTime; public $name; public $operationType; public $progress; public $selfLink; public $startTime; public $status; public $statusMessage; public $targetId; public $targetLink; public $user; protected $warningsType = 'Google_Service_Deploymentmanager_OperationWarnings'; protected $warningsDataType = 'array'; public function setCreationTimestamp($creationTimestamp) { $this->creationTimestamp = $creationTimestamp; } public function getCreationTimestamp() { return $this->creationTimestamp; } public function setEndTime($endTime) { $this->endTime = $endTime; } public function getEndTime() { return $this->endTime; } public function setError(Google_Service_Deploymentmanager_OperationError $error) { $this->error = $error; } public function getError() { return $this->error; } public function setHttpErrorMessage($httpErrorMessage) { $this->httpErrorMessage = $httpErrorMessage; } public function getHttpErrorMessage() { return $this->httpErrorMessage; } public function setHttpErrorStatusCode($httpErrorStatusCode) { $this->httpErrorStatusCode = $httpErrorStatusCode; } public function getHttpErrorStatusCode() { return $this->httpErrorStatusCode; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setInsertTime($insertTime) { $this->insertTime = $insertTime; } public function getInsertTime() { return $this->insertTime; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setOperationType($operationType) { $this->operationType = $operationType; } public function getOperationType() { return $this->operationType; } public function setProgress($progress) { $this->progress = $progress; } public function getProgress() { return $this->progress; } public function setSelfLink($selfLink) { $this->selfLink = $selfLink; } public function getSelfLink() { return $this->selfLink; } public function setStartTime($startTime) { $this->startTime = $startTime; } public function getStartTime() { return $this->startTime; } public function setStatus($status) { $this->status = $status; } public function getStatus() { return $this->status; } public function setStatusMessage($statusMessage) { $this->statusMessage = $statusMessage; } public function getStatusMessage() { return $this->statusMessage; } public function setTargetId($targetId) { $this->targetId = $targetId; } public function getTargetId() { return $this->targetId; } public function setTargetLink($targetLink) { $this->targetLink = $targetLink; } public function getTargetLink() { return $this->targetLink; } public function setUser($user) { $this->user = $user; } public function getUser() { return $this->user; } public function setWarnings($warnings) { $this->warnings = $warnings; } public function getWarnings() { return $this->warnings; } } class Google_Service_Deploymentmanager_OperationError extends Google_Collection { protected $collection_key = 'errors'; protected $internal_gapi_mappings = array( ); protected $errorsType = 'Google_Service_Deploymentmanager_OperationErrorErrors'; protected $errorsDataType = 'array'; public function setErrors($errors) { $this->errors = $errors; } public function getErrors() { return $this->errors; } } class Google_Service_Deploymentmanager_OperationErrorErrors extends Google_Model { protected $internal_gapi_mappings = array( ); public $code; public $location; public $message; public function setCode($code) { $this->code = $code; } public function getCode() { return $this->code; } public function setLocation($location) { $this->location = $location; } public function getLocation() { return $this->location; } public function setMessage($message) { $this->message = $message; } public function getMessage() { return $this->message; } } class Google_Service_Deploymentmanager_OperationWarnings extends Google_Collection { protected $collection_key = 'data'; protected $internal_gapi_mappings = array( ); public $code; protected $dataType = 'Google_Service_Deploymentmanager_OperationWarningsData'; protected $dataDataType = 'array'; public $message; public function setCode($code) { $this->code = $code; } public function getCode() { return $this->code; } public function setData($data) { $this->data = $data; } public function getData() { return $this->data; } public function setMessage($message) { $this->message = $message; } public function getMessage() { return $this->message; } } class Google_Service_Deploymentmanager_OperationWarningsData extends Google_Model { protected $internal_gapi_mappings = array( ); public $key; public $value; public function setKey($key) { $this->key = $key; } public function getKey() { return $this->key; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_Deploymentmanager_OperationsListResponse extends Google_Collection { protected $collection_key = 'operations'; protected $internal_gapi_mappings = array( ); public $nextPageToken; protected $operationsType = 'Google_Service_Deploymentmanager_Operation'; protected $operationsDataType = 'array'; public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setOperations($operations) { $this->operations = $operations; } public function getOperations() { return $this->operations; } } class Google_Service_Deploymentmanager_ResourcesListResponse extends Google_Collection { protected $collection_key = 'resources'; protected $internal_gapi_mappings = array( ); public $nextPageToken; protected $resourcesType = 'Google_Service_Deploymentmanager_DeploymentmanagerResource'; protected $resourcesDataType = 'array'; public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setResources($resources) { $this->resources = $resources; } public function getResources() { return $this->resources; } } class Google_Service_Deploymentmanager_Type extends Google_Model { protected $internal_gapi_mappings = array( ); public $name; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } class Google_Service_Deploymentmanager_TypesListResponse extends Google_Collection { protected $collection_key = 'types'; protected $internal_gapi_mappings = array( ); protected $typesType = 'Google_Service_Deploymentmanager_Type'; protected $typesDataType = 'array'; public function setTypes($types) { $this->types = $types; } public function getTypes() { return $this->types; } } PKwL\D@7updraftplus/includes/Google/Service/CloudMonitoring.phpnu[ * API for accessing Google Cloud and API monitoring data.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Google_Service_CloudMonitoring extends UDP_Google_Service { /** View and write monitoring data for all of your Google and third-party Cloud and API projects. */ const MONITORING = "https://www.googleapis.com/auth/monitoring"; public $metricDescriptors; public $timeseries; public $timeseriesDescriptors; /** * Constructs the internal representation of the CloudMonitoring service. * * @param Google_Client $client */ public function __construct(UDP_Google_Client $client) { parent::__construct($client); $this->servicePath = 'cloudmonitoring/v2beta2/projects/'; $this->version = 'v2beta2'; $this->serviceName = 'cloudmonitoring'; $this->metricDescriptors = new Google_Service_CloudMonitoring_MetricDescriptors_Resource( $this, $this->serviceName, 'metricDescriptors', array( 'methods' => array( 'create' => array( 'path' => '{project}/metricDescriptors', 'httpMethod' => 'POST', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'delete' => array( 'path' => '{project}/metricDescriptors/{metric}', 'httpMethod' => 'DELETE', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'metric' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ),'list' => array( 'path' => '{project}/metricDescriptors', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'count' => array( 'location' => 'query', 'type' => 'integer', ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'query' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); $this->timeseries = new Google_Service_CloudMonitoring_Timeseries_Resource( $this, $this->serviceName, 'timeseries', array( 'methods' => array( 'list' => array( 'path' => '{project}/timeseries/{metric}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'metric' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'youngest' => array( 'location' => 'query', 'type' => 'string', 'required' => true, ), 'count' => array( 'location' => 'query', 'type' => 'integer', ), 'timespan' => array( 'location' => 'query', 'type' => 'string', ), 'aggregator' => array( 'location' => 'query', 'type' => 'string', ), 'labels' => array( 'location' => 'query', 'type' => 'string', 'repeated' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'window' => array( 'location' => 'query', 'type' => 'string', ), 'oldest' => array( 'location' => 'query', 'type' => 'string', ), ), ),'write' => array( 'path' => '{project}/timeseries:write', 'httpMethod' => 'POST', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), ), ), ) ) ); $this->timeseriesDescriptors = new Google_Service_CloudMonitoring_TimeseriesDescriptors_Resource( $this, $this->serviceName, 'timeseriesDescriptors', array( 'methods' => array( 'list' => array( 'path' => '{project}/timeseriesDescriptors/{metric}', 'httpMethod' => 'GET', 'parameters' => array( 'project' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'metric' => array( 'location' => 'path', 'type' => 'string', 'required' => true, ), 'youngest' => array( 'location' => 'query', 'type' => 'string', 'required' => true, ), 'count' => array( 'location' => 'query', 'type' => 'integer', ), 'timespan' => array( 'location' => 'query', 'type' => 'string', ), 'aggregator' => array( 'location' => 'query', 'type' => 'string', ), 'labels' => array( 'location' => 'query', 'type' => 'string', 'repeated' => true, ), 'pageToken' => array( 'location' => 'query', 'type' => 'string', ), 'window' => array( 'location' => 'query', 'type' => 'string', ), 'oldest' => array( 'location' => 'query', 'type' => 'string', ), ), ), ) ) ); } } /** * The "metricDescriptors" collection of methods. * Typical usage is: * * $cloudmonitoringService = new Google_Service_CloudMonitoring(...); * $metricDescriptors = $cloudmonitoringService->metricDescriptors; * */ class Google_Service_CloudMonitoring_MetricDescriptors_Resource extends UDP_Google_Service_Resource { /** * Create a new metric. (metricDescriptors.create) * * @param string $project The project id. The value can be the numeric project * ID or string-based project name. * @param Google_MetricDescriptor $postBody * @param array $optParams Optional parameters. * @return Google_Service_CloudMonitoring_MetricDescriptor */ public function create($project, Google_Service_CloudMonitoring_MetricDescriptor $postBody, $optParams = array()) { $params = array('project' => $project, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('create', array($params), "Google_Service_CloudMonitoring_MetricDescriptor"); } /** * Delete an existing metric. (metricDescriptors.delete) * * @param string $project The project ID to which the metric belongs. * @param string $metric Name of the metric. * @param array $optParams Optional parameters. * @return Google_Service_CloudMonitoring_DeleteMetricDescriptorResponse */ public function delete($project, $metric, $optParams = array()) { $params = array('project' => $project, 'metric' => $metric); $params = array_merge($params, $optParams); return $this->call('delete', array($params), "Google_Service_CloudMonitoring_DeleteMetricDescriptorResponse"); } /** * List metric descriptors that match the query. If the query is not set, then * all of the metric descriptors will be returned. Large responses will be * paginated, use the nextPageToken returned in the response to request * subsequent pages of results by setting the pageToken query parameter to the * value of the nextPageToken. (metricDescriptors.listMetricDescriptors) * * @param string $project The project id. The value can be the numeric project * ID or string-based project name. * @param array $optParams Optional parameters. * * @opt_param int count Maximum number of metric descriptors per page. Used for * pagination. If not specified, count = 100. * @opt_param string pageToken The pagination token, which is used to page * through large result sets. Set this value to the value of the nextPageToken * to retrieve the next page of results. * @opt_param string query The query used to search against existing metrics. * Separate keywords with a space; the service joins all keywords with AND, * meaning that all keywords must match for a metric to be returned. If this * field is omitted, all metrics are returned. If an empty string is passed with * this field, no metrics are returned. * @return Google_Service_CloudMonitoring_ListMetricDescriptorsResponse */ public function listMetricDescriptors($project, $optParams = array()) { $params = array('project' => $project); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_CloudMonitoring_ListMetricDescriptorsResponse"); } } /** * The "timeseries" collection of methods. * Typical usage is: * * $cloudmonitoringService = new Google_Service_CloudMonitoring(...); * $timeseries = $cloudmonitoringService->timeseries; * */ class Google_Service_CloudMonitoring_Timeseries_Resource extends UDP_Google_Service_Resource { /** * List the data points of the time series that match the metric and labels * values and that have data points in the interval. Large responses are * paginated; use the nextPageToken returned in the response to request * subsequent pages of results by setting the pageToken query parameter to the * value of the nextPageToken. (timeseries.listTimeseries) * * @param string $project The project ID to which this time series belongs. The * value can be the numeric project ID or string-based project name. * @param string $metric Metric names are protocol-free URLs as listed in the * Supported Metrics page. For example, * compute.googleapis.com/instance/disk/read_ops_count. * @param string $youngest End of the time interval (inclusive), which is * expressed as an RFC 3339 timestamp. * @param array $optParams Optional parameters. * * @opt_param int count Maximum number of data points per page, which is used * for pagination of results. * @opt_param string timespan Length of the time interval to query, which is an * alternative way to declare the interval: (youngest - timespan, youngest]. The * timespan and oldest parameters should not be used together. Units: - s: * second - m: minute - h: hour - d: day - w: week Examples: 2s, 3m, 4w. * Only one unit is allowed, for example: 2w3d is not allowed; you should use * 17d instead. * * If neither oldest nor timespan is specified, the default time interval will * be (youngest - 4 hours, youngest]. * @opt_param string aggregator The aggregation function that will reduce the * data points in each window to a single point. This parameter is only valid * for non-cumulative metrics with a value type of INT64 or DOUBLE. * @opt_param string labels A collection of labels for the matching time series, * which are represented as: - key==value: key equals the value - key=~value: * key regex matches the value - key!=value: key does not equal the value - * key!~value: key regex does not match the value For example, to list all of * the time series descriptors for the region us-central1, you could specify: * label=cloud.googleapis.com%2Flocation=~us-central1.* * @opt_param string pageToken The pagination token, which is used to page * through large result sets. Set this value to the value of the nextPageToken * to retrieve the next page of results. * @opt_param string window The sampling window. At most one data point will be * returned for each window in the requested time interval. This parameter is * only valid for non-cumulative metric types. Units: - m: minute - h: hour - * d: day - w: week Examples: 3m, 4w. Only one unit is allowed, for example: * 2w3d is not allowed; you should use 17d instead. * @opt_param string oldest Start of the time interval (exclusive), which is * expressed as an RFC 3339 timestamp. If neither oldest nor timespan is * specified, the default time interval will be (youngest - 4 hours, youngest] * @return Google_Service_CloudMonitoring_ListTimeseriesResponse */ public function listTimeseries($project, $metric, $youngest, $optParams = array()) { $params = array('project' => $project, 'metric' => $metric, 'youngest' => $youngest); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_CloudMonitoring_ListTimeseriesResponse"); } /** * Put data points to one or more time series for one or more metrics. If a time * series does not exist, a new time series will be created. It is not allowed * to write a time series point that is older than the existing youngest point * of that time series. Points that are older than the existing youngest point * of that time series will be discarded silently. Therefore, users should make * sure that points of a time series are written sequentially in the order of * their end time. (timeseries.write) * * @param string $project The project ID. The value can be the numeric project * ID or string-based project name. * @param Google_WriteTimeseriesRequest $postBody * @param array $optParams Optional parameters. * @return Google_Service_CloudMonitoring_WriteTimeseriesResponse */ public function write($project, Google_Service_CloudMonitoring_WriteTimeseriesRequest $postBody, $optParams = array()) { $params = array('project' => $project, 'postBody' => $postBody); $params = array_merge($params, $optParams); return $this->call('write', array($params), "Google_Service_CloudMonitoring_WriteTimeseriesResponse"); } } /** * The "timeseriesDescriptors" collection of methods. * Typical usage is: * * $cloudmonitoringService = new Google_Service_CloudMonitoring(...); * $timeseriesDescriptors = $cloudmonitoringService->timeseriesDescriptors; * */ class Google_Service_CloudMonitoring_TimeseriesDescriptors_Resource extends UDP_Google_Service_Resource { /** * List the descriptors of the time series that match the metric and labels * values and that have data points in the interval. Large responses are * paginated; use the nextPageToken returned in the response to request * subsequent pages of results by setting the pageToken query parameter to the * value of the nextPageToken. (timeseriesDescriptors.listTimeseriesDescriptors) * * @param string $project The project ID to which this time series belongs. The * value can be the numeric project ID or string-based project name. * @param string $metric Metric names are protocol-free URLs as listed in the * Supported Metrics page. For example, * compute.googleapis.com/instance/disk/read_ops_count. * @param string $youngest End of the time interval (inclusive), which is * expressed as an RFC 3339 timestamp. * @param array $optParams Optional parameters. * * @opt_param int count Maximum number of time series descriptors per page. Used * for pagination. If not specified, count = 100. * @opt_param string timespan Length of the time interval to query, which is an * alternative way to declare the interval: (youngest - timespan, youngest]. The * timespan and oldest parameters should not be used together. Units: - s: * second - m: minute - h: hour - d: day - w: week Examples: 2s, 3m, 4w. * Only one unit is allowed, for example: 2w3d is not allowed; you should use * 17d instead. * * If neither oldest nor timespan is specified, the default time interval will * be (youngest - 4 hours, youngest]. * @opt_param string aggregator The aggregation function that will reduce the * data points in each window to a single point. This parameter is only valid * for non-cumulative metrics with a value type of INT64 or DOUBLE. * @opt_param string labels A collection of labels for the matching time series, * which are represented as: - key==value: key equals the value - key=~value: * key regex matches the value - key!=value: key does not equal the value - * key!~value: key regex does not match the value For example, to list all of * the time series descriptors for the region us-central1, you could specify: * label=cloud.googleapis.com%2Flocation=~us-central1.* * @opt_param string pageToken The pagination token, which is used to page * through large result sets. Set this value to the value of the nextPageToken * to retrieve the next page of results. * @opt_param string window The sampling window. At most one data point will be * returned for each window in the requested time interval. This parameter is * only valid for non-cumulative metric types. Units: - m: minute - h: hour - * d: day - w: week Examples: 3m, 4w. Only one unit is allowed, for example: * 2w3d is not allowed; you should use 17d instead. * @opt_param string oldest Start of the time interval (exclusive), which is * expressed as an RFC 3339 timestamp. If neither oldest nor timespan is * specified, the default time interval will be (youngest - 4 hours, youngest] * @return Google_Service_CloudMonitoring_ListTimeseriesDescriptorsResponse */ public function listTimeseriesDescriptors($project, $metric, $youngest, $optParams = array()) { $params = array('project' => $project, 'metric' => $metric, 'youngest' => $youngest); $params = array_merge($params, $optParams); return $this->call('list', array($params), "Google_Service_CloudMonitoring_ListTimeseriesDescriptorsResponse"); } } class Google_Service_CloudMonitoring_DeleteMetricDescriptorResponse extends Google_Model { protected $internal_gapi_mappings = array( ); public $kind; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_CloudMonitoring_ListMetricDescriptorsRequest extends Google_Model { protected $internal_gapi_mappings = array( ); public $kind; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_CloudMonitoring_ListMetricDescriptorsResponse extends Google_Collection { protected $collection_key = 'metrics'; protected $internal_gapi_mappings = array( ); public $kind; protected $metricsType = 'Google_Service_CloudMonitoring_MetricDescriptor'; protected $metricsDataType = 'array'; public $nextPageToken; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setMetrics($metrics) { $this->metrics = $metrics; } public function getMetrics() { return $this->metrics; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } } class Google_Service_CloudMonitoring_ListTimeseriesDescriptorsRequest extends Google_Model { protected $internal_gapi_mappings = array( ); public $kind; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_CloudMonitoring_ListTimeseriesDescriptorsResponse extends Google_Collection { protected $collection_key = 'timeseries'; protected $internal_gapi_mappings = array( ); public $kind; public $nextPageToken; public $oldest; protected $timeseriesType = 'Google_Service_CloudMonitoring_TimeseriesDescriptor'; protected $timeseriesDataType = 'array'; public $youngest; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setOldest($oldest) { $this->oldest = $oldest; } public function getOldest() { return $this->oldest; } public function setTimeseries($timeseries) { $this->timeseries = $timeseries; } public function getTimeseries() { return $this->timeseries; } public function setYoungest($youngest) { $this->youngest = $youngest; } public function getYoungest() { return $this->youngest; } } class Google_Service_CloudMonitoring_ListTimeseriesRequest extends Google_Model { protected $internal_gapi_mappings = array( ); public $kind; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } class Google_Service_CloudMonitoring_ListTimeseriesResponse extends Google_Collection { protected $collection_key = 'timeseries'; protected $internal_gapi_mappings = array( ); public $kind; public $nextPageToken; public $oldest; protected $timeseriesType = 'Google_Service_CloudMonitoring_Timeseries'; protected $timeseriesDataType = 'array'; public $youngest; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } public function getNextPageToken() { return $this->nextPageToken; } public function setOldest($oldest) { $this->oldest = $oldest; } public function getOldest() { return $this->oldest; } public function setTimeseries($timeseries) { $this->timeseries = $timeseries; } public function getTimeseries() { return $this->timeseries; } public function setYoungest($youngest) { $this->youngest = $youngest; } public function getYoungest() { return $this->youngest; } } class Google_Service_CloudMonitoring_MetricDescriptor extends Google_Collection { protected $collection_key = 'labels'; protected $internal_gapi_mappings = array( ); public $description; protected $labelsType = 'Google_Service_CloudMonitoring_MetricDescriptorLabelDescriptor'; protected $labelsDataType = 'array'; public $name; public $project; protected $typeDescriptorType = 'Google_Service_CloudMonitoring_MetricDescriptorTypeDescriptor'; protected $typeDescriptorDataType = ''; public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setLabels($labels) { $this->labels = $labels; } public function getLabels() { return $this->labels; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setProject($project) { $this->project = $project; } public function getProject() { return $this->project; } public function setTypeDescriptor(Google_Service_CloudMonitoring_MetricDescriptorTypeDescriptor $typeDescriptor) { $this->typeDescriptor = $typeDescriptor; } public function getTypeDescriptor() { return $this->typeDescriptor; } } class Google_Service_CloudMonitoring_MetricDescriptorLabelDescriptor extends Google_Model { protected $internal_gapi_mappings = array( ); public $description; public $key; public function setDescription($description) { $this->description = $description; } public function getDescription() { return $this->description; } public function setKey($key) { $this->key = $key; } public function getKey() { return $this->key; } } class Google_Service_CloudMonitoring_MetricDescriptorTypeDescriptor extends Google_Model { protected $internal_gapi_mappings = array( ); public $metricType; public $valueType; public function setMetricType($metricType) { $this->metricType = $metricType; } public function getMetricType() { return $this->metricType; } public function setValueType($valueType) { $this->valueType = $valueType; } public function getValueType() { return $this->valueType; } } class Google_Service_CloudMonitoring_Point extends Google_Model { protected $internal_gapi_mappings = array( ); public $boolValue; protected $distributionValueType = 'Google_Service_CloudMonitoring_PointDistribution'; protected $distributionValueDataType = ''; public $doubleValue; public $end; public $int64Value; public $start; public $stringValue; public function setBoolValue($boolValue) { $this->boolValue = $boolValue; } public function getBoolValue() { return $this->boolValue; } public function setDistributionValue(Google_Service_CloudMonitoring_PointDistribution $distributionValue) { $this->distributionValue = $distributionValue; } public function getDistributionValue() { return $this->distributionValue; } public function setDoubleValue($doubleValue) { $this->doubleValue = $doubleValue; } public function getDoubleValue() { return $this->doubleValue; } public function setEnd($end) { $this->end = $end; } public function getEnd() { return $this->end; } public function setInt64Value($int64Value) { $this->int64Value = $int64Value; } public function getInt64Value() { return $this->int64Value; } public function setStart($start) { $this->start = $start; } public function getStart() { return $this->start; } public function setStringValue($stringValue) { $this->stringValue = $stringValue; } public function getStringValue() { return $this->stringValue; } } class Google_Service_CloudMonitoring_PointDistribution extends Google_Collection { protected $collection_key = 'buckets'; protected $internal_gapi_mappings = array( ); protected $bucketsType = 'Google_Service_CloudMonitoring_PointDistributionBucket'; protected $bucketsDataType = 'array'; protected $overflowBucketType = 'Google_Service_CloudMonitoring_PointDistributionOverflowBucket'; protected $overflowBucketDataType = ''; protected $underflowBucketType = 'Google_Service_CloudMonitoring_PointDistributionUnderflowBucket'; protected $underflowBucketDataType = ''; public function setBuckets($buckets) { $this->buckets = $buckets; } public function getBuckets() { return $this->buckets; } public function setOverflowBucket(Google_Service_CloudMonitoring_PointDistributionOverflowBucket $overflowBucket) { $this->overflowBucket = $overflowBucket; } public function getOverflowBucket() { return $this->overflowBucket; } public function setUnderflowBucket(Google_Service_CloudMonitoring_PointDistributionUnderflowBucket $underflowBucket) { $this->underflowBucket = $underflowBucket; } public function getUnderflowBucket() { return $this->underflowBucket; } } class Google_Service_CloudMonitoring_PointDistributionBucket extends Google_Model { protected $internal_gapi_mappings = array( ); public $count; public $lowerBound; public $upperBound; public function setCount($count) { $this->count = $count; } public function getCount() { return $this->count; } public function setLowerBound($lowerBound) { $this->lowerBound = $lowerBound; } public function getLowerBound() { return $this->lowerBound; } public function setUpperBound($upperBound) { $this->upperBound = $upperBound; } public function getUpperBound() { return $this->upperBound; } } class Google_Service_CloudMonitoring_PointDistributionOverflowBucket extends Google_Model { protected $internal_gapi_mappings = array( ); public $count; public $lowerBound; public function setCount($count) { $this->count = $count; } public function getCount() { return $this->count; } public function setLowerBound($lowerBound) { $this->lowerBound = $lowerBound; } public function getLowerBound() { return $this->lowerBound; } } class Google_Service_CloudMonitoring_PointDistributionUnderflowBucket extends Google_Model { protected $internal_gapi_mappings = array( ); public $count; public $upperBound; public function setCount($count) { $this->count = $count; } public function getCount() { return $this->count; } public function setUpperBound($upperBound) { $this->upperBound = $upperBound; } public function getUpperBound() { return $this->upperBound; } } class Google_Service_CloudMonitoring_Timeseries extends Google_Collection { protected $collection_key = 'points'; protected $internal_gapi_mappings = array( ); protected $pointsType = 'Google_Service_CloudMonitoring_Point'; protected $pointsDataType = 'array'; protected $timeseriesDescType = 'Google_Service_CloudMonitoring_TimeseriesDescriptor'; protected $timeseriesDescDataType = ''; public function setPoints($points) { $this->points = $points; } public function getPoints() { return $this->points; } public function setTimeseriesDesc(Google_Service_CloudMonitoring_TimeseriesDescriptor $timeseriesDesc) { $this->timeseriesDesc = $timeseriesDesc; } public function getTimeseriesDesc() { return $this->timeseriesDesc; } } class Google_Service_CloudMonitoring_TimeseriesDescriptor extends Google_Model { protected $internal_gapi_mappings = array( ); public $labels; public $metric; public $project; public function setLabels($labels) { $this->labels = $labels; } public function getLabels() { return $this->labels; } public function setMetric($metric) { $this->metric = $metric; } public function getMetric() { return $this->metric; } public function setProject($project) { $this->project = $project; } public function getProject() { return $this->project; } } class Google_Service_CloudMonitoring_TimeseriesDescriptorLabel extends Google_Model { protected $internal_gapi_mappings = array( ); public $key; public $value; public function setKey($key) { $this->key = $key; } public function getKey() { return $this->key; } public function setValue($value) { $this->value = $value; } public function getValue() { return $this->value; } } class Google_Service_CloudMonitoring_TimeseriesDescriptorLabels extends Google_Model { } class Google_Service_CloudMonitoring_TimeseriesPoint extends Google_Model { protected $internal_gapi_mappings = array( ); protected $pointType = 'Google_Service_CloudMonitoring_Point'; protected $pointDataType = ''; protected $timeseriesDescType = 'Google_Service_CloudMonitoring_TimeseriesDescriptor'; protected $timeseriesDescDataType = ''; public function setPoint(Google_Service_CloudMonitoring_Point $point) { $this->point = $point; } public function getPoint() { return $this->point; } public function setTimeseriesDesc(Google_Service_CloudMonitoring_TimeseriesDescriptor $timeseriesDesc) { $this->timeseriesDesc = $timeseriesDesc; } public function getTimeseriesDesc() { return $this->timeseriesDesc; } } class Google_Service_CloudMonitoring_WriteTimeseriesRequest extends Google_Collection { protected $collection_key = 'timeseries'; protected $internal_gapi_mappings = array( ); public $commonLabels; protected $timeseriesType = 'Google_Service_CloudMonitoring_TimeseriesPoint'; protected $timeseriesDataType = 'array'; public function setCommonLabels($commonLabels) { $this->commonLabels = $commonLabels; } public function getCommonLabels() { return $this->commonLabels; } public function setTimeseries($timeseries) { $this->timeseries = $timeseries; } public function getTimeseries() { return $this->timeseries; } } class Google_Service_CloudMonitoring_WriteTimeseriesRequestCommonLabels extends Google_Model { } class Google_Service_CloudMonitoring_WriteTimeseriesResponse extends Google_Model { protected $internal_gapi_mappings = array( ); public $kind; public function setKind($kind) { $this->kind = $kind; } public function getKind() { return $this->kind; } } PKwL\344/updraftplus/includes/Google/Signer/Abstract.phpnu[ */ abstract class Google_Signer_Abstract { /** * Signs data, returns the signature as binary data. */ abstract public function sign($data); } PKwL\~l l *updraftplus/includes/Google/Signer/P12.phpnu[ */ class Google_Signer_P12 extends Google_Signer_Abstract { // OpenSSL private key resource private $privateKey; // Creates a new signer from a .p12 file. public function __construct($p12, $password) { if (!function_exists('openssl_x509_read')) { throw new Google_Exception( 'The Google PHP API library needs the openssl PHP extension' ); } // If the private key is provided directly, then this isn't in the p12 // format. Different versions of openssl support different p12 formats // and the key from google wasn't being accepted by the version available // at the time. if (!$password && strpos($p12, "-----BEGIN RSA PRIVATE KEY-----") !== false) { $this->privateKey = openssl_pkey_get_private($p12); } elseif($password === 'notasecret' && strpos($p12, "-----BEGIN PRIVATE KEY-----") !== false) { $this->privateKey = openssl_pkey_get_private($p12); } else { // This throws on error $certs = array(); if (!openssl_pkcs12_read($p12, $certs, $password)) { throw new Google_Auth_Exception( "Unable to parse the p12 file. " . "Is this a .p12 file? Is the password correct? OpenSSL error: " . openssl_error_string() ); } // TODO(beaton): is this part of the contract for the openssl_pkcs12_read // method? What happens if there are multiple private keys? Do we care? if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) { throw new Google_Auth_Exception("No private key found in p12 file."); } $this->privateKey = openssl_pkey_get_private($certs['pkey']); } if (!$this->privateKey) { throw new Google_Auth_Exception("Unable to load private key"); } } public function __destruct() { if ($this->privateKey) { openssl_pkey_free($this->privateKey); } } public function sign($data) { if (version_compare(PHP_VERSION, '5.3.0') < 0) { throw new Google_Auth_Exception( "PHP 5.3.0 or higher is required to use service accounts." ); } // @codingStandardsIgnoreLine $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256"; if (!openssl_sign($data, $signature, $this->privateKey, $hash)) { throw new Google_Auth_Exception("Unable to sign data"); } return $signature; } } PKwL\|ڋ.updraftplus/includes/Google/Task/Retryable.phpnu[getClassConfig('UDP_Google_Task_Runner'); if (isset($config['initial_delay'])) { if ($config['initial_delay'] < 0) { throw new Google_Task_Exception( 'Task configuration `initial_delay` must not be negative.' ); } $this->delay = $config['initial_delay']; } if (isset($config['max_delay'])) { if ($config['max_delay'] <= 0) { throw new Google_Task_Exception( 'Task configuration `max_delay` must be greater than 0.' ); } $this->maxDelay = $config['max_delay']; } if (isset($config['factor'])) { if ($config['factor'] <= 0) { throw new Google_Task_Exception( 'Task configuration `factor` must be greater than 0.' ); } $this->factor = $config['factor']; } if (isset($config['jitter'])) { if ($config['jitter'] <= 0) { throw new Google_Task_Exception( 'Task configuration `jitter` must be greater than 0.' ); } $this->jitter = $config['jitter']; } if (isset($config['retries'])) { if ($config['retries'] < 0) { throw new Google_Task_Exception( 'Task configuration `retries` must not be negative.' ); } $this->maxAttempts += $config['retries']; } if (!is_callable($action)) { throw new Google_Task_Exception( 'Task argument `$action` must be a valid callable.' ); } $this->name = $name; $this->client = $client; $this->action = $action; $this->arguments = $arguments; } /** * Checks if a retry can be attempted. * * @return boolean */ public function canAttmpt() { return $this->attempts < $this->maxAttempts; } /** * Runs the task and (if applicable) automatically retries when errors occur. * * @return mixed * @throws Google_Task_Retryable on failure when no retries are available. */ public function run() { while ($this->attempt()) { try { return call_user_func_array($this->action, $this->arguments); } catch (Google_Task_Retryable $exception) { $allowedRetries = $exception->allowedRetries(); if (!$this->canAttmpt() || !$allowedRetries) { throw $exception; } if ($allowedRetries > 0) { $this->maxAttempts = min( $this->maxAttempts, $this->attempts + $allowedRetries ); } } } } /** * Runs a task once, if possible. This is useful for bypassing the `run()` * loop. * * NOTE: If this is not the first attempt, this function will sleep in * accordance to the backoff configurations before running the task. * * @return boolean */ public function attempt() { if (!$this->canAttmpt()) { return false; } if ($this->attempts > 0) { $this->backOff(); } $this->attempts++; return true; } /** * Sleeps in accordance to the backoff configurations. */ private function backOff() { $delay = $this->getDelay(); $this->client->getLogger()->debug( 'Retrying task with backoff', array( 'request' => $this->name, 'retry' => $this->attempts, 'backoff_seconds' => $delay ) ); usleep($delay * 1000000); } /** * Gets the delay (in seconds) for the current backoff period. * * @return float */ private function getDelay() { $jitter = $this->getJitter(); $factor = $this->attempts > 1 ? $this->factor + $jitter : 1 + abs($jitter); return $this->delay = min($this->maxDelay, $this->delay * $factor); } /** * Gets the current jitter (random number between -$this->jitter and * $this->jitter). * * @return float */ private function getJitter() { return $this->jitter * 2 * mt_rand() / mt_getrandmax() - $this->jitter; } } PKwL\Jq͗.updraftplus/includes/Google/Task/Exception.phpnu[ "reserved", "/" => "segments", "." => "dotprefix", "#" => "fragment", ";" => "semicolon", "?" => "form", "&" => "continuation" ); /** * @var reserved array * These are the characters which should not be URL encoded in reserved * strings. */ private $reserved = array( "=", ",", "!", "@", "|", ":", "/", "?", "#", "[", "]",'$', "&", "'", "(", ")", "*", "+", ";" ); private $reservedEncoded = array( "%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F", "%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29", "%2A", "%2B", "%3B" ); public function parse($string, array $parameters) { return $this->resolveNextSection($string, $parameters); } /** * This function finds the first matching {...} block and * executes the replacement. It then calls itself to find * subsequent blocks, if any. */ private function resolveNextSection($string, $parameters) { $start = strpos($string, "{"); if ($start === false) { return $string; } $end = strpos($string, "}"); if ($end === false) { return $string; } $string = $this->replace($string, $start, $end, $parameters); return $this->resolveNextSection($string, $parameters); } private function replace($string, $start, $end, $parameters) { // We know a data block will have {} round it, so we can strip that. $data = substr($string, $start + 1, $end - $start - 1); // If the first character is one of the reserved operators, it effects // the processing of the stream. if (isset($this->operators[$data[0]])) { $op = $this->operators[$data[0]]; $data = substr($data, 1); $prefix = ""; $prefix_on_missing = false; switch ($op) { case "reserved": // Reserved means certain characters should not be URL encoded $data = $this->replaceVars($data, $parameters, ",", null, true); break; case "fragment": // Comma separated with fragment prefix. Bare values only. $prefix = "#"; $prefix_on_missing = true; $data = $this->replaceVars($data, $parameters, ",", null, true); break; case "segments": // Slash separated data. Bare values only. $prefix = "/"; $data =$this->replaceVars($data, $parameters, "/"); break; case "dotprefix": // Dot separated data. Bare values only. $prefix = "."; $prefix_on_missing = true; $data = $this->replaceVars($data, $parameters, "."); break; case "semicolon": // Semicolon prefixed and separated. Uses the key name $prefix = ";"; $data = $this->replaceVars($data, $parameters, ";", "=", false, true, false); break; case "form": // Standard URL format. Uses the key name $prefix = "?"; $data = $this->replaceVars($data, $parameters, "&", "="); break; case "continuation": // Standard URL, but with leading ampersand. Uses key name. $prefix = "&"; $data = $this->replaceVars($data, $parameters, "&", "="); break; } // Add the initial prefix character if data is valid. if ($data || ($data !== false && $prefix_on_missing)) { $data = $prefix . $data; } } else { // If no operator we replace with the defaults. $data = $this->replaceVars($data, $parameters); } // This is chops out the {...} and replaces with the new section. return substr($string, 0, $start) . $data . substr($string, $end + 1); } private function replaceVars( $section, $parameters, $sep = ",", $combine = null, $reserved = false, $tag_empty = false, $combine_on_empty = true ) { if (strpos($section, ",") === false) { // If we only have a single value, we can immediately process. return $this->combine( $section, $parameters, $sep, $combine, $reserved, $tag_empty, $combine_on_empty ); } else { // If we have multiple values, we need to split and loop over them. // Each is treated individually, then glued together with the // separator character. $vars = explode(",", $section); return $this->combineList( $vars, $sep, $parameters, $combine, $reserved, false, // Never emit empty strings in multi-param replacements $combine_on_empty ); } } public function combine( $key, $parameters, $sep, $combine, $reserved, $tag_empty, $combine_on_empty ) { $length = false; $explode = false; $skip_final_combine = false; $value = false; // Check for length restriction. if (strpos($key, ":") !== false) { list($key, $length) = explode(":", $key); } // Check for explode parameter. if ($key[strlen($key) - 1] == "*") { $explode = true; $key = substr($key, 0, -1); $skip_final_combine = true; } // Define the list separator. $list_sep = $explode ? $sep : ","; if (isset($parameters[$key])) { $data_type = $this->getDataType($parameters[$key]); switch($data_type) { case self::TYPE_SCALAR: $value = $this->getValue($parameters[$key], $length); break; case self::TYPE_LIST: $values = array(); foreach ($parameters[$key] as $pkey => $pvalue) { $pvalue = $this->getValue($pvalue, $length); if ($combine && $explode) { $values[$pkey] = $key . $combine . $pvalue; } else { $values[$pkey] = $pvalue; } } $value = implode($list_sep, $values); if ($value == '') { return ''; } break; case self::TYPE_MAP: $values = array(); foreach ($parameters[$key] as $pkey => $pvalue) { $pvalue = $this->getValue($pvalue, $length); if ($explode) { $pkey = $this->getValue($pkey, $length); $values[] = $pkey . "=" . $pvalue; // Explode triggers = combine. } else { $values[] = $pkey; $values[] = $pvalue; } } $value = implode($list_sep, $values); if ($value == '') { return false; } break; } } else if ($tag_empty) { // If we are just indicating empty values with their key name, return that. return $key; } else { // Otherwise we can skip this variable due to not being defined. return false; } if ($reserved) { $value = str_replace($this->reservedEncoded, $this->reserved, $value); } // If we do not need to include the key name, we just return the raw // value. if (!$combine || $skip_final_combine) { return $value; } // Else we combine the key name: foo=bar, if value is not the empty string. return $key . ($value != '' || $combine_on_empty ? $combine . $value : ''); } /** * Return the type of a passed in value */ private function getDataType($data) { if (is_array($data)) { reset($data); if (key($data) !== 0) { return self::TYPE_MAP; } return self::TYPE_LIST; } return self::TYPE_SCALAR; } /** * Utility function that merges multiple combine calls * for multi-key templates. */ private function combineList( $vars, $sep, $parameters, $combine, $reserved, $tag_empty, $combine_on_empty ) { $ret = array(); foreach ($vars as $var) { $response = $this->combine( $var, $parameters, $sep, $combine, $reserved, $tag_empty, $combine_on_empty ); if ($response === false) { continue; } $ret[] = $response; } return implode($sep, $ret); } /** * Utility function to encode and trim values */ private function getValue($value, $length) { if ($length) { $value = substr($value, 0, $length); } $value = rawurlencode($value); return $value; } } PKwL\Q,updraftplus/includes/Google/Verifier/Pem.phpnu[ */ class Google_Verifier_Pem extends Google_Verifier_Abstract { private $publicKey; /** * Constructs a verifier from the supplied PEM-encoded certificate. * * $pem: a PEM encoded certificate (not a file). * @param $pem * @throws Google_Auth_Exception * @throws Google_Exception */ public function __construct($pem) { if (!function_exists('openssl_x509_read')) { throw new Google_Exception('Google API PHP client needs the openssl PHP extension'); } $this->publicKey = openssl_x509_read($pem); if (!$this->publicKey) { throw new Google_Auth_Exception("Unable to parse PEM: $pem"); } } public function __destruct() { if ($this->publicKey) { openssl_x509_free($this->publicKey); } } /** * Verifies the signature on data. * * Returns true if the signature is valid, false otherwise. * @param $data * @param $signature * @throws Google_Auth_Exception * @return bool */ public function verify($data, $signature) { // @codingStandardsIgnoreLine $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256"; $status = openssl_verify($data, $signature, $this->publicKey, $hash); if ($status === -1) { throw new Google_Auth_Exception('Signature verification error: ' . openssl_error_string()); } return $status === 1; } } PKwL\h%Joo1updraftplus/includes/Google/Verifier/Abstract.phpnu[ */ abstract class Google_Verifier_Abstract { /** * Checks a signature, returns true if the signature is correct, * false otherwise. */ abstract public function verify($data, $signature); } PKwL\'updraftplus/includes/Google/Service.phpnu[client = $client; } /** * Return the associated UDP_Google_Client class. * @return UDP_Google_Client */ public function getClient() { return $this->client; } } PKwL\Gzy*66&updraftplus/includes/Google/Config.phpnu[configuration = array( // The application_name is included in the User-Agent HTTP header. 'application_name' => '', // Which Authentication, Storage and HTTP IO classes to use. 'auth_class' => 'Google_Auth_OAuth2', 'io_class' => self::USE_AUTO_IO_SELECTION, 'cache_class' => 'Google_Cache_File', 'logger_class' => 'Google_Logger_Null', // Don't change these unless you're working against a special development // or testing environment. 'base_path' => 'https://www.googleapis.com', // Definition of class specific values, like file paths and so on. 'classes' => array( 'UDP_Google_IO_Abstract' => array( 'request_timeout_seconds' => 100, ), 'Google_Logger_Abstract' => array( 'level' => 'debug', 'log_format' => "[%datetime%] %level%: %message% %context%\n", 'date_format' => 'd/M/Y:H:i:s O', 'allow_newlines' => true ), 'Google_Logger_File' => array( 'file' => 'php://stdout', 'mode' => 0640, 'lock' => false, ), 'UDP_Google_Http_Request' => array( // Disable the use of gzip on calls if set to true. Defaults to false. 'disable_gzip' => self::GZIP_ENABLED, // We default gzip to disabled on uploads even if gzip is otherwise // enabled, due to some issues seen with small packet sizes for uploads. // Please test with this option before enabling gzip for uploads in // a production environment. 'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED, ), // If you want to pass in OAuth 2.0 settings, they will need to be // structured like this. 'Google_Auth_OAuth2' => array( // Keys for OAuth 2.0 access, see the API console at // https://developers.google.com/console 'client_id' => '', 'client_secret' => '', 'redirect_uri' => '', // Simple API access key, also from the API console. Ensure you get // a Server key, and not a Browser key. 'developer_key' => '', // Other parameters. 'hd' => '', 'prompt' => '', 'openid.realm' => '', 'include_granted_scopes' => '', 'login_hint' => '', 'request_visible_actions' => '', 'access_type' => 'online', 'approval_prompt' => 'auto', 'federated_signon_certs_url' => 'https://www.googleapis.com/oauth2/v1/certs', ), 'Google_Task_Runner' => array( // Delays are specified in seconds 'initial_delay' => 1, 'max_delay' => 60, // Base number for exponential backoff 'factor' => 2, // A random number between -jitter and jitter will be added to the // factor on each iteration to allow for better distribution of // retries. 'jitter' => .5, // Maximum number of retries allowed 'retries' => 0 ), 'UDP_Google_Service_Exception' => array( 'retry_map' => array( '500' => self::TASK_RETRY_ALWAYS, '503' => self::TASK_RETRY_ALWAYS, 'rateLimitExceeded' => self::TASK_RETRY_ALWAYS, 'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS ) ), 'UDP_Google_IO_Exception' => array( 'retry_map' => !extension_loaded('curl') ? array() : array( CURLE_COULDNT_RESOLVE_HOST => self::TASK_RETRY_ALWAYS, CURLE_COULDNT_CONNECT => self::TASK_RETRY_ALWAYS, CURLE_OPERATION_TIMEOUTED => self::TASK_RETRY_ALWAYS, CURLE_SSL_CONNECT_ERROR => self::TASK_RETRY_ALWAYS, CURLE_GOT_NOTHING => self::TASK_RETRY_ALWAYS ) ), // Set a default directory for the file cache. 'Google_Cache_File' => array( 'directory' => sys_get_temp_dir() . '/UDP_Google_Client' ) ), ); if ($ini_file_location) { $ini = parse_ini_file($ini_file_location, true); if (is_array($ini) && count($ini)) { $merged_configuration = $ini + $this->configuration; if (isset($ini['classes']) && isset($this->configuration['classes'])) { $merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes']; } $this->configuration = $merged_configuration; } } } /** * Set configuration specific to a given class. * $config->setClassConfig('Google_Cache_File', * array('directory' => '/tmp/cache')); * @param $class string The class name for the configuration * @param $config string key or an array of configuration values * @param $value string optional - if $config is a key, the value */ public function setClassConfig($class, $config, $value = null) { if (!is_array($config)) { if (!isset($this->configuration['classes'][$class])) { $this->configuration['classes'][$class] = array(); } $this->configuration['classes'][$class][$config] = $value; } else { $this->configuration['classes'][$class] = $config; } } public function getClassConfig($class, $key = null) { if (!isset($this->configuration['classes'][$class])) { return null; } if ($key === null) { return $this->configuration['classes'][$class]; } else { return $this->configuration['classes'][$class][$key]; } } /** * Return the configured cache class. * @return string */ public function getCacheClass() { return $this->configuration['cache_class']; } /** * Return the configured logger class. * @return string */ public function getLoggerClass() { return $this->configuration['logger_class']; } /** * Return the configured Auth class. * @return string */ public function getAuthClass() { return $this->configuration['auth_class']; } /** * Set the auth class. * * @param $class string the class name to set */ public function setAuthClass($class) { $prev = $this->configuration['auth_class']; if (!isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) { $this->configuration['classes'][$class] = $this->configuration['classes'][$prev]; } $this->configuration['auth_class'] = $class; } /** * Set the IO class. * * @param $class string the class name to set */ public function setIoClass($class) { $prev = $this->configuration['io_class']; if (!isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) { $this->configuration['classes'][$class] = $this->configuration['classes'][$prev]; } $this->configuration['io_class'] = $class; } /** * Set the cache class. * * @param $class string the class name to set */ public function setCacheClass($class) { $prev = $this->configuration['cache_class']; if (!isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) { $this->configuration['classes'][$class] = $this->configuration['classes'][$prev]; } $this->configuration['cache_class'] = $class; } /** * Set the logger class. * * @param $class string the class name to set */ public function setLoggerClass($class) { $prev = $this->configuration['logger_class']; if (!isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) { $this->configuration['classes'][$class] = $this->configuration['classes'][$prev]; } $this->configuration['logger_class'] = $class; } /** * Return the configured IO class. * * @return string */ public function getIoClass() { return $this->configuration['io_class']; } /** * Set the application name, this is included in the User-Agent HTTP header. * @param string $name */ public function setApplicationName($name) { $this->configuration['application_name'] = $name; } /** * @return string the name of the application */ public function getApplicationName() { return $this->configuration['application_name']; } /** * Set the client ID for the auth class. * @param $clientId string - the API console client ID */ public function setClientId($clientId) { $this->setAuthConfig('client_id', $clientId); } /** * Set the client secret for the auth class. * @param $secret string - the API console client secret */ public function setClientSecret($secret) { $this->setAuthConfig('client_secret', $secret); } /** * Set the redirect uri for the auth class. Note that if using the * Javascript based sign in flow, this should be the string 'postmessage'. * * @param $uri string - the URI that users should be redirected to */ public function setRedirectUri($uri) { $this->setAuthConfig('redirect_uri', $uri); } /** * Set the app activities for the auth class. * @param $rva string a space separated list of app activity types */ public function setRequestVisibleActions($rva) { $this->setAuthConfig('request_visible_actions', $rva); } /** * Set the the access type requested (offline or online.) * @param $access string - the access type */ public function setAccessType($access) { $this->setAuthConfig('access_type', $access); } /** * Set when to show the approval prompt (auto or force) * @param $approval string - the approval request */ public function setApprovalPrompt($approval) { $this->setAuthConfig('approval_prompt', $approval); } /** * Set the login hint (email address or sub identifier) * @param $hint string */ public function setLoginHint($hint) { $this->setAuthConfig('login_hint', $hint); } /** * Set the developer key for the auth class. Note that this is separate value * from the client ID - if it looks like a URL, its a client ID! * @param $key string - the API console developer key */ public function setDeveloperKey($key) { $this->setAuthConfig('developer_key', $key); } /** * Set the hd (hosted domain) parameter streamlines the login process for * Google Apps hosted accounts. By including the domain of the user, you * restrict sign-in to accounts at that domain. * * This should not be used to ensure security on your application - check * the hd values within an id token (@see Google_Auth_LoginTicket) after sign * in to ensure that the user is from the domain you were expecting. * * @param $hd string - the domain to use. */ public function setHostedDomain($hd) { $this->setAuthConfig('hd', $hd); } /** * Set the prompt hint. Valid values are none, consent and select_account. * If no value is specified and the user has not previously authorized * access, then the user is shown a consent screen. * @param $prompt string */ public function setPrompt($prompt) { $this->setAuthConfig('prompt', $prompt); } /** * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which * an authentication request is valid. * @param $realm string - the URL-space to use. */ public function setOpenidRealm($realm) { $this->setAuthConfig('openid.realm', $realm); } /** * If this is provided with the value true, and the authorization request is * granted, the authorization will include any previous authorizations * granted to this user/application combination for other scopes. * @param $include boolean - the URL-space to use. */ public function setIncludeGrantedScopes($include) { $this->setAuthConfig( 'include_granted_scopes', $include ? "true" : "false" ); } /** * @return string the base URL to use for API calls */ public function getBasePath() { return $this->configuration['base_path']; } /** * Set the auth configuration for the current auth class. * @param $key - the key to set * @param $value - the parameter value */ private function setAuthConfig($key, $value) { if (!isset($this->configuration['classes'][$this->getAuthClass()])) { $this->configuration['classes'][$this->getAuthClass()] = array(); } $this->configuration['classes'][$this->getAuthClass()][$key] = $value; } } PKwL\"V[b(updraftplus/includes/Google/autoload.phpnu[=')) { // Use the 'prepend' parameter; if other tools have registered autoloaders for incompatible versions of the Google SDK, ours should still get loaded first (since we only register our autoloader late, immediately before using it). spl_autoload_register('google_api_php_client_autoload_updraftplus', true, true); } else { spl_autoload_register('google_api_php_client_autoload_updraftplus'); } PKwL\:/QW W %updraftplus/includes/Google/Model.phpnu[mapTypes($array); } $this->gapiInit(); } /** * Getter that handles passthrough access to the data array, and lazy object creation. * @param string $key Property name. * @return mixed The value if any, or null. */ public function __get($key) { $keyTypeName = $this->keyType($key); $keyDataType = $this->dataType($key); if (isset($this->$keyTypeName) && !isset($this->processed[$key])) { if (isset($this->modelData[$key])) { $val = $this->modelData[$key]; } else if (isset($this->$keyDataType) && ($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) { $val = array(); } else { $val = null; } if ($this->isAssociativeArray($val)) { if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) { foreach ($val as $arrayKey => $arrayItem) { $this->modelData[$key][$arrayKey] = $this->createObjectFromName($keyTypeName, $arrayItem); } } else { $this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val); } } else if (is_array($val)) { $arrayObject = array(); foreach ($val as $arrayIndex => $arrayItem) { $arrayObject[$arrayIndex] = $this->createObjectFromName($keyTypeName, $arrayItem); } $this->modelData[$key] = $arrayObject; } $this->processed[$key] = true; } return isset($this->modelData[$key]) ? $this->modelData[$key] : null; } /** * Initialize this object's properties from an array. * * @param array $array Used to seed this object's properties. * @return void */ protected function mapTypes($array) { // Hard initialise simple types, lazy load more complex ones. foreach ($array as $key => $val) { if ( !property_exists($this, $this->keyType($key)) && property_exists($this, $key)) { $this->$key = $val; unset($array[$key]); } elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) { // This checks if property exists as camelCase, leaving it in array as snake_case // in case of backwards compatibility issues. $this->$camelKey = $val; } } $this->modelData = $array; } /** * Blank initialiser to be used in subclasses to do post-construction initialisation - this * avoids the need for subclasses to have to implement the variadics handling in their * constructors. */ protected function gapiInit() { return; } /** * Create a simplified object suitable for straightforward * conversion to JSON. This is relatively expensive * due to the usage of reflection, but shouldn't be called * a whole lot, and is the most straightforward way to filter. */ public function toSimpleObject() { $object = new stdClass(); // Process all other data. foreach ($this->modelData as $key => $val) { $result = $this->getSimpleValue($val); if ($result !== null) { $object->$key = $this->nullPlaceholderCheck($result); } } // Process all public properties. $reflect = new ReflectionObject($this); $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); foreach ($props as $member) { $name = $member->getName(); $result = $this->getSimpleValue($this->$name); if ($result !== null) { $name = $this->getMappedName($name); $object->$name = $this->nullPlaceholderCheck($result); } } return $object; } /** * Handle different types of values, primarily * other objects and map and array data types. */ private function getSimpleValue($value) { if ($value instanceof Google_Model) { return $value->toSimpleObject(); } else if (is_array($value)) { $return = array(); foreach ($value as $key => $a_value) { $a_value = $this->getSimpleValue($a_value); if ($a_value !== null) { $key = $this->getMappedName($key); $return[$key] = $this->nullPlaceholderCheck($a_value); } } return $return; } return $value; } /** * Check whether the value is the null placeholder and return true null. */ private function nullPlaceholderCheck($value) { if ($value === self::NULL_VALUE) { return null; } return $value; } /** * If there is an internal name mapping, use that. */ private function getMappedName($key) { if (isset($this->internal_gapi_mappings) && isset($this->internal_gapi_mappings[$key])) { $key = $this->internal_gapi_mappings[$key]; } return $key; } /** * Returns true only if the array is associative. * @param array $array * @return bool True if the array is associative. */ protected function isAssociativeArray($array) { if (!is_array($array)) { return false; } $keys = array_keys($array); foreach ($keys as $key) { if (is_string($key)) { return true; } } return false; } /** * Given a variable name, discover its type. * * @param $name * @param $item * @return object The object from the item. */ private function createObjectFromName($name, $item) { $type = $this->$name; return new $type($item); } /** * Verify if $obj is an array. * @throws Google_Exception Thrown if $obj isn't an array. * @param array $obj Items that should be validated. * @param string $method Method expecting an array as an argument. */ public function assertIsArray($obj, $method) { if ($obj && !is_array($obj)) { throw new Google_Exception( "Incorrect parameter type passed to $method(). Expected an array." ); } } #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->$offset) || isset($this->modelData[$offset]); } #[\ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->$offset) ? $this->$offset : $this->__get($offset); } #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { if (property_exists($this, $offset)) { $this->$offset = $value; } else { $this->modelData[$offset] = $value; $this->processed[$offset] = true; } } #[\ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->modelData[$offset]); } protected function keyType($key) { return $key . "Type"; } protected function dataType($key) { return $key . "DataType"; } public function __isset($key) { return isset($this->modelData[$key]); } public function __unset($key) { unset($this->modelData[$key]); } } PKwL\ O O&updraftplus/includes/Google/Client.phpnu[isAppEngine()) { // Automatically use Memcache if we're in AppEngine. $config->setCacheClass('Google_Cache_Memcache'); } if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) { // Automatically disable compress.zlib, as currently unsupported. $config->setClassConfig('UDP_Google_Http_Request', 'disable_gzip', true); } } if ($config->getIoClass() == UDP_Google_Config::USE_AUTO_IO_SELECTION) { if (function_exists('curl_version') && function_exists('curl_exec') && !$this->isAppEngine()) { $config->setIoClass("UDP_Google_IO_Curl"); } else { $config->setIoClass("UDP_Google_IO_Stream"); } } $this->config = $config; } /** * Get a string containing the version of the library. * * @return string */ public function getLibraryVersion() { return self::LIBVER; } /** * Attempt to exchange a code for an valid authentication token. * Helper wrapped around the OAuth 2.0 implementation. * * @param $code string code from accounts.google.com * @return string token */ public function authenticate($code) { $this->authenticated = true; return $this->getAuth()->authenticate($code); } /** * Loads a service account key and parameters from a JSON * file from the Google Developer Console. Uses that and the * given array of scopes to return an assertion credential for * use with refreshTokenWithAssertionCredential. * * @param string $jsonLocation File location of the project-key.json. * @param array $scopes The scopes to assert. * @return Google_Auth_AssertionCredentials. * @ */ public function loadServiceAccountJson($jsonLocation, $scopes) { $data = json_decode(file_get_contents($jsonLocation)); if (isset($data->type) && $data->type == 'service_account') { // Service Account format. $cred = new Google_Auth_AssertionCredentials( $data->client_email, $scopes, $data->private_key ); return $cred; } else { throw new Google_Exception("Invalid service account JSON file."); } } /** * Set the auth config from the JSON string provided. * This structure should match the file downloaded from * the "Download JSON" button on in the Google Developer * Console. * @param string $json the configuration json * @throws Google_Exception */ public function setAuthConfig($json) { $data = json_decode($json); $key = isset($data->installed) ? 'installed' : 'web'; if (!isset($data->$key)) { throw new Google_Exception("Invalid client secret JSON file."); } $this->setClientId($data->$key->client_id); $this->setClientSecret($data->$key->client_secret); if (isset($data->$key->redirect_uris)) { $this->setRedirectUri($data->$key->redirect_uris[0]); } } /** * Set the auth config from the JSON file in the path * provided. This should match the file downloaded from * the "Download JSON" button on in the Google Developer * Console. * @param string $file the file location of the client json */ public function setAuthConfigFile($file) { $this->setAuthConfig(file_get_contents($file)); } /** * @throws Google_Auth_Exception * @return array * @visible For Testing */ public function prepareScopes() { if (empty($this->requestedScopes)) { throw new Google_Auth_Exception("No scopes specified"); } $scopes = implode(' ', $this->requestedScopes); return $scopes; } /** * Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl() * or UDP_Google_Client#getAccessToken(). * @param string $accessToken JSON encoded string containing in the following format: * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", * "expires_in":3600, "id_token":"TOKEN", "created":1320790426} */ public function setAccessToken($accessToken) { if ($accessToken == 'null') { $accessToken = null; } $this->getAuth()->setAccessToken($accessToken); } /** * Set the authenticator object * @param Google_Auth_Abstract $auth */ public function setAuth(Google_Auth_Abstract $auth) { $this->config->setAuthClass(get_class($auth)); $this->auth = $auth; } /** * Set the IO object * @param UDP_Google_IO_Abstract $io */ public function setIo(UDP_Google_IO_Abstract $io) { $this->config->setIoClass(get_class($io)); $this->io = $io; } /** * Set the Cache object * @param Google_Cache_Abstract $cache */ public function setCache(Google_Cache_Abstract $cache) { $this->config->setCacheClass(get_class($cache)); $this->cache = $cache; } /** * Set the Logger object * @param Google_Logger_Abstract $logger */ public function setLogger(Google_Logger_Abstract $logger) { $this->config->setLoggerClass(get_class($logger)); $this->logger = $logger; } /** * Construct the OAuth 2.0 authorization request URI. * @return string */ public function createAuthUrl() { $scopes = $this->prepareScopes(); return $this->getAuth()->createAuthUrl($scopes); } /** * Get the OAuth 2.0 access token. * @return string $accessToken JSON encoded string in the following format: * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", * "expires_in":3600,"id_token":"TOKEN", "created":1320790426} */ public function getAccessToken() { $token = $this->getAuth()->getAccessToken(); // The response is json encoded, so could be the string null. // It is arguable whether this check should be here or lower // in the library. return (null == $token || 'null' == $token || '[]' == $token) ? null : $token; } /** * Get the OAuth 2.0 refresh token. * @return string $refreshToken refresh token or null if not available */ public function getRefreshToken() { return $this->getAuth()->getRefreshToken(); } /** * Returns if the access_token is expired. * @return bool Returns True if the access_token is expired. */ public function isAccessTokenExpired() { return $this->getAuth()->isAccessTokenExpired(); } /** * Set OAuth 2.0 "state" parameter to achieve per-request customization. * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2 * @param string $state */ public function setState($state) { $this->getAuth()->setState($state); } /** * @param string $accessType Possible values for access_type include: * {@code "offline"} to request offline access from the user. * {@code "online"} to request online access from the user. */ public function setAccessType($accessType) { $this->config->setAccessType($accessType); } /** * @param string $approvalPrompt Possible values for approval_prompt include: * {@code "force"} to force the approval UI to appear. (This is the default value) * {@code "auto"} to request auto-approval when possible. */ public function setApprovalPrompt($approvalPrompt) { $this->config->setApprovalPrompt($approvalPrompt); } /** * Set the login hint, email address or sub id. * @param string $loginHint */ public function setLoginHint($loginHint) { $this->config->setLoginHint($loginHint); } /** * Set the application name, this is included in the User-Agent HTTP header. * @param string $applicationName */ public function setApplicationName($applicationName) { $this->config->setApplicationName($applicationName); } /** * Set the OAuth 2.0 Client ID. * @param string $clientId */ public function setClientId($clientId) { $this->config->setClientId($clientId); } /** * Set the OAuth 2.0 Client Secret. * @param string $clientSecret */ public function setClientSecret($clientSecret) { $this->config->setClientSecret($clientSecret); } /** * Set the OAuth 2.0 Redirect URI. * @param string $redirectUri */ public function setRedirectUri($redirectUri) { $this->config->setRedirectUri($redirectUri); } /** * If 'plus.login' is included in the list of requested scopes, you can use * this method to define types of app activities that your app will write. * You can find a list of available types here: * @link https://developers.google.com/+/api/moment-types * * @param array $requestVisibleActions Array of app activity types */ public function setRequestVisibleActions($requestVisibleActions) { if (is_array($requestVisibleActions)) { $requestVisibleActions = join(" ", $requestVisibleActions); } $this->config->setRequestVisibleActions($requestVisibleActions); } /** * Set the developer key to use, these are obtained through the API Console. * @see http://code.google.com/apis/console-help/#generatingdevkeys * @param string $developerKey */ public function setDeveloperKey($developerKey) { $this->config->setDeveloperKey($developerKey); } /** * Set the hd (hosted domain) parameter streamlines the login process for * Google Apps hosted accounts. By including the domain of the user, you * restrict sign-in to accounts at that domain. * @param $hd string - the domain to use. */ public function setHostedDomain($hd) { $this->config->setHostedDomain($hd); } /** * Set the prompt hint. Valid values are none, consent and select_account. * If no value is specified and the user has not previously authorized * access, then the user is shown a consent screen. * @param $prompt string */ public function setPrompt($prompt) { $this->config->setPrompt($prompt); } /** * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which * an authentication request is valid. * @param $realm string - the URL-space to use. */ public function setOpenidRealm($realm) { $this->config->setOpenidRealm($realm); } /** * If this is provided with the value true, and the authorization request is * granted, the authorization will include any previous authorizations * granted to this user/application combination for other scopes. * @param $include boolean - the URL-space to use. */ public function setIncludeGrantedScopes($include) { $this->config->setIncludeGrantedScopes($include); } /** * Fetches a fresh OAuth 2.0 access token with the given refresh token. * @param string $refreshToken */ public function refreshToken($refreshToken) { $this->getAuth()->refreshToken($refreshToken); } /** * Revoke an OAuth2 access token or refresh token. This method will revoke the current access * token, if a token isn't provided. * @throws Google_Auth_Exception * @param string|null $token The token (access token or a refresh token) that should be revoked. * @return boolean Returns True if the revocation was successful, otherwise False. */ public function revokeToken($token = null) { return $this->getAuth()->revokeToken($token); } /** * Verify an id_token. This method will verify the current id_token, if one * isn't provided. * @throws Google_Auth_Exception * @param string|null $token The token (id_token) that should be verified. * @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was * successful. */ public function verifyIdToken($token = null) { return $this->getAuth()->verifyIdToken($token); } /** * Verify a JWT that was signed with your own certificates. * * @param $id_token string The JWT token * @param $cert_location array of certificates * @param $audience string the expected consumer of the token * @param $issuer string the expected issuer, defaults to Google * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS * @return mixed token information if valid, false if not */ public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null) { $auth = new Google_Auth_OAuth2($this); $certs = $auth->retrieveCertsFromLocation($cert_location); return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry); } /** * @param $creds Google_Auth_AssertionCredentials */ public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds) { $this->getAuth()->setAssertionCredentials($creds); } /** * Set the scopes to be requested. Must be called before createAuthUrl(). * Will remove any previously configured scopes. * @param array $scopes, ie: array('https://www.googleapis.com/auth/plus.login', * 'https://www.googleapis.com/auth/moderator') */ public function setScopes($scopes) { $this->requestedScopes = array(); $this->addScope($scopes); } /** * This functions adds a scope to be requested as part of the OAuth2.0 flow. * Will append any scopes not previously requested to the scope parameter. * A single string will be treated as a scope to request. An array of strings * will each be appended. * @param $scope_or_scopes string|array e.g. "profile" */ public function addScope($scope_or_scopes) { if (is_string($scope_or_scopes) && !in_array($scope_or_scopes, $this->requestedScopes)) { $this->requestedScopes[] = $scope_or_scopes; } else if (is_array($scope_or_scopes)) { foreach ($scope_or_scopes as $scope) { $this->addScope($scope); } } } /** * Returns the list of scopes requested by the client * @return array the list of scopes * */ public function getScopes() { return $this->requestedScopes; } /** * Declare whether batch calls should be used. This may increase throughput * by making multiple requests in one connection. * * @param boolean $useBatch True if the batch support should * be enabled. Defaults to False. */ public function setUseBatch($useBatch) { // This is actually an alias for setDefer. $this->setDefer($useBatch); } /** * Declare whether making API calls should make the call immediately, or * return a request which can be called with ->execute(); * * @param boolean $defer True if calls should not be executed right away. */ public function setDefer($defer) { $this->deferExecution = $defer; } /** * Helper method to execute deferred HTTP requests. * * @param $request Google_Http_Request|Google_Http_Batch * @throws Google_Exception * @return object of the type of the expected class or array. */ public function execute($request) { if ($request instanceof UDP_Google_Http_Request) { $request->setUserAgent( $this->getApplicationName() . " " . self::USER_AGENT_SUFFIX . $this->getLibraryVersion() ); if (!$this->getClassConfig("UDP_Google_Http_Request", "disable_gzip")) { $request->enableGzip(); } $request->maybeMoveParametersToBody(); return UDP_Google_Http_REST::execute($this, $request); } else if ($request instanceof Google_Http_Batch) { return $request->execute(); } else { throw new Google_Exception("Do not know how to execute this type of object."); } } /** * Whether or not to return raw requests * @return boolean */ public function shouldDefer() { return $this->deferExecution; } /** * @return Google_Auth_Abstract Authentication implementation */ public function getAuth() { if (!isset($this->auth)) { $class = $this->config->getAuthClass(); $this->auth = new $class($this); } return $this->auth; } /** * @return UDP_Google_IO_Abstract IO implementation */ public function getIo() { if (!isset($this->io)) { $class = $this->config->getIoClass(); $this->io = new $class($this); } return $this->io; } /** * @return Google_Cache_Abstract Cache implementation */ public function getCache() { if (!isset($this->cache)) { $class = $this->config->getCacheClass(); $this->cache = new $class($this); } return $this->cache; } /** * @return Google_Logger_Abstract Logger implementation */ public function getLogger() { if (!isset($this->logger)) { $class = $this->config->getLoggerClass(); $this->logger = new $class($this); } return $this->logger; } /** * Retrieve custom configuration for a specific class. * @param $class string|object - class or instance of class to retrieve * @param $key string optional - key to retrieve * @return array */ public function getClassConfig($class, $key = null) { if (!is_string($class)) { $class = get_class($class); } return $this->config->getClassConfig($class, $key); } /** * Set configuration specific to a given class. * $config->setClassConfig('Google_Cache_File', * array('directory' => '/tmp/cache')); * @param $class string|object - The class name for the configuration * @param $config string key or an array of configuration values * @param $value string optional - if $config is a key, the value * */ public function setClassConfig($class, $config, $value = null) { if (!is_string($class)) { $class = get_class($class); } $this->config->setClassConfig($class, $config, $value); } /** * @return string the base URL to use for calls to the APIs */ public function getBasePath() { return $this->config->getBasePath(); } /** * @return string the name of the application */ public function getApplicationName() { return $this->config->getApplicationName(); } /** * Are we running in Google AppEngine? * return bool */ public function isAppEngine() { return (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false); } } PKwL\Ě *updraftplus/includes/Google/Collection.phpnu[modelData[$this->collection_key]) && is_array($this->modelData[$this->collection_key])) { reset($this->modelData[$this->collection_key]); } } #[\ReturnTypeWillChange] public function current() { $this->coerceType($this->key()); if (is_array($this->modelData[$this->collection_key])) { return current($this->modelData[$this->collection_key]); } } #[\ReturnTypeWillChange] public function key() { if (isset($this->modelData[$this->collection_key]) && is_array($this->modelData[$this->collection_key])) { return key($this->modelData[$this->collection_key]); } } #[\ReturnTypeWillChange] public function next() { return next($this->modelData[$this->collection_key]); } #[\ReturnTypeWillChange] public function valid() { $key = $this->key(); return $key !== null && $key !== false; } #[\ReturnTypeWillChange] public function count() { if (!isset($this->modelData[$this->collection_key])) { return 0; } return count($this->modelData[$this->collection_key]); } public function offsetExists ($offset) { if (!is_numeric($offset)) { return parent::offsetExists($offset); } return isset($this->modelData[$this->collection_key][$offset]); } public function offsetGet($offset) { if (!is_numeric($offset)) { return parent::offsetGet($offset); } $this->coerceType($offset); return $this->modelData[$this->collection_key][$offset]; } public function offsetSet($offset, $value) { if (!is_numeric($offset)) { return parent::offsetSet($offset, $value); } $this->modelData[$this->collection_key][$offset] = $value; } public function offsetUnset($offset) { if (!is_numeric($offset)) { return parent::offsetUnset($offset); } unset($this->modelData[$this->collection_key][$offset]); } private function coerceType($offset) { $typeKey = $this->keyType($this->collection_key); if (isset($this->$typeKey) && !is_object($this->modelData[$this->collection_key][$offset])) { $type = $this->$typeKey; $this->modelData[$this->collection_key][$offset] = new $type($this->modelData[$this->collection_key][$offset]); } } } PKwL\֧jj%updraftplus/includes/Google/Utils.phpnu[= 0x20) && ($ordinalValue <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII) $ret ++; break; case (($ordinalValue & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 2; break; case (($ordinalValue & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 3; break; case (($ordinalValue & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 4; break; case (($ordinalValue & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 5; break; case (($ordinalValue & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 6; break; default: $ret ++; } } return $ret; } /** * Normalize all keys in an array to lower-case. * @param array $arr * @return array Normalized array. */ public static function normalize($arr) { if (!is_array($arr)) { return array(); } $normalized = array(); foreach ($arr as $key => $val) { $normalized[strtolower($key)] = $val; } return $normalized; } /** * Convert a string to camelCase * @param string $value * @return string */ public static function camelCase($value) { $value = ucwords(str_replace(array('-', '_'), ' ', $value)); $value = str_replace(' ', '', $value); $value[0] = strtolower($value[0]); return $value; } } PKwL\'TSo)updraftplus/includes/Google/Exception.phpnu[ * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @category File_Formats * @package Archive_Tar * @author Vincent Blavet * @copyright 1997-2010 The Authors * @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @version CVS: $Id$ * @link http://pear.php.net/package/Archive_Tar */ // If the PEAR class cannot be loaded via the autoloader, // then try to require_once it from the PHP include path. if (!class_exists('PEAR')) { require_once 'PEAR.php'; } define('ARCHIVE_TAR_ATT_SEPARATOR', 90001); define('ARCHIVE_TAR_END_BLOCK', pack("a512", '')); if (!function_exists('gzopen') && function_exists('gzopen64')) { function gzopen($filename, $mode, $use_include_path = 0) { return gzopen64($filename, $mode, $use_include_path); } } if (!function_exists('gztell') && function_exists('gztell64')) { function gztell($zp) { return gztell64($zp); } } if (!function_exists('gzseek') && function_exists('gzseek64')) { function gzseek($zp, $offset, $whence = SEEK_SET) { return gzseek64($zp, $offset, $whence); } } /** * Creates a (compressed) Tar archive * * @package Archive_Tar * @author Vincent Blavet * @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @version $Revision$ */ class Archive_Tar extends PEAR { /** * @var string Name of the Tar */ public $_tarname = ''; /** * @var boolean if true, the Tar file will be gzipped */ public $_compress = false; /** * @var string Type of compression : 'none', 'gz', 'bz2' or 'lzma2' */ public $_compress_type = 'none'; /** * @var string Explode separator */ public $_separator = ' '; /** * @var file descriptor */ public $_file = 0; /** * @var string Local Tar name of a remote Tar (http:// or ftp://) */ public $_temp_tarname = ''; /** * @var string regular expression for ignoring files or directories */ public $_ignore_regexp = ''; /** * @var object PEAR_Error object */ public $error_object = null; /** * Format for data extraction * * @var string */ public $_fmt =''; /** * Archive_Tar Class constructor. This flavour of the constructor only * declare a new Archive_Tar object, identifying it by the name of the * tar file. * If the compress argument is set the tar will be read or created as a * gzip or bz2 compressed TAR file. * * @param string $p_tarname The name of the tar archive to create * @param string $p_compress can be null, 'gz', 'bz2' or 'lzma2'. This * parameter indicates if gzip, bz2 or lzma2 compression * is required. For compatibility reason the * boolean value 'true' means 'gz'. * * @return bool */ public function __construct($p_tarname, $p_compress = null) { parent::__construct(); $this->_compress = false; $this->_compress_type = 'none'; if (($p_compress === null) || ($p_compress == '')) { if (@file_exists($p_tarname)) { if ($fp = @fopen($p_tarname, "rb")) { // look for gzip magic cookie $data = fread($fp, 2); fclose($fp); if ($data == "\37\213") { $this->_compress = true; $this->_compress_type = 'gz'; // No sure it's enought for a magic code .... } elseif ($data == "BZ") { $this->_compress = true; $this->_compress_type = 'bz2'; } elseif (file_get_contents($p_tarname, false, null, 1, 4) == '7zXZ') { $this->_compress = true; $this->_compress_type = 'lzma2'; } } } else { // probably a remote file or some file accessible // through a stream interface if (substr($p_tarname, -2) == 'gz') { $this->_compress = true; $this->_compress_type = 'gz'; } elseif ((substr($p_tarname, -3) == 'bz2') || (substr($p_tarname, -2) == 'bz') ) { $this->_compress = true; $this->_compress_type = 'bz2'; } else { if (substr($p_tarname, -2) == 'xz') { $this->_compress = true; $this->_compress_type = 'lzma2'; } } } } else { if (($p_compress === true) || ($p_compress == 'gz')) { $this->_compress = true; $this->_compress_type = 'gz'; } else { if ($p_compress == 'bz2') { $this->_compress = true; $this->_compress_type = 'bz2'; } else { if ($p_compress == 'lzma2') { $this->_compress = true; $this->_compress_type = 'lzma2'; } else { $this->_error( "Unsupported compression type '$p_compress'\n" . "Supported types are 'gz', 'bz2' and 'lzma2'.\n" ); return false; } } } } $this->_tarname = $p_tarname; if ($this->_compress) { // assert zlib or bz2 or xz extension support if ($this->_compress_type == 'gz') { $extname = 'zlib'; } else { if ($this->_compress_type == 'bz2') { $extname = 'bz2'; } else { if ($this->_compress_type == 'lzma2') { $extname = 'xz'; } } } if (!extension_loaded($extname)) { PEAR::loadExtension($extname); } if (!extension_loaded($extname)) { $this->_error( "The extension '$extname' couldn't be found.\n" . "Please make sure your version of PHP was built " . "with '$extname' support.\n" ); return false; } } if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) { $this->_fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" . "a8checksum/a1typeflag/a100link/a6magic/a2version/" . "a32uname/a32gname/a8devmajor/a8devminor/a131prefix"; } else { $this->_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" . "Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" . "Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix"; } } public function __destruct() { $this->_close(); // ----- Look for a local copy to delete if ($this->_temp_tarname != '') { @unlink($this->_temp_tarname); } } /** * This method creates the archive file and add the files / directories * that are listed in $p_filelist. * If a file with the same name exist and is writable, it is replaced * by the new tar. * The method return false and a PEAR error text. * The $p_filelist parameter can be an array of string, each string * representing a filename or a directory name with their path if * needed. It can also be a single string with names separated by a * single blank. * For each directory added in the archive, the files and * sub-directories are also added. * See also createModify() method for more details. * * @param array $p_filelist An array of filenames and directory names, or a * single string with names separated by a single * blank space. * * @return true on success, false on error. * @see createModify() */ public function create($p_filelist) { return $this->createModify($p_filelist, '', ''); } /** * This method add the files / directories that are listed in $p_filelist in * the archive. If the archive does not exist it is created. * The method return false and a PEAR error text. * The files and directories listed are only added at the end of the archive, * even if a file with the same name is already archived. * See also createModify() method for more details. * * @param array $p_filelist An array of filenames and directory names, or a * single string with names separated by a single * blank space. * * @return true on success, false on error. * @see createModify() * @access public */ public function add($p_filelist) { return $this->addModify($p_filelist, '', ''); } /** * @param string $p_path * @param bool $p_preserve * @return bool */ public function extract($p_path = '', $p_preserve = false) { return $this->extractModify($p_path, '', $p_preserve); } /** * @return array|int */ public function listContent() { $v_list_detail = array(); if ($this->_openRead()) { if (!$this->_extractList('', $v_list_detail, "list", '', '')) { unset($v_list_detail); $v_list_detail = 0; } $this->_close(); } return $v_list_detail; } /** * This method creates the archive file and add the files / directories * that are listed in $p_filelist. * If the file already exists and is writable, it is replaced by the * new tar. It is a create and not an add. If the file exists and is * read-only or is a directory it is not replaced. The method return * false and a PEAR error text. * The $p_filelist parameter can be an array of string, each string * representing a filename or a directory name with their path if * needed. It can also be a single string with names separated by a * single blank. * The path indicated in $p_remove_dir will be removed from the * memorized path of each file / directory listed when this path * exists. By default nothing is removed (empty path '') * The path indicated in $p_add_dir will be added at the beginning of * the memorized path of each file / directory listed. However it can * be set to empty ''. The adding of a path is done after the removing * of path. * The path add/remove ability enables the user to prepare an archive * for extraction in a different path than the origin files are. * See also addModify() method for file adding properties. * * @param array $p_filelist An array of filenames and directory names, * or a single string with names separated by * a single blank space. * @param string $p_add_dir A string which contains a path to be added * to the memorized path of each element in * the list. * @param string $p_remove_dir A string which contains a path to be * removed from the memorized path of each * element in the list, when relevant. * * @return boolean true on success, false on error. * @see addModify() */ public function createModify($p_filelist, $p_add_dir, $p_remove_dir = '') { $v_result = true; if (!$this->_openWrite()) { return false; } if ($p_filelist != '') { if (is_array($p_filelist)) { $v_list = $p_filelist; } elseif (is_string($p_filelist)) { $v_list = explode($this->_separator, $p_filelist); } else { $this->_cleanFile(); $this->_error('Invalid file list'); return false; } $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir); } if ($v_result) { $this->_writeFooter(); $this->_close(); } else { $this->_cleanFile(); } return $v_result; } /** * This method add the files / directories listed in $p_filelist at the * end of the existing archive. If the archive does not yet exists it * is created. * The $p_filelist parameter can be an array of string, each string * representing a filename or a directory name with their path if * needed. It can also be a single string with names separated by a * single blank. * The path indicated in $p_remove_dir will be removed from the * memorized path of each file / directory listed when this path * exists. By default nothing is removed (empty path '') * The path indicated in $p_add_dir will be added at the beginning of * the memorized path of each file / directory listed. However it can * be set to empty ''. The adding of a path is done after the removing * of path. * The path add/remove ability enables the user to prepare an archive * for extraction in a different path than the origin files are. * If a file/dir is already in the archive it will only be added at the * end of the archive. There is no update of the existing archived * file/dir. However while extracting the archive, the last file will * replace the first one. This results in a none optimization of the * archive size. * If a file/dir does not exist the file/dir is ignored. However an * error text is send to PEAR error. * If a file/dir is not readable the file/dir is ignored. However an * error text is send to PEAR error. * * @param array $p_filelist An array of filenames and directory * names, or a single string with names * separated by a single blank space. * @param string $p_add_dir A string which contains a path to be * added to the memorized path of each * element in the list. * @param string $p_remove_dir A string which contains a path to be * removed from the memorized path of * each element in the list, when * relevant. * * @return true on success, false on error. */ public function addModify($p_filelist, $p_add_dir, $p_remove_dir = '') { $v_result = true; if (!$this->_isArchive()) { $v_result = $this->createModify( $p_filelist, $p_add_dir, $p_remove_dir ); } else { if (is_array($p_filelist)) { $v_list = $p_filelist; } elseif (is_string($p_filelist)) { $v_list = explode($this->_separator, $p_filelist); } else { $this->_error('Invalid file list'); return false; } $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir); } return $v_result; } /** * This method add a single string as a file at the * end of the existing archive. If the archive does not yet exists it * is created. * * @param string $p_filename A string which contains the full * filename path that will be associated * with the string. * @param string $p_string The content of the file added in * the archive. * @param bool|int $p_datetime A custom date/time (unix timestamp) * for the file (optional). * @param array $p_params An array of optional params: * stamp => the datetime (replaces * datetime above if it exists) * mode => the permissions on the * file (600 by default) * type => is this a link? See the * tar specification for details. * (default = regular file) * uid => the user ID of the file * (default = 0 = root) * gid => the group ID of the file * (default = 0 = root) * * @return true on success, false on error. */ public function addString($p_filename, $p_string, $p_datetime = false, $p_params = array()) { $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time()); $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600; $p_type = @$p_params["type"] ? $p_params["type"] : ""; $p_uid = @$p_params["uid"] ? $p_params["uid"] : ""; $p_gid = @$p_params["gid"] ? $p_params["gid"] : ""; $v_result = true; if (!$this->_isArchive()) { if (!$this->_openWrite()) { return false; } $this->_close(); } if (!$this->_openAppend()) { return false; } // Need to check the get back to the temporary file ? .... $v_result = $this->_addString($p_filename, $p_string, $p_datetime, $p_params); $this->_writeFooter(); $this->_close(); return $v_result; } /** * This method extract all the content of the archive in the directory * indicated by $p_path. When relevant the memorized path of the * files/dir can be modified by removing the $p_remove_path path at the * beginning of the file/dir path. * While extracting a file, if the directory path does not exists it is * created. * While extracting a file, if the file already exists it is replaced * without looking for last modification date. * While extracting a file, if the file already exists and is write * protected, the extraction is aborted. * While extracting a file, if a directory with the same name already * exists, the extraction is aborted. * While extracting a directory, if a file with the same name already * exists, the extraction is aborted. * While extracting a file/directory if the destination directory exist * and is write protected, or does not exist but can not be created, * the extraction is aborted. * If after extraction an extracted file does not show the correct * stored file size, the extraction is aborted. * When the extraction is aborted, a PEAR error text is set and false * is returned. However the result can be a partial extraction that may * need to be manually cleaned. * * @param string $p_path The path of the directory where the * files/dir need to by extracted. * @param string $p_remove_path Part of the memorized path that can be * removed if present at the beginning of * the file/dir path. * @param boolean $p_preserve Preserve user/group ownership of files * * @return boolean true on success, false on error. * @see extractList() */ public function extractModify($p_path, $p_remove_path, $p_preserve = false) { $v_result = true; $v_list_detail = array(); if ($v_result = $this->_openRead()) { $v_result = $this->_extractList( $p_path, $v_list_detail, "complete", 0, $p_remove_path, $p_preserve ); $this->_close(); } return $v_result; } /** * This method extract from the archive one file identified by $p_filename. * The return value is a string with the file content, or NULL on error. * * @param string $p_filename The path of the file to extract in a string. * * @return a string with the file content or NULL. */ public function extractInString($p_filename) { if ($this->_openRead()) { $v_result = $this->_extractInString($p_filename); $this->_close(); } else { $v_result = null; } return $v_result; } /** * This method extract from the archive only the files indicated in the * $p_filelist. These files are extracted in the current directory or * in the directory indicated by the optional $p_path parameter. * If indicated the $p_remove_path can be used in the same way as it is * used in extractModify() method. * * @param array $p_filelist An array of filenames and directory names, * or a single string with names separated * by a single blank space. * @param string $p_path The path of the directory where the * files/dir need to by extracted. * @param string $p_remove_path Part of the memorized path that can be * removed if present at the beginning of * the file/dir path. * @param boolean $p_preserve Preserve user/group ownership of files * * @return true on success, false on error. * @see extractModify() */ public function extractList($p_filelist, $p_path = '', $p_remove_path = '', $p_preserve = false) { $v_result = true; $v_list_detail = array(); if (is_array($p_filelist)) { $v_list = $p_filelist; } elseif (is_string($p_filelist)) { $v_list = explode($this->_separator, $p_filelist); } else { $this->_error('Invalid string list'); return false; } if ($v_result = $this->_openRead()) { $v_result = $this->_extractList( $p_path, $v_list_detail, "partial", $v_list, $p_remove_path, $p_preserve ); $this->_close(); } return $v_result; } /** * This method set specific attributes of the archive. It uses a variable * list of parameters, in the format attribute code + attribute values : * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ','); * * @return true on success, false on error. */ public function setAttribute() { $v_result = true; // ----- Get the number of variable list of arguments if (($v_size = func_num_args()) == 0) { return true; } // ----- Get the arguments $v_att_list = func_get_args(); // ----- Read the attributes $i = 0; while ($i < $v_size) { // ----- Look for next option switch ($v_att_list[$i]) { // ----- Look for options that request a string value case ARCHIVE_TAR_ATT_SEPARATOR : // ----- Check the number of parameters if (($i + 1) >= $v_size) { $this->_error( 'Invalid number of parameters for ' . 'attribute ARCHIVE_TAR_ATT_SEPARATOR' ); return false; } // ----- Get the value $this->_separator = $v_att_list[$i + 1]; $i++; break; default : $this->_error('Unknown attribute code ' . $v_att_list[$i] . ''); return false; } // ----- Next attribute $i++; } return $v_result; } /** * This method sets the regular expression for ignoring files and directories * at import, for example: * $arch->setIgnoreRegexp("#CVS|\.svn#"); * * @param string $regexp regular expression defining which files or directories to ignore */ public function setIgnoreRegexp($regexp) { $this->_ignore_regexp = $regexp; } /** * This method sets the regular expression for ignoring all files and directories * matching the filenames in the array list at import, for example: * $arch->setIgnoreList(array('CVS', '.svn', 'bin/tool')); * * @param array $list a list of file or directory names to ignore * * @access public */ public function setIgnoreList($list) { $regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list); $regexp = '#/' . join('$|/', $list) . '#'; $this->setIgnoreRegexp($regexp); } /** * @param string $p_message */ public function _error($p_message) { $this->error_object = $this->raiseError($p_message); } /** * @param string $p_message */ public function _warning($p_message) { $this->error_object = $this->raiseError($p_message); } /** * @param string $p_filename * @return bool */ public function _isArchive($p_filename = null) { if ($p_filename == null) { $p_filename = $this->_tarname; } clearstatcache(); return @is_file($p_filename) && !@is_link($p_filename); } /** * @return bool */ public function _openWrite() { if ($this->_compress_type == 'gz' && function_exists('gzopen')) { $this->_file = @gzopen($this->_tarname, "wb9"); } else { if ($this->_compress_type == 'bz2' && function_exists('bzopen')) { $this->_file = @bzopen($this->_tarname, "w"); } else { if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) { $this->_file = @xzopen($this->_tarname, 'w'); } else { if ($this->_compress_type == 'none') { $this->_file = @fopen($this->_tarname, "wb"); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); return false; } } } } if ($this->_file == 0) { $this->_error( 'Unable to open in write mode \'' . $this->_tarname . '\'' ); return false; } return true; } /** * @return bool */ public function _openRead() { if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') { // ----- Look if a local copy need to be done if ($this->_temp_tarname == '') { $this->_temp_tarname = uniqid('tar') . '.tmp'; if (!$v_file_from = @fopen($this->_tarname, 'rb')) { $this->_error( 'Unable to open in read mode \'' . $this->_tarname . '\'' ); $this->_temp_tarname = ''; return false; } if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) { $this->_error( 'Unable to open in write mode \'' . $this->_temp_tarname . '\'' ); $this->_temp_tarname = ''; return false; } while ($v_data = @fread($v_file_from, 1024)) { @fwrite($v_file_to, $v_data); } @fclose($v_file_from); @fclose($v_file_to); } // ----- File to open if the local copy $v_filename = $this->_temp_tarname; } else { // ----- File to open if the normal Tar file $v_filename = $this->_tarname; } if ($this->_compress_type == 'gz' && function_exists('gzopen')) { $this->_file = @gzopen($v_filename, "rb"); } else { if ($this->_compress_type == 'bz2' && function_exists('bzopen')) { $this->_file = @bzopen($v_filename, "r"); } else { if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) { $this->_file = @xzopen($v_filename, "r"); } else { if ($this->_compress_type == 'none') { $this->_file = @fopen($v_filename, "rb"); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); return false; } } } } if ($this->_file == 0) { $this->_error('Unable to open in read mode \'' . $v_filename . '\''); return false; } return true; } /** * @return bool */ public function _openReadWrite() { if ($this->_compress_type == 'gz') { $this->_file = @gzopen($this->_tarname, "r+b"); } else { if ($this->_compress_type == 'bz2') { $this->_error( 'Unable to open bz2 in read/write mode \'' . $this->_tarname . '\' (limitation of bz2 extension)' ); return false; } else { if ($this->_compress_type == 'lzma2') { $this->_error( 'Unable to open lzma2 in read/write mode \'' . $this->_tarname . '\' (limitation of lzma2 extension)' ); return false; } else { if ($this->_compress_type == 'none') { $this->_file = @fopen($this->_tarname, "r+b"); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); return false; } } } } if ($this->_file == 0) { $this->_error( 'Unable to open in read/write mode \'' . $this->_tarname . '\'' ); return false; } return true; } /** * @return bool */ public function _close() { //if (isset($this->_file)) { if (is_resource($this->_file)) { if ($this->_compress_type == 'gz') { @gzclose($this->_file); } else { if ($this->_compress_type == 'bz2') { @bzclose($this->_file); } else { if ($this->_compress_type == 'lzma2') { @xzclose($this->_file); } else { if ($this->_compress_type == 'none') { @fclose($this->_file); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); } } } } $this->_file = 0; } // ----- Look if a local copy need to be erase // Note that it might be interesting to keep the url for a time : ToDo if ($this->_temp_tarname != '') { @unlink($this->_temp_tarname); $this->_temp_tarname = ''; } return true; } /** * @return bool */ public function _cleanFile() { $this->_close(); // ----- Look for a local copy if ($this->_temp_tarname != '') { // ----- Remove the local copy but not the remote tarname @unlink($this->_temp_tarname); $this->_temp_tarname = ''; } else { // ----- Remove the local tarname file @unlink($this->_tarname); } $this->_tarname = ''; return true; } /** * @param mixed $p_binary_data * @param integer $p_len * @return bool */ public function _writeBlock($p_binary_data, $p_len = null) { if (is_resource($this->_file)) { if ($p_len === null) { if ($this->_compress_type == 'gz') { @gzputs($this->_file, $p_binary_data); } else { if ($this->_compress_type == 'bz2') { @bzwrite($this->_file, $p_binary_data); } else { if ($this->_compress_type == 'lzma2') { @xzwrite($this->_file, $p_binary_data); } else { if ($this->_compress_type == 'none') { @fputs($this->_file, $p_binary_data); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); } } } } } else { if ($this->_compress_type == 'gz') { @gzputs($this->_file, $p_binary_data, $p_len); } else { if ($this->_compress_type == 'bz2') { @bzwrite($this->_file, $p_binary_data, $p_len); } else { if ($this->_compress_type == 'lzma2') { @xzwrite($this->_file, $p_binary_data, $p_len); } else { if ($this->_compress_type == 'none') { @fputs($this->_file, $p_binary_data, $p_len); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); } } } } } } return true; } /** * @return null|string */ public function _readBlock() { $v_block = null; if (is_resource($this->_file)) { if ($this->_compress_type == 'gz') { $v_block = @gzread($this->_file, 512); } else { if ($this->_compress_type == 'bz2') { $v_block = @bzread($this->_file, 512); } else { if ($this->_compress_type == 'lzma2') { $v_block = @xzread($this->_file, 512); } else { if ($this->_compress_type == 'none') { $v_block = @fread($this->_file, 512); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); } } } } } return $v_block; } /** * @param null $p_len * @return bool */ public function _jumpBlock($p_len = null) { if (is_resource($this->_file)) { if ($p_len === null) { $p_len = 1; } if ($this->_compress_type == 'gz') { @gzseek($this->_file, gztell($this->_file) + ($p_len * 512)); } else { if ($this->_compress_type == 'bz2') { // ----- Replace missing bztell() and bzseek() for ($i = 0; $i < $p_len; $i++) { $this->_readBlock(); } } else { if ($this->_compress_type == 'lzma2') { // ----- Replace missing xztell() and xzseek() for ($i = 0; $i < $p_len; $i++) { $this->_readBlock(); } } else { if ($this->_compress_type == 'none') { @fseek($this->_file, $p_len * 512, SEEK_CUR); } else { $this->_error( 'Unknown or missing compression type (' . $this->_compress_type . ')' ); } } } } } return true; } /** * @return bool */ public function _writeFooter() { if (is_resource($this->_file)) { // ----- Write the last 0 filled block for end of archive $v_binary_data = pack('a1024', ''); $this->_writeBlock($v_binary_data); } return true; } /** * @param array $p_list * @param string $p_add_dir * @param string $p_remove_dir * @return bool */ public function _addList($p_list, $p_add_dir, $p_remove_dir) { $v_result = true; $v_header = array(); // ----- Remove potential windows directory separator $p_add_dir = $this->_translateWinPath($p_add_dir); $p_remove_dir = $this->_translateWinPath($p_remove_dir, false); if (!$this->_file) { $this->_error('Invalid file descriptor'); return false; } if (sizeof($p_list) == 0) { return true; } foreach ($p_list as $v_filename) { if (!$v_result) { break; } // ----- Skip the current tar name if ($v_filename == $this->_tarname) { continue; } if ($v_filename == '') { continue; } // ----- ignore files and directories matching the ignore regular expression if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/' . $v_filename)) { $this->_warning("File '$v_filename' ignored"); continue; } if (!file_exists($v_filename) && !is_link($v_filename)) { $this->_warning("File '$v_filename' does not exist"); continue; } // ----- Add the file or directory header if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) { return false; } if (@is_dir($v_filename) && !@is_link($v_filename)) { if (!($p_hdir = opendir($v_filename))) { $this->_warning("Directory '$v_filename' can not be read"); continue; } while (false !== ($p_hitem = readdir($p_hdir))) { if (($p_hitem != '.') && ($p_hitem != '..')) { if ($v_filename != ".") { $p_temp_list[0] = $v_filename . '/' . $p_hitem; } else { $p_temp_list[0] = $p_hitem; } $v_result = $this->_addList( $p_temp_list, $p_add_dir, $p_remove_dir ); } } unset($p_temp_list); unset($p_hdir); unset($p_hitem); } } return $v_result; } /** * @param string $p_filename * @param mixed $p_header * @param string $p_add_dir * @param string $p_remove_dir * @param null $v_stored_filename * @return bool */ public function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $v_stored_filename = null) { if (!$this->_file) { $this->_error('Invalid file descriptor'); return false; } if ($p_filename == '') { $this->_error('Invalid file name'); return false; } if (is_null($v_stored_filename)) { // ----- Calculate the stored filename $p_filename = $this->_translateWinPath($p_filename, false); $v_stored_filename = $p_filename; if (strcmp($p_filename, $p_remove_dir) == 0) { return true; } if ($p_remove_dir != '') { if (substr($p_remove_dir, -1) != '/') { $p_remove_dir .= '/'; } if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) { $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); } } $v_stored_filename = $this->_translateWinPath($v_stored_filename); if ($p_add_dir != '') { if (substr($p_add_dir, -1) == '/') { $v_stored_filename = $p_add_dir . $v_stored_filename; } else { $v_stored_filename = $p_add_dir . '/' . $v_stored_filename; } } $v_stored_filename = $this->_pathReduction($v_stored_filename); } if ($this->_isArchive($p_filename)) { if (($v_file = @fopen($p_filename, "rb")) == 0) { $this->_warning( "Unable to open file '" . $p_filename . "' in binary read mode" ); return true; } if (!$this->_writeHeader($p_filename, $v_stored_filename)) { return false; } while (($v_buffer = fread($v_file, 512)) != '') { $v_binary_data = pack("a512", "$v_buffer"); $this->_writeBlock($v_binary_data); } fclose($v_file); } else { // ----- Only header for dir if (!$this->_writeHeader($p_filename, $v_stored_filename)) { return false; } } return true; } /** * @param string $p_filename * @param string $p_string * @param bool $p_datetime * @param array $p_params * @return bool */ public function _addString($p_filename, $p_string, $p_datetime = false, $p_params = array()) { $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time()); $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600; $p_type = @$p_params["type"] ? $p_params["type"] : ""; $p_uid = @$p_params["uid"] ? $p_params["uid"] : 0; $p_gid = @$p_params["gid"] ? $p_params["gid"] : 0; if (!$this->_file) { $this->_error('Invalid file descriptor'); return false; } if ($p_filename == '') { $this->_error('Invalid file name'); return false; } // ----- Calculate the stored filename $p_filename = $this->_translateWinPath($p_filename, false); // ----- If datetime is not specified, set current time if ($p_datetime === false) { $p_datetime = time(); } if (!$this->_writeHeaderBlock( $p_filename, strlen($p_string), $p_stamp, $p_mode, $p_type, $p_uid, $p_gid ) ) { return false; } $i = 0; while (($v_buffer = substr($p_string, (($i++) * 512), 512)) != '') { $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); } return true; } /** * @param string $p_filename * @param string $p_stored_filename * @return bool */ public function _writeHeader($p_filename, $p_stored_filename) { if ($p_stored_filename == '') { $p_stored_filename = $p_filename; } $v_reduce_filename = $this->_pathReduction($p_stored_filename); if (strlen($v_reduce_filename) > 99) { if (!$this->_writeLongHeader($v_reduce_filename)) { return false; } } $v_info = lstat($p_filename); $v_uid = sprintf("%07s", DecOct($v_info[4])); $v_gid = sprintf("%07s", DecOct($v_info[5])); $v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777)); $v_mtime = sprintf("%011s", DecOct($v_info['mtime'])); $v_linkname = ''; if (@is_link($p_filename)) { $v_typeflag = '2'; $v_linkname = readlink($p_filename); $v_size = sprintf("%011s", DecOct(0)); } elseif (@is_dir($p_filename)) { $v_typeflag = "5"; $v_size = sprintf("%011s", DecOct(0)); } else { $v_typeflag = '0'; clearstatcache(); $v_size = sprintf("%011s", DecOct($v_info['size'])); } $v_magic = 'ustar '; $v_version = ' '; if (function_exists('posix_getpwuid')) { $userinfo = posix_getpwuid($v_info[4]); $groupinfo = posix_getgrgid($v_info[5]); $v_uname = $userinfo['name']; $v_gname = $groupinfo['name']; } else { $v_uname = ''; $v_gname = ''; } $v_devmajor = ''; $v_devminor = ''; $v_prefix = ''; $v_binary_data_first = pack( "a100a8a8a8a12a12", $v_reduce_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime ); $v_binary_data_last = pack( "a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, '' ); // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header for ($i = 0; $i < 148; $i++) { $v_checksum += ord(substr($v_binary_data_first, $i, 1)); } // ..... Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) { $v_checksum += ord(' '); } // ..... Last part of the header for ($i = 156, $j = 0; $i < 512; $i++, $j++) { $v_checksum += ord(substr($v_binary_data_last, $j, 1)); } // ----- Write the first 148 bytes of the header in the archive $this->_writeBlock($v_binary_data_first, 148); // ----- Write the calculated checksum $v_checksum = sprintf("%06s ", DecOct($v_checksum)); $v_binary_data = pack("a8", $v_checksum); $this->_writeBlock($v_binary_data, 8); // ----- Write the last 356 bytes of the header in the archive $this->_writeBlock($v_binary_data_last, 356); return true; } /** * @param string $p_filename * @param int $p_size * @param int $p_mtime * @param int $p_perms * @param string $p_type * @param int $p_uid * @param int $p_gid * @return bool */ public function _writeHeaderBlock( $p_filename, $p_size, $p_mtime = 0, $p_perms = 0, $p_type = '', $p_uid = 0, $p_gid = 0 ) { $p_filename = $this->_pathReduction($p_filename); if (strlen($p_filename) > 99) { if (!$this->_writeLongHeader($p_filename)) { return false; } } if ($p_type == "5") { $v_size = sprintf("%011s", DecOct(0)); } else { $v_size = sprintf("%011s", DecOct($p_size)); } $v_uid = sprintf("%07s", DecOct($p_uid)); $v_gid = sprintf("%07s", DecOct($p_gid)); $v_perms = sprintf("%07s", DecOct($p_perms & 000777)); $v_mtime = sprintf("%11s", DecOct($p_mtime)); $v_linkname = ''; $v_magic = 'ustar '; $v_version = ' '; if (function_exists('posix_getpwuid')) { $userinfo = posix_getpwuid($p_uid); $groupinfo = posix_getgrgid($p_gid); $v_uname = $userinfo['name']; $v_gname = $groupinfo['name']; } else { $v_uname = ''; $v_gname = ''; } $v_devmajor = ''; $v_devminor = ''; $v_prefix = ''; $v_binary_data_first = pack( "a100a8a8a8a12A12", $p_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime ); $v_binary_data_last = pack( "a1a100a6a2a32a32a8a8a155a12", $p_type, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, '' ); // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header for ($i = 0; $i < 148; $i++) { $v_checksum += ord(substr($v_binary_data_first, $i, 1)); } // ..... Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) { $v_checksum += ord(' '); } // ..... Last part of the header for ($i = 156, $j = 0; $i < 512; $i++, $j++) { $v_checksum += ord(substr($v_binary_data_last, $j, 1)); } // ----- Write the first 148 bytes of the header in the archive $this->_writeBlock($v_binary_data_first, 148); // ----- Write the calculated checksum $v_checksum = sprintf("%06s ", DecOct($v_checksum)); $v_binary_data = pack("a8", $v_checksum); $this->_writeBlock($v_binary_data, 8); // ----- Write the last 356 bytes of the header in the archive $this->_writeBlock($v_binary_data_last, 356); return true; } /** * @param string $p_filename * @return bool */ public function _writeLongHeader($p_filename) { $v_size = sprintf("%11s ", DecOct(strlen($p_filename))); $v_typeflag = 'L'; $v_linkname = ''; $v_magic = ''; $v_version = ''; $v_uname = ''; $v_gname = ''; $v_devmajor = ''; $v_devminor = ''; $v_prefix = ''; $v_binary_data_first = pack( "a100a8a8a8a12a12", '././@LongLink', 0, 0, 0, $v_size, 0 ); $v_binary_data_last = pack( "a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, '' ); // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header for ($i = 0; $i < 148; $i++) { $v_checksum += ord(substr($v_binary_data_first, $i, 1)); } // ..... Ignore the checksum value and replace it by ' ' (space) for ($i = 148; $i < 156; $i++) { $v_checksum += ord(' '); } // ..... Last part of the header for ($i = 156, $j = 0; $i < 512; $i++, $j++) { $v_checksum += ord(substr($v_binary_data_last, $j, 1)); } // ----- Write the first 148 bytes of the header in the archive $this->_writeBlock($v_binary_data_first, 148); // ----- Write the calculated checksum $v_checksum = sprintf("%06s ", DecOct($v_checksum)); $v_binary_data = pack("a8", $v_checksum); $this->_writeBlock($v_binary_data, 8); // ----- Write the last 356 bytes of the header in the archive $this->_writeBlock($v_binary_data_last, 356); // ----- Write the filename as content of the block $i = 0; while (($v_buffer = substr($p_filename, (($i++) * 512), 512)) != '') { $v_binary_data = pack("a512", "$v_buffer"); $this->_writeBlock($v_binary_data); } return true; } /** * @param mixed $v_binary_data * @param mixed $v_header * @return bool */ public function _readHeader($v_binary_data, &$v_header) { if (strlen($v_binary_data) == 0) { $v_header['filename'] = ''; return true; } if (strlen($v_binary_data) != 512) { $v_header['filename'] = ''; $this->_error('Invalid block size : ' . strlen($v_binary_data)); return false; } if (!is_array($v_header)) { $v_header = array(); } // ----- Calculate the checksum $v_checksum = 0; // ..... First part of the header $v_binary_split = str_split($v_binary_data); $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 0, 148))); $v_checksum += array_sum(array_map('ord', array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',))); $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 156, 512))); $v_data = unpack($this->_fmt, $v_binary_data); if (strlen($v_data["prefix"]) > 0) { $v_data["filename"] = "$v_data[prefix]/$v_data[filename]"; } // ----- Extract the checksum $v_header['checksum'] = OctDec(trim($v_data['checksum'])); if ($v_header['checksum'] != $v_checksum) { $v_header['filename'] = ''; // ----- Look for last block (empty block) if (($v_checksum == 256) && ($v_header['checksum'] == 0)) { return true; } $this->_error( 'Invalid checksum for file "' . $v_data['filename'] . '" : ' . $v_checksum . ' calculated, ' . $v_header['checksum'] . ' expected' ); return false; } // ----- Extract the properties $v_header['filename'] = rtrim($v_data['filename'], "\0"); if ($this->_maliciousFilename($v_header['filename'])) { $this->_error( 'Malicious .tar detected, file "' . $v_header['filename'] . '" will not install in desired directory tree' ); return false; } $v_header['mode'] = OctDec(trim($v_data['mode'])); $v_header['uid'] = OctDec(trim($v_data['uid'])); $v_header['gid'] = OctDec(trim($v_data['gid'])); $v_header['size'] = $this->_tarRecToSize($v_data['size']); $v_header['mtime'] = OctDec(trim($v_data['mtime'])); if (($v_header['typeflag'] = $v_data['typeflag']) == "5") { $v_header['size'] = 0; } $v_header['link'] = trim($v_data['link']); /* ----- All these fields are removed form the header because they do not carry interesting info $v_header[magic] = trim($v_data[magic]); $v_header[version] = trim($v_data[version]); $v_header[uname] = trim($v_data[uname]); $v_header[gname] = trim($v_data[gname]); $v_header[devmajor] = trim($v_data[devmajor]); $v_header[devminor] = trim($v_data[devminor]); */ return true; } /** * Convert Tar record size to actual size * * @param string $tar_size * @return size of tar record in bytes */ private function _tarRecToSize($tar_size) { /* * First byte of size has a special meaning if bit 7 is set. * * Bit 7 indicates base-256 encoding if set. * Bit 6 is the sign bit. * Bits 5:0 are most significant value bits. */ $ch = ord($tar_size[0]); if ($ch & 0x80) { // Full 12-bytes record is required. $rec_str = $tar_size . "\x00"; $size = ($ch & 0x40) ? -1 : 0; $size = ($size << 6) | ($ch & 0x3f); for ($num_ch = 1; $num_ch < 12; ++$num_ch) { $size = ($size * 256) + ord($rec_str[$num_ch]); } return $size; } else { return OctDec(trim($tar_size)); } } /** * Detect and report a malicious file name * * @param string $file * * @return bool */ private function _maliciousFilename($file) { if (strpos($file, '/../') !== false) { return true; } if (strpos($file, '../') === 0) { return true; } return false; } /** * @param $v_header * @return bool */ public function _readLongHeader(&$v_header) { $v_filename = ''; $v_filesize = $v_header['size']; $n = floor($v_header['size'] / 512); for ($i = 0; $i < $n; $i++) { $v_content = $this->_readBlock(); $v_filename .= $v_content; } if (($v_header['size'] % 512) != 0) { $v_content = $this->_readBlock(); $v_filename .= $v_content; } // ----- Read the next header $v_binary_data = $this->_readBlock(); if (!$this->_readHeader($v_binary_data, $v_header)) { return false; } $v_filename = rtrim(substr($v_filename, 0, $v_filesize), "\0"); $v_header['filename'] = $v_filename; if ($this->_maliciousFilename($v_filename)) { $this->_error( 'Malicious .tar detected, file "' . $v_filename . '" will not install in desired directory tree' ); return false; } return true; } /** * This method extract from the archive one file identified by $p_filename. * The return value is a string with the file content, or null on error. * * @param string $p_filename The path of the file to extract in a string. * * @return a string with the file content or null. */ private function _extractInString($p_filename) { $v_result_str = ""; while (strlen($v_binary_data = $this->_readBlock()) != 0) { if (!$this->_readHeader($v_binary_data, $v_header)) { return null; } if ($v_header['filename'] == '') { continue; } // ----- Look for long filename if ($v_header['typeflag'] == 'L') { if (!$this->_readLongHeader($v_header)) { return null; } } if ($v_header['filename'] == $p_filename) { if ($v_header['typeflag'] == "5") { $this->_error( 'Unable to extract in string a directory ' . 'entry {' . $v_header['filename'] . '}' ); return null; } else { $n = floor($v_header['size'] / 512); for ($i = 0; $i < $n; $i++) { $v_result_str .= $this->_readBlock(); } if (($v_header['size'] % 512) != 0) { $v_content = $this->_readBlock(); $v_result_str .= substr( $v_content, 0, ($v_header['size'] % 512) ); } return $v_result_str; } } else { $this->_jumpBlock(ceil(($v_header['size'] / 512))); } } return null; } /** * @param string $p_path * @param string $p_list_detail * @param string $p_mode * @param string $p_file_list * @param string $p_remove_path * @param bool $p_preserve * @return bool */ public function _extractList( $p_path, &$p_list_detail, $p_mode, $p_file_list, $p_remove_path, $p_preserve = false ) { $v_result = true; $v_nb = 0; $v_extract_all = true; $v_listing = false; $p_path = $this->_translateWinPath($p_path, false); if ($p_path == '' || (substr($p_path, 0, 1) != '/' && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':')) ) { $p_path = "./" . $p_path; } $p_remove_path = $this->_translateWinPath($p_remove_path); // ----- Look for path to remove format (should end by /) if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/')) { $p_remove_path .= '/'; } $p_remove_path_size = strlen($p_remove_path); switch ($p_mode) { case "complete" : $v_extract_all = true; $v_listing = false; break; case "partial" : $v_extract_all = false; $v_listing = false; break; case "list" : $v_extract_all = false; $v_listing = true; break; default : $this->_error('Invalid extract mode (' . $p_mode . ')'); return false; } clearstatcache(); while (strlen($v_binary_data = $this->_readBlock()) != 0) { $v_extract_file = false; $v_extraction_stopped = 0; if (!$this->_readHeader($v_binary_data, $v_header)) { return false; } if ($v_header['filename'] == '') { continue; } // ----- Look for long filename if ($v_header['typeflag'] == 'L') { if (!$this->_readLongHeader($v_header)) { return false; } } // ignore extended / pax headers if ($v_header['typeflag'] == 'x' || $v_header['typeflag'] == 'g') { $this->_jumpBlock(ceil(($v_header['size'] / 512))); continue; } if ((!$v_extract_all) && (is_array($p_file_list))) { // ----- By default no unzip if the file is not found $v_extract_file = false; for ($i = 0; $i < sizeof($p_file_list); $i++) { // ----- Look if it is a directory if (substr($p_file_list[$i], -1) == '/') { // ----- Look if the directory is in the filename path if ((strlen($v_header['filename']) > strlen($p_file_list[$i])) && (substr($v_header['filename'], 0, strlen($p_file_list[$i])) == $p_file_list[$i]) ) { $v_extract_file = true; break; } } // ----- It is a file, so compare the file names elseif ($p_file_list[$i] == $v_header['filename']) { $v_extract_file = true; break; } } } else { $v_extract_file = true; } // ----- Look if this file need to be extracted if (($v_extract_file) && (!$v_listing)) { if (($p_remove_path != '') && (substr($v_header['filename'] . '/', 0, $p_remove_path_size) == $p_remove_path) ) { $v_header['filename'] = substr( $v_header['filename'], $p_remove_path_size ); if ($v_header['filename'] == '') { continue; } } if (($p_path != './') && ($p_path != '/')) { while (substr($p_path, -1) == '/') { $p_path = substr($p_path, 0, strlen($p_path) - 1); } if (substr($v_header['filename'], 0, 1) == '/') { $v_header['filename'] = $p_path . $v_header['filename']; } else { $v_header['filename'] = $p_path . '/' . $v_header['filename']; } } if (file_exists($v_header['filename'])) { if ((@is_dir($v_header['filename'])) && ($v_header['typeflag'] == '') ) { $this->_error( 'File ' . $v_header['filename'] . ' already exists as a directory' ); return false; } if (($this->_isArchive($v_header['filename'])) && ($v_header['typeflag'] == "5") ) { $this->_error( 'Directory ' . $v_header['filename'] . ' already exists as a file' ); return false; } if (!is_writeable($v_header['filename'])) { $this->_error( 'File ' . $v_header['filename'] . ' already exists and is write protected' ); return false; } if (filemtime($v_header['filename']) > $v_header['mtime']) { // To be completed : An error or silent no replace ? } } // ----- Check the directory availability and create it if necessary elseif (($v_result = $this->_dirCheck( ($v_header['typeflag'] == "5" ? $v_header['filename'] : dirname($v_header['filename'])) )) != 1 ) { $this->_error('Unable to create path for ' . $v_header['filename']); return false; } if ($v_extract_file) { if ($v_header['typeflag'] == "5") { if (!@file_exists($v_header['filename'])) { if (!@mkdir($v_header['filename'], 0777)) { $this->_error( 'Unable to create directory {' . $v_header['filename'] . '}' ); return false; } } } elseif ($v_header['typeflag'] == "2") { if (@file_exists($v_header['filename'])) { @unlink($v_header['filename']); } if (!@symlink($v_header['link'], $v_header['filename'])) { $this->_error( 'Unable to extract symbolic link {' . $v_header['filename'] . '}' ); return false; } } else { if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) { $this->_error( 'Error while opening {' . $v_header['filename'] . '} in write binary mode' ); return false; } else { $n = floor($v_header['size'] / 512); for ($i = 0; $i < $n; $i++) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, 512); } if (($v_header['size'] % 512) != 0) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, ($v_header['size'] % 512)); } @fclose($v_dest_file); if ($p_preserve) { @chown($v_header['filename'], $v_header['uid']); @chgrp($v_header['filename'], $v_header['gid']); } // ----- Change the file mode, mtime @touch($v_header['filename'], $v_header['mtime']); if ($v_header['mode'] & 0111) { // make file executable, obey umask $mode = fileperms($v_header['filename']) | (~umask() & 0111); @chmod($v_header['filename'], $mode); } } // ----- Check the file size clearstatcache(); if (!is_file($v_header['filename'])) { $this->_error( 'Extracted file ' . $v_header['filename'] . 'does not exist. Archive may be corrupted.' ); return false; } $filesize = filesize($v_header['filename']); if ($filesize != $v_header['size']) { $this->_error( 'Extracted file ' . $v_header['filename'] . ' does not have the correct file size \'' . $filesize . '\' (' . $v_header['size'] . ' expected). Archive may be corrupted.' ); return false; } } } else { $this->_jumpBlock(ceil(($v_header['size'] / 512))); } } else { $this->_jumpBlock(ceil(($v_header['size'] / 512))); } /* TBC : Seems to be unused ... if ($this->_compress) $v_end_of_file = @gzeof($this->_file); else $v_end_of_file = @feof($this->_file); */ if ($v_listing || $v_extract_file || $v_extraction_stopped) { // ----- Log extracted files if (($v_file_dir = dirname($v_header['filename'])) == $v_header['filename'] ) { $v_file_dir = ''; } if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) { $v_file_dir = '/'; } $p_list_detail[$v_nb++] = $v_header; if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) { return true; } } } return true; } /** * @return bool */ public function _openAppend() { if (filesize($this->_tarname) == 0) { return $this->_openWrite(); } if ($this->_compress) { $this->_close(); if (!@rename($this->_tarname, $this->_tarname . ".tmp")) { $this->_error( 'Error while renaming \'' . $this->_tarname . '\' to temporary file \'' . $this->_tarname . '.tmp\'' ); return false; } if ($this->_compress_type == 'gz') { $v_temp_tar = @gzopen($this->_tarname . ".tmp", "rb"); } elseif ($this->_compress_type == 'bz2') { $v_temp_tar = @bzopen($this->_tarname . ".tmp", "r"); } elseif ($this->_compress_type == 'lzma2') { $v_temp_tar = @xzopen($this->_tarname . ".tmp", "r"); } if ($v_temp_tar == 0) { $this->_error( 'Unable to open file \'' . $this->_tarname . '.tmp\' in binary read mode' ); @rename($this->_tarname . ".tmp", $this->_tarname); return false; } if (!$this->_openWrite()) { @rename($this->_tarname . ".tmp", $this->_tarname); return false; } if ($this->_compress_type == 'gz') { $end_blocks = 0; while (!@gzeof($v_temp_tar)) { $v_buffer = @gzread($v_temp_tar, 512); if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { $end_blocks++; // do not copy end blocks, we will re-make them // after appending continue; } elseif ($end_blocks > 0) { for ($i = 0; $i < $end_blocks; $i++) { $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); } $end_blocks = 0; } $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); } @gzclose($v_temp_tar); } elseif ($this->_compress_type == 'bz2') { $end_blocks = 0; while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) { if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { $end_blocks++; // do not copy end blocks, we will re-make them // after appending continue; } elseif ($end_blocks > 0) { for ($i = 0; $i < $end_blocks; $i++) { $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); } $end_blocks = 0; } $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); } @bzclose($v_temp_tar); } elseif ($this->_compress_type == 'lzma2') { $end_blocks = 0; while (strlen($v_buffer = @xzread($v_temp_tar, 512)) > 0) { if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { $end_blocks++; // do not copy end blocks, we will re-make them // after appending continue; } elseif ($end_blocks > 0) { for ($i = 0; $i < $end_blocks; $i++) { $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); } $end_blocks = 0; } $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); } @xzclose($v_temp_tar); } if (!@unlink($this->_tarname . ".tmp")) { $this->_error( 'Error while deleting temporary file \'' . $this->_tarname . '.tmp\'' ); } } else { // ----- For not compressed tar, just add files before the last // one or two 512 bytes block if (!$this->_openReadWrite()) { return false; } clearstatcache(); $v_size = filesize($this->_tarname); // We might have zero, one or two end blocks. // The standard is two, but we should try to handle // other cases. fseek($this->_file, $v_size - 1024); if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { fseek($this->_file, $v_size - 1024); } elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { fseek($this->_file, $v_size - 512); } } return true; } /** * @param $p_filelist * @param string $p_add_dir * @param string $p_remove_dir * @return bool */ public function _append($p_filelist, $p_add_dir = '', $p_remove_dir = '') { if (!$this->_openAppend()) { return false; } if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) { $this->_writeFooter(); } $this->_close(); return true; } /** * Check if a directory exists and create it (including parent * dirs) if not. * * @param string $p_dir directory to check * * @return bool true if the directory exists or was created */ public function _dirCheck($p_dir) { clearstatcache(); if ((@is_dir($p_dir)) || ($p_dir == '')) { return true; } $p_parent_dir = dirname($p_dir); if (($p_parent_dir != $p_dir) && ($p_parent_dir != '') && (!$this->_dirCheck($p_parent_dir)) ) { return false; } if (!@mkdir($p_dir, 0777)) { $this->_error("Unable to create directory '$p_dir'"); return false; } return true; } /** * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar", * rand emove double slashes. * * @param string $p_dir path to reduce * * @return string reduced path */ private function _pathReduction($p_dir) { $v_result = ''; // ----- Look for not empty path if ($p_dir != '') { // ----- Explode path by directory names $v_list = explode('/', $p_dir); // ----- Study directories from last to first for ($i = sizeof($v_list) - 1; $i >= 0; $i--) { // ----- Look for current path if ($v_list[$i] == ".") { // ----- Ignore this directory // Should be the first $i=0, but no check is done } else { if ($v_list[$i] == "..") { // ----- Ignore it and ignore the $i-1 $i--; } else { if (($v_list[$i] == '') && ($i != (sizeof($v_list) - 1)) && ($i != 0) ) { // ----- Ignore only the double '//' in path, // but not the first and last / } else { $v_result = $v_list[$i] . ($i != (sizeof($v_list) - 1) ? '/' . $v_result : ''); } } } } } if (defined('OS_WINDOWS') && OS_WINDOWS) { $v_result = strtr($v_result, '\\', '/'); } return $v_result; } /** * @param $p_path * @param bool $p_remove_disk_letter * @return string */ public function _translateWinPath($p_path, $p_remove_disk_letter = true) { if (defined('OS_WINDOWS') && OS_WINDOWS) { // ----- Look for potential disk letter if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false) ) { $p_path = substr($p_path, $v_position + 1); } // ----- Change potential windows directory separator if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')) { $p_path = strtr($p_path, '\\', '/'); } } return $p_path; } } PKwL\$ҪҪ:updraftplus/includes/PEAR/HTTP/Request2/Adapter/Socket.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** Base class for HTTP_Request2 adapters */ require_once 'HTTP/Request2/Adapter.php'; /** Socket wrapper class */ require_once 'HTTP/Request2/SocketWrapper.php'; /** * Socket-based adapter for HTTP_Request2 * * This adapter uses only PHP sockets and will work on almost any PHP * environment. Code is based on original HTTP_Request PEAR package. * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter { /** * Regular expression for 'token' rule from RFC 2616 */ const REGEXP_TOKEN = '[^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+'; /** * Regular expression for 'quoted-string' rule from RFC 2616 */ const REGEXP_QUOTED_STRING = '"(?>[^"\\\\]+|\\\\.)*"'; /** * Connected sockets, needed for Keep-Alive support * * @var array * @see connect() */ protected static $sockets = []; /** * Data for digest authentication scheme * * The keys for the array are URL prefixes. * * The values are associative arrays with data (realm, nonce, nonce-count, * opaque...) needed for digest authentication. Stored here to prevent making * duplicate requests to digest-protected resources after we have already * received the challenge. * * @var array */ protected static $challenges = []; /** * Connected socket * * @var HTTP_Request2_SocketWrapper * @see connect() */ protected $socket; /** * Challenge used for server digest authentication * * @var array */ protected $serverChallenge; /** * Challenge used for proxy digest authentication * * @var array */ protected $proxyChallenge; /** * Remaining length of the current chunk, when reading chunked response * * @var integer * @see readChunked() */ protected $chunkLength = 0; /** * Remaining amount of redirections to follow * * Starts at 'max_redirects' configuration parameter and is reduced on each * subsequent redirect. An Exception will be thrown once it reaches zero. * * @var integer */ protected $redirectCountdown = null; /** * Whether to wait for "100 Continue" response before sending request body * * @var bool */ protected $expect100Continue = false; /** * Sends request to the remote server and returns its response * * @param HTTP_Request2 $request HTTP request message * * @return HTTP_Request2_Response * @throws HTTP_Request2_Exception */ public function sendRequest(HTTP_Request2 $request) { $this->request = $request; try { $keepAlive = $this->connect(); $headers = $this->prepareHeaders(); $this->socket->write($headers); // provide request headers to the observer, see request #7633 $this->request->setLastEvent('sentHeaders', $headers); if (!$this->expect100Continue) { $this->writeBody(); $response = $this->readResponse(); } else { $response = $this->readResponse(); if (!$response || 100 == $response->getStatus()) { $this->expect100Continue = false; // either got "100 Continue" or timed out -> send body $this->writeBody(); $response = $this->readResponse(); } } if ($jar = $request->getCookieJar()) { $jar->addCookiesFromResponse($response); } if (!$this->canKeepAlive($keepAlive, $response)) { $this->disconnect(); } if ($this->shouldUseProxyDigestAuth($response)) { return $this->sendRequest($request); } if ($this->shouldUseServerDigestAuth($response)) { return $this->sendRequest($request); } if ($authInfo = $response->getHeader('authentication-info')) { $this->updateChallenge($this->serverChallenge, $authInfo); } if ($proxyInfo = $response->getHeader('proxy-authentication-info')) { $this->updateChallenge($this->proxyChallenge, $proxyInfo); } } catch (Exception $e) { $this->disconnect(); $this->redirectCountdown = null; throw $e; } finally { // phpcs:ignore PHPCompatibility.Keywords.NewKeywords.t_finallyFound unset($this->request, $this->requestBody); } if (!$request->getConfig('follow_redirects') || !$response->isRedirect()) { $this->redirectCountdown = null; return $response; } else { return $this->handleRedirect($request, $response); } } /** * Connects to the remote server * * @return bool whether the connection can be persistent * @throws HTTP_Request2_Exception */ protected function connect() { $secure = 0 == strcasecmp($this->request->getUrl()->getScheme(), 'https'); $tunnel = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod(); $headers = $this->request->getHeaders(); $reqHost = $this->request->getUrl()->getHost(); if (!($reqPort = $this->request->getUrl()->getPort())) { $reqPort = $secure? 443: 80; } $httpProxy = $socksProxy = false; if (!($host = $this->request->getConfig('proxy_host'))) { $host = $reqHost; $port = $reqPort; } else { if (!($port = $this->request->getConfig('proxy_port'))) { throw new HTTP_Request2_LogicException( 'Proxy port not provided', HTTP_Request2_Exception::MISSING_VALUE ); } if ('http' == ($type = $this->request->getConfig('proxy_type'))) { $httpProxy = true; } elseif ('socks5' == $type) { $socksProxy = true; } else { throw new HTTP_Request2_NotImplementedException( "Proxy type '{$type}' is not supported" ); } } if ($tunnel && !$httpProxy) { throw new HTTP_Request2_LogicException( "Trying to perform CONNECT request without proxy", HTTP_Request2_Exception::MISSING_VALUE ); } if ($secure && !in_array('ssl', stream_get_transports())) { throw new HTTP_Request2_LogicException( 'Need OpenSSL support for https:// requests', HTTP_Request2_Exception::MISCONFIGURATION ); } // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive // connection token to a proxy server... if ($httpProxy && !$secure && !empty($headers['connection']) && 'Keep-Alive' == $headers['connection'] ) { $this->request->setHeader('connection'); } $keepAlive = ('1.1' == $this->request->getConfig('protocol_version') && empty($headers['connection'])) || (!empty($headers['connection']) && 'Keep-Alive' == $headers['connection']); $options = []; if ($ip = $this->request->getConfig('local_ip')) { $options['socket'] = [ 'bindto' => (false === strpos($ip, ':') ? $ip : '[' . $ip . ']') . ':0' ]; } if ($secure || $tunnel) { $options['ssl'] = []; foreach ($this->request->getConfig() as $name => $value) { if ('ssl_' == substr($name, 0, 4) && null !== $value) { if ('ssl_verify_host' == $name) { $options['ssl']['verify_peer_name'] = $value; $options['ssl']['peer_name'] = $reqHost; } else { $options['ssl'][substr($name, 4)] = $value; } } } ksort($options['ssl']); } // Use global request timeout if given, see feature requests #5735, #8964 if ($timeout = $this->request->getConfig('timeout')) { $deadline = microtime(true) + $timeout; } else { $deadline = null; } // Changing SSL context options after connection is established does *not* // work, we need a new connection if options change $remote = ((!$secure || $httpProxy || $socksProxy)? 'tcp://': 'tls://') . $host . ':' . $port; $socketKey = $remote . ( ($secure && $httpProxy || $socksProxy) ? "->{$reqHost}:{$reqPort}" : '' ) . (empty($options)? '': ':' . serialize($options)); unset($this->socket); // We use persistent connections and have a connected socket? // Ensure that the socket is still connected, see bug #16149 if ($keepAlive && !empty(self::$sockets[$socketKey]) && !self::$sockets[$socketKey]->eof() ) { $this->socket =& self::$sockets[$socketKey]; } else { if ($socksProxy) { require_once 'HTTP/Request2/SOCKS5.php'; $this->socket = new HTTP_Request2_SOCKS5( $remote, $this->request->getConfig('connect_timeout'), $options, $this->request->getConfig('proxy_user'), $this->request->getConfig('proxy_password') ); // handle request timeouts ASAP $this->socket->setDeadline($deadline, $this->request->getConfig('timeout')); $this->socket->connect($reqHost, $reqPort); if (!$secure) { $conninfo = "tcp://{$reqHost}:{$reqPort} via {$remote}"; } else { $this->socket->enableCrypto(); $conninfo = "tls://{$reqHost}:{$reqPort} via {$remote}"; } } elseif ($secure && $httpProxy && !$tunnel) { $this->establishTunnel(); $conninfo = "tls://{$reqHost}:{$reqPort} via {$remote}"; } else { $this->socket = new HTTP_Request2_SocketWrapper( $remote, $this->request->getConfig('connect_timeout'), $options ); } $this->request->setLastEvent('connect', empty($conninfo)? $remote: $conninfo); self::$sockets[$socketKey] =& $this->socket; } $this->socket->setDeadline($deadline, $this->request->getConfig('timeout')); return $keepAlive; } /** * Establishes a tunnel to a secure remote server via HTTP CONNECT request * * This method will fail if 'ssl_verify_peer' is enabled. Probably because PHP * sees that we are connected to a proxy server (duh!) rather than the server * that presents its certificate. * * @link http://tools.ietf.org/html/rfc2817#section-5.2 * * @return void * @throws HTTP_Request2_Exception */ protected function establishTunnel() { $donor = new self; $connect = new HTTP_Request2( $this->request->getUrl(), HTTP_Request2::METHOD_CONNECT, array_merge($this->request->getConfig(), ['adapter' => $donor]) ); $response = $connect->send(); // Need any successful (2XX) response if (200 > $response->getStatus() || 300 <= $response->getStatus()) { throw new HTTP_Request2_ConnectionException( 'Failed to connect via HTTPS proxy. Proxy response: ' . $response->getStatus() . ' ' . $response->getReasonPhrase() ); } $this->socket = $donor->socket; $this->socket->enableCrypto(); } /** * Checks whether current connection may be reused or should be closed * * @param boolean $requestKeepAlive whether connection could * be persistent in the first place * @param HTTP_Request2_Response $response response object to check * * @return boolean */ protected function canKeepAlive($requestKeepAlive, HTTP_Request2_Response $response) { // Do not close socket on successful CONNECT request if (HTTP_Request2::METHOD_CONNECT === $this->request->getMethod() && 200 <= $response->getStatus() && 300 > $response->getStatus() ) { return true; } $lengthKnown = 'chunked' === strtolower($response->getHeader('transfer-encoding') ?: '') || null !== $response->getHeader('content-length') // no body possible for such responses, see also request #17031 || HTTP_Request2::METHOD_HEAD === $this->request->getMethod() || in_array($response->getStatus(), [204, 304]); $persistent = 'keep-alive' === strtolower($response->getHeader('connection') ?: '') || (null === $response->getHeader('connection') && '1.1' === $response->getVersion()); return $requestKeepAlive && $lengthKnown && $persistent; } /** * Disconnects from the remote server * * @return void */ protected function disconnect() { if (!empty($this->socket)) { $this->socket = null; $this->request->setLastEvent('disconnect'); } } /** * Handles HTTP redirection * * This method will throw an Exception if redirect to a non-HTTP(S) location * is attempted, also if number of redirects performed already is equal to * 'max_redirects' configuration parameter. * * @param HTTP_Request2 $request Original request * @param HTTP_Request2_Response $response Response containing redirect * * @return HTTP_Request2_Response Response from a new location * @throws HTTP_Request2_Exception */ protected function handleRedirect( HTTP_Request2 $request, HTTP_Request2_Response $response ) { if (is_null($this->redirectCountdown)) { $this->redirectCountdown = $request->getConfig('max_redirects'); } if (0 == $this->redirectCountdown) { $this->redirectCountdown = null; // Copying cURL behaviour throw new HTTP_Request2_MessageException( 'Maximum (' . $request->getConfig('max_redirects') . ') redirects followed', HTTP_Request2_Exception::TOO_MANY_REDIRECTS ); } $redirectUrl = new Net_URL2( $response->getHeader('location'), [Net_URL2::OPTION_USE_BRACKETS => $request->getConfig('use_brackets')] ); // refuse non-HTTP redirect if ($redirectUrl->isAbsolute() && !in_array($redirectUrl->getScheme(), ['http', 'https']) ) { $this->redirectCountdown = null; throw new HTTP_Request2_MessageException( 'Refusing to redirect to a non-HTTP URL ' . $redirectUrl->__toString(), HTTP_Request2_Exception::NON_HTTP_REDIRECT ); } // Theoretically URL should be absolute (see http://tools.ietf.org/html/rfc2616#section-14.30), // but in practice it is often not if (!$redirectUrl->isAbsolute()) { $redirectUrl = $request->getUrl()->resolve($redirectUrl); } $redirect = clone $request; $redirect->setUrl($redirectUrl); if (303 == $response->getStatus() || (!$request->getConfig('strict_redirects') && in_array($response->getStatus(), [301, 302])) ) { $redirect->setMethod(HTTP_Request2::METHOD_GET); $redirect->setBody(''); } if (0 < $this->redirectCountdown) { $this->redirectCountdown--; } return $this->sendRequest($redirect); } /** * Checks whether another request should be performed with server digest auth * * Several conditions should be satisfied for it to return true: * - response status should be 401 * - auth credentials should be set in the request object * - response should contain WWW-Authenticate header with digest challenge * - there is either no challenge stored for this URL or new challenge * contains stale=true parameter (in other case we probably just failed * due to invalid username / password) * * The method stores challenge values in $challenges static property * * @param HTTP_Request2_Response $response response to check * * @return boolean whether another request should be performed * @throws HTTP_Request2_Exception in case of unsupported challenge parameters */ protected function shouldUseServerDigestAuth(HTTP_Request2_Response $response) { // no sense repeating a request if we don't have credentials if (401 != $response->getStatus() || !$this->request->getAuth()) { return false; } if (!$challenge = $this->parseDigestChallenge($response->getHeader('www-authenticate'))) { return false; } $url = $this->request->getUrl(); $scheme = $url->getScheme(); $host = $scheme . '://' . $url->getHost(); if ($port = $url->getPort()) { if ((0 == strcasecmp($scheme, 'http') && 80 != $port) || (0 == strcasecmp($scheme, 'https') && 443 != $port) ) { $host .= ':' . $port; } } if (!empty($challenge['domain'])) { $prefixes = []; foreach (preg_split('/\\s+/', $challenge['domain']) as $prefix) { // don't bother with different servers if ('/' == substr($prefix, 0, 1)) { $prefixes[] = $host . $prefix; } } } if (empty($prefixes)) { $prefixes = [$host . '/']; } $ret = true; foreach ($prefixes as $prefix) { if (!empty(self::$challenges[$prefix]) && (empty($challenge['stale']) || strcasecmp('true', $challenge['stale'])) ) { // probably credentials are invalid $ret = false; } self::$challenges[$prefix] =& $challenge; } return $ret; } /** * Checks whether another request should be performed with proxy digest auth * * Several conditions should be satisfied for it to return true: * - response status should be 407 * - proxy auth credentials should be set in the request object * - response should contain Proxy-Authenticate header with digest challenge * - there is either no challenge stored for this proxy or new challenge * contains stale=true parameter (in other case we probably just failed * due to invalid username / password) * * The method stores challenge values in $challenges static property * * @param HTTP_Request2_Response $response response to check * * @return boolean whether another request should be performed * @throws HTTP_Request2_Exception in case of unsupported challenge parameters */ protected function shouldUseProxyDigestAuth(HTTP_Request2_Response $response) { if (407 != $response->getStatus() || !$this->request->getConfig('proxy_user')) { return false; } if (!($challenge = $this->parseDigestChallenge($response->getHeader('proxy-authenticate')))) { return false; } $key = 'proxy://' . $this->request->getConfig('proxy_host') . ':' . $this->request->getConfig('proxy_port'); if (!empty(self::$challenges[$key]) && (empty($challenge['stale']) || strcasecmp('true', $challenge['stale'])) ) { $ret = false; } else { $ret = true; } self::$challenges[$key] = $challenge; return $ret; } /** * Extracts digest method challenge from (WWW|Proxy)-Authenticate header value * * There is a problem with implementation of RFC 2617: several of the parameters * are defined as quoted-string there and thus may contain backslash escaped * double quotes (RFC 2616, section 2.2). However, RFC 2617 defines unq(X) as * just value of quoted-string X without surrounding quotes, it doesn't speak * about removing backslash escaping. * * Now realm parameter is user-defined and human-readable, strange things * happen when it contains quotes: * - Apache allows quotes in realm, but apparently uses realm value without * backslashes for digest computation * - Squid allows (manually escaped) quotes there, but it is impossible to * authorize with either escaped or unescaped quotes used in digest, * probably it can't parse the response (?) * - Both IE and Firefox display realm value with backslashes in * the password popup and apparently use the same value for digest * * HTTP_Request2 follows IE and Firefox (and hopefully RFC 2617) in * quoted-string handling, unfortunately that means failure to authorize * sometimes * * @param string $headerValue value of WWW-Authenticate or Proxy-Authenticate header * * @return mixed associative array with challenge parameters, false if * no challenge is present in header value * @throws HTTP_Request2_NotImplementedException in case of unsupported challenge parameters */ protected function parseDigestChallenge($headerValue) { $authParam = '(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' . self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')'; $challenge = "!(?<=^|\\s|,)Digest ({$authParam}\\s*(,\\s*|$))+!"; if (!preg_match($challenge, $headerValue, $matches)) { return false; } preg_match_all('!' . $authParam . '!', $matches[0], $params); $paramsAry = []; $knownParams = ['realm', 'domain', 'nonce', 'opaque', 'stale', 'algorithm', 'qop']; for ($i = 0; $i < count($params[0]); $i++) { // section 3.2.1: Any unrecognized directive MUST be ignored. if (in_array($params[1][$i], $knownParams)) { if ('"' == substr($params[2][$i], 0, 1)) { $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1); } else { $paramsAry[$params[1][$i]] = $params[2][$i]; } } } // we only support qop=auth if (!empty($paramsAry['qop']) && !in_array('auth', array_map('trim', explode(',', $paramsAry['qop']))) ) { throw new HTTP_Request2_NotImplementedException( "Only 'auth' qop is currently supported in digest authentication, " . "server requested '{$paramsAry['qop']}'" ); } // we only support algorithm=MD5 if (!empty($paramsAry['algorithm']) && 'MD5' != $paramsAry['algorithm']) { throw new HTTP_Request2_NotImplementedException( "Only 'MD5' algorithm is currently supported in digest authentication, " . "server requested '{$paramsAry['algorithm']}'" ); } return $paramsAry; } /** * Parses [Proxy-]Authentication-Info header value and updates challenge * * @param array $challenge challenge to update * @param string $headerValue value of [Proxy-]Authentication-Info header * * @return void * * @todo validate server rspauth response */ protected function updateChallenge(&$challenge, $headerValue) { $authParam = '!(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' . self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')!'; $paramsAry = []; preg_match_all($authParam, $headerValue, $params); for ($i = 0; $i < count($params[0]); $i++) { if ('"' == substr($params[2][$i], 0, 1)) { $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1); } else { $paramsAry[$params[1][$i]] = $params[2][$i]; } } // for now, just update the nonce value if (!empty($paramsAry['nextnonce'])) { $challenge['nonce'] = $paramsAry['nextnonce']; $challenge['nc'] = 1; } } /** * Creates a value for [Proxy-]Authorization header when using digest authentication * * @param string $user user name * @param string $password password * @param string $url request URL * @param array $challenge digest challenge parameters * * @return string value of [Proxy-]Authorization request header * @link http://tools.ietf.org/html/rfc2617#section-3.2.2 */ protected function createDigestResponse($user, $password, $url, &$challenge) { if (false !== ($q = strpos($url, '?')) && $this->request->getConfig('digest_compat_ie') ) { $url = substr($url, 0, $q); } $a1 = md5($user . ':' . $challenge['realm'] . ':' . $password); $a2 = md5($this->request->getMethod() . ':' . $url); if (empty($challenge['qop'])) { $digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $a2); } else { $challenge['cnonce'] = 'Req2.' . rand(); if (empty($challenge['nc'])) { $challenge['nc'] = 1; } $nc = sprintf('%08x', $challenge['nc']++); $digest = md5( $a1 . ':' . $challenge['nonce'] . ':' . $nc . ':' . $challenge['cnonce'] . ':auth:' . $a2 ); } return 'Digest username="' . str_replace(['\\', '"'], ['\\\\', '\\"'], $user) . '", ' . 'realm="' . $challenge['realm'] . '", ' . 'nonce="' . $challenge['nonce'] . '", ' . 'uri="' . $url . '", ' . 'response="' . $digest . '"' . (!empty($challenge['opaque'])? ', opaque="' . $challenge['opaque'] . '"': '') . (!empty($challenge['qop'])? ', qop="auth", nc=' . $nc . ', cnonce="' . $challenge['cnonce'] . '"': ''); } /** * Adds 'Authorization' header (if needed) to request headers array * * @param array $headers request headers * @param string $requestHost request host (needed for digest authentication) * @param string $requestUrl request URL (needed for digest authentication) * * @return void * @throws HTTP_Request2_NotImplementedException */ protected function addAuthorizationHeader(&$headers, $requestHost, $requestUrl) { if (!($auth = $this->request->getAuth())) { return; } switch ($auth['scheme']) { case HTTP_Request2::AUTH_BASIC: $headers['authorization'] = 'Basic ' . base64_encode( $auth['user'] . ':' . $auth['password'] ); break; case HTTP_Request2::AUTH_DIGEST: unset($this->serverChallenge); $fullUrl = ('/' == $requestUrl[0])? $this->request->getUrl()->getScheme() . '://' . $requestHost . $requestUrl: $requestUrl; foreach (array_keys(self::$challenges) as $key) { if ($key == substr($fullUrl, 0, strlen($key))) { $headers['authorization'] = $this->createDigestResponse( $auth['user'], $auth['password'], $requestUrl, self::$challenges[$key] ); $this->serverChallenge =& self::$challenges[$key]; break; } } break; default: throw new HTTP_Request2_NotImplementedException( "Unknown HTTP authentication scheme '{$auth['scheme']}'" ); } } /** * Adds 'Proxy-Authorization' header (if needed) to request headers array * * @param array $headers request headers * @param string $requestUrl request URL (needed for digest authentication) * * @return void * @throws HTTP_Request2_NotImplementedException */ protected function addProxyAuthorizationHeader(&$headers, $requestUrl) { if (!$this->request->getConfig('proxy_host') || !($user = $this->request->getConfig('proxy_user')) || (0 == strcasecmp('https', $this->request->getUrl()->getScheme()) && HTTP_Request2::METHOD_CONNECT != $this->request->getMethod()) ) { return; } $password = $this->request->getConfig('proxy_password'); switch ($this->request->getConfig('proxy_auth_scheme')) { case HTTP_Request2::AUTH_BASIC: $headers['proxy-authorization'] = 'Basic ' . base64_encode( $user . ':' . $password ); break; case HTTP_Request2::AUTH_DIGEST: unset($this->proxyChallenge); $proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') . ':' . $this->request->getConfig('proxy_port'); if (!empty(self::$challenges[$proxyUrl])) { $headers['proxy-authorization'] = $this->createDigestResponse( $user, $password, $requestUrl, self::$challenges[$proxyUrl] ); $this->proxyChallenge =& self::$challenges[$proxyUrl]; } break; default: throw new HTTP_Request2_NotImplementedException( "Unknown HTTP authentication scheme '" . $this->request->getConfig('proxy_auth_scheme') . "'" ); } } /** * Creates the string with the Request-Line and request headers * * @return string * @throws HTTP_Request2_Exception */ protected function prepareHeaders() { $headers = $this->request->getHeaders(); $url = $this->request->getUrl(); $connect = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod(); $host = $url->getHost(); $defaultPort = 0 == strcasecmp($url->getScheme(), 'https')? 443: 80; if (($port = $url->getPort()) && $port != $defaultPort || $connect) { $host .= ':' . (empty($port)? $defaultPort: $port); } // Do not overwrite explicitly set 'Host' header, see bug #16146 if (!isset($headers['host'])) { $headers['host'] = $host; } if ($connect) { $requestUrl = $host; } else { if (!$this->request->getConfig('proxy_host') || 'http' != $this->request->getConfig('proxy_type') || 0 == strcasecmp($url->getScheme(), 'https') ) { $requestUrl = ''; } else { $requestUrl = $url->getScheme() . '://' . $host; } $path = $url->getPath(); $query = $url->getQuery(); $requestUrl .= (empty($path)? '/': $path) . (empty($query)? '': '?' . $query); } if ('1.1' == $this->request->getConfig('protocol_version') && extension_loaded('zlib') && !isset($headers['accept-encoding']) ) { $headers['accept-encoding'] = 'gzip, deflate'; } if (($jar = $this->request->getCookieJar()) && ($cookies = $jar->getMatching($this->request->getUrl(), true)) ) { $headers['cookie'] = (empty($headers['cookie'])? '': $headers['cookie'] . '; ') . $cookies; } $this->addAuthorizationHeader($headers, $host, $requestUrl); $this->addProxyAuthorizationHeader($headers, $requestUrl); $this->calculateRequestLength($headers); if ('1.1' == $this->request->getConfig('protocol_version')) { $this->updateExpectHeader($headers); } else { $this->expect100Continue = false; } $headersStr = $this->request->getMethod() . ' ' . $requestUrl . ' HTTP/' . $this->request->getConfig('protocol_version') . "\r\n"; foreach ($headers as $name => $value) { $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); $headersStr .= $canonicalName . ': ' . $value . "\r\n"; } return $headersStr . "\r\n"; } /** * Adds or removes 'Expect: 100-continue' header from request headers * * Also sets the $expect100Continue property. Parsing of existing header * is somewhat needed due to its complex structure and due to the * requirement in section 8.2.3 of RFC 2616: * > A client MUST NOT send an Expect request-header field (section * > 14.20) with the "100-continue" expectation if it does not intend * > to send a request body. * * @param array $headers Array of headers prepared for the request * * @return void * @throws HTTP_Request2_LogicException * * @link http://pear.php.net/bugs/bug.php?id=19233 * @link http://tools.ietf.org/html/rfc2616#section-8.2.3 */ protected function updateExpectHeader(&$headers) { $this->expect100Continue = false; $expectations = []; if (isset($headers['expect'])) { if ('' === $headers['expect']) { // empty 'Expect' header is technically invalid, so just get rid of it unset($headers['expect']); return; } // build regexp to parse the value of existing Expect header $expectParam = ';\s*' . self::REGEXP_TOKEN . '(?:\s*=\s*(?:' . self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . '))?\s*'; $expectExtension = self::REGEXP_TOKEN . '(?:\s*=\s*(?:' . self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')\s*(?:' . $expectParam . ')*)?'; $expectItem = '!(100-continue|' . $expectExtension . ')!A'; $pos = 0; $length = strlen($headers['expect']); while ($pos < $length) { $pos += strspn($headers['expect'], " \t", $pos); if (',' === substr($headers['expect'], $pos, 1)) { $pos++; continue; } elseif (!preg_match($expectItem, $headers['expect'], $m, 0, $pos)) { throw new HTTP_Request2_LogicException( "Cannot parse value '{$headers['expect']}' of Expect header", HTTP_Request2_Exception::INVALID_ARGUMENT ); } else { $pos += strlen($m[0]); if (strcasecmp('100-continue', $m[0])) { $expectations[] = $m[0]; } } } } if (1024 < $this->contentLength) { $expectations[] = '100-continue'; $this->expect100Continue = true; } if (empty($expectations)) { unset($headers['expect']); } else { $headers['expect'] = implode(',', $expectations); } } /** * Sends the request body * * @return void * @throws HTTP_Request2_MessageException */ protected function writeBody() { if (in_array($this->request->getMethod(), self::$bodyDisallowed) || 0 == $this->contentLength ) { return; } $position = 0; $bufferSize = $this->request->getConfig('buffer_size'); $headers = $this->request->getHeaders(); $chunked = isset($headers['transfer-encoding']); while ($position < $this->contentLength) { if (is_string($this->requestBody)) { $str = substr($this->requestBody, $position, $bufferSize); } elseif (is_resource($this->requestBody)) { $str = fread($this->requestBody, $bufferSize); } else { $str = $this->requestBody->read($bufferSize); } if (!$chunked) { $this->socket->write($str); } else { $this->socket->write(dechex(strlen($str)) . "\r\n{$str}\r\n"); } // Provide the length of written string to the observer, request #7630 $this->request->setLastEvent('sentBodyPart', strlen($str)); $position += strlen($str); } // write zero-length chunk if ($chunked) { $this->socket->write("0\r\n\r\n"); } $this->request->setLastEvent('sentBody', $this->contentLength); } /** * Reads the remote server's response * * @return HTTP_Request2_Response * @throws HTTP_Request2_Exception */ protected function readResponse() { $bufferSize = $this->request->getConfig('buffer_size'); // http://tools.ietf.org/html/rfc2616#section-8.2.3 // ...the client SHOULD NOT wait for an indefinite period before sending the request body $timeout = $this->expect100Continue ? 1 : null; do { try { $response = new HTTP_Request2_Response( $this->socket->readLine($bufferSize, $timeout), true, $this->request->getUrl() ); do { $headerLine = $this->socket->readLine($bufferSize); $response->parseHeaderLine($headerLine); } while ('' != $headerLine); } catch (HTTP_Request2_MessageException $e) { if (HTTP_Request2_Exception::TIMEOUT === $e->getCode() && $this->expect100Continue ) { return null; } throw $e; } if ($this->expect100Continue && 100 == $response->getStatus()) { return $response; } } while (in_array($response->getStatus(), [100, 101])); $this->request->setLastEvent('receivedHeaders', $response); // No body possible in such responses if (HTTP_Request2::METHOD_HEAD == $this->request->getMethod() || (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod() && 200 <= $response->getStatus() && 300 > $response->getStatus()) || in_array($response->getStatus(), [204, 304]) ) { return $response; } $chunked = 'chunked' == $response->getHeader('transfer-encoding'); $length = $response->getHeader('content-length'); $hasBody = false; // RFC 2616, section 4.4: // 3. ... If a message is received with both a // Transfer-Encoding header field and a Content-Length header field, // the latter MUST be ignored. $toRead = ($chunked || null === $length)? null: $length; $this->chunkLength = 0; if ($chunked || null === $length || 0 < intval($length)) { while (!$this->socket->eof() && (is_null($toRead) || 0 < $toRead)) { if ($chunked) { $data = $this->readChunked($bufferSize); } elseif (is_null($toRead)) { $data = $this->socket->read($bufferSize); } else { $data = $this->socket->read(min($toRead, $bufferSize)); $toRead -= strlen($data); } if ('' == $data && (!$this->chunkLength || $this->socket->eof())) { break; } $hasBody = true; if ($this->request->getConfig('store_body')) { $response->appendBody($data); } if (!in_array($response->getHeader('content-encoding'), ['identity', null])) { $this->request->setLastEvent('receivedEncodedBodyPart', $data); } else { $this->request->setLastEvent('receivedBodyPart', $data); } } } if (0 !== $this->chunkLength || null !== $toRead && $toRead > 0) { $this->request->setLastEvent( 'warning', 'transfer closed with outstanding read data remaining' ); } if ($hasBody) { $this->request->setLastEvent('receivedBody', $response); } return $response; } /** * Reads a part of response body encoded with chunked Transfer-Encoding * * @param int $bufferSize buffer size to use for reading * * @return string * @throws HTTP_Request2_MessageException */ protected function readChunked($bufferSize) { // at start of the next chunk? if (0 == $this->chunkLength) { $line = $this->socket->readLine($bufferSize); if ('' === $line && $this->socket->eof()) { $this->chunkLength = -1; // indicate missing chunk return ''; } elseif (!preg_match('/^([0-9a-f]+)/i', $line, $matches)) { throw new HTTP_Request2_MessageException( "Cannot decode chunked response, invalid chunk length '{$line}'", HTTP_Request2_Exception::DECODE_ERROR ); } else { $this->chunkLength = hexdec($matches[1]); // Chunk with zero length indicates the end if (0 == $this->chunkLength) { $this->socket->readLine($bufferSize); return ''; } } } $data = $this->socket->read(min($this->chunkLength, $bufferSize)); $this->chunkLength -= strlen($data); if (0 == $this->chunkLength) { $this->socket->readLine($bufferSize); // Trailing CRLF } return $data; } } ?>PKwL\8updraftplus/includes/PEAR/HTTP/Request2/Adapter/Mock.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Base class for HTTP_Request2 adapters */ require_once 'HTTP/Request2/Adapter.php'; /** * Mock adapter intended for testing * * Can be used to test applications depending on HTTP_Request2 package without * actually performing any HTTP requests. This adapter will return responses * previously added via addResponse() * * $mock = new HTTP_Request2_Adapter_Mock(); * $mock->addResponse("HTTP/1.1 ... "); * * $request = new HTTP_Request2(); * $request->setAdapter($mock); * * // This will return the response set above * $response = $req->send(); * * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_Adapter_Mock extends HTTP_Request2_Adapter { /** * A queue of responses to be returned by sendRequest() * * @var array */ protected $responses = []; /** * Returns the next response from the queue built by addResponse() * * Only responses without explicit URLs or with URLs equal to request URL * will be considered. If matching response is not found or the queue is * empty then default empty response with status 400 will be returned, * if an Exception object was added to the queue it will be thrown. * * @param HTTP_Request2 $request HTTP request message * * @return HTTP_Request2_Response * @throws Exception */ public function sendRequest(HTTP_Request2 $request) { $requestUrl = (string)$request->getUrl(); $response = null; foreach ($this->responses as $k => $v) { if (!$v[1] || $requestUrl == $v[1]) { $response = $v[0]; array_splice($this->responses, $k, 1); break; } } if (!$response) { return self::createResponseFromString("HTTP/1.1 400 Bad Request\r\n\r\n"); } elseif ($response instanceof HTTP_Request2_Response) { return $response; } else { // rethrow the exception $class = get_class($response); $message = $response->getMessage(); $code = $response->getCode(); throw new $class($message, $code); } } /** * Adds response to the queue * * @param mixed $response either a string, a pointer to an open file, * an instance of HTTP_Request2_Response or Exception * @param string $url A request URL this response should be valid for * (see {@link http://pear.php.net/bugs/bug.php?id=19276}) * * @return void * @throws HTTP_Request2_Exception */ public function addResponse($response, $url = null) { if (is_string($response)) { $response = self::createResponseFromString($response); } elseif (is_resource($response)) { $response = self::createResponseFromFile($response); } elseif (!$response instanceof HTTP_Request2_Response && !$response instanceof Exception ) { throw new HTTP_Request2_Exception('Parameter is not a valid response'); } $this->responses[] = [$response, $url]; } /** * Creates a new HTTP_Request2_Response object from a string * * @param string $str string containing HTTP response message * * @return HTTP_Request2_Response * @throws HTTP_Request2_Exception */ public static function createResponseFromString($str) { $parts = preg_split('!(\r?\n){2}!m', $str, 2); $headerLines = explode("\n", $parts[0]); $response = new HTTP_Request2_Response(array_shift($headerLines)); foreach ($headerLines as $headerLine) { $response->parseHeaderLine($headerLine); } $response->parseHeaderLine(''); if (isset($parts[1])) { $response->appendBody($parts[1]); } return $response; } /** * Creates a new HTTP_Request2_Response object from a file * * @param resource $fp file pointer returned by fopen() * * @return HTTP_Request2_Response * @throws HTTP_Request2_Exception */ public static function createResponseFromFile($fp) { $response = new HTTP_Request2_Response(fgets($fp)); do { $headerLine = fgets($fp); $response->parseHeaderLine($headerLine); } while ('' != trim($headerLine)); while (!feof($fp)) { $response->appendBody(fread($fp, 8192)); } return $response; } } ?>PKwL\r5WW8updraftplus/includes/PEAR/HTTP/Request2/Adapter/Curl.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Base class for HTTP_Request2 adapters */ require_once 'HTTP/Request2/Adapter.php'; /** * Adapter for HTTP_Request2 wrapping around cURL extension * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter { /** * Mapping of header names to cURL options * * @var array */ protected static $headerMap = [ 'accept-encoding' => CURLOPT_ENCODING, 'cookie' => CURLOPT_COOKIE, 'referer' => CURLOPT_REFERER, 'user-agent' => CURLOPT_USERAGENT ]; /** * Mapping of SSL context options to cURL options * * @var array */ protected static $sslContextMap = [ 'ssl_verify_peer' => CURLOPT_SSL_VERIFYPEER, 'ssl_cafile' => CURLOPT_CAINFO, 'ssl_capath' => CURLOPT_CAPATH, 'ssl_local_cert' => CURLOPT_SSLCERT, 'ssl_passphrase' => CURLOPT_SSLCERTPASSWD ]; /** * Mapping of CURLE_* constants to Exception subclasses and error codes * * @var array */ protected static $errorMap = [ CURLE_UNSUPPORTED_PROTOCOL => ['HTTP_Request2_MessageException', HTTP_Request2_Exception::NON_HTTP_REDIRECT], CURLE_COULDNT_RESOLVE_PROXY => ['HTTP_Request2_ConnectionException'], CURLE_COULDNT_RESOLVE_HOST => ['HTTP_Request2_ConnectionException'], CURLE_COULDNT_CONNECT => ['HTTP_Request2_ConnectionException'], // error returned from write callback CURLE_WRITE_ERROR => ['HTTP_Request2_MessageException', HTTP_Request2_Exception::NON_HTTP_REDIRECT], CURLE_OPERATION_TIMEOUTED => ['HTTP_Request2_MessageException', HTTP_Request2_Exception::TIMEOUT], CURLE_HTTP_RANGE_ERROR => ['HTTP_Request2_MessageException'], CURLE_SSL_CONNECT_ERROR => ['HTTP_Request2_ConnectionException'], CURLE_LIBRARY_NOT_FOUND => ['HTTP_Request2_LogicException', HTTP_Request2_Exception::MISCONFIGURATION], CURLE_FUNCTION_NOT_FOUND => ['HTTP_Request2_LogicException', HTTP_Request2_Exception::MISCONFIGURATION], CURLE_ABORTED_BY_CALLBACK => ['HTTP_Request2_MessageException', HTTP_Request2_Exception::NON_HTTP_REDIRECT], CURLE_TOO_MANY_REDIRECTS => ['HTTP_Request2_MessageException', HTTP_Request2_Exception::TOO_MANY_REDIRECTS], CURLE_SSL_PEER_CERTIFICATE => ['HTTP_Request2_ConnectionException'], CURLE_GOT_NOTHING => ['HTTP_Request2_MessageException'], CURLE_SSL_ENGINE_NOTFOUND => ['HTTP_Request2_LogicException', HTTP_Request2_Exception::MISCONFIGURATION], CURLE_SSL_ENGINE_SETFAILED => ['HTTP_Request2_LogicException', HTTP_Request2_Exception::MISCONFIGURATION], CURLE_SEND_ERROR => ['HTTP_Request2_MessageException'], CURLE_RECV_ERROR => ['HTTP_Request2_MessageException'], CURLE_SSL_CERTPROBLEM => ['HTTP_Request2_LogicException', HTTP_Request2_Exception::INVALID_ARGUMENT], CURLE_SSL_CIPHER => ['HTTP_Request2_ConnectionException'], CURLE_SSL_CACERT => ['HTTP_Request2_ConnectionException'], CURLE_BAD_CONTENT_ENCODING => ['HTTP_Request2_MessageException'], ]; /** * Response being received * * @var HTTP_Request2_Response */ protected $response; /** * Whether 'sentHeaders' event was sent to observers * * @var boolean */ protected $eventSentHeaders = false; /** * Whether 'receivedHeaders' event was sent to observers * * @var boolean */ protected $eventReceivedHeaders = false; /** * Whether 'sentBoody' event was sent to observers * * @var boolean */ protected $eventSentBody = false; /** * Position within request body * * @var integer * @see callbackReadBody() */ protected $position = 0; /** * Information about last transfer, as returned by curl_getinfo() * * @var array */ protected $lastInfo; /** * Creates a subclass of HTTP_Request2_Exception from curl error data * * @param resource $ch curl handle * * @return HTTP_Request2_Exception */ protected static function wrapCurlError($ch) { $nativeCode = curl_errno($ch); $message = 'Curl error: ' . curl_error($ch); if (!isset(self::$errorMap[$nativeCode])) { return new HTTP_Request2_Exception($message, 0, $nativeCode); } else { $class = self::$errorMap[$nativeCode][0]; $code = empty(self::$errorMap[$nativeCode][1]) ? 0 : self::$errorMap[$nativeCode][1]; return new $class($message, $code, $nativeCode); } } /** * Sends request to the remote server and returns its response * * @param HTTP_Request2 $request HTTP request message * * @return HTTP_Request2_Response * @throws HTTP_Request2_Exception */ public function sendRequest(HTTP_Request2 $request) { if (!extension_loaded('curl')) { throw new HTTP_Request2_LogicException( 'cURL extension not available', HTTP_Request2_Exception::MISCONFIGURATION ); } $this->request = $request; $this->response = null; $this->position = 0; $this->eventSentHeaders = false; $this->eventReceivedHeaders = false; $this->eventSentBody = false; try { if (false === curl_exec($ch = $this->createCurlHandle())) { throw self::wrapCurlError($ch); } } finally { // phpcs:ignore PHPCompatibility.Keywords.NewKeywords.t_finallyFound if (isset($ch)) { $this->lastInfo = curl_getinfo($ch); if (CURLE_OK !== curl_errno($ch)) { $this->request->setLastEvent('warning', curl_error($ch)); } curl_close($ch); } $response = $this->response; unset($this->request, $this->requestBody, $this->response); } if ($jar = $request->getCookieJar()) { $jar->addCookiesFromResponse($response); } if (0 < $this->lastInfo['size_download']) { $request->setLastEvent('receivedBody', $response); } return $response; } /** * Returns information about last transfer * * @return array associative array as returned by curl_getinfo() */ public function getInfo() { return $this->lastInfo; } /** * Creates a new cURL handle and populates it with data from the request * * @return resource a cURL handle, as created by curl_init() * @throws HTTP_Request2_LogicException * @throws HTTP_Request2_NotImplementedException */ protected function createCurlHandle() { $ch = curl_init(); curl_setopt_array( $ch, [ // setup write callbacks CURLOPT_HEADERFUNCTION => [$this, 'callbackWriteHeader'], CURLOPT_WRITEFUNCTION => [$this, 'callbackWriteBody'], // buffer size CURLOPT_BUFFERSIZE => $this->request->getConfig('buffer_size'), // connection timeout CURLOPT_CONNECTTIMEOUT => $this->request->getConfig('connect_timeout'), // save full outgoing headers, in case someone is interested CURLINFO_HEADER_OUT => true, // request url CURLOPT_URL => $this->request->getUrl()->getUrl() ] ); // set up redirects if (!$this->request->getConfig('follow_redirects')) { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); } else { if (!@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true)) { throw new HTTP_Request2_LogicException( 'Redirect support in curl is unavailable due to open_basedir or safe_mode setting', HTTP_Request2_Exception::MISCONFIGURATION ); } curl_setopt($ch, CURLOPT_MAXREDIRS, $this->request->getConfig('max_redirects')); // limit redirects to http(s), works in 5.2.10+ if (defined('CURLOPT_REDIR_PROTOCOLS')) { curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); } // works in 5.3.2+, http://bugs.php.net/bug.php?id=49571 if ($this->request->getConfig('strict_redirects') && defined('CURLOPT_POSTREDIR')) { curl_setopt($ch, CURLOPT_POSTREDIR, 3); } } // set local IP via CURLOPT_INTERFACE (request #19515) if ($ip = $this->request->getConfig('local_ip')) { curl_setopt($ch, CURLOPT_INTERFACE, $ip); } // request timeout if ($timeout = $this->request->getConfig('timeout')) { curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); } // set HTTP version switch ($this->request->getConfig('protocol_version')) { case '1.0': curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); break; case '1.1': curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); } // set request method switch ($this->request->getMethod()) { case HTTP_Request2::METHOD_GET: curl_setopt($ch, CURLOPT_HTTPGET, true); break; case HTTP_Request2::METHOD_POST: curl_setopt($ch, CURLOPT_POST, true); break; case HTTP_Request2::METHOD_HEAD: curl_setopt($ch, CURLOPT_NOBODY, true); break; case HTTP_Request2::METHOD_PUT: curl_setopt($ch, CURLOPT_UPLOAD, true); break; default: curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->request->getMethod()); } // set proxy, if needed if ($host = $this->request->getConfig('proxy_host')) { if (!($port = $this->request->getConfig('proxy_port'))) { throw new HTTP_Request2_LogicException( 'Proxy port not provided', HTTP_Request2_Exception::MISSING_VALUE ); } curl_setopt($ch, CURLOPT_PROXY, $host . ':' . $port); if ($user = $this->request->getConfig('proxy_user')) { curl_setopt( $ch, CURLOPT_PROXYUSERPWD, $user . ':' . $this->request->getConfig('proxy_password') ); switch ($this->request->getConfig('proxy_auth_scheme')) { case HTTP_Request2::AUTH_BASIC: curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); break; case HTTP_Request2::AUTH_DIGEST: curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST); } } if ($type = $this->request->getConfig('proxy_type')) { switch ($type) { case 'http': curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); break; case 'socks5': curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); break; default: throw new HTTP_Request2_NotImplementedException( "Proxy type '{$type}' is not supported" ); } } } // set authentication data if ($auth = $this->request->getAuth()) { curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']); switch ($auth['scheme']) { case HTTP_Request2::AUTH_BASIC: curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); break; case HTTP_Request2::AUTH_DIGEST: curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); } } // set SSL options foreach ($this->request->getConfig() as $name => $value) { if ('ssl_verify_host' == $name && null !== $value) { curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0); } elseif (isset(self::$sslContextMap[$name]) && null !== $value) { curl_setopt($ch, self::$sslContextMap[$name], $value); } } $headers = $this->request->getHeaders(); // make cURL automagically send proper header if (!isset($headers['accept-encoding'])) { $headers['accept-encoding'] = ''; } if (($jar = $this->request->getCookieJar()) && ($cookies = $jar->getMatching($this->request->getUrl(), true)) ) { $headers['cookie'] = (empty($headers['cookie'])? '': $headers['cookie'] . '; ') . $cookies; } // set headers having special cURL keys foreach (self::$headerMap as $name => $option) { if (isset($headers[$name])) { curl_setopt($ch, $option, $headers[$name]); unset($headers[$name]); } } $this->calculateRequestLength($headers); if (isset($headers['content-length']) || isset($headers['transfer-encoding'])) { $this->workaroundPhpBug47204($ch, $headers); } // set headers not having special keys $headersFmt = []; foreach ($headers as $name => $value) { $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); $headersFmt[] = $canonicalName . ': ' . $value; } curl_setopt($ch, CURLOPT_HTTPHEADER, $headersFmt); return $ch; } /** * Workaround for PHP bug #47204 that prevents rewinding request body * * The workaround consists of reading the entire request body into memory * and setting it as CURLOPT_POSTFIELDS, so it isn't recommended for large * file uploads, use Socket adapter instead. * * @param resource $ch cURL handle * @param array $headers Request headers * * @return void */ protected function workaroundPhpBug47204($ch, &$headers) { // no redirects, no digest auth -> probably no rewind needed // also apply workaround only for POSTs, othrerwise we get // https://pear.php.net/bugs/bug.php?id=20440 for PUTs if (!$this->request->getConfig('follow_redirects') && (!($auth = $this->request->getAuth()) || HTTP_Request2::AUTH_DIGEST !== $auth['scheme']) || HTTP_Request2::METHOD_POST !== $this->request->getMethod() ) { curl_setopt($ch, CURLOPT_READFUNCTION, [$this, 'callbackReadBody']); } else { // rewind may be needed, read the whole body into memory if ($this->requestBody instanceof HTTP_Request2_MultipartBody) { $this->requestBody = $this->requestBody->__toString(); } elseif (is_resource($this->requestBody)) { $fp = $this->requestBody; $this->requestBody = ''; while (!feof($fp)) { $this->requestBody .= fread($fp, 16384); } } // curl hangs up if content-length is present unset($headers['content-length']); curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody); } } /** * Callback function called by cURL for reading the request body * * @param resource $ch cURL handle * @param resource $fd file descriptor (not used) * @param integer $length maximum length of data to return * * @return string part of the request body, up to $length bytes */ protected function callbackReadBody($ch, $fd, $length) { if (!$this->eventSentHeaders) { $this->request->setLastEvent( 'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT) ); $this->eventSentHeaders = true; } if (in_array($this->request->getMethod(), self::$bodyDisallowed) || 0 == $this->contentLength || $this->position >= $this->contentLength ) { return ''; } if (is_string($this->requestBody)) { $string = substr($this->requestBody, $this->position, $length); } elseif (is_resource($this->requestBody)) { $string = fread($this->requestBody, $length); } else { $string = $this->requestBody->read($length); } $this->request->setLastEvent('sentBodyPart', strlen($string)); $this->position += strlen($string); return $string; } /** * Callback function called by cURL for saving the response headers * * @param resource $ch cURL handle * @param string $string response header (with trailing CRLF) * * @return integer number of bytes saved * @see HTTP_Request2_Response::parseHeaderLine() */ protected function callbackWriteHeader($ch, $string) { if (!$this->eventSentHeaders // we may receive a second set of headers if doing e.g. digest auth // but don't bother with 100-Continue responses (bug #15785) || $this->eventReceivedHeaders && $this->response->getStatus() >= 200 ) { $this->request->setLastEvent( 'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT) ); } if (!$this->eventSentBody) { $upload = curl_getinfo($ch, CURLINFO_SIZE_UPLOAD); // if body wasn't read by the callback, send event with total body size if ($upload > $this->position) { $this->request->setLastEvent( 'sentBodyPart', $upload - $this->position ); } if ($upload > 0) { $this->request->setLastEvent('sentBody', $upload); } } $this->eventSentHeaders = true; $this->eventSentBody = true; if ($this->eventReceivedHeaders || empty($this->response)) { $this->eventReceivedHeaders = false; $this->response = new HTTP_Request2_Response( $string, false, curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) ); } else { $this->response->parseHeaderLine($string); if ('' == trim($string)) { // don't bother with 100-Continue responses (bug #15785) if (200 <= $this->response->getStatus()) { $this->request->setLastEvent('receivedHeaders', $this->response); } if ($this->request->getConfig('follow_redirects') && $this->response->isRedirect()) { $redirectUrl = new Net_URL2($this->response->getHeader('location')); // for versions lower than 5.2.10, check the redirection URL protocol if (!defined('CURLOPT_REDIR_PROTOCOLS') && $redirectUrl->isAbsolute() && !in_array($redirectUrl->getScheme(), ['http', 'https']) ) { return -1; } if ($jar = $this->request->getCookieJar()) { $jar->addCookiesFromResponse($this->response); if (!$redirectUrl->isAbsolute()) { $redirectUrl = $this->request->getUrl()->resolve($redirectUrl); } if ($cookies = $jar->getMatching($redirectUrl, true)) { curl_setopt($ch, CURLOPT_COOKIE, $cookies); } } } $this->eventReceivedHeaders = true; $this->eventSentBody = false; } } return strlen($string); } /** * Callback function called by cURL for saving the response body * * @param resource $ch cURL handle (not used) * @param string $string part of the response body * * @return integer number of bytes saved * @throws HTTP_Request2_MessageException * @see HTTP_Request2_Response::appendBody() */ protected function callbackWriteBody($ch, $string) { // cURL calls WRITEFUNCTION callback without calling HEADERFUNCTION if // response doesn't start with proper HTTP status line (see bug #15716) if (empty($this->response)) { throw new HTTP_Request2_MessageException( "Malformed response: {$string}", HTTP_Request2_Exception::MALFORMED_RESPONSE ); } if ($this->request->getConfig('store_body')) { $this->response->appendBody($string); } $this->request->setLastEvent('receivedBodyPart', $string); return strlen($string); } } ?> PKwL\[N"N"Jupdraftplus/includes/PEAR/HTTP/Request2/Observer/UncompressingDownload.phpnu[ * @author Alexey Borzov * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ require_once 'HTTP/Request2/Response.php'; /** * An observer that saves response body to stream, possibly uncompressing it * * This Observer is written in compliment to pear's HTTP_Request2 in order to * avoid reading the whole response body in memory. Instead it writes the body * to a stream. If the body is transferred with content-encoding set to * "deflate" or "gzip" it is decoded on the fly. * * The constructor accepts an already opened (for write) stream (file_descriptor). * If the response is deflate/gzip encoded a "zlib.inflate" filter is applied * to the stream. When the body has been read from the request and written to * the stream ("receivedBody" event) the filter is removed from the stream. * * The "zlib.inflate" filter works fine with pure "deflate" encoding. It does * not understand the "deflate+zlib" and "gzip" headers though, so they have to * be removed prior to being passed to the stream. This is done in the "update" * method. * * It is also possible to limit the size of written extracted bytes by passing * "max_bytes" to the constructor. This is important because e.g. 1GB of * zeroes take about a MB when compressed. * * Exceptions are being thrown if data could not be written to the stream or * the written bytes have already exceeded the requested maximum. If the "gzip" * header is malformed or could not be parsed an exception will be thrown too. * * Example usage follows: * * * require_once 'HTTP/Request2.php'; * require_once 'HTTP/Request2/Observer/UncompressingDownload.php'; * * #$inPath = 'http://carsten.codimi.de/gzip.yaws/daniels.html'; * #$inPath = 'http://carsten.codimi.de/gzip.yaws/daniels.html?deflate=on'; * $inPath = 'http://carsten.codimi.de/gzip.yaws/daniels.html?deflate=on&zlib=on'; * #$outPath = "/dev/null"; * $outPath = "delme"; * * $stream = fopen($outPath, 'wb'); * if (!$stream) { * throw new Exception('fopen failed'); * } * * $request = new HTTP_Request2( * $inPath, * HTTP_Request2::METHOD_GET, * array( * 'store_body' => false, * 'connect_timeout' => 5, * 'timeout' => 10, * 'ssl_verify_peer' => true, * 'ssl_verify_host' => true, * 'ssl_cafile' => null, * 'ssl_capath' => '/etc/ssl/certs', * 'max_redirects' => 10, * 'follow_redirects' => true, * 'strict_redirects' => false * ) * ); * * $observer = new HTTP_Request2_Observer_UncompressingDownload($stream, 9999999); * $request->attach($observer); * * $response = $request->send(); * * fclose($stream); * echo "OK\n"; * * * @category HTTP * @package HTTP_Request2 * @author Delian Krustev * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_Observer_UncompressingDownload implements SplObserver { /** * The stream to write response body to * * @var resource */ private $_stream; /** * 'zlib.inflate' filter possibly added to stream * * @var resource */ private $_streamFilter; /** * The value of response's Content-Encoding header * * @var string */ private $_encoding; /** * Whether the observer is still waiting for gzip/deflate header * * @var bool */ private $_processingHeader = true; /** * Starting position in the stream observer writes to * * @var int */ private $_startPosition = 0; /** * Maximum bytes to write * * @var int|null */ private $_maxDownloadSize; /** * Whether response being received is a redirect * * @var bool */ private $_redirect = false; /** * Accumulated body chunks that may contain (gzip) header * * @var string */ private $_possibleHeader = ''; /** * Class constructor * * Note that there might be problems with max_bytes and files bigger * than 2 GB on 32bit platforms * * @param resource $stream a stream (or file descriptor) opened for writing. * @param int $maxDownloadSize maximum bytes to write */ public function __construct($stream, $maxDownloadSize = null) { $this->_stream = $stream; if ($maxDownloadSize) { $this->_maxDownloadSize = $maxDownloadSize; $this->_startPosition = ftell($this->_stream); } } #[ReturnTypeWillChange] /** * Called when the request notifies us of an event. * * @param SplSubject $request The HTTP_Request2 instance * * @return void * @throws HTTP_Request2_MessageException */ public function update(SplSubject $request) { /* @var $request HTTP_Request2 */ $event = $request->getLastEvent(); $encoded = false; /* @var $event['data'] HTTP_Request2_Response */ switch ($event['name']) { case 'receivedHeaders': $this->_processingHeader = true; $this->_redirect = $event['data']->isRedirect(); $this->_encoding = strtolower($event['data']->getHeader('content-encoding') ?: ''); $this->_possibleHeader = ''; break; case 'receivedEncodedBodyPart': if (!$this->_streamFilter && ($this->_encoding === 'deflate' || $this->_encoding === 'gzip') ) { $this->_streamFilter = stream_filter_append( $this->_stream, 'zlib.inflate', STREAM_FILTER_WRITE ); } $encoded = true; // fall-through is intentional case 'receivedBodyPart': if ($this->_redirect) { break; } if (!$encoded || !$this->_processingHeader) { $bytes = fwrite($this->_stream, $event['data']); } else { $offset = 0; $this->_possibleHeader .= $event['data']; if ('deflate' === $this->_encoding) { if (2 > strlen($this->_possibleHeader)) { break; } $header = unpack('n', substr($this->_possibleHeader, 0, 2)); if (0 == $header[1] % 31) { $offset = 2; } } elseif ('gzip' === $this->_encoding) { if (10 > strlen($this->_possibleHeader)) { break; } try { $offset = HTTP_Request2_Response::parseGzipHeader($this->_possibleHeader, false); } catch (HTTP_Request2_MessageException $e) { // need more data? if (false !== strpos($e->getMessage(), 'data too short')) { break; } throw $e; } } $this->_processingHeader = false; $bytes = fwrite($this->_stream, substr($this->_possibleHeader, $offset)); } if (false === $bytes) { throw new HTTP_Request2_MessageException('fwrite failed.'); } if ($this->_maxDownloadSize && ftell($this->_stream) - $this->_startPosition > $this->_maxDownloadSize ) { throw new HTTP_Request2_MessageException( sprintf( 'Body length limit (%d bytes) reached', $this->_maxDownloadSize ) ); } break; case 'receivedBody': if ($this->_streamFilter) { stream_filter_remove($this->_streamFilter); $this->_streamFilter = null; } break; } } } PKwL\X?8updraftplus/includes/PEAR/HTTP/Request2/Observer/Log.phpnu[ * @author Alexey Borzov * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception class for HTTP_Request2 package */ require_once 'HTTP/Request2/Exception.php'; /** * A debug observer useful for debugging / testing. * * This observer logs to a log target data corresponding to the various request * and response events, it logs by default to php://output but can be configured * to log to a file or via the PEAR Log package. * * A simple example: * * require_once 'HTTP/Request2.php'; * require_once 'HTTP/Request2/Observer/Log.php'; * * $request = new HTTP_Request2('http://www.example.com'); * $observer = new HTTP_Request2_Observer_Log(); * $request->attach($observer); * $request->send(); * * * A more complex example with PEAR Log: * * require_once 'HTTP/Request2.php'; * require_once 'HTTP/Request2/Observer/Log.php'; * require_once 'Log.php'; * * $request = new HTTP_Request2('http://www.example.com'); * // we want to log with PEAR log * $observer = new HTTP_Request2_Observer_Log(Log::factory('console')); * * // we only want to log received headers * $observer->events = array('receivedHeaders'); * * $request->attach($observer); * $request->send(); * * * @category HTTP * @package HTTP_Request2 * @author David Jean Louis * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_Observer_Log implements SplObserver { // properties {{{ /** * The log target, it can be a a resource or a PEAR Log instance. * * @var resource|Log $target */ protected $target = null; /** * The events to log. * * @var array $events */ public $events = [ 'connect', 'sentHeaders', 'sentBody', 'receivedHeaders', 'receivedBody', 'disconnect', ]; // }}} // __construct() {{{ /** * Constructor. * * @param mixed $target Can be a file path (default: php://output), a resource, * or an instance of the PEAR Log class. * @param array $events Array of events to listen to (default: all events) * * @return void */ public function __construct($target = 'php://output', array $events = []) { if (!empty($events)) { $this->events = $events; } if (is_resource($target) || $target instanceof Log) { $this->target = $target; } elseif (false === ($this->target = @fopen($target, 'ab'))) { throw new HTTP_Request2_Exception("Unable to open '{$target}'"); } } // }}} // update() {{{ #[ReturnTypeWillChange] /** * Called when the request notifies us of an event. * * @param HTTP_Request2 $subject The HTTP_Request2 instance * * @return void */ public function update(SplSubject $subject) { $event = $subject->getLastEvent(); if (!in_array($event['name'], $this->events)) { return; } switch ($event['name']) { case 'connect': $this->log('* Connected to ' . $event['data']); break; case 'sentHeaders': $headers = explode("\r\n", $event['data']); array_pop($headers); foreach ($headers as $header) { $this->log('> ' . $header); } break; case 'sentBody': $this->log('> ' . $event['data'] . ' byte(s) sent'); break; case 'receivedHeaders': $this->log( sprintf( '< HTTP/%s %s %s', $event['data']->getVersion(), $event['data']->getStatus(), $event['data']->getReasonPhrase() ) ); $headers = $event['data']->getHeader(); foreach ($headers as $key => $val) { $this->log('< ' . $key . ': ' . $val); } $this->log('< '); break; case 'receivedBody': $this->log($event['data']->getBody()); break; case 'disconnect': $this->log('* Disconnected'); break; } } // }}} // log() {{{ /** * Logs the given message to the configured target. * * @param string $message Message to display * * @return void */ protected function log($message) { if ($this->target instanceof Log) { $this->target->debug($message); } elseif (is_resource($this->target)) { fwrite($this->target, $message . "\r\n"); } } // }}} } ?>PKwL\ ZZ4updraftplus/includes/PEAR/HTTP/Request2/Response.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception class for HTTP_Request2 package */ require_once 'HTTP/Request2/Exception.php'; /** * Class representing a HTTP response * * The class is designed to be used in "streaming" scenario, building the * response as it is being received: * * $statusLine = read_status_line(); * $response = new HTTP_Request2_Response($statusLine); * do { * $headerLine = read_header_line(); * $response->parseHeaderLine($headerLine); * } while ($headerLine != ''); * * while ($chunk = read_body()) { * $response->appendBody($chunk); * } * * var_dump($response->getHeader(), $response->getCookies(), $response->getBody()); * * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 * @link http://tools.ietf.org/html/rfc2616#section-6 */ class HTTP_Request2_Response { /** * HTTP protocol version (e.g. 1.0, 1.1) * * @var string */ protected $version; /** * Status code * * @var integer * @link http://tools.ietf.org/html/rfc2616#section-6.1.1 */ protected $code; /** * Reason phrase * * @var string * @link http://tools.ietf.org/html/rfc2616#section-6.1.1 */ protected $reasonPhrase; /** * Effective URL (may be different from original request URL in case of redirects) * * @var string */ protected $effectiveUrl; /** * Associative array of response headers * * @var array */ protected $headers = []; /** * Cookies set in the response * * @var array */ protected $cookies = []; /** * Name of last header processed by parseHederLine() * * Used to handle the headers that span multiple lines * * @var string */ protected $lastHeader = null; /** * Response body * * @var string */ protected $body = ''; /** * Whether the body is still encoded by Content-Encoding * * cURL provides the decoded body to the callback; if we are reading from * socket the body is still gzipped / deflated * * @var bool */ protected $bodyEncoded; /** * Associative array of HTTP status code / reason phrase. * * @var array * @link http://tools.ietf.org/html/rfc2616#section-10 */ protected static $phrases = [ // 1xx: Informational - Request received, continuing process 100 => 'Continue', 101 => 'Switching Protocols', // 2xx: Success - The action was successfully received, understood and // accepted 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', // 3xx: Redirection - Further action must be taken in order to complete // the request 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', // 1.1 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', // 4xx: Client Error - The request contains bad syntax or cannot be // fulfilled 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', // 5xx: Server Error - The server failed to fulfill an apparently // valid request 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 509 => 'Bandwidth Limit Exceeded', ]; /** * Returns the default reason phrase for the given code or all reason phrases * * @param int $code Response code * * @return string|array|null Default reason phrase for $code if $code is given * (null if no phrase is available), array of all * reason phrases if $code is null * @link http://pear.php.net/bugs/18716 */ public static function getDefaultReasonPhrase($code = null) { if (null === $code) { return self::$phrases; } else { return isset(self::$phrases[$code]) ? self::$phrases[$code] : null; } } /** * Constructor, parses the response status line * * @param string $statusLine Response status line (e.g. "HTTP/1.1 200 OK") * @param bool $bodyEncoded Whether body is still encoded by Content-Encoding * @param string $effectiveUrl Effective URL of the response * * @throws HTTP_Request2_MessageException if status line is invalid according to spec */ public function __construct($statusLine, $bodyEncoded = true, $effectiveUrl = null) { if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) { throw new HTTP_Request2_MessageException( "Malformed response: {$statusLine}", HTTP_Request2_Exception::MALFORMED_RESPONSE ); } $this->version = $m[1]; $this->code = intval($m[2]); $this->reasonPhrase = !empty($m[3]) ? trim($m[3]) : self::getDefaultReasonPhrase($this->code); $this->bodyEncoded = (bool)$bodyEncoded; $this->effectiveUrl = (string)$effectiveUrl; } /** * Parses the line from HTTP response filling $headers array * * The method should be called after reading the line from socket or receiving * it into cURL callback. Passing an empty string here indicates the end of * response headers and triggers additional processing, so be sure to pass an * empty string in the end. * * @param string $headerLine Line from HTTP response * * @return void */ public function parseHeaderLine($headerLine) { $headerLine = trim($headerLine, "\r\n"); if ('' == $headerLine) { // empty string signals the end of headers, process the received ones if (!empty($this->headers['set-cookie'])) { $cookies = is_array($this->headers['set-cookie'])? $this->headers['set-cookie']: [$this->headers['set-cookie']]; foreach ($cookies as $cookieString) { $this->parseCookie($cookieString); } unset($this->headers['set-cookie']); } foreach (array_keys($this->headers) as $k) { if (is_array($this->headers[$k])) { $this->headers[$k] = implode(', ', $this->headers[$k]); } } } elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) { // string of the form header-name: header value $name = strtolower($m[1]); $value = trim($m[2]); if (empty($this->headers[$name])) { $this->headers[$name] = $value; } else { if (!is_array($this->headers[$name])) { $this->headers[$name] = [$this->headers[$name]]; } $this->headers[$name][] = $value; } $this->lastHeader = $name; } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) { // continuation of a previous header if (!is_array($this->headers[$this->lastHeader])) { $this->headers[$this->lastHeader] .= ' ' . trim($m[1]); } else { $key = count($this->headers[$this->lastHeader]) - 1; $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]); } } } /** * Parses a Set-Cookie header to fill $cookies array * * @param string $cookieString value of Set-Cookie header * * @return void * * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html */ protected function parseCookie($cookieString) { $cookie = [ 'expires' => null, 'domain' => null, 'path' => null, 'secure' => false ]; if (!strpos($cookieString, ';')) { // Only a name=value pair $pos = strpos($cookieString, '='); $cookie['name'] = trim(substr($cookieString, 0, $pos)); $cookie['value'] = trim(substr($cookieString, $pos + 1)); } else { // Some optional parameters are supplied $elements = explode(';', $cookieString); $pos = strpos($elements[0], '='); $cookie['name'] = trim(substr($elements[0], 0, $pos)); $cookie['value'] = trim(substr($elements[0], $pos + 1)); for ($i = 1; $i < count($elements); $i++) { if (false === strpos($elements[$i], '=')) { $elName = trim($elements[$i]); $elValue = null; } else { list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); } $elName = strtolower($elName); if ('secure' == $elName) { $cookie['secure'] = true; } elseif ('expires' == $elName) { $cookie['expires'] = str_replace('"', '', $elValue); } elseif ('path' == $elName || 'domain' == $elName) { $cookie[$elName] = urldecode($elValue); } else { $cookie[$elName] = $elValue; } } } $this->cookies[] = $cookie; } /** * Appends a string to the response body * * @param string $bodyChunk part of response body * * @return void */ public function appendBody($bodyChunk) { $this->body .= $bodyChunk; } /** * Returns the effective URL of the response * * This may be different from the request URL if redirects were followed. * * @return string * @link http://pear.php.net/bugs/bug.php?id=18412 */ public function getEffectiveUrl() { return $this->effectiveUrl; } /** * Returns the status code * * @return integer */ public function getStatus() { return $this->code; } /** * Returns the reason phrase * * @return string */ public function getReasonPhrase() { return $this->reasonPhrase; } /** * Whether response is a redirect that can be automatically handled by HTTP_Request2 * * @return bool */ public function isRedirect() { return in_array($this->code, [300, 301, 302, 303, 307]) && isset($this->headers['location']); } /** * Returns either the named header or all response headers * * @param string $headerName Name of header to return * * @return string|array Value of $headerName header (null if header is * not present), array of all response headers if * $headerName is null */ public function getHeader($headerName = null) { if (null === $headerName) { return $this->headers; } else { $headerName = strtolower($headerName); return isset($this->headers[$headerName])? $this->headers[$headerName]: null; } } /** * Returns cookies set in response * * @return array */ public function getCookies() { return $this->cookies; } /** * Returns the body of the response * * @return string * @throws HTTP_Request2_Exception if body cannot be decoded */ public function getBody() { if (0 == strlen($this->body) || !$this->bodyEncoded || !in_array(strtolower($this->getHeader('content-encoding') ?: ''), ['gzip', 'deflate']) ) { return $this->body; } else { if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { $oldEncoding = mb_internal_encoding(); mb_internal_encoding('8bit'); } try { switch (strtolower($this->getHeader('content-encoding'))) { case 'gzip': return self::decodeGzip($this->body); break; case 'deflate': return self::decodeDeflate($this->body); } } finally { // phpcs:ignore PHPCompatibility.Keywords.NewKeywords.t_finallyFound if (!empty($oldEncoding)) { mb_internal_encoding($oldEncoding); } } } } /** * Get the HTTP version of the response * * @return string */ public function getVersion() { return $this->version; } /** * Checks whether data starts with GZIP format identification bytes from RFC 1952 * * @param string $data gzip-encoded (presumably) data * * @return bool */ public static function hasGzipIdentification($data) { return 0 === strcmp(substr($data, 0, 2), "\x1f\x8b"); } /** * Tries to parse GZIP format header in the given string * * If the header conforms to RFC 1952, its length is returned. If any * sanity check fails, HTTP_Request2_MessageException is thrown. * * Note: This function might be usable outside of HTTP_Request2 so it might * be good idea to be moved to some common package. (Delian Krustev) * * @param string $data Either the complete response body or * the leading part of it * @param boolean $dataComplete Whether $data contains complete response body * * @return int gzip header length in bytes * @throws HTTP_Request2_MessageException * @link http://tools.ietf.org/html/rfc1952 */ public static function parseGzipHeader($data, $dataComplete = false) { // if data is complete, trailing 8 bytes should be present for size and crc32 $length = strlen($data) - ($dataComplete ? 8 : 0); if ($length < 10 || !self::hasGzipIdentification($data)) { throw new HTTP_Request2_MessageException( 'The data does not seem to contain a valid gzip header', HTTP_Request2_Exception::DECODE_ERROR ); } $method = ord(substr($data, 2, 1)); if (8 != $method) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: unknown compression method', HTTP_Request2_Exception::DECODE_ERROR ); } $flags = ord(substr($data, 3, 1)); if ($flags & 224) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: reserved bits are set', HTTP_Request2_Exception::DECODE_ERROR ); } // header is 10 bytes minimum. may be longer, though. $headerLength = 10; // extra fields, need to skip 'em if ($flags & 4) { if ($length - $headerLength - 2 < 0) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: data too short', HTTP_Request2_Exception::DECODE_ERROR ); } $extraLength = unpack('v', substr($data, 10, 2)); if ($length - $headerLength - 2 - $extraLength[1] < 0) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: data too short', HTTP_Request2_Exception::DECODE_ERROR ); } $headerLength += $extraLength[1] + 2; } // file name, need to skip that if ($flags & 8) { if ($length - $headerLength - 1 < 0) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: data too short', HTTP_Request2_Exception::DECODE_ERROR ); } $filenameLength = strpos(substr($data, $headerLength), chr(0)); if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 0 ) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: data too short', HTTP_Request2_Exception::DECODE_ERROR ); } $headerLength += $filenameLength + 1; } // comment, need to skip that also if ($flags & 16) { if ($length - $headerLength - 1 < 0) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: data too short', HTTP_Request2_Exception::DECODE_ERROR ); } $commentLength = strpos(substr($data, $headerLength), chr(0)); if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 0 ) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: data too short', HTTP_Request2_Exception::DECODE_ERROR ); } $headerLength += $commentLength + 1; } // have a CRC for header. let's check if ($flags & 2) { if ($length - $headerLength - 2 < 0) { throw new HTTP_Request2_MessageException( 'Error parsing gzip header: data too short', HTTP_Request2_Exception::DECODE_ERROR ); } $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); $crcStored = unpack('v', substr($data, $headerLength, 2)); if ($crcReal != $crcStored[1]) { throw new HTTP_Request2_MessageException( 'Header CRC check failed', HTTP_Request2_Exception::DECODE_ERROR ); } $headerLength += 2; } return $headerLength; } /** * Decodes the message-body encoded by gzip * * The real decoding work is done by gzinflate() built-in function, this * method only parses the header and checks data for compliance with * RFC 1952 * * @param string $data gzip-encoded data * * @return string decoded data * @throws HTTP_Request2_LogicException * @throws HTTP_Request2_MessageException * @link http://tools.ietf.org/html/rfc1952 */ public static function decodeGzip($data) { // If it doesn't look like gzip-encoded data, don't bother if (!self::hasGzipIdentification($data)) { return $data; } if (!function_exists('gzinflate')) { throw new HTTP_Request2_LogicException( 'Unable to decode body: gzip extension not available', HTTP_Request2_Exception::MISCONFIGURATION ); } // unpacked data CRC and size at the end of encoded data $tmp = unpack('V2', substr($data, -8)); $dataCrc = $tmp[1]; $dataSize = $tmp[2]; $headerLength = self::parseGzipHeader($data, true); // don't pass $dataSize to gzinflate, see bugs #13135, #14370 $unpacked = gzinflate(substr($data, $headerLength, -8)); if (false === $unpacked) { throw new HTTP_Request2_MessageException( 'gzinflate() call failed', HTTP_Request2_Exception::DECODE_ERROR ); // GZIP stores the size of the compressed data in bytes modulo // 2^32. To accommodate large file transfers, apply this to the // observed data size. This allows file downloads above 4 GiB. } elseif ((0xffffffff & $dataSize) !== (0xffffffff & strlen($unpacked))) { throw new HTTP_Request2_MessageException( 'Data size check failed', HTTP_Request2_Exception::DECODE_ERROR ); } elseif ((0xffffffff & $dataCrc) !== (0xffffffff & crc32($unpacked))) { throw new HTTP_Request2_MessageException( 'Data CRC check failed', HTTP_Request2_Exception::DECODE_ERROR ); } return $unpacked; } /** * Decodes the message-body encoded by deflate * * @param string $data deflate-encoded data * * @return string decoded data * @throws HTTP_Request2_LogicException */ public static function decodeDeflate($data) { if (!function_exists('gzuncompress')) { throw new HTTP_Request2_LogicException( 'Unable to decode body: gzip extension not available', HTTP_Request2_Exception::MISCONFIGURATION ); } // RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950, // while many applications send raw deflate stream from RFC 1951. // We should check for presence of zlib header and use gzuncompress() or // gzinflate() as needed. See bug #15305 $header = unpack('n', substr($data, 0, 2)); return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data); } } ?>PKwL\F[669updraftplus/includes/PEAR/HTTP/Request2/SocketWrapper.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** Exception classes for HTTP_Request2 package */ require_once 'HTTP/Request2/Exception.php'; /** * Socket wrapper class used by Socket Adapter * * Needed to properly handle connection errors, global timeout support and * similar things. Loosely based on Net_Socket used by older HTTP_Request. * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 * @link http://pear.php.net/bugs/bug.php?id=19332 * @link http://tools.ietf.org/html/rfc1928 */ class HTTP_Request2_SocketWrapper { /** * PHP warning messages raised during stream_socket_client() call * * @var array */ protected $connectionWarnings = []; /** * Connected socket * * @var resource */ protected $socket; /** * Sum of start time and global timeout, exception will be thrown if request continues past this time * * @var float */ protected $deadline; /** * Global timeout value, mostly for exception messages * * @var integer */ protected $timeout; /** * Class constructor, tries to establish connection * * @param string $address Address for stream_socket_client() call, * e.g. 'tcp://localhost:80' * @param int $timeout Connection timeout (seconds) * @param array $contextOptions Context options * * @throws HTTP_Request2_LogicException * @throws HTTP_Request2_ConnectionException */ public function __construct($address, $timeout, array $contextOptions = []) { if (!empty($contextOptions) && !isset($contextOptions['socket']) && !isset($contextOptions['ssl']) ) { // Backwards compatibility with 2.1.0 and 2.1.1 releases $contextOptions = ['ssl' => $contextOptions]; } if (isset($contextOptions['ssl'])) { $cryptoMethod = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; // phpcs:ignore PHPCompatibility.Constants.NewConstants.stream_crypto_method_tlsv1_2_clientFound if (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT')) { $cryptoMethod |= STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT; } $contextOptions['ssl'] += [ // Using "Intermediate compatibility" cipher bundle from // https://wiki.mozilla.org/Security/Server_Side_TLS 'ciphers' => 'TLS_AES_128_GCM_SHA256:' . 'TLS_AES_256_GCM_SHA384:' . 'TLS_CHACHA20_POLY1305_SHA256:' . 'ECDHE-ECDSA-AES128-GCM-SHA256:' . 'ECDHE-RSA-AES128-GCM-SHA256:' . 'ECDHE-ECDSA-AES256-GCM-SHA384:' . 'ECDHE-RSA-AES256-GCM-SHA384:' . 'ECDHE-ECDSA-CHACHA20-POLY1305:' . 'ECDHE-RSA-CHACHA20-POLY1305:' . 'DHE-RSA-AES128-GCM-SHA256:' . 'DHE-RSA-AES256-GCM-SHA384', 'disable_compression' => true, 'crypto_method' => $cryptoMethod ]; } $context = stream_context_create(); foreach ($contextOptions as $wrapper => $options) { foreach ($options as $name => $value) { if (!stream_context_set_option($context, $wrapper, $name, $value)) { throw new HTTP_Request2_LogicException( "Error setting '{$wrapper}' wrapper context option '{$name}'" ); } } } set_error_handler([$this, 'connectionWarningsHandler']); $this->socket = stream_socket_client( $address, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context ); restore_error_handler(); // if we fail to bind to a specified local address (see request #19515), // connection still succeeds, albeit with a warning. Throw an Exception // with the warning text in this case as that connection is unlikely // to be what user wants and as Curl throws an error in similar case. if ($this->connectionWarnings) { if ($this->socket) { fclose($this->socket); } $error = $errstr ? $errstr : implode("\n", $this->connectionWarnings); throw new HTTP_Request2_ConnectionException( "Unable to connect to {$address}. Error: {$error}", 0, $errno ); } // Run socket in non-blocking mode, to prevent possible problems with // HTTPS requests not timing out properly (see bug #21229) stream_set_blocking($this->socket, false); } /** * Destructor, disconnects socket */ public function __destruct() { fclose($this->socket); } /** * Wrapper around fread(), handles global request timeout * * @param int $length Reads up to this number of bytes * * @return string|false Data read from socket by fread() * @throws HTTP_Request2_MessageException In case of timeout */ public function read($length) { // Looks like stream_select() may return true, but then fread() will return an empty string... // For some reason or other happens mostly with servers behind Cloudflare. // Let's do the fread() call in a loop until either an error/eof or non-empty string: do { $data = false; $timeouts = $this->_getTimeoutsForStreamSelect(); $r = [$this->socket]; $w = []; $e = []; if (stream_select($r, $w, $e, $timeouts[0], $timeouts[1])) { $data = fread($this->socket, $length); } $this->checkTimeout(); } while ('' === $data && !$this->eof()); return $data; } /** * Reads until either the end of the socket or a newline, whichever comes first * * Strips the trailing newline from the returned data, handles global * request timeout. Method idea borrowed from Net_Socket PEAR package. * * @param int $bufferSize buffer size to use for reading * @param int $localTimeout timeout value to use just for this call * (used when waiting for "100 Continue" response) * * @return string Available data up to the newline (not including newline) * @throws HTTP_Request2_MessageException In case of timeout */ public function readLine($bufferSize, $localTimeout = null) { $line = ''; while (!feof($this->socket)) { if (null !== $localTimeout) { $timeouts = [$localTimeout, 0]; $started = microtime(true); } else { $timeouts = $this->_getTimeoutsForStreamSelect(); } $r = [$this->socket]; $w = []; $e = []; if (stream_select($r, $w, $e, $timeouts[0], $timeouts[1])) { $line .= @fgets($this->socket, $bufferSize); } if (null === $localTimeout) { $this->checkTimeout(); } elseif (microtime(true) - $started > $localTimeout) { throw new HTTP_Request2_MessageException( "readLine() call timed out", HTTP_Request2_Exception::TIMEOUT ); } if (substr($line, -1) == "\n") { return rtrim($line, "\r\n"); } } return $line; } /** * Wrapper around fwrite(), handles global request timeout * * @param string $data String to be written * * @return int * @throws HTTP_Request2_MessageException */ public function write($data) { $totalWritten = 0; while (strlen($data) && !$this->eof()) { $written = 0; $error = null; $timeouts = $this->_getTimeoutsForStreamSelect(); $r = null; $w = [$this->socket]; $e = null; if (stream_select($r, $w, $e, $timeouts[0], $timeouts[1])) { set_error_handler( static function ($errNo, $errStr) use (&$error) { if (0 !== (E_NOTICE | E_WARNING) & $errNo) { $error = $errStr; } } ); $written = fwrite($this->socket, $data); restore_error_handler(); } $this->checkTimeout(); // php_sockop_write() defined in /main/streams/xp_socket.c may return zero written bytes for non-blocking // sockets in case of transient errors. These writes will not have notices raised and should be retried if (false === $written || 0 === $written && null !== $error) { throw new HTTP_Request2_MessageException( 'Error writing request' . (null === $error ? '' : ': ' . $error) ); } $data = substr($data, $written); $totalWritten += $written; } return $totalWritten; } /** * Tests for end-of-file on a socket * * @return bool */ public function eof() { return feof($this->socket); } /** * Sets request deadline * * If null is passed for $deadline then deadline will be calculated based * on default_socket_timeout PHP setting. This is done to keep BC with previous * versions that used blocking sockets. * * @param float|null $deadline Exception will be thrown if request continues * past this time * @param int $timeout Original request timeout value, to use in * Exception message * * @return void */ public function setDeadline($deadline, $timeout) { if (null === $deadline && 0 < ($defaultTimeout = (int)ini_get('default_socket_timeout'))) { $deadline = microtime(true) + $defaultTimeout; } $this->deadline = $deadline; $this->timeout = $timeout; } /** * Turns on encryption on a socket * * @return void * @throws HTTP_Request2_ConnectionException */ public function enableCrypto() { $cryptoMethod = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; // phpcs:ignore PHPCompatibility.Constants.NewConstants.stream_crypto_method_tlsv1_2_clientFound if (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT')) { $cryptoMethod |= STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT; } try { stream_set_blocking($this->socket, true); if (!stream_socket_enable_crypto($this->socket, true, $cryptoMethod)) { throw new HTTP_Request2_ConnectionException( 'Failed to enable secure connection when connecting through proxy' ); } } finally { // phpcs:ignore PHPCompatibility.Keywords.NewKeywords.t_finallyFound stream_set_blocking($this->socket, false); } } /** * Throws an Exception if stream timed out * * @return void * @throws HTTP_Request2_MessageException */ protected function checkTimeout() { $info = stream_get_meta_data($this->socket); if ($info['timed_out'] || $this->deadline && microtime(true) > $this->deadline) { $reason = $this->timeout ? "after {$this->timeout} second(s)" : 'due to default_socket_timeout php.ini setting'; throw new HTTP_Request2_MessageException( "Request timed out {$reason}", HTTP_Request2_Exception::TIMEOUT ); } } /** * Returns timeouts based on deadline for use with stream_select() * * @return array First element is $tv_sec parameter for stream_select(), * second element is $tv_usec */ private function _getTimeoutsForStreamSelect() { if (!$this->deadline) { return [null, null]; } $parts = array_map( 'intval', explode('.', sprintf('%.6F', $this->deadline - microtime(true))) ); if (0 > $parts[0] || 0 === $parts[0] && $parts[1] < 50000) { return [0, 50000]; } return $parts; } /** * Error handler to use during stream_socket_client() call * * One stream_socket_client() call may produce *multiple* PHP warnings * (especially OpenSSL-related), we keep them in an array to later use for * the message of HTTP_Request2_ConnectionException * * @param int $errno error level * @param string $errstr error message * * @return bool */ protected function connectionWarningsHandler($errno, $errstr) { if ($errno & E_WARNING) { array_unshift($this->connectionWarnings, $errstr); } return true; } } ?> PKwL\!!<updraftplus/includes/PEAR/HTTP/Request2/MessageException.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception thrown when sending or receiving HTTP message fails * * The exception may contain both package error code and native error code. * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_MessageException extends HTTP_Request2_Exception { } ?>PKwL\Vpp?updraftplus/includes/PEAR/HTTP/Request2/ConnectionException.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception thrown when connection to a web or proxy server fails * * The exception will not contain a package error code, but will contain * native error code, as returned by stream_socket_client() or curl_errno(). * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_ConnectionException extends HTTP_Request2_Exception { } ?>PKwL\ҥ" $ $9updraftplus/includes/PEAR/HTTP/Request2/MultipartBody.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** Exception class for HTTP_Request2 package */ require_once 'HTTP/Request2/Exception.php'; /** * Class for building multipart/form-data request body * * The class helps to reduce memory consumption by streaming large file uploads * from disk, it also allows monitoring of upload progress (see request #7630) * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 * @link http://tools.ietf.org/html/rfc1867 */ class HTTP_Request2_MultipartBody { /** * MIME boundary * * @var string */ private $_boundary; /** * Form parameters added via {@link HTTP_Request2::addPostParameter()} * * @var array */ private $_params = []; /** * File uploads added via {@link HTTP_Request2::addUpload()} * * @var array */ private $_uploads = []; /** * Header for parts with parameters * * @var string */ private $_headerParam = "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n"; /** * Header for parts with uploads * * @var string */ private $_headerUpload = "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n"; /** * Current position in parameter and upload arrays * * First number is index of "current" part, second number is position within * "current" part * * @var array */ private $_pos = [0, 0]; /** * Constructor. Sets the arrays with POST data. * * @param array $params values of form fields set via * {@link HTTP_Request2::addPostParameter()} * @param array $uploads file uploads set via * {@link HTTP_Request2::addUpload()} * @param bool $useBrackets whether to append brackets to array variable names */ public function __construct(array $params, array $uploads, $useBrackets = true) { $this->_params = self::_flattenArray('', $params, $useBrackets); foreach ($uploads as $fieldName => $f) { if (!is_array($f['fp'])) { $this->_uploads[] = $f + ['name' => $fieldName]; } else { for ($i = 0; $i < count($f['fp']); $i++) { $upload = [ 'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName) ]; foreach (['fp', 'filename', 'size', 'type'] as $key) { $upload[$key] = $f[$key][$i]; } $this->_uploads[] = $upload; } } } } /** * Returns the length of the body to use in Content-Length header * * @return integer */ public function getLength() { $boundaryLength = strlen($this->getBoundary()); $headerParamLength = strlen($this->_headerParam) - 4 + $boundaryLength; $headerUploadLength = strlen($this->_headerUpload) - 8 + $boundaryLength; $length = $boundaryLength + 6; foreach ($this->_params as $p) { $length += $headerParamLength + strlen($p[0]) + strlen($p[1]) + 2; } foreach ($this->_uploads as $u) { $length += $headerUploadLength + strlen($u['name']) + strlen($u['type']) + strlen($u['filename']) + $u['size'] + 2; } return $length; } /** * Returns the boundary to use in Content-Type header * * @return string */ public function getBoundary() { if (empty($this->_boundary)) { $this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime()); } return $this->_boundary; } /** * Returns next chunk of request body * * @param integer $length Number of bytes to read * * @return string Up to $length bytes of data, empty string if at end * @throws HTTP_Request2_LogicException */ public function read($length) { $ret = ''; $boundary = $this->getBoundary(); $paramCount = count($this->_params); $uploadCount = count($this->_uploads); while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) { $oldLength = $length; if ($this->_pos[0] < $paramCount) { $param = sprintf( $this->_headerParam, $boundary, $this->_params[$this->_pos[0]][0] ) . $this->_params[$this->_pos[0]][1] . "\r\n"; $ret .= substr($param, $this->_pos[1], $length); $length -= min(strlen($param) - $this->_pos[1], $length); } elseif ($this->_pos[0] < $paramCount + $uploadCount) { $pos = $this->_pos[0] - $paramCount; $header = sprintf( $this->_headerUpload, $boundary, $this->_uploads[$pos]['name'], $this->_uploads[$pos]['filename'], $this->_uploads[$pos]['type'] ); if ($this->_pos[1] < strlen($header)) { $ret .= substr($header, $this->_pos[1], $length); $length -= min(strlen($header) - $this->_pos[1], $length); } $filePos = max(0, $this->_pos[1] - strlen($header)); if ($filePos < $this->_uploads[$pos]['size']) { while ($length > 0 && !feof($this->_uploads[$pos]['fp'])) { if (false === ($chunk = fread($this->_uploads[$pos]['fp'], $length))) { throw new HTTP_Request2_LogicException( 'Failed reading file upload', HTTP_Request2_Exception::READ_ERROR ); } $ret .= $chunk; $length -= strlen($chunk); } } if ($length > 0) { $start = $this->_pos[1] + ($oldLength - $length) - strlen($header) - $this->_uploads[$pos]['size']; $ret .= substr("\r\n", $start, $length); $length -= min(2 - $start, $length); } } else { $closing = '--' . $boundary . "--\r\n"; $ret .= substr($closing, $this->_pos[1], $length); $length -= min(strlen($closing) - $this->_pos[1], $length); } if ($length > 0) { $this->_pos = [$this->_pos[0] + 1, 0]; } else { $this->_pos[1] += $oldLength; } } return $ret; } /** * Sets the current position to the start of the body * * This allows reusing the same body in another request * * @return void */ public function rewind() { $this->_pos = [0, 0]; foreach ($this->_uploads as $u) { rewind($u['fp']); } } /** * Returns the body as string * * Note that it reads all file uploads into memory so it is a good idea not * to use this method with large file uploads and rely on read() instead. * * @return string */ public function __toString() { $this->rewind(); return $this->read($this->getLength()); } /** * Helper function to change the (probably multidimensional) associative array * into the simple one. * * @param string $name name for item * @param mixed $values item's values * @param bool $useBrackets whether to append [] to array variables' names * * @return array array with the following items: array('item name', 'item value'); */ private static function _flattenArray($name, $values, $useBrackets) { if (!is_array($values)) { return [[$name, $values]]; } else { $ret = []; foreach ($values as $k => $v) { if (empty($name)) { $newName = $k; } elseif ($useBrackets) { $newName = $name . '[' . $k . ']'; } else { $newName = $name; } $ret = array_merge($ret, self::_flattenArray($newName, $v, $useBrackets)); } return $ret; } } } ?> PKwL\@ōQNN5updraftplus/includes/PEAR/HTTP/Request2/CookieJar.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** Class representing a HTTP request message */ require_once 'HTTP/Request2.php'; /** * Stores cookies and passes them between HTTP requests * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: @package_version@ * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_CookieJar implements Serializable { /** * Array of stored cookies * * The array is indexed by domain, path and cookie name * .example.com * / * some_cookie => cookie data * /subdir * other_cookie => cookie data * .example.org * ... * * @var array */ protected $cookies = []; /** * Whether session cookies should be serialized when serializing the jar * * @var bool */ protected $serializeSession = false; /** * Whether Public Suffix List should be used for domain matching * * @var bool */ protected $useList = true; /** * Whether an attempt to store an invalid cookie should be ignored, rather than cause an Exception * * @var bool */ protected $ignoreInvalid = false; /** * Array with Public Suffix List data * * @var array * @link http://publicsuffix.org/ */ protected static $psl = []; /** * Class constructor, sets various options * * @param bool $serializeSessionCookies Controls serializing session cookies, * see {@link serializeSessionCookies()} * @param bool $usePublicSuffixList Controls using Public Suffix List, * see {@link usePublicSuffixList()} * @param bool $ignoreInvalidCookies Whether invalid cookies should be ignored, * see {@link ignoreInvalidCookies()} */ public function __construct( $serializeSessionCookies = false, $usePublicSuffixList = true, $ignoreInvalidCookies = false ) { $this->serializeSessionCookies($serializeSessionCookies); $this->usePublicSuffixList($usePublicSuffixList); $this->ignoreInvalidCookies($ignoreInvalidCookies); } /** * Returns current time formatted in ISO-8601 at UTC timezone * * @return string */ protected function now() { $dt = new DateTime(); $dt->setTimezone(new DateTimeZone('UTC')); return $dt->format(DateTime::ISO8601); } /** * Checks cookie array for correctness, possibly updating its 'domain', 'path' and 'expires' fields * * The checks are as follows: * - cookie array should contain 'name' and 'value' fields; * - name and value should not contain disallowed symbols; * - 'expires' should be either empty parseable by DateTime; * - 'domain' and 'path' should be either not empty or an URL where * cookie was set should be provided. * - if $setter is provided, then document at that URL should be allowed * to set a cookie for that 'domain'. If $setter is not provided, * then no domain checks will be made. * * 'expires' field will be converted to ISO8601 format from COOKIE format, * 'domain' and 'path' will be set from setter URL if empty. * * @param array $cookie cookie data, as returned by * {@link HTTP_Request2_Response::getCookies()} * @param Net_URL2 $setter URL of the document that sent Set-Cookie header * * @return array Updated cookie array * @throws HTTP_Request2_LogicException * @throws HTTP_Request2_MessageException */ protected function checkAndUpdateFields(array $cookie, Net_URL2 $setter = null) { if ($missing = array_diff(['name', 'value'], array_keys($cookie))) { throw new HTTP_Request2_LogicException( "Cookie array should contain 'name' and 'value' fields", HTTP_Request2_Exception::MISSING_VALUE ); } if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['name'])) { throw new HTTP_Request2_LogicException( "Invalid cookie name: '{$cookie['name']}'", HTTP_Request2_Exception::INVALID_ARGUMENT ); } if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['value'])) { throw new HTTP_Request2_LogicException( "Invalid cookie value: '{$cookie['value']}'", HTTP_Request2_Exception::INVALID_ARGUMENT ); } $cookie += ['domain' => '', 'path' => '', 'expires' => null, 'secure' => false]; // Need ISO-8601 date @ UTC timezone if (!empty($cookie['expires']) && !preg_match('/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+0000$/', $cookie['expires']) ) { try { $dt = new DateTime($cookie['expires']); $dt->setTimezone(new DateTimeZone('UTC')); $cookie['expires'] = $dt->format(DateTime::ISO8601); } catch (Exception $e) { throw new HTTP_Request2_LogicException($e->getMessage()); } } if (empty($cookie['domain']) || empty($cookie['path'])) { if (!$setter) { throw new HTTP_Request2_LogicException( 'Cookie misses domain and/or path component, cookie setter URL needed', HTTP_Request2_Exception::MISSING_VALUE ); } if (empty($cookie['domain'])) { if ($host = $setter->getHost()) { $cookie['domain'] = $host; } else { throw new HTTP_Request2_LogicException( 'Setter URL does not contain host part, can\'t set cookie domain', HTTP_Request2_Exception::MISSING_VALUE ); } } if (empty($cookie['path'])) { $path = $setter->getPath(); $cookie['path'] = empty($path)? '/': substr($path, 0, strrpos($path, '/') + 1); } } if ($setter && !$this->domainMatch($setter->getHost(), $cookie['domain'])) { throw new HTTP_Request2_MessageException( "Domain " . $setter->getHost() . " cannot set cookies for " . $cookie['domain'] ); } return $cookie; } /** * Stores a cookie in the jar * * @param array $cookie cookie data, as returned by * {@link HTTP_Request2_Response::getCookies()} * @param Net_URL2 $setter URL of the document that sent Set-Cookie header * * @return bool whether the cookie was successfully stored * @throws HTTP_Request2_Exception */ public function store(array $cookie, Net_URL2 $setter = null) { try { $cookie = $this->checkAndUpdateFields($cookie, $setter); } catch (HTTP_Request2_Exception $e) { if ($this->ignoreInvalid) { return false; } else { throw $e; } } if (strlen($cookie['value']) && (is_null($cookie['expires']) || $cookie['expires'] > $this->now()) ) { if (!isset($this->cookies[$cookie['domain']])) { $this->cookies[$cookie['domain']] = []; } if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) { $this->cookies[$cookie['domain']][$cookie['path']] = []; } $this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie; } elseif (isset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']])) { unset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']]); } return true; } /** * Adds cookies set in HTTP response to the jar * * @param HTTP_Request2_Response $response HTTP response message * @param Net_URL2 $setter original request URL, needed for * setting default domain/path. If not given, * effective URL from response will be used. * * @return bool whether all cookies were successfully stored * @throws HTTP_Request2_LogicException */ public function addCookiesFromResponse(HTTP_Request2_Response $response, Net_URL2 $setter = null) { if (null === $setter) { if (!($effectiveUrl = $response->getEffectiveUrl())) { throw new HTTP_Request2_LogicException( 'Response URL required for adding cookies from response', HTTP_Request2_Exception::MISSING_VALUE ); } $setter = new Net_URL2($effectiveUrl); } $success = true; foreach ($response->getCookies() as $cookie) { $success = $this->store($cookie, $setter) && $success; } return $success; } /** * Returns all cookies matching a given request URL * * The following checks are made: * - cookie domain should match request host * - cookie path should be a prefix for request path * - 'secure' cookies will only be sent for HTTPS requests * * @param Net_URL2 $url Request url * @param bool $asString Whether to return cookies as string for "Cookie: " header * * @return array|string Matching cookies */ public function getMatching(Net_URL2 $url, $asString = false) { $host = $url->getHost(); $path = $url->getPath(); $secure = 0 == strcasecmp($url->getScheme(), 'https'); $matched = $ret = []; foreach (array_keys($this->cookies) as $domain) { if ($this->domainMatch($host, $domain)) { foreach (array_keys($this->cookies[$domain]) as $cPath) { if (0 === strpos($path, $cPath)) { foreach ($this->cookies[$domain][$cPath] as $name => $cookie) { if (!$cookie['secure'] || $secure) { $matched[$name][strlen($cookie['path'])] = $cookie; } } } } } } foreach ($matched as $cookies) { krsort($cookies); $ret = array_merge($ret, $cookies); } if (!$asString) { return $ret; } else { $str = ''; foreach ($ret as $c) { $str .= (empty($str)? '': '; ') . $c['name'] . '=' . $c['value']; } return $str; } } /** * Returns all cookies stored in a jar * * @return array */ public function getAll() { $cookies = []; foreach (array_keys($this->cookies) as $domain) { foreach (array_keys($this->cookies[$domain]) as $path) { foreach ($this->cookies[$domain][$path] as $name => $cookie) { $cookies[] = $cookie; } } } return $cookies; } /** * Sets whether session cookies should be serialized when serializing the jar * * @param boolean $serialize serialize? * * @return void */ public function serializeSessionCookies($serialize) { $this->serializeSession = (bool)$serialize; } /** * Sets whether invalid cookies should be silently ignored or cause an Exception * * @param boolean $ignore ignore? * * @return void * * @link http://pear.php.net/bugs/bug.php?id=19937 * @link http://pear.php.net/bugs/bug.php?id=20401 */ public function ignoreInvalidCookies($ignore) { $this->ignoreInvalid = (bool)$ignore; } /** * Sets whether Public Suffix List should be used for restricting cookie-setting * * Without PSL {@link domainMatch()} will only prevent setting cookies for * top-level domains like '.com' or '.org'. However, it will not prevent * setting a cookie for '.co.uk' even though only third-level registrations * are possible in .uk domain. * * With the List it is possible to find the highest level at which a domain * may be registered for a particular top-level domain and consequently * prevent cookies set for '.co.uk' or '.msk.ru'. The same list is used by * Firefox, Chrome and Opera browsers to restrict cookie setting. * * Note that PSL is licensed differently to HTTP_Request2 package (refer to * the license information in public-suffix-list.php), so you can disable * its use if this is an issue for you. * * @param boolean $useList use the list? * * @return void * * @link http://publicsuffix.org/learn/ */ public function usePublicSuffixList($useList) { $this->useList = (bool)$useList; } /** * Returns string representation of object * * @return string * * @see Serializable::serialize() */ public function serialize() { return serialize($this->__serialize()); } /** * Returns an associative array of key/value pairs that represent the serialized form of the object * * @return array */ public function __serialize() // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound { $cookies = $this->getAll(); if (!$this->serializeSession) { for ($i = count($cookies) - 1; $i >= 0; $i--) { if (empty($cookies[$i]['expires'])) { unset($cookies[$i]); } } } return [ 'cookies' => $cookies, 'serializeSession' => $this->serializeSession, 'useList' => $this->useList, 'ignoreInvalid' => $this->ignoreInvalid ]; } /** * Constructs the object from serialized string * * @param string $serialized string representation * * @return void */ public function unserialize($serialized) { $this->__unserialize(unserialize($serialized)); } /** * Constructs the object from array serialized form * * @param array $data serialized form (as generated by {@see __serialize()} * * @return void */ public function __unserialize(array $data) // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound { $now = $this->now(); $this->serializeSessionCookies($data['serializeSession']); $this->usePublicSuffixList($data['useList']); if (array_key_exists('ignoreInvalid', $data)) { $this->ignoreInvalidCookies($data['ignoreInvalid']); } foreach ($data['cookies'] as $cookie) { if (!empty($cookie['expires']) && $cookie['expires'] <= $now) { continue; } if (!isset($this->cookies[$cookie['domain']])) { $this->cookies[$cookie['domain']] = []; } if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) { $this->cookies[$cookie['domain']][$cookie['path']] = []; } $this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie; } } /** * Checks whether a cookie domain matches a request host. * * The method is used by {@link store()} to check for whether a document * at given URL can set a cookie with a given domain attribute and by * {@link getMatching()} to find cookies matching the request URL. * * @param string $requestHost request host * @param string $cookieDomain cookie domain * * @return bool match success */ public function domainMatch($requestHost, $cookieDomain) { if ($requestHost == $cookieDomain) { return true; } // IP address, we require exact match if (preg_match('/^(?:\d{1,3}\.){3}\d{1,3}$/', $requestHost)) { return false; } if ('.' != $cookieDomain[0]) { $cookieDomain = '.' . $cookieDomain; } // prevents setting cookies for '.com' and similar domains if (!$this->useList && substr_count($cookieDomain, '.') < 2 || $this->useList && !self::getRegisteredDomain($cookieDomain) ) { return false; } return substr('.' . $requestHost, -strlen($cookieDomain)) == $cookieDomain; } /** * Removes subdomains to get the registered domain (the first after top-level) * * The method will check Public Suffix List to find out where top-level * domain ends and registered domain starts. It will remove domain parts * to the left of registered one. * * @param string $domain domain name * * @return string|bool registered domain, will return false if $domain is * either invalid or a TLD itself */ public static function getRegisteredDomain($domain) { $domainParts = explode('.', ltrim($domain, '.')); // load the list if needed if (empty(self::$psl)) { $path = '@data_dir@' . DIRECTORY_SEPARATOR . 'HTTP_Request2'; if (0 === strpos($path, '@' . 'data_dir@')) { $path = realpath( __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'data' ); } self::$psl = include_once $path . DIRECTORY_SEPARATOR . 'public-suffix-list.php'; } if (!($result = self::checkDomainsList($domainParts, self::$psl))) { // known TLD, invalid domain name return false; } // unknown TLD if (!strpos($result, '.')) { // fallback to checking that domain "has at least two dots" if (2 > ($count = count($domainParts))) { return false; } return $domainParts[$count - 2] . '.' . $domainParts[$count - 1]; } return $result; } /** * Recursive helper method for {@link getRegisteredDomain()} * * @param array $domainParts remaining domain parts * @param mixed $listNode node in {@link HTTP_Request2_CookieJar::$psl} to check * * @return string|null concatenated domain parts, null in case of error */ protected static function checkDomainsList(array $domainParts, $listNode) { $sub = array_pop($domainParts); if (!is_array($listNode) || is_null($sub) || array_key_exists('!' . $sub, $listNode) ) { return $sub; } elseif (array_key_exists($sub, $listNode)) { $result = self::checkDomainsList($domainParts, $listNode[$sub]); } elseif (array_key_exists('*', $listNode)) { $result = self::checkDomainsList($domainParts, $listNode['*']); } else { return $sub; } return (strlen($result ?: '') > 0) ? ($result . '.' . $sub) : null; } } ?>PKwL\6;Cupdraftplus/includes/PEAR/HTTP/Request2/NotImplementedException.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception thrown in case of missing features * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_NotImplementedException extends HTTP_Request2_Exception { } ?>PKwL\b82updraftplus/includes/PEAR/HTTP/Request2/SOCKS5.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** Socket wrapper class used by Socket Adapter */ require_once 'HTTP/Request2/SocketWrapper.php'; /** * SOCKS5 proxy connection class (used by Socket Adapter) * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 * @link http://pear.php.net/bugs/bug.php?id=19332 * @link http://tools.ietf.org/html/rfc1928 */ class HTTP_Request2_SOCKS5 extends HTTP_Request2_SocketWrapper { /** * Constructor, tries to connect and authenticate to a SOCKS5 proxy * * @param string $address Proxy address, e.g. 'tcp://localhost:1080' * @param int $timeout Connection timeout (seconds) * @param array $contextOptions Stream context options * @param string $username Proxy user name * @param string $password Proxy password * * @throws HTTP_Request2_LogicException * @throws HTTP_Request2_ConnectionException * @throws HTTP_Request2_MessageException */ public function __construct( $address, $timeout = 10, array $contextOptions = [], $username = null, $password = null ) { parent::__construct($address, $timeout, $contextOptions); if (strlen($username)) { $request = pack('C4', 5, 2, 0, 2); } else { $request = pack('C3', 5, 1, 0); } $this->write($request); $response = unpack('Cversion/Cmethod', $this->read(3)); if (5 != $response['version']) { throw new HTTP_Request2_MessageException( 'Invalid version received from SOCKS5 proxy: ' . $response['version'], HTTP_Request2_Exception::MALFORMED_RESPONSE ); } switch ($response['method']) { case 2: $this->performAuthentication($username, $password); case 0: break; default: throw new HTTP_Request2_ConnectionException( "Connection rejected by proxy due to unsupported auth method" ); } } /** * Performs username/password authentication for SOCKS5 * * @param string $username Proxy user name * @param string $password Proxy password * * @return void * @throws HTTP_Request2_ConnectionException * @throws HTTP_Request2_MessageException * @link http://tools.ietf.org/html/rfc1929 */ protected function performAuthentication($username, $password) { $request = pack('C2', 1, strlen($username)) . $username . pack('C', strlen($password)) . $password; $this->write($request); $response = unpack('Cvn/Cstatus', $this->read(3)); if (1 != $response['vn'] || 0 != $response['status']) { throw new HTTP_Request2_ConnectionException( 'Connection rejected by proxy due to invalid username and/or password' ); } } /** * Connects to a remote host via proxy * * @param string $remoteHost Remote host * @param int $remotePort Remote port * * @return void * @throws HTTP_Request2_ConnectionException * @throws HTTP_Request2_MessageException */ public function connect($remoteHost, $remotePort) { $request = pack('C5', 0x05, 0x01, 0x00, 0x03, strlen($remoteHost)) . $remoteHost . pack('n', $remotePort); $this->write($request); $response = unpack('Cversion/Creply/Creserved', $this->read(1024)); if (5 != $response['version'] || 0 != $response['reserved']) { throw new HTTP_Request2_MessageException( 'Invalid response received from SOCKS5 proxy', HTTP_Request2_Exception::MALFORMED_RESPONSE ); } elseif (0 != $response['reply']) { throw new HTTP_Request2_ConnectionException( "Unable to connect to {$remoteHost}:{$remotePort} through SOCKS5 proxy", 0, $response['reply'] ); } } } ?>PKwL\ R:updraftplus/includes/PEAR/HTTP/Request2/LogicException.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Exception that represents error in the program logic * * This exception usually implies a programmer's error, like passing invalid * data to methods or trying to use PHP extensions that weren't installed or * enabled. Usually exceptions of this kind will be thrown before request even * starts. * * The exception will usually contain a package error code. * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ class HTTP_Request2_LogicException extends HTTP_Request2_Exception { } ?>PKwL\LŁ""3updraftplus/includes/PEAR/HTTP/Request2/Adapter.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Class representing a HTTP response */ require_once 'HTTP/Request2/Response.php'; /** * Base class for HTTP_Request2 adapters * * HTTP_Request2 class itself only defines methods for aggregating the request * data, all actual work of sending the request to the remote server and * receiving its response is performed by adapters. * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 */ abstract class HTTP_Request2_Adapter { /** * A list of methods that MUST NOT have a request body, per RFC 2616 * * @var array */ protected static $bodyDisallowed = ['TRACE']; /** * Methods having defined semantics for request body * * Content-Length header (indicating that the body follows, section 4.3 of * RFC 2616) will be sent for these methods even if no body was added * * @var array * @link http://pear.php.net/bugs/bug.php?id=12900 * @link http://pear.php.net/bugs/bug.php?id=14740 */ protected static $bodyRequired = ['POST', 'PUT']; /** * Request being sent * * @var HTTP_Request2 */ protected $request; /** * Request body * * @var string|resource|HTTP_Request2_MultipartBody * @see HTTP_Request2::getBody() */ protected $requestBody; /** * Length of the request body * * @var integer */ protected $contentLength; /** * Sends request to the remote server and returns its response * * @param HTTP_Request2 $request HTTP request message * * @return HTTP_Request2_Response * @throws HTTP_Request2_Exception */ abstract public function sendRequest(HTTP_Request2 $request); /** * Calculates length of the request body, adds proper headers * * @param array $headers associative array of request headers, this method * will add proper 'Content-Length' and 'Content-Type' * headers to this array (or remove them if not needed) * * @return void */ protected function calculateRequestLength(&$headers) { $this->requestBody = $this->request->getBody(); if (is_string($this->requestBody)) { $this->contentLength = strlen($this->requestBody); } elseif (is_resource($this->requestBody)) { $stat = fstat($this->requestBody); $this->contentLength = $stat['size']; rewind($this->requestBody); } else { $this->contentLength = $this->requestBody->getLength(); $headers['content-type'] = 'multipart/form-data; boundary=' . $this->requestBody->getBoundary(); $this->requestBody->rewind(); } if (in_array($this->request->getMethod(), self::$bodyDisallowed) || 0 == $this->contentLength ) { // No body: send a Content-Length header nonetheless (request #12900), // but do that only for methods that require a body (bug #14740) if (in_array($this->request->getMethod(), self::$bodyRequired)) { $headers['content-length'] = 0; } else { unset($headers['content-length']); // if the method doesn't require a body and doesn't have a // body, don't send a Content-Type header. (request #16799) unset($headers['content-type']); } } else { if (empty($headers['content-type'])) { $headers['content-type'] = 'application/x-www-form-urlencoded'; } // Content-Length should not be sent for chunked Transfer-Encoding (bug #20125) if (!isset($headers['transfer-encoding'])) { $headers['content-length'] = $this->contentLength; } } } } ?> PKwL\ 5updraftplus/includes/PEAR/HTTP/Request2/Exception.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * Base class for exceptions in PEAR */ require_once 'PEAR/Exception.php'; /** * Base exception class for HTTP_Request2 package * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=132 */ class HTTP_Request2_Exception extends PEAR_Exception { /** * An invalid argument was passed to a method */ const INVALID_ARGUMENT = 1; /** * Some required value was not available */ const MISSING_VALUE = 2; /** * Request cannot be processed due to errors in PHP configuration */ const MISCONFIGURATION = 3; /** * Error reading the local file */ const READ_ERROR = 4; /** * Server returned a response that does not conform to HTTP protocol */ const MALFORMED_RESPONSE = 10; /** * Failure decoding Content-Encoding or Transfer-Encoding of response */ const DECODE_ERROR = 20; /** * Operation timed out */ const TIMEOUT = 30; /** * Number of redirects exceeded 'max_redirects' configuration parameter */ const TOO_MANY_REDIRECTS = 40; /** * Redirect to a protocol other than http(s):// */ const NON_HTTP_REDIRECT = 50; /** * Native error code * * @var int */ private $_nativeCode; /** * Constructor, can set package error code and native error code * * @param string $message exception message * @param int $code package error code, one of class constants * @param int $nativeCode error code from underlying PHP extension */ public function __construct($message = null, $code = null, $nativeCode = null) { parent::__construct($message, $code); $this->_nativeCode = $nativeCode; } /** * Returns error code produced by underlying PHP extension * * For Socket Adapter this may contain error number returned by * stream_socket_client(), for Curl Adapter this will contain error number * returned by curl_errno() * * @return integer */ public function getNativeCode() { return $this->_nativeCode; } } // backwards compatibility, include the child exceptions if installed with PEAR installer require_once 'HTTP/Request2/ConnectionException.php'; require_once 'HTTP/Request2/LogicException.php'; require_once 'HTTP/Request2/MessageException.php'; require_once 'HTTP/Request2/NotImplementedException.php'; ?>PKwL\ Hupdraftplus/includes/PEAR/HTTP/WebDAV/Tools/_parse_propfind_response.phpnu[urls = array(); $this->_depth = 0; $xml_parser = xml_parser_create_ns("UTF-8", " "); xml_set_element_handler($xml_parser, array($this, "_startElement"), array($this, "_endElement")); xml_set_character_data_handler($xml_parser, array($this, "_data")); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false); $this->success = xml_parse($xml_parser, $response, true); xml_parser_free($xml_parser); unset($this->_depth); } private function _startElement($parser, $name, $attrs) { if (strstr($name, " ")) { list($ns, $tag) = explode(" ", $name); if ($ns == "") $this->success = false; } else { $ns = ""; $tag = $name; } switch ($this->_depth) { case '2': switch ($tag) { case 'propstat': // TODO check is_executable, lockinfo ... $this->_tmpprop = array("mode" => 0100666 /* all may read and write (for now) */); break; } } $this->_depth++; } private function _endElement($parser, $name) { if (strstr($name, " ")) { list($ns, $tag) = explode(" ", $name); if ($ns == "") $this->success = false; } else { $ns = ""; $tag = $name; } $this->_depth--; switch ($this->_depth) { case '1': switch ($tag) { case 'response': $this->urls[$this->_tmphref] = $this->_tmpvals; unset($this->_tmphref); unset($this->_tmpvals); break; } break; case '2': switch ($tag) { case 'href': $this->_tmphref = $this->_tmpdata; break; } case 'propstat': if (isset($this->_tmpstat) && strstr($this->_tmpstat, " 200 ")) { $this->_tmpvals = $this->_tmpprop; } unset($this->_tmpstat); unset($this->_tmpprop); break; case '3': switch ($tag) { case 'status': $this->_tmpstat = $this->_tmpdata; break; } case '4': if (!isset($this->_tmpdata)) { return; } switch ($tag) { case 'getlastmodified': $this->_tmpprop['atime'] = strtotime($this->_tmpdata); $this->_tmpprop['mtime'] = strtotime($this->_tmpdata); break; case 'creationdate': $t = preg_split("/[^[:digit:]]/", $this->_tmpdata); $this->_tmpprop['ctime'] = mktime((int) $t[3], (int) $t[4], (int) $t[5], (int) $t[1], (int) $t[2], (int) $t[0]); unset($t); break; case 'getcontentlength': $this->_tmpprop['size'] = $this->_tmpdata; break; } case '5': switch ($tag) { case 'collection': $this->_tmpprop['mode'] &= ~0100000; // clear S_IFREG $this->_tmpprop['mode'] |= 040000; // set S_IFDIR break; } } unset($this->_tmpdata); } private function _data($parser, $data) { $this->_tmpdata = $data; } public function stat($href = false) { if ($href) { // TODO } else { reset($this->urls); return current($this->urls); } } } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode:nil * End: */ PKwL\.GGDupdraftplus/includes/PEAR/HTTP/WebDAV/Tools/_parse_lock_response.phpnu[success = xml_parse($xml_parser, $response, true); xml_parser_free($xml_parser); } private function _startElement($parser, $name, $attrs) { if (strstr($name, " ")) { list($ns, $tag) = explode(" ", $name); } else { $ns = ""; $tag = $name; } if ($ns == "DAV:") { switch ($tag) { case "locktoken": $this->collect_locktoken = true; break; } } } private function _data($parser, $data) { if ($this->collect_locktoken) { $this->locktoken .= $data; } } private function _endElement($parser, $name) { if (strstr($name, " ")) { list($ns, $tag) = explode(" ", $name); } else { $ns = ""; $tag = $name; } switch ($tag) { case "locktoken": $this->collect_locktoken = false; $this->locktoken = trim($this->locktoken); break; } } } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode:nil * End: */ PKwL\=KK+updraftplus/includes/PEAR/HTTP/Request2.phpnu[ * @copyright 2008-2022 Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @link http://pear.php.net/package/HTTP_Request2 */ /** * A class representing an URL as per RFC 3986. */ require_once 'Net/URL2.php'; /** * Exception class for HTTP_Request2 package */ require_once 'HTTP/Request2/Exception.php'; /** * Class representing a HTTP request message * * @category HTTP * @package HTTP_Request2 * @author Alexey Borzov * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License * @version Release: 2.5.1 * @link http://pear.php.net/package/HTTP_Request2 * @link http://tools.ietf.org/html/rfc2616#section-5 */ class HTTP_Request2 implements SplSubject { /** * #@+ * Constants for HTTP request methods * * @link http://tools.ietf.org/html/rfc2616#section-5.1.1 */ const METHOD_OPTIONS = 'OPTIONS'; const METHOD_GET = 'GET'; const METHOD_HEAD = 'HEAD'; const METHOD_POST = 'POST'; const METHOD_PUT = 'PUT'; const METHOD_DELETE = 'DELETE'; const METHOD_TRACE = 'TRACE'; const METHOD_CONNECT = 'CONNECT'; /** * #@- */ /** * #@+ * Constants for HTTP authentication schemes * * @link http://tools.ietf.org/html/rfc2617 */ const AUTH_BASIC = 'basic'; const AUTH_DIGEST = 'digest'; /** * #@- */ /** * Regular expression used to check for invalid symbols in RFC 2616 tokens * * @link http://pear.php.net/bugs/bug.php?id=15630 */ const REGEXP_INVALID_TOKEN = '![\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]!'; /** * Regular expression used to check for invalid symbols in cookie strings * * @link http://pear.php.net/bugs/bug.php?id=15630 * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html */ const REGEXP_INVALID_COOKIE = '/[\s,;]/'; /** * Fileinfo magic database resource * * @var resource * @see detectMimeType() */ private static $_fileinfoDb; /** * Observers attached to the request (instances of SplObserver) * * @var array */ protected $observers = []; /** * Request URL * * @var Net_URL2 */ protected $url; /** * Request method * * @var string */ protected $method = self::METHOD_GET; /** * Authentication data * * @var array * @see getAuth() */ protected $auth; /** * Request headers * * @var array */ protected $headers = []; /** * Configuration parameters * * @var array * @see setConfig() */ protected $config = [ 'adapter' => 'HTTP_Request2_Adapter_Socket', 'connect_timeout' => 10, 'timeout' => 0, 'use_brackets' => true, 'protocol_version' => '1.1', 'buffer_size' => 16384, 'store_body' => true, 'local_ip' => null, 'proxy_host' => '', 'proxy_port' => '', 'proxy_user' => '', 'proxy_password' => '', 'proxy_auth_scheme' => self::AUTH_BASIC, 'proxy_type' => 'http', 'ssl_verify_peer' => true, 'ssl_verify_host' => true, 'ssl_cafile' => null, 'ssl_capath' => null, 'ssl_local_cert' => null, 'ssl_passphrase' => null, 'digest_compat_ie' => false, 'follow_redirects' => false, 'max_redirects' => 5, 'strict_redirects' => false ]; /** * Last event in request / response handling, intended for observers * * @var array * @see getLastEvent() */ protected $lastEvent = [ 'name' => 'start', 'data' => null ]; /** * Request body * * @var string|resource * @see setBody() */ protected $body = ''; /** * Array of POST parameters * * @var array */ protected $postParams = []; /** * Array of file uploads (for multipart/form-data POST requests) * * @var array */ protected $uploads = []; /** * Adapter used to perform actual HTTP request * * @var HTTP_Request2_Adapter */ protected $adapter; /** * Cookie jar to persist cookies between requests * * @var HTTP_Request2_CookieJar */ protected $cookieJar = null; /** * Constructor. Can set request URL, method and configuration array. * * Also sets a default value for User-Agent header. * * @param string|Net_Url2 $url Request URL * @param string $method Request method * @param array $config Configuration for this Request instance */ public function __construct( $url = null, $method = self::METHOD_GET, array $config = [] ) { $this->setConfig($config); if (!empty($url)) { $this->setUrl($url); } if (!empty($method)) { $this->setMethod($method); } $this->setHeader( 'user-agent', 'HTTP_Request2/2.5.1 ' . '(https://github.com/pear/HTTP_Request2) PHP/' . phpversion() ); } /** * Sets the URL for this request * * If the URL has userinfo part (username & password) these will be removed * and converted to auth data. If the URL does not have a path component, * that will be set to '/'. * * @param string|Net_URL2 $url Request URL * * @return $this * @throws HTTP_Request2_LogicException */ public function setUrl($url) { if (is_string($url)) { $url = new Net_URL2( $url, [Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets']] ); } if (!$url instanceof Net_URL2) { throw new HTTP_Request2_LogicException( 'Parameter is not a valid HTTP URL', HTTP_Request2_Exception::INVALID_ARGUMENT ); } // URL contains username / password? if ($url->getUserinfo()) { $username = $url->getUser(); $password = $url->getPassword(); $this->setAuth(rawurldecode($username), $password? rawurldecode($password): ''); $url->setUserinfo(''); } if ('' == $url->getPath()) { $url->setPath('/'); } $this->url = $url; return $this; } /** * Returns the request URL * * @return Net_URL2 */ public function getUrl() { return $this->url; } /** * Sets the request method * * @param string $method one of the methods defined in RFC 2616 * * @return $this * @throws HTTP_Request2_LogicException if the method name is invalid */ public function setMethod($method) { // Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1 if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) { throw new HTTP_Request2_LogicException( "Invalid request method '{$method}'", HTTP_Request2_Exception::INVALID_ARGUMENT ); } $this->method = $method; return $this; } /** * Returns the request method * * @return string */ public function getMethod() { return $this->method; } /** * Sets the configuration parameter(s) * * The following parameters are available: *
    *
  • 'adapter' - adapter to use (string)
  • *
  • 'connect_timeout' - Connection timeout in seconds (integer)
  • *
  • 'timeout' - Total number of seconds a request can take. * Use 0 for no limit, should be greater than * 'connect_timeout' if set (integer)
  • *
  • 'use_brackets' - Whether to append [] to array variable names (bool)
  • *
  • 'protocol_version' - HTTP Version to use, '1.0' or '1.1' (string)
  • *
  • 'buffer_size' - Buffer size to use for reading and writing (int)
  • *
  • 'store_body' - Whether to store response body in response object. * Set to false if receiving a huge response and * using an Observer to save it (boolean)
  • *
  • 'local_ip' - Specifies the IP address that will be used for accessing * the network (string)
  • *
  • 'proxy_type' - Proxy type, 'http' or 'socks5' (string)
  • *
  • 'proxy_host' - Proxy server host (string)
  • *
  • 'proxy_port' - Proxy server port (integer)
  • *
  • 'proxy_user' - Proxy auth username (string)
  • *
  • 'proxy_password' - Proxy auth password (string)
  • *
  • 'proxy_auth_scheme' - Proxy auth scheme, one of HTTP_Request2::AUTH_* constants (string)
  • *
  • 'proxy' - Shorthand for proxy_* parameters, proxy given as URL, * e.g. 'socks5://localhost:1080/' (string)
  • *
  • 'ssl_verify_peer' - Whether to verify peer's SSL certificate (bool)
  • *
  • 'ssl_verify_host' - Whether to check that Common Name in SSL * certificate matches host name (bool)
  • *
  • 'ssl_cafile' - Cerificate Authority file to verify the peer * with (use with 'ssl_verify_peer') (string)
  • *
  • 'ssl_capath' - Directory holding multiple Certificate * Authority files (string)
  • *
  • 'ssl_local_cert' - Name of a file containing local cerificate (string)
  • *
  • 'ssl_passphrase' - Passphrase with which local certificate * was encoded (string)
  • *
  • 'digest_compat_ie' - Whether to imitate behaviour of MSIE 5 and 6 * in using URL without query string in digest * authentication (boolean)
  • *
  • 'follow_redirects' - Whether to automatically follow HTTP Redirects (boolean)
  • *
  • 'max_redirects' - Maximum number of redirects to follow (integer)
  • *
  • 'strict_redirects' - Whether to keep request method on redirects via status 301 and * 302 (true, needed for compatibility with RFC 2616) * or switch to GET (false, needed for compatibility with most * browsers) (boolean)
  • *
* * @param string|array $nameOrConfig configuration parameter name or array * ('parameter name' => 'parameter value') * @param mixed $value parameter value if $nameOrConfig is not an array * * @return $this * @throws HTTP_Request2_LogicException If the parameter is unknown */ public function setConfig($nameOrConfig, $value = null) { if (is_array($nameOrConfig)) { foreach ($nameOrConfig as $name => $value) { $this->setConfig($name, $value); } } elseif ('proxy' == $nameOrConfig) { $url = new Net_URL2($value); $this->setConfig( [ 'proxy_type' => $url->getScheme(), 'proxy_host' => $url->getHost(), 'proxy_port' => $url->getPort(), 'proxy_user' => rawurldecode($url->getUser()), 'proxy_password' => rawurldecode($url->getPassword()) ] ); } else { if (!array_key_exists($nameOrConfig, $this->config)) { throw new HTTP_Request2_LogicException( "Unknown configuration parameter '{$nameOrConfig}'", HTTP_Request2_Exception::INVALID_ARGUMENT ); } $this->config[$nameOrConfig] = $value; } return $this; } /** * Returns the value(s) of the configuration parameter(s) * * @param string $name parameter name * * @return mixed value of $name parameter, array of all configuration * parameters if $name is not given * @throws HTTP_Request2_LogicException If the parameter is unknown */ public function getConfig($name = null) { if (null === $name) { return $this->config; } elseif (!array_key_exists($name, $this->config)) { throw new HTTP_Request2_LogicException( "Unknown configuration parameter '{$name}'", HTTP_Request2_Exception::INVALID_ARGUMENT ); } return $this->config[$name]; } /** * Sets the authentication data * * @param string $user user name * @param string $password password * @param string $scheme authentication scheme * * @return $this */ public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC) { if (empty($user)) { $this->auth = null; } else { $this->auth = [ 'user' => (string)$user, 'password' => (string)$password, 'scheme' => $scheme ]; } return $this; } /** * Returns the authentication data * * The array has the keys 'user', 'password' and 'scheme', where 'scheme' * is one of the HTTP_Request2::AUTH_* constants. * * @return array */ public function getAuth() { return $this->auth; } /** * Sets request header(s) * * The first parameter may be either a full header string 'header: value' or * header name. In the former case $value parameter is ignored, in the latter * the header's value will either be set to $value or the header will be * removed if $value is null. The first parameter can also be an array of * headers, in that case method will be called recursively. * * Note that headers are treated case insensitively as per RFC 2616. * * * $req->setHeader('Foo: Bar'); // sets the value of 'Foo' header to 'Bar' * $req->setHeader('FoO', 'Baz'); // sets the value of 'Foo' header to 'Baz' * $req->setHeader(array('foo' => 'Quux')); // sets the value of 'Foo' header to 'Quux' * $req->setHeader('FOO'); // removes 'Foo' header from request * * * @param string|array $name header name, header string ('Header: value') * or an array of headers * @param string|array|null $value header value if $name is not an array, * header will be removed if value is null * @param bool $replace whether to replace previous header with the * same name or append to its value * * @return $this * @throws HTTP_Request2_LogicException */ public function setHeader($name, $value = null, $replace = true) { if (is_array($name)) { foreach ($name as $k => $v) { if (is_string($k)) { $this->setHeader($k, $v, $replace); } else { $this->setHeader($v, null, $replace); } } } else { if (null === $value && strpos($name, ':')) { list($name, $value) = array_map('trim', explode(':', $name, 2)); } // Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2 if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) { throw new HTTP_Request2_LogicException( "Invalid header name '{$name}'", HTTP_Request2_Exception::INVALID_ARGUMENT ); } // Header names are case insensitive anyway $name = strtolower($name); if (null === $value) { unset($this->headers[$name]); } else { if (is_array($value)) { $value = implode(', ', array_map('trim', $value)); } elseif (is_string($value)) { $value = trim($value); } if (!isset($this->headers[$name]) || $replace) { $this->headers[$name] = $value; } else { $this->headers[$name] .= ', ' . $value; } } } return $this; } /** * Returns the request headers * * The array is of the form ('header name' => 'header value'), header names * are lowercased * * @return array */ public function getHeaders() { return $this->headers; } /** * Adds a cookie to the request * * If the request does not have a CookieJar object set, this method simply * appends a cookie to "Cookie:" header. * * If a CookieJar object is available, the cookie is stored in that object. * Data from request URL will be used for setting its 'domain' and 'path' * parameters, 'expires' and 'secure' will be set to null and false, * respectively. If you need further control, use CookieJar's methods. * * @param string $name cookie name * @param string $value cookie value * * @return $this * @throws HTTP_Request2_LogicException * @see setCookieJar() */ public function addCookie($name, $value) { if (!empty($this->cookieJar)) { $this->cookieJar->store( ['name' => $name, 'value' => $value], $this->url ); } else { $cookie = $name . '=' . $value; if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) { throw new HTTP_Request2_LogicException( "Invalid cookie: '{$cookie}'", HTTP_Request2_Exception::INVALID_ARGUMENT ); } $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; '; $this->setHeader('cookie', $cookies . $cookie); } return $this; } /** * Sets the request body * * If you provide file pointer rather than file name, it should support * fstat() and rewind() operations. * * @param string|resource|HTTP_Request2_MultipartBody $body Either a * string with the body or filename containing body or * pointer to an open file or object with multipart body data * @param bool $isFilename Whether * first parameter is a filename * * @return $this * @throws HTTP_Request2_LogicException */ public function setBody($body, $isFilename = false) { if (!$isFilename && !is_resource($body)) { if (!$body instanceof HTTP_Request2_MultipartBody) { $this->body = (string)$body; } else { $this->body = $body; } } else { $fileData = $this->fopenWrapper($body, empty($this->headers['content-type'])); $this->body = $fileData['fp']; if (empty($this->headers['content-type'])) { $this->setHeader('content-type', $fileData['type']); } } $this->postParams = $this->uploads = []; return $this; } /** * Returns the request body * * @return string|resource|HTTP_Request2_MultipartBody */ public function getBody() { if (self::METHOD_POST == $this->method && (!empty($this->postParams) || !empty($this->uploads)) ) { if (0 === strpos($this->headers['content-type'], 'application/x-www-form-urlencoded')) { $body = http_build_query($this->postParams, '', '&'); if (!$this->getConfig('use_brackets')) { $body = preg_replace('/%5B\d+%5D=/', '=', $body); } // support RFC 3986 by not encoding '~' symbol (request #15368) return str_replace('%7E', '~', $body); } elseif (0 === strpos($this->headers['content-type'], 'multipart/form-data')) { require_once 'HTTP/Request2/MultipartBody.php'; return new HTTP_Request2_MultipartBody( $this->postParams, $this->uploads, $this->getConfig('use_brackets') ); } } return $this->body; } /** * Adds a file to form-based file upload * * Used to emulate file upload via a HTML form. The method also sets * Content-Type of HTTP request to 'multipart/form-data'. * * If you just want to send the contents of a file as the body of HTTP * request you should use setBody() method. * * If you provide file pointers rather than file names, they should support * fstat() and rewind() operations. * * @param string $fieldName name of file-upload field * @param string|resource|array $filename full name of local file, * pointer to open file or an array of files * @param string $sendFilename filename to send in the request * @param string $contentType content-type of file being uploaded * * @return $this * @throws HTTP_Request2_LogicException */ public function addUpload( $fieldName, $filename, $sendFilename = null, $contentType = null ) { if (!is_array($filename)) { $fileData = $this->fopenWrapper($filename, empty($contentType)); $this->uploads[$fieldName] = [ 'fp' => $fileData['fp'], 'filename' => !empty($sendFilename)? $sendFilename :(is_string($filename)? basename($filename): 'anonymous.blob') , 'size' => $fileData['size'], 'type' => empty($contentType)? $fileData['type']: $contentType ]; } else { $fps = $names = $sizes = $types = []; foreach ($filename as $f) { if (!is_array($f)) { $f = [$f]; } $fileData = $this->fopenWrapper($f[0], empty($f[2])); $fps[] = $fileData['fp']; $names[] = !empty($f[1])? $f[1] :(is_string($f[0])? basename($f[0]): 'anonymous.blob'); $sizes[] = $fileData['size']; $types[] = empty($f[2])? $fileData['type']: $f[2]; } $this->uploads[$fieldName] = [ 'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types ]; } if (empty($this->headers['content-type']) || 'application/x-www-form-urlencoded' == $this->headers['content-type'] ) { $this->setHeader('content-type', 'multipart/form-data'); } return $this; } /** * Adds POST parameter(s) to the request. * * @param string|array $name parameter name or array ('name' => 'value') * @param mixed $value parameter value (can be an array) * * @return $this */ public function addPostParameter($name, $value = null) { if (!is_array($name)) { $this->postParams[$name] = $value; } else { foreach ($name as $k => $v) { $this->addPostParameter($k, $v); } } if (empty($this->headers['content-type'])) { $this->setHeader('content-type', 'application/x-www-form-urlencoded'); } return $this; } #[ReturnTypeWillChange] /** * Attaches a new observer * * @param SplObserver $observer any object implementing SplObserver * * @return void */ public function attach(SplObserver $observer) { foreach ($this->observers as $attached) { if ($attached === $observer) { return; } } $this->observers[] = $observer; } #[ReturnTypeWillChange] /** * Detaches an existing observer * * @param SplObserver $observer any object implementing SplObserver * * @return void */ public function detach(SplObserver $observer) { foreach ($this->observers as $key => $attached) { if ($attached === $observer) { unset($this->observers[$key]); return; } } } #[ReturnTypeWillChange] /** * Notifies all observers * * @return void */ public function notify() { foreach ($this->observers as $observer) { $observer->update($this); } } /** * Sets the last event * * Adapters should use this method to set the current state of the request * and notify the observers. * * @param string $name event name * @param mixed $data event data * * @return void */ public function setLastEvent($name, $data = null) { $this->lastEvent = [ 'name' => $name, 'data' => $data ]; $this->notify(); } /** * Returns the last event * * Observers should use this method to access the last change in request. * The following event names are possible: *
    *
  • 'connect' - after connection to remote server, * data is the destination (string)
  • *
  • 'disconnect' - after disconnection from server
  • *
  • 'sentHeaders' - after sending the request headers, * data is the headers sent (string)
  • *
  • 'sentBodyPart' - after sending a part of the request body, * data is the length of that part (int)
  • *
  • 'sentBody' - after sending the whole request body, * data is request body length (int)
  • *
  • 'receivedHeaders' - after receiving the response headers, * data is HTTP_Request2_Response object
  • *
  • 'receivedBodyPart' - after receiving a part of the response * body, data is that part (string)
  • *
  • 'receivedEncodedBodyPart' - as 'receivedBodyPart', but data is still * encoded by Content-Encoding
  • *
  • 'receivedBody' - after receiving the complete response * body, data is HTTP_Request2_Response object
  • *
  • 'warning' - a problem arose during the request * that is not severe enough to throw * an Exception, data is the warning * message (string). Currently dispatched if * response body was received incompletely.
  • *
* Different adapters may not send all the event types. Mock adapter does * not send any events to the observers. * * @return array The array has two keys: 'name' and 'data' */ public function getLastEvent() { return $this->lastEvent; } /** * Sets the adapter used to actually perform the request * * You can pass either an instance of a class implementing HTTP_Request2_Adapter * or a class name. The method will only try to include a file if the class * name starts with HTTP_Request2_Adapter_, it will also try to prepend this * prefix to the class name if it doesn't contain any underscores, so that * * $request->setAdapter('curl'); * * will work. * * @param string|HTTP_Request2_Adapter $adapter Adapter to use * * @return $this * @throws HTTP_Request2_LogicException */ public function setAdapter($adapter) { if (is_string($adapter)) { if (!class_exists($adapter, false)) { if (false === strpos($adapter, '_')) { $adapter = 'HTTP_Request2_Adapter_' . ucfirst($adapter); } if (!class_exists($adapter, true) && preg_match('/^HTTP_Request2_Adapter_([a-zA-Z0-9]+)$/', $adapter) ) { include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php'; } if (!class_exists($adapter, false)) { throw new HTTP_Request2_LogicException( "Class {$adapter} not found", HTTP_Request2_Exception::MISSING_VALUE ); } } $adapter = new $adapter; } if (!$adapter instanceof HTTP_Request2_Adapter) { throw new HTTP_Request2_LogicException( 'Parameter is not a HTTP request adapter', HTTP_Request2_Exception::INVALID_ARGUMENT ); } $this->adapter = $adapter; return $this; } /** * Sets the cookie jar * * A cookie jar is used to maintain cookies across HTTP requests and * responses. Cookies from jar will be automatically added to the request * headers based on request URL. * * @param HTTP_Request2_CookieJar|bool $jar Existing CookieJar object, true to * create a new one, false to remove * * @return $this * @throws HTTP_Request2_LogicException */ public function setCookieJar($jar = true) { require_once 'HTTP/Request2/CookieJar.php'; if ($jar instanceof HTTP_Request2_CookieJar) { $this->cookieJar = $jar; } elseif (true === $jar) { $this->cookieJar = new HTTP_Request2_CookieJar(); } elseif (!$jar) { $this->cookieJar = null; } else { throw new HTTP_Request2_LogicException( 'Invalid parameter passed to setCookieJar()', HTTP_Request2_Exception::INVALID_ARGUMENT ); } return $this; } /** * Returns current CookieJar object or null if none * * @return HTTP_Request2_CookieJar|null */ public function getCookieJar() { return $this->cookieJar; } /** * Sends the request and returns the response * * @throws HTTP_Request2_Exception * @return HTTP_Request2_Response */ public function send() { // Sanity check for URL if (!$this->url instanceof Net_URL2 || !$this->url->isAbsolute() || !in_array(strtolower($this->url->getScheme()), ['https', 'http']) ) { throw new HTTP_Request2_LogicException( 'HTTP_Request2 needs an absolute HTTP(S) request URL, ' . ($this->url instanceof Net_URL2 ? "'" . $this->url->__toString() . "'" : 'none') . ' given', HTTP_Request2_Exception::INVALID_ARGUMENT ); } if (empty($this->adapter)) { $this->setAdapter($this->getConfig('adapter')); } // force using single byte encoding if mbstring extension overloads // strlen() and substr(); see bug #1781, bug #10605 if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { $oldEncoding = mb_internal_encoding(); mb_internal_encoding('8bit'); } try { return $this->adapter->sendRequest($this); } finally { // phpcs:ignore PHPCompatibility.Keywords.NewKeywords.t_finallyFound if (!empty($oldEncoding)) { mb_internal_encoding($oldEncoding); } } } /** * Wrapper around fopen()/fstat() used by setBody() and addUpload() * * @param string|resource $file file name or pointer to open file * @param bool $detectType whether to try autodetecting MIME * type of file, will only work if $file is a * filename, not pointer * * @return array array('fp' => file pointer, 'size' => file size, 'type' => MIME type) * @throws HTTP_Request2_LogicException */ protected function fopenWrapper($file, $detectType = false) { if (!is_string($file) && !is_resource($file)) { throw new HTTP_Request2_LogicException( "Filename or file pointer resource expected", HTTP_Request2_Exception::INVALID_ARGUMENT ); } $fileData = [ 'fp' => is_string($file)? null: $file, 'type' => 'application/octet-stream', 'size' => 0 ]; if (is_string($file)) { if (!($fileData['fp'] = @fopen($file, 'rb'))) { $error = error_get_last(); throw new HTTP_Request2_LogicException( $error['message'], HTTP_Request2_Exception::READ_ERROR ); } if ($detectType) { $fileData['type'] = self::detectMimeType($file); } } if (!($stat = fstat($fileData['fp']))) { throw new HTTP_Request2_LogicException( "fstat() call failed", HTTP_Request2_Exception::READ_ERROR ); } $fileData['size'] = $stat['size']; return $fileData; } /** * Tries to detect MIME type of a file * * The method will try to use fileinfo extension if it is available, * deprecated mime_content_type() function in the other case. If neither * works, default 'application/octet-stream' MIME type is returned * * @param string $filename file name * * @return string file MIME type */ protected static function detectMimeType($filename) { // finfo extension from PECL available if (function_exists('finfo_open')) { if (!isset(self::$_fileinfoDb)) { self::$_fileinfoDb = @finfo_open(FILEINFO_MIME); } if (self::$_fileinfoDb) { $info = finfo_file(self::$_fileinfoDb, $filename); } } // (deprecated) mime_content_type function available if (empty($info) && function_exists('mime_content_type')) { $info = mime_content_type($filename); } return empty($info)? 'application/octet-stream': $info; } } ?> PKwL\Ycc&updraftplus/includes/PEAR/Net/URL2.phpnu[ * @copyright 2007-2009 Peytz & Co. A/S * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause * @version CVS: $Id$ * @link https://tools.ietf.org/html/rfc3986 */ /** * Represents a URL as per RFC 3986. * * @category Networking * @package Net_URL2 * @author Christian Schmidt * @copyright 2007-2009 Peytz & Co. A/S * @license https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause * @version Release: 2.2.0 * @link https://pear.php.net/package/Net_URL2 */ class Net_URL2 { /** * Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default * is true. */ const OPTION_STRICT = 'strict'; /** * Represent arrays in query using PHP's [] notation. Default is true. */ const OPTION_USE_BRACKETS = 'use_brackets'; /** * Drop zero-based integer sequences in query using PHP's [] notation. Default * is true. */ const OPTION_DROP_SEQUENCE = 'drop_sequence'; /** * URL-encode query variable keys. Default is true. */ const OPTION_ENCODE_KEYS = 'encode_keys'; /** * Query variable separators when parsing the query string. Every character * is considered a separator. Default is "&". */ const OPTION_SEPARATOR_INPUT = 'input_separator'; /** * Query variable separator used when generating the query string. Default * is "&". */ const OPTION_SEPARATOR_OUTPUT = 'output_separator'; /** * Default options corresponds to how PHP handles $_GET. */ private $_options = array( self::OPTION_STRICT => true, self::OPTION_USE_BRACKETS => true, self::OPTION_DROP_SEQUENCE => true, self::OPTION_ENCODE_KEYS => true, self::OPTION_SEPARATOR_INPUT => '&', self::OPTION_SEPARATOR_OUTPUT => '&', ); /** * @var string|bool */ private $_scheme = false; /** * @var string|bool */ private $_userinfo = false; /** * @var string|bool */ private $_host = false; /** * @var string|bool */ private $_port = false; /** * @var string */ private $_path = ''; /** * @var string|bool */ private $_query = false; /** * @var string|bool */ private $_fragment = false; /** * Constructor. * * @param string $url an absolute or relative URL * @param array $options an array of OPTION_xxx constants * * @uses self::parseUrl() */ public function __construct($url, array $options = array()) { foreach ($options as $optionName => $value) { if (array_key_exists($optionName, $this->_options)) { $this->_options[$optionName] = $value; } } $this->parseUrl($url); } /** * Magic Setter. * * This method will magically set the value of a private variable ($var) * with the value passed as the args * * @param string $var The private variable to set. * @param mixed $arg An argument of any type. * * @return void */ public function __set($var, $arg) { $method = 'set' . $var; if (method_exists($this, $method)) { $this->$method($arg); } } /** * Magic Getter. * * This is the magic get method to retrieve the private variable * that was set by either __set() or it's setter... * * @param string $var The property name to retrieve. * * @return mixed $this->$var Either a boolean false if the * property is not set or the value * of the private property. */ public function __get($var) { $method = 'get' . $var; if (method_exists($this, $method)) { return $this->$method(); } return false; } /** * Returns the scheme, e.g. "http" or "urn", or false if there is no * scheme specified, i.e. if this is a relative URL. * * @return string|bool */ public function getScheme() { return $this->_scheme; } /** * Sets the scheme, e.g. "http" or "urn". Specify false if there is no * scheme specified, i.e. if this is a relative URL. * * @param string|bool $scheme e.g. "http" or "urn", or false if there is no * scheme specified, i.e. if this is a relative * URL * * @return $this * @see getScheme */ public function setScheme($scheme) { $this->_scheme = $scheme; return $this; } /** * Returns the user part of the userinfo part (the part preceding the first * ":"), or false if there is no userinfo part. * * @return string|bool */ public function getUser() { return $this->_userinfo !== false ? preg_replace('(:.*$)', '', $this->_userinfo) : false; } /** * Returns the password part of the userinfo part (the part after the first * ":"), or false if there is no userinfo part (i.e. the URL does not * contain "@" in front of the hostname) or the userinfo part does not * contain ":". * * @return string|bool */ public function getPassword() { return $this->_userinfo !== false ? substr(strstr($this->_userinfo, ':'), 1) : false; } /** * Returns the userinfo part, or false if there is none, i.e. if the * authority part does not contain "@". * * @return string|bool */ public function getUserinfo() { return $this->_userinfo; } /** * Sets the userinfo part. If two arguments are passed, they are combined * in the userinfo part as username ":" password. * * @param string|bool $userinfo userinfo or username * @param string|bool $password optional password, or false * * @return $this */ public function setUserinfo($userinfo, $password = false) { if ($password !== false) { $userinfo .= ':' . $password; } if ($userinfo !== false) { $userinfo = $this->_encodeData($userinfo); } $this->_userinfo = $userinfo; return $this; } /** * Returns the host part, or false if there is no authority part, e.g. * relative URLs. * * @return string|bool a hostname, an IP address, or false */ public function getHost() { return $this->_host; } /** * Sets the host part. Specify false if there is no authority part, e.g. * relative URLs. * * @param string|bool $host a hostname, an IP address, or false * * @return $this */ public function setHost($host) { $this->_host = $host; return $this; } /** * Returns the port number, or false if there is no port number specified, * i.e. if the default port is to be used. * * @return string|bool */ public function getPort() { return $this->_port; } /** * Sets the port number. Specify false if there is no port number specified, * i.e. if the default port is to be used. * * @param string|bool $port a port number, or false * * @return $this */ public function setPort($port) { $this->_port = $port; return $this; } /** * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or * false if there is no authority. * * @return string|bool */ public function getAuthority() { if (false === $this->_host) { return false; } $authority = ''; if (strlen($this->_userinfo)) { $authority .= $this->_userinfo . '@'; } $authority .= $this->_host; if ($this->_port !== false) { $authority .= ':' . $this->_port; } return $authority; } /** * Sets the authority part, i.e. [ userinfo "@" ] host [ ":" port ]. Specify * false if there is no authority. * * @param string|bool $authority a hostname or an IP address, possibly * with userinfo prefixed and port number * appended, e.g. "foo:bar@example.org:81". * * @return $this */ public function setAuthority($authority) { $this->_userinfo = false; $this->_host = false; $this->_port = false; if ('' === $authority) { $this->_host = $authority; return $this; } if (!preg_match('(^(([^\@]*)\@)?(.+?)(:(\d*))?$)', $authority, $matches)) { return $this; } if ($matches[1]) { $this->_userinfo = $this->_encodeData($matches[2]); } $this->_host = $matches[3]; if (isset($matches[5]) && strlen($matches[5])) { $this->_port = $matches[5]; } return $this; } /** * Returns the path part (possibly an empty string). * * @return string */ public function getPath() { return $this->_path; } /** * Sets the path part (possibly an empty string). * * @param string $path a path * * @return $this */ public function setPath($path) { $this->_path = $path; return $this; } /** * Returns the query string (excluding the leading "?"), or false if "?" * is not present in the URL. * * @return string|bool * @see getQueryVariables */ public function getQuery() { return $this->_query; } /** * Sets the query string (excluding the leading "?"). Specify false if "?" * is not present in the URL. * * @param string|bool $query a query string, e.g. "foo=1&bar=2" * * @return $this * @see setQueryVariables */ public function setQuery($query) { $this->_query = $query; return $this; } /** * Returns the fragment name, or false if "#" is not present in the URL. * * @return string|bool */ public function getFragment() { return $this->_fragment; } /** * Sets the fragment name. Specify false if "#" is not present in the URL. * * @param string|bool $fragment a fragment excluding the leading "#", or * false * * @return $this */ public function setFragment($fragment) { $this->_fragment = $fragment; return $this; } /** * Returns the query string like an array as the variables would appear in * $_GET in a PHP script. If the URL does not contain a "?", an empty array * is returned. * * @return array */ public function getQueryVariables() { $separator = $this->getOption(self::OPTION_SEPARATOR_INPUT); $encodeKeys = $this->getOption(self::OPTION_ENCODE_KEYS); $useBrackets = $this->getOption(self::OPTION_USE_BRACKETS); $return = array(); for ($part = strtok($this->_query, $separator); strlen($part); $part = strtok($separator) ) { list($key, $value) = explode('=', $part, 2) + array(1 => ''); if ($encodeKeys) { $key = rawurldecode($key); } $value = rawurldecode($value); if ($useBrackets) { $return = $this->_queryArrayByKey($key, $value, $return); } else { if (isset($return[$key])) { $return[$key] = (array) $return[$key]; $return[$key][] = $value; } else { $return[$key] = $value; } } } return $return; } /** * Parse a single query key=value pair into an existing php array * * @param string $key query-key * @param string $value query-value * @param array $array of existing query variables (if any) * * @return mixed */ private function _queryArrayByKey($key, $value, array $array = array()) { if (!strlen($key)) { return $array; } $offset = $this->_queryKeyBracketOffset($key); if ($offset === false) { $name = $key; } else { $name = substr($key, 0, $offset); } if (!strlen($name)) { return $array; } if (!$offset) { // named value $array[$name] = $value; } else { // array $brackets = substr($key, $offset); if (!isset($array[$name])) { $array[$name] = null; } $array[$name] = $this->_queryArrayByBrackets( $brackets, $value, $array[$name] ); } return $array; } /** * Parse a key-buffer to place value in array * * @param string $buffer to consume all keys from * @param string $value to be set/add * @param array $array to traverse and set/add value in * * @throws Exception * @return array */ private function _queryArrayByBrackets($buffer, $value, array $array = null) { $entry = &$array; for ($iteration = 0; strlen($buffer); $iteration++) { $open = $this->_queryKeyBracketOffset($buffer); if ($open !== 0) { // Opening bracket [ must exist at offset 0, if not, there is // no bracket to parse and the value dropped. // if this happens in the first iteration, this is flawed, see // as well the second exception below. if ($iteration) { break; } // @codeCoverageIgnoreStart throw new Exception( 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . 'Opening bracket [ must exist at offset 0' ); // @codeCoverageIgnoreEnd } $close = strpos($buffer, ']', 1); if (!$close) { // this error condition should never be reached as this is a // private method and bracket pairs are checked beforehand. // See as well the first exception for the opening bracket. // @codeCoverageIgnoreStart throw new Exception( 'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . 'Closing bracket ] must exist, not found' ); // @codeCoverageIgnoreEnd } $index = substr($buffer, 1, $close - 1); if (strlen($index)) { $entry = &$entry[$index]; } else { if (!is_array($entry)) { $entry = array(); } $entry[] = &$new; $entry = &$new; unset($new); } $buffer = substr($buffer, $close + 1); } $entry = $value; return $array; } /** * Query-key has brackets ("...[]") * * @param string $key query-key * * @return bool|int offset of opening bracket, false if no brackets */ private function _queryKeyBracketOffset($key) { if (false !== $open = strpos($key, '[') and false === strpos($key, ']', $open + 1) ) { $open = false; } return $open; } /** * Sets the query string to the specified variable in the query string. * * @param array $array (name => value) array * * @return $this */ public function setQueryVariables(array $array) { if (!$array) { $this->_query = false; } else { $this->_query = $this->buildQuery( $array, $this->getOption(self::OPTION_SEPARATOR_OUTPUT) ); } return $this; } /** * Sets the specified variable in the query string. * * @param string $name variable name * @param mixed $value variable value * * @return $this */ public function setQueryVariable($name, $value) { $array = $this->getQueryVariables(); $array[$name] = $value; $this->setQueryVariables($array); return $this; } /** * Removes the specified variable from the query string. * * @param string $name a query string variable, e.g. "foo" in "?foo=1" * * @return void */ public function unsetQueryVariable($name) { $array = $this->getQueryVariables(); unset($array[$name]); $this->setQueryVariables($array); } /** * Returns a string representation of this URL. * * @return string */ public function getURL() { // See RFC 3986, section 5.3 $url = ''; if ($this->_scheme !== false) { $url .= $this->_scheme . ':'; } $authority = $this->getAuthority(); if ($authority === false && strtolower($this->_scheme) === 'file') { $authority = ''; } $url .= $this->_buildAuthorityAndPath($authority, $this->_path); if ($this->_query !== false) { $url .= '?' . $this->_query; } if ($this->_fragment !== false) { $url .= '#' . $this->_fragment; } return $url; } /** * Put authority and path together, wrapping authority * into proper separators/terminators. * * @param string|bool $authority authority * @param string $path path * * @return string */ private function _buildAuthorityAndPath($authority, $path) { if ($authority === false) { return $path; } $terminator = ($path !== '' && $path[0] !== '/') ? '/' : ''; return '//' . $authority . $terminator . $path; } /** * Returns a string representation of this URL. * * @return string * @link https://php.net/language.oop5.magic#object.tostring */ public function __toString() { return $this->getURL(); } /** * Returns a normalized string representation of this URL. This is useful * for comparison of URLs. * * @return string */ public function getNormalizedURL() { $url = clone $this; $url->normalize(); return $url->getUrl(); } /** * Normalizes the URL * * See RFC 3986, Section 6. Normalization and Comparison * * @link https://tools.ietf.org/html/rfc3986#section-6 * * @return void */ public function normalize() { // See RFC 3986, section 6 // Scheme is case-insensitive if ($this->_scheme) { $this->_scheme = strtolower($this->_scheme); } // Hostname is case-insensitive if ($this->_host) { $this->_host = strtolower($this->_host); } // Remove default port number for known schemes (RFC 3986, section 6.2.3) if ('' === $this->_port || $this->_port && $this->_scheme && $this->_port == getservbyname($this->_scheme, 'tcp') ) { $this->_port = false; } // Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1) // Normalize percentage-encoded unreserved characters (section 6.2.2.2) $fields = array(&$this->_userinfo, &$this->_host, &$this->_path, &$this->_query, &$this->_fragment); foreach ($fields as &$field) { if ($field !== false) { $field = $this->_normalize("$field"); } } unset($field); // Path segment normalization (RFC 3986, section 6.2.2.3) $this->_path = self::removeDotSegments($this->_path); // Scheme based normalization (RFC 3986, section 6.2.3) if (false !== $this->_host && '' === $this->_path) { $this->_path = '/'; } // path should start with '/' if there is authority (section 3.3.) if (strlen($this->getAuthority()) && strlen($this->_path) && $this->_path[0] !== '/' ) { $this->_path = '/' . $this->_path; } } /** * Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1) * Normalize percentage-encoded unreserved characters (section 6.2.2.2) * * @param string|array $mixed string or array of strings to normalize * * @return string|array * @see normalize * @see _normalizeCallback() */ private function _normalize($mixed) { return preg_replace_callback( '((?:%[0-9a-fA-Z]{2})+)', array($this, '_normalizeCallback'), $mixed ); } /** * Callback for _normalize() of %XX percentage-encodings * * @param array $matches as by preg_replace_callback * * @return string * @see normalize * @see _normalize * @SuppressWarnings(PHPMD.UnusedPrivateMethod) */ private function _normalizeCallback($matches) { return self::urlencode(urldecode($matches[0])); } /** * Returns whether this instance represents an absolute URL. * * @return bool */ public function isAbsolute() { return (bool) $this->_scheme; } /** * Returns an Net_URL2 instance representing an absolute URL relative to * this URL. * * @param Net_URL2|string $reference relative URL * * @throws Exception * @return $this */ public function resolve($reference) { if (!$reference instanceof Net_URL2) { $reference = new self($reference); } if (!$reference->_isFragmentOnly() && !$this->isAbsolute()) { throw new Exception( 'Base-URL must be absolute if reference is not fragment-only' ); } // A non-strict parser may ignore a scheme in the reference if it is // identical to the base URI's scheme. if (!$this->getOption(self::OPTION_STRICT) && $reference->_scheme == $this->_scheme ) { $reference->_scheme = false; } $target = new self(''); if ($reference->_scheme !== false) { $target->_scheme = $reference->_scheme; $target->setAuthority($reference->getAuthority()); $target->_path = self::removeDotSegments($reference->_path); $target->_query = $reference->_query; } else { $authority = $reference->getAuthority(); if ($authority !== false) { $target->setAuthority($authority); $target->_path = self::removeDotSegments($reference->_path); $target->_query = $reference->_query; } else { if ($reference->_path == '') { $target->_path = $this->_path; if ($reference->_query !== false) { $target->_query = $reference->_query; } else { $target->_query = $this->_query; } } else { if (substr($reference->_path, 0, 1) == '/') { $target->_path = self::removeDotSegments($reference->_path); } else { // Merge paths (RFC 3986, section 5.2.3) if ($this->_host !== false && $this->_path == '') { $target->_path = '/' . $reference->_path; } else { $i = strrpos($this->_path, '/'); if ($i !== false) { $target->_path = substr($this->_path, 0, $i + 1); } $target->_path .= $reference->_path; } $target->_path = self::removeDotSegments($target->_path); } $target->_query = $reference->_query; } $target->setAuthority($this->getAuthority()); } $target->_scheme = $this->_scheme; } $target->_fragment = $reference->_fragment; return $target; } /** * URL is fragment-only * * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * @return bool */ private function _isFragmentOnly() { return ( $this->_fragment !== false && $this->_query === false && $this->_path === '' && $this->_port === false && $this->_host === false && $this->_userinfo === false && $this->_scheme === false ); } /** * Removes dots as described in RFC 3986, section 5.2.4, e.g. * "/foo/../bar/baz" => "/bar/baz" * * @param string $path a path * * @return string a path */ public static function removeDotSegments($path) { $path = (string) $path; $output = ''; // Make sure not to be trapped in an infinite loop due to a bug in this // method $loopLimit = 256; $j = 0; while ('' !== $path && $j++ < $loopLimit) { if (substr($path, 0, 2) === './') { // Step 2.A $path = substr($path, 2); } elseif (substr($path, 0, 3) === '../') { // Step 2.A $path = substr($path, 3); } elseif (substr($path, 0, 3) === '/./' || $path === '/.') { // Step 2.B $path = '/' . substr($path, 3); } elseif (substr($path, 0, 4) === '/../' || $path === '/..') { // Step 2.C $path = '/' . substr($path, 4); $i = strrpos($output, '/'); $output = $i === false ? '' : substr($output, 0, $i); } elseif ($path === '.' || $path === '..') { // Step 2.D $path = ''; } else { // Step 2.E $i = strpos($path, '/', $path[0] === '/'); if ($i === false) { $output .= $path; $path = ''; break; } $output .= substr($path, 0, $i); $path = substr($path, $i); } } if ($path !== '') { $message = sprintf( 'Unable to remove dot segments; hit loop limit %d (left: %s)', $j, var_export($path, true) ); trigger_error($message, E_USER_WARNING); } return $output; } /** * Percent-encodes all non-alphanumeric characters except these: _ . - ~ * Similar to PHP's rawurlencode(), except that it also encodes ~ in PHP * 5.2.x and earlier. * * @param string $string string to encode * * @return string */ public static function urlencode($string) { $encoded = rawurlencode($string); // This is only necessary in PHP < 5.3. $encoded = str_replace('%7E', '~', $encoded); return $encoded; } /** * Returns a Net_URL2 instance representing the canonical URL of the * currently executing PHP script. * * @throws Exception * @return string */ public static function getCanonical() { if (!isset($_SERVER['REQUEST_METHOD'])) { // ALERT - no current URL throw new Exception('Script was not called through a webserver'); } // Begin with a relative URL $url = new self($_SERVER['PHP_SELF']); $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; $url->_host = $_SERVER['SERVER_NAME']; $port = $_SERVER['SERVER_PORT']; if ($url->_scheme == 'http' && $port != 80 || $url->_scheme == 'https' && $port != 443 ) { $url->_port = $port; } return $url; } /** * Returns the URL used to retrieve the current request. * * @return string */ public static function getRequestedURL() { return self::getRequested()->getUrl(); } /** * Returns a Net_URL2 instance representing the URL used to retrieve the * current request. * * @throws Exception * @return $this */ public static function getRequested() { if (!isset($_SERVER['REQUEST_METHOD'])) { // ALERT - no current URL throw new Exception('Script was not called through a webserver'); } // Begin with a relative URL $url = new self($_SERVER['REQUEST_URI']); $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; // Set host and possibly port $url->setAuthority($_SERVER['HTTP_HOST']); return $url; } /** * Returns the value of the specified option. * * @param string $optionName The name of the option to retrieve * * @return mixed */ public function getOption($optionName) { return isset($this->_options[$optionName]) ? $this->_options[$optionName] : false; } /** * A simple version of http_build_query in userland. The encoded string is * percentage encoded according to RFC 3986. * * @param array $data An array, which has to be converted into * QUERY_STRING. Anything is possible. * @param string $separator Separator {@link self::OPTION_SEPARATOR_OUTPUT} * @param string $key For stacked values (arrays in an array). * * @return string */ protected function buildQuery(array $data, $separator, $key = null) { $query = array(); $drop_names = ( $this->_options[self::OPTION_DROP_SEQUENCE] === true && array_keys($data) === array_keys(array_values($data)) ); foreach ($data as $name => $value) { if ($this->getOption(self::OPTION_ENCODE_KEYS) === true) { $name = rawurlencode($name); } if ($key !== null) { if ($this->getOption(self::OPTION_USE_BRACKETS) === true) { $drop_names && $name = ''; $name = $key . '[' . $name . ']'; } else { $name = $key; } } if (is_array($value)) { $query[] = $this->buildQuery($value, $separator, $name); } else { $query[] = $name . '=' . rawurlencode($value); } } return implode($separator, $query); } /** * This method uses a regex to parse the url into the designated parts. * * @param string $url URL * * @return void * @uses self::$_scheme, self::setAuthority(), self::$_path, self::$_query, * self::$_fragment * @see __construct */ protected function parseUrl($url) { // The regular expression is copied verbatim from RFC 3986, appendix B. // The expression does not validate the URL but matches any string. preg_match( '(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)', $url, $matches ); // "path" is always present (possibly as an empty string); the rest // are optional. $this->_scheme = !empty($matches[1]) ? $matches[2] : false; $this->setAuthority(!empty($matches[3]) ? $matches[4] : false); $this->_path = $this->_encodeData($matches[5]); $this->_query = !empty($matches[6]) ? $this->_encodeData($matches[7]) : false ; $this->_fragment = !empty($matches[8]) ? $matches[9] : false; } /** * Encode characters that might have been forgotten to encode when passing * in an URL. Applied onto Userinfo, Path and Query. * * @param string $url URL * * @return string * @see parseUrl * @see setAuthority * @link https://pear.php.net/bugs/bug.php?id=20425 */ private function _encodeData($url) { return preg_replace_callback( '([\x-\x20\x22\x3C\x3E\x7F-\xFF]+)', array($this, '_encodeCallback'), $url ); } /** * callback for encoding character data * * @param array $matches Matches * * @return string * @see _encodeData * @SuppressWarnings(PHPMD.UnusedPrivateMethod) */ private function _encodeCallback(array $matches) { return rawurlencode($matches[0]); } } PKwL\a>MM(updraftplus/includes/PEAR/Net/Socket.phpnu[ * Chuck Hagenbuch * * @category Net * @package Net_Socket * @author Stig Bakken * @author Chuck Hagenbuch * @copyright 1997-2003 The PHP Group * @license http://www.php.net/license/2_02.txt PHP 2.02 * @version CVS: $Id: Socket.php 304428 2010-10-15 13:51:46Z clockwerx $ * @link http://pear.php.net/packages/Net_Socket */ if (!class_exists('PEAR')) require_once 'PEAR.php'; define('NET_SOCKET_READ', 1); define('NET_SOCKET_WRITE', 2); define('NET_SOCKET_ERROR', 4); /** * Generalized Socket class. * * @category Net * @package Net_Socket * @author Stig Bakken * @author Chuck Hagenbuch * @copyright 1997-2003 The PHP Group * @license http://www.php.net/license/2_02.txt PHP 2.02 * @link http://pear.php.net/packages/Net_Socket */ class Net_Socket extends PEAR { /** * Socket file pointer. * @var resource $fp */ var $fp = null; /** * Whether the socket is blocking. Defaults to true. * @var boolean $blocking */ var $blocking = true; /** * Whether the socket is persistent. Defaults to false. * @var boolean $persistent */ var $persistent = false; /** * The IP address to connect to. * @var string $addr */ var $addr = ''; /** * The port number to connect to. * @var integer $port */ var $port = 0; /** * Number of seconds to wait on socket connections before assuming * there's no more data. Defaults to no timeout. * @var integer $timeout */ var $timeout = false; /** * Number of bytes to read at a time in readLine() and * readAll(). Defaults to 2048. * @var integer $lineLength */ var $lineLength = 2048; /** * The string to use as a newline terminator. Usually "\r\n" or "\n". * @var string $newline */ var $newline = "\r\n"; /** * Connect to the specified port. If called when the socket is * already connected, it disconnects and connects again. * * @param string $addr IP address or host name. * @param integer $port TCP port number. * @param boolean $persistent (optional) Whether the connection is * persistent (kept open between requests * by the web server). * @param integer $timeout (optional) How long to wait for data. * @param array $options See options for stream_context_create. * * @access public * * @return boolean | PEAR_Error True on success or a PEAR_Error on failure. */ function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null) { if (defined('UPDRAFTPLUS_SSL_DISABLE_VERIFY_SSL')) { $ssl_disable_verify = UPDRAFTPLUS_SSL_DISABLE_VERIFY_SSL; } else { $ssl_disable_verify = UpdraftPlus_Options::get_updraft_option('updraft_ssl_disableverify', false); } if (is_resource($this->fp)) { @fclose($this->fp); $this->fp = null; } if (!$addr) { return $this->raiseError('$addr cannot be empty'); } elseif (strspn($addr, '.0123456789') == strlen($addr) || strstr($addr, '/') !== false) { $this->addr = $addr; } else { $this->addr = @gethostbyname($addr); } $this->port = $port % 65536; if ($persistent !== null) { $this->persistent = $persistent; } if ($timeout !== null) { $this->timeout = $timeout; } $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; $errno = 0; $errstr = ''; $old_track_errors = @ini_set('track_errors', 1); //Check if Options are set and sslverify is true if so set options so that stream context can be used to disable ssl if (!$options && $ssl_disable_verify){ $options = 1; } if ($options && function_exists('stream_context_create')) { if ($this->timeout) { $timeout = $this->timeout; } else { $timeout = 100; } if ($ssl_disable_verify){ if (is_array($options)) { if (empty($options['ssl'])) { $options['ssl'] = array( 'verify_peer' => false, 'verify_peer_name' => false, ); } else { $options['ssl']['verify_peer'] = false; $options['ssl']['verify_peer_name'] = false; } } else { $options = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, ) ); } } $context = stream_context_create($options); // Since PHP 5 fsockopen doesn't allow context specification if (function_exists('stream_socket_client')) { $flags = STREAM_CLIENT_CONNECT; if ($this->persistent) { $flags = STREAM_CLIENT_PERSISTENT; } $addr = $this->addr . ':' . $this->port; $fp = stream_socket_client($addr, $errno, $errstr, $timeout, $flags, $context); } else { $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout, $context); } } else { if ($this->timeout) { $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout); } else { $fp = @$openfunc($this->addr, $this->port, $errno, $errstr); } } if (!$fp) { // @codingStandardsIgnoreLine if ($errno == 0 && !strlen($errstr) && isset($php_errormsg)) { // @codingStandardsIgnoreLine $errstr = $php_errormsg; } @ini_set('track_errors', $old_track_errors); return $this->raiseError($errstr, $errno); } @ini_set('track_errors', $old_track_errors); $this->fp = $fp; return $this->setBlocking($this->blocking); } /** * Disconnects from the peer, closes the socket. * * @access public * @return mixed true on success or a PEAR_Error instance otherwise */ function disconnect() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } @fclose($this->fp); $this->fp = null; return true; } /** * Set the newline character/sequence to use. * * @param string $newline Newline character(s) * @return boolean True */ function setNewline($newline) { $this->newline = $newline; return true; } /** * Find out if the socket is in blocking mode. * * @access public * @return boolean The current blocking mode. */ function isBlocking() { return $this->blocking; } /** * Sets whether the socket connection should be blocking or * not. A read call to a non-blocking socket will return immediately * if there is no data available, whereas it will block until there * is data for blocking sockets. * * @param boolean $mode True for blocking sockets, false for nonblocking. * * @access public * @return mixed true on success or a PEAR_Error instance otherwise */ function setBlocking($mode) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $this->blocking = $mode; stream_set_blocking($this->fp, (int)$this->blocking); return true; } /** * Sets the timeout value on socket descriptor, * expressed in the sum of seconds and microseconds * * @param integer $seconds Seconds. * @param integer $microseconds Microseconds. * * @access public * @return mixed true on success or a PEAR_Error instance otherwise */ function setTimeout($seconds, $microseconds) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } return socket_set_timeout($this->fp, $seconds, $microseconds); } /** * Sets the file buffering size on the stream. * See php's stream_set_write_buffer for more information. * * @param integer $size Write buffer size. * * @access public * @return mixed on success or an PEAR_Error object otherwise */ function setWriteBuffer($size) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $returned = stream_set_write_buffer($this->fp, $size); if ($returned == 0) { return true; } return $this->raiseError('Cannot set write buffer.'); } /** * Returns information about an existing socket resource. * Currently returns four entries in the result array: * *

* timed_out (bool) - The socket timed out waiting for data
* blocked (bool) - The socket was blocked
* eof (bool) - Indicates EOF event
* unread_bytes (int) - Number of bytes left in the socket buffer
*

* * @access public * @return mixed Array containing information about existing socket * resource or a PEAR_Error instance otherwise */ function getStatus() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } return socket_get_status($this->fp); } /** * Get a specified line of data * * @param int $size ?? * * @access public * @return $size bytes of data from the socket, or a PEAR_Error if * not connected. */ function gets($size = null) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } if (is_null($size)) { return @fgets($this->fp); } else { return @fgets($this->fp, $size); } } /** * Read a specified amount of data. This is guaranteed to return, * and has the added benefit of getting everything in one fread() * chunk; if you know the size of the data you're getting * beforehand, this is definitely the way to go. * * @param integer $size The number of bytes to read from the socket. * * @access public * @return $size bytes of data from the socket, or a PEAR_Error if * not connected. */ function read($size) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } return @fread($this->fp, $size); } /** * Write a specified amount of data. * * @param string $data Data to write. * @param integer $blocksize Amount of data to write at once. * NULL means all at once. * * @access public * @return mixed If the socket is not connected, returns an instance of * PEAR_Error * If the write succeeds, returns the number of bytes written * If the write fails, returns false. */ function write($data, $blocksize = null) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } if (is_null($blocksize) && !OS_WINDOWS) { return @fwrite($this->fp, $data); } else { if (is_null($blocksize)) { $blocksize = 1024; } $pos = 0; $size = strlen($data); while ($pos < $size) { $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); if (!$written) { return $written; } $pos += $written; } return $pos; } } /** * Write a line of data to the socket, followed by a trailing newline. * * @param string $data Data to write * * @access public * @return mixed fputs result, or an error */ function writeLine($data) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } return fwrite($this->fp, $data . $this->newline); } /** * Tests for end-of-file on a socket descriptor. * * Also returns true if the socket is disconnected. * * @access public * @return bool */ function eof() { return (!is_resource($this->fp) || feof($this->fp)); } /** * Reads a byte of data * * @access public * @return 1 byte of data from the socket, or a PEAR_Error if * not connected. */ function readByte() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } return ord(@fread($this->fp, 1)); } /** * Reads a word of data * * @access public * @return 1 word of data from the socket, or a PEAR_Error if * not connected. */ function readWord() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $buf = @fread($this->fp, 2); return (ord($buf[0]) + (ord($buf[1]) << 8)); } /** * Reads an int of data * * @access public * @return integer 1 int of data from the socket, or a PEAR_Error if * not connected. */ function readInt() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $buf = @fread($this->fp, 4); return (ord($buf[0]) + (ord($buf[1]) << 8) + (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); } /** * Reads a zero-terminated string of data * * @access public * @return string, or a PEAR_Error if * not connected. */ function readString() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $string = ''; while (($char = @fread($this->fp, 1)) != "\x00") { $string .= $char; } return $string; } /** * Reads an IP Address and returns it in a dot formatted string * * @access public * @return Dot formatted string, or a PEAR_Error if * not connected. */ function readIPAddress() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $buf = @fread($this->fp, 4); return sprintf('%d.%d.%d.%d', ord($buf[0]), ord($buf[1]), ord($buf[2]), ord($buf[3])); } /** * Read until either the end of the socket or a newline, whichever * comes first. Strips the trailing newline from the returned data. * * @access public * @return All available data up to a newline, without that * newline, or until the end of the socket, or a PEAR_Error if * not connected. */ function readLine() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $line = ''; $timeout = time() + $this->timeout; while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { $line .= @fgets($this->fp, $this->lineLength); if (substr($line, -1) == "\n") { return rtrim($line, $this->newline); } } return $line; } /** * Read until the socket closes, or until there is no more data in * the inner PHP buffer. If the inner buffer is empty, in blocking * mode we wait for at least 1 byte of data. Therefore, in * blocking mode, if there is no data at all to be read, this * function will never exit (unless the socket is closed on the * remote end). * * @access public * * @return string All data until the socket closes, or a PEAR_Error if * not connected. */ function readAll() { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $data = ''; while (!feof($this->fp)) { $data .= @fread($this->fp, $this->lineLength); } return $data; } /** * Runs the equivalent of the select() system call on the socket * with a timeout specified by tv_sec and tv_usec. * * @param integer $state Which of read/write/error to check for. * @param integer $tv_sec Number of seconds for timeout. * @param integer $tv_usec Number of microseconds for timeout. * * @access public * @return False if select fails, integer describing which of read/write/error * are ready, or PEAR_Error if not connected. */ function select($state, $tv_sec, $tv_usec = 0) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } $read = null; $write = null; $except = null; if ($state & NET_SOCKET_READ) { $read[] = $this->fp; } if ($state & NET_SOCKET_WRITE) { $write[] = $this->fp; } if ($state & NET_SOCKET_ERROR) { $except[] = $this->fp; } if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) { return false; } $result = 0; if (count($read)) { $result |= NET_SOCKET_READ; } if (count($write)) { $result |= NET_SOCKET_WRITE; } if (count($except)) { $result |= NET_SOCKET_ERROR; } return $result; } /** * Turns encryption on/off on a connected socket. * * @param bool $enabled Set this parameter to true to enable encryption * and false to disable encryption. * @param integer $type Type of encryption. See stream_socket_enable_crypto() * for values. * * @see http://se.php.net/manual/en/function.stream-socket-enable-crypto.php * @access public * @return false on error, true on success and 0 if there isn't enough data * and the user should try again (non-blocking sockets only). * A PEAR_Error object is returned if the socket is not * connected */ function enableCrypto($enabled, $type) { if (version_compare(phpversion(), "5.1.0", ">=")) { if (!is_resource($this->fp)) { return $this->raiseError('not connected'); } return @stream_socket_enable_crypto($this->fp, $enabled, $type); } else { $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0'; return $this->raiseError($msg); } } } PKwL\b;;%updraftplus/includes/PEAR/Net/URL.phpnu[ | // +-----------------------------------------------------------------------+ // // $Id: URL.php,v 1.49 2007/06/28 14:43:07 davidc Exp $ // // Net_URL Class class Net_URL { var $options = array('encode_query_keys' => false); /** * Full url * @var string */ var $url; /** * Protocol * @var string */ var $protocol; /** * Username * @var string */ var $username; /** * Password * @var string */ var $password; /** * Host * @var string */ var $host; /** * Port * @var integer */ var $port; /** * Path * @var string */ var $path; /** * Query string * @var array */ var $querystring; /** * Anchor * @var string */ var $anchor; /** * Whether to use [] * @var bool */ var $useBrackets; /** * PHP5 Constructor * * Parses the given url and stores the various parts * Defaults are used in certain cases * * @param string $url Optional URL * @param bool $useBrackets Whether to use square brackets when * multiple querystrings with the same name * exist */ public function __construct($url = null, $useBrackets = true) { $this->url = $url; $this->useBrackets = $useBrackets; $this->initialize(); } function initialize() { $HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; $this->user = ''; $this->pass = ''; $this->host = ''; $this->port = 80; $this->path = ''; $this->querystring = array(); $this->anchor = ''; // Only use defaults if not an absolute URL given if (!preg_match('/^[a-z0-9]+:\/\//i', $this->url)) { $this->protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http'); /** * Figure out host/port */ if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) && preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) { $host = $matches[1]; if (!empty($matches[3])) { $port = $matches[3]; } else { $port = $this->getStandardPort($this->protocol); } } $this->user = ''; $this->pass = ''; $this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost'); $this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol)); $this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/'; $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null; $this->anchor = ''; } // Parse the url and store the various parts if (!empty($this->url)) { $urlinfo = parse_url($this->url); // Default querystring $this->querystring = array(); foreach ($urlinfo as $key => $value) { switch ($key) { case 'scheme': $this->protocol = $value; $this->port = $this->getStandardPort($value); break; case 'user': case 'pass': case 'host': case 'port': $this->$key = $value; break; case 'path': if ($value[0] == '/') { $this->path = $value; } else { $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path); $this->path = sprintf('%s/%s', $path, $value); } break; case 'query': $this->querystring = $this->_parseRawQueryString($value); break; case 'fragment': $this->anchor = $value; break; } } } } /** * Returns full url * * @return string Full url * @access public */ function getURL() { $querystring = $this->getQueryString(); $this->url = $this->protocol . '://' . $this->user . (!empty($this->pass) ? ':' : '') . $this->pass . (!empty($this->user) ? '@' : '') . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port) . $this->path . (!empty($querystring) ? '?' . $querystring : '') . (!empty($this->anchor) ? '#' . $this->anchor : ''); return $this->url; } /** * Adds or updates a querystring item (URL parameter). * Automatically encodes parameters with rawurlencode() if $preencoded * is false. * You can pass an array to $value, it gets mapped via [] in the URL if * $this->useBrackets is activated. * * @param string $name Name of item * @param string $value Value of item * @param bool $preencoded Whether value is urlencoded or not, default = not * @access public */ function addQueryString($name, $value, $preencoded = false) { if ($this->getOption('encode_query_keys')) { $name = rawurlencode($name); } if ($preencoded) { $this->querystring[$name] = $value; } else { $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value); } } /** * Removes a querystring item * * @param string $name Name of item * @access public */ function removeQueryString($name) { if ($this->getOption('encode_query_keys')) { $name = rawurlencode($name); } if (isset($this->querystring[$name])) { unset($this->querystring[$name]); } } /** * Sets the querystring to literally what you supply * * @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc * @access public */ function addRawQueryString($querystring) { $this->querystring = $this->_parseRawQueryString($querystring); } /** * Returns flat querystring * * @return string Querystring * @access public */ function getQueryString() { if (!empty($this->querystring)) { foreach ($this->querystring as $name => $value) { // Encode var name $name = rawurlencode($name); if (is_array($value)) { foreach ($value as $k => $v) { $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v); } } elseif (!is_null($value)) { $querystring[] = $name . '=' . $value; } else { $querystring[] = $name; } } $querystring = implode(ini_get('arg_separator.output'), $querystring); } else { $querystring = ''; } return $querystring; } /** * Parses raw querystring and returns an array of it * * @param string $querystring The querystring to parse * @return array An array of the querystring data * @access private */ function _parseRawQuerystring($querystring) { $parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY); $return = array(); foreach ($parts as $part) { if (strpos($part, '=') !== false) { $value = substr($part, strpos($part, '=') + 1); $key = substr($part, 0, strpos($part, '=')); } else { $value = null; $key = $part; } if (!$this->getOption('encode_query_keys')) { $key = rawurldecode($key); } if (preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) { $key = $matches[1]; $idx = $matches[2]; // Ensure is an array if (empty($return[$key]) || !is_array($return[$key])) { $return[$key] = array(); } // Add data if ($idx === '') { $return[$key][] = $value; } else { $return[$key][$idx] = $value; } } elseif (!$this->useBrackets AND !empty($return[$key])) { $return[$key] = (array)$return[$key]; $return[$key][] = $value; } else { $return[$key] = $value; } } return $return; } /** * Resolves //, ../ and ./ from a path and returns * the result. Eg: * * /foo/bar/../boo.php => /foo/boo.php * /foo/bar/../../boo.php => /boo.php * /foo/bar/.././/boo.php => /foo/boo.php * * This method can also be called statically. * * @param string $path URL path to resolve * @return string The result */ function resolvePath($path) { $path = explode('/', str_replace('//', '/', $path)); for ($i=0; $i 1 OR ($i == 1 AND $path[0] != '') ) ) { unset($path[$i]); unset($path[$i-1]); $path = array_values($path); $i -= 2; } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') { unset($path[$i]); $path = array_values($path); $i--; } else { continue; } } return implode('/', $path); } /** * Returns the standard port number for a protocol * * @param string $scheme The protocol to lookup * @return integer Port number or NULL if no scheme matches * * @author Philippe Jausions */ function getStandardPort($scheme) { switch (strtolower($scheme)) { case 'http': return 80; case 'https': return 443; case 'ftp': return 21; case 'imap': return 143; case 'imaps': return 993; case 'pop3': return 110; case 'pop3s': return 995; default: return null; } } /** * Forces the URL to a particular protocol * * @param string $protocol Protocol to force the URL to * @param integer $port Optional port (standard port is used by default) */ function setProtocol($protocol, $port = null) { $this->protocol = $protocol; $this->port = is_null($port) ? $this->getStandardPort($protocol) : $port; } /** * Set an option * * This function set an option * to be used thorough the script. * * @access public * @param string $optionName The optionname to set * @param string $value The value of this option. */ function setOption($optionName, $value) { if (!array_key_exists($optionName, $this->options)) { return false; } $this->options[$optionName] = $value; $this->initialize(); } /** * Get an option * * This function gets an option * from the $this->options array * and return it's value. * * @access public * @param string $opionName The name of the option to retrieve * @see $this->options */ function getOption($optionName) { if (!isset($this->options[$optionName])) { return false; } return $this->options[$optionName]; } } ?> PKwL\ q66,updraftplus/includes/PEAR/PEAR/Exception.phpnu[ * @author Hans Lellelid * @author Bertrand Mansion * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License * @link http://pear.php.net/package/PEAR * @since File available since Release 1.3.3 */ /** * Base PEAR_Exception Class * * 1) Features: * * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception)) * - Definable triggers, shot when exceptions occur * - Pretty and informative error messages * - Added more context info available (like class, method or cause) * - cause can be a PEAR_Exception or an array of mixed * PEAR_Exceptions/PEAR_ErrorStack warnings * - callbacks for specific exception classes and their children * * 2) Ideas: * * - Maybe a way to define a 'template' for the output * * 3) Inherited properties from PHP Exception Class: * * protected $message * protected $code * protected $line * protected $file * private $trace * * 4) Inherited methods from PHP Exception Class: * * __clone * __construct * getMessage * getCode * getFile * getLine * getTraceSafe * getTraceSafeAsString * __toString * * 5) Usage example * * * require_once 'PEAR/Exception.php'; * * class Test { * function foo() { * throw new PEAR_Exception('Error Message', ERROR_CODE); * } * } * * function myLogger($pear_exception) { * echo $pear_exception->getMessage(); * } * // each time a exception is thrown the 'myLogger' will be called * // (its use is completely optional) * PEAR_Exception::addObserver('myLogger'); * $test = new Test; * try { * $test->foo(); * } catch (PEAR_Exception $e) { * print $e; * } * * * @category pear * @package PEAR * @author Tomas V.V.Cox * @author Hans Lellelid * @author Bertrand Mansion * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License * @version Release: 1.10.1 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.3.3 * */ class PEAR_Exception extends Exception { const OBSERVER_PRINT = -2; const OBSERVER_TRIGGER = -4; const OBSERVER_DIE = -8; protected $cause; private static $_observers = array(); private static $_uniqueid = 0; private $_trace; /** * Supported signatures: * - PEAR_Exception(string $message); * - PEAR_Exception(string $message, int $code); * - PEAR_Exception(string $message, Exception $cause); * - PEAR_Exception(string $message, Exception $cause, int $code); * - PEAR_Exception(string $message, PEAR_Error $cause); * - PEAR_Exception(string $message, PEAR_Error $cause, int $code); * - PEAR_Exception(string $message, array $causes); * - PEAR_Exception(string $message, array $causes, int $code); * @param string exception message * @param int|Exception|PEAR_Error|array|null exception cause * @param int|null exception code or null * @throws PEAR_Exception if PEAR_Error class not exists or Exception not type of PEAR_Error */ public function __construct($message, $p2 = null, $p3 = null) { if (is_int($p2)) { $code = $p2; $this->cause = null; } elseif (is_object($p2) || is_array($p2)) { // using is_object allows both Exception and PEAR_Error if (is_object($p2) && !($p2 instanceof Exception)) { if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) { throw new PEAR_Exception('exception cause must be Exception, ' . 'array, or PEAR_Error'); } } $code = $p3; if (is_array($p2) && isset($p2['message'])) { // fix potential problem of passing in a single warning $p2 = array($p2); } $this->cause = $p2; } else { $code = null; $this->cause = null; } parent::__construct($message, $code); $this->signal(); } /** * @param mixed $callback - A valid php callback, see php func is_callable() * - A PEAR_Exception::OBSERVER_* constant * - An array(const PEAR_Exception::OBSERVER_*, * mixed $options) * @param string $label The name of the observer. Use this if you want * to remove it later with removeObserver() */ public static function addObserver($callback, $label = 'default') { self::$_observers[$label] = $callback; } public static function removeObserver($label = 'default') { unset(self::$_observers[$label]); } /** * @return int unique identifier for an observer */ public static function getUniqueId() { return self::$_uniqueid++; } private function signal() { foreach (self::$_observers as $func) { if (is_callable($func)) { call_user_func($func, $this); continue; } settype($func, 'array'); switch ($func[0]) { case self::OBSERVER_PRINT : $f = (isset($func[1])) ? $func[1] : '%s'; printf($f, $this->getMessage()); break; case self::OBSERVER_TRIGGER : $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE; trigger_error($this->getMessage(), $f); break; case self::OBSERVER_DIE : $f = (isset($func[1])) ? $func[1] : '%s'; die(printf($f, $this->getMessage())); break; default: trigger_error('invalid observer type', E_USER_WARNING); } } } /** * Return specific error information that can be used for more detailed * error messages or translation. * * This method may be overridden in child exception classes in order * to add functionality not present in PEAR_Exception and is a placeholder * to define API * * The returned array must be an associative array of parameter => value like so: *
     * array('name' => $name, 'context' => array(...))
     * 
* @return array */ public function getErrorData() { return array(); } /** * Returns the exception that caused this exception to be thrown * @access public * @return Exception|array The context of the exception */ public function getCause() { return $this->cause; } /** * Function must be public to call on caused exceptions * @param array */ public function getCauseMessage(&$causes) { $trace = $this->getTraceSafe(); $cause = array('class' => get_class($this), 'message' => $this->message, 'file' => 'unknown', 'line' => 'unknown'); if (isset($trace[0])) { if (isset($trace[0]['file'])) { $cause['file'] = $trace[0]['file']; $cause['line'] = $trace[0]['line']; } } $causes[] = $cause; if ($this->cause instanceof PEAR_Exception) { $this->cause->getCauseMessage($causes); } elseif ($this->cause instanceof Exception) { $causes[] = array('class' => get_class($this->cause), 'message' => $this->cause->getMessage(), 'file' => $this->cause->getFile(), 'line' => $this->cause->getLine()); } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) { $causes[] = array('class' => get_class($this->cause), 'message' => $this->cause->getMessage(), 'file' => 'unknown', 'line' => 'unknown'); } elseif (is_array($this->cause)) { foreach ($this->cause as $cause) { if ($cause instanceof PEAR_Exception) { $cause->getCauseMessage($causes); } elseif ($cause instanceof Exception) { $causes[] = array('class' => get_class($cause), 'message' => $cause->getMessage(), 'file' => $cause->getFile(), 'line' => $cause->getLine()); } elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) { $causes[] = array('class' => get_class($cause), 'message' => $cause->getMessage(), 'file' => 'unknown', 'line' => 'unknown'); } elseif (is_array($cause) && isset($cause['message'])) { // PEAR_ErrorStack warning $causes[] = array( 'class' => $cause['package'], 'message' => $cause['message'], 'file' => isset($cause['context']['file']) ? $cause['context']['file'] : 'unknown', 'line' => isset($cause['context']['line']) ? $cause['context']['line'] : 'unknown', ); } } } } public function getTraceSafe() { if (!isset($this->_trace)) { $this->_trace = $this->getTrace(); if (empty($this->_trace)) { $backtrace = debug_backtrace(); $this->_trace = array($backtrace[count($backtrace)-1]); } } return $this->_trace; } public function getErrorClass() { $trace = $this->getTraceSafe(); return $trace[0]['class']; } public function getErrorMethod() { $trace = $this->getTraceSafe(); return $trace[0]['function']; } public function __toString() { if (isset($_SERVER['REQUEST_URI'])) { return $this->toHtml(); } return $this->toText(); } public function toHtml() { $trace = $this->getTraceSafe(); $causes = array(); $this->getCauseMessage($causes); $html = '' . "\n"; foreach ($causes as $i => $cause) { $html .= '\n"; } $html .= '' . "\n" . '' . '' . '' . "\n"; foreach ($trace as $k => $v) { $html .= '' . '' . '' . "\n"; } $html .= '' . '' . '' . "\n" . '
' . str_repeat('-', $i) . ' ' . $cause['class'] . ': ' . htmlspecialchars($cause['message']) . ' in ' . $cause['file'] . ' ' . 'on line ' . $cause['line'] . '' . "
Exception trace
#FunctionLocation
' . $k . ''; if (!empty($v['class'])) { $html .= $v['class'] . $v['type']; } $html .= $v['function']; $args = array(); if (!empty($v['args'])) { foreach ($v['args'] as $arg) { if (is_null($arg)) $args[] = 'null'; elseif (is_array($arg)) $args[] = 'Array'; elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')'; elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false'; elseif (is_int($arg) || is_double($arg)) $args[] = $arg; else { $arg = (string)$arg; $str = htmlspecialchars(substr($arg, 0, 16)); if (strlen($arg) > 16) $str .= '…'; $args[] = "'" . $str . "'"; } } } $html .= '(' . implode(', ',$args) . ')' . '' . (isset($v['file']) ? $v['file'] : 'unknown') . ':' . (isset($v['line']) ? $v['line'] : 'unknown') . '
' . ($k+1) . '{main} 
'; return $html; } public function toText() { $causes = array(); $this->getCauseMessage($causes); $causeMsg = ''; foreach ($causes as $i => $cause) { $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': ' . $cause['message'] . ' in ' . $cause['file'] . ' on line ' . $cause['line'] . "\n"; } return $causeMsg . $this->getTraceAsString(); } }PKwL\)"updraftplus/includes/PEAR/PEAR.phpnu[ * @author Stig Bakken * @author Tomas V.V.Cox * @author Greg Beaver * @copyright 1997-2010 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License * @version CVS: $Id: PEAR.php 313023 2011-07-06 19:17:11Z dufuz $ * @link http://pear.php.net/package/PEAR * @since File available since Release 0.1 */ /**#@+ * ERROR constants */ define('PEAR_ERROR_RETURN', 1); define('PEAR_ERROR_PRINT', 2); define('PEAR_ERROR_TRIGGER', 4); define('PEAR_ERROR_DIE', 8); define('PEAR_ERROR_CALLBACK', 16); /** * WARNING: obsolete * @deprecated */ define('PEAR_ERROR_EXCEPTION', 32); /**#@-*/ define('PEAR_ZE2', (function_exists('version_compare') && version_compare(zend_version(), "2-dev", "ge"))); if (substr(PHP_OS, 0, 3) == 'WIN') { define('OS_WINDOWS', true); define('OS_UNIX', false); define('PEAR_OS', 'Windows'); } else { define('OS_WINDOWS', false); define('OS_UNIX', true); define('PEAR_OS', 'Unix'); // blatant assumption } $GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; $GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; $GLOBALS['_PEAR_destructor_object_list'] = array(); $GLOBALS['_PEAR_shutdown_funcs'] = array(); $GLOBALS['_PEAR_error_handler_stack'] = array(); /** * Base class for other PEAR classes. Provides rudimentary * emulation of destructors. * * If you want a destructor in your class, inherit PEAR and make a * destructor method called _yourclassname (same name as the * constructor, but with a "_" prefix). Also, in your constructor you * have to call the PEAR constructor: parent::_construct();. * The destructor method will be called without parameters. Note that * at in some SAPI implementations (such as Apache), any output during * the request shutdown (in which destructors are called) seems to be * discarded. If you need to get any debug information from your * destructor, use error_log(), syslog() or something similar. * * IMPORTANT! To use the emulated destructors you need to create the * objects by reference: $obj =& new PEAR_child; * * @category pear * @package PEAR * @author Stig Bakken * @author Tomas V.V. Cox * @author Greg Beaver * @copyright 1997-2006 The PHP Group * @license http://opensource.org/licenses/bsd-license.php New BSD License * @version Release: 1.9.4 * @link http://pear.php.net/package/PEAR * @see PEAR_Error * @since Class available since PHP 4.0.2 * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear */ class PEAR { /** * Whether to enable internal debug messages. * * @var bool * @access private */ var $_debug = false; /** * Default error mode for this object. * * @var int * @access private */ var $_default_error_mode = null; /** * Default error options used for this object when error mode * is PEAR_ERROR_TRIGGER. * * @var int * @access private */ var $_default_error_options = null; /** * Default error handler (callback) for this object, if error mode is * PEAR_ERROR_CALLBACK. * * @var string * @access private */ var $_default_error_handler = ''; /** * Which class to use for error objects. * * @var string * @access private */ var $_error_class = 'PEAR_Error'; /** * An array of expected errors. * * @var array * @access private */ var $_expected_errors = array(); /** * Constructor. Registers this object in * $_PEAR_destructor_object_list for destructor emulation if a * destructor object exists. * * @param string $error_class (optional) which class to use for * error objects, defaults to PEAR_Error. * @access public * @return self */ public function __construct($error_class = null) { $classname = strtolower(get_class($this)); if ($this->_debug) { print "PEAR constructor called, class=$classname\n"; } if ($error_class !== null) { $this->_error_class = $error_class; } while ($classname && strcasecmp($classname, "pear")) { $destructor = "_$classname"; if (method_exists($this, $destructor)) { global $_PEAR_destructor_object_list; $_PEAR_destructor_object_list[] = &$this; if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { register_shutdown_function("_PEAR_call_destructors"); $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; } break; } else { $classname = get_parent_class($classname); } } } /** * Destructor (the emulated type of...). Does nothing right now, * but is included for forward compatibility, so subclass * destructors should always call it. * * See the note in the class desciption about output from * destructors. * * @access public * @return void */ public function __destruct() { if ($this->_debug) { printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); } } /** * If you have a class that's mostly/entirely static, and you need static * properties, you can use this method to simulate them. Eg. in your method(s) * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); * You MUST use a reference, or they will not persist! * * @access public * @param string $class The calling classname, to prevent clashes * @param string $var The variable to retrieve. * @return mixed A reference to the variable. If not set it will be * auto initialised to NULL. */ static function &getStaticProperty($class, $var) { static $properties; if (!isset($properties[$class])) { $properties[$class] = array(); } if (!array_key_exists($var, $properties[$class])) { $properties[$class][$var] = null; } return $properties[$class][$var]; } /** * Use this function to register a shutdown method for static * classes. * * @access public * @param mixed $func The function name (or array of class/method) to call * @param mixed $args The arguments to pass to the function * @return void */ function registerShutdownFunc($func, $args = array()) { // if we are called statically, there is a potential // that no shutdown func is registered. Bug #6445 if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { register_shutdown_function("_PEAR_call_destructors"); $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; } $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); } /** * Tell whether a value is a PEAR error. * * @param mixed $data the value to test * @param int $code if $data is an error object, return true * only if $code is a string and * $obj->getMessage() == $code or * $code is an integer and $obj->getCode() == $code * @access public * @return bool true if parameter is an error */ static function isError($data, $code = null) { if (!is_a($data, 'PEAR_Error')) { return false; } if (is_null($code)) { return true; } elseif (is_string($code)) { return $data->getMessage() == $code; } return $data->getCode() == $code; } /** * Sets how errors generated by this object should be handled. * Can be invoked both in objects and statically. If called * statically, setErrorHandling sets the default behaviour for all * PEAR objects. If called in an object, setErrorHandling sets * the default behaviour for that object. * * @param int $mode * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. * * @param mixed $options * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). * * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected * to be the callback function or method. A callback * function is a string with the name of the function, a * callback method is an array of two elements: the element * at index 0 is the object, and the element at index 1 is * the name of the method to call in the object. * * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is * a printf format string used when printing the error * message. * * @access public * @return void * @see PEAR_ERROR_RETURN * @see PEAR_ERROR_PRINT * @see PEAR_ERROR_TRIGGER * @see PEAR_ERROR_DIE * @see PEAR_ERROR_CALLBACK * @see PEAR_ERROR_EXCEPTION * * @since PHP 4.0.5 */ function setErrorHandling($mode = null, $options = null) { if (isset($this) && is_a($this, 'PEAR')) { $setmode = &$this->_default_error_mode; $setoptions = &$this->_default_error_options; } else { $setmode = &$GLOBALS['_PEAR_default_error_mode']; $setoptions = &$GLOBALS['_PEAR_default_error_options']; } switch ($mode) { case PEAR_ERROR_EXCEPTION: case PEAR_ERROR_RETURN: case PEAR_ERROR_PRINT: case PEAR_ERROR_TRIGGER: case PEAR_ERROR_DIE: case null: $setmode = $mode; $setoptions = $options; break; case PEAR_ERROR_CALLBACK: $setmode = $mode; // class/object method callback if (is_callable($options)) { $setoptions = $options; } else { trigger_error("invalid error callback", E_USER_WARNING); } break; default: trigger_error("invalid error mode", E_USER_WARNING); break; } } /** * This method is used to tell which errors you expect to get. * Expected errors are always returned with error mode * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, * and this method pushes a new element onto it. The list of * expected errors are in effect until they are popped off the * stack with the popExpect() method. * * Note that this method can not be called statically * * @param mixed $code a single error code or an array of error codes to expect * * @return int the new depth of the "expected errors" stack * @access public */ function expectError($code = '*') { if (is_array($code)) { array_push($this->_expected_errors, $code); } else { array_push($this->_expected_errors, array($code)); } return count($this->_expected_errors); } /** * This method pops one element off the expected error codes * stack. * * @return array the list of error codes that were popped */ function popExpect() { return array_pop($this->_expected_errors); } /** * This method checks unsets an error code if available * * @param mixed error code * @return bool true if the error code was unset, false otherwise * @access private * @since PHP 4.3.0 */ function _checkDelExpect($error_code) { $deleted = false; foreach ($this->_expected_errors as $key => $error_array) { if (in_array($error_code, $error_array)) { unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); $deleted = true; } // clean up empty arrays if (0 == count($this->_expected_errors[$key])) { unset($this->_expected_errors[$key]); } } return $deleted; } /** * This method deletes all occurences of the specified element from * the expected error codes stack. * * @param mixed $error_code error code that should be deleted * @return mixed list of error codes that were deleted or error * @access public * @since PHP 4.3.0 */ function delExpect($error_code) { $deleted = false; if ((is_array($error_code) && (0 != count($error_code)))) { // $error_code is a non-empty array here; we walk through it trying // to unset all values foreach ($error_code as $key => $error) { $deleted = $this->_checkDelExpect($error) ? true : false; } return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME } elseif (!empty($error_code)) { // $error_code comes alone, trying to unset it if ($this->_checkDelExpect($error_code)) { return true; } return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME } // $error_code is empty return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME } /** * This method is a wrapper that returns an instance of the * configured error class with this object's default error * handling applied. If the $mode and $options parameters are not * specified, the object's defaults are used. * * @param mixed $message a text error message or a PEAR error object * * @param int $code a numeric error code (it is up to your class * to define these if you want to use codes) * * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. * * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter * specifies the PHP-internal error level (one of * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). * If $mode is PEAR_ERROR_CALLBACK, this * parameter specifies the callback function or * method. In other error modes this parameter * is ignored. * * @param string $userinfo If you need to pass along for example debug * information, this parameter is meant for that. * * @param string $error_class The returned error object will be * instantiated from this class, if specified. * * @param bool $skipmsg If true, raiseError will only pass error codes, * the error message parameter will be dropped. * * @access public * @return object a PEAR error object * @see PEAR::setErrorHandling * @since PHP 4.0.5 */ function &raiseError($message = null, $code = null, $mode = null, $options = null, $userinfo = null, $error_class = null, $skipmsg = false) { // The error is yet a PEAR error object if (is_object($message)) { $code = $message->getCode(); $userinfo = $message->getUserInfo(); $error_class = $message->getType(); $message->error_message_prefix = ''; $message = $message->getMessage(); } if ( isset($this) && isset($this->_expected_errors) && count($this->_expected_errors) > 0 && count($exp = end($this->_expected_errors)) ) { if ($exp[0] == "*" || (is_int(reset($exp)) && in_array($code, $exp)) || (is_string(reset($exp)) && in_array($message, $exp)) ) { $mode = PEAR_ERROR_RETURN; } } // No mode given, try global ones if ($mode === null) { // Class error handler if (isset($this) && isset($this->_default_error_mode)) { $mode = $this->_default_error_mode; $options = $this->_default_error_options; // Global error handler } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { $mode = $GLOBALS['_PEAR_default_error_mode']; $options = $GLOBALS['_PEAR_default_error_options']; } } if ($error_class !== null) { $ec = $error_class; } elseif (isset($this) && isset($this->_error_class)) { $ec = $this->_error_class; } else { $ec = 'PEAR_Error'; } if (intval(PHP_VERSION) < 5) { // little non-eval hack to fix bug #12147 include 'PEAR/FixPHP5PEARWarnings.php'; return $a; } if ($skipmsg) { $a = new $ec($code, $mode, $options, $userinfo); } else { $a = new $ec($message, $code, $mode, $options, $userinfo); } return $a; } /** * Simpler form of raiseError with fewer options. In most cases * message, code and userinfo are enough. * * @param mixed $message a text error message or a PEAR error object * * @param int $code a numeric error code (it is up to your class * to define these if you want to use codes) * * @param string $userinfo If you need to pass along for example debug * information, this parameter is meant for that. * * @access public * @return object a PEAR error object * @see PEAR::raiseError */ function &throwError($message = null, $code = null, $userinfo = null) { if (isset($this) && is_a($this, 'PEAR')) { $a = &$this->raiseError($message, $code, null, null, $userinfo); return $a; } $a = &PEAR::raiseError($message, $code, null, null, $userinfo); return $a; } function staticPushErrorHandling($mode, $options = null) { $stack = &$GLOBALS['_PEAR_error_handler_stack']; $def_mode = &$GLOBALS['_PEAR_default_error_mode']; $def_options = &$GLOBALS['_PEAR_default_error_options']; $stack[] = array($def_mode, $def_options); switch ($mode) { case PEAR_ERROR_EXCEPTION: case PEAR_ERROR_RETURN: case PEAR_ERROR_PRINT: case PEAR_ERROR_TRIGGER: case PEAR_ERROR_DIE: case null: $def_mode = $mode; $def_options = $options; break; case PEAR_ERROR_CALLBACK: $def_mode = $mode; // class/object method callback if (is_callable($options)) { $def_options = $options; } else { trigger_error("invalid error callback", E_USER_WARNING); } break; default: trigger_error("invalid error mode", E_USER_WARNING); break; } $stack[] = array($mode, $options); return true; } function staticPopErrorHandling() { $stack = &$GLOBALS['_PEAR_error_handler_stack']; $setmode = &$GLOBALS['_PEAR_default_error_mode']; $setoptions = &$GLOBALS['_PEAR_default_error_options']; array_pop($stack); list($mode, $options) = $stack[sizeof($stack) - 1]; array_pop($stack); switch ($mode) { case PEAR_ERROR_EXCEPTION: case PEAR_ERROR_RETURN: case PEAR_ERROR_PRINT: case PEAR_ERROR_TRIGGER: case PEAR_ERROR_DIE: case null: $setmode = $mode; $setoptions = $options; break; case PEAR_ERROR_CALLBACK: $setmode = $mode; // class/object method callback if (is_callable($options)) { $setoptions = $options; } else { trigger_error("invalid error callback", E_USER_WARNING); } break; default: trigger_error("invalid error mode", E_USER_WARNING); break; } return true; } /** * Push a new error handler on top of the error handler options stack. With this * you can easily override the actual error handler for some code and restore * it later with popErrorHandling. * * @param mixed $mode (same as setErrorHandling) * @param mixed $options (same as setErrorHandling) * * @return bool Always true * * @see PEAR::setErrorHandling */ function pushErrorHandling($mode, $options = null) { $stack = &$GLOBALS['_PEAR_error_handler_stack']; if (isset($this) && is_a($this, 'PEAR')) { $def_mode = &$this->_default_error_mode; $def_options = &$this->_default_error_options; } else { $def_mode = &$GLOBALS['_PEAR_default_error_mode']; $def_options = &$GLOBALS['_PEAR_default_error_options']; } $stack[] = array($def_mode, $def_options); if (isset($this) && is_a($this, 'PEAR')) { $this->setErrorHandling($mode, $options); } else { PEAR::setErrorHandling($mode, $options); } $stack[] = array($mode, $options); return true; } /** * Pop the last error handler used * * @return bool Always true * * @see PEAR::pushErrorHandling */ function popErrorHandling() { $stack = &$GLOBALS['_PEAR_error_handler_stack']; array_pop($stack); list($mode, $options) = $stack[sizeof($stack) - 1]; array_pop($stack); if (isset($this) && is_a($this, 'PEAR')) { $this->setErrorHandling($mode, $options); } else { PEAR::setErrorHandling($mode, $options); } return true; } /** * OS independant PHP extension load. Remember to take care * on the correct extension name for case sensitive OSes. * * @param string $ext The extension name * @return bool Success or not on the dl() call */ function loadExtension($ext) { if (extension_loaded($ext)) { return true; } // if either returns true dl() will produce a FATAL error, stop that if ( function_exists('dl') === false || ini_get('enable_dl') != 1 || ini_get('safe_mode') == 1 ) { return false; } if (OS_WINDOWS) { $suffix = '.dll'; } elseif (PHP_OS == 'HP-UX') { $suffix = '.sl'; } elseif (PHP_OS == 'AIX') { $suffix = '.a'; } elseif (PHP_OS == 'OSX') { $suffix = '.bundle'; } else { $suffix = '.so'; } return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); } } if (PEAR_ZE2) { include_once 'PEAR5.php'; } function _PEAR_call_destructors() { global $_PEAR_destructor_object_list; if (is_array($_PEAR_destructor_object_list) && sizeof($_PEAR_destructor_object_list)) { reset($_PEAR_destructor_object_list); if (PEAR_ZE2) { $destructLifoExists = PEAR5::getStaticProperty('PEAR', 'destructlifo'); } else { $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo'); } if ($destructLifoExists) { $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); } foreach ($_PEAR_destructor_object_list as $k => $objref) { $classname = get_class($objref); while ($classname) { $destructor = "_$classname"; if (method_exists($objref, $destructor)) { $objref->$destructor(); break; } else { $classname = get_parent_class($classname); } } } // Empty the object list to ensure that destructors are // not called more than once. $_PEAR_destructor_object_list = array(); } // Now call the shutdown functions if ( isset($GLOBALS['_PEAR_shutdown_funcs']) && is_array($GLOBALS['_PEAR_shutdown_funcs']) && !empty($GLOBALS['_PEAR_shutdown_funcs']) ) { foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { call_user_func_array($value[0], $value[1]); } } } /** * Standard PEAR error class for PHP 4 * * This class is supserseded by {@link PEAR_Exception} in PHP 5 * * @category pear * @package PEAR * @author Stig Bakken * @author Tomas V.V. Cox * @author Gregory Beaver * @copyright 1997-2006 The PHP Group * @license http://opensource.org/licenses/bsd-license.php New BSD License * @version Release: 1.9.4 * @link http://pear.php.net/manual/en/core.pear.pear-error.php * @see PEAR::raiseError(), PEAR::throwError() * @since Class available since PHP 4.0.2 */ class PEAR_Error { var $error_message_prefix = ''; var $mode = PEAR_ERROR_RETURN; var $level = E_USER_NOTICE; var $code = -1; var $message = ''; var $userinfo = ''; var $backtrace = null; /** * PEAR_Error constructor * * @param string $message message * * @param int $code (optional) error code * * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION * * @param mixed $options (optional) error level, _OR_ in the case of * PEAR_ERROR_CALLBACK, the callback function or object/method * tuple. * * @param string $userinfo (optional) additional user/debug info * * @access public * */ function __construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { if ($mode === null) { $mode = PEAR_ERROR_RETURN; } $this->message = $message; $this->code = $code; $this->mode = $mode; $this->userinfo = $userinfo; if (PEAR_ZE2) { $skiptrace = PEAR5::getStaticProperty('PEAR_Error', 'skiptrace'); } else { $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace'); } if (!$skiptrace) { $this->backtrace = debug_backtrace(); if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) { unset($this->backtrace[0]['object']); } } if ($mode & PEAR_ERROR_CALLBACK) { $this->level = E_USER_NOTICE; $this->callback = $options; } else { if ($options === null) { $options = E_USER_NOTICE; } $this->level = $options; $this->callback = null; } if ($this->mode & PEAR_ERROR_PRINT) { if (is_null($options) || is_int($options)) { $format = "%s"; } else { $format = $options; } printf($format, $this->getMessage()); } if ($this->mode & PEAR_ERROR_TRIGGER) { trigger_error($this->getMessage(), $this->level); } if ($this->mode & PEAR_ERROR_DIE) { $msg = $this->getMessage(); if (is_null($options) || is_int($options)) { $format = "%s"; if (substr($msg, -1) != "\n") { $msg .= "\n"; } } else { $format = $options; } die(sprintf($format, $msg)); } if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) { call_user_func($this->callback, $this); } if ($this->mode & PEAR_ERROR_EXCEPTION) { trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); eval('$e = new Exception($this->message, $this->code);throw($e);'); } } /** * Get the error mode from an error object. * * @return int error mode * @access public */ function getMode() { return $this->mode; } /** * Get the callback function/method from an error object. * * @return mixed callback function or object/method array * @access public */ function getCallback() { return $this->callback; } /** * Get the error message from an error object. * * @return string full error message * @access public */ function getMessage() { return ($this->error_message_prefix . $this->message); } /** * Get error code from an error object * * @return int error code * @access public */ function getCode() { return $this->code; } /** * Get the name of this error/exception. * * @return string error/exception name (type) * @access public */ function getType() { return get_class($this); } /** * Get additional user-supplied information. * * @return string user-supplied information * @access public */ function getUserInfo() { return $this->userinfo; } /** * Get additional debug information supplied by the application. * * @return string debug information * @access public */ function getDebugInfo() { return $this->getUserInfo(); } /** * Get the call backtrace from where the error was generated. * Supported with PHP 4.3.0 or newer. * * @param int $frame (optional) what frame to fetch * @return array Backtrace, or NULL if not available. * @access public */ function getBacktrace($frame = null) { if (defined('PEAR_IGNORE_BACKTRACE')) { return null; } if ($frame === null) { return $this->backtrace; } return $this->backtrace[$frame]; } function addUserInfo($info) { if (empty($this->userinfo)) { $this->userinfo = $info; } else { $this->userinfo .= " ** $info"; } } function __toString() { return $this->getMessage(); } /** * Make a string representation of this object. * * @return string a string with an object summary * @access public */ function toString() { $modes = array(); $levels = array(E_USER_NOTICE => 'notice', E_USER_WARNING => 'warning', E_USER_ERROR => 'error'); if ($this->mode & PEAR_ERROR_CALLBACK) { if (is_array($this->callback)) { $callback = (is_object($this->callback[0]) ? strtolower(get_class($this->callback[0])) : $this->callback[0]) . '::' . $this->callback[1]; } else { $callback = $this->callback; } return sprintf('[%s: message="%s" code=%d mode=callback '. 'callback=%s prefix="%s" info="%s"]', strtolower(get_class($this)), $this->message, $this->code, $callback, $this->error_message_prefix, $this->userinfo); } if ($this->mode & PEAR_ERROR_PRINT) { $modes[] = 'print'; } if ($this->mode & PEAR_ERROR_TRIGGER) { $modes[] = 'trigger'; } if ($this->mode & PEAR_ERROR_DIE) { $modes[] = 'die'; } if ($this->mode & PEAR_ERROR_RETURN) { $modes[] = 'return'; } return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. 'prefix="%s" info="%s"]', strtolower(get_class($this)), $this->message, $this->code, implode("|", $modes), $levels[$this->level], $this->error_message_prefix, $this->userinfo); } } /* * Local Variables: * mode: php * tab-width: 4 * c-basic-offset: 4 * End: */ PKwL\x??#updraftplus/includes/PEAR/PEAR5.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Internal; use WindowsAzure\Common\Internal\FilterableService; /** * This interface has all REST APIs provided by Windows Azure for Blob service. * * @category Microsoft * @package WindowsAzure\Blob\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd135733.aspx */ interface IBlob extends FilterableService { /** * Gets the properties of the Blob service. * * @param Models\BlobServiceOptions $options optional blob service options. * * @return WindowsAzure\Common\Models\GetServicePropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/hh452239.aspx */ public function getServiceProperties($options = null); /** * Sets the properties of the Blob service. * * @param ServiceProperties $serviceProperties new service properties * @param Models\BlobServiceOptions $options optional parameters * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/hh452235.aspx */ public function setServiceProperties($serviceProperties, $options = null); /** * Lists all of the containers in the given storage account. * * @param Models\ListContainersOptions $options optional parameters * * @return WindowsAzure\Blob\Models\ListContainersResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179352.aspx */ public function listContainers($options = null); /** * Creates a new container in the given storage account. * * @param string $container name * @param Models\CreateContainerOptions $options optional parameters * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179468.aspx */ public function createContainer($container, $options = null); /** * Creates a new container in the given storage account. * * @param string $container name * @param Models\DeleteContainerOptions $options optional parameters * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179408.aspx */ public function deleteContainer($container, $options = null); /** * Returns all properties and metadata on the container. * * @param string $container name * @param Models\BlobServiceOptions $options optional parameters * * @return Models\GetContainerPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179370.aspx */ public function getContainerProperties($container, $options = null); /** * Returns only user-defined metadata for the specified container. * * @param string $container name * @param Models\BlobServiceOptions $options optional parameters * * @return Models\GetContainerPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691976.aspx */ public function getContainerMetadata($container, $options = null); /** * Gets the access control list (ACL) and any container-level access policies * for the container. * * @param string $container name * @param Models\BlobServiceOptions $options optional parameters * * @return Models\GetContainerAclResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179469.aspx */ public function getContainerAcl($container, $options = null); /** * Sets the ACL and any container-level access policies for the container. * * @param string $container name * @param Models\ContainerAcl $acl access control list for container * @param Models\BlobServiceOptions $options optional parameters * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179391.aspx */ public function setContainerAcl($container, $acl, $options = null); /** * Sets metadata headers on the container. * * @param string $container name * @param array $metadata metadata key/value pair. * @param Models\SetContainerMetadataOptions $options optional parameters * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179362.aspx */ public function setContainerMetadata($container, $metadata, $options = null); /** * Lists all of the blobs in the given container. * * @param string $container name * @param Models\ListBlobsOptions $options optional parameters * * @return Models\ListBlobsResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd135734.aspx */ public function listBlobs($container, $options = null); /** * Creates a new page blob. Note that calling createPageBlob to create a page * blob only initializes the blob. * To add content to a page blob, call createBlobPages method. * * @param string $container name of the container * @param string $blob name of the blob * @param int $length specifies the maximum size for the * page blob, up to 1 TB. The page blob size must be aligned to a 512-byte * boundary. * @param Models\CreateBlobOptions $options optional parameters * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx */ public function createPageBlob($container, $blob, $length, $options = null); /** * Creates a new block blob or updates the content of an existing block blob. * Updating an existing block blob overwrites any existing metadata on the blob. * Partial updates are not supported with createBlockBlob; the content of the * existing blob is overwritten with the content of the new blob. To perform a * partial update of the content of a block blob, use the createBlockList method. * * @param string $container name of the container * @param string $blob name of the blob * @param string $content content of the blob * @param Models\CreateBlobOptions $options optional parameters * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx */ public function createBlockBlob($container, $blob, $content, $options = null); /** * Clears a range of pages from the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\PageRange $range Can be up to the value of the * blob's full size. * @param Models\CreateBlobPagesOptions $options optional parameters * * @return Models\CreateBlobPagesResult. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691975.aspx */ public function clearBlobPages($container, $blob, $range, $options = null); /** * Creates a range of pages to a page blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\PageRange $range Can be up to 4 MB in size * @param string $content the blob contents * @param Models\CreateBlobPagesOptions $options optional parameters * * @return Models\CreateBlobPagesResult. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691975.aspx */ public function createBlobPages($container, $blob, $range, $content, $options = null ); /** * Creates a new block to be committed as part of a block blob. * * @param string $container name of the container * @param string $blob name of the blob * @param string $blockId must be less than or equal to * 64 bytes in size. For a given blob, the length of the value specified for the * blockid parameter must be the same size for each block. * @param string $content the blob block contents * @param Models\CreateBlobBlockOptions $options optional parameters * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd135726.aspx */ public function createBlobBlock($container, $blob, $blockId, $content, $options = null ); /** * This method writes a blob by specifying the list of block IDs that make up the * blob. In order to be written as part of a blob, a block must have been * successfully written to the server in a prior createBlobBlock method. * * You can call Put Block List to update a blob by uploading only those blocks * that have changed, then committing the new and existing blocks together. * You can do this by specifying whether to commit a block from the committed * block list or from the uncommitted block list, or to commit the most recently * uploaded version of the block, whichever list it may belong to. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\BlockList $blockList the block list entries * @param Models\CommitBlobBlocksOptions $options optional parameters * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179467.aspx */ public function commitBlobBlocks($container, $blob, $blockList, $options = null); /** * Retrieves the list of blocks that have been uploaded as part of a block blob. * * There are two block lists maintained for a blob: * 1) Committed Block List: The list of blocks that have been successfully * committed to a given blob with commitBlobBlocks. * 2) Uncommitted Block List: The list of blocks that have been uploaded for a * blob using Put Block (REST API), but that have not yet been committed. * These blocks are stored in Windows Azure in association with a blob, but do * not yet form part of the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\ListBlobBlocksOptions $options optional parameters * * @return Models\ListBlobBlocksResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179400.aspx */ public function listBlobBlocks($container, $blob, $options = null); /** * Returns all properties and metadata on the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\GetBlobPropertiesOptions $options optional parameters * * @return Models\GetBlobPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179394.aspx */ public function getBlobProperties($container, $blob, $options = null); /** * Returns all properties and metadata on the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\GetBlobMetadataOptions $options optional parameters * * @return Models\GetBlobMetadataResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179350.aspx */ public function getBlobMetadata($container, $blob, $options = null); /** * Returns a list of active page ranges for a page blob. Active page ranges are * those that have been populated with data. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\ListPageBlobRangesOptions $options optional parameters * * @return Models\ListPageBlobRangesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691973.aspx */ public function listPageBlobRanges($container, $blob, $options = null); /** * Sets system properties defined for a blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\SetBlobPropertiesOptions $options optional parameters * * @return Models\SetBlobPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691966.aspx */ public function setBlobProperties($container, $blob, $options = null); /** * Sets metadata headers on the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param array $metadata key/value pair representation * @param Models\SetBlobMetadataOptions $options optional parameters * * @return Models\SetBlobMetadataResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179414.aspx */ public function setBlobMetadata($container, $blob, $metadata, $options = null); /** * Reads or downloads a blob from the system, including its metadata and * properties. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\GetBlobOptions $options optional parameters * * @return Models\GetBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179440.aspx */ public function getBlob($container, $blob, $options = null); /** * Deletes a blob or blob snapshot. * * Note that if the snapshot entry is specified in the $options then only this * blob snapshot is deleted. To delete all blob snapshots, do not set Snapshot * and just set getDeleteSnaphotsOnly to true. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\DeleteBlobOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179413.aspx */ public function deleteBlob($container, $blob, $options = null); /** * Creates a snapshot of a blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\CreateBlobSnapshotOptions $options optional parameters * * @return Models\CreateBlobSnapshotResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691971.aspx */ public function createBlobSnapshot($container, $blob, $options = null); /** * Copies a source blob to a destination blob within the same storage account. * * @param string $destinationContainer name of container * @param string $destinationBlob name of blob * @param string $sourceContainer name of container * @param string $sourceBlob name of blob * @param Models\CopyBlobOptions $options optional parameters * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd894037.aspx */ public function copyBlob($destinationContainer, $destinationBlob, $sourceContainer, $sourceBlob, $options = null ); /** * Establishes an exclusive one-minute write lock on a blob. To write to a locked * blob, a client must provide a lease ID. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\AcquireLeaseOptions $options optional parameters * * @return Models\AcquireLeaseResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function acquireLease($container, $blob, $options = null); /** * Renews an existing lease * * @param string $container name of the container * @param string $blob name of the blob * @param string $leaseId lease id when acquiring * @param Models\BlobServiceOptions $options optional parameters * * @return Models\AcquireLeaseResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function renewLease($container, $blob, $leaseId, $options = null); /** * Frees the lease if it is no longer needed so that another client may * immediately acquire a lease against the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param string $leaseId lease id when acquiring * @param Models\BlobServiceOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function releaseLease($container, $blob, $leaseId, $options = null); /** * Ends the lease but ensure that another client cannot acquire a new lease until * the current lease period has expired. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\BlobServiceOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function breakLease($container, $blob, $options = null); } PKwL\/ Gupdraftplus/includes/WindowsAzure/Blob/Models/GetContainerACLResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Blob\Models\ContainerAcl; /** * Holds container ACL * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetContainerAclResult { /** * @var ContainerAcl */ private $_containerACL; /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * Parses the given array into signed identifiers * * @param string $publicAccess container public access * @param string $etag container etag * @param \DateTime $lastModified last modification date * @param array $parsed parsed response into array * representation * * @return none. */ public static function create($publicAccess, $etag, $lastModified, $parsed) { $result = new GetContainerAclResult(); $result->setETag($etag); $result->setLastModified($lastModified); $acl = ContainerAcl::create($publicAccess, $parsed); $result->setContainerAcl($acl); return $result; } /** * Gets container ACL * * @return ContainerAcl */ public function getContainerAcl() { return $this->_containerACL; } /** * Sets container ACL * * @param ContainerAcl $containerACL value. * * @return none. */ public function setContainerAcl($containerACL) { $this->_containerACL = $containerACL; } /** * Gets container lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets container lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { $this->_lastModified = $lastModified; } /** * Gets container etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets container etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { $this->_etag = $etag; } } PKwL\7:̈Iupdraftplus/includes/WindowsAzure/Blob/Models/SetBlobPropertiesResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; /** * Holds result of calling setBlobProperties wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class SetBlobPropertiesResult { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * @var integer */ private $_sequenceNumber; /** * Creates SetBlobPropertiesResult from response headers. * * @param array $headers response headers * * @return SetBlobPropertiesResult */ public static function create($headers) { $result = new SetBlobPropertiesResult(); $date = $headers[Resources::LAST_MODIFIED]; $result->setLastModified(Utilities::rfc1123ToDateTime($date)); $result->setETag($headers[Resources::ETAG]); if (array_key_exists(Resources::X_MS_BLOB_SEQUENCE_NUMBER, $headers)) { $sNumber = $headers[Resources::X_MS_BLOB_SEQUENCE_NUMBER]; $result->setSequenceNumber(intval($sNumber)); } return $result; } /** * Gets blob lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { Validate::isDate($lastModified); $this->_lastModified = $lastModified; } /** * Gets blob etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets blob etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { Validate::isString($etag, 'etag'); $this->_etag = $etag; } /** * Gets blob sequenceNumber. * * @return int. */ public function getSequenceNumber() { return $this->_sequenceNumber; } /** * Sets blob sequenceNumber. * * @param int $sequenceNumber value. * * @return none. */ public function setSequenceNumber($sequenceNumber) { Validate::isInteger($sequenceNumber, 'sequenceNumber'); $this->_sequenceNumber = $sequenceNumber; } } PKwL\ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Holds available blob page write options * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class PageWriteOption { const CLEAR_OPTION = 'clear'; const UPDATE_OPTION = 'update'; } PKwL\:Kupdraftplus/includes/WindowsAzure/Blob/Models/ListPageBlobRangesOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for listPageBlobRanges wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListPageBlobRangesOptions extends BlobServiceOptions { /** * @var string */ private $_leaseId; /** * @var string */ private $_snapshot; /** * @var integer */ private $_rangeStart; /** * @var integer */ private $_rangeEnd; /** * @var AccessCondition */ private $_accessCondition; /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets blob snapshot. * * @return string. */ public function getSnapshot() { return $this->_snapshot; } /** * Sets blob snapshot. * * @param string $snapshot value. * * @return none. */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } /** * Gets rangeStart * * @return integer */ public function getRangeStart() { return $this->_rangeStart; } /** * Sets rangeStart * * @param integer $rangeStart the blob lease id. * * @return none */ public function setRangeStart($rangeStart) { Validate::isInteger($rangeStart, 'rangeStart'); $this->_rangeStart = $rangeStart; } /** * Gets rangeEnd * * @return integer */ public function getRangeEnd() { return $this->_rangeEnd; } /** * Sets rangeEnd * * @param integer $rangeEnd range end value in bytes * * @return none */ public function setRangeEnd($rangeEnd) { Validate::isInteger($rangeEnd, 'rangeEnd'); $this->_rangeEnd = $rangeEnd; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } } PKwL\/>Bupdraftplus/includes/WindowsAzure/Blob/Models/ListBlobsOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for listBlobs API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListBlobsOptions extends BlobServiceOptions { /** * @var string */ private $_prefix; /** * @var string */ private $_marker; /** * @var string */ private $_delimiter; /** * @var integer */ private $_maxResults; /** * @var boolean */ private $_includeMetadata; /** * @var boolean */ private $_includeSnapshots; /** * @var boolean */ private $_includeUncommittedBlobs; /** * Gets prefix. * * @return string. */ public function getPrefix() { return $this->_prefix; } /** * Sets prefix. * * @param string $prefix value. * * @return none. */ public function setPrefix($prefix) { Validate::isString($prefix, 'prefix'); $this->_prefix = $prefix; } /** * Gets delimiter. * * @return string. */ public function getDelimiter() { return $this->_delimiter; } /** * Sets prefix. * * @param string $delimiter value. * * @return none. */ public function setDelimiter($delimiter) { Validate::isString($delimiter, 'delimiter'); $this->_delimiter = $delimiter; } /** * Gets marker. * * @return string. */ public function getMarker() { return $this->_marker; } /** * Sets marker. * * @param string $marker value. * * @return none. */ public function setMarker($marker) { Validate::isString($marker, 'marker'); $this->_marker = $marker; } /** * Gets max results. * * @return integer. */ public function getMaxResults() { return $this->_maxResults; } /** * Sets max results. * * @param integer $maxResults value. * * @return none. */ public function setMaxResults($maxResults) { Validate::isInteger($maxResults, 'maxResults'); $this->_maxResults = $maxResults; } /** * Indicates if metadata is included or not. * * @return boolean. */ public function getIncludeMetadata() { return $this->_includeMetadata; } /** * Sets the include metadata flag. * * @param bool $includeMetadata value. * * @return none. */ public function setIncludeMetadata($includeMetadata) { Validate::isBoolean($includeMetadata); $this->_includeMetadata = $includeMetadata; } /** * Indicates if snapshots is included or not. * * @return boolean. */ public function getIncludeSnapshots() { return $this->_includeSnapshots; } /** * Sets the include snapshots flag. * * @param bool $includeSnapshots value. * * @return none. */ public function setIncludeSnapshots($includeSnapshots) { Validate::isBoolean($includeSnapshots); $this->_includeSnapshots = $includeSnapshots; } /** * Indicates if uncommittedBlobs is included or not. * * @return boolean. */ public function getIncludeUncommittedBlobs() { return $this->_includeUncommittedBlobs; } /** * Sets the include uncommittedBlobs flag. * * @param bool $includeUncommittedBlobs value. * * @return none. */ public function setIncludeUncommittedBlobs($includeUncommittedBlobs) { Validate::isBoolean($includeUncommittedBlobs); $this->_includeUncommittedBlobs = $includeUncommittedBlobs; } } PKwL\(EEAupdraftplus/includes/WindowsAzure/Blob/Models/AccessCondition.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\WindowsAzureUtilities; /** * Represents a set of access conditions to be used for operations against the * storage services. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class AccessCondition { /** * Represents the header type. * * @var string */ private $_header = Resources::EMPTY_STRING; /** * Represents the header value. * * @var string */ private $_value; /** * Constructor * * @param string $headerType header name * @param string $value header value */ protected function __construct($headerType, $value) { $this->setHeader($headerType); $this->setValue($value); } /** * Specifies that no access condition is set. * * @return \WindowsAzure\Blob\Models\AccessCondition */ public static function none() { return new AccessCondition(Resources::EMPTY_STRING, null); } /** * Returns an access condition such that an operation will be performed only if * the resource's ETag value matches the specified ETag value. *

* Setting this access condition modifies the request to include the HTTP * If-Match conditional header. If this access condition is set, the * operation is performed only if the ETag of the resource matches the specified * ETag. *

* For more information, see * * Specifying Conditional Headers for Blob Service Operations. * * @param string $etag a string that represents the ETag value to check. * * @return \WindowsAzure\Blob\Models\AccessCondition */ public static function ifMatch($etag) { return new AccessCondition(Resources::IF_MATCH, $etag); } /** * Returns an access condition such that an operation will be performed only if * the resource has been modified since the specified time. *

* Setting this access condition modifies the request to include the HTTP * If-Modified-Since conditional header. If this access condition is set, * the operation is performed only if the resource has been modified since the * specified time. *

* For more information, see * * Specifying Conditional Headers for Blob Service Operations. * * @param \DateTime $lastModified date that represents the last-modified * time to check for the resource. * * @return \WindowsAzure\Blob\Models\AccessCondition */ public static function ifModifiedSince($lastModified) { Validate::isDate($lastModified); return new AccessCondition( Resources::IF_MODIFIED_SINCE, $lastModified ); } /** * Returns an access condition such that an operation will be performed only if * the resource's ETag value does not match the specified ETag value. *

* Setting this access condition modifies the request to include the HTTP * If-None-Match conditional header. If this access condition is set, the * operation is performed only if the ETag of the resource does not match the * specified ETag. *

* For more information, * see * Specifying Conditional Headers for Blob Service Operations. * * @param string $etag string that represents the ETag value to check. * * @return \WindowsAzure\Blob\Models\AccessCondition */ public static function ifNoneMatch($etag) { return new AccessCondition(Resources::IF_NONE_MATCH, $etag); } /** * Returns an access condition such that an operation will be performed only if * the resource has not been modified since the specified time. *

* Setting this access condition modifies the request to include the HTTP * If-Unmodified-Since conditional header. If this access condition is * set, the operation is performed only if the resource has not been modified * since the specified time. *

* For more information, see * * Specifying Conditional Headers for Blob Service Operations. * * @param \DateTime $lastModified date that represents the last-modified * time to check for the resource. * * @return \WindowsAzure\Blob\Models\AccessCondition */ public static function ifNotModifiedSince($lastModified) { Validate::isDate($lastModified); return new AccessCondition( Resources::IF_UNMODIFIED_SINCE, $lastModified ); } /** * Sets header type * * @param string $headerType can be one of Resources * * @return none. */ public function setHeader($headerType) { $valid = AccessCondition::isValid($headerType); Validate::isTrue($valid, Resources::INVALID_HT_MSG); $this->_header = $headerType; } /** * Gets header type * * @return string. */ public function getHeader() { return $this->_header; } /** * Sets the header value * * @param string $value the value to use * * @return none */ public function setValue($value) { $this->_value = $value; } /** * Gets the header value * * @return string */ public function getValue() { return $this->_value; } /** * Check if the $headerType belongs to valid header types * * @param string $headerType candidate header type * * @return boolean */ public static function isValid($headerType) { if ( $headerType == Resources::EMPTY_STRING || $headerType == Resources::IF_UNMODIFIED_SINCE || $headerType == Resources::IF_MATCH || $headerType == Resources::IF_MODIFIED_SINCE || $headerType == Resources::IF_NONE_MATCH ) { return true; } else { return false; } } } PKwL\ǪLs s >updraftplus/includes/WindowsAzure/Blob/Models/AccessPolicy.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Validate; /** * Holds container access policy elements * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class AccessPolicy { /** * @var string */ private $_start; /** * @var \DateTime */ private $_expiry; /** * @var \DateTime */ private $_permission; /** * Gets start. * * @return \DateTime. */ public function getStart() { return $this->_start; } /** * Sets start. * * @param \DateTime $start value. * * @return none. */ public function setStart($start) { Validate::isDate($start); $this->_start = $start; } /** * Gets expiry. * * @return \DateTime. */ public function getExpiry() { return $this->_expiry; } /** * Sets expiry. * * @param \DateTime $expiry value. * * @return none. */ public function setExpiry($expiry) { Validate::isDate($expiry); $this->_expiry = $expiry; } /** * Gets permission. * * @return string. */ public function getPermission() { return $this->_permission; } /** * Sets permission. * * @param string $permission value. * * @return none. */ public function setPermission($permission) { $this->_permission = $permission; } /** * Converts this current object to XML representation. * * @return array. */ public function toArray() { $array = array(); $array['Start'] = Utilities::convertToEdmDateTime($this->_start); $array['Expiry'] = Utilities::convertToEdmDateTime($this->_expiry); $array['Permission'] = $this->_permission; return $array; } } PKwL\i i 6updraftplus/includes/WindowsAzure/Blob/Models/Blob.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Represents windows azure blob object * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Blob { /** * @var string */ private $_name; /** * @var string */ private $_url; /** * @var string */ private $_snapshot; /** * @var array */ private $_metadata; /** * @var BlobProperties */ private $_properties; /** * Gets blob name. * * @return string. */ public function getName() { return $this->_name; } /** * Sets blob name. * * @param string $name value. * * @return none. */ public function setName($name) { $this->_name = $name; } /** * Gets blob snapshot. * * @return string. */ public function getSnapshot() { return $this->_snapshot; } /** * Sets blob snapshot. * * @param string $snapshot value. * * @return none. */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } /** * Gets blob url. * * @return string. */ public function getUrl() { return $this->_url; } /** * Sets blob url. * * @param string $url value. * * @return none. */ public function setUrl($url) { $this->_url = $url; } /** * Gets blob metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets blob metadata. * * @param string $metadata value. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets blob properties. * * @return BlobProperties. */ public function getProperties() { return $this->_properties; } /** * Sets blob properties. * * @param BlobProperties $properties value. * * @return none. */ public function setProperties($properties) { $this->_properties = $properties; } } PKwL\Yr ((@updraftplus/includes/WindowsAzure/Blob/Models/GetBlobOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for getBlob wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetBlobOptions extends BlobServiceOptions { /** * @var string */ private $_leaseId; /** * @var string */ private $_snapshot; /** * @var AccessCondition */ private $_accessCondition; /** * @var boolean */ private $_computeRangeMD5; /** * @var integer */ private $_rangeStart; /** * @var integer */ private $_rangeEnd; /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets blob snapshot. * * @return string. */ public function getSnapshot() { return $this->_snapshot; } /** * Sets blob snapshot. * * @param string $snapshot value. * * @return none. */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } /** * Gets rangeStart * * @return integer */ public function getRangeStart() { return $this->_rangeStart; } /** * Sets rangeStart * * @param integer $rangeStart the blob lease id. * * @return none */ public function setRangeStart($rangeStart) { Validate::isInteger($rangeStart, 'rangeStart'); $this->_rangeStart = $rangeStart; } /** * Gets rangeEnd * * @return integer */ public function getRangeEnd() { return $this->_rangeEnd; } /** * Sets rangeEnd * * @param integer $rangeEnd range end value in bytes * * @return none */ public function setRangeEnd($rangeEnd) { Validate::isInteger($rangeEnd, 'rangeEnd'); $this->_rangeEnd = $rangeEnd; } /** * Gets computeRangeMD5 * * @return boolean */ public function getComputeRangeMD5() { return $this->_computeRangeMD5; } /** * Sets computeRangeMD5 * * @param boolean $computeRangeMD5 value * * @return none */ public function setComputeRangeMD5($computeRangeMD5) { Validate::isBoolean($computeRangeMD5); $this->_computeRangeMD5 = $computeRangeMD5; } } PKwL\EEFupdraftplus/includes/WindowsAzure/Blob/Models/ListContainersResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Blob\Models\Container; /** * Container to hold list container response object. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListContainersResult { /** * @var array */ private $_containers; /** * @var string */ private $_prefix; /** * @var string */ private $_marker; /** * @var string */ private $_nextMarker; /** * @var integer */ private $_maxResults; /** * @var string */ private $_accountName; /** * Creates ListBlobResult object from parsed XML response. * * @param array $parsedResponse XML response parsed into array. * * @return ListBlobResult */ public static function create($parsedResponse) { $result = new ListContainersResult(); $result->_accountName = Utilities::tryGetKeysChainValue( $parsedResponse, Resources::XTAG_ATTRIBUTES, Resources::XTAG_ACCOUNT_NAME ); $result->_prefix = Utilities::tryGetValue( $parsedResponse, Resources::QP_PREFIX ); $result->_marker = Utilities::tryGetValue( $parsedResponse, Resources::QP_MARKER ); $result->_nextMarker = Utilities::tryGetValue( $parsedResponse, Resources::QP_NEXT_MARKER ); $result->_maxResults = Utilities::tryGetValue( $parsedResponse, Resources::QP_MAX_RESULTS ); $result->_containers = array(); $rawContainer = array(); if ( !empty($parsedResponse['Containers']) ) { $containersArray = $parsedResponse['Containers']['Container']; $rawContainer = Utilities::getArray($containersArray); } foreach ($rawContainer as $value) { $container = new Container(); $container->setName($value['Name']); $container->setUrl($value['Url']); $container->setMetadata( Utilities::tryGetValue($value, Resources::QP_METADATA, array()) ); $properties = new ContainerProperties(); $date = $value['Properties']['Last-Modified']; $date = Utilities::rfc1123ToDateTime($date); $properties->setLastModified($date); $properties->setETag($value['Properties']['Etag']); $container->setProperties($properties); $result->_containers[] = $container; } return $result; } /** * Sets containers. * * @param array $containers list of containers. * * @return none */ public function setContainers($containers) { $this->_containers = array(); foreach ($containers as $container) { $this->_containers[] = clone $container; } } /** * Gets containers. * * @return array */ public function getContainers() { return $this->_containers; } /** * Gets prefix. * * @return string */ public function getPrefix() { return $this->_prefix; } /** * Sets prefix. * * @param string $prefix value. * * @return none */ public function setPrefix($prefix) { $this->_prefix = $prefix; } /** * Gets marker. * * @return string */ public function getMarker() { return $this->_marker; } /** * Sets marker. * * @param string $marker value. * * @return none */ public function setMarker($marker) { $this->_marker = $marker; } /** * Gets max results. * * @return string */ public function getMaxResults() { return $this->_maxResults; } /** * Sets max results. * * @param string $maxResults value. * * @return none */ public function setMaxResults($maxResults) { $this->_maxResults = $maxResults; } /** * Gets next marker. * * @return string */ public function getNextMarker() { return $this->_nextMarker; } /** * Sets next marker. * * @param string $nextMarker value. * * @return none */ public function setNextMarker($nextMarker) { $this->_nextMarker = $nextMarker; } /** * Gets account name. * * @return string */ public function getAccountName() { return $this->_accountName; } /** * Sets account name. * * @param string $accountName value. * * @return none */ public function setAccountName($accountName) { $this->_accountName = $accountName; } }PKwL\b( Jupdraftplus/includes/WindowsAzure/Blob/Models/GetBlobPropertiesOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Optional parameters for getBlobProperties wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetBlobPropertiesOptions extends BlobServiceOptions { /** * @var string */ private $_leaseId; /** * @var string */ private $_snapshot; /** * @var AccessCondition */ private $_accessCondition; /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets blob snapshot. * * @return string. */ public function getSnapshot() { return $this->_snapshot; } /** * Sets blob snapshot. * * @param string $snapshot value. * * @return none. */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } } PKwL\ Bupdraftplus/includes/WindowsAzure/Blob/Models/SignedIdentifier.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Blob\Models\AccessPolicy; /** * Holds container signed identifiers. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class SignedIdentifier { private $_id; private $_accessPolicy; /** * Gets id. * * @return string. */ public function getId() { return $this->_id; } /** * Sets id. * * @param string $id value. * * @return none. */ public function setId($id) { $this->_id = $id; } /** * Gets accessPolicy. * * @return string. */ public function getAccessPolicy() { return $this->_accessPolicy; } /** * Sets accessPolicy. * * @param string $accessPolicy value. * * @return none. */ public function setAccessPolicy($accessPolicy) { $this->_accessPolicy = $accessPolicy; } /** * Converts this current object to XML representation. * * @return array. */ public function toArray() { $array = array(); $array['SignedIdentifier']['Id'] = $this->_id; $array['SignedIdentifier']['AccessPolicy'] = $this->_accessPolicy->toArray(); return $array; } } PKwL\ f$~~Eupdraftplus/includes/WindowsAzure/Blob/Models/AcquireLeaseOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Optional parameters for acquireLease wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class AcquireLeaseOptions extends BlobServiceOptions { /** * @var AccessCondition */ private $_accessCondition; /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } } PKwL\w;updraftplus/includes/WindowsAzure/Blob/Models/BlockList.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Serialization\XmlSerializer; use WindowsAzure\Blob\Models\Block; /** * Holds block list used for commitBlobBlocks * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BlockList { /** * @var array */ private $_entries; public static $xmlRootName = 'BlockList'; /** * Creates block list from array of blocks. * * @param array $array The blocks array. * * @return BlockList */ public static function create($array) { $blockList = new BlockList(); foreach ($array as $value) { $blockList->addEntry($value->getBlockId(), $value->getType()); } return $blockList; } /** * Adds new entry to the block list entries. * * @param string $blockId The block id. * @param string $type The entry type, you can use BlobBlockType. * * @return none */ public function addEntry($blockId, $type) { Validate::isString($blockId, 'blockId'); Validate::isTrue( BlobBlockType::isValid($type), sprintf(Resources::INVALID_BTE_MSG, get_class(new BlobBlockType())) ); $block = new Block(); $block->setBlockId($blockId); $block->setType($type); $this->_entries[] = $block; } /** * Addds committed block entry. * * @param string $blockId The block id. * * @return none */ public function addCommittedEntry($blockId) { $this->addEntry($blockId, BlobBlockType::COMMITTED_TYPE); } /** * Addds uncommitted block entry. * * @param string $blockId The block id. * * @return none */ public function addUncommittedEntry($blockId) { $this->addEntry($blockId, BlobBlockType::UNCOMMITTED_TYPE); } /** * Addds latest block entry. * * @param string $blockId The block id. * * @return none */ public function addLatestEntry($blockId) { $this->addEntry($blockId, BlobBlockType::LATEST_TYPE); } /** * Gets blob block entry. * * @param string $blockId The id of the block. * * @return Block */ public function getEntry($blockId) { foreach ($this->_entries as $value) { if ($blockId == $value->getBlockId()) { return $value; } } return null; } /** * Gets all blob block entries. * * @return string */ public function getEntries() { return $this->_entries; } /** * Converts the BlockList object to XML representation * * @param XmlSerializer $xmlSerializer The XML serializer. * * @return string */ public function toXml($xmlSerializer) { $properties = array(XmlSerializer::ROOT_NAME => self::$xmlRootName); $array = array(); foreach ($this->_entries as $value) { $array[] = array( $value->getType() => base64_encode($value->getBlockId()) ); } return $xmlSerializer->serialize($array, $properties); } } PKwL\v:f f Cupdraftplus/includes/WindowsAzure/Blob/Models/DeleteBlobOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for deleteBlob wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class DeleteBlobOptions extends BlobServiceOptions { /** * @var string */ private $_leaseId; /** * @var string */ private $_snapshot; /** * @var AccessCondition */ private $_accessCondition; /** * @var boolean */ private $_deleteSnaphotsOnly; /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets blob snapshot. * * @return string. */ public function getSnapshot() { return $this->_snapshot; } /** * Sets blob snapshot. * * @param string $snapshot value. * * @return none. */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } /** * Gets blob deleteSnaphotsOnly. * * @return boolean. */ public function getDeleteSnaphotsOnly() { return $this->_deleteSnaphotsOnly; } /** * Sets blob deleteSnaphotsOnly. * * @param string $deleteSnaphotsOnly value. * * @return boolean. */ public function setDeleteSnaphotsOnly($deleteSnaphotsOnly) { Validate::isBoolean($deleteSnaphotsOnly); $this->_deleteSnaphotsOnly = $deleteSnaphotsOnly; } } PKwL\i*M||:updraftplus/includes/WindowsAzure/Blob/Models/BlobType.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Encapsulates blob types * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BlobType { const BLOCK_BLOB = 'BlockBlob'; const PAGE_BLOB = 'PageBlob'; } PKwL\ppFupdraftplus/includes/WindowsAzure/Blob/Models/ListBlobBlocksResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * Holds result of listBlobBlocks * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListBlobBlocksResult { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * @var string */ private $_contentType; /** * @var integer */ private $_contentLength; /** * @var array */ private $_committedBlocks; /** * @var array */ private $_uncommittedBlocks; /** * Gets block entries from parsed response * * @param array $parsed HTTP response * @param string $type Block type * * @return array */ private static function _getEntries($parsed, $type) { $entries = array(); if (is_array($parsed)) { $rawEntries = array(); if ( array_key_exists($type, $parsed) && is_array($parsed[$type]) && !empty($parsed[$type]) ) { $rawEntries = Utilities::getArray($parsed[$type]['Block']); } foreach ($rawEntries as $value) { $entries[base64_decode($value['Name'])] = $value['Size']; } } return $entries; } /** * Creates ListBlobBlocksResult from given response headers and parsed body * * @param array $headers HTTP response headers * @param array $parsed HTTP response body in array representation * * @return ListBlobBlocksResult */ public static function create($headers, $parsed) { $result = new ListBlobBlocksResult(); $clean = array_change_key_case($headers); $result->setETag(Utilities::tryGetValue($clean, Resources::ETAG)); $date = Utilities::tryGetValue($clean, Resources::LAST_MODIFIED); if (!is_null($date)) { $date = Utilities::rfc1123ToDateTime($date); $result->setLastModified($date); } $result->setContentLength( intval( Utilities::tryGetValue($clean, Resources::X_MS_BLOB_CONTENT_LENGTH) ) ); $result->setContentType( Utilities::tryGetValue($clean, Resources::CONTENT_TYPE) ); $result->_uncommittedBlocks = self::_getEntries( $parsed, 'UncommittedBlocks' ); $result->_committedBlocks = self::_getEntries($parsed, 'CommittedBlocks'); return $result; } /** * Gets blob lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { Validate::isDate($lastModified); $this->_lastModified = $lastModified; } /** * Gets blob etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets blob etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { $this->_etag = $etag; } /** * Gets blob contentType. * * @return string. */ public function getContentType() { return $this->_contentType; } /** * Sets blob contentType. * * @param string $contentType value. * * @return none. */ public function setContentType($contentType) { $this->_contentType = $contentType; } /** * Gets blob contentLength. * * @return integer. */ public function getContentLength() { return $this->_contentLength; } /** * Sets blob contentLength. * * @param integer $contentLength value. * * @return none. */ public function setContentLength($contentLength) { Validate::isInteger($contentLength, 'contentLength'); $this->_contentLength = $contentLength; } /** * Gets uncommitted blocks * * @return array */ public function getUncommittedBlocks() { return $this->_uncommittedBlocks; } /** * Sets uncommitted blocks * * @param array $uncommittedBlocks The uncommitted blocks entries * * @return none. */ public function setUncommittedBlocks($uncommittedBlocks) { $this->_uncommittedBlocks = $uncommittedBlocks; } /** * Gets committed blocks * * @return array */ public function getCommittedBlocks() { return $this->_committedBlocks; } /** * Sets committed blocks * * @param array $committedBlocks The committed blocks entries * * @return none. */ public function setCommittedBlocks($committedBlocks) { $this->_committedBlocks = $committedBlocks; } } PKwL\Y Kupdraftplus/includes/WindowsAzure/Blob/Models/CreateBlobSnapshotOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * The optional parameters for createBlobSnapshot wrapper. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CreateBlobSnapshotOptions extends BlobServiceOptions { /** * @var array */ private $_metadata; /** * @var AccessCondition */ private $_accessCondition; /** * @var string */ private $_leaseId; /** * Gets metadata. * * @return array */ public function getMetadata() { return $this->_metadata; } /** * Sets metadata. * * @param array $metadata The metadata array. * * @return none */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets access condition. * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition. * * @param AccessCondition $accessCondition The access condition object. * * @return none */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets lease Id. * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id. * * @param string $leaseId The lease Id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } } PKwL\dHupdraftplus/includes/WindowsAzure/Blob/Models/CreateBlobBlockOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Optional parameters for createBlobBlock wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CreateBlobBlockOptions extends BlobServiceOptions { /** * @var string */ private $_contentMD5; /** * @var string */ private $_leaseId; /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets blob contentMD5. * * @return string. */ public function getContentMD5() { return $this->_contentMD5; } /** * Sets blob contentMD5. * * @param string $contentMD5 value. * * @return none. */ public function setContentMD5($contentMD5) { $this->_contentMD5 = $contentMD5; } } PKwL\}ȼ;updraftplus/includes/WindowsAzure/Blob/Models/LeaseMode.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Modes for leasing a blob * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class LeaseMode { const ACQUIRE_ACTION = 'acquire'; const RENEW_ACTION = 'renew'; const RELEASE_ACTION = 'release'; const BREAK_ACTION = 'break'; } PKwL\QkEupdraftplus/includes/WindowsAzure/Blob/Models/ContainerProperties.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Holds container properties fields * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ContainerProperties { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * Gets container lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets container lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { $this->_lastModified = $lastModified; } /** * Gets container etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets container etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { $this->_etag = $etag; } } PKwL\)ᆉAupdraftplus/includes/WindowsAzure/Blob/Models/CopyBlobOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * optional parameters for CopyBlobOptions wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CopyBlobOptions extends BlobServiceOptions { /** * @var AccessCondition */ private $_accessCondition; /** * @var AccessCondition */ private $_sourceAccessCondition; /** * @var array */ private $_metadata; /** * @var string */ private $_sourceSnapshot; /** * @var string */ private $_leaseId; /** * @var sourceLeaseId */ private $_sourceLeaseId; /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets source access condition * * @return SourceAccessCondition */ public function getSourceAccessCondition() { return $this->_sourceAccessCondition; } /** * Sets source access condition * * @param SourceAccessCondition $sourceAccessCondition value to use. * * @return none. */ public function setSourceAccessCondition($sourceAccessCondition) { $this->_sourceAccessCondition = $sourceAccessCondition; } /** * Gets metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets metadata. * * @param array $metadata value. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets source snapshot. * * @return string */ public function getSourceSnapshot() { return $this->_sourceSnapshot; } /** * Sets source snapshot. * * @param string $sourceSnapshot value. * * @return none */ public function setSourceSnapshot($sourceSnapshot) { $this->_sourceSnapshot = $sourceSnapshot; } /** * Gets lease ID. * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease ID. * * @param string $leaseId value. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets source lease ID. * * @return string */ public function getSourceLeaseId() { return $this->_sourceLeaseId; } /** * Sets source lease ID. * * @param string $sourceLeaseId value. * * @return none */ public function setSourceLeaseId($sourceLeaseId) { $this->_sourceLeaseId = $sourceLeaseId; } } PKwL\,5<updraftplus/includes/WindowsAzure/Blob/Models/BlobPrefix.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Represents BlobPrefix object * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BlobPrefix { /** * @var string */ private $_name; /** * Gets blob name. * * @return string. */ public function getName() { return $this->_name; } /** * Sets blob name. * * @param string $name value. * * @return none. */ public function setName($name) { $this->_name = $name; } } PKwL\,޷K K Hupdraftplus/includes/WindowsAzure/Blob/Models/SetBlobMetadataOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * The optional parameters for setBlobMetadata API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class SetBlobMetadataOptions extends BlobServiceOptions { /** * @var string */ private $_leaseId; /** * @var AccessCondition */ private $_accessCondition; /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } } PKwL\:0GuuHupdraftplus/includes/WindowsAzure/Blob/Models/CreateContainerOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Blob\Models\BlobServiceOptions; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for createContainer API * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CreateContainerOptions extends BlobServiceOptions { /** * @var string */ private $_publicAccess; /** * @var array */ private $_metadata; /** * Gets container public access. * * @return string. */ public function getPublicAccess() { return $this->_publicAccess; } /** * Specifies whether data in the container may be accessed publicly and the level * of access. Possible values include: * 1) container: Specifies full public read access for container and blob data. * Clients can enumerate blobs within the container via anonymous request, but * cannot enumerate containers within the storage account. * 2) blob: Specifies public read access for blobs. Blob data within this * container can be read via anonymous request, but container data is not * available. Clients cannot enumerate blobs within the container via * anonymous request. * If this value is not specified in the request, container data is private to * the account owner. * * @param string $publicAccess access modifier for the container * * @return none. */ public function setPublicAccess($publicAccess) { Validate::isString($publicAccess, 'publicAccess'); $this->_publicAccess = $publicAccess; } /** * Gets user defined metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets user defined metadata. This metadata should be added without the header * prefix (x-ms-meta-*). * * @param array $metadata user defined metadata object in array form. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Adds new metadata element. This element should be added without the header * prefix (x-ms-meta-*). * * @param string $key metadata key element. * @param string $value metadata value element. * * @return none. */ public function addMetadata($key, $value) { $this->_metadata[$key] = $value; } } PKwL\k7$$Jupdraftplus/includes/WindowsAzure/Blob/Models/ListPageBlobRangesResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Blob\Models\PageRange; /** * Holds result of calling listPageBlobRanges wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListPageBlobRangesResult { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * @var integer */ private $_contentLength; /** * @var array */ private $_pageRanges; /** * Creates BlobProperties object from $parsed response in array representation * * @param array $headers HTTP response headers * @param array $parsed parsed response in array format. * * @return ListPageBlobRangesResult */ public static function create($headers, $parsed) { $result = new ListPageBlobRangesResult(); $headers = array_change_key_case($headers); $date = $headers[Resources::LAST_MODIFIED]; $date = Utilities::rfc1123ToDateTime($date); $blobLength = intval($headers[Resources::X_MS_BLOB_CONTENT_LENGTH]); $rawPageRanges = array(); if (!empty($parsed['PageRange'])) { $parsed = array_change_key_case($parsed); $rawPageRanges = Utilities::getArray($parsed['pagerange']); } $result->_pageRanges = array(); foreach ($rawPageRanges as $value) { $result->_pageRanges[] = new PageRange( intval($value['Start']), intval($value['End']) ); } $result->setContentLength($blobLength); $result->setETag($headers[Resources::ETAG]); $result->setLastModified($date); return $result; } /** * Gets blob lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { Validate::isDate($lastModified); $this->_lastModified = $lastModified; } /** * Gets blob etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets blob etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { Validate::isString($etag, 'etag'); $this->_etag = $etag; } /** * Gets blob contentLength. * * @return integer. */ public function getContentLength() { return $this->_contentLength; } /** * Sets blob contentLength. * * @param integer $contentLength value. * * @return none. */ public function setContentLength($contentLength) { Validate::isInteger($contentLength, 'contentLength'); $this->_contentLength = $contentLength; } /** * Gets page ranges * * @return array */ public function getPageRanges() { return $this->_pageRanges; } /** * Sets page ranges * * @param array $pageRanges page ranges to set * * @return none */ public function setPageRanges($pageRanges) { $this->_pageRanges = array(); foreach ($pageRanges as $pageRange) { $this->_pageRanges[] = clone $pageRange; } } } PKwL\35^, , Nupdraftplus/includes/WindowsAzure/Blob/Models/GetContainerPropertiesResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Holds result of getContainerProperties and getContainerMetadata * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetContainerPropertiesResult { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * @var array */ private $_metadata; /** * Any operation that modifies the container or its properties or metadata * updates the last modified time. Operations on blobs do not affect the last * modified time of the container. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets container lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { $this->_lastModified = $lastModified; } /** * The entity tag for the container. If the request version is 2011-08-18 or * newer, the ETag value will be in quotes. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets container etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { $this->_etag = $etag; } /** * Gets user defined metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets user defined metadata. This metadata should be added without the header * prefix (x-ms-meta-*). * * @param array $metadata user defined metadata object in array form. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } } PKwL\_~ Dupdraftplus/includes/WindowsAzure/Blob/Models/BlobServiceOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Blob service options. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BlobServiceOptions { private $_timeout; /** * Gets timeout. * * @return string. */ public function getTimeout() { return $this->_timeout; } /** * Sets timeout. * * @param string $timeout value. * * @return none. */ public function setTimeout($timeout) { $this->_timeout = $timeout; } } PKwL\qou u Cupdraftplus/includes/WindowsAzure/Blob/Models/CreateBlobOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * optional parameters for createXXXBlob wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CreateBlobOptions extends BlobServiceOptions { /** * @var string */ private $_contentType; /** * @var string */ private $_contentEncoding; /** * @var string */ private $_contentLanguage; /** * @var string */ private $_contentMD5; /** * @var string */ private $_cacheControl; /** * @var string */ private $_blobContentType; /** * @var string */ private $_blobContentEncoding; /** * @var string */ private $_blobContentLanguage; /** * @var string */ private $_blobContentMD5; /** * @var string */ private $_blobCacheControl; /** * @var array */ private $_metadata; /** * @var string */ private $_leaseId; /** * @var integer */ private $_sequenceNumber; /** * @var AccessCondition */ private $_accessCondition; /** * Gets blob ContentType. * * @return string. */ public function getBlobContentType() { return $this->_blobContentType; } /** * Sets blob ContentType. * * @param string $blobContentType value. * * @return none. */ public function setBlobContentType($blobContentType) { $this->_blobContentType = $blobContentType; } /** * Gets blob ContentEncoding. * * @return string. */ public function getBlobContentEncoding() { return $this->_blobContentEncoding; } /** * Sets blob ContentEncoding. * * @param string $blobContentEncoding value. * * @return none. */ public function setBlobContentEncoding($blobContentEncoding) { $this->_blobContentEncoding = $blobContentEncoding; } /** * Gets blob ContentLanguage. * * @return string. */ public function getBlobContentLanguage() { return $this->_blobContentLanguage; } /** * Sets blob ContentLanguage. * * @param string $blobContentLanguage value. * * @return none. */ public function setBlobContentLanguage($blobContentLanguage) { $this->_blobContentLanguage = $blobContentLanguage; } /** * Gets blob ContentMD5. * * @return string. */ public function getBlobContentMD5() { return $this->_blobContentMD5; } /** * Sets blob ContentMD5. * * @param string $blobContentMD5 value. * * @return none. */ public function setBlobContentMD5($blobContentMD5) { $this->_blobContentMD5 = $blobContentMD5; } /** * Gets blob cache control. * * @return string. */ public function getBlobCacheControl() { return $this->_blobCacheControl; } /** * Sets blob cacheControl. * * @param string $blobCacheControl value to use. * * @return none. */ public function setBlobCacheControl($blobCacheControl) { $this->_blobCacheControl = $blobCacheControl; } /** * Gets blob contentType. * * @return string. */ public function getContentType() { return $this->_contentType; } /** * Sets blob contentType. * * @param string $contentType value. * * @return none. */ public function setContentType($contentType) { $this->_contentType = $contentType; } /** * Gets contentEncoding. * * @return string. */ public function getContentEncoding() { return $this->_contentEncoding; } /** * Sets contentEncoding. * * @param string $contentEncoding value. * * @return none. */ public function setContentEncoding($contentEncoding) { $this->_contentEncoding = $contentEncoding; } /** * Gets contentLanguage. * * @return string. */ public function getContentLanguage() { return $this->_contentLanguage; } /** * Sets contentLanguage. * * @param string $contentLanguage value. * * @return none. */ public function setContentLanguage($contentLanguage) { $this->_contentLanguage = $contentLanguage; } /** * Gets contentMD5. * * @return string. */ public function getContentMD5() { return $this->_contentMD5; } /** * Sets contentMD5. * * @param string $contentMD5 value. * * @return none. */ public function setContentMD5($contentMD5) { $this->_contentMD5 = $contentMD5; } /** * Gets cacheControl. * * @return string. */ public function getCacheControl() { return $this->_cacheControl; } /** * Sets cacheControl. * * @param string $cacheControl value to use. * * @return none. */ public function setCacheControl($cacheControl) { $this->_cacheControl = $cacheControl; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets blob metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets blob metadata. * * @param string $metadata value. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets blob sequenceNumber. * * @return int. */ public function getSequenceNumber() { return $this->_sequenceNumber; } /** * Sets blob sequenceNumber. * * @param int $sequenceNumber value. * * @return none. */ public function setSequenceNumber($sequenceNumber) { Validate::isInteger($sequenceNumber, 'sequenceNumber'); $this->_sequenceNumber = $sequenceNumber; } /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } } PKwL\p< Gupdraftplus/includes/WindowsAzure/Blob/Models/GetBlobMetadataResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; /** * Holds results of calling getBlobMetadata wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetBlobMetadataResult { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * @var array */ private $_metadata; /** * Creates GetBlobMetadataResult from response headers. * * @param array $headers The HTTP response headers. * @param array $metadata The blob metadata array. * * @return GetBlobMetadataResult */ public static function create($headers, $metadata) { $result = new GetBlobMetadataResult(); $date = $headers[Resources::LAST_MODIFIED]; $result->setLastModified(Utilities::rfc1123ToDateTime($date)); $result->setETag($headers[Resources::ETAG]); $result->setMetadata(is_null($metadata) ? array() : $metadata); return $result; } /** * Gets blob lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { Validate::isDate($lastModified); $this->_lastModified = $lastModified; } /** * Gets blob etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets blob etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { Validate::isString($etag, 'etag'); $this->_etag = $etag; } /** * Gets blob metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets blob metadata. * * @param string $metadata value. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } } PKwL\Z Z ;updraftplus/includes/WindowsAzure/Blob/Models/Container.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * WindowsAzure container object. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Container { /** * @var string */ private $_name; /** * @var string */ private $_url; /** * @var array */ private $_metadata; /** * @var ContainerProperties */ private $_properties; /** * Gets container name. * * @return string. */ public function getName() { return $this->_name; } /** * Sets container name. * * @param string $name value. * * @return none. */ public function setName($name) { $this->_name = $name; } /** * Gets container url. * * @return string. */ public function getUrl() { return $this->_url; } /** * Sets container url. * * @param string $url value. * * @return none. */ public function setUrl($url) { $this->_url = $url; } /** * Gets container metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets container metadata. * * @param array $metadata value. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets container properties * * @return ContainerProperties */ public function getProperties() { return $this->_properties; } /** * Sets container properties * * @param ContainerProperties $properties container properties * * @return none. */ public function setProperties($properties) { $this->_properties = $properties; } } PKwL\  Bupdraftplus/includes/WindowsAzure/Blob/Models/BreakLeaseResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * The result of calling breakLease API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BreakLeaseResult { /** * @var string */ private $_leaseTime; /** * Creates BreakLeaseResult from response headers * * @param array $headers response headers * * @return BreakLeaseResult */ public static function create($headers) { $result = new BreakLeaseResult(); $result->setLeaseTime( Utilities::tryGetValue($headers, Resources::X_MS_LEASE_TIME) ); return $result; } /** * Gets lease time. * * @return string */ public function getLeaseTime() { return $this->_leaseTime; } /** * Sets lease time. * * @param string $leaseTime the blob lease time. * * @return none */ public function setLeaseTime($leaseTime) { $this->_leaseTime = $leaseTime; } }PKwL\Wc c ;updraftplus/includes/WindowsAzure/Blob/Models/PageRange.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Holds info about page range used in HTTP requests * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class PageRange { /** * @var integer */ private $_start; /** * @var integer */ private $_end; /** * Constructor * * @param integer $start the page start value * @param integer $end the page end value * * @return PageRange */ public function __construct($start = null, $end = null) { $this->_start = $start; $this->_end = $end; } /** * Sets page start range * * @param integer $start the page range start * * @return none. */ public function setStart($start) { $this->_start = $start; } /** * Gets page start range * * @return integer */ public function getStart() { return $this->_start; } /** * Sets page end range * * @param integer $end the page range end * * @return none. */ public function setEnd($end) { $this->_end = $end; } /** * Gets page end range * * @return integer */ public function getEnd() { return $this->_end; } /** * Gets page range length * * @return integer */ public function getLength() { return $this->_end - $this->_start + 1; } /** * Sets page range length * * @param integer $value new page range * * @return none */ public function setLength($value) { $this->_end = $this->_start + $value - 1; } } PKwL\/Gupdraftplus/includes/WindowsAzure/Blob/Models/ListContainersOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Blob\Models\BlobServiceOptions; use \WindowsAzure\Common\Internal\Validate; /** * Options for listBlobs API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListContainersOptions extends BlobServiceOptions { /** * Filters the results to return only containers whose name begins with the * specified prefix. * * @var string */ private $_prefix; /** * Identifies the portion of the list to be returned with the next list operation * The operation returns a marker value within the * response body if the list returned was not complete. The marker value may * then be used in a subsequent call to request the next set of list items. * The marker value is opaque to the client. * * @var string */ private $_marker; /** * Specifies the maximum number of containers to return. If the request does not * specify maxresults, or specifies a value greater than 5,000, the server will * return up to 5,000 items. If the parameter is set to a value less than or * equal to zero, the server will return status code 400 (Bad Request). * * @var string */ private $_maxResults; /** * Include this parameter to specify that the container's metadata be returned * as part of the response body. * * @var bool */ private $_includeMetadata; /** * Gets prefix. * * @return string. */ public function getPrefix() { return $this->_prefix; } /** * Sets prefix. * * @param string $prefix value. * * @return none. */ public function setPrefix($prefix) { Validate::isString($prefix, 'prefix'); $this->_prefix = $prefix; } /** * Gets marker. * * @return string. */ public function getMarker() { return $this->_marker; } /** * Sets marker. * * @param string $marker value. * * @return none. */ public function setMarker($marker) { Validate::isString($marker, 'marker'); $this->_marker = $marker; } /** * Gets max results. * * @return string. */ public function getMaxResults() { return $this->_maxResults; } /** * Sets max results. * * @param string $maxResults value. * * @return none. */ public function setMaxResults($maxResults) { Validate::isString($maxResults, 'maxResults'); $this->_maxResults = $maxResults; } /** * Indicates if metadata is included or not. * * @return string. */ public function getIncludeMetadata() { return $this->_includeMetadata; } /** * Sets the include metadata flag. * * @param bool $includeMetadata value. * * @return none. */ public function setIncludeMetadata($includeMetadata) { Validate::isBoolean($includeMetadata); $this->_includeMetadata = $includeMetadata; } } PKwL\N{q| | ?updraftplus/includes/WindowsAzure/Blob/Models/GetBlobResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Blob\Models\BlobProperties; use WindowsAzure\Common\Internal\Utilities; /** * Holds result of GetBlob API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetBlobResult { /** * @var BlobProperties */ private $_properties; /** * @var array */ private $_metadata; /** * @var resource */ private $_contentStream; /** * Creates GetBlobResult from getBlob call. * * @param array $headers The HTTP response headers. * @param string $body The response body. * @param array $metadata The blob metadata. * * @return GetBlobResult */ public static function create($headers, $body, $metadata) { $result = new GetBlobResult(); $result->setContentStream(Utilities::stringToStream($body)); $result->setProperties(BlobProperties::create($headers)); $result->setMetadata(is_null($metadata) ? array() : $metadata); return $result; } /** * Gets blob metadata. * * @return array */ public function getMetadata() { return $this->_metadata; } /** * Sets blob metadata. * * @param string $metadata value. * * @return none */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets blob properties. * * @return BlobProperties */ public function getProperties() { return $this->_properties; } /** * Sets blob properties. * * @param BlobProperties $properties value. * * @return none */ public function setProperties($properties) { $this->_properties = $properties; } /** * Gets blob contentStream. * * @return resource */ public function getContentStream() { return $this->_contentStream; } /** * Sets blob contentStream. * * @param resource $contentStream The stream handle. * * @return none */ public function setContentStream($contentStream) { $this->_contentStream = $contentStream; } } PKwL\Ԅ\Gupdraftplus/includes/WindowsAzure/Blob/Models/CreateBlobPagesResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; /** * Holds result of calling create or clear blob pages * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CreateBlobPagesResult { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * @var integer */ private $_sequenceNumber; /** * @var string */ private $_contentMD5; /** * Creates CreateBlobPagesResult object from $parsed response in array * representation * * @param array $headers HTTP response headers * * @return CreateBlobPagesResult */ public static function create($headers) { $result = new CreateBlobPagesResult(); $clean = array_change_key_case($headers); $date = $clean[Resources::LAST_MODIFIED]; $date = Utilities::rfc1123ToDateTime($date); $result->setETag($clean[Resources::ETAG]); $result->setLastModified($date); $result->setContentMD5( Utilities::tryGetValue($clean, Resources::CONTENT_MD5) ); $result->setSequenceNumber( intval( Utilities::tryGetValue($clean, Resources::X_MS_BLOB_SEQUENCE_NUMBER) ) ); return $result; } /** * Gets blob lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { Validate::isDate($lastModified); $this->_lastModified = $lastModified; } /** * Gets blob etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets blob etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { Validate::isString($etag, 'etag'); $this->_etag = $etag; } /** * Gets blob contentMD5. * * @return string. */ public function getContentMD5() { return $this->_contentMD5; } /** * Sets blob contentMD5. * * @param string $contentMD5 value. * * @return none. */ public function setContentMD5($contentMD5) { $this->_contentMD5 = $contentMD5; } /** * Gets blob sequenceNumber. * * @return int. */ public function getSequenceNumber() { return $this->_sequenceNumber; } /** * Sets blob sequenceNumber. * * @param int $sequenceNumber value. * * @return none. */ public function setSequenceNumber($sequenceNumber) { Validate::isInteger($sequenceNumber, 'sequenceNumber'); $this->_sequenceNumber = $sequenceNumber; } } PKwL\  Dupdraftplus/includes/WindowsAzure/Blob/Models/AcquireLeaseResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * The result of calling acquireLease API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class AcquireLeaseResult { /** * @var string */ private $_leaseId; /** * Creates AcquireLeaseResult from response headers * * @param array $headers response headers * * @return AcquireLeaseResult */ public static function create($headers) { $result = new AcquireLeaseResult(); $result->setLeaseId( Utilities::tryGetValue($headers, Resources::X_MS_LEASE_ID) ); return $result; } /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } } PKwL\5[UQQ?updraftplus/includes/WindowsAzure/Blob/Models/BlobBlockType.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Holds available blob block types * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BlobBlockType { const COMMITTED_TYPE = 'Committed'; const UNCOMMITTED_TYPE = 'Uncommitted'; const LATEST_TYPE = 'Latest'; /** * Validates the provided type. * * @param string $type The entry type. * * @return boolean */ public static function isValid($type) { switch ($type) { case self::COMMITTED_TYPE: case self::LATEST_TYPE: case self::UNCOMMITTED_TYPE: return true; default: return false; } } } PKwL\⊭Mupdraftplus/includes/WindowsAzure/Blob/Models/SetContainerMetadataOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Blob\Models\AccessCondition; use WindowsAzure\Blob\Models\BlobServiceOptions; /** * Optional parameters for setContainerMetadata wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class SetContainerMetadataOptions extends BlobServiceOptions { /** * @var AccessCondition */ private $_accessCondition; /** * Constructs the access condition object with none option. */ public function __construct() { $this->_accessCondition = AccessCondition::none(); } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } } PKwL\?d$$@updraftplus/includes/WindowsAzure/Blob/Models/BlobProperties.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; /** * Represents blob properties * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BlobProperties { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * @var string */ private $_contentType; /** * @var integer */ private $_contentLength; /** * @var string */ private $_contentEncoding; /** * @var string */ private $_contentLanguage; /** * @var string */ private $_contentMD5; /** * @var string */ private $_contentRange; /** * @var string */ private $_cacheControl; /** * @var string */ private $_blobType; /** * @var string */ private $_leaseStatus; /** * @var integer */ private $_sequenceNumber; /** * Creates BlobProperties object from $parsed response in array representation * * @param array $parsed parsed response in array format. * * @return BlobProperties */ public static function create($parsed) { $result = new BlobProperties(); $clean = array_change_key_case($parsed); $date = Utilities::tryGetValue($clean, Resources::LAST_MODIFIED); $result->setBlobType(Utilities::tryGetValue($clean, 'blobtype')); $result->setContentLength(intval($clean[Resources::CONTENT_LENGTH])); $result->setETag(Utilities::tryGetValue($clean, Resources::ETAG)); if (!is_null($date)) { $date = Utilities::rfc1123ToDateTime($date); $result->setLastModified($date); } $result->setLeaseStatus(Utilities::tryGetValue($clean, 'leasestatus')); $result->setLeaseStatus( Utilities::tryGetValue( $clean, Resources::X_MS_LEASE_STATUS, $result->getLeaseStatus() ) ); $result->setSequenceNumber( intval( Utilities::tryGetValue($clean, Resources::X_MS_BLOB_SEQUENCE_NUMBER) ) ); $result->setContentRange( Utilities::tryGetValue($clean, Resources::CONTENT_RANGE) ); $result->setCacheControl( Utilities::tryGetValue($clean, Resources::CACHE_CONTROL) ); $result->setBlobType( Utilities::tryGetValue( $clean, Resources::X_MS_BLOB_TYPE, $result->getBlobType() ) ); $result->setContentEncoding( Utilities::tryGetValue($clean, Resources::CONTENT_ENCODING) ); $result->setContentLanguage( Utilities::tryGetValue($clean, Resources::CONTENT_LANGUAGE) ); $result->setContentMD5( Utilities::tryGetValue($clean, Resources::CONTENT_MD5) ); $result->setContentType( Utilities::tryGetValue($clean, Resources::CONTENT_TYPE) ); return $result; } /** * Gets blob lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { Validate::isDate($lastModified); $this->_lastModified = $lastModified; } /** * Gets blob etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets blob etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { $this->_etag = $etag; } /** * Gets blob contentType. * * @return string. */ public function getContentType() { return $this->_contentType; } /** * Sets blob contentType. * * @param string $contentType value. * * @return none. */ public function setContentType($contentType) { $this->_contentType = $contentType; } /** * Gets blob contentRange. * * @return string. */ public function getContentRange() { return $this->_contentRange; } /** * Sets blob contentRange. * * @param string $contentRange value. * * @return none. */ public function setContentRange($contentRange) { $this->_contentRange = $contentRange; } /** * Gets blob contentLength. * * @return integer. */ public function getContentLength() { return $this->_contentLength; } /** * Sets blob contentLength. * * @param integer $contentLength value. * * @return none. */ public function setContentLength($contentLength) { Validate::isInteger($contentLength, 'contentLength'); $this->_contentLength = $contentLength; } /** * Gets blob contentEncoding. * * @return string. */ public function getContentEncoding() { return $this->_contentEncoding; } /** * Sets blob contentEncoding. * * @param string $contentEncoding value. * * @return none. */ public function setContentEncoding($contentEncoding) { $this->_contentEncoding = $contentEncoding; } /** * Gets blob contentLanguage. * * @return string. */ public function getContentLanguage() { return $this->_contentLanguage; } /** * Sets blob contentLanguage. * * @param string $contentLanguage value. * * @return none. */ public function setContentLanguage($contentLanguage) { $this->_contentLanguage = $contentLanguage; } /** * Gets blob contentMD5. * * @return string. */ public function getContentMD5() { return $this->_contentMD5; } /** * Sets blob contentMD5. * * @param string $contentMD5 value. * * @return none. */ public function setContentMD5($contentMD5) { $this->_contentMD5 = $contentMD5; } /** * Gets blob cacheControl. * * @return string. */ public function getCacheControl() { return $this->_cacheControl; } /** * Sets blob cacheControl. * * @param string $cacheControl value. * * @return none. */ public function setCacheControl($cacheControl) { $this->_cacheControl = $cacheControl; } /** * Gets blob blobType. * * @return string. */ public function getBlobType() { return $this->_blobType; } /** * Sets blob blobType. * * @param string $blobType value. * * @return none. */ public function setBlobType($blobType) { $this->_blobType = $blobType; } /** * Gets blob leaseStatus. * * @return string. */ public function getLeaseStatus() { return $this->_leaseStatus; } /** * Sets blob leaseStatus. * * @param string $leaseStatus value. * * @return none. */ public function setLeaseStatus($leaseStatus) { $this->_leaseStatus = $leaseStatus; } /** * Gets blob sequenceNumber. * * @return int. */ public function getSequenceNumber() { return $this->_sequenceNumber; } /** * Sets blob sequenceNumber. * * @param int $sequenceNumber value. * * @return none. */ public function setSequenceNumber($sequenceNumber) { Validate::isInteger($sequenceNumber, 'sequenceNumber'); $this->_sequenceNumber = $sequenceNumber; } } PKwL\c'  Gupdraftplus/includes/WindowsAzure/Blob/Models/ListBlobBlocksOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for listBlobBlock wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListBlobBlocksOptions extends BlobServiceOptions { /** * @var string */ private $_leaseId; /** * @var string */ private $_snapshot; /** * @var boolean */ private $_includeUncommittedBlobs; /** * @var boolean */ private $_includeCommittedBlobs; /** * Holds result of list type. You can access it by this order: * $_listType[$this->_includeUncommittedBlobs][$this->_includeCommittedBlobs] * * @var array */ private static $_listType; /** * Constructs the static variable $listType. */ public function __construct() { self::$_listType[true][true] = 'all'; self::$_listType[true][false] = 'uncommitted'; self::$_listType[false][true] = 'committed'; self::$_listType[false][false] = 'all'; $this->_includeUncommittedBlobs = false; $this->_includeCommittedBlobs = false; } /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets blob snapshot. * * @return string. */ public function getSnapshot() { return $this->_snapshot; } /** * Sets blob snapshot. * * @param string $snapshot value. * * @return none. */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } /** * Sets the include uncommittedBlobs flag. * * @param bool $includeUncommittedBlobs value. * * @return none. */ public function setIncludeUncommittedBlobs($includeUncommittedBlobs) { Validate::isBoolean($includeUncommittedBlobs); $this->_includeUncommittedBlobs = $includeUncommittedBlobs; } /** * Indicates if uncommittedBlobs is included or not. * * @return boolean. */ public function getIncludeUncommittedBlobs() { return $this->_includeUncommittedBlobs; } /** * Sets the include committedBlobs flag. * * @param bool $includeCommittedBlobs value. * * @return none. */ public function setIncludeCommittedBlobs($includeCommittedBlobs) { Validate::isBoolean($includeCommittedBlobs); $this->_includeCommittedBlobs = $includeCommittedBlobs; } /** * Indicates if committedBlobs is included or not. * * @return boolean. */ public function getIncludeCommittedBlobs() { return $this->_includeCommittedBlobs; } /** * Gets block list type. * * @return string */ public function getBlockListType() { $includeUncommitted = $this->_includeUncommittedBlobs; $includeCommitted = $this->_includeCommittedBlobs; return self::$_listType[$includeUncommitted][$includeCommitted]; } } PKwL\ oZ7updraftplus/includes/WindowsAzure/Blob/Models/Block.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Holds information about blob block. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Block { /** * @var string */ private $_blockId; /** * @var string */ private $_type; /** * Sets the blockId. * * @param string $blockId The id of the block. * * @return none */ public function setBlockId($blockId) { $this->_blockId = $blockId; } /** * Gets the blockId. * * @return string */ public function getBlockId() { return $this->_blockId; } /** * Sets the type. * * @param string $type The type of the block. * * @return none */ public function setType($type) { $this->_type = $type; } /** * Gets the type. * * @return string */ public function getType() { return $this->_type; } } PKwL\vvJ\\Jupdraftplus/includes/WindowsAzure/Blob/Models/SetBlobPropertiesOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for setBlobProperties wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class SetBlobPropertiesOptions extends BlobServiceOptions { /** * @var BlobProperties */ private $_blobProperties; /** * @var string */ private $_leaseId; /** * @var string */ private $_sequenceNumberAction; /** * @var AccessCondition */ private $_accessCondition; /** * Creates a new SetBlobPropertiesOptions with a specified BlobProperties * instance. * * @param BlobProperties $blobProperties The blob properties instance. */ public function __construct($blobProperties = null) { $this->_blobProperties = is_null($blobProperties) ? new BlobProperties() : clone $blobProperties; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets blob sequenceNumber. * * @return integer. */ public function getSequenceNumber() { return $this->_blobProperties->getSequenceNumber(); } /** * Sets blob sequenceNumber. * * @param integer $sequenceNumber value. * * @return none. */ public function setSequenceNumber($sequenceNumber) { $this->_blobProperties->setSequenceNumber($sequenceNumber); } /** * Gets lease Id for the blob * * @return string */ public function getSequenceNumberAction() { return $this->_sequenceNumberAction; } /** * Sets lease Id for the blob * * @param string $sequenceNumberAction action. * * @return none */ public function setSequenceNumberAction($sequenceNumberAction) { $this->_sequenceNumberAction = $sequenceNumberAction; } /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets blob blobContentLength. * * @return integer. */ public function getBlobContentLength() { return $this->_blobProperties->getContentLength(); } /** * Sets blob blobContentLength. * * @param integer $blobContentLength value. * * @return none. */ public function setBlobContentLength($blobContentLength) { $this->_blobProperties->setContentLength($blobContentLength); } /** * Gets blob ContentType. * * @return string. */ public function getBlobContentType() { return $this->_blobProperties->getContentType(); } /** * Sets blob ContentType. * * @param string $blobContentType value. * * @return none. */ public function setBlobContentType($blobContentType) { $this->_blobProperties->setContentType($blobContentType); } /** * Gets blob ContentEncoding. * * @return string. */ public function getBlobContentEncoding() { return $this->_blobProperties->getContentEncoding(); } /** * Sets blob ContentEncoding. * * @param string $blobContentEncoding value. * * @return none. */ public function setBlobContentEncoding($blobContentEncoding) { $this->_blobProperties->setContentEncoding($blobContentEncoding); } /** * Gets blob ContentLanguage. * * @return string. */ public function getBlobContentLanguage() { return $this->_blobProperties->getContentLanguage(); } /** * Sets blob ContentLanguage. * * @param string $blobContentLanguage value. * * @return none. */ public function setBlobContentLanguage($blobContentLanguage) { $this->_blobProperties->setContentLanguage($blobContentLanguage); } /** * Gets blob ContentMD5. * * @return string. */ public function getBlobContentMD5() { return $this->_blobProperties->getContentMD5(); } /** * Sets blob ContentMD5. * * @param string $blobContentMD5 value. * * @return none. */ public function setBlobContentMD5($blobContentMD5) { $this->_blobProperties->setContentMD5($blobContentMD5); } /** * Gets blob cache control. * * @return string. */ public function getBlobCacheControl() { return $this->_blobProperties->getCacheControl(); } /** * Sets blob cacheControl. * * @param string $blobCacheControl value to use. * * @return none. */ public function setBlobCacheControl($blobCacheControl) { $this->_blobProperties->setCacheControl($blobCacheControl); } }PKwL\^QIupdraftplus/includes/WindowsAzure/Blob/Models/GetBlobPropertiesResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Holds result of calling getBlobProperties * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetBlobPropertiesResult { /** * @var BlobProperties */ private $_properties; /** * @var array */ private $_metadata; /** * Gets blob metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets blob metadata. * * @param string $metadata value. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets blob properties. * * @return BlobProperties. */ public function getProperties() { return $this->_properties; } /** * Sets blob properties. * * @param BlobProperties $properties value. * * @return none. */ public function setProperties($properties) { $this->_properties = $properties; } } PKwL\ Gupdraftplus/includes/WindowsAzure/Blob/Models/SetBlobMetadataResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; /** * Holds results of calling getBlobMetadata wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class SetBlobMetadataResult { /** * @var \DateTime */ private $_lastModified; /** * @var string */ private $_etag; /** * Creates SetBlobMetadataResult from response headers. * * @param array $headers response headers * * @return SetBlobMetadataResult */ public static function create($headers) { $result = new SetBlobMetadataResult(); $date = $headers[Resources::LAST_MODIFIED]; $result->setLastModified(Utilities::rfc1123ToDateTime($date)); $result->setETag($headers[Resources::ETAG]); return $result; } /** * Gets blob lastModified. * * @return \DateTime. */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none. */ public function setLastModified($lastModified) { Validate::isDate($lastModified); $this->_lastModified = $lastModified; } /** * Gets blob etag. * * @return string. */ public function getETag() { return $this->_etag; } /** * Sets blob etag. * * @param string $etag value. * * @return none. */ public function setETag($etag) { Validate::isString($etag, 'etag'); $this->_etag = $etag; } } PKwL\}%Jupdraftplus/includes/WindowsAzure/Blob/Models/CreateBlobSnapshotResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; /** * The result of creating Blob snapshot. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CreateBlobSnapshotResult { /** * A DateTime value which uniquely identifies the snapshot. * @var string */ private $_snapshot; /** * The ETag for the destination blob. * @var string */ private $_etag; /** * The date/time that the copy operation to the destination blob completed. * @var \DateTime */ private $_lastModified; /** * Creates CreateBlobSnapshotResult object from the response of the * create Blob snapshot request. * * @param array $headers The HTTP response headers in array representation. * * @return CreateBlobSnapshotResult */ public static function create($headers) { $result = new CreateBlobSnapshotResult(); $headerWithLowerCaseKey = array_change_key_case($headers); $result->setETag($headerWithLowerCaseKey[Resources::ETAG]); $result->setLastModified( Utilities::rfc1123ToDateTime( $headerWithLowerCaseKey[Resources::LAST_MODIFIED] ) ); $result->setSnapshot($headerWithLowerCaseKey[Resources::X_MS_SNAPSHOT]); return $result; } /** * Gets snapshot. * * @return string */ public function getSnapshot() { return $this->_snapshot; } /** * Sets snapshot. * * @param string $snapshot value. * * @return none */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } /** * Gets ETag. * * @return string */ public function getETag() { return $this->_etag; } /** * Sets ETag. * * @param string $etag value. * * @return none */ public function setETag($etag) { $this->_etag = $etag; } /** * Gets blob lastModified. * * @return \DateTime */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none */ public function setLastModified($lastModified) { $this->_lastModified = $lastModified; } } PKwL\R  Hupdraftplus/includes/WindowsAzure/Blob/Models/CreateBlobPagesOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Optional parameters for create and clear blob pages * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CreateBlobPagesOptions extends BlobServiceOptions { /** * @var string */ private $_contentMD5; /** * @var string */ private $_leaseId; /** * @var AccessCondition */ private $_accessCondition; /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets blob contentMD5. * * @return string. */ public function getContentMD5() { return $this->_contentMD5; } /** * Sets blob contentMD5. * * @param string $contentMD5 value. * * @return none. */ public function setContentMD5($contentMD5) { $this->_contentMD5 = $contentMD5; } } PKwL\zzHupdraftplus/includes/WindowsAzure/Blob/Models/DeleteContainerOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * The optional for deleteContainer API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class DeleteContainerOptions extends BlobServiceOptions { /** * @var AccessCondition */ private $_accessCondition; /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } } PKwL\Iupdraftplus/includes/WindowsAzure/Blob/Models/CommitBlobBlocksOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Validate; /** * Optional parameters for commitBlobBlocks * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CommitBlobBlocksOptions extends BlobServiceOptions { /** * @var string */ private $_blobContentType; /** * @var string */ private $_blobContentEncoding; /** * @var string */ private $_blobContentLanguage; /** * @var string */ private $_blobContentMD5; /** * @var string */ private $_blobCacheControl; /** * @var array */ private $_metadata; /** * @var string */ private $_leaseId; /** * @var AccessCondition */ private $_accessCondition; /** * Gets blob ContentType. * * @return string. */ public function getBlobContentType() { return $this->_blobContentType; } /** * Sets blob ContentType. * * @param string $blobContentType value. * * @return none. */ public function setBlobContentType($blobContentType) { $this->_blobContentType = $blobContentType; } /** * Gets blob ContentEncoding. * * @return string. */ public function getBlobContentEncoding() { return $this->_blobContentEncoding; } /** * Sets blob ContentEncoding. * * @param string $blobContentEncoding value. * * @return none. */ public function setBlobContentEncoding($blobContentEncoding) { $this->_blobContentEncoding = $blobContentEncoding; } /** * Gets blob ContentLanguage. * * @return string. */ public function getBlobContentLanguage() { return $this->_blobContentLanguage; } /** * Sets blob ContentLanguage. * * @param string $blobContentLanguage value. * * @return none. */ public function setBlobContentLanguage($blobContentLanguage) { $this->_blobContentLanguage = $blobContentLanguage; } /** * Gets blob ContentMD5. * * @return string. */ public function getBlobContentMD5() { return $this->_blobContentMD5; } /** * Sets blob ContentMD5. * * @param string $blobContentMD5 value. * * @return none. */ public function setBlobContentMD5($blobContentMD5) { $this->_blobContentMD5 = $blobContentMD5; } /** * Gets blob cache control. * * @return string. */ public function getBlobCacheControl() { return $this->_blobCacheControl; } /** * Sets blob cacheControl. * * @param string $blobCacheControl value to use. * * @return none. */ public function setBlobCacheControl($blobCacheControl) { $this->_blobCacheControl = $blobCacheControl; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets blob metadata. * * @return array. */ public function getMetadata() { return $this->_metadata; } /** * Sets blob metadata. * * @param string $metadata value. * * @return none. */ public function setMetadata($metadata) { $this->_metadata = $metadata; } /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } } PKwL\$SBupdraftplus/includes/WindowsAzure/Blob/Models/PublicAccessType.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; /** * Holds public acces types for a container. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class PublicAccessType { const NONE = Resources::EMPTY_STRING; const BLOBS_ONLY = 'blob'; const CONTAINER_AND_BLOBS = 'container'; /** * Validates the public access. * * @param string $type The public access type. * * @return boolean */ public static function isValid($type) { switch ($type) { case self::NONE: case self::BLOBS_ONLY: case self::CONTAINER_AND_BLOBS: return true; default: return false; } } } PKwL\< @updraftplus/includes/WindowsAzure/Blob/Models/CopyBlobResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * The result of calling copyBlob API. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CopyBlobResult { /** * @var string */ private $_etag; /** * @var \DateTime */ private $_lastModified; /** * Creates CopyBlobResult object from the response of the copy blob request. * * @param array $headers The HTTP response headers in array representation. * * @return CopyBlobResult */ public static function create($headers) { $result = new CopyBlobResult(); $result->setETag(Utilities::tryGetValueInsensitive( Resources::ETAG, $headers)); if (Utilities::arrayKeyExistsInsensitive(Resources::LAST_MODIFIED, $headers)) { $lastModified = Utilities::tryGetValueInsensitive( Resources::LAST_MODIFIED, $headers); $result->setLastModified(Utilities::rfc1123ToDateTime($lastModified)); } return $result; } /** * Gets ETag. * * @return string */ public function getETag() { return $this->_etag; } /** * Sets ETag. * * @param string $etag value. * * @return none */ public function setETag($etag) { $this->_etag = $etag; } /** * Gets blob lastModified. * * @return \DateTime */ public function getLastModified() { return $this->_lastModified; } /** * Sets blob lastModified. * * @param \DateTime $lastModified value. * * @return none */ public function setLastModified($lastModified) { $this->_lastModified = $lastModified; } } PKwL\<'))Aupdraftplus/includes/WindowsAzure/Blob/Models/ListBlobsResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Blob\Models\Blob; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\InvalidArgumentTypeException; /** * Hold result of calliing listBlobs wrapper. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ListBlobsResult { /** * @var array */ private $_blobPrefixes; /** * @var array */ private $_blobs; /** * @var string */ private $_delimiter; /** * @var string */ private $_prefix; /** * @var string */ private $_marker; /** * @var string */ private $_nextMarker; /** * @var integer */ private $_maxResults; /** * @var string */ private $_containerName; /** * Creates ListBlobsResult object from parsed XML response. * * @param array $parsed XML response parsed into array. * * @return ListBlobsResult */ public static function create($parsed) { $result = new ListBlobsResult(); $result->_containerName = Utilities::tryGetKeysChainValue( $parsed, Resources::XTAG_ATTRIBUTES, Resources::XTAG_CONTAINER_NAME ); $result->_prefix = Utilities::tryGetValue( $parsed, Resources::QP_PREFIX ); $result->_marker = Utilities::tryGetValue( $parsed, Resources::QP_MARKER ); $result->_nextMarker = Utilities::tryGetValue( $parsed, Resources::QP_NEXT_MARKER ); $result->_maxResults = intval( Utilities::tryGetValue($parsed, Resources::QP_MAX_RESULTS, 0) ); $result->_delimiter = Utilities::tryGetValue( $parsed, Resources::QP_DELIMITER ); $result->_blobs = array(); $result->_blobPrefixes = array(); $rawBlobs = array(); $rawBlobPrefixes = array(); if ( is_array($parsed['Blobs']) && array_key_exists('Blob', $parsed['Blobs']) ) { $rawBlobs = Utilities::getArray($parsed['Blobs']['Blob']); } foreach ($rawBlobs as $value) { $blob = new Blob(); $blob->setName($value['Name']); if (isset($value['Url'])) $blob->setUrl($value['Url']); $blob->setSnapshot(Utilities::tryGetValue($value, 'Snapshot')); $blob->setProperties( BlobProperties::create( Utilities::tryGetValue($value, 'Properties') ) ); $blob->setMetadata( Utilities::tryGetValue($value, Resources::QP_METADATA, array()) ); $result->_blobs[] = $blob; } if ( is_array($parsed['Blobs']) && array_key_exists('BlobPrefix', $parsed['Blobs']) ) { $rawBlobPrefixes = Utilities::getArray($parsed['Blobs']['BlobPrefix']); } foreach ($rawBlobPrefixes as $value) { $blobPrefix = new BlobPrefix(); $blobPrefix->setName($value['Name']); $result->_blobPrefixes[] = $blobPrefix; } return $result; } /** * Gets blobs. * * @return array */ public function getBlobs() { return $this->_blobs; } /** * Sets blobs. * * @param array $blobs list of blobs * * @return none */ public function setBlobs($blobs) { $this->_blobs = array(); foreach ($blobs as $blob) { $this->_blobs[] = clone $blob; } } /** * Gets blobPrefixes. * * @return array */ public function getBlobPrefixes() { return $this->_blobPrefixes; } /** * Sets blobPrefixes. * * @param array $blobPrefixes list of blobPrefixes * * @return none */ public function setBlobPrefixes($blobPrefixes) { $this->_blobPrefixes = array(); foreach ($blobPrefixes as $blob) { $this->_blobPrefixes[] = clone $blob; } } /** * Gets prefix. * * @return string */ public function getPrefix() { return $this->_prefix; } /** * Sets prefix. * * @param string $prefix value. * * @return none */ public function setPrefix($prefix) { $this->_prefix = $prefix; } /** * Gets prefix. * * @return string */ public function getDelimiter() { return $this->_delimiter; } /** * Sets prefix. * * @param string $delimiter value. * * @return none */ public function setDelimiter($delimiter) { $this->_delimiter = $delimiter; } /** * Gets marker. * * @return string */ public function getMarker() { return $this->_marker; } /** * Sets marker. * * @param string $marker value. * * @return none */ public function setMarker($marker) { $this->_marker = $marker; } /** * Gets max results. * * @return integer */ public function getMaxResults() { return $this->_maxResults; } /** * Sets max results. * * @param integer $maxResults value. * * @return none */ public function setMaxResults($maxResults) { $this->_maxResults = $maxResults; } /** * Gets next marker. * * @return string */ public function getNextMarker() { return $this->_nextMarker; } /** * Sets next marker. * * @param string $nextMarker value. * * @return none */ public function setNextMarker($nextMarker) { $this->_nextMarker = $nextMarker; } /** * Gets container name. * * @return string */ public function getContainerName() { return $this->_containerName; } /** * Sets container name. * * @param string $containerName value. * * @return none */ public function setContainerName($containerName) { $this->_containerName = $containerName; } } PKwL\z44>updraftplus/includes/WindowsAzure/Blob/Models/ContainerACL.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Blob\Models\AccessPolicy; use WindowsAzure\Blob\Models\SignedIdentifier; use WindowsAzure\Blob\Models\PublicAccessType; use WindowsAzure\Common\Internal\Serialization\XmlSerializer; /** * Holds conatiner ACL members. * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ContainerAcl { /** * All available types can be found in PublicAccessType * * @var string */ private $_publicAccess; /** * @var array */ private $_signedIdentifiers = array(); /* * The root name of XML elemenet representation. * * @var string */ public static $xmlRootName = 'SignedIdentifiers'; /** * Parses the given array into signed identifiers. * * @param string $publicAccess The container public access. * @param array $parsed The parsed response into array representation. * * @return none */ public static function create($publicAccess, $parsed) { $result = new ContainerAcl(); $result->_publicAccess = $publicAccess; $result->_signedIdentifiers = array(); if (!empty($parsed) && is_array($parsed['SignedIdentifier'])) { $entries = $parsed['SignedIdentifier']; $temp = Utilities::getArray($entries); foreach ($temp as $value) { $startString = urldecode($value['AccessPolicy']['Start']); $expiryString = urldecode($value['AccessPolicy']['Expiry']); $start = Utilities::convertToDateTime($startString); $expiry = Utilities::convertToDateTime($expiryString); $permission = $value['AccessPolicy']['Permission']; $id = $value['Id']; $result->addSignedIdentifier($id, $start, $expiry, $permission); } } return $result; } /** * Gets container signed modifiers. * * @return array. */ public function getSignedIdentifiers() { return $this->_signedIdentifiers; } /** * Sets container signed modifiers. * * @param array $signedIdentifiers value. * * @return none. */ public function setSignedIdentifiers($signedIdentifiers) { $this->_signedIdentifiers = $signedIdentifiers; } /** * Gets container publicAccess. * * @return string. */ public function getPublicAccess() { return $this->_publicAccess; } /** * Sets container publicAccess. * * @param string $publicAccess value. * * @return none. */ public function setPublicAccess($publicAccess) { Validate::isTrue( PublicAccessType::isValid($publicAccess), Resources::INVALID_BLOB_PAT_MSG ); $this->_publicAccess = $publicAccess; } /** * Adds new signed modifier * * @param string $id a unique id for this modifier * @param \DateTime $start The time at which the Shared Access Signature * becomes valid. If omitted, start time for this call is assumed to be * the time when the Blob service receives the request. * @param \DateTime $expiry The time at which the Shared Access Signature * becomes invalid. This field may be omitted if it has been specified as * part of a container-level access policy. * @param string $permission The permissions associated with the Shared * Access Signature. The user is restricted to operations allowed by the * permissions. Valid permissions values are read (r), write (w), delete (d) and * list (l). * * @return none. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/hh508996.aspx */ public function addSignedIdentifier($id, $start, $expiry, $permission) { Validate::isString($id, 'id'); Validate::isDate($start); Validate::isDate($expiry); Validate::isString($permission, 'permission'); $accessPolicy = new AccessPolicy(); $accessPolicy->setStart($start); $accessPolicy->setExpiry($expiry); $accessPolicy->setPermission($permission); $signedIdentifier = new SignedIdentifier(); $signedIdentifier->setId($id); $signedIdentifier->setAccessPolicy($accessPolicy); $this->_signedIdentifiers[] = $signedIdentifier; } /** * Converts this object to array representation for XML serialization * * @return array. */ public function toArray() { $array = array(); foreach ($this->_signedIdentifiers as $value) { $array[] = $value->toArray(); } return $array; } /** * Converts this current object to XML representation. * * @param XmlSerializer $xmlSerializer The XML serializer. * * @return string. */ public function toXml($xmlSerializer) { $properties = array( XmlSerializer::DEFAULT_TAG => 'SignedIdentifier', XmlSerializer::ROOT_NAME => self::$xmlRootName ); return $xmlSerializer->serialize($this->toArray(), $properties); } } PKwL\ Hupdraftplus/includes/WindowsAzure/Blob/Models/GetBlobMetadataOptions.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob\Models; /** * Optional parameters for getBlobMetadata wrapper * * @category Microsoft * @package WindowsAzure\Blob\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetBlobMetadataOptions extends BlobServiceOptions { /** * @var string */ private $_leaseId; /** * @var string */ private $_snapshot; /** * @var AccessCondition */ private $_accessCondition; /** * Gets lease Id for the blob * * @return string */ public function getLeaseId() { return $this->_leaseId; } /** * Sets lease Id for the blob * * @param string $leaseId the blob lease id. * * @return none */ public function setLeaseId($leaseId) { $this->_leaseId = $leaseId; } /** * Gets access condition * * @return AccessCondition */ public function getAccessCondition() { return $this->_accessCondition; } /** * Sets access condition * * @param AccessCondition $accessCondition value to use. * * @return none. */ public function setAccessCondition($accessCondition) { $this->_accessCondition = $accessCondition; } /** * Gets blob snapshot. * * @return string. */ public function getSnapshot() { return $this->_snapshot; } /** * Sets blob snapshot. * * @param string $snapshot value. * * @return none. */ public function setSnapshot($snapshot) { $this->_snapshot = $snapshot; } } PKwL\V(A(A8updraftplus/includes/WindowsAzure/Blob/BlobRestProxy.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Blob; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Models\ServiceProperties; use WindowsAzure\Common\Internal\ServiceRestProxy; use WindowsAzure\Blob\Internal\IBlob; use WindowsAzure\Blob\Models\BlobServiceOptions; use WindowsAzure\Common\Models\GetServicePropertiesResult; use WindowsAzure\Blob\Models\ListContainersOptions; use WindowsAzure\Blob\Models\ListContainersResult; use WindowsAzure\Blob\Models\CreateContainerOptions; use WindowsAzure\Blob\Models\GetContainerPropertiesResult; use WindowsAzure\Blob\Models\GetContainerACLResult; use WindowsAzure\Blob\Models\SetContainerMetadataOptions; use WindowsAzure\Blob\Models\DeleteContainerOptions; use WindowsAzure\Blob\Models\ListBlobsOptions; use WindowsAzure\Blob\Models\ListBlobsResult; use WindowsAzure\Blob\Models\BlobType; use WindowsAzure\Blob\Models\Block; use WindowsAzure\Blob\Models\CreateBlobOptions; use WindowsAzure\Blob\Models\BlobProperties; use WindowsAzure\Blob\Models\GetBlobPropertiesOptions; use WindowsAzure\Blob\Models\GetBlobPropertiesResult; use WindowsAzure\Blob\Models\SetBlobPropertiesOptions; use WindowsAzure\Blob\Models\SetBlobPropertiesResult; use WindowsAzure\Blob\Models\GetBlobMetadataOptions; use WindowsAzure\Blob\Models\GetBlobMetadataResult; use WindowsAzure\Blob\Models\SetBlobMetadataOptions; use WindowsAzure\Blob\Models\SetBlobMetadataResult; use WindowsAzure\Blob\Models\GetBlobOptions; use WindowsAzure\Blob\Models\GetBlobResult; use WindowsAzure\Blob\Models\DeleteBlobOptions; use WindowsAzure\Blob\Models\LeaseMode; use WindowsAzure\Blob\Models\AcquireLeaseOptions; use WindowsAzure\Blob\Models\AcquireLeaseResult; use WindowsAzure\Blob\Models\CreateBlobPagesOptions; use WindowsAzure\Blob\Models\CreateBlobPagesResult; use WindowsAzure\Blob\Models\PageWriteOption; use WindowsAzure\Blob\Models\ListPageBlobRangesOptions; use WindowsAzure\Blob\Models\ListPageBlobRangesResult; use WindowsAzure\Blob\Models\CreateBlobBlockOptions; use WindowsAzure\Blob\Models\CommitBlobBlocksOptions; use WindowsAzure\Blob\Models\BlockList; use WindowsAzure\Blob\Models\ListBlobBlocksOptions; use WindowsAzure\Blob\Models\ListBlobBlocksResult; use WindowsAzure\Blob\Models\CopyBlobOptions; use WindowsAzure\Blob\Models\CreateBlobSnapshotOptions; use WindowsAzure\Blob\Models\CreateBlobSnapshotResult; use WindowsAzure\Blob\Models\PageRange; use WindowsAzure\Blob\Models\CopyBlobResult; use WindowsAzure\Blob\Models\BreakLeaseResult; /** * This class constructs HTTP requests and receive HTTP responses for blob * service layer. * * @category Microsoft * @package WindowsAzure\Blob * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BlobRestProxy extends ServiceRestProxy implements IBlob { /** * @var int Defaults to 32MB */ private $_SingleBlobUploadThresholdInBytes = 33554432 ; /** * Get the value for SingleBlobUploadThresholdInBytes * * @return int */ public function getSingleBlobUploadThresholdInBytes() { return $this->_SingleBlobUploadThresholdInBytes; } /** * Set the value for SingleBlobUploadThresholdInBytes, Max 64MB * * @param int $val The max size to send as a single blob block * * @return none */ public function setSingleBlobUploadThresholdInBytes($val) { if ($val > 67108864) { // What should the proper action here be? $val = 67108864; } elseif ($val < 1) { // another spot that could use looking at $val = 33554432; } $this->_SingleBlobUploadThresholdInBytes = $val; } /** * Gets the copy blob source name with specified parameters. * * @param string $containerName The name of the container. * @param string $blobName The name of the blob. * @param Models\CopyBlobOptions $options The optional parameters. * * @return string */ private function _getCopyBlobSourceName($containerName, $blobName, $options) { $sourceName = $this->_getBlobUrl($containerName, $blobName); if (!is_null($options->getSourceSnapshot())) { $sourceName .= '?snapshot=' . $options->getSourceSnapshot(); } return $sourceName; } /** * Creates URI path for blob. * * @param string $container The container name. * @param string $blob The blob name. * * @return string */ private function _createPath($container, $blob) { $encodedBlob = urlencode($blob); // Unencode the forward slashes to match what the server expects. $encodedBlob = str_replace('%2F', '/', $encodedBlob); // Unencode the backward slashes to match what the server expects. $encodedBlob = str_replace('%5C', '/', $encodedBlob); // Re-encode the spaces (encoded as space) to the % encoding. $encodedBlob = str_replace('+', '%20', $encodedBlob); // Empty container means accessing default container if (empty($container)) { return $encodedBlob; } else { return $container . '/' . $encodedBlob; } } /** * Creates full URI to the given blob. * * @param string $container The container name. * @param string $blob The blob name. * * @return string */ private function _getBlobUrl($container, $blob) { $encodedBlob = urlencode($blob); // Unencode the forward slashes to match what the server expects. $encodedBlob = str_replace('%2F', '/', $encodedBlob); // Unencode the backward slashes to match what the server expects. $encodedBlob = str_replace('%5C', '/', $encodedBlob); // Re-encode the spaces (encoded as space) to the % encoding. $encodedBlob = str_replace('+', '%20', $encodedBlob); // Empty container means accessing default container if (empty($container)) { $encodedBlob = $encodedBlob; } else { $encodedBlob = $container . '/' . $encodedBlob; } return $this->getUri() . '/' . $encodedBlob; } /** * Creates GetBlobPropertiesResult from headers array. * * @param array $headers The HTTP response headers array. * * @return GetBlobPropertiesResult */ private function _getBlobPropertiesResultFromResponse($headers) { $result = new GetBlobPropertiesResult(); $properties = new BlobProperties(); $d = $headers[Resources::LAST_MODIFIED]; $bType = $headers[Resources::X_MS_BLOB_TYPE]; $cLength = intval($headers[Resources::CONTENT_LENGTH]); $lStatus = Utilities::tryGetValue($headers, Resources::X_MS_LEASE_STATUS); $cType = Utilities::tryGetValue($headers, Resources::CONTENT_TYPE); $cMD5 = Utilities::tryGetValue($headers, Resources::CONTENT_MD5); $cEncoding = Utilities::tryGetValue($headers, Resources::CONTENT_ENCODING); $cLanguage = Utilities::tryGetValue($headers, Resources::CONTENT_LANGUAGE); $cControl = Utilities::tryGetValue($headers, Resources::CACHE_CONTROL); $etag = $headers[Resources::ETAG]; $metadata = $this->getMetadataArray($headers); if (array_key_exists(Resources::X_MS_BLOB_SEQUENCE_NUMBER, $headers)) { $sNumber = intval($headers[Resources::X_MS_BLOB_SEQUENCE_NUMBER]); $properties->setSequenceNumber($sNumber); } $properties->setBlobType($bType); $properties->setCacheControl($cControl); $properties->setContentEncoding($cEncoding); $properties->setContentLanguage($cLanguage); $properties->setContentLength($cLength); $properties->setContentMD5($cMD5); $properties->setContentType($cType); $properties->setETag($etag); $properties->setLastModified(Utilities::rfc1123ToDateTime($d)); $properties->setLeaseStatus($lStatus); $result->setProperties($properties); $result->setMetadata($metadata); return $result; } /** * Helper method for getContainerProperties and getContainerMetadata. * * @param string $container The container name. * @param Models\BlobServiceOptions $options The optional parameters. * @param string $operation The operation string. Should be * 'metadata' to get metadata. * * @return Models\GetContainerPropertiesResult */ private function _getContainerPropertiesImpl($container, $options = null, $operation = null ) { Validate::isString($container, 'container'); $method = Resources::HTTP_GET; $headers = array(); $queryParams = array(); $postParams = array(); $path = $container; $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new BlobServiceOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'container' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, $operation ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $result = new GetContainerPropertiesResult(); $metadata = $this->getMetadataArray($response->getHeader()); $date = $response->getHeader(Resources::LAST_MODIFIED); $date = Utilities::rfc1123ToDateTime($date); $result->setETag($response->getHeader(Resources::ETAG)); $result->setMetadata($metadata); $result->setLastModified($date); return $result; } /** * Adds optional create blob headers. * * @param CreateBlobOptions $options The optional parameters. * @param array $headers The HTTP request headers. * * @return array */ private function _addCreateBlobOptionalHeaders($options, $headers) { $contentType = $options->getContentType(); $metadata = $options->getMetadata(); $blobContentType = $options->getBlobContentType(); $blobContentEncoding = $options->getBlobContentEncoding(); $blobContentLanguage = $options->getBlobContentLanguage(); $blobContentMD5 = $options->getBlobContentMD5(); $blobCacheControl = $options->getBlobCacheControl(); $leaseId = $options->getLeaseId(); if (!is_null($contentType)) { $this->addOptionalHeader( $headers, Resources::CONTENT_TYPE, $options->getContentType() ); } else { $this->addOptionalHeader( $headers, Resources::CONTENT_TYPE, Resources::BINARY_FILE_TYPE ); } $headers = $this->addMetadataHeaders($headers, $metadata); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalHeader( $headers, Resources::CONTENT_ENCODING, $options->getContentEncoding() ); $this->addOptionalHeader( $headers, Resources::CONTENT_LANGUAGE, $options->getContentLanguage() ); $this->addOptionalHeader( $headers, Resources::CONTENT_MD5, $options->getContentMD5() ); $this->addOptionalHeader( $headers, Resources::CACHE_CONTROL, $options->getCacheControl() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $leaseId ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_TYPE, $blobContentType ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_ENCODING, $blobContentEncoding ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_LANGUAGE, $blobContentLanguage ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_MD5, $blobContentMD5 ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CACHE_CONTROL, $blobCacheControl ); return $headers; } /** * Adds Range header to the headers array. * * @param array $headers The HTTP request headers. * @param integer $start The start byte. * @param integer $end The end byte. * * @return array */ private function _addOptionalRangeHeader($headers, $start, $end) { if (!is_null($start) || !is_null($end)) { $range = $start . '-' . $end; $rangeValue = 'bytes=' . $range; $this->addOptionalHeader($headers, Resources::RANGE, $rangeValue); } return $headers; } /** * Does the actual work for leasing a blob. * * @param string $leaseAction The lease action string. * @param string $container The container name. * @param string $blob The blob to lease name. * @param string $leaseId The existing lease id. * @param BlobServiceOptions $options The optional parameters. * @param AccessCondition $accessCondition The access conditions. * * @return array */ private function _putLeaseImpl($leaseAction, $container, $blob, $leaseId, $options, $accessCondition = null ) { Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); Validate::isString($container, 'container'); $method = Resources::HTTP_PUT; $headers = array(); $queryParams = array(); $postParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::EMPTY_STRING; switch ($leaseAction) { case LeaseMode::ACQUIRE_ACTION: $this->addOptionalHeader($headers, Resources::X_MS_LEASE_DURATION, -1); $statusCode = Resources::STATUS_CREATED; break; case LeaseMode::RENEW_ACTION: $statusCode = Resources::STATUS_OK; break; case LeaseMode::RELEASE_ACTION: $statusCode = Resources::STATUS_OK; break; case LeaseMode::BREAK_ACTION: $statusCode = Resources::STATUS_ACCEPTED; break; default: throw new \Exception(Resources::NOT_IMPLEMENTED_MSG); } if (!is_null($options)) { $options = new BlobServiceOptions(); } $headers = $this->addOptionalAccessConditionHeader( $headers, $accessCondition ); $this->addOptionalHeader($headers, Resources::X_MS_LEASE_ID, $leaseId); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ACTION, $leaseAction ); $this->addOptionalQueryParam($queryParams, Resources::QP_COMP, 'lease'); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); return $response->getHeader(); } /** * Does actual work for create and clear blob pages. * * @param string $action Either clear or create. * @param string $container The container name. * @param string $blob The blob name. * @param PageRange $range The page ranges. * @param string|resource $content The content stream. * @param CreateBlobPagesOptions $options The optional parameters. * * @return CreateBlobPagesResult */ private function _updatePageBlobPagesImpl($action, $container, $blob, $range, $content, $options = null ) { Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); Validate::isString($container, 'container'); Validate::isTrue( $range instanceof PageRange, sprintf( Resources::INVALID_PARAM_MSG, 'range', get_class(new PageRange()) ) ); Validate::isTrue( is_string($content) || is_resource($content), sprintf(Resources::INVALID_PARAM_MSG, 'content', 'string|resource') ); $method = Resources::HTTP_PUT; $headers = array(); $queryParams = array(); $postParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_CREATED; // If read file failed for any reason it will throw an exception. $body = is_resource($content) ? stream_get_contents($content) : $content; if (is_null($options)) { $options = new CreateBlobPagesOptions(); } $headers = $this->_addOptionalRangeHeader( $headers, $range->getStart(), $range->getEnd() ); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalHeader( $headers, Resources::CONTENT_MD5, $options->getContentMD5() ); $this->addOptionalHeader( $headers, Resources::X_MS_PAGE_WRITE, $action ); $this->addOptionalHeader( $headers, Resources::CONTENT_TYPE, Resources::URL_ENCODED_CONTENT_TYPE ); $this->addOptionalQueryParam($queryParams, Resources::QP_COMP, 'page'); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode, $body ); return CreateBlobPagesResult::create($response->getHeader()); } /** * Gets the properties of the Blob service. * * @param Models\BlobServiceOptions $options The optional parameters. * * @return WindowsAzure\Common\Models\GetServicePropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/hh452239.aspx */ public function getServiceProperties($options = null) { $method = Resources::HTTP_GET; $headers = array(); $queryParams = array(); $postParams = array(); $path = Resources::EMPTY_STRING; $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new BlobServiceOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'service' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'properties' ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $parsed = $this->dataSerializer->unserialize($response->getBody()); return GetServicePropertiesResult::create($parsed); } /** * Sets the properties of the Blob service. * * It's recommended to use getServiceProperties, alter the returned object and * then use setServiceProperties with this altered object. * * @param ServiceProperties $serviceProperties The service properties. * @param Models\BlobServiceOptions $options The optional parameters. * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/hh452235.aspx */ public function setServiceProperties($serviceProperties, $options = null) { Validate::isTrue( $serviceProperties instanceof ServiceProperties, Resources::INVALID_SVC_PROP_MSG ); $method = Resources::HTTP_PUT; $headers = array(); $queryParams = array(); $postParams = array(); $statusCode = Resources::STATUS_ACCEPTED; $path = Resources::EMPTY_STRING; $body = $serviceProperties->toXml($this->dataSerializer); if (is_null($options)) { $options = new BlobServiceOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'service' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'properties' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalHeader( $headers, Resources::CONTENT_TYPE, Resources::URL_ENCODED_CONTENT_TYPE ); $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode, $body ); } /** * Lists all of the containers in the given storage account. * * @param Models\ListContainersOptions $options The optional parameters. * * @return WindowsAzure\Blob\Models\ListContainersResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179352.aspx */ public function listContainers($options = null) { $method = Resources::HTTP_GET; $headers = array(); $queryParams = array(); $postParams = array(); $path = Resources::EMPTY_STRING; $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new ListContainersOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'list' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_PREFIX, $options->getPrefix() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_MARKER, $options->getMarker() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_MAX_RESULTS, $options->getMaxResults() ); $isInclude = $options->getIncludeMetadata(); $isInclude = $isInclude ? 'metadata' : null; $this->addOptionalQueryParam( $queryParams, Resources::QP_INCLUDE, $isInclude ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $parsed = $this->dataSerializer->unserialize($response->getBody()); return ListContainersResult::create($parsed); } /** * Creates a new container in the given storage account. * * @param string $container The container name. * @param Models\CreateContainerOptions $options The optional parameters. * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179468.aspx */ public function createContainer($container, $options = null) { Validate::isString($container, 'container'); Validate::notNullOrEmpty($container, 'container'); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(Resources::QP_REST_TYPE => 'container'); $path = $container; $statusCode = Resources::STATUS_CREATED; if (is_null($options)) { $options = new CreateContainerOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $metadata = $options->getMetadata(); $headers = $this->generateMetadataHeaders($metadata); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_PUBLIC_ACCESS, $options->getPublicAccess() ); $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); } /** * Creates a new container in the given storage account. * * @param string $container The container name. * @param Models\DeleteContainerOptions $options The optional parameters. * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179408.aspx */ public function deleteContainer($container, $options = null) { Validate::isString($container, 'container'); Validate::notNullOrEmpty($container, 'container'); $method = Resources::HTTP_DELETE; $headers = array(); $postParams = array(); $queryParams = array(); $path = $container; $statusCode = Resources::STATUS_ACCEPTED; if (is_null($options)) { $options = new DeleteContainerOptions(); } $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'container' ); $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); } /** * Returns all properties and metadata on the container. * * @param string $container name * @param Models\BlobServiceOptions $options optional parameters * * @return Models\GetContainerPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179370.aspx */ public function getContainerProperties($container, $options = null) { return $this->_getContainerPropertiesImpl($container, $options); } /** * Returns only user-defined metadata for the specified container. * * @param string $container name * @param Models\BlobServiceOptions $options optional parameters * * @return Models\GetContainerPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691976.aspx */ public function getContainerMetadata($container, $options = null) { return $this->_getContainerPropertiesImpl($container, $options, 'metadata'); } /** * Gets the access control list (ACL) and any container-level access policies * for the container. * * @param string $container The container name. * @param Models\BlobServiceOptions $options The optional parameters. * * @return Models\GetContainerAclResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179469.aspx */ public function getContainerAcl($container, $options = null) { Validate::isString($container, 'container'); $method = Resources::HTTP_GET; $headers = array(); $postParams = array(); $queryParams = array(); $path = $container; $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new BlobServiceOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'container' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'acl' ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $access = $response->getHeader(Resources::X_MS_BLOB_PUBLIC_ACCESS); $etag = $response->getHeader(Resources::ETAG); $modified = $response->getHeader(Resources::LAST_MODIFIED); $modifiedDate = Utilities::convertToDateTime($modified); $parsed = $this->dataSerializer->unserialize($response->getBody()); return GetContainerAclResult::create($access, $etag, $modifiedDate, $parsed); } /** * Sets the ACL and any container-level access policies for the container. * * @param string $container name * @param Models\ContainerAcl $acl access control list for container * @param Models\BlobServiceOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179391.aspx */ public function setContainerAcl($container, $acl, $options = null) { Validate::isString($container, 'container'); Validate::notNullOrEmpty($acl, 'acl'); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $path = $container; $statusCode = Resources::STATUS_OK; $body = $acl->toXml($this->dataSerializer); if (is_null($options)) { $options = new BlobServiceOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'container' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'acl' ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_PUBLIC_ACCESS, $acl->getPublicAccess() ); $this->addOptionalHeader( $headers, Resources::CONTENT_TYPE, Resources::URL_ENCODED_CONTENT_TYPE ); $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode, $body ); } /** * Sets metadata headers on the container. * * @param string $container name * @param array $metadata metadata key/value pair. * @param Models\SetContainerMetadataOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179362.aspx */ public function setContainerMetadata($container, $metadata, $options = null) { Validate::isString($container, 'container'); $this->validateMetadata($metadata); $method = Resources::HTTP_PUT; $headers = $this->generateMetadataHeaders($metadata); $postParams = array(); $queryParams = array(); $path = $container; $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new SetContainerMetadataOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'container' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'metadata' ); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); } /** * Lists all of the blobs in the given container. * * @param string $container The container name. * @param Models\ListBlobsOptions $options The optional parameters. * * @return Models\ListBlobsResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd135734.aspx */ public function listBlobs($container, $options = null) { Validate::isString($container, 'container'); $method = Resources::HTTP_GET; $headers = array(); $postParams = array(); $queryParams = array(); $path = $container; $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new ListBlobsOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_REST_TYPE, 'container' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'list' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_PREFIX, str_replace('\\', '/', $options->getPrefix()) ); $this->addOptionalQueryParam( $queryParams, Resources::QP_MARKER, $options->getMarker() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_DELIMITER, $options->getDelimiter() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_MAX_RESULTS, $options->getMaxResults() ); $includeMetadata = $options->getIncludeMetadata(); $includeSnapshots = $options->getIncludeSnapshots(); $includeUncommittedBlobs = $options->getIncludeUncommittedBlobs(); $includeValue = $this->groupQueryValues( array( $includeMetadata ? 'metadata' : null, $includeSnapshots ? 'snapshots' : null, $includeUncommittedBlobs ? 'uncommittedblobs' : null ) ); $this->addOptionalQueryParam( $queryParams, Resources::QP_INCLUDE, $includeValue ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $parsed = $this->dataSerializer->unserialize($response->getBody()); return ListBlobsResult::create($parsed); } /** * Creates a new page blob. Note that calling createPageBlob to create a page * blob only initializes the blob. * To add content to a page blob, call createBlobPages method. * * @param string $container The container name. * @param string $blob The blob name. * @param integer $length Specifies the maximum size for the * page blob, up to 1 TB. The page blob size must be aligned to a 512-byte * boundary. * @param Models\CreateBlobOptions $options The optional parameters. * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx */ public function createPageBlob($container, $blob, $length, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); Validate::isInteger($length, 'length'); Validate::notNull($length, 'length'); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_CREATED; if (is_null($options)) { $options = new CreateBlobOptions(); } $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_TYPE, BlobType::PAGE_BLOB ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_LENGTH, $length ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_SEQUENCE_NUMBER, $options->getSequenceNumber() ); $headers = $this->_addCreateBlobOptionalHeaders($options, $headers); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); return CopyBlobResult::create($response->getHeader()); } /** * Creates a new block blob or updates the content of an existing block blob. * * Updating an existing block blob overwrites any existing metadata on the blob. * Partial updates are not supported with createBlockBlob the content of the * existing blob is overwritten with the content of the new blob. To perform a * partial update of the content o f a block blob, use the createBlockList * method. * Note that the default content type is application/octet-stream. * * @param string $container The name of the container. * @param string $blob The name of the blob. * @param string|resource $content The content of the blob. * @param Models\CreateBlobOptions $options The optional parameters. * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx */ public function createBlockBlob($container, $blob, $content, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); Validate::isTrue( is_string($content) || is_resource($content), sprintf(Resources::INVALID_PARAM_MSG, 'content', 'string|resource') ); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $bodySize = false; $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_CREATED; if (is_null($options)) { $options = new CreateBlobOptions(); } if (is_resource($content)) { $cStat = fstat($content); // if the resource is a remote file, $cStat will be false if ($cStat) { $bodySize = $cStat['size']; } } else { $bodySize = strlen($content); } // if we have a size we can try to one shot this, else failsafe on block upload if (is_int($bodySize) && $bodySize <= $this->_SingleBlobUploadThresholdInBytes) { $headers = $this->_addCreateBlobOptionalHeaders($options, $headers); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_TYPE, BlobType::BLOCK_BLOB ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); // If read file failed for any reason it will throw an exception. $body = is_resource($content) ? stream_get_contents($content) : $content; $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode, $body ); } else { // This is for large or failsafe upload $end = 0; $counter = 0; $body = ''; $blockIds = array(); // if threshold is lower than 4mb, honor threshold, else use 4mb $blockSize = ($this->_SingleBlobUploadThresholdInBytes < 4194304) ? $this->_SingleBlobUploadThresholdInBytes : 4194304; while(!$end) { if (is_resource($content)) { $body = fread($content, $blockSize); if (feof($content)) { $end = 1; } } else { if (strlen($content) <= $blockSize) { $body = $content; $end = 1; } else { $body = substr($content, 0, $blockSize); $content = substr_replace($content, '', 0, $blockSize); } } $block = new Block(); $block->setBlockId(base64_encode(str_pad($counter++, '0', 6))); $block->setType('Uncommitted'); array_push($blockIds, $block); $this->createBlobBlock($container, $blob, $block->getBlockId(), $body); } $response = $this->commitBlobBlocks($container, $blob, $blockIds, $options); } return CopyBlobResult::create($response->getHeader()); } /** * Clears a range of pages from the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\PageRange $range Can be up to the value of the * blob's full size. Note that ranges must be aligned to 512 (0-511, 512-1023) * @param Models\CreateBlobPagesOptions $options optional parameters * * @return Models\CreateBlobPagesResult. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691975.aspx */ public function clearBlobPages($container, $blob, $range, $options = null) { return $this->_updatePageBlobPagesImpl( PageWriteOption::CLEAR_OPTION, $container, $blob, $range, Resources::EMPTY_STRING, $options ); } /** * Creates a range of pages to a page blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\PageRange $range Can be up to 4 MB in size * Note that ranges must be aligned to 512 (0-511, 512-1023) * @param string $content the blob contents. * @param Models\CreateBlobPagesOptions $options optional parameters * * @return Models\CreateBlobPagesResult. * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691975.aspx */ public function createBlobPages($container, $blob, $range, $content, $options = null ) { return $this->_updatePageBlobPagesImpl( PageWriteOption::UPDATE_OPTION, $container, $blob, $range, $content, $options ); } /** * Creates a new block to be committed as part of a block blob. * * @param string $container name of the container * @param string $blob name of the blob * @param string $blockId must be less than or equal to * 64 bytes in size. For a given blob, the length of the value specified for the * blockid parameter must be the same size for each block. * @param string $content the blob block contents * @param Models\CreateBlobBlockOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd135726.aspx */ public function createBlobBlock($container, $blob, $blockId, $content, $options = null ) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); Validate::isString($blockId, 'blockId'); Validate::notNullOrEmpty($blockId, 'blockId'); Validate::isTrue( is_string($content) || is_resource($content), sprintf(Resources::INVALID_PARAM_MSG, 'content', 'string|resource') ); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_CREATED; $body = $content; if (is_null($options)) { $options = new CreateBlobBlockOptions(); } $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalHeader( $headers, Resources::CONTENT_MD5, $options->getContentMD5() ); $this->addOptionalHeader( $headers, Resources::CONTENT_TYPE, Resources::URL_ENCODED_CONTENT_TYPE ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'block' ); $this->addOptionalQueryParam( $queryParams, Resources::QP_BLOCKID, base64_encode($blockId) ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode, $body ); return CopyBlobResult::create($response->getHeader()); } /** * This method writes a blob by specifying the list of block IDs that make up the * blob. In order to be written as part of a blob, a block must have been * successfully written to the server in a prior createBlobBlock method. * * You can call Put Block List to update a blob by uploading only those blocks * that have changed, then committing the new and existing blocks together. * You can do this by specifying whether to commit a block from the committed * block list or from the uncommitted block list, or to commit the most recently * uploaded version of the block, whichever list it may belong to. * * @param string $container The container name. * @param string $blob The blob name. * @param Models\BlockList|array $blockList The block entries. * @param Models\CommitBlobBlocksOptions $options The optional parameters. * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179467.aspx */ public function commitBlobBlocks($container, $blob, $blockList, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); Validate::isTrue( $blockList instanceof BlockList || is_array($blockList), sprintf( Resources::INVALID_PARAM_MSG, 'blockList', get_class(new BlockList()) ) ); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_CREATED; $isArray = is_array($blockList); $blockList = $isArray ? BlockList::create($blockList) : $blockList; $body = $blockList->toXml($this->dataSerializer); if (is_null($options)) { $options = new CommitBlobBlocksOptions(); } $blobContentType = $options->getBlobContentType(); $blobContentEncoding = $options->getBlobContentEncoding(); $blobContentLanguage = $options->getBlobContentLanguage(); $blobContentMD5 = $options->getBlobContentMD5(); $blobCacheControl = $options->getBlobCacheControl(); $leaseId = $options->getLeaseId(); $contentType = Resources::URL_ENCODED_CONTENT_TYPE; $metadata = $options->getMetadata(); $headers = $this->generateMetadataHeaders($metadata); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $leaseId ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CACHE_CONTROL, $blobCacheControl ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_TYPE, $blobContentType ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_ENCODING, $blobContentEncoding ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_LANGUAGE, $blobContentLanguage ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_MD5, $blobContentMD5 ); $this->addOptionalHeader( $headers, Resources::CONTENT_TYPE, $contentType ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'blocklist' ); return $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode, $body ); } /** * Retrieves the list of blocks that have been uploaded as part of a block blob. * * There are two block lists maintained for a blob: * 1) Committed Block List: The list of blocks that have been successfully * committed to a given blob with commitBlobBlocks. * 2) Uncommitted Block List: The list of blocks that have been uploaded for a * blob using Put Block (REST API), but that have not yet been committed. * These blocks are stored in Windows Azure in association with a blob, but do * not yet form part of the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\ListBlobBlocksOptions $options optional parameters * * @return Models\ListBlobBlocksResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179400.aspx */ public function listBlobBlocks($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $method = Resources::HTTP_GET; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new ListBlobBlocksOptions(); } $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_BLOCK_LIST_TYPE, $options->getBlockListType() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_SNAPSHOT, $options->getSnapshot() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'blocklist' ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $parsed = $this->dataSerializer->unserialize($response->getBody()); return ListBlobBlocksResult::create($response->getHeader(), $parsed); } /** * Returns all properties and metadata on the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\GetBlobPropertiesOptions $options optional parameters * * @return Models\GetBlobPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179394.aspx */ public function getBlobProperties($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $method = Resources::HTTP_HEAD; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new GetBlobPropertiesOptions(); } $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_SNAPSHOT, $options->getSnapshot() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); return $this->_getBlobPropertiesResultFromResponse($response->getHeader()); } /** * Returns all properties and metadata on the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\GetBlobMetadataOptions $options optional parameters * * @return Models\GetBlobMetadataResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179350.aspx */ public function getBlobMetadata($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $method = Resources::HTTP_HEAD; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new GetBlobMetadataOptions(); } $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_SNAPSHOT, $options->getSnapshot() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'metadata' ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $metadata = $this->getMetadataArray($response->getHeader()); return GetBlobMetadataResult::create($response->getHeader(), $metadata); } /** * Returns a list of active page ranges for a page blob. Active page ranges are * those that have been populated with data. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\ListPageBlobRangesOptions $options optional parameters * * @return Models\ListPageBlobRangesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691973.aspx */ public function listPageBlobRanges($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $method = Resources::HTTP_GET; $headers = array(); $queryParams = array(); $postParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new ListPageBlobRangesOptions(); } $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $headers = $this->_addOptionalRangeHeader( $headers, $options->getRangeStart(), $options->getRangeEnd() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_SNAPSHOT, $options->getSnapshot() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'pagelist' ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $parsed = $this->dataSerializer->unserialize($response->getBody()); return ListPageBlobRangesResult::create($response->getHeader(), $parsed); } /** * Sets system properties defined for a blob. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\SetBlobPropertiesOptions $options optional parameters * * @return Models\SetBlobPropertiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691966.aspx */ public function setBlobProperties($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new SetBlobPropertiesOptions(); } $blobContentType = $options->getBlobContentType(); $blobContentEncoding = $options->getBlobContentEncoding(); $blobContentLanguage = $options->getBlobContentLanguage(); $blobContentLength = $options->getBlobContentLength(); $blobContentMD5 = $options->getBlobContentMD5(); $blobCacheControl = $options->getBlobCacheControl(); $leaseId = $options->getLeaseId(); $sNumberAction = $options->getSequenceNumberAction(); $sNumber = $options->getSequenceNumber(); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $leaseId ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CACHE_CONTROL, $blobCacheControl ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_TYPE, $blobContentType ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_ENCODING, $blobContentEncoding ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_LANGUAGE, $blobContentLanguage ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_LENGTH, $blobContentLength ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_CONTENT_MD5, $blobContentMD5 ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_SEQUENCE_NUMBER_ACTION, $sNumberAction ); $this->addOptionalHeader( $headers, Resources::X_MS_BLOB_SEQUENCE_NUMBER, $sNumber ); $this->addOptionalQueryParam($queryParams, Resources::QP_COMP, 'properties'); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); return SetBlobPropertiesResult::create($response->getHeader()); } /** * Sets metadata headers on the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param array $metadata key/value pair representation * @param Models\SetBlobMetadataOptions $options optional parameters * * @return Models\SetBlobMetadataResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179414.aspx */ public function setBlobMetadata($container, $blob, $metadata, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $this->validateMetadata($metadata); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_OK; if (is_null($options)) { $options = new SetBlobMetadataOptions(); } $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $headers = $this->addMetadataHeaders($headers, $metadata); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_COMP, 'metadata' ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); return SetBlobMetadataResult::create($response->getHeader()); } /** * Reads or downloads a blob from the system, including its metadata and * properties. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\GetBlobOptions $options optional parameters * * @return Models\GetBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179440.aspx */ public function getBlob($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); $method = Resources::HTTP_GET; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = array( Resources::STATUS_OK, Resources::STATUS_PARTIAL_CONTENT ); if (is_null($options)) { $options = new GetBlobOptions(); } $getMD5 = $options->getComputeRangeMD5(); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $headers = $this->_addOptionalRangeHeader( $headers, $options->getRangeStart(), $options->getRangeEnd() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalHeader( $headers, Resources::X_MS_RANGE_GET_CONTENT_MD5, $getMD5 ? 'true' : null ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_SNAPSHOT, $options->getSnapshot() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); $metadata = $this->getMetadataArray($response->getHeader()); return GetBlobResult::create( $response->getHeader(), $response->getBody(), $metadata ); } /** * Deletes a blob or blob snapshot. * * Note that if the snapshot entry is specified in the $options then only this * blob snapshot is deleted. To delete all blob snapshots, do not set Snapshot * and just set getDeleteSnaphotsOnly to true. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\DeleteBlobOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179413.aspx */ public function deleteBlob($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $method = Resources::HTTP_DELETE; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $statusCode = Resources::STATUS_ACCEPTED; if (is_null($options)) { $options = new DeleteBlobOptions(); } if (is_null($options->getSnapshot())) { $delSnapshots = $options->getDeleteSnaphotsOnly() ? 'only' : 'include'; $this->addOptionalHeader( $headers, Resources::X_MS_DELETE_SNAPSHOTS, $delSnapshots ); } else { $this->addOptionalQueryParam( $queryParams, Resources::QP_SNAPSHOT, $options->getSnapshot() ); } $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $this->send( $method, $headers, $queryParams, $postParams, $path, $statusCode ); } /** * Creates a snapshot of a blob. * * @param string $container The name of the container. * @param string $blob The name of the blob. * @param Models\CreateBlobSnapshotOptions $options The optional parameters. * * @return Models\CreateBlobSnapshotResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691971.aspx */ public function createBlobSnapshot($container, $blob, $options = null) { Validate::isString($container, 'container'); Validate::isString($blob, 'blob'); Validate::notNullOrEmpty($blob, 'blob'); $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $path = $this->_createPath($container, $blob); $expectedStatusCode = Resources::STATUS_CREATED; if (is_null($options)) { $options = new CreateBlobSnapshotOptions(); } $queryParams[Resources::QP_COMP] = 'snapshot'; $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $headers = $this->addMetadataHeaders($headers, $options->getMetadata()); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $path, $expectedStatusCode ); return CreateBlobSnapshotResult::create($response->getHeader()); } /** * Copies a source blob to a destination blob within the same storage account. * * @param string $destinationContainer name of the destination * container * @param string $destinationBlob name of the destination * blob * @param string $sourceContainer name of the source * container * @param string $sourceBlob name of the source * blob * @param Models\CopyBlobOptions $options optional parameters * * @return CopyBlobResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd894037.aspx */ public function copyBlob( $destinationContainer, $destinationBlob, $sourceContainer, $sourceBlob, $options = null ) { $method = Resources::HTTP_PUT; $headers = array(); $postParams = array(); $queryParams = array(); $destinationBlobPath = $this->_createPath( $destinationContainer, $destinationBlob ); $statusCode = Resources::STATUS_ACCEPTED; if (is_null($options)) { $options = new CopyBlobOptions(); } $this->addOptionalQueryParam( $queryParams, Resources::QP_TIMEOUT, $options->getTimeout() ); $sourceBlobPath = $this->_getCopyBlobSourceName( $sourceContainer, $sourceBlob, $options ); $headers = $this->addOptionalAccessConditionHeader( $headers, $options->getAccessCondition() ); $headers = $this->addOptionalSourceAccessConditionHeader( $headers, $options->getSourceAccessCondition() ); $this->addOptionalHeader( $headers, Resources::X_MS_COPY_SOURCE, $sourceBlobPath ); $headers = $this->addMetadataHeaders($headers, $options->getMetadata()); $this->addOptionalHeader( $headers, Resources::X_MS_LEASE_ID, $options->getLeaseId() ); $this->addOptionalHeader( $headers, Resources::X_MS_SOURCE_LEASE_ID, $options->getSourceLeaseId() ); $response = $this->send( $method, $headers, $queryParams, $postParams, $destinationBlobPath, $statusCode ); return CopyBlobResult::create($response->getHeader()); } /** * Establishes an exclusive one-minute write lock on a blob. To write to a locked * blob, a client must provide a lease ID. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\AcquireLeaseOptions $options optional parameters * * @return Models\AcquireLeaseResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function acquireLease($container, $blob, $options = null) { $headers = $this->_putLeaseImpl( LeaseMode::ACQUIRE_ACTION, $container, $blob, null /* leaseId */, is_null($options) ? new AcquireLeaseOptions() : $options, is_null($options) ? null : $options->getAccessCondition() ); return AcquireLeaseResult::create($headers); } /** * Renews an existing lease * * @param string $container name of the container * @param string $blob name of the blob * @param string $leaseId lease id when acquiring * @param Models\BlobServiceOptions $options optional parameters * * @return Models\AcquireLeaseResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function renewLease($container, $blob, $leaseId, $options = null) { $headers = $this->_putLeaseImpl( LeaseMode::RENEW_ACTION, $container, $blob, $leaseId, is_null($options) ? new BlobServiceOptions() : $options ); return AcquireLeaseResult::create($headers); } /** * Frees the lease if it is no longer needed so that another client may * immediately acquire a lease against the blob. * * @param string $container name of the container * @param string $blob name of the blob * @param string $leaseId lease id when acquiring * @param Models\BlobServiceOptions $options optional parameters * * @return none * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function releaseLease($container, $blob, $leaseId, $options = null) { $this->_putLeaseImpl( LeaseMode::RELEASE_ACTION, $container, $blob, $leaseId, is_null($options) ? new BlobServiceOptions() : $options ); } /** * Ends the lease but ensure that another client cannot acquire a new lease until * the current lease period has expired. * * @param string $container name of the container * @param string $blob name of the blob * @param Models\BlobServiceOptions $options optional parameters * * @return BreakLeaseResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx */ public function breakLease($container, $blob, $options = null) { $headers = $this->_putLeaseImpl( LeaseMode::BREAK_ACTION, $container, $blob, null, is_null($options) ? new BlobServiceOptions() : $options ); return BreakLeaseResult::create($headers); } } PKwL\W66@updraftplus/includes/WindowsAzure/Common/Internal/Atom/Entry.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; /** * The Entry class of ATOM standard. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class Entry extends AtomBase { // @codingStandardsIgnoreStart /** * The author of the entry. * * @var Person */ protected $author; /** * The category of the entry. * * @var array */ protected $category; /** * The content of the entry. * * @var string */ protected $content; /** * The contributor of the entry. * * @var string */ protected $contributor; /** * An unqiue ID representing the entry. * * @var string */ protected $id; /** * The link of the entry. * * @var string */ protected $link; /** * Is the entry published. * * @var boolean */ protected $published; /** * The copy right of the entry. * * @var string */ protected $rights; /** * The source of the entry. * * @var string */ protected $source; /** * The summary of the entry. * * @var string */ protected $summary; /** * The title of the entry. * * @var string */ protected $title; /** * Is the entry updated. * * @var \DateTime */ protected $updated; /** * The extension element of the entry. * * @var string */ protected $extensionElement; /** * Creates an ATOM Entry instance with default parameters. */ public function __construct() { $this->attributes = array(); } /** * Populate the properties of an ATOM Entry instance with specified XML.. * * @param string $xmlString A string representing an ATOM entry instance. * * @return none */ public function parseXml($xmlString) { Validate::notNull($xmlString, 'xmlString'); $this->fromXml(simplexml_load_string($xmlString)); } /** * Creates an ATOM ENTRY instance with specified simpleXML object * * @param \SimpleXMLElement $entryXml xml element of ATOM ENTRY * * @return none */ public function fromXml($entryXml) { Validate::notNull($entryXml, 'entryXml'); Validate::isA($entryXml, '\SimpleXMLElement', 'entryXml'); $this->attributes = (array)$entryXml->attributes(); $entryArray = (array)$entryXml; if (array_key_exists(Resources::AUTHOR, $entryArray)) { $this->author = $this->processAuthorNode($entryArray); } if (array_key_exists(Resources::CATEGORY, $entryArray)) { $this->category = $this->processCategoryNode($entryArray); } if (array_key_exists('content', $entryArray)) { $content = new Content(); $content->fromXml($entryArray['content']); $this->content = $content; } if (array_key_exists(Resources::CONTRIBUTOR, $entryArray)) { $this->contributor = $this->processContributorNode($entryArray); } if (array_key_exists('id', $entryArray)) { $this->id = (string)$entryArray['id']; } if (array_key_exists(Resources::LINK, $entryArray)) { $this->link = $this->processLinkNode($entryArray); } if (array_key_exists('published', $entryArray)) { $this->published = $entryArray['published']; } if (array_key_exists('rights', $entryArray)) { $this->rights = $entryArray['rights']; } if (array_key_exists('source', $entryArray)) { $source = new Source(); $source->parseXml($entryArray['source']->asXML()); $this->source = $source; } if (array_key_exists('title', $entryArray)) { $this->title = $entryArray['title']; } if (array_key_exists('updated', $entryArray)) { $this->updated = \DateTime::createFromFormat( \DateTime::ATOM, (string)$entryArray['updated'] ); } } /** * Gets the author of the entry. * * @return Person */ public function getAuthor() { return $this->author; } /** * Sets the author of the entry. * * @param Person $author The author of the entry. * * @return none */ public function setAuthor($author) { $this->author = $author; } /** * Gets the category. * * @return array */ public function getCategory() { return $this->category; } /** * Sets the category. * * @param string $category The category of the entry. * * @return none */ public function setCategory($category) { $this->category = $category; } /** * Gets the content. * * @return Content. */ public function getContent() { return $this->content; } /** * Sets the content. * * @param Content $content Sets the content of the entry. * * @return none */ public function setContent($content) { $this->content = $content; } /** * Gets the contributor. * * @return string */ public function getContributor() { return $this->contributor; } /** * Sets the contributor. * * @param string $contributor The contributor of the entry. * * @return none */ public function setContributor($contributor) { $this->contributor = $contributor; } /** * Gets the ID of the entry. * * @return string */ public function getId() { return $this->id; } /** * Sets the ID of the entry. * * @param string $id The id of the entry. * * @return none */ public function setId($id) { $this->id = $id; } /** * Gets the link of the entry. * * @return string */ public function getLink() { return $this->link; } /** * Sets the link of the entry. * * @param string $link The link of the entry. * * @return none */ public function setLink($link) { $this->link = $link; } /** * Gets published of the entry. * * @return boolean */ public function getPublished() { return $this->published; } /** * Sets published of the entry. * * @param boolean $published Is the entry published. * * @return none */ public function setPublished($published) { $this->published = $published; } /** * Gets the rights of the entry. * * @return string */ public function getRights() { return $this->rights; } /** * Sets the rights of the entry. * * @param string $rights The rights of the entry. * * @return none */ public function setRights($rights) { $this->rights = $rights; } /** * Gets the source of the entry. * * @return string */ public function getSource() { return $this->source; } /** * Sets the source of the entry. * * @param string $source The source of the entry. * * @return none */ public function setSource($source) { $this->source = $source; } /** * Gets the summary of the entry. * * @return string */ public function getSummary() { return $this->summary; } /** * Sets the summary of the entry. * * @param string $summary The summary of the entry. * * @return none */ public function setSummary($summary) { $this->summary = $summary; } /** * Gets the title of the entry. * * @return string */ public function getTitle() { return $this->title; } /** * Sets the title of the entry. * * @param string $title The title of the entry. * * @return none */ public function setTitle($title) { $this->title = $title; } /** * Gets updated. * * @return \DateTime */ public function getUpdated() { return $this->updated; } /** * Sets updated * * @param \DateTime $updated updated. * * @return none */ public function setUpdated($updated) { $this->updated = $updated; } /** * Gets extension element. * * @return string */ public function getExtensionElement() { return $this->extensionElement; } /** * Sets extension element. * * @param string $extensionElement The extension element of the entry. * * @return none */ public function setExtensionElement($extensionElement) { $this->extensionElement = $extensionElement; } /** * Writes a inner XML string representing the entry. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->startElementNS( 'atom', Resources::ENTRY, Resources::ATOM_NAMESPACE ); $this->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } /** * Writes a inner XML string representing the entry. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeInnerXml($xmlWriter) { if (!is_null($this->attributes)) { if (is_array($this->attributes)) { foreach ( $this->attributes as $attributeName => $attributeValue ) { $xmlWriter->writeAttribute($attributeName, $attributeValue); } } } if (!is_null($this->author)) { $this->writeArrayItem( $xmlWriter, $this->author, Resources::AUTHOR ); } if (!is_null($this->category)) { $this->writeArrayItem( $xmlWriter, $this->category, Resources::CATEGORY ); } if (!is_null($this->content)) { $this->content->writeXml($xmlWriter); } if (!is_null($this->contributor)) { $this->writeArrayItem( $xmlWriter, $this->contributor, Resources::CONTRIBUTOR ); } $this->writeOptionalElementNS( $xmlWriter, 'atom', 'id', Resources::ATOM_NAMESPACE, $this->id ); if (!is_null($this->link)) { $this->writeArrayItem( $xmlWriter, $this->link, Resources::LINK ); } $this->writeOptionalElementNS( $xmlWriter, 'atom', 'published', Resources::ATOM_NAMESPACE, $this->published ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'rights', Resources::ATOM_NAMESPACE, $this->rights ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'source', Resources::ATOM_NAMESPACE, $this->source ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'summary', Resources::ATOM_NAMESPACE, $this->summary ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'title', Resources::ATOM_NAMESPACE, $this->title ); if (!is_null($this->updated)) { $xmlWriter->writeElementNS( 'atom', 'updated', Resources::ATOM_NAMESPACE, $this->updated->format(\DateTime::ATOM) ); } } } // @codingStandardsIgnoreEndPKwL\J.iDupdraftplus/includes/WindowsAzure/Common/Internal/Atom/Generator.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Resources; /** * The generator class of ATOM library. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class Generator extends AtomBase { /** * The of the generator. * * @var string */ protected $text; /** * The Uri of the generator. * * @var string */ protected $uri; /** * The version of the generator. * * @var string */ protected $version; /** * Creates a generator instance with specified XML string. * * @param string $xmlString A string representing a generator * instance. * * @return none */ public static function parseXml($xmlString) { $generatorXml = new \SimpleXMLElement($xmlString); $generatorArray = (array)$generatorXml; $attributes = $generatorXml->attributes(); if (!empty($attributes['uri'])) { $this->uri = (string)$attributes['uri']; } if (!empty($attributes['version'])) { $this->version = (string)$attributes['version']; } $this->text = (string)$generatorXml; } /** * Creates an ATOM generator instance with specified name. * * @param string $text The text content of the generator. * * @return none */ public function __construct($text = null) { if (!empty($text)) { $this->text = $text; } } /** * Gets the text of the generator. * * @return string */ public function getText() { return $this->text; } /** * Sets the text of the generator. * * @param string $text The text of the generator. * * @return none */ public function setText($text) { $this->text = $text; } /** * Gets the URI of the generator. * * @return string */ public function getUri() { return $this->uri; } /** * Sets the URI of the generator. * * @param string $uri The URI of the generator. * * @return none */ public function setUri($uri) { $this->uri = $uri; } /** * Gets the version of the generator. * * @return string */ public function getVersion() { return $this->version; } /** * Sets the version of the generator. * * @param string $version The version of the generator. * * @return none */ public function setVersion($version) { $this->version = $version; } /** * Writes an XML representing the generator. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeXml($xmlWriter) { $xmlWriter->startElementNS( 'atom', Resources::CATEGORY, Resources::ATOM_NAMESPACE ); $this->writeOptionalAttribute( $xmlWriter, 'uri', $this->uri ); $this->writeOptionalAttribute( $xmlWriter, 'version', $this->version ); $xmlWriter->writeRaw($this->text); $xmlWriter->endElement(); } } PKwL\wؠCupdraftplus/includes/WindowsAzure/Common/Internal/Atom/Category.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Validate; /** * The category class of the ATOM standard. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class Category extends AtomBase { /** * The term of the category. * * @var string */ protected $term; /** * The scheme of the category. * * @var string */ protected $scheme; /** * The label of the category. * * @var string */ protected $label; /** * The undefined content of the category. * * @var string */ protected $undefinedContent; /** * Creates a Category instance with specified text. * * @param string $undefinedContent The undefined content of the category. * * @return none */ public function __construct($undefinedContent = Resources::EMPTY_STRING) { $this->undefinedContent = $undefinedContent; } /** * Creates an ATOM Category instance with specified xml string. * * @param string $xmlString an XML based string of ATOM CONTENT. * * @return none */ public function parseXml($xmlString) { Validate::notNull($xmlString, 'xmlString'); Validate::isString($xmlString, 'xmlString'); $categoryXml = simplexml_load_string($xmlString); $attributes = $categoryXml->attributes(); if (!empty($attributes['term'])) { $this->term = (string)$attributes['term']; } if (!empty($attributes['scheme'])) { $this->scheme = (string)$attributes['scheme']; } if (!empty($attributes['label'])) { $this->label = (string)$attributes['label']; } $this->undefinedContent =(string)$categoryXml; } /** * Gets the term of the category. * * @return string */ public function getTerm() { return $this->term; } /** * Sets the term of the category. * * @param string $term The term of the category. * * @return none */ public function setTerm($term) { $this->term = $term; } /** * Gets the scheme of the category. * * @return string */ public function getScheme() { return $this->scheme; } /** * Sets the scheme of the category. * * @param string $scheme The scheme of the category. * * @return none */ public function setScheme($scheme) { $this->scheme = $scheme; } /** * Gets the label of the category. * * @return string The label. */ public function getLabel() { return $this->label; } /** * Sets the label of the category. * * @param string $label The label of the category. * * @return none */ public function setLabel($label) { $this->label = $label; } /** * Gets the undefined content of the category. * * @return string */ public function getUndefinedContent() { return $this->undefinedContent; } /** * Sets the undefined content of the category. * * @param string $undefinedContent The undefined content of the category. * * @return none */ public function setUndefinedContent($undefinedContent) { $this->undefinedContent = $undefinedContent; } /** * Writes an XML representing the category. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->startElementNS( 'atom', 'category', Resources::ATOM_NAMESPACE ); $this->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } /** * Writes an XML representing the category. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeInnerXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $this->writeOptionalAttribute( $xmlWriter, 'term', $this->term ); $this->writeOptionalAttribute( $xmlWriter, 'scheme', $this->scheme ); $this->writeOptionalAttribute( $xmlWriter, 'label', $this->label ); if (!empty($this->undefinedContent)) { $xmlWriter->WriteRaw($this->undefinedContent); } } } PKwL\R9h??Cupdraftplus/includes/WindowsAzure/Common/Internal/Atom/AtomLink.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Validate; /** * This link defines a reference from an entry or feed to a Web resource. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class AtomLink extends AtomBase { /** * The undefined content. * * @var string */ protected $undefinedContent; /** * The HREF of the link. * * @var string */ protected $href; /** * The rel attribute of the link. * * @var string */ protected $rel; /** * The media type of the link. * * @var string */ protected $type; /** * The language of HREF. * * @var string */ protected $hreflang; /** * The titile of the link. * * @var string */ protected $title; /** * The length of the link. * * @var integer */ protected $length; /** * Creates a AtomLink instance with specified text. */ public function __construct() { } /** * Parse an ATOM Link xml. * * @param string $xmlString an XML based string of ATOM Link. * * @return none */ public function parseXml($xmlString) { Validate::notNull($xmlString, 'xmlString'); Validate::isString($xmlString, 'xmlString'); $atomLinkXml = simplexml_load_string($xmlString); $attributes = $atomLinkXml->attributes(); if (!empty($attributes['href'])) { $this->href = (string)$attributes['href']; } if (!empty($attributes['rel'])) { $this->rel = (string)$attributes['rel']; } if (!empty($attributes['type'])) { $this->type = (string)$attributes['type']; } if (!empty($attributes['hreflang'])) { $this->hreflang = (string)$attributes['hreflang']; } if (!empty($attributes['title'])) { $this->title = (string)$attributes['title']; } if (!empty($attributes['length'])) { $this->length = (integer)$attributes['length']; } $undefinedContent = (string)$atomLinkXml; if (empty($undefinedContent)) { $this->undefinedContent = null; } else { $this->undefinedContent = (string)$atomLinkXml; } } /** * Gets the href of the link. * * @return string */ public function getHref() { return $this->href; } /** * Sets the href of the link. * * @param string $href The href of the link. * * @return none */ public function setHref($href) { $this->href = $href; } /** * Gets the rel of the atomLink. * * @return string */ public function getRel() { return $this->rel; } /** * Sets the rel of the link. * * @param string $rel The rel of the atomLink. * * @return none */ public function setRel($rel) { $this->rel = $rel; } /** * Gets the type of the link. * * @return string */ public function getType() { return $this->type; } /** * Sets the type of the link. * * @param string $type The type of the link. * * @return none */ public function setType($type) { $this->type = $type; } /** * Gets the language of the href. * * @return string */ public function getHrefLang() { return $this->hrefLang; } /** * Sets the language of the href. * * @param string $hrefLang The language of the href. * * @return none */ public function setHrefLang($hrefLang) { $this->hrefLang = $hrefLang; } /** * Gets the title of the link. * * @return string */ public function getTitle() { return $this->title; } /** * Sets the title of the link. * * @param string $title The title of the link. * * @return none */ public function setTitle($title) { $this->title = $title; } /** * Gets the length of the link. * * @return string */ public function getLength() { return $this->length; } /** * Sets the length of the link. * * @param string $length The length of the link. * * @return none */ public function setLength($length) { $this->length = $length; } /** * Gets the undefined content. * * @return string */ public function getUndefinedContent() { return $this->undefinedContent; } /** * Sets the undefined content. * * @param string $undefinedContent The undefined content. * * @return none */ public function setUndefinedContent($undefinedContent) { $this->undefinedContent = $undefinedContent; } /** * Writes an XML representing the ATOM link item. * * @param \XMLWriter $xmlWriter The xml writer. * * @return none */ public function writeXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->startElementNS( 'atom', Resources::LINK, Resources::ATOM_NAMESPACE ); $this->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } /** * Writes the inner XML representing the ATOM link item. * * @param \XMLWriter $xmlWriter The xml writer. * * @return none */ public function writeInnerXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $this->writeOptionalAttribute($xmlWriter, 'href', $this->href); $this->writeOptionalAttribute($xmlWriter, 'rel', $this->rel); $this->writeOptionalAttribute($xmlWriter, 'type', $this->type); $this->writeOptionalAttribute($xmlWriter, 'hreflang', $this->hreflang); $this->writeOptionalAttribute($xmlWriter, 'title', $this->title); $this->writeOptionalAttribute($xmlWriter, 'length', $this->length); if (!empty($this->undefinedContent)) { $xmlWriter->writeRaw($this->undefinedContent); } } } PKwL\8l>>?updraftplus/includes/WindowsAzure/Common/Internal/Atom/Feed.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; /** * The feed class of ATOM library. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class Feed extends AtomBase { // @codingStandardsIgnoreStart /** * The entry of the feed. * * @var array */ protected $entry; /** * the author of the feed. * * @var array */ protected $author; /** * The category of the feed. * * @var array */ protected $category; /** * The contributor of the feed. * * @var array */ protected $contributor; /** * The generator of the feed. * * @var Generator */ protected $generator; /** * The icon of the feed. * * @var string */ protected $icon; /** * The ID of the feed. * * @var string */ protected $id; /** * The link of the feed. * * @var array */ protected $link; /** * The logo of the feed. * * @var string */ protected $logo; /** * The rights of the feed. * * @var string */ protected $rights; /** * The subtitle of the feed. * * @var string */ protected $subtitle; /** * The title of the feed. * * @var string */ protected $title; /** * The update of the feed. * * @var \DateTime */ protected $updated; /** * The extension element of the feed. * * @var string */ protected $extensionElement; /** * Creates an ATOM FEED object with default parameters. */ public function __construct() { $this->attributes = array(); } /** * Creates a feed object with specified XML string. * * @param string $xmlString An XML string representing the feed object. * * @return none */ public function parseXml($xmlString) { $feedXml = simplexml_load_string($xmlString); $attributes = $feedXml->attributes(); $feedArray = (array)$feedXml; if (!empty($attributes)) { $this->attributes = (array)$attributes; } if (array_key_exists('author', $feedArray)) { $this->author = $this->processAuthorNode($feedArray); } if (array_key_exists('entry', $feedArray)) { $this->entry = $this->processEntryNode($feedArray); } if (array_key_exists('category', $feedArray)) { $this->category = $this->processCategoryNode($feedArray); } if (array_key_exists('contributor', $feedArray)) { $this->contributor = $this->processContributorNode($feedArray); } if (array_key_exists('generator', $feedArray)) { $generator = new Generator(); $generatorValue = $feedArray['generator']; if (is_string($generatorValue)) { $generator->setText($generatorValue); } else { $generator->parseXml($generatorValue->asXML()); } $this->generator = $generator; } if (array_key_exists('icon', $feedArray)) { $this->icon = (string)$feedArray['icon']; } if (array_key_exists('id', $feedArray)) { $this->id = (string)$feedArray['id']; } if (array_key_exists('link', $feedArray)) { $this->link = $this->processLinkNode($feedArray); } if (array_key_exists('logo', $feedArray)) { $this->logo = (string)$feedArray['logo']; } if (array_key_exists('rights', $feedArray)) { $this->rights = (string)$feedArray['rights']; } if (array_key_exists('subtitle', $feedArray)) { $this->subtitle = (string)$feedArray['subtitle']; } if (array_key_exists('title', $feedArray)) { $this->title = (string)$feedArray['title']; } if (array_key_exists('updated', $feedArray)) { $this->updated = \DateTime::createFromFormat( \DateTime::ATOM, (string)$feedArray['updated'] ); } } /** * Gets the attributes of the feed. * * @return array */ public function getAttributes() { return $this->attributes; } /** * Sets the attributes of the feed. * * @param array $attributes The attributes of the array. * * @return array */ public function setAttributes($attributes) { Validate::isArray($attributes, 'attributes'); $this->attributes = $attributes; } /** * Adds an attribute to the feed object instance. * * @param string $attributeKey The key of the attribute. * @param mixed $attributeValue The value of the attribute. * * @return none */ public function addAttribute($attributeKey, $attributeValue) { $this->attributes[$attributeKey] = $attributeValue; } /** * Gets the author of the feed. * * @return Person */ public function getAuthor() { return $this->author; } /** * Sets the author of the feed. * * @param Person $author The author of the feed. * * @return none */ public function setAuthor($author) { Validate::isArray($author, 'author'); $person = new Person(); foreach ($author as $authorInstance) { Validate::isInstanceOf($authorInstance, $person, 'author'); } $this->author = $author; } /** * Gets the category of the feed. * * @return Category */ public function getCategory() { return $this->category; } /** * Sets the category of the feed. * * @param Category $category The category of the feed. * * @return none */ public function setCategory($category) { Validate::isArray($category, 'category'); $categoryClassInstance = new Category(); foreach ($category as $categoryInstance) { Validate::isInstanceOf( $categoryInstance, $categoryClassInstance, 'category' ); } $this->category = $category; } /** * Gets contributor. * * @return array */ public function getContributor() { return $this->contributor; } /** * Sets contributor. * * @param string $contributor The contributor of the feed. * * @return none */ public function setContributor($contributor) { Validate::isArray($contributor, 'contributor'); $person = new Person(); foreach ($contributor as $contributorInstance) { Validate::isInstanceOf($contributorInstance, $person, 'contributor'); } $this->contributor = $contributor; } /** * Gets generator. * * @return string */ public function getGenerator() { return $this->generator; } /** * Sets the generator. * * @param string $generator Sets the generator of the feed. * * @return none */ public function setGenerator($generator) { $this->generator = $generator; } /** * Gets the icon of the feed. * * @return string */ public function getIcon() { return $this->icon; } /** * Sets the icon of the feed. * * @param string $icon The icon of the feed. * * @return none */ public function setIcon($icon) { $this->icon = $icon; } /** * Gets the ID of the feed. * * @return string */ public function getId() { return $this->id; } /** * Sets the ID of the feed. * * @param string $id The ID of the feed. * * @return none */ public function setId($id) { $this->id = $id; } /** * Gets the link of the feed. * * @return array */ public function getLink() { return $this->link; } /** * Sets the link of the feed. * * @param array $link The link of the feed. * * @return none */ public function setLink($link) { Validate::isArray($link, 'link'); $this->link = $link; } /** * Gets the logo of the feed. * * @return string */ public function getLogo() { return $this->logo; } /** * Sets the logo of the feed. * * @param string $logo The logo of the feed. * * @return none */ public function setLogo($logo) { $this->logo = $logo; } /** * Gets the rights of the feed. * * @return string */ public function getRights() { return $this->rights; } /** * Sets the rights of the feed. * * @param string $rights The rights of the feed. * * @return none */ public function setRights($rights) { $this->rights = $rights; } /** * Gets the sub title. * * @return string */ public function getSubtitle() { return $this->subtitle; } /** * Sets the sub title of the feed. * * @param string $subtitle Sets the sub title of the feed. * * @return none */ public function setSubtitle($subtitle) { $this->subtitle = $subtitle; } /** * Gets the title of the feed. * * @return string. */ public function getTitle() { return $this->title; } /** * Sets the title of the feed. * * @param string $title The title of the feed. * * @return none */ public function setTitle($title) { $this->title = $title; } /** * Gets the updated. * * @return \DateTime */ public function getUpdated() { return $this->updated; } /** * Sets the updated. * * @param \DateTime $updated updated * * @return none */ public function setUpdated($updated) { Validate::isInstanceOf($updated, new \DateTime(), 'updated'); $this->updated = $updated; } /** * Gets the extension element. * * @return string */ public function getExtensionElement() { return $this->extensionElement; } /** * Sets the extension element. * * @param string $extensionElement The extension element. * * @return none */ public function setExtensionElement($extensionElement) { $this->extensionElement = $extensionElement; } /** * Gets the entry of the feed. * * @return Entry */ public function getEntry() { return $this->entry; } /** * Sets the entry of the feed. * * @param Entry $entry The entry of the feed. * * @return none */ public function setEntry($entry) { $this->entry = $entry; } /** * Writes an XML representing the feed object. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->startElementNS('atom', 'feed', Resources::ATOM_NAMESPACE); $this->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } /** * Writes an XML representing the feed object. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeInnerXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); if (!is_null($this->attributes)) { if (is_array($this->attributes)) { foreach ( $this->attributes as $attributeName => $attributeValue ) { $xmlWriter->writeAttribute($attributeName, $attributeValue); } } } if (!is_null($this->author)) { $this->writeArrayItem( $xmlWriter, $this->author, Resources::AUTHOR ); } if (!is_null($this->category)) { $this->writeArrayItem( $xmlWriter, $this->category, Resources::CATEGORY ); } if (!is_null($this->contributor)) { $this->writeArrayItem( $xmlWriter, $this->contributor, Resources::CONTRIBUTOR ); } if (!is_null($this->generator)) { $this->generator->writeXml($xmlWriter); } $this->writeOptionalElementNS( $xmlWriter, 'atom', 'icon', Resources::ATOM_NAMESPACE, $this->icon ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'logo', Resources::ATOM_NAMESPACE, $this->logo ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'id', Resources::ATOM_NAMESPACE, $this->id ); if (!is_null($this->link)) { $this->writeArrayItem( $xmlWriter, $this->link, Resources::LINK ); } $this->writeOptionalElementNS( $xmlWriter, 'atom', 'rights', Resources::ATOM_NAMESPACE, $this->rights ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'subtitle', Resources::ATOM_NAMESPACE, $this->subtitle ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'title', Resources::ATOM_NAMESPACE, $this->title ); if (!is_null($this->updated)) { $xmlWriter->writeElementNS( 'atom', 'updated', Resources::ATOM_NAMESPACE, $this->updated->format(\DateTime::ATOM) ); } } } // @codingStandardsIgnoreEndPKwL\襼!%!%Cupdraftplus/includes/WindowsAzure/Common/Internal/Atom/AtomBase.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Atom\AtomLink; /** * The base class of ATOM library. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class AtomBase { /** * The attributes of the feed. * * @var array */ protected $attributes; /** * Creates an ATOM base object with default parameters. */ public function __construct() { $this->attributes = array(); $atomlink = new AtomLink(); } /** * Gets the attributes of the ATOM class. * * @return array */ public function getAttributes() { return $this->attributes; } /** * Sets the attributes of the ATOM class. * * @param array $attributes The attributes of the array. * * @return array */ public function setAttributes($attributes) { Validate::isArray($attributes, 'attributes'); $this->attributes = $attributes; } /** * Sets an attribute to the ATOM object instance. * * @param string $attributeKey The key of the attribute. * @param mixed $attributeValue The value of the attribute. * * @return none */ public function setAttribute($attributeKey, $attributeValue) { $this->attributes[$attributeKey] = $attributeValue; } /** * Gets an attribute with a specified attribute key. * * @param string $attributeKey The key of the attribute. * * @return none */ public function getAttribute($attributeKey) { return $this->attributes[$attributeKey]; } /** * Processes author node. * * @param array $xmlWriter The XML writer. * @param array $itemArray An array of item to write. * @param array $elementName The name of the element. * * @return array */ protected function writeArrayItem($xmlWriter, $itemArray, $elementName) { Validate::notNull($xmlWriter, 'xmlWriter'); Validate::isArray($itemArray, 'itemArray'); Validate::isString($elementName, 'elementName'); foreach ($itemArray as $itemInstance) { $xmlWriter->startElementNS( 'atom', $elementName, Resources::ATOM_NAMESPACE ); $itemInstance->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } } /** * Processes author node. * * @param array $xmlArray An array of simple xml elements. * * @return array */ protected function processAuthorNode($xmlArray) { $author = array(); $authorItem = $xmlArray[Resources::AUTHOR]; if (is_array($authorItem)) { foreach ($xmlArray[Resources::AUTHOR] as $authorXmlInstance) { $authorInstance = new Person(); $authorInstance->parseXml($authorXmlInstance->asXML()); $author[] = $authorInstance; } } else { $authorInstance = new Person(); $authorInstance->parseXml($authorItem->asXML()); $author[] = $authorInstance; } return $author; } /** * Processes entry node. * * @param array $xmlArray An array of simple xml elements. * * @return array */ protected function processEntryNode($xmlArray) { $entry = array(); $entryItem = $xmlArray[Resources::ENTRY]; if (is_array($entryItem)) { foreach ($xmlArray[Resources::ENTRY] as $entryXmlInstance) { $entryInstance = new Entry(); $entryInstance->fromXml($entryXmlInstance); $entry[] = $entryInstance; } } else { $entryInstance = new Entry(); $entryInstance->fromXml($entryItem); $entry[] = $entryInstance; } return $entry; } /** * Processes category node. * * @param array $xmlArray An array of simple xml elements. * * @return array */ protected function processCategoryNode($xmlArray) { $category = array(); $categoryItem = $xmlArray[Resources::CATEGORY]; if (is_array($categoryItem)) { foreach ($xmlArray[Resources::CATEGORY] as $categoryXmlInstance) { $categoryInstance = new Category(); $categoryInstance->parseXml($categoryXmlInstance->asXML()); $category[] = $categoryInstance; } } else { $categoryInstance = new Category(); $categoryInstance->parseXml($categoryItem->asXML()); $category[] = $categoryInstance; } return $category; } /** * Processes contributor node. * * @param array $xmlArray An array of simple xml elements. * * @return array */ protected function processContributorNode($xmlArray) { $category = array(); $contributorItem = $xmlArray[Resources::CONTRIBUTOR]; if (is_array($contributorItem)) { foreach ($xmlArray[Resources::CONTRIBUTOR] as $contributorXmlInstance) { $contributorInstance = new Person(); $contributorInstance->parseXml($contributorXmlInstance->asXML()); $contributor[] = $contributorInstance; } } elseif (is_string($contributorItem)) { $contributorInstance = new Person(); $contributorInstance->setName((string)$contributorItem); $contributor[] = $contributorInstance; } else { $contributorInstance = new Person(); $contributorInstance->parseXml($contributorItem->asXML()); $contributor[] = $contributorInstance; } return $contributor; } /** * Processes link node. * * @param array $xmlArray An array of simple xml elements. * * @return array */ protected function processLinkNode($xmlArray) { $link = array(); $linkValue = $xmlArray[Resources::LINK]; if (is_array($linkValue)) { foreach ($xmlArray[Resources::LINK] as $linkValueInstance) { $linkInstance = new AtomLink(); $linkInstance->parseXml($linkValueInstance->asXML()); $link[] = $linkInstance; } } else { $linkInstance = new AtomLink(); $linkInstance->parseXml($linkValue->asXML()); $link[] = $linkInstance; } return $link; } /** * Writes an optional attribute for ATOM. * * @param \XMLWriter $xmlWriter The XML writer. * @param string $attributeName The name of the attribute. * @param mixed $attributeValue The value of the attribute. * * @return none */ protected function writeOptionalAttribute( $xmlWriter, $attributeName, $attributeValue ) { Validate::notNull($xmlWriter, 'xmlWriter'); Validate::isString($attributeName, 'attributeName'); if (!empty($attributeValue)) { $xmlWriter->writeAttribute( $attributeName, $attributeValue ); } } /** * Writes the optional elements namespaces. * * @param \XmlWriter $xmlWriter The XML writer. * @param string $prefix The prefix. * @param string $elementName The element name. * @param string $namespace The namespace name. * @param string $elementValue The element value. * * @return none */ protected function writeOptionalElementNS( $xmlWriter, $prefix, $elementName, $namespace, $elementValue ) { Validate::notNull($xmlWriter, 'xmlWriter'); Validate::isString($elementName, 'elementName'); if (!empty($elementValue)) { $xmlWriter->writeElementNS( $prefix, $elementName, $namespace, $elementValue ); } } } PKwL\G6DDAupdraftplus/includes/WindowsAzure/Common/Internal/Atom/Person.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; /** * The person class of ATOM library. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class Person extends AtomBase { /** * The name of the person. * * @var string */ protected $name; /** * The Uri of the person. * * @var string */ protected $uri; /** * The email of the person. * * @var string */ protected $email; /** * Creates an ATOM person instance with specified name. * * @param string $name The name of the person. */ public function __construct($name = Resources::EMPTY_STRING) { $this->name = $name; } /** * Populates the properties with a specified XML string. * * @param string $xmlString An XML based string representing * the Person instance. * * @return none */ public function parseXml($xmlString) { $personXml = simplexml_load_string($xmlString); $attributes = $personXml->attributes(); $personArray = (array)$personXml; if (array_key_exists('name', $personArray)) { $this->name = (string)$personArray['name']; } if (array_key_exists('uri', $personArray)) { $this->uri = (string)$personArray['uri']; } if (array_key_exists('email', $personArray)) { $this->email = (string)$personArray['email']; } } /** * Gets the name of the person. * * @return string */ public function getName() { return $this->name; } /** * Sets the name of the person. * * @param string $name The name of the person. * * @return none */ public function setName($name) { $this->name = $name; } /** * Gets the URI of the person. * * @return string */ public function getUri() { return $this->uri; } /** * Sets the URI of the person. * * @param string $uri The URI of the person. * * @return none */ public function setUri($uri) { $this->uri = $uri; } /** * Gets the email of the person. * * @return string */ public function getEmail() { return $this->email; } /** * Sets the email of the person. * * @param string $email The email of the person. * * @return none */ public function setEmail($email) { $this->email = $email; } /** * Writes an XML representing the person. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->startElementNS( 'atom', 'person', Resources::ATOM_NAMESPACE ); $this->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } /** * Writes a inner XML representing the person. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeInnerXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->writeElementNS( 'atom', 'name', Resources::ATOM_NAMESPACE, $this->name ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'uri', Resources::ATOM_NAMESPACE, $this->uri ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'email', Resources::ATOM_NAMESPACE, $this->email ); } } PKwL\(ݘ66Aupdraftplus/includes/WindowsAzure/Common/Internal/Atom/Source.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; /** * The source class of ATOM library. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class Source extends AtomBase { // @codingStandardsIgnoreStart /** * The author the source. * * @var array */ protected $author; /** * The category of the source. * * @var array */ protected $category; /** * The contributor of the source. * * @var array */ protected $contributor; /** * The generator of the source. * * @var Generator */ protected $generator; /** * The icon of the source. * * @var string */ protected $icon; /** * The ID of the source. * * @var string */ protected $id; /** * The link of the source. * * @var AtomLink */ protected $link; /** * The logo of the source. * * @var string */ protected $logo; /** * The rights of the source. * * @var string */ protected $rights; /** * The subtitle of the source. * * @var string */ protected $subtitle; /** * The title of the source. * * @var string */ protected $title; /** * The update of the source. * * @var \DateTime */ protected $updated; /** * The extension element of the source. * * @var string */ protected $extensionElement; /** * Creates an ATOM FEED object with default parameters. */ public function __construct() { $this->attributes = array(); $this->category = array(); $this->contributor = array(); $this->author = array(); } /** * Creates a source object with specified XML string. * * @param string $xmlString The XML string representing a source. * * @return none */ public function parseXml($xmlString) { $sourceXml = new \SimpleXMLElement($xmlString); $attributes = $sourceXml->attributes(); $sourceArray = (array)$sourceXml; if (array_key_exists(Resources::AUTHOR, $sourceArray)) { $this->content = $this->processAuthorNode($sourceArray); } if (array_key_exists(Resources::CATEGORY, $sourceArray)) { $this->category = $this->processCategoryNode($sourceArray); } if (array_key_exists(Resources::CONTRIBUTOR, $sourceArray)) { $this->contributor = $this->processContributorNode($sourceArray); } if (array_key_exists('generator', $sourceArray)) { $generator = new Generator(); $generator->setText((string)$sourceArray['generator']->asXML()); $this->generator = $generator; } if (array_key_exists('icon', $sourceArray)) { $this->icon = (string)$sourceArray['icon']; } if (array_key_exists('id', $sourceArray)) { $this->id = (string)$sourceArray['id']; } if (array_key_exists(Resources::LINK, $sourceArray)) { $this->link = $this->processLinkNode($sourceArray); } if (array_key_exists('logo', $sourceArray)) { $this->logo = (string)$sourceArray['logo']; } if (array_key_exists('rights', $sourceArray)) { $this->rights = (string)$sourceArray['rights']; } if (array_key_exists('subtitle', $sourceArray)) { $this->subtitle = (string)$sourceArray['subtitle']; } if (array_key_exists('title', $sourceArray)) { $this->title = (string)$sourceArray['title']; } if (array_key_exists('updated', $sourceArray)) { $this->updated = \DateTime::createFromFormat( \DateTime::ATOM, (string)$sourceArray['updated'] ); } } /** * Gets the author of the source. * * @return array */ public function getAuthor() { return $this->author; } /** * Sets the author of the source. * * @param array $author An array of authors of the sources. * * @return none */ public function setAuthor($author) { $this->author = $author; } /** * Gets the category of the source. * * @return array */ public function getCategory() { return $this->category; } /** * Sets the category of the source. * * @param array $category The category of the source. * * @return none */ public function setCategory($category) { $this->category = $category; } /** * Gets contributor. * * @return array */ public function getContributor() { return $this->contributor; } /** * Sets contributor. * * @param array $contributor The contributors of the source. * * @return none */ public function setContributor($contributor) { $this->contributor = $contributor; } /** * Gets generator. * * @return Generator */ public function getGenerator() { return $this->generator; } /** * Sets the generator. * * @param Generator $generator Sets the generator of the source. * * @return none */ public function setGenerator($generator) { $this->generator = $generator; } /** * Gets the icon of the source. * * @return string */ public function getIcon() { return $this->icon; } /** * Sets the icon of the source. * * @param string $icon The icon of the source. * * @return string */ public function setIcon($icon) { $this->icon = $icon; } /** * Gets the ID of the source. * * @return string */ public function getId() { return $this->id; } /** * Sets the ID of the source. * * @param string $id The ID of the source. * * @return string */ public function setId($id) { $this->id = $id; } /** * Gets the link of the source. * * @return array */ public function getLink() { return $this->link; } /** * Sets the link of the source. * * @param array $link The link of the source. * * @return none */ public function setLink($link) { $this->link = $link; } /** * Gets the logo of the source. * * @return string */ public function getLogo() { return $this->logo; } /** * Sets the logo of the source. * * @param string $logo The logo of the source. * * @return none */ public function setLogo($logo) { $this->logo = $logo; } /** * Gets the rights of the source. * * @return string */ public function getRights() { return $this->rights; } /** * Sets the rights of the source. * * @param string $rights The rights of the source. * * @return none */ public function setRights($rights) { $this->rights = $rights; } /** * Gets the sub title. * * @return string */ public function getSubtitle() { return $this->subtitle; } /** * Sets the sub title of the source. * * @param string $subtitle Sets the sub title of the source. * * @return none */ public function setSubtitle($subtitle) { $this->subtitle = $subtitle; } /** * Gets the title of the source. * * @return string. */ public function getTitle() { return $this->title; } /** * Sets the title of the source. * * @param string $title The title of the source. * * @return none */ public function setTitle($title) { $this->title = $title; } /** * Gets the updated. * * @return \DateTime */ public function getUpdated() { return $this->updated; } /** * Sets the updated. * * @param \DateTime $updated updated * * @return none */ public function setUpdated($updated) { $this->updated = $updated; } /** * Gets the extension element. * * @return string */ public function getExtensionElement() { return $this->extensionElement; } /** * Sets the extension element. * * @param string $extensionElement The extension element. * * @return none */ public function setExtensionElement($extensionElement) { $this->extensionElement = $extensionElement; } /** * Writes an XML representing the source object. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->startElementNS( 'atom', 'source', Resources::ATOM_NAMESPACE ); $this->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } /** * Writes a inner XML representing the source object. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeInnerXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); if (!is_null($this->attributes)) { if (is_array($this->attributes)) { foreach ($this->attributes as $attributeName => $attributeValue) { $xmlWriter->writeAttribute($attributeName, $attributeValue); } } } if (!is_null($this->author)) { Validate::isArray($this->author, Resources::AUTHOR); $this->writeArrayItem($xmlWriter, $this->author, Resources::AUTHOR); } if (!is_null($this->category)) { Validate::isArray($this->category, Resources::CATEGORY); $this->writeArrayItem( $xmlWriter, $this->category, Resources::CATEGORY ); } if (!is_null($this->contributor)) { Validate::isArray($this->contributor, Resources::CONTRIBUTOR); $this->writeArrayItem( $xmlWriter, $this->contributor, Resources::CONTRIBUTOR ); } if (!is_null($this->generator)) { $this->generator->writeXml($xmlWriter); } if (!is_null($this->icon)) { $xmlWriter->writeElementNS( 'atom', 'icon', Resources::ATOM_NAMESPACE, $this->icon ); } $this->writeOptionalElementNS( $xmlWriter, 'atom', 'logo', Resources::ATOM_NAMESPACE, $this->logo ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'id', Resources::ATOM_NAMESPACE, $this->id ); if (!is_null($this->link)) { Validate::isArray($this->link, Resources::LINK); $this->writeArrayItem( $xmlWriter, $this->link, Resources::LINK ); } $this->writeOptionalElementNS( $xmlWriter, 'atom', 'rights', Resources::ATOM_NAMESPACE, $this->rights ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'subtitle', Resources::ATOM_NAMESPACE, $this->subtitle ); $this->writeOptionalElementNS( $xmlWriter, 'atom', 'title', Resources::ATOM_NAMESPACE, $this->title ); if (!is_null($this->updated)) { $xmlWriter->writeElementNS( 'atom', 'updated', Resources::ATOM_NAMESPACE, $this->updated->format(\DateTime::ATOM) ); } } } // @codingStandardsIgnoreEndPKwL\ ߣBupdraftplus/includes/WindowsAzure/Common/Internal/Atom/Content.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Atom; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Atom\AtomProperties; /** * The content class of ATOM standard. * * @category Microsoft * @package WindowsAzure\Common\Internal\Atom * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/WindowsAzure/azure-sdk-for-php */ class Content extends AtomBase { /** * The text of the content. * * @var string */ protected $text; /** * The type of the content. * * @var string */ protected $type; /** * Source XML object * * @var \SimpleXMLElement */ protected $xml; /** * Creates a Content instance with specified text. * * @param string $text The text of the content. * * @return none */ public function __construct($text = null) { $this->text = $text; } /** * Creates an ATOM CONTENT instance with specified xml string. * * @param string $xmlString an XML based string of ATOM CONTENT. * * @return none */ public function parseXml($xmlString) { Validate::notNull($xmlString, 'xmlString'); Validate::isString($xmlString, 'xmlString'); $this->fromXml(simplexml_load_string($xmlString)); } /** * Creates an ATOM CONTENT instance with specified simpleXML object * * @param \SimpleXMLElement $contentXml xml element of ATOM CONTENT * * @return none */ public function fromXml($contentXml) { Validate::notNull($contentXml, 'contentXml'); Validate::isA($contentXml, '\SimpleXMLElement', 'contentXml'); $attributes = $contentXml->attributes(); if (!empty($attributes['type'])) { $this->content = (string)$attributes['type']; } $text = ''; foreach ($contentXml->children() as $child) { $text .= $child->asXML(); } $this->text = $text; $this->xml = $contentXml; } /** * Gets the text of the content. * * @return string */ public function getText() { return $this->text; } /** * Sets the text of the content. * * @param string $text The text of the content. * * @return none */ public function setText($text) { $this->text = $text; } /** * Gets the xml object of the content. * * @return \SimpleXMLElement */ public function getXml() { return $this->xml; } /** * Gets the type of the content. * * @return string */ public function getType() { return $this->type; } /** * Sets the type of the content. * * @param string $type The type of the content. * * @return none */ public function setType($type) { $this->type = $type; } /** * Writes an XML representing the content. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->startElementNS( 'atom', 'content', Resources::ATOM_NAMESPACE ); $this->writeOptionalAttribute( $xmlWriter, 'type', $this->type ); $this->writeInnerXml($xmlWriter); $xmlWriter->endElement(); } /** * Writes an inner XML representing the content. * * @param \XMLWriter $xmlWriter The XML writer. * * @return none */ public function writeInnerXml($xmlWriter) { Validate::notNull($xmlWriter, 'xmlWriter'); $xmlWriter->writeRaw($this->text); } } PKwL\G((Pupdraftplus/includes/WindowsAzure/Common/Internal/Authentication/OAuthScheme.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link http://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Authentication; use WindowsAzure\Common\Internal\Authentication\IAuthScheme; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\OAuthRestProxy; use WindowsAzure\Common\Models\OAuthAccessToken; /** * Provides shared key authentication scheme for OAuth. * * @category Microsoft * @package WindowsAzure\Common\Internal\Authentication * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link http://github.com/windowsazure/azure-sdk-for-php */ class OAuthScheme implements IAuthScheme { /** * @var string */ protected $accountName; /** * @var string */ protected $accountKey; /** * @var WindowsAzure\Common\Models\OAuthAccessToken */ protected $accessToken; /** * @var WindowsAzure\Common\Internal\OAuthRestProxy */ protected $oauthService; /** * @var string */ protected $grantType; /** * @var string */ protected $scope; /** * Constructor. * * @param string $accountName account name. * @param string $accountKey account * secondary key. * * @param string $grantType grant type * for OAuth request. * * @param string $scope scope for * OAurh request. * * @param WindowsAzure\Common\Internal\OAuthRestProxy $oauthService account * primary or secondary key. */ public function __construct( $accountName, $accountKey, $grantType, $scope, $oauthService ) { Validate::isString($accountName, 'accountName'); Validate::isString($accountKey, 'accountKey'); Validate::isString($grantType, 'grantType'); Validate::isString($scope, 'scope'); Validate::notNull($oauthService, 'oauthService'); $this->accountName = $accountName; $this->accountKey = $accountKey; $this->grantType = $grantType; $this->scope = $scope; $this->oauthService = $oauthService; } /** * Returns authorization header to be included in the request. * * @param array $headers request headers. * @param string $url reuqest url. * @param array $queryParams query variables. * @param string $httpMethod request http method. * * @see Specifying the Authorization Header section at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return string */ public function getAuthorizationHeader($headers, $url, $queryParams, $httpMethod) { if (($this->accessToken == null) || ($this->accessToken->getExpiresIn() < time()) ) { $this->accessToken = $this->oauthService->getAccessToken( $this->grantType, $this->accountName, $this->accountKey, $this->scope ); } return Resources::OAUTH_ACCESS_TOKEN_PREFIX . $this->accessToken->getAccessToken(); } } PKwL\33Pupdraftplus/includes/WindowsAzure/Common/Internal/Authentication/IAuthScheme.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Authentication; /** * Interface for azure authentication schemes. * * @category Microsoft * @package WindowsAzure\Common\Internal\Authentication * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ interface IAuthScheme { /** * Returns authorization header to be included in the request. * * @param array $headers request headers. * @param string $url reuqest url. * @param array $queryParams query variables. * @param string $httpMethod request http method. * * @see Specifying the Authorization Header section at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @abstract * * @return string */ public function getAuthorizationHeader($headers, $url, $queryParams, $httpMethod ); } PKwL\oe\FFVupdraftplus/includes/WindowsAzure/Common/Internal/Authentication/StorageAuthScheme.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Authentication; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Authentication\IAuthScheme; /** * Base class for azure authentication schemes. * * @category Microsoft * @package WindowsAzure\Common\Internal\Authentication * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ abstract class StorageAuthScheme implements IAuthScheme { protected $accountName; protected $accountKey; /** * Constructor. * * @param string $accountName storage account name. * @param string $accountKey storage account primary or secondary key. * * @return * WindowsAzure\Common\Internal\Authentication\StorageAuthScheme */ public function __construct($accountName, $accountKey) { $this->accountKey = $accountKey; $this->accountName = $accountName; } /** * Computes canonicalized headers for headers array. * * @param array $headers request headers. * * @see Constructing the Canonicalized Headers String section at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return array */ protected function computeCanonicalizedHeaders($headers) { $canonicalizedHeaders = array(); $normalizedHeaders = array(); $validPrefix = Resources::X_MS_HEADER_PREFIX; if (is_null($normalizedHeaders)) { return $canonicalizedHeaders; } foreach ($headers as $header => $value) { // Convert header to lower case. $header = strtolower($header); // Retrieve all headers for the resource that begin with x-ms-, // including the x-ms-date header. if (Utilities::startsWith($header, $validPrefix)) { // Unfold the string by replacing any breaking white space // (meaning what splits the headers, which is \r\n) with a single // space. $value = str_replace("\r\n", ' ', $value); // Trim any white space around the colon in the header. $value = ltrim($value); $header = rtrim($header); $normalizedHeaders[$header] = $value; } } // Sort the headers lexicographically by header name, in ascending order. // Note that each header may appear only once in the string. ksort($normalizedHeaders); foreach ($normalizedHeaders as $key => $value) { $canonicalizedHeaders[] = $key . ':' . $value; } return $canonicalizedHeaders; } /** * Computes canonicalized resources from URL using Table formar * * @param string $url request url. * @param array $queryParams request query variables. * * @see Constructing the Canonicalized Resource String section at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return string */ protected function computeCanonicalizedResourceForTable($url, $queryParams) { $queryParams = array_change_key_case($queryParams); // 1. Beginning with an empty string (""), append a forward slash (/), // followed by the name of the account that owns the accessed resource. $canonicalizedResource = '/' . $this->accountName; // 2. Append the resource's encoded URI path, without any query parameters. $canonicalizedResource .= parse_url($url, PHP_URL_PATH); // 3. The query string should include the question mark and the comp // parameter (for example, ?comp=metadata). No other parameters should // be included on the query string. if (array_key_exists(Resources::QP_COMP, $queryParams)) { $canonicalizedResource .= '?' . Resources::QP_COMP . '='; $canonicalizedResource .= $queryParams[Resources::QP_COMP]; } return $canonicalizedResource; } /** * Computes canonicalized resources from URL. * * @param string $url request url. * @param array $queryParams request query variables. * * @see Constructing the Canonicalized Resource String section at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return string */ protected function computeCanonicalizedResource($url, $queryParams) { $queryParams = array_change_key_case($queryParams); // 1. Beginning with an empty string (""), append a forward slash (/), // followed by the name of the account that owns the accessed resource. $canonicalizedResource = '/' . $this->accountName; // 2. Append the resource's encoded URI path, without any query parameters. $canonicalizedResource .= parse_url($url, PHP_URL_PATH); // 3. Retrieve all query parameters on the resource URI, including the comp // parameter if it exists. // 4. Sort the query parameters lexicographically by parameter name, in // ascending order. if (count($queryParams) > 0) { ksort($queryParams); } // 5. Convert all parameter names to lowercase. // 6. URL-decode each query parameter name and value. // 7. Append each query parameter name and value to the string in the // following format: // parameter-name:parameter-value // 9. Group query parameters // 10. Append a new line character (\n) after each name-value pair. foreach ($queryParams as $key => $value) { // Grouping query parameters $values = explode(Resources::SEPARATOR, $value); sort($values); $separated = implode(Resources::SEPARATOR, $values); $canonicalizedResource .= "\n" . $key . ':' . $separated; } return $canonicalizedResource; } /** * Computes the authorization signature. * * @param array $headers request headers. * @param string $url reuqest url. * @param array $queryParams query variables. * @param string $httpMethod request http method. * * @see check all authentication schemes at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @abstract * * @return string */ abstract protected function computeSignature($headers, $url, $queryParams, $httpMethod ); } PKwL\> GxxXupdraftplus/includes/WindowsAzure/Common/Internal/Authentication/SharedKeyAuthScheme.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Authentication; use WindowsAzure\Common\Internal\Authentication\StorageAuthScheme; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * Provides shared key authentication scheme for blob and queue. For more info * check: http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @category Microsoft * @package WindowsAzure\Common\Internal\Authentication * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class SharedKeyAuthScheme extends StorageAuthScheme { protected $includedHeaders; /** * Constructor. * * @param string $accountName storage account name. * @param string $accountKey storage account primary or secondary key. * * @return * WindowsAzure\Common\Internal\Authentication\SharedKeyAuthScheme */ public function __construct($accountName, $accountKey) { parent::__construct($accountName, $accountKey); $this->includedHeaders = array(); $this->includedHeaders[] = Resources::CONTENT_ENCODING; $this->includedHeaders[] = Resources::CONTENT_LANGUAGE; $this->includedHeaders[] = Resources::CONTENT_LENGTH; $this->includedHeaders[] = Resources::CONTENT_MD5; $this->includedHeaders[] = Resources::CONTENT_TYPE; $this->includedHeaders[] = Resources::DATE; $this->includedHeaders[] = Resources::IF_MODIFIED_SINCE; $this->includedHeaders[] = Resources::IF_MATCH; $this->includedHeaders[] = Resources::IF_NONE_MATCH; $this->includedHeaders[] = Resources::IF_UNMODIFIED_SINCE; $this->includedHeaders[] = Resources::RANGE; } /** * Computes the authorization signature for blob and queue shared key. * * @param array $headers request headers. * @param string $url reuqest url. * @param array $queryParams query variables. * @param string $httpMethod request http method. * * @see Blob and Queue Services (Shared Key Authentication) at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return string */ protected function computeSignature($headers, $url, $queryParams, $httpMethod) { $canonicalizedHeaders = parent::computeCanonicalizedHeaders($headers); $canonicalizedResource = parent::computeCanonicalizedResource( $url, $queryParams ); $stringToSign = array(); $stringToSign[] = strtoupper($httpMethod); foreach ($this->includedHeaders as $header) { $stringToSign[] = Utilities::tryGetValue($headers, $header); } if (count($canonicalizedHeaders) > 0) { $stringToSign[] = implode("\n", $canonicalizedHeaders); } $stringToSign[] = $canonicalizedResource; $stringToSign = implode("\n", $stringToSign); return $stringToSign; } /** * Returns authorization header to be included in the request. * * @param array $headers request headers. * @param string $url reuqest url. * @param array $queryParams query variables. * @param string $httpMethod request http method. * * @see Specifying the Authorization Header section at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return string */ public function getAuthorizationHeader($headers, $url, $queryParams, $httpMethod) { $signature = $this->computeSignature( $headers, $url, $queryParams, $httpMethod ); return 'SharedKey ' . $this->accountName . ':' . base64_encode( hash_hmac('sha256', $signature, base64_decode($this->accountKey), true) ); } } PKwL\$aupdraftplus/includes/WindowsAzure/Common/Internal/Authentication/TableSharedKeyLiteAuthScheme.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link http://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Authentication; use WindowsAzure\Common\Internal\Authentication\StorageAuthScheme; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * Provides shared key authentication scheme for blob and queue. For more info * check: http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @category Microsoft * @package WindowsAzure\Common\Internal\Authentication * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link http://github.com/windowsazure/azure-sdk-for-php */ class TableSharedKeyLiteAuthScheme extends StorageAuthScheme { protected $includedHeaders; /** * Constructor. * * @param string $accountName storage account name. * @param string $accountKey storage account primary or secondary key. * * @return TableSharedKeyLiteAuthScheme */ public function __construct($accountName, $accountKey) { parent::__construct($accountName, $accountKey); $this->includedHeaders = array(); $this->includedHeaders[] = Resources::DATE; } /** * Computes the authorization signature for blob and queue shared key. * * @param array $headers request headers. * @param string $url reuqest url. * @param array $queryParams query variables. * @param string $httpMethod request http method. * * @see Blob and Queue Services (Shared Key Authentication) at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return string */ protected function computeSignature($headers, $url, $queryParams, $httpMethod) { $canonicalizedResource = parent::computeCanonicalizedResourceForTable( $url, $queryParams ); $stringToSign = array(); foreach ($this->includedHeaders as $header) { $stringToSign[] = Utilities::tryGetValue($headers, $header); } $stringToSign[] = $canonicalizedResource; $stringToSign = implode("\n", $stringToSign); return $stringToSign; } /** * Returns authorization header to be included in the request. * * @param array $headers request headers. * @param string $url reuqest url. * @param array $queryParams query variables. * @param string $httpMethod request http method. * * @see Specifying the Authorization Header section at * http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx * * @return string */ public function getAuthorizationHeader($headers, $url, $queryParams, $httpMethod) { $signature = $this->computeSignature( $headers, $url, $queryParams, $httpMethod ); return 'SharedKeyLite ' . $this->accountName . ':' . base64_encode( hash_hmac('sha256', $signature, base64_decode($this->accountKey), true) ); } } PKwL\VʃTupdraftplus/includes/WindowsAzure/Common/Internal/Filters/ExponentialRetryPolicy.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Filters; /** * The exponential retry policy. * * @category Microsoft * @package WindowsAzure\Common\Internal\Filters * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ExponentialRetryPolicy extends RetryPolicy { /** * @var integer */ private $_deltaBackoffIntervalInMs; /** * @var integer */ private $_maximumAttempts; /** * @var integer */ private $_resolvedMaxBackoff; /** * @var integer */ private $_resolvedMinBackoff; /** * @var array */ private $_retryableStatusCodes; /** * Initializes new object from ExponentialRetryPolicy. * * @param array $retryableStatusCodes The retryable status codes. * @param integer $deltaBackoff The backoff time delta. * @param integer $maximumAttempts The number of max attempts. */ public function __construct($retryableStatusCodes, $deltaBackoff = parent::DEFAULT_CLIENT_BACKOFF, $maximumAttempts = parent::DEFAULT_CLIENT_RETRY_COUNT ) { $this->_deltaBackoffIntervalInMs = $deltaBackoff; $this->_maximumAttempts = $maximumAttempts; $this->_resolvedMaxBackoff = parent::DEFAULT_MAX_BACKOFF; $this->_resolvedMinBackoff = parent::DEFAULT_MIN_BACKOFF; $this->_retryableStatusCodes = $retryableStatusCodes; sort($retryableStatusCodes); } /** * Indicates if there should be a retry or not. * * @param integer $retryCount The retry count. * @param \HTTP_Request2_Response $response The HTTP response object. * * @return boolean */ public function shouldRetry($retryCount, $response) { if ( $retryCount >= $this->_maximumAttempts || array_search($response->getStatus(), $this->_retryableStatusCodes) || is_null($response) ) { return false; } else { return true; } } /** * Calculates the backoff for the retry policy. * * @param integer $retryCount The retry count. * @param \HTTP_Request2_Response $response The HTTP response object. * * @return integer */ public function calculateBackoff($retryCount, $response) { // Calculate backoff Interval between 80% and 120% of the desired // backoff, multiply by 2^n -1 for // exponential $incrementDelta = (int) (pow(2, $retryCount) - 1); $boundedRandDelta = (int) ($this->_deltaBackoffIntervalInMs * 0.8) + mt_rand( 0, (int) ($this->_deltaBackoffIntervalInMs * 1.2) - (int) ($this->_deltaBackoffIntervalInMs * 0.8) ); $incrementDelta *= $boundedRandDelta; // Enforce max / min backoffs return min( $this->_resolvedMinBackoff + $incrementDelta, $this->_resolvedMaxBackoff ); } } PKwL\֧Iupdraftplus/includes/WindowsAzure/Common/Internal/Filters/RetryPolicy.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Filters; /** * The retry policy abstract class. * * @category Microsoft * @package WindowsAzure\Common\Internal\Filters * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ abstract class RetryPolicy { const DEFAULT_CLIENT_BACKOFF = 30000; const DEFAULT_CLIENT_RETRY_COUNT = 3; const DEFAULT_MAX_BACKOFF = 90000; const DEFAULT_MIN_BACKOFF = 300; /** * Indicates if there should be a retry or not. * * @param integer $retryCount The retry count. * @param \HTTP_Request2_Response $response The HTTP response object. * * @return boolean */ public abstract function shouldRetry($retryCount, $response); /** * Calculates the backoff for the retry policy. * * @param integer $retryCount The retry count. * @param \HTTP_Request2_Response $response The HTTP response object. * * @return integer */ public abstract function calculateBackoff($retryCount, $response); } PKwL\N-(Hupdraftplus/includes/WindowsAzure/Common/Internal/Filters/DateFilter.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Filters; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\IServiceFilter; /** * Adds date header to the http request. * * @category Microsoft * @package WindowsAzure\Common\Internal\Filters * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class DateFilter implements IServiceFilter { /** * Adds date (in GMT format) header to the request headers. * * @param HttpClient $request HTTP channel object. * * @return \HTTP_Request2 */ public function handleRequest($request) { $date = gmdate(Resources::AZURE_DATE_FORMAT, time()); $request->setHeader(Resources::DATE, $date); return $request; } /** * Does nothing with the response. * * @param HttpClient $request HTTP channel object. * @param \HTTP_Request2_Response $response HTTP response object. * * @return \HTTP_Request2_Response */ public function handleResponse($request, $response) { // Do nothing with the response. return $response; } } PKwL\C.  Rupdraftplus/includes/WindowsAzure/Common/Internal/Filters/AuthenticationFilter.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Filters; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\IServiceFilter; use WindowsAzure\Common\Internal\Authentication\SharedKeyAuthScheme; use WindowsAzure\Common\Internal\Authentication\TableSharedKeyLiteAuthScheme; use WindowsAzure\Common\Internal\InvalidArgumentTypeException; /** * Adds authentication header to the http request object. * * @category Microsoft * @package WindowsAzure\Common\Internal\Filters * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class AuthenticationFilter implements IServiceFilter { /** * @var WindowsAzure\Common\Internal\Authentication\StorageAuthScheme */ private $_authenticationScheme; /** * Creates AuthenticationFilter with the passed scheme. * * @param StorageAuthScheme $authenticationScheme The authentication scheme. */ public function __construct($authenticationScheme) { $this->_authenticationScheme = $authenticationScheme; } /** * Adds authentication header to the request headers. * * @param HttpClient $request HTTP channel object. * * @return \HTTP_Request2 */ public function handleRequest($request) { $signedKey = $this->_authenticationScheme->getAuthorizationHeader( $request->getHeaders(), $request->getUrl(), $request->getUrl()->getQueryVariables(), $request->getMethod() ); $request->setHeader(Resources::AUTHENTICATION, $signedKey); return $request; } /** * Does nothing with the response. * * @param HttpClient $request HTTP channel object. * @param \HTTP_Request2_Response $response HTTP response object. * * @return \HTTP_Request2_Response */ public function handleResponse($request, $response) { // Do nothing with the response. return $response; } } PKwL\. Hupdraftplus/includes/WindowsAzure/Common/Internal/Filters/WrapFilter.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Filters; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\IServiceFilter; use WindowsAzure\Common\Internal\Authentication\SharedKeyAuthScheme; use WindowsAzure\Common\Internal\Authentication\TableSharedKeyLiteAuthScheme; use WindowsAzure\Common\Internal\InvalidArgumentTypeException; use WindowsAzure\ServiceBus\Internal\WrapTokenManager; /** * Adds WRAP authentication header to the http request object. * * @category Microsoft * @package WindowsAzure\Common\Internal\Filters * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class WrapFilter implements IServiceFilter { /** * @var WrapTokenManager */ private $_wrapTokenManager; /** * Creates a WrapFilter with specified WRAP parameters. * * @param string $wrapUri The URI of the WRAP service. * @param string $wrapUsername The user name of the WRAP account. * @param string $wrapPassword The password of the WRAP account. * @param IWrap $wrapRestProxy The WRAP service REST proxy. */ public function __construct( $wrapUri, $wrapUsername, $wrapPassword, $wrapRestProxy ) { $this->_wrapTokenManager = new WrapTokenManager( $wrapUri, $wrapUsername, $wrapPassword, $wrapRestProxy ); } /** * Adds WRAP authentication header to the request headers. * * @param HttpClient $request HTTP channel object. * * @return \HTTP_Request2 */ public function handleRequest($request) { Validate::notNull($request, 'request'); $wrapAccessToken = $this->_wrapTokenManager->getAccessToken( $request->getUrl() ); $authorization = sprintf( Resources::WRAP_AUTHORIZATION, $wrapAccessToken ); $request->setHeader(Resources::AUTHENTICATION, $authorization); return $request; } /** * Returns the original response. * * @param HttpClient $request A HTTP channel object. * @param \HTTP_Request2_Response $response A HTTP response object. * * @return \HTTP_Request2_Response */ public function handleResponse($request, $response) { return $response; } } PKwL\a<~ ~ Kupdraftplus/includes/WindowsAzure/Common/Internal/Filters/HeadersFilter.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Filters; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\IServiceFilter; /** * Adds all passed headers to the HTTP request headers. * * @category Microsoft * @package WindowsAzure\Common\Internal\Filters * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class HeadersFilter implements IServiceFilter { /** * @var array */ private $_headers; /** * Constructor * * @param array $headers static headers to be added. * * @return HeadersFilter */ public function __construct($headers) { $this->_headers = $headers; } /** * Adds static header(s) to the HTTP request headers * * @param HttpClient $request HTTP channel object. * * @return \HTTP_Request2 */ public function handleRequest($request) { foreach ($this->_headers as $key => $value) { $headers = $request->getHeaders(); if (!array_key_exists($key, $headers)) { $request->setHeader($key, $value); } } return $request; } /** * Does nothing with the response. * * @param HttpClient $request HTTP channel object. * @param \HTTP_Request2_Response $response HTTP response object. * * @return \HTTP_Request2_Response */ public function handleResponse($request, $response) { // Do nothing with the response. return $response; } } PKwL\8W W Oupdraftplus/includes/WindowsAzure/Common/Internal/Filters/RetryPolicyFilter.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Filters; use WindowsAzure\Common\Internal\IServiceFilter; /** * Short description * * @category Microsoft * @package WindowsAzure\Common\Internal\Filters * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class RetryPolicyFilter implements IServiceFilter { /** * @var RetryPolicy */ private $_retryPolicy; /** * Initializes new object from RetryPolicyFilter. * * @param RetryPolicy $retryPolicy The retry policy object. */ public function __construct($retryPolicy) { $this->_retryPolicy = $retryPolicy; } /** * Handles the request before sending. * * @param \HTTP_Request2 $request The HTTP request. * * @return \HTTP_Request2 */ public function handleRequest($request) { return $request; } /** * Handles the response after sending. * * @param \HTTP_Request2 $request The HTTP request. * @param \HTTP_Request2_Response $response The HTTP response. * * @return \HTTP_Request2_Response */ public function handleResponse($request, $response) { for ($retryCount = 0;; $retryCount++) { $shouldRetry = $this->_retryPolicy->shouldRetry( $retryCount, $response ); if (!$shouldRetry) { return $response; } // Backoff for some time according to retry policy $backoffTime = $this->_retryPolicy->calculateBackoff( $retryCount, $response ); sleep($backoffTime * 0.001); $response = $request->send(array()); } } } PKwL\ZooHupdraftplus/includes/WindowsAzure/Common/Internal/Http/BatchResponse.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Http; require_once 'PEAR.php'; require_once 'Mail/mimeDecode.php'; require_once 'HTTP/Request2/Response.php'; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\ServiceException; /** * Batch response parser * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BatchResponse { /** * Http responses list * * @var array */ private $_contexts; /** * Constructor * * @param string $content Http response * as string * * @param WindowsAzure\Common\Internal\Http\BatchRequest $request Source batch * request object */ public function __construct($content, $request = null) { $params['include_bodies'] = true; $params['input'] = $content; $mimeDecoder = new \Mail_mimeDecode($content); $structure = $mimeDecoder->decode($params); $parts = $structure->parts; $this->_contexts = array(); $requestContexts = null; if ($request != null) { Validate::isA( $request, 'WindowsAzure\Common\Internal\Http\BatchRequest', 'request' ); $requestContexts = $request->getContexts(); } $i = 0; foreach ($parts as $part) { if (!empty($part->body)) { $headerEndPos = strpos($part->body, "\r\n\r\n"); $header = substr($part->body, 0, $headerEndPos); $body = substr($part->body, $headerEndPos + 4); $headerStrings = explode("\r\n", $header); $response = new \HTTP_Request2_Response(array_shift($headerStrings)); foreach ($headerStrings as $headerString) { $response->parseHeaderLine($headerString); } $response->appendBody($body); $this->_contexts[] = $response; if (is_array($requestContexts)) { $expectedCodes = $requestContexts[$i]->getStatusCodes(); $statusCode = $response->getStatus(); if (!in_array($statusCode, $expectedCodes)) { $reason = $response->getReasonPhrase(); throw new ServiceException($statusCode, $reason, $body); } } $i++; } } } /** * Get parsed contexts as array * * @return array */ public function getContexts() { return $this->_contexts; } } PKwL\HJ0Fupdraftplus/includes/WindowsAzure/Common/Internal/Http/IHttpClient.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Http; /** * Defines required methods for a HTTP client proxy. * * @category Microsoft * @package WindowsAzure\Common\Internal\Http * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ interface IHttpClient { /** * Sets the request url. * * @param WindowsAzure\Common\Internal\Http\IUrl $url request url. * * @return none. */ public function setUrl($url); /** * Gets request url. * * @return WindowsAzure\Common\Internal\Http\IUrl */ public function getUrl(); /** * Sets request's HTTP method. * * @param string $method request's HTTP method. * * @return none. */ public function setMethod($method); /** * Gets request's HTTP method. * * @return string */ public function getMethod(); /** * Gets request's headers * * @return array */ public function getHeaders(); /** * Sets a an existing request header to value or creates a new one if the $header * doesn't exist. * * @param string $header header name. * @param string $value header value. * @param bool $replace whether to replace previous header with the same name * or append to its value (comma separated) * * @return none. */ public function setHeader($header, $value, $replace = false); /** * Sets request headers using array * * @param array $headers headers key-value array * * @return none. */ public function setHeaders($headers); /** * Sets HTTP POST parameters. * * @param array $postParameters The HTTP POST parameters. * * @return none */ public function setPostParameters($postParameters); /** * Processes the reuqest through HTTP pipeline with passed $filters, * sends HTTP request to the wire and process the response in the HTTP pipeline. * * @param array $filters HTTP filters which will be applied to the request before * send and then applied to the response. * @param IUrl $url Request url. * * @return string The response body. */ public function send($filters, $url = null); /** * Sets successful status code * * @param array|string $statusCodes successful status code. * * @return none. */ public function setExpectedStatusCode($statusCodes); /** * Gets successful status code * * @return array. */ public function getSuccessfulStatusCode(); /** * Sets a configuration element for the request. * * @param string $name configuration parameter name. * @param mix $value configuration parameter value. * * @return none. */ public function setConfig($name, $value = null); /** * Gets value for configuration parameter. * * @param string $name configuration parameter name. * * @return string. */ public function getConfig($name); /** * Sets the request body. * * @param string $body body to use. * * @return none. */ public function setBody($body); /** * Gets the request body. * * @return string. */ public function getBody(); /** * Makes deep copy from the current object. * * @return WindowsAzure\Common\Internal\Http\HttpClient */ public function __clone(); /** * Gets the response object. * * @return \HTTP_Request2_Response. */ public function getResponse(); /** * Throws ServiceException if the recieved status code is not expected. * * @param string $actual The received status code. * @param string $reason The reason phrase. * @param string $message The detailed message (if any). * @param array $expected The expected status codes. * * @return none * * @static * * @throws ServiceException */ public static function throwIfError($actual, $reason, $message, $expected); } PKwL\͕dGupdraftplus/includes/WindowsAzure/Common/Internal/Http/BatchRequest.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Http; require_once 'PEAR.php'; require_once 'Mail/mimePart.php'; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Utilities; /** * Batch request marshaler * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class BatchRequest { /** * Http call context list * * @var array */ private $_contexts; /** * Headers * * @var array */ private $_headers; /** * Request body * * @var string */ private $_body; /** * Constructor */ public function __construct() { $this->_contexts = array(); } /** * Append new context to batch request * * @param WindowsAzure\Common\Internal\Http\HttpCallContext $context Http call * context to add to batch request * * @return none */ public function appendContext($context) { $this->_contexts[] = $context; } /** * Encode contexts * * @return none */ public function encode() { $mimeType = Resources::MULTIPART_MIXED_TYPE; $batchGuid = Utilities::getGuid(); $batchId = sprintf('batch_%s', $batchGuid); $contentType1 = array('content_type' => "$mimeType"); $changeSetGuid = Utilities::getGuid(); $changeSetId = sprintf('changeset_%s', $changeSetGuid); $contentType2 = array('content_type' => "$mimeType; boundary=$changeSetId"); $options = array( 'encoding' => 'binary', 'content_type' => Resources::HTTP_TYPE ); // Create changeset MIME part $changeSet = new \Mail_mimePart(); $i = 1; foreach ($this->_contexts as $context) { $context->addHeader(Resources::CONTENT_ID, $i); $changeSet->addSubpart((string)$context, $options); $i++; } // Encode the changeset MIME part $changeSetEncoded = $changeSet->encode($changeSetId); // Create the batch MIME part $batch = new \Mail_mimePart(Resources::EMPTY_STRING, $contentType1); // Add changeset encoded to batch MIME part $batch->addSubpart($changeSetEncoded['body'], $contentType2); // Encode batch MIME part $batchEncoded = $batch->encode($batchId); $this->_headers = $batchEncoded['headers']; $this->_body = $batchEncoded['body']; } /** * Get "Request body" * * @return string */ public function getBody() { return $this->_body; } /** * Get "Headers" * * @return array */ public function getHeaders() { return $this->_headers; } /** * Get request contexts * * @return array */ public function getContexts() { return $this->_contexts; } } PKwL\ruu>updraftplus/includes/WindowsAzure/Common/Internal/Http/Url.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Http; require_once 'Net/URL2.php'; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Http\IUrl; /** * Default IUrl implementation. * * @category Microsoft * @package WindowsAzure\Common\Internal\Http * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Url implements IUrl { /** * @var \Net_URL2 */ private $_url; /** * Sets the url path to '/' if it's empty * * @param string $url the url string * * @return none. */ private function _setPathIfEmpty($url) { $path = parse_url($url, PHP_URL_PATH); if (empty($path)) { $this->setUrlPath('/'); } } /** * Constructor * * @param string $url the url to set. * * @return WindowsAzure\Common\Internal\Http\Url */ public function __construct($url) { $errorMessage = Resources::INVALID_URL_MSG; Validate::isTrue(filter_var($url, FILTER_VALIDATE_URL), $errorMessage); $this->_url = new \Net_URL2($url); $this->_setPathIfEmpty($url); } /** * Makes deep copy from the current object. * * @return WindowsAzure\Common\Internal\Http\Url */ public function __clone() { $this->_url = clone $this->_url; } /** * Returns the query portion of the url * * @return string */ public function getQuery() { return $this->_url->getQuery(); } /** * Returns the query portion of the url in array form * * @return array */ public function getQueryVariables() { return $this->_url->getQueryVariables(); } /** * Sets a an existing query parameter to value or creates a new one if the $key * doesn't exist. * * @param string $key query parameter name. * @param string $value query value. * * @return none */ public function setQueryVariable($key, $value) { Validate::isString($key, 'key'); Validate::isString($value, 'value'); $this->_url->setQueryVariable($key, $value); } /** * Gets actual URL string. * * @return string. */ public function getUrl() { return $this->_url->getURL(); } /** * Sets url path * * @param string $urlPath url path to set. * * @return none. */ public function setUrlPath($urlPath) { Validate::isString($urlPath, 'urlPath'); $this->_url->setPath($urlPath); } /** * Appends url path * * @param string $urlPath url path to append. * * @return none. */ public function appendUrlPath($urlPath) { Validate::isString($urlPath, 'urlPath'); $newUrlPath = parse_url($this->_url, PHP_URL_PATH) . $urlPath; $this->_url->setPath($newUrlPath); } /** * Gets actual URL string. * * @return string. */ public function __toString() { return $this->_url->getURL(); } /** * Sets the query string to the specified variables in $array * * @param array $array key/value representation of query variables. * * @return none. */ public function setQueryVariables($array) { foreach ($array as $key => $value) { $this->setQueryVariable($key, $value); } } } PKwL\&&Jupdraftplus/includes/WindowsAzure/Common/Internal/Http/HttpCallContext.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Http; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Http\Url; /** * Holds basic elements for making HTTP call. * * @category Microsoft * @package WindowsAzure\Common\Internal\Http * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class HttpCallContext { /** * The HTTP method used to make this call. * * @var string */ private $_method; /** * HTTP request headers. * * @var array */ private $_headers; /** * The URI query parameters. * * @var array */ private $_queryParams; /** * The HTTP POST parameters. * * @var array. */ private $_postParameters; /** * @var string */ private $_uri; /** * The URI path. * * @var string */ private $_path; /** * The expected status codes. * * @var array */ private $_statusCodes; /** * The HTTP request body. * * @var string */ private $_body; /** * Default constructor. */ public function __construct() { $this->_method = null; $this->_body = null; $this->_path = null; $this->_uri = null; $this->_queryParams = array(); $this->_postParameters = array(); $this->_statusCodes = array(); $this->_headers = array(); } /** * Gets method. * * @return string */ public function getMethod() { return $this->_method; } /** * Sets method. * * @param string $method The method value. * * @return none */ public function setMethod($method) { Validate::isString($method, 'method'); $this->_method = $method; } /** * Gets headers. * * @return array */ public function getHeaders() { return $this->_headers; } /** * Sets headers. * * Ignores the header if its value is empty. * * @param array $headers The headers value. * * @return none */ public function setHeaders($headers) { $this->_headers = array(); foreach ($headers as $key => $value) { $this->addHeader($key, $value); } } /** * Gets queryParams. * * @return array */ public function getQueryParameters() { return $this->_queryParams; } /** * Sets queryParams. * * Ignores the query variable if its value is empty. * * @param array $queryParams The queryParams value. * * @return none */ public function setQueryParameters($queryParams) { $this->_queryParams = array(); foreach ($queryParams as $key => $value) { $this->addQueryParameter($key, $value); } } /** * Gets uri. * * @return string */ public function getUri() { return $this->_uri; } /** * Sets uri. * * @param string $uri The uri value. * * @return none */ public function setUri($uri) { Validate::isString($uri, 'uri'); $this->_uri = $uri; } /** * Gets path. * * @return string */ public function getPath() { return $this->_path; } /** * Sets path. * * @param string $path The path value. * * @return none */ public function setPath($path) { Validate::isString($path, 'path'); $this->_path = $path; } /** * Gets statusCodes. * * @return array */ public function getStatusCodes() { return $this->_statusCodes; } /** * Sets statusCodes. * * @param array $statusCodes The statusCodes value. * * @return none */ public function setStatusCodes($statusCodes) { $this->_statusCodes = array(); foreach ($statusCodes as $value) { $this->addStatusCode($value); } } /** * Gets body. * * @return string */ public function getBody() { return $this->_body; } /** * Sets body. * * @param string $body The body value. * * @return none */ public function setBody($body) { Validate::isString($body, 'body'); $this->_body = $body; } /** * Adds or sets header pair. * * @param string $name The HTTP header name. * @param string $value The HTTP header value. * * @return none */ public function addHeader($name, $value) { Validate::isString($name, 'name'); Validate::isString($value, 'value'); $this->_headers[$name] = $value; } /** * Adds or sets header pair. * * Ignores header if it's value satisfies empty(). * * @param string $name The HTTP header name. * @param string $value The HTTP header value. * * @return none */ public function addOptionalHeader($name, $value) { Validate::isString($name, 'name'); Validate::isString($value, 'value'); if (!empty($value)) { $this->_headers[$name] = $value; } } /** * Removes header from the HTTP request headers. * * @param string $name The HTTP header name. * * @return none */ public function removeHeader($name) { Validate::isString($name, 'name'); Validate::notNullOrEmpty($name, 'name'); unset($this->_headers[$name]); } /** * Adds or sets query parameter pair. * * @param string $name The URI query parameter name. * @param string $value The URI query parameter value. * * @return none */ public function addQueryParameter($name, $value) { Validate::isString($name, 'name'); Validate::isString($value, 'value'); $this->_queryParams[$name] = $value; } /** * Gets HTTP POST parameters. * * @return array */ public function getPostParameters() { return $this->_postParameters; } /** * Sets HTTP POST parameters. * * @param array $postParameters The HTTP POST parameters. * * @return none */ public function setPostParameters($postParameters) { Validate::isArray($postParameters, 'postParameters'); $this->_postParameters = $postParameters; } /** * Adds or sets query parameter pair. * * Ignores query parameter if it's value satisfies empty(). * * @param string $name The URI query parameter name. * @param string $value The URI query parameter value. * * @return none */ public function addOptionalQueryParameter($name, $value) { Validate::isString($name, 'name'); Validate::isString($value, 'value'); if (!empty($value)) { $this->_queryParams[$name] = $value; } } /** * Adds status code to the expected status codes. * * @param integer $statusCode The expected status code. * * @return none */ public function addStatusCode($statusCode) { Validate::isInteger($statusCode, 'statusCode'); $this->_statusCodes[] = $statusCode; } /** * Gets header value. * * @param string $name The header name. * * @return mix */ public function getHeader($name) { return Utilities::tryGetValue($this->_headers, $name); } /** * Converts the context object to string. * * @return string */ public function __toString() { $headers = Resources::EMPTY_STRING; $uri = new Url($this->_uri); $uri = $uri->getUrl(); foreach ($this->_headers as $key => $value) { $headers .= "$key: $value\n"; } $str = "$this->_method $uri$this->_path HTTP/1.1\n$headers\n"; $str .= "$this->_body"; return $str; } } PKwL\(( ?updraftplus/includes/WindowsAzure/Common/Internal/Http/IUrl.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Http; /** * Defines what are main url functionalities that should be supported * * @category Microsoft * @package WindowsAzure\Common\Internal\Http * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ interface IUrl { /** * Returns the query portion of the url * * @return string */ public function getQuery(); /** * Returns the query portion of the url in array form * * @return array */ public function getQueryVariables(); /** * Sets a an existing query parameter to value or creates a new one if the $key * doesn't exist. * * @param string $key query parameter name. * @param string $value query value. * * @return none. */ public function setQueryVariable($key, $value); /** * Gets actual URL string. * * @return string. */ public function getUrl(); /** * Sets url path * * @param string $urlPath url path to set. * * @return none. */ public function setUrlPath($urlPath); /** * Appends url path * * @param string $urlPath url path to append. * * @return none. */ public function appendUrlPath($urlPath); /** * Gets actual URL string. * * @return string. */ public function __toString(); /** * Makes deep copy from the current object. * * @return WindowsAzure\Common\Internal\Http\Url */ public function __clone(); /** * Sets the query string to the specified variables in $array * * @param array $array key/value representation of query variables. * * @return none. */ public function setQueryVariables($array); } PKwL\eJ))Eupdraftplus/includes/WindowsAzure/Common/Internal/Http/HttpClient.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Http; use WindowsAzure\Common\Internal\Http\IHttpClient; use WindowsAzure\Common\Internal\IServiceFilter; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\ServiceException; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Http\IUrl; require_once 'HTTP/Request2.php'; /** * HTTP client which sends and receives HTTP requests and responses. * * @category Microsoft * @package WindowsAzure\Common\Internal\Http * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class HttpClient implements IHttpClient { /** * @var \HTTP_Request2 */ private $_request; /** * @var WindowsAzure\Common\Internal\Http\IUrl */ private $_requestUrl; /** * Holds the latest response object * * @var \HTTP_Request2_Response */ private $_response; /** * Holds expected status code after sending the request. * * @var array */ private $_expectedStatusCodes; /** * Initializes new HttpClient object. * * @param string $certificatePath The certificate path. * @param string $certificateAuthorityPath The path of the certificate authority. * * @return WindowsAzure\Common\Internal\Http\HttpClient */ function __construct( $certificatePath = Resources::EMPTY_STRING, $certificateAuthorityPath = Resources::EMPTY_STRING ) { $config = array( Resources::USE_BRACKETS => true, Resources::SSL_VERIFY_PEER => false, Resources::SSL_VERIFY_HOST => false ); if (!empty($certificatePath)) { $config[Resources::SSL_LOCAL_CERT] = $certificatePath; $config[Resources::SSL_VERIFY_HOST] = true; } if (!empty($certificateAuthorityPath)) { $config[Resources::SSL_CAFILE] = $certificateAuthorityPath; $config[Resources::SSL_VERIFY_PEER] = true; } $this->_request = new \HTTP_Request2( null, null, $config ); $this->setHeader('user-agent', null); $this->_requestUrl = null; $this->_response = null; $this->_expectedStatusCodes = array(); } /** * Makes deep copy from the current object. * * @return WindowsAzure\Common\Internal\Http\HttpClient */ public function __clone() { $this->_request = clone $this->_request; if (!is_null($this->_requestUrl)) { $this->_requestUrl = clone $this->_requestUrl; } } /** * Sets the request url. * * @param WindowsAzure\Common\Internal\Http\IUrl $url request url. * * @return none. */ public function setUrl($url) { $this->_requestUrl = $url; } /** * Gets request url. Note that you must check if the returned object is null or * not. * * @return WindowsAzure\Common\Internal\Http\IUrl */ public function getUrl() { return $this->_requestUrl; } /** * Sets request's HTTP method. You can use \HTTP_Request2 constants like * Resources::HTTP_GET or strings like 'GET'. * * @param string $method request's HTTP method. * * @return none */ public function setMethod($method) { $this->_request->setMethod($method); } /** * Gets request's HTTP method. * * @return string */ public function getMethod() { return $this->_request->getMethod(); } /** * Gets request's headers. The returned array key (header names) are all in * lower case even if they were set having some upper letters. * * @return array */ public function getHeaders() { return $this->_request->getHeaders(); } /** * Sets a an existing request header to value or creates a new one if the $header * doesn't exist. * * @param string $header header name. * @param string $value header value. * @param bool $replace whether to replace previous header with the same name * or append to its value (comma separated) * * @return none */ public function setHeader($header, $value, $replace = false) { Validate::isString($value, 'value'); $this->_request->setHeader($header, $value, $replace); } /** * Sets request headers using array * * @param array $headers headers key-value array * * @return none */ public function setHeaders($headers) { foreach ($headers as $key => $value) { $this->setHeader($key, $value); } } /** * Sets HTTP POST parameters. * * @param array $postParameters The HTTP POST parameters. * * @return none */ public function setPostParameters($postParameters) { $this->_request->addPostParameter($postParameters); } /** * Processes the reuqest through HTTP pipeline with passed $filters, * sends HTTP request to the wire and process the response in the HTTP pipeline. * * @param array $filters HTTP filters which will be applied to the request before * send and then applied to the response. * @param IUrl $url Request url. * * @throws WindowsAzure\Common\ServiceException * * @return string The response body */ public function send($filters, $url = null) { if (isset($url)) { $this->setUrl($url); $this->_request->setUrl($this->_requestUrl->getUrl()); } $contentLength = Resources::EMPTY_STRING; if ( strtoupper($this->getMethod()) != Resources::HTTP_GET && strtoupper($this->getMethod()) != Resources::HTTP_DELETE && strtoupper($this->getMethod()) != Resources::HTTP_HEAD ) { $contentLength = 0; if (!is_null($this->getBody())) { $contentLength = strlen($this->getBody()); } $this->_request->setHeader(Resources::CONTENT_LENGTH, $contentLength); } foreach ($filters as $filter) { $this->_request = $filter->handleRequest($this)->_request; } $this->_response = $this->_request->send(); $start = count($filters) - 1; for ($index = $start; $index >= 0; $index--) { $this->_response = $filters[$index]->handleResponse( $this, $this->_response ); } self::throwIfError( $this->_response->getStatus(), $this->_response->getReasonPhrase(), $this->_response->getBody(), $this->_expectedStatusCodes ); return $this->_response->getBody(); } /** * Sets successful status code * * @param array|string $statusCodes successful status code. * * @return none */ public function setExpectedStatusCode($statusCodes) { if (!is_array($statusCodes)) { $this->_expectedStatusCodes[] = $statusCodes; } else { $this->_expectedStatusCodes = $statusCodes; } } /** * Gets successful status code * * @return array */ public function getSuccessfulStatusCode() { return $this->_expectedStatusCodes; } /** * Sets configuration parameter. * * @param string $name The configuration parameter name. * @param mix $value The configuration parameter value. * * @return none */ public function setConfig($name, $value = null) { $this->_request->setConfig($name, $value); } /** * Gets value for configuration parameter. * * @param string $name configuration parameter name. * * @return string */ public function getConfig($name) { return $this->_request->getConfig($name); } /** * Sets the request body. * * @param string $body body to use. * * @return none */ public function setBody($body) { Validate::isString($body, 'body'); $this->_request->setBody($body); } /** * Gets the request body. * * @return string */ public function getBody() { return $this->_request->getBody(); } /** * Gets the response object. * * @return \HTTP_Request2_Response */ public function getResponse() { return $this->_response; } /** * Throws ServiceException if the recieved status code is not expected. * * @param string $actual The received status code. * @param string $reason The reason phrase. * @param string $message The detailed message (if any). * @param array $expected The expected status codes. * * @return none * * @static * * @throws ServiceException */ public static function throwIfError($actual, $reason, $message, $expected) { if (!in_array($actual, $expected)) { throw new ServiceException($actual, $reason, $message); } } } PKwL\ Y Rupdraftplus/includes/WindowsAzure/Common/Internal/Serialization/JsonSerializer.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Serialization; use WindowsAzure\Common\Internal\Validate; /** * Perform JSON serialization / deserialization * * @category Microsoft * @package WindowsAzure\Common\Internal\Serialization * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class JsonSerializer implements ISerializer { /** * Serialize an object with specified root element name. * * @param object $targetObject The target object. * @param string $rootName The name of the root element. * * @return string */ public static function objectSerialize($targetObject, $rootName) { Validate::notNull($targetObject, 'targetObject'); Validate::isString($rootName, 'rootName'); $contianer = new \stdClass(); $contianer->$rootName = $targetObject; return json_encode($contianer); } /** * Serializes given array. The array indices must be string to use them as * as element name. * * @param array $array The object to serialize represented in array. * @param array $properties The used properties in the serialization process. * * @return string */ public function serialize($array, $properties = null) { Validate::isArray($array, 'array'); return json_encode($array); } /** * Unserializes given serialized string to array. * * @param string $serialized The serialized object in string representation. * * @return array */ public function unserialize($serialized) { Validate::isString($serialized, 'serialized'); $json = json_decode($serialized); if ($json && !is_array($json)) { return get_object_vars($json); } else { return $json; } } } PKwL\vGOupdraftplus/includes/WindowsAzure/Common/Internal/Serialization/ISerializer.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Serialization; /** * The serialization interface. * * @category Microsoft * @package WindowsAzure\Common\Internal\Serialization * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ interface ISerializer { /** * Serialize an object into a XML. * * @param Object $targetObject The target object to be serialized. * @param string $rootName The name of the root. * * @return string */ public static function objectSerialize($targetObject, $rootName); /** * Serializes given array. The array indices must be string to use them as * as element name. * * @param array $array The object to serialize represented in array. * @param array $properties The used properties in the serialization process. * * @return string */ public function serialize($array, $properties = null); /** * Unserializes given serialized string. * * @param string $serialized The serialized object in string representation. * * @return array */ public function unserialize($serialized); } PKwL\PeQupdraftplus/includes/WindowsAzure/Common/Internal/Serialization/XmlSerializer.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal\Serialization; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; /** * Short description * * @category Microsoft * @package WindowsAzure\Common\Internal\Serialization * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class XmlSerializer implements ISerializer { const STANDALONE = 'standalone'; const ROOT_NAME = 'rootName'; const DEFAULT_TAG = 'defaultTag'; /** * Converts a SimpleXML object to an Array recursively * ensuring all sub-elements are arrays as well. * * @param string $sxml The SimpleXML object. * @param array $arr The array into which to store results. * * @return array */ private function _sxml2arr($sxml, $arr = null) { foreach ((array) $sxml as $key => $value) { if (is_object($value) || (is_array($value))) { $arr[$key] = $this->_sxml2arr($value); } else { $arr[$key] = $value; } } return $arr; } /** * Takes an array and produces XML based on it. * * @param XMLWriter $xmlw XMLWriter object that was previously instanted * and is used for creating the XML. * @param array $data Array to be converted to XML. * @param string $defaultTag Default XML tag to be used if none specified. * * @return void */ private function _arr2xml(\XMLWriter $xmlw, $data, $defaultTag = null) { foreach ($data as $key => $value) { if ($key === Resources::XTAG_ATTRIBUTES) { foreach ($value as $attributeName => $attributeValue) { $xmlw->writeAttribute($attributeName, $attributeValue); } } else if (is_array($value)) { if (!is_int($key)) { if ($key != Resources::EMPTY_STRING) { $xmlw->startElement($key); } else { $xmlw->startElement($defaultTag); } } $this->_arr2xml($xmlw, $value); if (!is_int($key)) { $xmlw->endElement(); } } else { $xmlw->writeElement($key, $value); } } } /** * Gets the attributes of a specified object if get attributes * method is exposed. * * @param object $targetObject The target object. * @param array $methodArray The array of method of the target object. * * @return mixed */ private static function _getInstanceAttributes($targetObject, $methodArray) { foreach ($methodArray as $method) { if ($method->name == 'getAttributes') { $classProperty = $method->invoke($targetObject); return $classProperty; } } return null; } /** * Serialize an object with specified root element name. * * @param object $targetObject The target object. * @param string $rootName The name of the root element. * * @return string */ public static function objectSerialize($targetObject, $rootName) { Validate::notNull($targetObject, 'targetObject'); Validate::isString($rootName, 'rootName'); $xmlWriter = new \XmlWriter(); $xmlWriter->openMemory(); $xmlWriter->setIndent(true); $reflectionClass = new \ReflectionClass($targetObject); $methodArray = $reflectionClass->getMethods(); $attributes = self::_getInstanceAttributes( $targetObject, $methodArray ); $xmlWriter->startElement($rootName); if (!is_null($attributes)) { foreach (array_keys($attributes) as $attributeKey) { $xmlWriter->writeAttribute( $attributeKey, $attributes[$attributeKey] ); } } foreach ($methodArray as $method) { if ((strpos($method->name, 'get') === 0) && $method->isPublic() && ($method->name != 'getAttributes') ) { $variableName = substr($method->name, 3); $variableValue = $method->invoke($targetObject); if (!empty($variableValue)) { if (gettype($variableValue) === 'object') { $xmlWriter->writeRaw( XmlSerializer::objectSerialize( $variableValue, $variableName ) ); } else { $xmlWriter->writeElement($variableName, $variableValue); } } } } $xmlWriter->endElement(); return $xmlWriter->outputMemory(true); } /** * Serializes given array. The array indices must be string to use them as * as element name. * * @param array $array The object to serialize represented in array. * @param array $properties The used properties in the serialization process. * * @return string */ public function serialize($array, $properties = null) { $xmlVersion = '1.0'; $xmlEncoding = 'UTF-8'; $standalone = Utilities::tryGetValue($properties, self::STANDALONE); $defaultTag = Utilities::tryGetValue($properties, self::DEFAULT_TAG); $rootName = Utilities::tryGetValue($properties, self::ROOT_NAME); $docNamespace = Utilities::tryGetValue( $array, Resources::XTAG_NAMESPACE, null ); if (!is_array($array)) { return false; } $xmlw = new \XmlWriter(); $xmlw->openMemory(); $xmlw->setIndent(true); $xmlw->startDocument($xmlVersion, $xmlEncoding, $standalone); if (is_null($docNamespace)) { $xmlw->startElement($rootName); } else { foreach ($docNamespace as $uri => $prefix) { $xmlw->startElementNS($prefix, $rootName, $uri); break; } } unset($array[Resources::XTAG_NAMESPACE]); self::_arr2xml($xmlw, $array, $defaultTag); $xmlw->endElement(); return $xmlw->outputMemory(true); } /** * Unserializes given serialized string. * * @param string $serialized The serialized object in string representation. * * @return array */ public function unserialize($serialized) { $sxml = new \SimpleXMLElement($serialized); return $this->_sxml2arr($sxml); } } PKwL\&Uˉ**Lupdraftplus/includes/WindowsAzure/Common/Internal/ConnectionStringParser.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; /** * Helper methods for parsing connection strings. The rules for formatting connection * strings are defined here: * www.connectionstrings.com/articles/show/important-rules-for-connection-strings * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ConnectionStringParser { /** * @var string */ private $_argumentName; /** * @var string */ private $_value; /** * @var integer */ private $_pos; /** * @var string */ private $_state; /** * Parses the connection string into a collection of key/value pairs. * * @param string $argumentName Name of the argument to be used in error * messages. * @param string $connectionString Connection string. * * @return array * * @static */ public static function parseConnectionString($argumentName, $connectionString) { Validate::isString($argumentName, 'argumentName'); Validate::notNullOrEmpty($argumentName, 'argumentName'); Validate::isString($connectionString, 'connectionString'); Validate::notNullOrEmpty($connectionString, 'connectionString'); $parser = new ConnectionStringParser($argumentName, $connectionString); return $parser->_parse(); } /** * Initializes the object. * * @param string $argumentName Name of the argument to be used in error * messages. * @param string $value Connection string. */ private function __construct($argumentName, $value) { $this->_argumentName = $argumentName; $this->_value = $value; $this->_pos = 0; $this->_state = ParserState::EXPECT_KEY; } /** * Parses the connection string. * * @return array * * @throws \RuntimeException */ private function _parse() { $key = null; $value = null; $connectionStringValues = array(); while (true) { $this->_skipWhiteSpaces(); if ( $this->_pos == strlen($this->_value) && $this->_state != ParserState::EXPECT_VALUE ) { // Not stopping after the end has been reached and a value is // expected results in creating an empty value, which we expect. break; } switch ($this->_state) { case ParserState::EXPECT_KEY: $key = $this->_extractKey(); $this->_state = ParserState::EXPECT_ASSIGNMENT; break; case ParserState::EXPECT_ASSIGNMENT: $this->_skipOperator('='); $this->_state = ParserState::EXPECT_VALUE; break; case ParserState::EXPECT_VALUE: $value = $this->_extractValue(); $this->_state = ParserState::EXPECT_SEPARATOR; $connectionStringValues[$key] = $value; $key = null; $value = null; break; default: $this->_skipOperator(';'); $this->_state = ParserState::EXPECT_KEY; break; } } // Must end parsing in the valid state (expected key or separator) if ($this->_state == ParserState::EXPECT_ASSIGNMENT) { throw $this->_createException( $this->_pos, Resources::MISSING_CONNECTION_STRING_CHAR, '=' ); } return $connectionStringValues; } /** *Generates an invalid connection string exception with the detailed error * message. * * @param integer $position The position of the error. * @param string $errorString The short error formatting string. * * @return \RuntimeException */ private function _createException($position, $errorString) { $arguments = func_get_args(); // Remove first argument (position) unset($arguments[0]); // Create a short error message. $errorString = sprintf($errorString, $arguments); // Add position. $errorString = sprintf( Resources::ERROR_PARSING_STRING, $errorString, $position ); // Create final error message. $errorString = sprintf( Resources::INVALID_CONNECTION_STRING, $this->_argumentName, $errorString ); return new \RuntimeException($errorString); } /** * Skips whitespaces at the current position. * * @return none */ private function _skipWhiteSpaces() { while ( $this->_pos < strlen($this->_value) && ctype_space($this->_value[$this->_pos]) ) { $this->_pos++; } } /** * Extracts the key's value. * * @return string */ private function _extractValue() { $value = Resources::EMPTY_STRING; if ($this->_pos < strlen($this->_value)) { $ch = $this->_value[$this->_pos]; if ($ch == '"' || $ch == '\'') { // Value is contained between double quotes or skipped single quotes. $this->_pos++; $value = $this->_extractString($ch); } else { $firstPos = $this->_pos; $isFound = false; while ($this->_pos < strlen($this->_value) && !$isFound) { $ch = $this->_value[$this->_pos]; if ($ch == ';') { $isFound = true; } else { $this->_pos++; } } $value = rtrim( substr($this->_value, $firstPos, $this->_pos - $firstPos) ); } } return $value; } /** * Extracts key at the current position. * * @return string */ private function _extractKey() { $key = null; $firstPos = $this->_pos; $ch = $this->_value[$this->_pos]; if ($ch == '"' || $ch == '\'') { $this->_pos++; $key = $this->_extractString($ch); } else if ($ch == ';' || $ch == '=') { // Key name was expected. throw $this->_createException( $firstPos, Resources::ERROR_CONNECTION_STRING_MISSING_KEY ); } else { while ($this->_pos < strlen($this->_value)) { $ch = $this->_value[$this->_pos]; // At this point we've read the key, break. if ($ch == '=') { break; } $this->_pos++; } $key = rtrim(substr($this->_value, $firstPos, $this->_pos - $firstPos)); } if (strlen($key) == 0) { // Empty key name. throw $this->_createException( $firstPos, Resources::ERROR_CONNECTION_STRING_EMPTY_KEY ); } return $key; } /** * Extracts the string until the given quotation mark. * * @param string $quote The quotation mark terminating the string. * * @return string */ private function _extractString($quote) { $firstPos = $this->_pos; while ( $this->_pos < strlen($this->_value) && $this->_value[$this->_pos] != $quote ) { $this->_pos++; } if ($this->_pos == strlen($this->_value)) { // Runaway string. throw $this->_createException( $this->_pos, Resources::ERROR_CONNECTION_STRING_MISSING_CHARACTER, $quote ); } return substr($this->_value, $firstPos, $this->_pos++ - $firstPos); } /** * Skips specified operator. * * @param string $operatorChar The operator character. * * @return none * * @throws \RuntimeException */ private function _skipOperator($operatorChar) { if ($this->_value[$this->_pos] != $operatorChar) { // Character was expected. throw $this->_createException( $this->_pos, Resources::MISSING_CONNECTION_STRING_CHAR, $operatorChar ); } $this->_pos++; } } /** * State of the connection string parser. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ParserState { const EXPECT_KEY = 'ExpectKey'; const EXPECT_ASSIGNMENT = 'ExpectAssignment'; const EXPECT_VALUE = 'ExpectValue'; const EXPECT_SEPARATOR = 'ExpectSeparator'; }PKwL\<updraftplus/includes/WindowsAzure/Common/Internal/Logger.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; /** * Logger class for debugging purpose. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Logger { /** * @var string */ private static $_filePath; /** * Logs $var to file. * * @param mix $var The data to log. * @param string $tip The help message. * * @static * * @return none */ public static function log($var, $tip = Resources::EMPTY_STRING) { if (!empty($tip)) { error_log($tip . "\n", 3, self::$_filePath); } if (is_array($var) || is_object($var)) { error_log(print_r($var, true), 3, self::$_filePath); } else { error_log($var . "\n", 3, self::$_filePath); } } /** * Sets file path to use. * * @param string $filePath The log file path. * * @static * * @return none */ public static function setLogFile($filePath) { self::$_filePath = $filePath; } } PKwL\6aa?updraftplus/includes/WindowsAzure/Common/Internal/Resources.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; /** * Project resources. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Resources { // @codingStandardsIgnoreStart // Connection strings const USE_DEVELOPMENT_STORAGE_NAME = 'UseDevelopmentStorage'; const DEVELOPMENT_STORAGE_PROXY_URI_NAME = 'DevelopmentStorageProxyUri'; const DEFAULT_ENDPOINTS_PROTOCOL_NAME = 'DefaultEndpointsProtocol'; const ACCOUNT_NAME_NAME = 'AccountName'; const ACCOUNT_KEY_NAME = 'AccountKey'; const BLOB_ENDPOINT_NAME = 'BlobEndpoint'; const QUEUE_ENDPOINT_NAME = 'QueueEndpoint'; const TABLE_ENDPOINT_NAME = 'TableEndpoint'; const SHARED_ACCESS_SIGNATURE_NAME = 'SharedAccessSignature'; const DEV_STORE_NAME = 'devstoreaccount1'; const DEV_STORE_KEY = 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=='; const BLOB_BASE_DNS_NAME = 'blob.core.windows.net'; const QUEUE_BASE_DNS_NAME = 'queue.core.windows.net'; const TABLE_BASE_DNS_NAME = 'table.core.windows.net'; const DEV_STORE_CONNECTION_STRING = 'BlobEndpoint=127.0.0.1:10000;QueueEndpoint=127.0.0.1:10001;TableEndpoint=127.0.0.1:10002;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=='; const SUBSCRIPTION_ID_NAME = 'SubscriptionID'; const CERTIFICATE_PATH_NAME = 'CertificatePath'; const SERVICE_MANAGEMENT_ENDPOINT_NAME = 'ServiceManagementEndpoint'; const SERVICE_BUS_ENDPOINT_NAME = 'Endpoint'; const SHARED_SECRET_ISSUER_NAME = 'SharedSecretIssuer'; const SHARED_SECRET_VALUE_NAME = 'SharedSecretValue'; const STS_ENDPOINT_NAME = 'StsEndpoint'; const MEDIA_SERVICES_ENDPOINT_URI_NAME = 'MediaServicesEndpoint'; const MEDIA_SERVICES_ACCOUNT_NAME = 'AccountName'; const MEDIA_SERVICES_ACCESS_KEY = 'AccessKey'; const MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME = 'OAuthEndpoint'; // Messages const INVALID_TYPE_MSG = 'The provided variable should be of type: '; const INVALID_META_MSG = 'Metadata cannot contain newline characters.'; const AZURE_ERROR_MSG = "Fail:\nCode: %s\nValue: %s\ndetails (if any): %s."; const NOT_IMPLEMENTED_MSG = 'This method is not implemented.'; const NULL_OR_EMPTY_MSG = "'%s' can't be NULL or empty."; const NULL_MSG = "'%s' can't be NULL."; const INVALID_URL_MSG = 'Provided URL is invalid.'; const INVALID_HT_MSG = 'The header type provided is invalid.'; const INVALID_EDM_MSG = 'The provided EDM type is invalid.'; const INVALID_PROP_MSG = 'One of the provided properties is not an instance of class Property'; const INVALID_ENTITY_MSG = 'The provided entity object is invalid.'; const INVALID_VERSION_MSG = 'Server does not support any known protocol versions.'; const INVALID_BO_TYPE_MSG = 'Batch operation name is not supported or invalid.'; const INVALID_BO_PN_MSG = 'Batch operation parameter is not supported.'; const INVALID_OC_COUNT_MSG = 'Operations and contexts must be of same size.'; const INVALID_EXC_OBJ_MSG = 'Exception object type should be ServiceException.'; const NULL_TABLE_KEY_MSG = 'Partition and row keys can\'t be NULL.'; const BATCH_ENTITY_DEL_MSG = 'The entity was deleted successfully.'; const INVALID_PROP_VAL_MSG = "'%s' property value must satisfy %s."; const INVALID_PARAM_MSG = "The provided variable '%s' should be of type '%s'"; const INVALID_STRING_LENGTH = "The provided variable '%s' should be of %s characters long"; const INVALID_BTE_MSG = "The blob block type must exist in %s"; const INVALID_BLOB_PAT_MSG = 'The provided access type is invalid.'; const INVALID_SVC_PROP_MSG = 'The provided service properties is invalid.'; const UNKNOWN_SRILZER_MSG = 'The provided serializer type is unknown'; const INVALID_CREATE_SERVICE_OPTIONS_MSG = 'Must provide valid location or affinity group.'; const INVALID_UPDATE_SERVICE_OPTIONS_MSG = 'Must provide either description or label.'; const INVALID_CONFIG_MSG = 'Config object must be of type Configuration'; const INVALID_ACH_MSG = 'The provided access condition header is invalid'; const INVALID_RECEIVE_MODE_MSG = 'The receive message option is in neither RECEIVE_AND_DELETE nor PEEK_LOCK mode.'; const INVALID_CONFIG_URI = "The provided URI '%s' is invalid. It has to pass the check 'filter_var(, FILTER_VALIDATE_URL)'."; const INVALID_CONFIG_VALUE = "The provided config value '%s' does not belong to the valid values subset:\n%s"; const INVALID_ACCOUNT_KEY_FORMAT = "The provided account key '%s' is not a valid base64 string. It has to pass the check 'base64_decode(, true)'."; const MISSING_CONNECTION_STRING_SETTINGS = "The provided connection string '%s' does not have complete configuration settings."; const INVALID_CONNECTION_STRING_SETTING_KEY = "The setting key '%s' is not found in the expected configuration setting keys:\n%s"; const INVALID_CERTIFICATE_PATH = "The provided certificate path '%s' is invalid."; const INSTANCE_TYPE_VALIDATION_MSG = 'The type of %s is %s but is expected to be %s.'; const MISSING_CONNECTION_STRING_CHAR = "Missing %s character"; const ERROR_PARSING_STRING = "'%s' at position %d."; const INVALID_CONNECTION_STRING = "Argument '%s' is not a valid connection string: '%s'"; const ERROR_CONNECTION_STRING_MISSING_KEY = 'Missing key name'; const ERROR_CONNECTION_STRING_EMPTY_KEY = 'Empty key name'; const ERROR_CONNECTION_STRING_MISSING_CHARACTER = "Missing %s character"; const ERROR_EMPTY_SETTINGS = 'No keys were found in the connection string'; const MISSING_LOCK_LOCATION_MSG = 'The lock location of the brokered message is missing.'; const INVALID_SLOT = "The provided deployment slot '%s' is not valid. Only 'staging' and 'production' are accepted."; const INVALID_DEPLOYMENT_LOCATOR_MSG = 'A slot or deployment name must be provided.'; const INVALID_CHANGE_MODE_MSG = "The change mode must be 'Auto' or 'Manual'. Use Mode class constants for that purpose."; const INVALID_DEPLOYMENT_STATUS_MSG = "The change mode must be 'Running' or 'Suspended'. Use DeploymentStatus class constants for that purpose."; const ERROR_OAUTH_GET_ACCESS_TOKEN = 'Unable to get oauth access token for endpoint \'%s\', account name \'%s\''; const ERROR_OAUTH_SERVICE_MISSING = 'OAuth service missing for account name \'%s\''; const ERROR_METHOD_NOT_FOUND = 'Method \'%s\' not found in object class \'%s\''; const ERROR_INVALID_DATE_STRING = 'Parameter \'%s\' is not a date formatted string \'%s\''; // HTTP Headers const X_MS_HEADER_PREFIX = 'x-ms-'; const X_MS_META_HEADER_PREFIX = 'x-ms-meta-'; const X_MS_APPROXIMATE_MESSAGES_COUNT = 'x-ms-approximate-messages-count'; const X_MS_POPRECEIPT = 'x-ms-popreceipt'; const X_MS_TIME_NEXT_VISIBLE = 'x-ms-time-next-visible'; const X_MS_BLOB_PUBLIC_ACCESS = 'x-ms-blob-public-access'; const X_MS_VERSION = 'x-ms-version'; const X_MS_DATE = 'x-ms-date'; const X_MS_BLOB_SEQUENCE_NUMBER = 'x-ms-blob-sequence-number'; const X_MS_BLOB_SEQUENCE_NUMBER_ACTION = 'x-ms-sequence-number-action'; const X_MS_BLOB_TYPE = 'x-ms-blob-type'; const X_MS_BLOB_CONTENT_TYPE = 'x-ms-blob-content-type'; const X_MS_BLOB_CONTENT_ENCODING = 'x-ms-blob-content-encoding'; const X_MS_BLOB_CONTENT_LANGUAGE = 'x-ms-blob-content-language'; const X_MS_BLOB_CONTENT_MD5 = 'x-ms-blob-content-md5'; const X_MS_BLOB_CACHE_CONTROL = 'x-ms-blob-cache-control'; const X_MS_BLOB_CONTENT_LENGTH = 'x-ms-blob-content-length'; const X_MS_COPY_SOURCE = 'x-ms-copy-source'; const X_MS_RANGE = 'x-ms-range'; const X_MS_RANGE_GET_CONTENT_MD5 = 'x-ms-range-get-content-md5'; const X_MS_LEASE_DURATION = 'x-ms-lease-duration'; const X_MS_LEASE_ID = 'x-ms-lease-id'; const X_MS_LEASE_TIME = 'x-ms-lease-time'; const X_MS_LEASE_STATUS = 'x-ms-lease-status'; const X_MS_LEASE_ACTION = 'x-ms-lease-action'; const X_MS_DELETE_SNAPSHOTS = 'x-ms-delete-snapshots'; const X_MS_PAGE_WRITE = 'x-ms-page-write'; const X_MS_SNAPSHOT = 'x-ms-snapshot'; const X_MS_SOURCE_IF_MODIFIED_SINCE = 'x-ms-source-if-modified-since'; const X_MS_SOURCE_IF_UNMODIFIED_SINCE = 'x-ms-source-if-unmodified-since'; const X_MS_SOURCE_IF_MATCH = 'x-ms-source-if-match'; const X_MS_SOURCE_IF_NONE_MATCH = 'x-ms-source-if-none-match'; const X_MS_SOURCE_LEASE_ID = 'x-ms-source-lease-id'; const X_MS_CONTINUATION_NEXTTABLENAME = 'x-ms-continuation-nexttablename'; const X_MS_CONTINUATION_NEXTPARTITIONKEY = 'x-ms-continuation-nextpartitionkey'; const X_MS_CONTINUATION_NEXTROWKEY = 'x-ms-continuation-nextrowkey'; const X_MS_REQUEST_ID = 'x-ms-request-id'; const ETAG = 'etag'; const LAST_MODIFIED = 'last-modified'; const DATE = 'date'; const AUTHENTICATION = 'authorization'; const WRAP_AUTHORIZATION = 'WRAP access_token="%s"'; const CONTENT_ENCODING = 'content-encoding'; const CONTENT_LANGUAGE = 'content-language'; const CONTENT_LENGTH = 'content-length'; const CONTENT_LENGTH_NO_SPACE = 'contentlength'; const CONTENT_MD5 = 'content-md5'; const CONTENT_TYPE = 'content-type'; const CONTENT_ID = 'content-id'; const CONTENT_RANGE = 'content-range'; const CACHE_CONTROL = 'cache-control'; const IF_MODIFIED_SINCE = 'if-modified-since'; const IF_MATCH = 'if-match'; const IF_NONE_MATCH = 'if-none-match'; const IF_UNMODIFIED_SINCE = 'if-unmodified-since'; const RANGE = 'range'; const DATA_SERVICE_VERSION = 'dataserviceversion'; const MAX_DATA_SERVICE_VERSION = 'maxdataserviceversion'; const ACCEPT_HEADER = 'accept'; const ACCEPT_CHARSET = 'accept-charset'; const USER_AGENT = 'User-Agent'; // Type const QUEUE_TYPE_NAME = 'IQueue'; const BLOB_TYPE_NAME = 'IBlob'; const TABLE_TYPE_NAME = 'ITable'; const SERVICE_MANAGEMENT_TYPE_NAME = 'IServiceManagement'; const SERVICE_BUS_TYPE_NAME = 'IServiceBus'; const WRAP_TYPE_NAME = 'IWrap'; // WRAP const WRAP_ACCESS_TOKEN = 'wrap_access_token'; const WRAP_ACCESS_TOKEN_EXPIRES_IN = 'wrap_access_token_expires_in'; const WRAP_NAME = 'wrap_name'; const WRAP_PASSWORD = 'wrap_password'; const WRAP_SCOPE = 'wrap_scope'; // OAuth const OAUTH_GRANT_TYPE = 'grant_type'; const OAUTH_CLIENT_ID = 'client_id'; const OAUTH_CLIENT_SECRET = 'client_secret'; const OAUTH_SCOPE = 'scope'; const OAUTH_GT_CLIENT_CREDENTIALS = 'client_credentials'; const OAUTH_ACCESS_TOKEN = 'access_token'; const OAUTH_EXPIRES_IN = 'expires_in'; const OAUTH_ACCESS_TOKEN_PREFIX = 'Bearer '; // HTTP Methods const HTTP_GET = 'GET'; const HTTP_PUT = 'PUT'; const HTTP_POST = 'POST'; const HTTP_HEAD = 'HEAD'; const HTTP_DELETE = 'DELETE'; const HTTP_MERGE = 'MERGE'; // Misc const EMPTY_STRING = ''; const SEPARATOR = ','; const AZURE_DATE_FORMAT = 'D, d M Y H:i:s T'; const TIMESTAMP_FORMAT = 'Y-m-d H:i:s'; const EMULATED = 'EMULATED'; const EMULATOR_BLOB_URI = '127.0.0.1:10000'; const EMULATOR_QUEUE_URI = '127.0.0.1:10001'; const EMULATOR_TABLE_URI = '127.0.0.1:10002'; const ASTERISK = '*'; const SERVICE_MANAGEMENT_URL = 'https://management.core.windows.net'; const HTTP_SCHEME = 'http'; const HTTPS_SCHEME = 'https'; const SETTING_NAME = 'SettingName'; const SETTING_CONSTRAINT = 'SettingConstraint'; const DEV_STORE_URI = 'http://127.0.0.1'; const SERVICE_URI_FORMAT = "%s://%s.%s"; const WRAP_ENDPOINT_URI_FORMAT = "https://%s-sb.accesscontrol.windows.net/WRAPv0.9"; // Xml Namespaces const WA_XML_NAMESPACE = 'http://schemas.microsoft.com/windowsazure'; const ATOM_XML_NAMESPACE = 'http://www.w3.org/2005/Atom'; const DS_XML_NAMESPACE = 'http://schemas.microsoft.com/ado/2007/08/dataservices'; const DSM_XML_NAMESPACE = 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'; const XSI_XML_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance'; // Header values const SDK_USER_AGENT = 'Azure-SDK-For-PHP/0.4.1'; const STORAGE_API_LATEST_VERSION = '2014-02-14'; // was 2012-02-12; see HS#7569 const SM_API_LATEST_VERSION = '2011-10-01'; const DATA_SERVICE_VERSION_VALUE = '1.0;NetFx'; const MAX_DATA_SERVICE_VERSION_VALUE = '2.0;NetFx'; const ACCEPT_HEADER_VALUE = 'application/atom+xml,application/xml'; const ATOM_ENTRY_CONTENT_TYPE = 'application/atom+xml;type=entry;charset=utf-8'; const ATOM_FEED_CONTENT_TYPE = 'application/atom+xml;type=feed;charset=utf-8'; const ACCEPT_CHARSET_VALUE = 'utf-8'; const INT32_MAX = 2147483647; const MEDIA_SERVICES_API_LATEST_VERSION = '2.2'; const MEDIA_SERVICES_DATA_SERVICE_VERSION_VALUE = '3.0;NetFx'; const MEDIA_SERVICES_MAX_DATA_SERVICE_VERSION_VALUE = '3.0;NetFx'; // Query parameter names const QP_PREFIX = 'Prefix'; const QP_MAX_RESULTS = 'MaxResults'; const QP_METADATA = 'Metadata'; const QP_MARKER = 'Marker'; const QP_NEXT_MARKER = 'NextMarker'; const QP_COMP = 'comp'; const QP_VISIBILITY_TIMEOUT = 'visibilitytimeout'; const QP_POPRECEIPT = 'popreceipt'; const QP_NUM_OF_MESSAGES = 'numofmessages'; const QP_PEEK_ONLY = 'peekonly'; const QP_MESSAGE_TTL = 'messagettl'; const QP_INCLUDE = 'include'; const QP_TIMEOUT = 'timeout'; const QP_DELIMITER = 'Delimiter'; const QP_REST_TYPE = 'restype'; const QP_SNAPSHOT = 'snapshot'; const QP_BLOCKID = 'blockid'; const QP_BLOCK_LIST_TYPE = 'blocklisttype'; const QP_SELECT = '$select'; const QP_TOP = '$top'; const QP_SKIP = '$skip'; const QP_FILTER = '$filter'; const QP_NEXT_TABLE_NAME = 'NextTableName'; const QP_NEXT_PK = 'NextPartitionKey'; const QP_NEXT_RK = 'NextRowKey'; const QP_ACTION = 'action'; const QP_EMBED_DETAIL = 'embed-detail'; // Query parameter values const QPV_REGENERATE = 'regenerate'; const QPV_CONFIG = 'config'; const QPV_STATUS = 'status'; const QPV_UPGRADE = 'upgrade'; const QPV_WALK_UPGRADE_DOMAIN = 'walkupgradedomain'; const QPV_REBOOT = 'reboot'; const QPV_REIMAGE = 'reimage'; const QPV_ROLLBACK = 'rollback'; // Request body content types const URL_ENCODED_CONTENT_TYPE = 'application/x-www-form-urlencoded'; const XML_CONTENT_TYPE = 'application/xml'; const BINARY_FILE_TYPE = 'application/octet-stream'; const XML_ATOM_CONTENT_TYPE = 'application/atom+xml'; const HTTP_TYPE = 'application/http'; const MULTIPART_MIXED_TYPE = 'multipart/mixed'; // Common used XML tags const XTAG_ATTRIBUTES = '@attributes'; const XTAG_NAMESPACE = '@namespace'; const XTAG_LABEL = 'Label'; const XTAG_NAME = 'Name'; const XTAG_DESCRIPTION = 'Description'; const XTAG_LOCATION = 'Location'; const XTAG_AFFINITY_GROUP = 'AffinityGroup'; const XTAG_HOSTED_SERVICES = 'HostedServices'; const XTAG_STORAGE_SERVICES = 'StorageServices'; const XTAG_STORAGE_SERVICE = 'StorageService'; const XTAG_DISPLAY_NAME = 'DisplayName'; const XTAG_SERVICE_NAME = 'ServiceName'; const XTAG_URL = 'Url'; const XTAG_ID = 'ID'; const XTAG_STATUS = 'Status'; const XTAG_HTTP_STATUS_CODE = 'HttpStatusCode'; const XTAG_CODE = 'Code'; const XTAG_MESSAGE = 'Message'; const XTAG_STORAGE_SERVICE_PROPERTIES = 'StorageServiceProperties'; const XTAG_ENDPOINT = 'Endpoint'; const XTAG_ENDPOINTS = 'Endpoints'; const XTAG_PRIMARY = 'Primary'; const XTAG_SECONDARY = 'Secondary'; const XTAG_KEY_TYPE = 'KeyType'; const XTAG_STORAGE_SERVICE_KEYS = 'StorageServiceKeys'; const XTAG_ERROR = 'Error'; const XTAG_HOSTED_SERVICE = 'HostedService'; const XTAG_HOSTED_SERVICE_PROPERTIES = 'HostedServiceProperties'; const XTAG_CREATE_HOSTED_SERVICE = 'CreateHostedService'; const XTAG_CREATE_STORAGE_SERVICE_INPUT = 'CreateStorageServiceInput'; const XTAG_UPDATE_STORAGE_SERVICE_INPUT = 'UpdateStorageServiceInput'; const XTAG_CREATE_AFFINITY_GROUP = 'CreateAffinityGroup'; const XTAG_UPDATE_AFFINITY_GROUP = 'UpdateAffinityGroup'; const XTAG_UPDATE_HOSTED_SERVICE = 'UpdateHostedService'; const XTAG_PACKAGE_URL = 'PackageUrl'; const XTAG_CONFIGURATION = 'Configuration'; const XTAG_START_DEPLOYMENT = 'StartDeployment'; const XTAG_TREAT_WARNINGS_AS_ERROR = 'TreatWarningsAsError'; const XTAG_CREATE_DEPLOYMENT = 'CreateDeployment'; const XTAG_DEPLOYMENT_SLOT = 'DeploymentSlot'; const XTAG_PRIVATE_ID = 'PrivateID'; const XTAG_ROLE_INSTANCE_LIST = 'RoleInstanceList'; const XTAG_UPGRADE_DOMAIN_COUNT = 'UpgradeDomainCount'; const XTAG_ROLE_LIST = 'RoleList'; const XTAG_SDK_VERSION = 'SdkVersion'; const XTAG_INPUT_ENDPOINT_LIST = 'InputEndpointList'; const XTAG_LOCKED = 'Locked'; const XTAG_ROLLBACK_ALLOWED = 'RollbackAllowed'; const XTAG_UPGRADE_STATUS = 'UpgradeStatus'; const XTAG_UPGRADE_TYPE = 'UpgradeType'; const XTAG_CURRENT_UPGRADE_DOMAIN_STATE = 'CurrentUpgradeDomainState'; const XTAG_CURRENT_UPGRADE_DOMAIN = 'CurrentUpgradeDomain'; const XTAG_ROLE_NAME = 'RoleName'; const XTAG_INSTANCE_NAME = 'InstanceName'; const XTAG_INSTANCE_STATUS = 'InstanceStatus'; const XTAG_INSTANCE_UPGRADE_DOMAIN = 'InstanceUpgradeDomain'; const XTAG_INSTANCE_FAULT_DOMAIN = 'InstanceFaultDomain'; const XTAG_INSTANCE_SIZE = 'InstanceSize'; const XTAG_INSTANCE_STATE_DETAILS = 'InstanceStateDetails'; const XTAG_INSTANCE_ERROR_CODE = 'InstanceErrorCode'; const XTAG_OS_VERSION = 'OsVersion'; const XTAG_ROLE_INSTANCE = 'RoleInstance'; const XTAG_ROLE = 'Role'; const XTAG_INPUT_ENDPOINT = 'InputEndpoint'; const XTAG_VIP = 'Vip'; const XTAG_PORT = 'Port'; const XTAG_DEPLOYMENT = 'Deployment'; const XTAG_DEPLOYMENTS = 'Deployments'; const XTAG_REGENERATE_KEYS = 'RegenerateKeys'; const XTAG_SWAP = 'Swap'; const XTAG_PRODUCTION = 'Production'; const XTAG_SOURCE_DEPLOYMENT = 'SourceDeployment'; const XTAG_CHANGE_CONFIGURATION = 'ChangeConfiguration'; const XTAG_MODE = 'Mode'; const XTAG_UPDATE_DEPLOYMENT_STATUS = 'UpdateDeploymentStatus'; const XTAG_ROLE_TO_UPGRADE = 'RoleToUpgrade'; const XTAG_FORCE = 'Force'; const XTAG_UPGRADE_DEPLOYMENT = 'UpgradeDeployment'; const XTAG_UPGRADE_DOMAIN = 'UpgradeDomain'; const XTAG_WALK_UPGRADE_DOMAIN = 'WalkUpgradeDomain'; const XTAG_ROLLBACK_UPDATE_OR_UPGRADE = 'RollbackUpdateOrUpgrade'; const XTAG_CONTAINER_NAME = 'ContainerName'; const XTAG_ACCOUNT_NAME = 'AccountName'; // Service Bus const LIST_TOPICS_PATH = '$Resources/Topics'; const LIST_QUEUES_PATH = '$Resources/Queues'; const LIST_RULES_PATH = '%s/subscriptions/%s/rules'; const LIST_SUBSCRIPTIONS_PATH = '%s/subscriptions'; const RECEIVE_MESSAGE_PATH = '%s/messages/head'; const RECEIVE_SUBSCRIPTION_MESSAGE_PATH = '%s/subscriptions/%s/messages/head'; const SEND_MESSAGE_PATH = '%s/messages'; const RULE_PATH = '%s/subscriptions/%s/rules/%s'; const SUBSCRIPTION_PATH = '%s/subscriptions/%s'; const DEFAULT_RULE_NAME = '$Default'; const UNIQUE_ID_PREFIX = 'urn:uuid:'; const SERVICE_BUS_NAMESPACE = 'http://schemas.microsoft.com/netservices/2010/10/servicebus/connect'; const BROKER_PROPERTIES = 'BrokerProperties'; const XMLNS_ATOM = 'xmlns:atom'; const XMLNS = 'xmlns'; const ATOM_NAMESPACE = 'http://www.w3.org/2005/Atom'; // ATOM string const AUTHOR = 'author'; const CATEGORY = 'category'; const CONTRIBUTOR = 'contributor'; const ENTRY = 'entry'; const LINK = 'link'; const PROPERTIES = 'properties'; const ELEMENT = 'element'; // PHP URL Keys const PHP_URL_SCHEME = 'scheme'; const PHP_URL_HOST = 'host'; const PHP_URL_PORT = 'port'; const PHP_URL_USER = 'user'; const PHP_URL_PASS = 'pass'; const PHP_URL_PATH = 'path'; const PHP_URL_QUERY = 'query'; const PHP_URL_FRAGMENT = 'fragment'; // Status Codes const STATUS_OK = 200; const STATUS_CREATED = 201; const STATUS_ACCEPTED = 202; const STATUS_NO_CONTENT = 204; const STATUS_PARTIAL_CONTENT = 206; const STATUS_MOVED_PERMANENTLY = 301; // HTTP_Request2 config parameter names const USE_BRACKETS = 'use_brackets'; const SSL_VERIFY_PEER = 'ssl_verify_peer'; const SSL_VERIFY_HOST = 'ssl_verify_host'; const SSL_LOCAL_CERT = 'ssl_local_cert'; const SSL_CAFILE = 'ssl_cafile'; const CONNECT_TIMEOUT = 'connect_timeout'; // Media services const MEDIA_SERVICES_URL = 'https://media.windows.net/API/'; const MEDIA_SERVICES_OAUTH_URL = 'https://wamsprodglobal001acs.accesscontrol.windows.net/v2/OAuth2-13'; const MEDIA_SERVICES_OAUTH_SCOPE = 'urn:WindowsAzureMediaServices'; const MEDIA_SERVICES_INPUT_ASSETS_REL = 'http://schemas.microsoft.com/ado/2007/08/dataservices/related/InputMediaAssets'; const MEDIA_SERVICES_ASSET_REL = 'http://schemas.microsoft.com/ado/2007/08/dataservices/related/Asset'; const MEDIA_SERVICES_ENCRYPTION_VERSION = '1.0'; // @codingStandardsIgnoreEnd } PKwL\0 QQ?updraftplus/includes/WindowsAzure/Common/Internal/Utilities.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; /** * Utilities for the project * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Utilities { /** * Returns the specified value of the $key passed from $array and in case that * this $key doesn't exist, the default value is returned. * * @param array $array The array to be used. * @param mix $key The array key. * @param mix $default The value to return if $key is not found in $array. * * @static * * @return mix */ public static function tryGetValue($array, $key, $default = null) { return is_array($array) && array_key_exists($key, $array) ? $array[$key] : $default; } /** * Adds a url scheme if there is no scheme. * * @param string $url The URL. * @param string $scheme The scheme. By default HTTP * * @static * * @return string */ public static function tryAddUrlScheme($url, $scheme = 'http') { $urlScheme = parse_url($url, PHP_URL_SCHEME); if (empty($urlScheme)) { $url = "$scheme://" . $url; } return $url; } /** * tries to get nested array with index name $key from $array. * * Returns empty array object if the value is NULL. * * @param string $key The index name. * @param array $array The array object. * * @static * * @return array */ public static function tryGetArray($key, $array) { return Utilities::getArray(Utilities::tryGetValue($array, $key)); } /** * Adds the given key/value pair into array if the value doesn't satisfy empty(). * * This function just validates that the given $array is actually array. If it's * NULL the function treats it as array. * * @param string $key The key. * @param string $value The value. * @param array &$array The array. If NULL will be used as array. * * @static * * @return none */ public static function addIfNotEmpty($key, $value, &$array) { if (!is_null($array)) { Validate::isArray($array, 'array'); } if (!empty($value)) { $array[$key] = $value; } } /** * Returns the specified value of the key chain passed from $array and in case * that key chain doesn't exist, null is returned. * * @param array $array Array to be used. * * @static * * @return mix */ public static function tryGetKeysChainValue($array) { $arguments = func_get_args(); $numArguments = func_num_args(); $currentArray = $array; for ($i = 1; $i < $numArguments; $i++) { if (is_array($currentArray)) { if (array_key_exists($arguments[$i], $currentArray)) { $currentArray = $currentArray[$arguments[$i]]; } else { return null; } } else { return null; } } return $currentArray; } /** * Checks if the passed $string starts with $prefix * * @param string $string word to seaech in * @param string $prefix prefix to be matched * @param boolean $ignoreCase true to ignore case during the comparison; * otherwise, false * * @static * * @return boolean */ public static function startsWith($string, $prefix, $ignoreCase = false) { if ($ignoreCase) { $string = strtolower($string); $prefix = strtolower($prefix); } return ($prefix == substr($string, 0, strlen($prefix))); } /** * Returns grouped items from passed $var * * @param array $var item to group * * @static * * @return array */ public static function getArray($var) { if (is_null($var) || empty($var)) { return array(); } foreach ($var as $value) { if ((gettype($value) == 'object') && (get_class($value) == 'SimpleXMLElement') ) { return (array) $var; } else if (!is_array($value)) { return array($var); } } return $var; } /** * Unserializes the passed $xml into array. * * @param string $xml XML to be parsed. * * @static * * @return array */ public static function unserialize($xml) { $sxml = new \SimpleXMLElement($xml); return self::_sxml2arr($sxml); } /** * Converts a SimpleXML object to an Array recursively * ensuring all sub-elements are arrays as well. * * @param string $sxml SimpleXML object * @param array $arr Array into which to store results * * @static * * @return array */ private static function _sxml2arr($sxml, $arr = null) { foreach ((array) $sxml as $key => $value) { if (is_object($value) || (is_array($value))) { $arr[$key] = self::_sxml2arr($value); } else { $arr[$key] = $value; } } return $arr; } /** * Serializes given array into xml. The array indices must be string to use * them as XML tags. * * @param array $array object to serialize represented in array. * @param string $rootName name of the XML root element. * @param string $defaultTag default tag for non-tagged elements. * @param string $standalone adds 'standalone' header tag, values 'yes'/'no' * * @static * * @return string */ public static function serialize($array, $rootName, $defaultTag = null, $standalone = null ) { $xmlVersion = '1.0'; $xmlEncoding = 'UTF-8'; if (!is_array($array)) { return false; } $xmlw = new \XmlWriter(); $xmlw->openMemory(); $xmlw->startDocument($xmlVersion, $xmlEncoding, $standalone); $xmlw->startElement($rootName); self::_arr2xml($xmlw, $array, $defaultTag); $xmlw->endElement(); return $xmlw->outputMemory(true); } /** * Takes an array and produces XML based on it. * * @param XMLWriter $xmlw XMLWriter object that was previously instanted * and is used for creating the XML. * @param array $data Array to be converted to XML * @param string $defaultTag Default XML tag to be used if none specified. * * @static * * @return void */ private static function _arr2xml(\XMLWriter $xmlw, $data, $defaultTag = null) { foreach ($data as $key => $value) { if (strcmp($key, '@attributes') == 0) { foreach ($value as $attributeName => $attributeValue) { $xmlw->writeAttribute($attributeName, $attributeValue); } } else if (is_array($value)) { if (!is_int($key)) { if ($key != Resources::EMPTY_STRING) { $xmlw->startElement($key); } else { $xmlw->startElement($defaultTag); } } self::_arr2xml($xmlw, $value); if (!is_int($key)) { $xmlw->endElement(); } continue; } else { $xmlw->writeElement($key, $value); } } } /** * Converts string into boolean value. * * @param string $obj boolean value in string format. * * @static * * @return bool */ public static function toBoolean($obj) { return filter_var($obj, FILTER_VALIDATE_BOOLEAN); } /** * Converts string into boolean value. * * @param bool $obj boolean value to convert. * * @static * * @return string */ public static function booleanToString($obj) { return $obj ? 'true' : 'false'; } /** * Converts a given date string into \DateTime object * * @param string $date windows azure date ins string represntation. * * @static * * @return \DateTime */ public static function rfc1123ToDateTime($date) { $timeZone = new \DateTimeZone('GMT'); $format = Resources::AZURE_DATE_FORMAT; return \DateTime::createFromFormat($format, $date, $timeZone); } /** * Generate ISO 8601 compliant date string in UTC time zone * * @param int $timestamp The unix timestamp to convert * (for DateTime check date_timestamp_get). * * @static * * @return string */ public static function isoDate($timestamp = null) { $tz = date_default_timezone_get(); date_default_timezone_set('UTC'); if (is_null($timestamp)) { $timestamp = time(); } $returnValue = str_replace( '+00:00', '.0000000Z', date('c', $timestamp) ); date_default_timezone_set($tz); return $returnValue; } /** * Converts a DateTime object into an Edm.DaeTime value in UTC timezone, * represented as a string. * * @param \DateTime $value The datetime value. * * @static * * @return string */ public static function convertToEdmDateTime($value) { if (empty($value)) { return $value; } if (is_string($value)) { $value = self::convertToDateTime($value); } Validate::isDate($value); $cloned = clone $value; $cloned->setTimezone(new \DateTimeZone('UTC')); return str_replace('+0000', 'Z', $cloned->format(\DateTime::ISO8601)); } /** * Converts a string to a \DateTime object. Returns false on failure. * * @param string $value The string value to parse. * * @static * * @return \DateTime */ public static function convertToDateTime($value) { if ($value instanceof \DateTime) { return $value; } if (substr($value, -1) == 'Z') { $value = substr($value, 0, strlen($value) - 1); } return new \DateTime($value, new \DateTimeZone('UTC')); } /** * Converts string to stream handle. * * @param type $string The string contents. * * @static * * @return resource */ public static function stringToStream($string) { return fopen('data://text/plain,' . urlencode($string), 'rb'); } /** * Sorts an array based on given keys order. * * @param array $array The array to sort. * @param array $order The keys order array. * * @return array */ public static function orderArray($array, $order) { $ordered = array(); foreach ($order as $key) { if (array_key_exists($key, $array)) { $ordered[$key] = $array[$key]; } } return $ordered; } /** * Checks if a value exists in an array. The comparison is done in a case * insensitive manner. * * @param string $needle The searched value. * @param array $haystack The array. * * @static * * @return boolean */ public static function inArrayInsensitive($needle, $haystack) { return in_array(strtolower($needle), array_map('strtolower', $haystack)); } /** * Checks if the given key exists in the array. The comparison is done in a case * insensitive manner. * * @param string $key The value to check. * @param array $search The array with keys to check. * * @static * * @return boolean */ public static function arrayKeyExistsInsensitive($key, $search) { return array_key_exists(strtolower($key), array_change_key_case($search)); } /** * Returns the specified value of the $key passed from $array and in case that * this $key doesn't exist, the default value is returned. The key matching is * done in a case insensitive manner. * * @param string $key The array key. * @param array $haystack The array to be used. * @param mix $default The value to return if $key is not found in $array. * * @static * * @return mix */ public static function tryGetValueInsensitive($key, $haystack, $default = null) { $array = array_change_key_case($haystack); return Utilities::tryGetValue($array, strtolower($key), $default); } /** * Returns a string representation of a version 4 GUID, which uses random * numbers.There are 6 reserved bits, and the GUIDs have this format: * xxxxxxxx-xxxx-4xxx-[8|9|a|b]xxx-xxxxxxxxxxxx * where 'x' is a hexadecimal digit, 0-9a-f. * * See http://tools.ietf.org/html/rfc4122 for more information. * * Note: This function is available on all platforms, while the * com_create_guid() is only available for Windows. * * @static * * @return string A new GUID. */ public static function getGuid() { // @codingStandardsIgnoreStart return sprintf( '%04x%04x-%04x-%04x-%02x%02x-%04x%04x%04x', mt_rand(0, 65535), mt_rand(0, 65535), // 32 bits for "time_low" mt_rand(0, 65535), // 16 bits for "time_mid" mt_rand(0, 4096) + 16384, // 16 bits for "time_hi_and_version", with // the most significant 4 bits being 0100 // to indicate randomly generated version mt_rand(0, 64) + 128, // 8 bits for "clock_seq_hi", with // the most significant 2 bits being 10, // required by version 4 GUIDs. mt_rand(0, 256), // 8 bits for "clock_seq_low" mt_rand(0, 65535), // 16 bits for "node 0" and "node 1" mt_rand(0, 65535), // 16 bits for "node 2" and "node 3" mt_rand(0, 65535) // 16 bits for "node 4" and "node 5" ); // @codingStandardsIgnoreEnd } /** * Creates a list of objects of type $class from the provided array using static * create method. * * @param array $parsed The object in array representation * @param string $class The class name. Must have static method create. * * @static * * @return array */ public static function createInstanceList($parsed, $class) { $list = array(); foreach ($parsed as $value) { // We don't use this SDK on PHP 5.2 // @codingStandardsIgnoreLine $list[] = $class::create($value); } return $list; } /** * Takes a string and return if it ends with the specified character/string. * * @param string $haystack The string to search in. * @param string $needle postfix to match. * @param boolean $ignoreCase Set true to ignore case during the comparison; * otherwise, false * * @static * * @return boolean */ public static function endsWith($haystack, $needle, $ignoreCase = false) { if ($ignoreCase) { $haystack = strtolower($haystack); $needle = strtolower($needle); } $length = strlen($needle); if ($length == 0) { return true; } return (substr($haystack, -$length) === $needle); } /** * Get id from entity object or string. * If entity is object than validate type and return $entity->$method() * If entity is string than return this string * * @param object|string $entity Entity with id property * @param string $type Entity type to validate * @param string $method Methods that gets id (getId by default) * * @return string */ public static function getEntityId($entity, $type, $method = 'getId') { if (is_string($entity)) { return $entity; } else { Validate::isA($entity, $type, 'entity'); Validate::methodExists($entity, $method, $type); return $entity->$method(); } } /** * Generate a pseudo-random string of bytes using a cryptographically strong * algorithm. * * @param int $length Length of the string in bytes * * @return string|boolean Generated string of bytes on success, or FALSE on * failure. */ public static function generateCryptoKey($length) { return openssl_random_pseudo_bytes($length); } /** * Encrypts $data with CTR encryption * * @param string $data Data to be encrypted * @param string $key AES Encryption key * @param string $initializationVector Initialization vector * * We ignore it for standards purposes because the function is apparently nowhere called * @codingStandardsIgnoreStart * * @return string Encrypted data */ public static function ctrCrypt($data, $key, $initializationVector) { error_log("WindowsAzure\Common\Internal\Utilities::ctrCrypt called - code path thought to be impossible; linting needs re-enabling"); Validate::isString($data, 'data'); Validate::isString($key, 'key'); Validate::isString($initializationVector, 'initializationVector'); Validate::isTrue( (strlen($key) == 16 || strlen($key) == 24 || strlen($key) == 32), sprintf(Resources::INVALID_STRING_LENGTH, 'key', '16, 24, 32') ); Validate::isTrue( (strlen($initializationVector) == 16), sprintf(Resources::INVALID_STRING_LENGTH, 'initializationVector', '16') ); $blockCount = ceil(strlen($data) / 16); $ctrData = ''; for ($i = 0; $i < $blockCount; ++$i) { $ctrData .= $initializationVector; // increment Initialization Vector $j = 15; do { $digit = ord($initializationVector[$j]) + 1; $initializationVector[$j] = chr($digit & 0xFF); $j--; } while (($digit == 0x100) && ($j >= 0)); } $encryptCtrData = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $key, $ctrData, MCRYPT_MODE_ECB ); return $data ^ $encryptCtrData; } /** * Convert base 256 number to decimal number. * * @codingStandardsIgnoreEnd * * @param string $number Base 256 number * * @return string Decimal number */ public static function base256ToDec($number) { Validate::isString($number, 'number'); $result = 0; $base = 1; for ($i = strlen($number) - 1; $i >= 0; $i--) { $result = bcadd($result, bcmul(ord($number[$i]), $base)); $base = bcmul($base, 256); } return $result; } } PKwL\hRupdraftplus/includes/WindowsAzure/Common/Internal/InvalidArgumentTypeException.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; /** * Exception thrown if an argument type does not match with the expected type. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class InvalidArgumentTypeException extends \InvalidArgumentException { /** * Constructor. * * @param string $validType The valid type that should be provided by the user. * @param string $name The parameter name. * * @return WindowsAzure\Common\Internal\InvalidArgumentTypeException */ public function __construct($validType, $name = null) { parent::__construct( sprintf(Resources::INVALID_PARAM_MSG, $name, $validType) ); } } PKwL\Dupdraftplus/includes/WindowsAzure/Common/Internal/IServiceFilter.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; /** * ServceFilter is called when the sending the request and after receiving the * response. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ interface IServiceFilter { /** * Processes HTTP request before send. * * @param mix $request HTTP request object. * * @return mix processed HTTP request object. */ public function handleRequest($request); /** * Processes HTTP response after send. * * @param mix $request HTTP request object. * @param mix $response HTTP response object. * * @return mix processed HTTP response object. */ public function handleResponse($request, $response); } PKwL\o ))Fupdraftplus/includes/WindowsAzure/Common/Internal/ServiceRestProxy.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\RestProxy; use WindowsAzure\Common\Internal\Http\Url; use WindowsAzure\Common\Internal\Http\HttpCallContext; /** * Base class for all services rest proxies. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ServiceRestProxy extends RestProxy { /** * @var string */ private $_accountName; /** * Initializes new ServiceRestProxy object. * * @param IHttpClient $channel The HTTP client used to send HTTP requests. * @param string $uri The storage account uri. * @param string $accountName The name of the account. * @param ISerializer $dataSerializer The data serializer. */ public function __construct($channel, $uri, $accountName, $dataSerializer) { parent::__construct($channel, $dataSerializer, $uri); $this->_accountName = $accountName; } /** * Gets the account name. * * @return string */ public function getAccountName() { return $this->_accountName; } /** * Sends HTTP request with the specified HTTP call context. * * @param WindowsAzure\Common\Internal\Http\HttpCallContext $context The HTTP * call context. * * @return \HTTP_Request2_Response */ protected function sendContext($context) { $context->setUri($this->getUri()); return parent::sendContext($context); } /** * Sends HTTP request with the specified parameters. * * @param string $method HTTP method used in the request * @param array $headers HTTP headers. * @param array $queryParams URL query parameters. * @param array $postParameters The HTTP POST parameters. * @param string $path URL path * @param int $statusCode Expected status code received in the response * @param string $body Request body * * @return \HTTP_Request2_Response */ protected function send( $method, $headers, $queryParams, $postParameters, $path, $statusCode, $body = Resources::EMPTY_STRING ) { $context = new HttpCallContext(); $context->setBody($body); $context->setHeaders($headers); $context->setMethod($method); $context->setPath($path); $context->setQueryParameters($queryParams); $context->setPostParameters($postParameters); if (is_array($statusCode)) { $context->setStatusCodes($statusCode); } else { $context->addStatusCode($statusCode); } return $this->sendContext($context); } /** * Adds optional header to headers if set * * @param array $headers The array of request headers. * @param AccessCondition $accessCondition The access condition object. * * @return array */ public function addOptionalAccessConditionHeader($headers, $accessCondition) { if (!is_null($accessCondition)) { $header = $accessCondition->getHeader(); if ($header != Resources::EMPTY_STRING) { $value = $accessCondition->getValue(); if ($value instanceof \DateTime) { $value = gmdate( Resources::AZURE_DATE_FORMAT, $value->getTimestamp() ); } $headers[$header] = $value; } } return $headers; } /** * Adds optional header to headers if set * * @param array $headers The array of request headers. * @param AccessCondition $accessCondition The access condition object. * * @return array */ public function addOptionalSourceAccessConditionHeader( $headers, $accessCondition ) { if (!is_null($accessCondition)) { $header = $accessCondition->getHeader(); $headerName = null; if (!empty($header)) { switch($header) { case Resources::IF_MATCH: $headerName = Resources::X_MS_SOURCE_IF_MATCH; break; case Resources::IF_UNMODIFIED_SINCE: $headerName = Resources::X_MS_SOURCE_IF_UNMODIFIED_SINCE; break; case Resources::IF_MODIFIED_SINCE: $headerName = Resources::X_MS_SOURCE_IF_MODIFIED_SINCE; break; case Resources::IF_NONE_MATCH: $headerName = Resources::X_MS_SOURCE_IF_NONE_MATCH; break; default: throw new \Exception(Resources::INVALID_ACH_MSG); break; } } $value = $accessCondition->getValue(); if ($value instanceof \DateTime) { $value = gmdate( Resources::AZURE_DATE_FORMAT, $value->getTimestamp() ); } $this->addOptionalHeader($headers, $headerName, $value); } return $headers; } /** * Adds HTTP POST parameter to the specified * * @param array $postParameters An array of HTTP POST parameters. * @param string $key The key of a HTTP POST parameter. * @param string $value the value of a HTTP POST parameter. * * @return array */ public function addPostParameter( $postParameters, $key, $value ) { Validate::isArray($postParameters, 'postParameters'); $postParameters[$key] = $value; return $postParameters; } /** * Groups set of values into one value separated with Resources::SEPARATOR * * @param array $values array of values to be grouped. * * @return string */ public function groupQueryValues($values) { Validate::isArray($values, 'values'); $joined = Resources::EMPTY_STRING; foreach ($values as $value) { if (!is_null($value) && !empty($value)) { $joined .= $value . Resources::SEPARATOR; } } return trim($joined, Resources::SEPARATOR); } /** * Adds metadata elements to headers array * * @param array $headers HTTP request headers * @param array $metadata user specified metadata * * @return array */ protected function addMetadataHeaders($headers, $metadata) { $this->validateMetadata($metadata); $metadata = $this->generateMetadataHeaders($metadata); $headers = array_merge($headers, $metadata); return $headers; } /** * Generates metadata headers by prefixing each element with 'x-ms-meta'. * * @param array $metadata user defined metadata. * * @return array. */ public function generateMetadataHeaders($metadata) { $metadataHeaders = array(); if (is_array($metadata) && !is_null($metadata)) { foreach ($metadata as $key => $value) { $headerName = Resources::X_MS_META_HEADER_PREFIX; if ( strpos($value, "\r") !== false || strpos($value, "\n") !== false ) { throw new \InvalidArgumentException(Resources::INVALID_META_MSG); } $headerName .= strtolower($key); $metadataHeaders[$headerName] = $value; } } return $metadataHeaders; } /** * Gets metadata array by parsing them from given headers. * * @param array $headers HTTP headers containing metadata elements. * * @return array. */ public function getMetadataArray($headers) { $metadata = array(); foreach ($headers as $key => $value) { $isMetadataHeader = Utilities::startsWith( strtolower($key), Resources::X_MS_META_HEADER_PREFIX ); if ($isMetadataHeader) { $MetadataName = str_replace( Resources::X_MS_META_HEADER_PREFIX, Resources::EMPTY_STRING, strtolower($key) ); $metadata[$MetadataName] = $value; } } return $metadata; } /** * Validates the provided metadata array. * * @param mix $metadata The metadata array. * * @return none */ public function validateMetadata($metadata) { if (!is_null($metadata)) { Validate::isArray($metadata, 'metadata'); } else { $metadata = array(); } foreach ($metadata as $key => $value) { Validate::isString($key, 'metadata key'); Validate::isString($value, 'metadata value'); } } } PKwL\Ե88Lupdraftplus/includes/WindowsAzure/Common/Internal/StorageServiceSettings.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\ConnectionStringParser; use WindowsAzure\Common\Internal\Resources; /** * Represents the settings used to sign and access a request against the storage * service. For more information about storage service connection strings check this * page: http://msdn.microsoft.com/en-us/library/ee758697 * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class StorageServiceSettings extends ServiceSettings { /** * The storage service name. * * @var string */ private $_name; /** * A base64 representation. * * @var string */ private $_key; /** * The endpoint for the blob service. * * @var string */ private $_blobEndpointUri; /** * The endpoint for the queue service. * * @var string */ private $_queueEndpointUri; /** * The endpoint for the table service. * * @var string */ private $_tableEndpointUri; /** * @var StorageServiceSettings */ private static $_devStoreAccount; /** * Validator for the UseDevelopmentStorage setting. Must be "true". * * @var array */ private static $_useDevelopmentStorageSetting; /** * Validator for the DevelopmentStorageProxyUri setting. Must be a valid Uri. * * @var array */ private static $_developmentStorageProxyUriSetting; /** * Validator for the DefaultEndpointsProtocol setting. Must be either "http" * or "https". * * @var array */ private static $_defaultEndpointsProtocolSetting; /** * Validator for the AccountName setting. No restrictions. * * @var array */ private static $_accountNameSetting; /** * Validator for the AccountKey setting. Must be a valid base64 string. * * @var array */ private static $_accountKeySetting; /** * Validator for the BlobEndpoint setting. Must be a valid Uri. * * @var array */ private static $_blobEndpointSetting; /** * Validator for the QueueEndpoint setting. Must be a valid Uri. * * @var array */ private static $_queueEndpointSetting; /** * Validator for the TableEndpoint setting. Must be a valid Uri. * * @var array */ private static $_tableEndpointSetting; /** * @var boolean */ protected static $isInitialized = false; /** * Holds the expected setting keys. * * @var array */ protected static $validSettingKeys = array(); /** * Initializes static members of the class. * * @return none */ protected static function init() { self::$_useDevelopmentStorageSetting = self::setting( Resources::USE_DEVELOPMENT_STORAGE_NAME, 'true' ); self::$_developmentStorageProxyUriSetting = self::settingWithFunc( Resources::DEVELOPMENT_STORAGE_PROXY_URI_NAME, Validate::getIsValidUri() ); self::$_defaultEndpointsProtocolSetting = self::setting( Resources::DEFAULT_ENDPOINTS_PROTOCOL_NAME, 'http', 'https' ); self::$_accountNameSetting = self::setting(Resources::ACCOUNT_NAME_NAME); self::$_accountKeySetting = self::settingWithFunc( Resources::ACCOUNT_KEY_NAME, // base64_decode will return false if the $key is not in base64 format. function ($key) { $isValidBase64String = base64_decode($key, true); if ($isValidBase64String) { return true; } else { throw new \RuntimeException( sprintf(Resources::INVALID_ACCOUNT_KEY_FORMAT, $key) ); } } ); self::$_blobEndpointSetting = self::settingWithFunc( Resources::BLOB_ENDPOINT_NAME, Validate::getIsValidUri() ); self::$_queueEndpointSetting = self::settingWithFunc( Resources::QUEUE_ENDPOINT_NAME, Validate::getIsValidUri() ); self::$_tableEndpointSetting = self::settingWithFunc( Resources::TABLE_ENDPOINT_NAME, Validate::getIsValidUri() ); self::$validSettingKeys[] = Resources::USE_DEVELOPMENT_STORAGE_NAME; self::$validSettingKeys[] = Resources::DEVELOPMENT_STORAGE_PROXY_URI_NAME; self::$validSettingKeys[] = Resources::DEFAULT_ENDPOINTS_PROTOCOL_NAME; self::$validSettingKeys[] = Resources::ACCOUNT_NAME_NAME; self::$validSettingKeys[] = Resources::ACCOUNT_KEY_NAME; self::$validSettingKeys[] = Resources::BLOB_ENDPOINT_NAME; self::$validSettingKeys[] = Resources::QUEUE_ENDPOINT_NAME; self::$validSettingKeys[] = Resources::TABLE_ENDPOINT_NAME; } /** * Creates new storage service settings instance. * * @param string $name The storage service name. * @param string $key The storage service key. * @param string $blobEndpointUri The sotrage service blob endpoint. * @param string $queueEndpointUri The sotrage service queue endpoint. * @param string $tableEndpointUri The sotrage service table endpoint. */ public function __construct( $name, $key, $blobEndpointUri, $queueEndpointUri, $tableEndpointUri ) { $this->_name = $name; $this->_key = $key; $this->_blobEndpointUri = $blobEndpointUri; $this->_queueEndpointUri = $queueEndpointUri; $this->_tableEndpointUri = $tableEndpointUri; } /** * Returns a StorageServiceSettings with development storage credentials using * the specified proxy Uri. * * @param string $proxyUri The proxy endpoint to use. * * @return StorageServiceSettings */ private static function _getDevelopmentStorageAccount($proxyUri) { if (is_null($proxyUri)) { return self::developmentStorageAccount(); } $scheme = parse_url($proxyUri, PHP_URL_SCHEME); $host = parse_url($proxyUri, PHP_URL_HOST); $prefix = $scheme . "://" . $host; return new StorageServiceSettings( Resources::DEV_STORE_NAME, Resources::DEV_STORE_KEY, $prefix . ':10000/devstoreaccount1/', $prefix . ':10001/devstoreaccount1/', $prefix . ':10002/devstoreaccount1/' ); } /** * Gets a StorageServiceSettings object that references the development storage * account. * * @return StorageServiceSettings */ public static function developmentStorageAccount() { if (is_null(self::$_devStoreAccount)) { self::$_devStoreAccount = self::_getDevelopmentStorageAccount( Resources::DEV_STORE_URI ); } return self::$_devStoreAccount; } /** * Gets the default service endpoint using the specified protocol and account * name. * * @param array $settings The service settings. * @param string $dns The service DNS. * * @return string */ private static function _getDefaultServiceEndpoint($settings, $dns) { $scheme = Utilities::tryGetValueInsensitive( Resources::DEFAULT_ENDPOINTS_PROTOCOL_NAME, $settings ); $accountName = Utilities::tryGetValueInsensitive( Resources::ACCOUNT_NAME_NAME, $settings ); return sprintf(Resources::SERVICE_URI_FORMAT, $scheme, $accountName, $dns); } /** * Creates StorageServiceSettings object given endpoints uri. * * @param array $settings The service settings. * @param string $blobEndpointUri The blob endpoint uri. * @param string $queueEndpointUri The queue endpoint uri. * @param string $tableEndpointUri The table endpoint uri. * * @return \WindowsAzure\Common\Internal\StorageServiceSettings */ private static function _createStorageServiceSettings( $settings, $blobEndpointUri = null, $queueEndpointUri = null, $tableEndpointUri = null ) { $blobEndpointUri = Utilities::tryGetValueInsensitive( Resources::BLOB_ENDPOINT_NAME, $settings, $blobEndpointUri ); $queueEndpointUri = Utilities::tryGetValueInsensitive( Resources::QUEUE_ENDPOINT_NAME, $settings, $queueEndpointUri ); $tableEndpointUri = Utilities::tryGetValueInsensitive( Resources::TABLE_ENDPOINT_NAME, $settings, $tableEndpointUri ); $accountName = Utilities::tryGetValueInsensitive( Resources::ACCOUNT_NAME_NAME, $settings ); $accountKey = Utilities::tryGetValueInsensitive( Resources::ACCOUNT_KEY_NAME, $settings ); return new StorageServiceSettings( $accountName, $accountKey, $blobEndpointUri, $queueEndpointUri, $tableEndpointUri ); } /** * Creates a StorageServiceSettings object from the given connection string. * * @param string $connectionString The storage settings connection string. * @param string $endpoint Azure BLOB storage endpoint * * @return StorageServiceSettings */ public static function createFromConnectionString($connectionString, $endpoint = 'blob.core.windows.net') { $tokenizedSettings = self::parseAndValidateKeys($connectionString); // Devstore case $matchedSpecs = self::matchedSpecification( $tokenizedSettings, self::allRequired(self::$_useDevelopmentStorageSetting), self::optional(self::$_developmentStorageProxyUriSetting) ); if ($matchedSpecs) { $proxyUri = Utilities::tryGetValueInsensitive( Resources::DEVELOPMENT_STORAGE_PROXY_URI_NAME, $tokenizedSettings ); return self::_getDevelopmentStorageAccount($proxyUri); } // Automatic case $matchedSpecs = self::matchedSpecification( $tokenizedSettings, self::allRequired( self::$_defaultEndpointsProtocolSetting, self::$_accountNameSetting, self::$_accountKeySetting ), self::optional( self::$_blobEndpointSetting, self::$_queueEndpointSetting, self::$_tableEndpointSetting ) ); if ($matchedSpecs) { return self::_createStorageServiceSettings( $tokenizedSettings, self::_getDefaultServiceEndpoint( $tokenizedSettings, // Changed in library from UpdraftPlus for compatibility with German Azure $endpoint ), self::_getDefaultServiceEndpoint( $tokenizedSettings, Resources::QUEUE_BASE_DNS_NAME ), self::_getDefaultServiceEndpoint( $tokenizedSettings, Resources::TABLE_BASE_DNS_NAME ) ); } // Explicit case $matchedSpecs = self::matchedSpecification( $tokenizedSettings, self::atLeastOne( self::$_blobEndpointSetting, self::$_queueEndpointSetting, self::$_tableEndpointSetting ), self::allRequired( self::$_accountNameSetting, self::$_accountKeySetting ) ); if ($matchedSpecs) { return self::_createStorageServiceSettings($tokenizedSettings); } self::noMatch($connectionString); } /** * Gets storage service name. * * @return string */ public function getName() { return $this->_name; } /** * Gets storage service key. * * @return string */ public function getKey() { return $this->_key; } /** * Gets storage service blob endpoint uri. * * @return string */ public function getBlobEndpointUri() { return $this->_blobEndpointUri; } /** * Gets storage service queue endpoint uri. * * @return string */ public function getQueueEndpointUri() { return $this->_queueEndpointUri; } /** * Gets storage service table endpoint uri. * * @return string */ public function getTableEndpointUri() { return $this->_tableEndpointUri; } } PKwL\``$uuGupdraftplus/includes/WindowsAzure/Common/Internal/FilterableService.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; /** * Interface for service with filers. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ interface FilterableService { /** * Adds new filter to proxy object and returns new BlobRestProxy with * that filter. * * @param WindowsAzure\Common\Internal\IServiceFilter $filter Filter to add for * the pipeline. * * @return mix. */ public function withFilter($filter); } PKwL\|<Hupdraftplus/includes/WindowsAzure/Common/Internal/ServiceBusSettings.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; /** * Represents the settings used to sign and access a request against the service * bus. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ServiceBusSettings extends ServiceSettings { /** * @var string */ private $_serviceBusEndpointUri; /** * @var string */ private $_wrapEndpointUri; /** * @var string */ private $_wrapName; /** * @var string */ private $_wrapPassword; /** * @var string */ private $_namespace; /** * Validator for the SharedSecretValue setting. It has to be provided. * * @var array */ private static $_wrapPasswordSetting; /** * Validator for the SharedSecretIssuer setting. It has to be provided. * * @var array */ private static $_wrapNameSetting; /** * Validator for the Endpoint setting. Must be a valid Uri. * * @var array */ private static $_serviceBusEndpointSetting; /** * Validator for the StsEndpoint setting. Must be a valid Uri. * * @var array */ private static $_wrapEndpointUriSetting; /** * @var boolean */ protected static $isInitialized = false; /** * Holds the expected setting keys. * * @var array */ protected static $validSettingKeys = array(); /** * Initializes static members of the class. * * @return none */ protected static function init() { self::$_serviceBusEndpointSetting = self::settingWithFunc( Resources::SERVICE_BUS_ENDPOINT_NAME, Validate::getIsValidUri() ); self::$_wrapNameSetting = self::setting( Resources::SHARED_SECRET_ISSUER_NAME ); self::$_wrapPasswordSetting = self::setting( Resources::SHARED_SECRET_VALUE_NAME ); self::$_wrapEndpointUriSetting = self::settingWithFunc( Resources::STS_ENDPOINT_NAME, Validate::getIsValidUri() ); self::$validSettingKeys[] = Resources::SERVICE_BUS_ENDPOINT_NAME; self::$validSettingKeys[] = Resources::SHARED_SECRET_ISSUER_NAME; self::$validSettingKeys[] = Resources::SHARED_SECRET_VALUE_NAME; self::$validSettingKeys[] = Resources::STS_ENDPOINT_NAME; } /** * Creates new Service Bus settings instance. * * @param string $serviceBusEndpoint The Service Bus endpoint uri. * @param string $namespace The service namespace. * @param string $wrapName The wrap name. * @param string $wrapPassword The wrap password. */ public function __construct( $serviceBusEndpoint, $namespace, $wrapEndpointUri, $wrapName, $wrapPassword ) { $this->_namespace = $namespace; $this->_serviceBusEndpointUri = $serviceBusEndpoint; $this->_wrapEndpointUri = $wrapEndpointUri; $this->_wrapName = $wrapName; $this->_wrapPassword = $wrapPassword; } /** * Creates a ServiceBusSettings object from the given connection string. * * @param string $connectionString The storage settings connection string. * * @return ServiceBusSettings */ public static function createFromConnectionString($connectionString) { $tokenizedSettings = self::parseAndValidateKeys($connectionString); $matchedSpecs = self::matchedSpecification( $tokenizedSettings, self::allRequired( self::$_serviceBusEndpointSetting, self::$_wrapNameSetting, self::$_wrapPasswordSetting ), self::optional(self::$_wrapEndpointUriSetting) ); if ($matchedSpecs) { $endpoint = Utilities::tryGetValueInsensitive( Resources::SERVICE_BUS_ENDPOINT_NAME, $tokenizedSettings ); // Parse the namespace part from the URI $namespace = explode('.', parse_url($endpoint, PHP_URL_HOST)); $namespace = $namespace[0]; $wrapEndpointUri = Utilities::tryGetValueInsensitive( Resources::STS_ENDPOINT_NAME, $tokenizedSettings, sprintf(Resources::WRAP_ENDPOINT_URI_FORMAT, $namespace) ); $issuerName = Utilities::tryGetValueInsensitive( Resources::SHARED_SECRET_ISSUER_NAME, $tokenizedSettings ); $issuerValue = Utilities::tryGetValueInsensitive( Resources::SHARED_SECRET_VALUE_NAME, $tokenizedSettings ); return new ServiceBusSettings( $endpoint, $namespace, $wrapEndpointUri, $issuerName, $issuerValue ); } self::noMatch($connectionString); } /** * Gets the Service Bus endpoint URI. * * @return string */ public function getServiceBusEndpointUri() { return $this->_serviceBusEndpointUri; } /** * Gets the wrap endpoint URI. * * @return string */ public function getWrapEndpointUri() { return $this->_wrapEndpointUri; } /** * Gets the wrap name. * * @return string */ public function getWrapName() { return $this->_wrapName; } /** * Gets the wrap password. * * @return string */ public function getWrapPassword() { return $this->_wrapPassword; } /** * Gets the namespace name. * * @return string */ public function getNamespace() { return $this->_namespace; } } PKwL\x1?**Kupdraftplus/includes/WindowsAzure/Common/Internal/MediaServicesSettings.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; /** * Represents the settings used to sign and access a request against the service * management. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class MediaServicesSettings extends ServiceSettings { /** * @var string */ private $_accountName; /** * @var string */ private $_accessKey; /** * @var string */ private $_endpointUri; /** * @var string */ private $_oauthEndpointUri; /** * Validator for the MediaServicesAccountName setting. It has to be provided. * * @var array */ private static $_accountNameSetting; /** * Validator for the MediaServicesAccessKey setting. It has to be provided. * * @var array */ private static $_accessKeySetting; /** * Validator for the MediaServicesEndpoint setting. Must be a valid Uri. * * @var array */ private static $_endpointUriSetting; /** * Validator for the MediaServicesOAuthEndpoint setting. Must be a valid Uri. * * @var array */ private static $_oauthEndpointUriSetting; /** * @var boolean */ protected static $isInitialized = false; /** * Holds the expected setting keys. * * @var array */ protected static $validSettingKeys = array(); /** * Initializes static members of the class. * * @return none */ protected static function init() { self::$_endpointUriSetting = self::settingWithFunc( Resources::MEDIA_SERVICES_ENDPOINT_URI_NAME, Validate::getIsValidUri() ); self::$_oauthEndpointUriSetting = self::settingWithFunc( Resources::MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME, Validate::getIsValidUri() ); self::$_accountNameSetting = self::setting( Resources::MEDIA_SERVICES_ACCOUNT_NAME ); self::$_accessKeySetting = self::setting( Resources::MEDIA_SERVICES_ACCESS_KEY ); self::$validSettingKeys[] = Resources::MEDIA_SERVICES_ENDPOINT_URI_NAME; self::$validSettingKeys[] = Resources::MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME; self::$validSettingKeys[] = Resources::MEDIA_SERVICES_ACCOUNT_NAME; self::$validSettingKeys[] = Resources::MEDIA_SERVICES_ACCESS_KEY; } /** * Creates new media services settings instance. * * @param string $accountName The user provided account name. * @param string $accessKey The user provided primary access key * @param string $endpointUri The service management endpoint uri. * @param string $oauthEndpointUri The OAuth service endpoint uri. */ public function __construct( $accountName, $accessKey, $endpointUri = null, $oauthEndpointUri = null ) { Validate::notNullOrEmpty($accountName, 'accountName'); Validate::notNullOrEmpty($accessKey, 'accountKey'); Validate::isString($accountName, 'accountName'); Validate::isString($accessKey, 'accountKey'); if ($endpointUri != null) { Validate::isValidUri($endpointUri); } else { $endpointUri = Resources::MEDIA_SERVICES_URL; } if ($oauthEndpointUri != null) { Validate::isValidUri($oauthEndpointUri); } else { $oauthEndpointUri = Resources::MEDIA_SERVICES_OAUTH_URL; } $this->_accountName = $accountName; $this->_accessKey = $accessKey; $this->_endpointUri = $endpointUri; $this->_oauthEndpointUri = $oauthEndpointUri; } /** * Creates a MediaServicesSettings object from the given connection string. * * @param string $connectionString The media services settings connection string. * * @return MediaServicesSettings */ public static function createFromConnectionString($connectionString) { $tokenizedSettings = self::parseAndValidateKeys($connectionString); $matchedSpecs = self::matchedSpecification( $tokenizedSettings, self::allRequired( self::$_accountNameSetting, self::$_accessKeySetting ), self::optional( self::$_endpointUriSetting, self::$_oauthEndpointUriSetting ) ); if ($matchedSpecs) { $endpointUri = Utilities::tryGetValueInsensitive( Resources::MEDIA_SERVICES_ENDPOINT_URI_NAME, $tokenizedSettings, Resources::MEDIA_SERVICES_URL ); $oauthEndpointUri = Utilities::tryGetValueInsensitive( Resources::MEDIA_SERVICES_OAUTH_ENDPOINT_URI_NAME, $tokenizedSettings, Resources::MEDIA_SERVICES_OAUTH_URL ); $accountName = Utilities::tryGetValueInsensitive( Resources::MEDIA_SERVICES_ACCOUNT_NAME, $tokenizedSettings ); $accessKey = Utilities::tryGetValueInsensitive( Resources::MEDIA_SERVICES_ACCESS_KEY, $tokenizedSettings ); return new MediaServicesSettings( $accountName, $accessKey, $endpointUri, $oauthEndpointUri ); } self::noMatch($connectionString); } /** * Gets media services account name. * * @return string */ public function getAccountName() { return $this->_accountName; } /** * Gets media services access key. * * @return string */ public function getAccessKey() { return $this->_accessKey; } /** * Gets media services endpoint uri. * * @return string */ public function getEndpointUri() { return $this->_endpointUri; } /** * Gets media services OAuth endpoint uri. * * @return string */ public function getOAuthEndpointUri() { return $this->_oauthEndpointUri; } } PKwL\ވ88Dupdraftplus/includes/WindowsAzure/Common/Internal/OAuthRestProxy.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\ServiceRestProxy; use WindowsAzure\Common\Models\OAuthAccessToken; use WindowsAzure\Common\Internal\Serialization\JsonSerializer; /** * OAuth rest proxy. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class OAuthRestProxy extends ServiceRestProxy { /** * Initializes new OAuthRestProxy object. * * @param IHttpClient $channel The HTTP client used to send HTTP requests. * @param string $uri The storage account uri. */ public function __construct($channel, $uri) { parent::__construct( $channel, $uri, Resources::EMPTY_STRING, new JsonSerializer() ); } /** * Get OAuth access token. * * @param string $grantType OAuth request grant_type field value. * @param string $clientId OAuth request clent_id field value. * @param string $clientSecret OAuth request clent_secret field value. * @param string $scope OAuth request scope field value. * * @return WindowsAzure\Common\Internal\Models\OAuthAccessToken */ public function getAccessToken($grantType, $clientId, $clientSecret, $scope) { $method = Resources::HTTP_POST; $headers = array(); $queryParams = array(); $postParameters = array(); $statusCode = Resources::STATUS_OK; $postParameters = $this->addPostParameter( $postParameters, Resources::OAUTH_GRANT_TYPE, $grantType ); $postParameters = $this->addPostParameter( $postParameters, Resources::OAUTH_CLIENT_ID, $clientId ); $postParameters = $this->addPostParameter( $postParameters, Resources::OAUTH_CLIENT_SECRET, $clientSecret ); $postParameters = $this->addPostParameter( $postParameters, Resources::OAUTH_SCOPE, $scope ); $response = $this->send( $method, $headers, $queryParams, $postParameters, Resources::EMPTY_STRING, $statusCode ); return OAuthAccessToken::create( $this->dataSerializer->unserialize($response->getBody()) ); } } PKwL\$:&&Eupdraftplus/includes/WindowsAzure/Common/Internal/ServiceSettings.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; /** * Base class for all REST services settings. * * Derived classes must implement the following members: * 1- $isInitialized: A static property that indicates whether the class's static * members have been initialized. * 2- init(): A protected static method that initializes static members. * 3- $validSettingKeys: A static property that contains valid setting keys for this * service. * 4- createFromConnectionString($connectionString): A public static function that * takes a connection string and returns the created settings object. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ abstract class ServiceSettings { /** * Throws an exception if the connection string format does not match any of the * available formats. * * @param type $connectionString The invalid formatted connection string. * * @return none * * @throws \RuntimeException */ protected static function noMatch($connectionString) { throw new \RuntimeException( sprintf(Resources::MISSING_CONNECTION_STRING_SETTINGS, $connectionString) ); } /** * Parses the connection string and then validate that the parsed keys belong to * the $validSettingKeys * * @param string $connectionString The user provided connection string. * * @return array The tokenized connection string keys. * * @throws \RuntimeException */ protected static function parseAndValidateKeys($connectionString) { // Initialize the static values if they are not initialized yet. if (!static::$isInitialized) { static::init(); static::$isInitialized = true; } $tokenizedSettings = ConnectionStringParser::parseConnectionString( 'connectionString', $connectionString ); // Assure that all given keys are valid. foreach ($tokenizedSettings as $key => $value) { if (!Utilities::inArrayInsensitive($key, static::$validSettingKeys) ) { throw new \RuntimeException( sprintf( Resources::INVALID_CONNECTION_STRING_SETTING_KEY, $key, implode("\n", static::$validSettingKeys) ) ); } } return $tokenizedSettings; } /** * Creates an anonymous function that acts as predicate. * * @param array $requirements The array of conditions to satisfy. * @param boolean $isRequired Either these conditions are all required or all * optional. * @param boolean $atLeastOne Indicates that at least one requirement must * succeed. * * @return callable */ protected static function getValidator($requirements, $isRequired, $atLeastOne) { // @codingStandardsIgnoreStart return function ($userSettings) use ($requirements, $isRequired, $atLeastOne) { $oneFound = false; $result = array_change_key_case($userSettings); foreach ($requirements as $requirement) { $settingName = strtolower($requirement[Resources::SETTING_NAME]); // Check if the setting name exists in the provided user settings. if (array_key_exists($settingName, $result)) { // Check if the provided user setting value is valid. $validationFunc = $requirement[Resources::SETTING_CONSTRAINT]; $isValid = $validationFunc($result[$settingName]); if ($isValid) { // Remove the setting as indicator for successful validation. unset($result[$settingName]); $oneFound = true; } } else { // If required then fail because the setting does not exist if ($isRequired) { return null; } } } if ($atLeastOne) { // At least one requirement must succeed, otherwise fail. return $oneFound ? $result : null; } else { return $result; } }; // @codingStandardsIgnoreEnd } /** * Creates at lease one succeed predicate for the provided list of requirements. * * @return callable */ protected static function atLeastOne() { $allSettings = func_get_args(); return self::getValidator($allSettings, false, true); } /** * Creates an optional predicate for the provided list of requirements. * * @return callable */ protected static function optional() { $optionalSettings = func_get_args(); return self::getValidator($optionalSettings, false, false); } /** * Creates an required predicate for the provided list of requirements. * * @return callable */ protected static function allRequired() { $requiredSettings = func_get_args(); return self::getValidator($requiredSettings, true, false); } /** * Creates a setting value condition using the passed predicate. * * @param string $name The setting key name. * @param callable $predicate The setting value predicate. * * @return array */ protected static function settingWithFunc($name, $predicate) { $requirement = array(); $requirement[Resources::SETTING_NAME] = $name; $requirement[Resources::SETTING_CONSTRAINT] = $predicate; return $requirement; } /** * Creates a setting value condition that validates it is one of the * passed valid values. * * @param string $name The setting key name. * * @return array */ protected static function setting($name) { $validValues = func_get_args(); // Remove $name argument. unset($validValues[0]); $validValuesCount = func_num_args(); $predicate = function ($settingValue) use ($validValuesCount, $validValues) { if (empty($validValues)) { // No restrictions, succeed, return true; } // Check to find if the $settingValue is valid or not. The index must // start from 1 as unset deletes the value but does not update the array // indecies. for ($index = 1; $index < $validValuesCount; $index++) { if ($settingValue == $validValues[$index]) { // $settingValue is found in valid values set, succeed. return true; } } throw new \RuntimeException( sprintf( Resources::INVALID_CONFIG_VALUE, $settingValue, implode("\n", $validValues) ) ); // $settingValue is missing in valid values set, fail. return false; }; return self::settingWithFunc($name, $predicate); } /** * Tests to see if a given list of settings matches a set of filters exactly. * * @param array $settings The settings to check. * * @return boolean If any filter returns null, false. If there are any settings * left over after all filters are processed, false. Otherwise true. */ protected static function matchedSpecification($settings) { $constraints = func_get_args(); // Remove first element which corresponds to $settings unset($constraints[0]); foreach ($constraints as $constraint) { $remainingSettings = $constraint($settings); if (is_null($remainingSettings)) { return false; } else { $settings = $remainingSettings; } } if (empty($settings)) { return true; } return false; } }PKwL\=bbOupdraftplus/includes/WindowsAzure/Common/Internal/ServiceManagementSettings.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; /** * Represents the settings used to sign and access a request against the service * management. For more information about service management connection strings check * this page: http://msdn.microsoft.com/en-us/library/windowsazure/gg466228.aspx * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ServiceManagementSettings extends ServiceSettings { /** * @var string */ private $_subscriptionId; /** * @var string */ private $_certificatePath; /** * @var string */ private $_endpointUri; /** * Validator for the ServiceManagementEndpoint setting. Must be a valid Uri. * * @var array */ private static $_endpointSetting; /** * Validator for the CertificatePath setting. It has to be provided. * * @var array */ private static $_certificatePathSetting; /** * Validator for the SubscriptionId setting. It has to be provided. * * @var array */ private static $_subscriptionIdSetting; /** * @var boolean */ protected static $isInitialized = false; /** * Holds the expected setting keys. * * @var array */ protected static $validSettingKeys = array(); /** * Initializes static members of the class. * * @return none */ protected static function init() { self::$_endpointSetting = self::settingWithFunc( Resources::SERVICE_MANAGEMENT_ENDPOINT_NAME, Validate::getIsValidUri() ); self::$_certificatePathSetting = self::setting( Resources::CERTIFICATE_PATH_NAME ); self::$_subscriptionIdSetting = self::setting( Resources::SUBSCRIPTION_ID_NAME ); self::$validSettingKeys[] = Resources::SUBSCRIPTION_ID_NAME; self::$validSettingKeys[] = Resources::CERTIFICATE_PATH_NAME; self::$validSettingKeys[] = Resources::SERVICE_MANAGEMENT_ENDPOINT_NAME; } /** * Creates new service management settings instance. * * @param string $subscriptionId The user provided subscription id. * @param string $endpointUri The service management endpoint uri. * @param string $certificatePath The management certificate path. */ public function __construct($subscriptionId, $endpointUri, $certificatePath) { $this->_certificatePath = $certificatePath; $this->_endpointUri = $endpointUri; $this->_subscriptionId = $subscriptionId; } /** * Creates a ServiceManagementSettings object from the given connection string. * * @param string $connectionString The storage settings connection string. * * @return ServiceManagementSettings */ public static function createFromConnectionString($connectionString) { $tokenizedSettings = self::parseAndValidateKeys($connectionString); $matchedSpecs = self::matchedSpecification( $tokenizedSettings, self::allRequired( self::$_subscriptionIdSetting, self::$_certificatePathSetting ), self::optional( self::$_endpointSetting ) ); if ($matchedSpecs) { $endpointUri = Utilities::tryGetValueInsensitive( Resources::SERVICE_MANAGEMENT_ENDPOINT_NAME, $tokenizedSettings, Resources::SERVICE_MANAGEMENT_URL ); $subscriptionId = Utilities::tryGetValueInsensitive( Resources::SUBSCRIPTION_ID_NAME, $tokenizedSettings ); $certificatePath = Utilities::tryGetValueInsensitive( Resources::CERTIFICATE_PATH_NAME, $tokenizedSettings ); return new ServiceManagementSettings( $subscriptionId, $endpointUri, $certificatePath ); } self::noMatch($connectionString); } /** * Gets service management endpoint uri. * * @return string */ public function getEndpointUri() { return $this->_endpointUri; } /** * Gets the subscription id. * * @return string */ public function getSubscriptionId() { return $this->_subscriptionId; } /** * Gets the certificate path. * * @return string */ public function getCertificatePath() { return $this->_certificatePath; } } PKwL\X X Lupdraftplus/includes/WindowsAzure/Common/Internal/ConnectionStringSource.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; /** * Holder for default connection string sources used in CloudConfigurationManager. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ConnectionStringSource { /** * The list of all sources which comes as default. * * @var type */ private static $_defaultSources; /** * @var boolean */ private static $_isInitialized; /** * Environment variable source name. */ const ENVIRONMENT_SOURCE = 'environment_source'; /** * Initializes the default sources. * * @return none */ private static function _init() { if (!self::$_isInitialized) { self::$_defaultSources = array( self::ENVIRONMENT_SOURCE => array(__CLASS__, 'environmentSource') ); self::$_isInitialized = true; } } /** * Gets a connection string value from the system environment. * * @param string $key The connection string name. * * @return string */ public static function environmentSource($key) { Validate::isString($key, 'key'); return getenv($key); } /** * Gets list of default sources. * * @return array */ public static function getDefaultSources() { self::_init(); return self::$_defaultSources; } } PKwL\w**>updraftplus/includes/WindowsAzure/Common/Internal/Validate.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\InvalidArgumentTypeException; use WindowsAzure\Common\Internal\Resources; /** * Validates aganist a condition and throws an exception in case of failure. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Validate { /** * Throws exception if the provided variable type is not array. * * @param mix $var The variable to check. * @param string $name The parameter name. * * @throws InvalidArgumentTypeException. * * @return none */ public static function isArray($var, $name) { if (!is_array($var)) { throw new InvalidArgumentTypeException(gettype(array()), $name); } } /** * Throws exception if the provided variable type is not string. * * @param mix $var The variable to check. * @param string $name The parameter name. * * @throws InvalidArgumentTypeException * * @return none */ public static function isString($var, $name) { try { (string)$var; } catch (\Exception $e) { throw new InvalidArgumentTypeException(gettype(''), $name); } } /** * Throws exception if the provided variable type is not boolean. * * @param mix $var variable to check against. * * @throws InvalidArgumentTypeException * * @return none */ public static function isBoolean($var) { (bool)$var; } /** * Throws exception if the provided variable is set to null. * * @param mix $var The variable to check. * @param string $name The parameter name. * * @throws \InvalidArgumentException * * @return none */ public static function notNullOrEmpty($var, $name) { if (is_null($var) || empty($var)) { throw new \InvalidArgumentException( sprintf(Resources::NULL_OR_EMPTY_MSG, $name) ); } } /** * Throws exception if the provided variable is not double. * * @param mix $var The variable to check. * @param string $name The parameter name. * * @throws \InvalidArgumentException * * @return none */ public static function isDouble($var, $name) { if (!is_numeric($var)) { throw new InvalidArgumentTypeException('double', $name); } } /** * Throws exception if the provided variable type is not integer. * * @param mix $var The variable to check. * @param string $name The parameter name. * * @throws InvalidArgumentTypeException * * @return none */ public static function isInteger($var, $name) { try { (int)$var; } catch (\Exception $e) { throw new InvalidArgumentTypeException(gettype(123), $name); } } /** * Returns whether the variable is an empty or null string. * * @param string $var value. * * @return boolean */ public static function isNullOrEmptyString($var) { try { (string)$var; } catch (\Exception $e) { return false; } return (!isset($var) || trim($var)===''); } /** * Throws exception if the provided condition is not satisfied. * * @param bool $isSatisfied condition result. * @param string $failureMessage the exception message * * @throws \Exception * * @return none */ public static function isTrue($isSatisfied, $failureMessage) { if (!$isSatisfied) { throw new \InvalidArgumentException($failureMessage); } } /** * Throws exception if the provided $date is not of type \DateTime * * @param mix $date variable to check against. * * @throws WindowsAzure\Common\Internal\InvalidArgumentTypeException * * @return none */ public static function isDate($date) { if (gettype($date) != 'object' || get_class($date) != 'DateTime') { throw new InvalidArgumentTypeException('DateTime'); } } /** * Throws exception if the provided variable is set to null. * * @param mix $var The variable to check. * @param string $name The parameter name. * * @throws \InvalidArgumentException * * @return none */ public static function notNull($var, $name) { if (is_null($var)) { throw new \InvalidArgumentException(sprintf(Resources::NULL_MSG, $name)); } } /** * Throws exception if the object is not of the specified class type. * * @param mixed $objectInstance An object that requires class type validation. * @param mixed $classInstance The instance of the class the the * object instance should be. * @param string $name The name of the object. * * @throws \InvalidArgumentException * * @return none */ public static function isInstanceOf($objectInstance, $classInstance, $name) { Validate::notNull($classInstance, 'classInstance'); if (is_null($objectInstance)) { return true; } $objectType = gettype($objectInstance); $classType = gettype($classInstance); if ($objectType === $classType) { return true; } else { throw new \InvalidArgumentException( sprintf( Resources::INSTANCE_TYPE_VALIDATION_MSG, $name, $objectType, $classType ) ); } } /** * Creates a anonymous function that check if the given uri is valid or not. * * @return callable */ public static function getIsValidUri() { return function ($uri) { return Validate::isValidUri($uri); }; } /** * Throws exception if the string is not of a valid uri. * * @param string $uri String to check. * * @throws \InvalidArgumentException * * @return boolean */ public static function isValidUri($uri) { $isValid = filter_var($uri, FILTER_VALIDATE_URL); if ($isValid) { return true; } else { throw new \RuntimeException( sprintf(Resources::INVALID_CONFIG_URI, $uri) ); } } /** * Throws exception if the provided variable type is not object. * * @param mix $var The variable to check. * @param string $name The parameter name. * * @throws InvalidArgumentTypeException. * * @return boolean */ public static function isObject($var, $name) { if (!is_object($var)) { throw new InvalidArgumentTypeException('object', $name); } return true; } /** * Throws exception if the object is not of the specified class type. * * @param mixed $objectInstance An object that requires class type validation. * @param string $class The class the object instance should be. * @param string $name The parameter name. * * @throws \InvalidArgumentException * * @return boolean */ public static function isA($objectInstance, $class, $name) { Validate::isString($class, 'class'); Validate::notNull($objectInstance, 'objectInstance'); Validate::isObject($objectInstance, 'objectInstance'); $objectType = get_class($objectInstance); if (is_a($objectInstance, $class)) { return true; } else { throw new \InvalidArgumentException( sprintf( Resources::INSTANCE_TYPE_VALIDATION_MSG, $name, $objectType, $class ) ); } } /** * Validate if method exists in object * * @param object $objectInstance An object that requires method existing * validation * @param string $method Method name * @param string $name The parameter name * * @return boolean */ public static function methodExists($objectInstance, $method, $name) { Validate::isString($method, 'method'); Validate::notNull($objectInstance, 'objectInstance'); Validate::isObject($objectInstance, 'objectInstance'); if (method_exists($objectInstance, $method)) { return true; } else { throw new \InvalidArgumentException( sprintf( Resources::ERROR_METHOD_NOT_FOUND, $method, $name ) ); } } /** * Validate if string is date formatted * * @param string $value Value to validate * @param string $name Name of parameter to insert in erro message * * @throws \InvalidArgumentException * * @return boolean */ public static function isDateString($value, $name) { Validate::isString($value, 'value'); try { new \DateTime($value); return true; } catch (\Exception $e) { throw new \InvalidArgumentException( sprintf( Resources::ERROR_INVALID_DATE_STRING, $name, $value ) ); } } } PKwL\\!?updraftplus/includes/WindowsAzure/Common/Internal/RestProxy.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Internal; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Http\Url; /** * Base class for all REST proxies. * * @category Microsoft * @package WindowsAzure\Common\Internal * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class RestProxy { /** * @var WindowsAzure\Common\Internal\Http\IHttpClient */ private $_channel; /** * @var array */ private $_filters; /** * @var WindowsAzure\Common\Internal\Serialization\ISerializer */ protected $dataSerializer; /** * @var string */ private $_uri; /** * Initializes new RestProxy object. * * @param IHttpClient $channel The HTTP client used to send HTTP requests. * @param ISerializer $dataSerializer The data serializer. * @param string $uri The uri of the service. */ public function __construct($channel, $dataSerializer, $uri) { $this->_channel = $channel; $this->_filters = array(); $this->dataSerializer = $dataSerializer; $this->_uri = $uri; } /** * Gets HTTP filters that will process each request. * * @return array */ public function getFilters() { return $this->_filters; } /** * Gets the Uri of the service. * * @return string */ public function getUri() { return $this->_uri; } /** * Sets the Uri of the service. * * @param string $uri The URI of the request. * * @return none */ public function setUri($uri) { $this->_uri = $uri; } /** * Sends HTTP request with the specified HTTP call context. * * @param WindowsAzure\Common\Internal\Http\HttpCallContext $context The HTTP * call context. * * @return \HTTP_Request2_Response */ protected function sendContext($context) { $channel = clone $this->_channel; $contextUrl = $context->getUri(); $url = new Url(empty($contextUrl) ? $this->_uri : $contextUrl); $headers = $context->getHeaders(); $statusCodes = $context->getStatusCodes(); $body = $context->getBody(); $queryParams = $context->getQueryParameters(); $postParameters = $context->getPostParameters(); $path = $context->getPath(); $channel->setMethod($context->getMethod()); $channel->setExpectedStatusCode($statusCodes); $channel->setBody($body); $channel->setHeaders($headers); if (count($postParameters) > 0) { $channel->setPostParameters($postParameters); } $url->setQueryVariables($queryParams); $url->appendUrlPath($path); $channel->send($this->_filters, $url); return $channel->getResponse(); } /** * Adds new filter to new service rest proxy object and returns that object back. * * @param WindowsAzure\Common\Internal\IServiceFilter $filter Filter to add for * the pipeline. * * @return RestProxy. */ public function withFilter($filter) { $serviceProxyWithFilter = clone $this; $serviceProxyWithFilter->_filters[] = $filter; return $serviceProxyWithFilter; } /** * Adds optional query parameter. * * Doesn't add the value if it satisfies empty(). * * @param array &$queryParameters The query parameters. * @param string $key The query variable name. * @param string $value The query variable value. * * @return none */ protected function addOptionalQueryParam(&$queryParameters, $key, $value) { Validate::isArray($queryParameters, 'queryParameters'); Validate::isString($key, 'key'); Validate::isString($value, 'value'); if (!is_null($value) && Resources::EMPTY_STRING !== $value) { $queryParameters[$key] = $value; } } /** * Adds optional header. * * Doesn't add the value if it satisfies empty(). * * @param array &$headers The HTTP header parameters. * @param string $key The HTTP header name. * @param string $value The HTTP header value. * * @return none */ protected function addOptionalHeader(&$headers, $key, $value) { Validate::isArray($headers, 'headers'); Validate::isString($key, 'key'); Validate::isString($value, 'value'); if (!is_null($value) && Resources::EMPTY_STRING !== $value) { $headers[$key] = $value; } } } PKwL\]Eupdraftplus/includes/WindowsAzure/Common/Models/ServiceProperties.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Models; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Models\Logging; use WindowsAzure\Common\Models\Metrics; use WindowsAzure\Common\Internal\Serialization\XmlSerializer; /** * Encapsulates service properties * * @category Microsoft * @package WindowsAzure\Common\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ServiceProperties { private $_logging; private $_metrics; public static $xmlRootName = 'StorageServiceProperties'; /** * Creates ServiceProperties object from parsed XML response. * * @param array $parsedResponse XML response parsed into array. * * @return WindowsAzure\Common\Models\ServiceProperties. */ public static function create($parsedResponse) { $result = new ServiceProperties(); $result->setLogging(Logging::create($parsedResponse['Logging'])); $result->setMetrics(Metrics::create($parsedResponse['Metrics'])); return $result; } /** * Gets logging element. * * @return WindowsAzure\Common\Models\Logging. */ public function getLogging() { return $this->_logging; } /** * Sets logging element. * * @param WindowsAzure\Common\Models\Logging $logging new element. * * @return none. */ public function setLogging($logging) { $this->_logging = clone $logging; } /** * Gets metrics element. * * @return WindowsAzure\Common\Models\Metrics. */ public function getMetrics() { return $this->_metrics; } /** * Sets metrics element. * * @param WindowsAzure\Common\Models\Metrics $metrics new element. * * @return none. */ public function setMetrics($metrics) { $this->_metrics = clone $metrics; } /** * Converts this object to array with XML tags * * @return array. */ public function toArray() { return array( 'Logging' => !empty($this->_logging) ? $this->_logging->toArray() : null, 'Metrics' => !empty($this->_metrics) ? $this->_metrics->toArray() : null ); } /** * Converts this current object to XML representation. * * @param XmlSerializer $xmlSerializer The XML serializer. * * @return string */ public function toXml($xmlSerializer) { $properties = array(XmlSerializer::ROOT_NAME => self::$xmlRootName); return $xmlSerializer->serialize($this->toArray(), $properties); } } PKwL\At;updraftplus/includes/WindowsAzure/Common/Models/Logging.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Models; use WindowsAzure\Common\Models\RetentionPolicy; use WindowsAzure\Common\Internal\Utilities; /** * Holds elements of queue properties logging field. * * @category Microsoft * @package WindowsAzure\Common\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Logging { /** * The version of Storage Analytics to configure * * @var string */ private $_version; /** * Applies only to logging configuration. Indicates whether all delete requests * should be logged. * * @var bool */ private $_delete; /** * Applies only to logging configuration. Indicates whether all read requests * should be logged. * * @var bool. */ private $_read; /** * Applies only to logging configuration. Indicates whether all write requests * should be logged. * * @var bool */ private $_write; /** * @var WindowsAzure\Common\Models\RetentionPolicy */ private $_retentionPolicy; /** * Creates object from $parsedResponse. * * @param array $parsedResponse XML response parsed into array. * * @return WindowsAzure\Common\Models\Logging */ public static function create($parsedResponse) { $result = new Logging(); $result->setVersion($parsedResponse['Version']); $result->setDelete(Utilities::toBoolean($parsedResponse['Delete'])); $result->setRead(Utilities::toBoolean($parsedResponse['Read'])); $result->setWrite(Utilities::toBoolean($parsedResponse['Write'])); $result->setRetentionPolicy( RetentionPolicy::create($parsedResponse['RetentionPolicy']) ); return $result; } /** * Gets retention policy * * @return WindowsAzure\Common\Models\RetentionPolicy * */ public function getRetentionPolicy() { return $this->_retentionPolicy; } /** * Sets retention policy * * @param RetentionPolicy $policy object to use * * @return none. */ public function setRetentionPolicy($policy) { $this->_retentionPolicy = $policy; } /** * Gets write * * @return bool. */ public function getWrite() { return $this->_write; } /** * Sets write * * @param bool $write new value. * * @return none. */ public function setWrite($write) { $this->_write = $write; } /** * Gets read * * @return bool. */ public function getRead() { return $this->_read; } /** * Sets read * * @param bool $read new value. * * @return none. */ public function setRead($read) { $this->_read = $read; } /** * Gets delete * * @return bool. */ public function getDelete() { return $this->_delete; } /** * Sets delete * * @param bool $delete new value. * * @return none. */ public function setDelete($delete) { $this->_delete = $delete; } /** * Gets version * * @return string. */ public function getVersion() { return $this->_version; } /** * Sets version * * @param string $version new value. * * @return none. */ public function setVersion($version) { $this->_version = $version; } /** * Converts this object to array with XML tags * * @return array. */ public function toArray() { return array( 'Version' => $this->_version, 'Delete' => Utilities::booleanToString($this->_delete), 'Read' => Utilities::booleanToString($this->_read), 'Write' => Utilities::booleanToString($this->_write), 'RetentionPolicy' => !empty($this->_retentionPolicy) ? $this->_retentionPolicy->toArray() : null ); } } PKwL\xG;updraftplus/includes/WindowsAzure/Common/Models/Metrics.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Models; use WindowsAzure\Common\Internal\Utilities; /** * Holds elements of queue properties metrics field. * * @category Microsoft * @package WindowsAzure\Common\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class Metrics { /** * The version of Storage Analytics to configure * * @var string */ private $_version; /** * Indicates whether metrics is enabled for the storage service * * @var bool */ private $_enabled; /** * Indicates whether a retention policy is enabled for the storage service * * @var bool */ private $_includeAPIs; /** * @var WindowsAzure\Common\Models\RetentionPolicy */ private $_retentionPolicy; /** * Creates object from $parsedResponse. * * @param array $parsedResponse XML response parsed into array. * * @return WindowsAzure\Common\Models\Metrics */ public static function create($parsedResponse) { $result = new Metrics(); $result->setVersion($parsedResponse['Version']); $result->setEnabled(Utilities::toBoolean($parsedResponse['Enabled'])); if ($result->getEnabled()) { $result->setIncludeAPIs( Utilities::toBoolean($parsedResponse['IncludeAPIs']) ); } $result->setRetentionPolicy( RetentionPolicy::create($parsedResponse['RetentionPolicy']) ); return $result; } /** * Gets retention policy * * @return WindowsAzure\Common\Models\RetentionPolicy * */ public function getRetentionPolicy() { return $this->_retentionPolicy; } /** * Sets retention policy * * @param RetentionPolicy $policy object to use * * @return none. */ public function setRetentionPolicy($policy) { $this->_retentionPolicy = $policy; } /** * Gets include APIs. * * @return bool. */ public function getIncludeAPIs() { return $this->_includeAPIs; } /** * Sets include APIs. * * @param $bool $includeAPIs value to use. * * @return none. */ public function setIncludeAPIs($includeAPIs) { $this->_includeAPIs = $includeAPIs; } /** * Gets enabled. * * @return bool. */ public function getEnabled() { return $this->_enabled; } /** * Sets enabled. * * @param bool $enabled value to use. * * @return none. */ public function setEnabled($enabled) { $this->_enabled = $enabled; } /** * Gets version * * @return string. */ public function getVersion() { return $this->_version; } /** * Sets version * * @param string $version new value. * * @return none. */ public function setVersion($version) { $this->_version = $version; } /** * Converts this object to array with XML tags * * @return array. */ public function toArray() { $array = array( 'Version' => $this->_version, 'Enabled' => Utilities::booleanToString($this->_enabled) ); if ($this->_enabled) { $array['IncludeAPIs'] = Utilities::booleanToString($this->_includeAPIs); } $array['RetentionPolicy'] = !empty($this->_retentionPolicy) ? $this->_retentionPolicy->toArray() : null; return $array; } } PKwL\/;  Dupdraftplus/includes/WindowsAzure/Common/Models/OAuthAccessToken.phpnu[ * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Models; use WindowsAzure\Common\Internal\Resources; /** * Holds OAuth access token data. * * @category Microsoft * @package WindowsAzure\Common\Models * @author Azure PHP SDK * @copyright Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class OAuthAccessToken { /** * Access token itself * * @var string */ private $_accessToken; /** * Unix time the access token valid before. * * @var int */ private $_expiresIn; /** * Scope of access token * * @var string. */ private $_scope; /** * Creates object from $parsedResponse. * * @param array $parsedResponse JSON response parsed into array. * * @return WindowsAzure\Common\Models\OAuthAccessToken */ public static function create($parsedResponse) { $result = new OAuthAccessToken(); $result->setAccessToken($parsedResponse[Resources::OAUTH_ACCESS_TOKEN]); $result->setExpiresIn($parsedResponse[Resources::OAUTH_EXPIRES_IN] + time()); $result->setScope($parsedResponse[Resources::OAUTH_SCOPE]); return $result; } /** * Gets access token * * @return string */ public function getAccessToken() { return $this->_accessToken; } /** * Sets access token * * @param string $accessToken OAuth access token * * @return none */ public function setAccessToken($accessToken) { $this->_accessToken = $accessToken; } /** * Gets expired date of access token in unixdate * * @return int * */ public function getExpiresIn() { return $this->_expiresIn; } /** * Sets access token expires date * * @param int $expiresIn OAuth access token expire date * * @return none */ public function setExpiresIn($expiresIn) { $this->_expiresIn = $expiresIn; } /** * Gets access token scope * * @return string * */ public function getScope() { return $this->_scope; } /** * Sets access token scope * * @param string $scope OAuth access token scope * * @return none */ public function setScope($scope) { $this->_scope = $scope; } } PKwL\-4} Cupdraftplus/includes/WindowsAzure/Common/Models/RetentionPolicy.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Models; use WindowsAzure\Common\Internal\Utilities; /** * Holds elements of queue properties retention policy field. * * @category Microsoft * @package WindowsAzure\Common\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class RetentionPolicy { /** * Indicates whether a retention policy is enabled for the storage service * * @var bool. */ private $_enabled; /** * If $_enabled is true then this field indicates the number of days that metrics * or logging data should be retained. All data older than this value will be * deleted. The minimum value you can specify is 1; * the largest value is 365 (one year) * * @var int */ private $_days; /** * Creates object from $parsedResponse. * * @param array $parsedResponse XML response parsed into array. * * @return WindowsAzure\Common\Models\RetentionPolicy */ public static function create($parsedResponse) { $result = new RetentionPolicy(); $result->setEnabled(Utilities::toBoolean($parsedResponse['Enabled'])); if ($result->getEnabled()) { $result->setDays(intval($parsedResponse['Days'])); } return $result; } /** * Gets enabled. * * @return bool. */ public function getEnabled() { return $this->_enabled; } /** * Sets enabled. * * @param bool $enabled value to use. * * @return none. */ public function setEnabled($enabled) { $this->_enabled = $enabled; } /** * Gets days field. * * @return int */ public function getDays() { return $this->_days; } /** * Sets days field. * * @param int $days value to use. * * @return none */ public function setDays($days) { $this->_days = $days; } /** * Converts this object to array with XML tags * * @return array. */ public function toArray() { $array = array('Enabled' => Utilities::booleanToString($this->_enabled)); if (isset($this->_days)) { $array['Days'] = strval($this->_days); } return $array; } } PKwL\v Nupdraftplus/includes/WindowsAzure/Common/Models/GetServicePropertiesResult.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common\Models; use WindowsAzure\Common\Models\ServiceProperties; /** * Result from calling GetQueueProperties REST wrapper. * * @category Microsoft * @package WindowsAzure\Common\Models * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class GetServicePropertiesResult { private $_serviceProperties; /** * Creates object from $parsedResponse. * * @param array $parsedResponse XML response parsed into array. * * @return WindowsAzure\Common\Models\GetServicePropertiesResult */ public static function create($parsedResponse) { $result = new GetServicePropertiesResult(); $result->_serviceProperties = ServiceProperties::create($parsedResponse); return $result; } /** * Gets service properties object. * * @return WindowsAzure\Common\Models\ServiceProperties */ public function getValue() { return $this->_serviceProperties; } /** * Sets service properties object. * * @param ServiceProperties $serviceProperties object to use. * * @return none */ public function setValue($serviceProperties) { $this->_serviceProperties = clone $serviceProperties; } } PKwL\[@@<updraftplus/includes/WindowsAzure/Common/ServicesBuilder.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common; use WindowsAzure\Blob\BlobRestProxy; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Http\HttpClient; use WindowsAzure\Common\Internal\Filters\DateFilter; use WindowsAzure\Common\Internal\Filters\HeadersFilter; use WindowsAzure\Common\Internal\Filters\AuthenticationFilter; use WindowsAzure\Common\Internal\Filters\WrapFilter; use WindowsAzure\Common\Internal\InvalidArgumentTypeException; use WindowsAzure\Common\Internal\Serialization\XmlSerializer; use WindowsAzure\Common\Internal\Authentication\SharedKeyAuthScheme; use WindowsAzure\Common\Internal\Authentication\TableSharedKeyLiteAuthScheme; use WindowsAzure\Common\Internal\StorageServiceSettings; use WindowsAzure\Common\Internal\ServiceManagementSettings; use WindowsAzure\Common\Internal\ServiceBusSettings; use WindowsAzure\Common\Internal\MediaServicesSettings; use WindowsAzure\Queue\QueueRestProxy; use WindowsAzure\ServiceBus\ServiceBusRestProxy; use WindowsAzure\ServiceBus\Internal\WrapRestProxy; use WindowsAzure\ServiceManagement\ServiceManagementRestProxy; use WindowsAzure\Table\TableRestProxy; use WindowsAzure\Table\Internal\AtomReaderWriter; use WindowsAzure\Table\Internal\MimeReaderWriter; use WindowsAzure\MediaServices\MediaServicesRestProxy; use WindowsAzure\Common\Internal\OAuthRestProxy; use WindowsAzure\Common\Internal\Authentication\OAuthScheme; /** * Builds azure service objects. * * @category Microsoft * @package WindowsAzure\Common * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ServicesBuilder { /** * @var ServicesBuilder */ private static $_instance = null; /** * Gets the HTTP client used in the REST services construction. * * @return WindowsAzure\Common\Internal\Http\IHttpClient */ protected function httpClient() { return new HttpClient(); } /** * Gets the serializer used in the REST services construction. * * @return WindowsAzure\Common\Internal\Serialization\ISerializer */ protected function serializer() { return new XmlSerializer(); } /** * Gets the MIME serializer used in the REST services construction. * * @return \WindowsAzure\Table\Internal\IMimeReaderWriter */ protected function mimeSerializer() { return new MimeReaderWriter(); } /** * Gets the Atom serializer used in the REST services construction. * * @return \WindowsAzure\Table\Internal\IAtomReaderWriter */ protected function atomSerializer() { return new AtomReaderWriter(); } /** * Gets the Queue authentication scheme. * * @param string $accountName The account name. * @param string $accountKey The account key. * * @return \WindowsAzure\Common\Internal\Authentication\StorageAuthScheme */ protected function queueAuthenticationScheme($accountName, $accountKey) { return new SharedKeyAuthScheme($accountName, $accountKey); } /** * Gets the Blob authentication scheme. * * @param string $accountName The account name. * @param string $accountKey The account key. * * @return \WindowsAzure\Common\Internal\Authentication\StorageAuthScheme */ protected function blobAuthenticationScheme($accountName, $accountKey) { return new SharedKeyAuthScheme($accountName, $accountKey); } /** * Gets the Table authentication scheme. * * @param string $accountName The account name. * @param string $accountKey The account key. * * @return TableSharedKeyLiteAuthScheme */ protected function tableAuthenticationScheme($accountName, $accountKey) { return new TableSharedKeyLiteAuthScheme($accountName, $accountKey); } /** * Builds a WRAP client. * * @param string $wrapEndpointUri The WRAP endpoint uri. * * @return WindowsAzure\ServiceBus\Internal\IWrap */ protected function createWrapService($wrapEndpointUri) { $httpClient = $this->httpClient(); $wrapWrapper = new WrapRestProxy($httpClient, $wrapEndpointUri); return $wrapWrapper; } /** * Builds a queue object. * * @param string $connectionString The configuration connection string. * * @return WindowsAzure\Queue\Internal\IQueue */ public function createQueueService($connectionString) { $settings = StorageServiceSettings::createFromConnectionString( $connectionString ); $httpClient = $this->httpClient(); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getQueueEndpointUri() ); $queueWrapper = new QueueRestProxy( $httpClient, $uri, $settings->getName(), $serializer ); // Adding headers filter $headers = array( Resources::USER_AGENT => Resources::SDK_USER_AGENT, ); $headers[Resources::X_MS_VERSION] = Resources::STORAGE_API_LATEST_VERSION; $headersFilter = new HeadersFilter($headers); $queueWrapper = $queueWrapper->withFilter($headersFilter); // Adding date filter $dateFilter = new DateFilter(); $queueWrapper = $queueWrapper->withFilter($dateFilter); // Adding authentication filter $authFilter = new AuthenticationFilter( $this->queueAuthenticationScheme( $settings->getName(), $settings->getKey() ) ); $queueWrapper = $queueWrapper->withFilter($authFilter); return $queueWrapper; } /** * Builds a blob object. * * @param string $connectionString The configuration connection string. * @param string $endpoint Azure BLOB storage endpoint * * @return WindowsAzure\Blob\Internal\IBlob */ public function createBlobService($connectionString, $endpoint) { $settings = StorageServiceSettings::createFromConnectionString( $connectionString, $endpoint ); $httpClient = $this->httpClient(); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getBlobEndpointUri() ); $blobWrapper = new BlobRestProxy( $httpClient, $uri, $settings->getName(), $serializer ); // Adding headers filter $headers = array( Resources::USER_AGENT => Resources::SDK_USER_AGENT, ); $headers[Resources::X_MS_VERSION] = Resources::STORAGE_API_LATEST_VERSION; $headersFilter = new HeadersFilter($headers); $blobWrapper = $blobWrapper->withFilter($headersFilter); // Adding date filter $dateFilter = new DateFilter(); $blobWrapper = $blobWrapper->withFilter($dateFilter); $authFilter = new AuthenticationFilter( $this->blobAuthenticationScheme( $settings->getName(), $settings->getKey() ) ); $blobWrapper = $blobWrapper->withFilter($authFilter); return $blobWrapper; } /** * Builds a table object. * * @param string $connectionString The configuration connection string. * * @return WindowsAzure\Table\Internal\ITable */ public function createTableService($connectionString) { $settings = StorageServiceSettings::createFromConnectionString( $connectionString ); $httpClient = $this->httpClient(); $atomSerializer = $this->atomSerializer(); $mimeSerializer = $this->mimeSerializer(); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getTableEndpointUri() ); $tableWrapper = new TableRestProxy( $httpClient, $uri, $atomSerializer, $mimeSerializer, $serializer ); // Adding headers filter $headers = array(); $latestServicesVersion = Resources::STORAGE_API_LATEST_VERSION; $currentVersion = Resources::DATA_SERVICE_VERSION_VALUE; $maxVersion = Resources::MAX_DATA_SERVICE_VERSION_VALUE; $accept = Resources::ACCEPT_HEADER_VALUE; $acceptCharset = Resources::ACCEPT_CHARSET_VALUE; $userAgent = Resources::SDK_USER_AGENT; $headers[Resources::X_MS_VERSION] = $latestServicesVersion; $headers[Resources::DATA_SERVICE_VERSION] = $currentVersion; $headers[Resources::MAX_DATA_SERVICE_VERSION] = $maxVersion; $headers[Resources::MAX_DATA_SERVICE_VERSION] = $maxVersion; $headers[Resources::ACCEPT_HEADER] = $accept; $headers[Resources::ACCEPT_CHARSET] = $acceptCharset; $headers[Resources::USER_AGENT] = $userAgent; $headersFilter = new HeadersFilter($headers); $tableWrapper = $tableWrapper->withFilter($headersFilter); // Adding date filter $dateFilter = new DateFilter(); $tableWrapper = $tableWrapper->withFilter($dateFilter); // Adding authentication filter $authFilter = new AuthenticationFilter( $this->tableAuthenticationScheme( $settings->getName(), $settings->getKey() ) ); $tableWrapper = $tableWrapper->withFilter($authFilter); return $tableWrapper; } /** * Builds a Service Bus object. * * @param string $connectionString The configuration connection string. * * @return WindowsAzure\ServiceBus\Internal\IServiceBus */ public function createServiceBusService($connectionString) { $settings = ServiceBusSettings::createFromConnectionString( $connectionString ); $httpClient = $this->httpClient(); $serializer = $this->serializer(); $serviceBusWrapper = new ServiceBusRestProxy( $httpClient, $settings->getServiceBusEndpointUri(), $serializer ); // Adding headers filter $headers = array( Resources::USER_AGENT => Resources::SDK_USER_AGENT, ); $headersFilter = new HeadersFilter($headers); $serviceBusWrapper = $serviceBusWrapper->withFilter($headersFilter); $wrapFilter = new WrapFilter( $settings->getWrapEndpointUri(), $settings->getWrapName(), $settings->getWrapPassword(), $this->createWrapService($settings->getWrapEndpointUri()) ); return $serviceBusWrapper->withFilter($wrapFilter); } /** * Builds a service management object. * * @param string $connectionString The configuration connection string. * * @return WindowsAzure\ServiceManagement\Internal\IServiceManagement */ public function createServiceManagementService($connectionString) { $settings = ServiceManagementSettings::createFromConnectionString( $connectionString ); $certificatePath = $settings->getCertificatePath(); $httpClient = new HttpClient($certificatePath); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getEndpointUri(), Resources::HTTPS_SCHEME ); $serviceManagementWrapper = new ServiceManagementRestProxy( $httpClient, $settings->getSubscriptionId(), $uri, $serializer ); // Adding headers filter $headers = array( Resources::USER_AGENT => Resources::SDK_USER_AGENT ); $headers[Resources::X_MS_VERSION] = Resources::SM_API_LATEST_VERSION; $headersFilter = new HeadersFilter($headers); $serviceManagementWrapper = $serviceManagementWrapper->withFilter( $headersFilter ); return $serviceManagementWrapper; } /** * Builds a media services object. * * @param WindowsAzure\Common\Internal\MediaServicesSettings $settings The media * services configuration settings. * * @return WindowsAzure\MediaServices\Internal\IMediaServices */ public function createMediaServicesService($settings) { Validate::isA( $settings, 'WindowsAzure\Common\Internal\MediaServicesSettings', 'settings' ); $httpClient = new HttpClient(); $serializer = $this->serializer(); $uri = Utilities::tryAddUrlScheme( $settings->getEndpointUri(), Resources::HTTPS_SCHEME ); $mediaServicesWrapper = new MediaServicesRestProxy( $httpClient, $uri, $settings->getAccountName(), $serializer ); // Adding headers filter $xMSVersion = Resources::MEDIA_SERVICES_API_LATEST_VERSION; $dataVersion = Resources::MEDIA_SERVICES_DATA_SERVICE_VERSION_VALUE; $dataMaxVersion = Resources::MEDIA_SERVICES_MAX_DATA_SERVICE_VERSION_VALUE; $accept = Resources::ACCEPT_HEADER_VALUE; $contentType = Resources::ATOM_ENTRY_CONTENT_TYPE; $userAgent = Resources::SDK_USER_AGENT; $headers = array( Resources::X_MS_VERSION => $xMSVersion, Resources::DATA_SERVICE_VERSION => $dataVersion, Resources::MAX_DATA_SERVICE_VERSION => $dataMaxVersion, Resources::ACCEPT_HEADER => $accept, Resources::CONTENT_TYPE => $contentType, Resources::USER_AGENT => $userAgent, ); $headersFilter = new HeadersFilter($headers); $mediaServicesWrapper = $mediaServicesWrapper->withFilter($headersFilter); // Adding OAuth filter $oauthService = new OAuthRestProxy( new HttpClient(), $settings->getOAuthEndpointUri() ); $authentification = new OAuthScheme( $settings->getAccountName(), $settings->getAccessKey(), Resources::OAUTH_GT_CLIENT_CREDENTIALS, Resources::MEDIA_SERVICES_OAUTH_SCOPE, $oauthService ); $authentificationFilter = new AuthenticationFilter($authentification); $mediaServicesWrapper = $mediaServicesWrapper->withFilter( $authentificationFilter ); return $mediaServicesWrapper; } /** * Gets the static instance of this class. * * @return ServicesBuilder */ public static function getInstance() { if (!isset(self::$instance)) { self::$_instance = new ServicesBuilder(); } return self::$_instance; } }PKwL\ԻRp> > =updraftplus/includes/WindowsAzure/Common/ServiceException.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common; use WindowsAzure\Common\Internal\Resources; /** * Fires when the response code is incorrect. * * @category Microsoft * @package WindowsAzure\Common * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class ServiceException extends \LogicException { private $_error; private $_reason; /** * Constructor * * @param string $errorCode status error code. * @param string $error string value of the error code. * @param string $reason detailed message for the error. * * @return WindowsAzure\Common\ServiceException */ public function __construct($errorCode, $error = null, $reason = null) { parent::__construct( sprintf(Resources::AZURE_ERROR_MSG, $errorCode, $error, $reason) ); $this->code = $errorCode; $this->_error = $error; $this->_reason = $reason; } /** * Gets error text. * * @return string */ public function getErrorText() { return $this->_error; } /** * Gets detailed error reason. * * @return string */ public function getErrorReason() { return $this->_reason; } } PKwL\NVVFupdraftplus/includes/WindowsAzure/Common/CloudConfigurationManager.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ namespace WindowsAzure\Common; use WindowsAzure\Common\Internal\Utilities; use WindowsAzure\Common\Internal\Validate; use WindowsAzure\Common\Internal\Resources; use WindowsAzure\Common\Internal\ConnectionStringSource; /** * Configuration manager for accessing Windows Azure settings. * * @category Microsoft * @package WindowsAzure\Common * @author Azure PHP SDK * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @version Release: 0.4.1_2015-03 * @link https://github.com/windowsazure/azure-sdk-for-php */ class CloudConfigurationManager { /** * @var boolean */ private static $_isInitialized = false; /** * The list of connection string sources. * * @var array */ private static $_sources; /** * Restrict users from creating instances from this class */ private function __construct() { } /** * Initializes the connection string source providers. * * @return none */ private static function _init() { if (!self::$_isInitialized) { self::$_sources = array(); // Get list of default connection string sources. $default = ConnectionStringSource::getDefaultSources(); foreach ($default as $name => $provider) { self::$_sources[$name] = $provider; } self::$_isInitialized = true; } } /** * Gets a connection string from all available sources. * * @param string $key The connection string key name. * * @return string If the key does not exist return null. */ public static function getConnectionString($key) { Validate::isString($key, 'key'); self::_init(); $value = null; foreach (self::$_sources as $source) { $value = call_user_func_array($source, array($key)); if (!empty($value)) { break; } } return $value; } /** * Registers a new connection string source provider. If the source to get * registered is a default source, only the name of the source is required. * * @param string $name The source name. * @param callable $provider The source callback. * @param boolean $prepend When true, the $provider is processed first when * calling getConnectionString. When false (the default) the $provider is * processed after the existing callbacks. * * @return none */ public static function registerSource($name, $provider = null, $prepend = false) { Validate::isString($name, 'name'); Validate::notNullOrEmpty($name, 'name'); self::_init(); $default = ConnectionStringSource::getDefaultSources(); // Try to get callback if the user is trying to register a default source. $provider = Utilities::tryGetValue($default, $name, $provider); Validate::notNullOrEmpty($provider, 'callback'); if ($prepend) { self::$_sources = array_merge( array($name => $provider), self::$_sources ); } else { self::$_sources[$name] = $provider; } } /** * Unregisters a connection string source. * * @param string $name The source name. * * @return callable */ public static function unregisterSource($name) { Validate::isString($name, 'name'); Validate::notNullOrEmpty($name, 'name'); self::_init(); $sourceCallback = Utilities::tryGetValue(self::$_sources, $name); if (!is_null($sourceCallback)) { unset(self::$_sources[$name]); } return $sourceCallback; } }PKwL\?1ćć2updraftplus/includes/WindowsAzure/WindowsAzure.phpnu[ * @copyright 2012 Microsoft Corporation * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://github.com/windowsazure/azure-sdk-for-php */ spl_autoload_register( function($class) { static $classes = null; if ($classes === null) { $classes = array( 'windowsazure\\blob\\blobrestproxy' => '/Blob/BlobRestProxy.php', 'windowsazure\\blob\\internal\\iblob' => '/Blob/Internal/IBlob.php', 'windowsazure\\blob\\models\\accesscondition' => '/Blob/Models/AccessCondition.php', 'windowsazure\\blob\\models\\accesspolicy' => '/Blob/Models/AccessPolicy.php', 'windowsazure\\blob\\models\\acquireleaseoptions' => '/Blob/Models/AcquireLeaseOptions.php', 'windowsazure\\blob\\models\\acquireleaseresult' => '/Blob/Models/AcquireLeaseResult.php', 'windowsazure\\blob\\models\\blob' => '/Blob/Models/Blob.php', 'windowsazure\\blob\\models\\blobblocktype' => '/Blob/Models/BlobBlockType.php', 'windowsazure\\blob\\models\\blobprefix' => '/Blob/Models/BlobPrefix.php', 'windowsazure\\blob\\models\\blobproperties' => '/Blob/Models/BlobProperties.php', 'windowsazure\\blob\\models\\blobserviceoptions' => '/Blob/Models/BlobServiceOptions.php', 'windowsazure\\blob\\models\\blobtype' => '/Blob/Models/BlobType.php', 'windowsazure\\blob\\models\\block' => '/Blob/Models/Block.php', 'windowsazure\\blob\\models\\blocklist' => '/Blob/Models/BlockList.php', 'windowsazure\\blob\\models\\breakleaseresult' => '/Blob/Models/BreakLeaseResult.php', 'windowsazure\\blob\\models\\commitblobblocksoptions' => '/Blob/Models/CommitBlobBlocksOptions.php', 'windowsazure\\blob\\models\\container' => '/Blob/Models/Container.php', 'windowsazure\\blob\\models\\containeracl' => '/Blob/Models/ContainerACL.php', 'windowsazure\\blob\\models\\containerproperties' => '/Blob/Models/ContainerProperties.php', 'windowsazure\\blob\\models\\copybloboptions' => '/Blob/Models/CopyBlobOptions.php', 'windowsazure\\blob\\models\\copyblobresult' => '/Blob/Models/CopyBlobResult.php', 'windowsazure\\blob\\models\\createblobblockoptions' => '/Blob/Models/CreateBlobBlockOptions.php', 'windowsazure\\blob\\models\\createbloboptions' => '/Blob/Models/CreateBlobOptions.php', 'windowsazure\\blob\\models\\createblobpagesoptions' => '/Blob/Models/CreateBlobPagesOptions.php', 'windowsazure\\blob\\models\\createblobpagesresult' => '/Blob/Models/CreateBlobPagesResult.php', 'windowsazure\\blob\\models\\createblobsnapshotoptions' => '/Blob/Models/CreateBlobSnapshotOptions.php', 'windowsazure\\blob\\models\\createblobsnapshotresult' => '/Blob/Models/CreateBlobSnapshotResult.php', 'windowsazure\\blob\\models\\createcontaineroptions' => '/Blob/Models/CreateContainerOptions.php', 'windowsazure\\blob\\models\\deletebloboptions' => '/Blob/Models/DeleteBlobOptions.php', 'windowsazure\\blob\\models\\deletecontaineroptions' => '/Blob/Models/DeleteContainerOptions.php', 'windowsazure\\blob\\models\\getblobmetadataoptions' => '/Blob/Models/GetBlobMetadataOptions.php', 'windowsazure\\blob\\models\\getblobmetadataresult' => '/Blob/Models/GetBlobMetadataResult.php', 'windowsazure\\blob\\models\\getbloboptions' => '/Blob/Models/GetBlobOptions.php', 'windowsazure\\blob\\models\\getblobpropertiesoptions' => '/Blob/Models/GetBlobPropertiesOptions.php', 'windowsazure\\blob\\models\\getblobpropertiesresult' => '/Blob/Models/GetBlobPropertiesResult.php', 'windowsazure\\blob\\models\\getblobresult' => '/Blob/Models/GetBlobResult.php', 'windowsazure\\blob\\models\\getcontaineraclresult' => '/Blob/Models/GetContainerACLResult.php', 'windowsazure\\blob\\models\\getcontainerpropertiesresult' => '/Blob/Models/GetContainerPropertiesResult.php', 'windowsazure\\blob\\models\\leasemode' => '/Blob/Models/LeaseMode.php', 'windowsazure\\blob\\models\\listblobblocksoptions' => '/Blob/Models/ListBlobBlocksOptions.php', 'windowsazure\\blob\\models\\listblobblocksresult' => '/Blob/Models/ListBlobBlocksResult.php', 'windowsazure\\blob\\models\\listblobsoptions' => '/Blob/Models/ListBlobsOptions.php', 'windowsazure\\blob\\models\\listblobsresult' => '/Blob/Models/ListBlobsResult.php', 'windowsazure\\blob\\models\\listcontainersoptions' => '/Blob/Models/ListContainersOptions.php', 'windowsazure\\blob\\models\\listcontainersresult' => '/Blob/Models/ListContainersResult.php', 'windowsazure\\blob\\models\\listpageblobrangesoptions' => '/Blob/Models/ListPageBlobRangesOptions.php', 'windowsazure\\blob\\models\\listpageblobrangesresult' => '/Blob/Models/ListPageBlobRangesResult.php', 'windowsazure\\blob\\models\\pagerange' => '/Blob/Models/PageRange.php', 'windowsazure\\blob\\models\\pagewriteoption' => '/Blob/Models/PageWriteOption.php', 'windowsazure\\blob\\models\\publicaccesstype' => '/Blob/Models/PublicAccessType.php', 'windowsazure\\blob\\models\\setblobmetadataoptions' => '/Blob/Models/SetBlobMetadataOptions.php', 'windowsazure\\blob\\models\\setblobmetadataresult' => '/Blob/Models/SetBlobMetadataResult.php', 'windowsazure\\blob\\models\\setblobpropertiesoptions' => '/Blob/Models/SetBlobPropertiesOptions.php', 'windowsazure\\blob\\models\\setblobpropertiesresult' => '/Blob/Models/SetBlobPropertiesResult.php', 'windowsazure\\blob\\models\\setcontainermetadataoptions' => '/Blob/Models/SetContainerMetadataOptions.php', 'windowsazure\\blob\\models\\signedidentifier' => '/Blob/Models/SignedIdentifier.php', 'windowsazure\\common\\cloudconfigurationmanager' => '/Common/CloudConfigurationManager.php', 'windowsazure\\common\\internal\\atom\\atombase' => '/Common/Internal/Atom/AtomBase.php', 'windowsazure\\common\\internal\\atom\\atomlink' => '/Common/Internal/Atom/AtomLink.php', 'windowsazure\\common\\internal\\atom\\category' => '/Common/Internal/Atom/Category.php', 'windowsazure\\common\\internal\\atom\\content' => '/Common/Internal/Atom/Content.php', 'windowsazure\\common\\internal\\atom\\entry' => '/Common/Internal/Atom/Entry.php', 'windowsazure\\common\\internal\\atom\\feed' => '/Common/Internal/Atom/Feed.php', 'windowsazure\\common\\internal\\atom\\generator' => '/Common/Internal/Atom/Generator.php', 'windowsazure\\common\\internal\\atom\\person' => '/Common/Internal/Atom/Person.php', 'windowsazure\\common\\internal\\atom\\source' => '/Common/Internal/Atom/Source.php', 'windowsazure\\common\\internal\\authentication\\iauthscheme' => '/Common/Internal/Authentication/IAuthScheme.php', 'windowsazure\\common\\internal\\authentication\\oauthscheme' => '/Common/Internal/Authentication/OAuthScheme.php', 'windowsazure\\common\\internal\\authentication\\sharedkeyauthscheme' => '/Common/Internal/Authentication/SharedKeyAuthScheme.php', 'windowsazure\\common\\internal\\authentication\\storageauthscheme' => '/Common/Internal/Authentication/StorageAuthScheme.php', 'windowsazure\\common\\internal\\authentication\\tablesharedkeyliteauthscheme' => '/Common/Internal/Authentication/TableSharedKeyLiteAuthScheme.php', 'windowsazure\\common\\internal\\connectionstringparser' => '/Common/Internal/ConnectionStringParser.php', 'windowsazure\\common\\internal\\connectionstringsource' => '/Common/Internal/ConnectionStringSource.php', 'windowsazure\\common\\internal\\filterableservice' => '/Common/Internal/FilterableService.php', 'windowsazure\\common\\internal\\filters\\authenticationfilter' => '/Common/Internal/Filters/AuthenticationFilter.php', 'windowsazure\\common\\internal\\filters\\datefilter' => '/Common/Internal/Filters/DateFilter.php', 'windowsazure\\common\\internal\\filters\\exponentialretrypolicy' => '/Common/Internal/Filters/ExponentialRetryPolicy.php', 'windowsazure\\common\\internal\\filters\\headersfilter' => '/Common/Internal/Filters/HeadersFilter.php', 'windowsazure\\common\\internal\\filters\\retrypolicy' => '/Common/Internal/Filters/RetryPolicy.php', 'windowsazure\\common\\internal\\filters\\retrypolicyfilter' => '/Common/Internal/Filters/RetryPolicyFilter.php', 'windowsazure\\common\\internal\\filters\\wrapfilter' => '/Common/Internal/Filters/WrapFilter.php', 'windowsazure\\common\\internal\\http\\batchrequest' => '/Common/Internal/Http/BatchRequest.php', 'windowsazure\\common\\internal\\http\\batchresponse' => '/Common/Internal/Http/BatchResponse.php', 'windowsazure\\common\\internal\\http\\httpcallcontext' => '/Common/Internal/Http/HttpCallContext.php', 'windowsazure\\common\\internal\\http\\httpclient' => '/Common/Internal/Http/HttpClient.php', 'windowsazure\\common\\internal\\http\\ihttpclient' => '/Common/Internal/Http/IHttpClient.php', 'windowsazure\\common\\internal\\http\\iurl' => '/Common/Internal/Http/IUrl.php', 'windowsazure\\common\\internal\\http\\url' => '/Common/Internal/Http/Url.php', 'windowsazure\\common\\internal\\invalidargumenttypeexception' => '/Common/Internal/InvalidArgumentTypeException.php', 'windowsazure\\common\\internal\\iservicefilter' => '/Common/Internal/IServiceFilter.php', 'windowsazure\\common\\internal\\logger' => '/Common/Internal/Logger.php', 'windowsazure\\common\\internal\\mediaservicessettings' => '/Common/Internal/MediaServicesSettings.php', 'windowsazure\\common\\internal\\oauthrestproxy' => '/Common/Internal/OAuthRestProxy.php', 'windowsazure\\common\\internal\\parserstate' => '/Common/Internal/ConnectionStringParser.php', 'windowsazure\\common\\internal\\resources' => '/Common/Internal/Resources.php', 'windowsazure\\common\\internal\\restproxy' => '/Common/Internal/RestProxy.php', 'windowsazure\\common\\internal\\serialization\\iserializer' => '/Common/Internal/Serialization/ISerializer.php', 'windowsazure\\common\\internal\\serialization\\jsonserializer' => '/Common/Internal/Serialization/JsonSerializer.php', 'windowsazure\\common\\internal\\serialization\\xmlserializer' => '/Common/Internal/Serialization/XmlSerializer.php', 'windowsazure\\common\\internal\\servicebussettings' => '/Common/Internal/ServiceBusSettings.php', 'windowsazure\\common\\internal\\servicemanagementsettings' => '/Common/Internal/ServiceManagementSettings.php', 'windowsazure\\common\\internal\\servicerestproxy' => '/Common/Internal/ServiceRestProxy.php', 'windowsazure\\common\\internal\\servicesettings' => '/Common/Internal/ServiceSettings.php', 'windowsazure\\common\\internal\\storageservicesettings' => '/Common/Internal/StorageServiceSettings.php', 'windowsazure\\common\\internal\\utilities' => '/Common/Internal/Utilities.php', 'windowsazure\\common\\internal\\validate' => '/Common/Internal/Validate.php', 'windowsazure\\common\\models\\getservicepropertiesresult' => '/Common/Models/GetServicePropertiesResult.php', 'windowsazure\\common\\models\\logging' => '/Common/Models/Logging.php', 'windowsazure\\common\\models\\metrics' => '/Common/Models/Metrics.php', 'windowsazure\\common\\models\\oauthaccesstoken' => '/Common/Models/OAuthAccessToken.php', 'windowsazure\\common\\models\\retentionpolicy' => '/Common/Models/RetentionPolicy.php', 'windowsazure\\common\\models\\serviceproperties' => '/Common/Models/ServiceProperties.php', 'windowsazure\\common\\serviceexception' => '/Common/ServiceException.php', 'windowsazure\\common\\servicesbuilder' => '/Common/ServicesBuilder.php', 'windowsazure\\mediaservices\\internal\\contentpropertiesserializer' => '/MediaServices/Internal/ContentPropertiesSerializer.php', 'windowsazure\\mediaservices\\internal\\imediaservices' => '/MediaServices/Internal/IMediaServices.php', 'windowsazure\\mediaservices\\mediaservicesrestproxy' => '/MediaServices/MediaServicesRestProxy.php', 'windowsazure\\mediaservices\\models\\accesspolicy' => '/MediaServices/Models/AccessPolicy.php', 'windowsazure\\mediaservices\\models\\asset' => '/MediaServices/Models/Asset.php', 'windowsazure\\mediaservices\\models\\assetfile' => '/MediaServices/Models/AssetFile.php', 'windowsazure\\mediaservices\\models\\contentkey' => '/MediaServices/Models/ContentKey.php', 'windowsazure\\mediaservices\\models\\contentkeytypes' => '/MediaServices/Models/ContentKeyTypes.php', 'windowsazure\\mediaservices\\models\\encryptionschemes' => '/MediaServices/Models/EncryptionSchemes.php', 'windowsazure\\mediaservices\\models\\errordetail' => '/MediaServices/Models/ErrorDetail.php', 'windowsazure\\mediaservices\\models\\ingestmanifest' => '/MediaServices/Models/IngestManifest.php', 'windowsazure\\mediaservices\\models\\ingestmanifestasset' => '/MediaServices/Models/IngestManifestAsset.php', 'windowsazure\\mediaservices\\models\\ingestmanifestfile' => '/MediaServices/Models/IngestManifestFile.php', 'windowsazure\\mediaservices\\models\\ingestmanifeststatistics' => '/MediaServices/Models/IngestManifestStatistics.php', 'windowsazure\\mediaservices\\models\\job' => '/MediaServices/Models/Job.php', 'windowsazure\\mediaservices\\models\\jobtemplate' => '/MediaServices/Models/JobTemplate.php', 'windowsazure\\mediaservices\\models\\locator' => '/MediaServices/Models/Locator.php', 'windowsazure\\mediaservices\\models\\mediaprocessor' => '/MediaServices/Models/MediaProcessor.php', 'windowsazure\\mediaservices\\models\\protectionkeytypes' => '/MediaServices/Models/ProtectionKeyTypes.php', 'windowsazure\\mediaservices\\models\\storageaccount' => '/MediaServices/Models/StorageAccount.php', 'windowsazure\\mediaservices\\models\\task' => '/MediaServices/Models/Task.php', 'windowsazure\\mediaservices\\models\\taskhistoricalevent' => '/MediaServices/Models/TaskHistoricalEvent.php', 'windowsazure\\mediaservices\\models\\taskoptions' => '/MediaServices/Models/TaskOptions.php', 'windowsazure\\mediaservices\\models\\tasktemplate' => '/MediaServices/Models/TaskTemplate.php', 'windowsazure\\queue\\internal\\iqueue' => '/Queue/Internal/IQueue.php', 'windowsazure\\queue\\models\\createmessageoptions' => '/Queue/Models/CreateMessageOptions.php', 'windowsazure\\queue\\models\\createqueueoptions' => '/Queue/Models/CreateQueueOptions.php', 'windowsazure\\queue\\models\\getqueuemetadataresult' => '/Queue/Models/GetQueueMetadataResult.php', 'windowsazure\\queue\\models\\listmessagesoptions' => '/Queue/Models/ListMessagesOptions.php', 'windowsazure\\queue\\models\\listmessagesresult' => '/Queue/Models/ListMessagesResult.php', 'windowsazure\\queue\\models\\listqueuesoptions' => '/Queue/Models/ListQueuesOptions.php', 'windowsazure\\queue\\models\\listqueuesresult' => '/Queue/Models/ListQueuesResult.php', 'windowsazure\\queue\\models\\peekmessagesoptions' => '/Queue/Models/PeekMessagesOptions.php', 'windowsazure\\queue\\models\\peekmessagesresult' => '/Queue/Models/PeekMessagesResult.php', 'windowsazure\\queue\\models\\queue' => '/Queue/Models/Queue.php', 'windowsazure\\queue\\models\\queuemessage' => '/Queue/Models/QueueMessage.php', 'windowsazure\\queue\\models\\queueserviceoptions' => '/Queue/Models/QueueServiceOptions.php', 'windowsazure\\queue\\models\\updatemessageresult' => '/Queue/Models/UpdateMessageResult.php', 'windowsazure\\queue\\models\\windowsazurequeuemessage' => '/Queue/Models/WindowsAzureQueueMessage.php', 'windowsazure\\queue\\queuerestproxy' => '/Queue/QueueRestProxy.php', 'windowsazure\\servicebus\\internal\\action' => '/ServiceBus/Internal/Action.php', 'windowsazure\\servicebus\\internal\\activetoken' => '/ServiceBus/Internal/ActiveToken.php', 'windowsazure\\servicebus\\internal\\filter' => '/ServiceBus/Internal/Filter.php', 'windowsazure\\servicebus\\internal\\iservicebus' => '/ServiceBus/Internal/IServiceBus.php', 'windowsazure\\servicebus\\internal\\iwrap' => '/ServiceBus/Internal/IWrap.php', 'windowsazure\\servicebus\\internal\\wrapaccesstokenresult' => '/ServiceBus/Internal/WrapAccessTokenResult.php', 'windowsazure\\servicebus\\internal\\wraprestproxy' => '/ServiceBus/Internal/WrapRestProxy.php', 'windowsazure\\servicebus\\internal\\wraptokenmanager' => '/ServiceBus/Internal/WrapTokenManager.php', 'windowsazure\\servicebus\\models\\brokeredmessage' => '/ServiceBus/Models/BrokeredMessage.php', 'windowsazure\\servicebus\\models\\brokerproperties' => '/ServiceBus/Models/BrokerProperties.php', 'windowsazure\\servicebus\\models\\correlationfilter' => '/ServiceBus/Models/CorrelationFilter.php', 'windowsazure\\servicebus\\models\\emptyruleaction' => '/ServiceBus/Models/EmptyRuleAction.php', 'windowsazure\\servicebus\\models\\falsefilter' => '/ServiceBus/Models/FalseFilter.php', 'windowsazure\\servicebus\\models\\listoptions' => '/ServiceBus/Models/ListOptions.php', 'windowsazure\\servicebus\\models\\listqueuesoptions' => '/ServiceBus/Models/ListQueuesOptions.php', 'windowsazure\\servicebus\\models\\listqueuesresult' => '/ServiceBus/Models/ListQueuesResult.php', 'windowsazure\\servicebus\\models\\listrulesoptions' => '/ServiceBus/Models/ListRulesOptions.php', 'windowsazure\\servicebus\\models\\listrulesresult' => '/ServiceBus/Models/ListRulesResult.php', 'windowsazure\\servicebus\\models\\listsubscriptionsoptions' => '/ServiceBus/Models/ListSubscriptionsOptions.php', 'windowsazure\\servicebus\\models\\listsubscriptionsresult' => '/ServiceBus/Models/ListSubscriptionsResult.php', 'windowsazure\\servicebus\\models\\listtopicsoptions' => '/ServiceBus/Models/ListTopicsOptions.php', 'windowsazure\\servicebus\\models\\listtopicsresult' => '/ServiceBus/Models/ListTopicsResult.php', 'windowsazure\\servicebus\\models\\queuedescription' => '/ServiceBus/Models/QueueDescription.php', 'windowsazure\\servicebus\\models\\queueinfo' => '/ServiceBus/Models/QueueInfo.php', 'windowsazure\\servicebus\\models\\receivemessageoptions' => '/ServiceBus/Models/ReceiveMessageOptions.php', 'windowsazure\\servicebus\\models\\receivemode' => '/ServiceBus/Models/ReceiveMode.php', 'windowsazure\\servicebus\\models\\ruledescription' => '/ServiceBus/Models/RuleDescription.php', 'windowsazure\\servicebus\\models\\ruleinfo' => '/ServiceBus/Models/RuleInfo.php', 'windowsazure\\servicebus\\models\\sqlfilter' => '/ServiceBus/Models/SqlFilter.php', 'windowsazure\\servicebus\\models\\sqlruleaction' => '/ServiceBus/Models/SqlRuleAction.php', 'windowsazure\\servicebus\\models\\subscriptiondescription' => '/ServiceBus/Models/SubscriptionDescription.php', 'windowsazure\\servicebus\\models\\subscriptioninfo' => '/ServiceBus/Models/SubscriptionInfo.php', 'windowsazure\\servicebus\\models\\topicdescription' => '/ServiceBus/Models/TopicDescription.php', 'windowsazure\\servicebus\\models\\topicinfo' => '/ServiceBus/Models/TopicInfo.php', 'windowsazure\\servicebus\\models\\truefilter' => '/ServiceBus/Models/TrueFilter.php', 'windowsazure\\servicebus\\servicebusrestproxy' => '/ServiceBus/ServiceBusRestProxy.php', 'windowsazure\\servicemanagement\\internal\\iservicemanagement' => '/ServiceManagement/Internal/IServiceManagement.php', 'windowsazure\\servicemanagement\\internal\\service' => '/ServiceManagement/Internal/Service.php', 'windowsazure\\servicemanagement\\internal\\windowsazureservice' => '/ServiceManagement/Internal/WindowsAzureService.php', 'windowsazure\\servicemanagement\\models\\affinitygroup' => '/ServiceManagement/Models/AffinityGroup.php', 'windowsazure\\servicemanagement\\models\\asynchronousoperationresult' => '/ServiceManagement/Models/AsynchronousOperationResult.php', 'windowsazure\\servicemanagement\\models\\changedeploymentconfigurationoptions' => '/ServiceManagement/Models/ChangeDeploymentConfigurationOptions.php', 'windowsazure\\servicemanagement\\models\\createaffinitygroupoptions' => '/ServiceManagement/Models/CreateAffinityGroupOptions.php', 'windowsazure\\servicemanagement\\models\\createdeploymentoptions' => '/ServiceManagement/Models/CreateDeploymentOptions.php', 'windowsazure\\servicemanagement\\models\\createserviceoptions' => '/ServiceManagement/Models/CreateServiceOptions.php', 'windowsazure\\servicemanagement\\models\\deployment' => '/ServiceManagement/Models/Deployment.php', 'windowsazure\\servicemanagement\\models\\deploymentslot' => '/ServiceManagement/Models/DeploymentSlot.php', 'windowsazure\\servicemanagement\\models\\deploymentstatus' => '/ServiceManagement/Models/DeploymentStatus.php', 'windowsazure\\servicemanagement\\models\\getaffinitygrouppropertiesresult' => '/ServiceManagement/Models/GetAffinityGroupPropertiesResult.php', 'windowsazure\\servicemanagement\\models\\getdeploymentoptions' => '/ServiceManagement/Models/GetDeploymentOptions.php', 'windowsazure\\servicemanagement\\models\\getdeploymentresult' => '/ServiceManagement/Models/GetDeploymentResult.php', 'windowsazure\\servicemanagement\\models\\gethostedservicepropertiesoptions' => '/ServiceManagement/Models/GetHostedServicePropertiesOptions.php', 'windowsazure\\servicemanagement\\models\\gethostedservicepropertiesresult' => '/ServiceManagement/Models/GetHostedServicePropertiesResult.php', 'windowsazure\\servicemanagement\\models\\getoperationstatusresult' => '/ServiceManagement/Models/GetOperationStatusResult.php', 'windowsazure\\servicemanagement\\models\\getstorageservicekeysresult' => '/ServiceManagement/Models/GetStorageServiceKeysResult.php', 'windowsazure\\servicemanagement\\models\\getstorageservicepropertiesresult' => '/ServiceManagement/Models/GetStorageServicePropertiesResult.php', 'windowsazure\\servicemanagement\\models\\hostedservice' => '/ServiceManagement/Models/HostedService.php', 'windowsazure\\servicemanagement\\models\\inputendpoint' => '/ServiceManagement/Models/InputEndpoint.php', 'windowsazure\\servicemanagement\\models\\keytype' => '/ServiceManagement/Models/KeyType.php', 'windowsazure\\servicemanagement\\models\\listaffinitygroupsresult' => '/ServiceManagement/Models/ListAffinityGroupsResult.php', 'windowsazure\\servicemanagement\\models\\listhostedservicesresult' => '/ServiceManagement/Models/ListHostedServicesResult.php', 'windowsazure\\servicemanagement\\models\\listlocationsresult' => '/ServiceManagement/Models/ListLocationsResult.php', 'windowsazure\\servicemanagement\\models\\liststorageservicesresult' => '/ServiceManagement/Models/ListStorageServicesResult.php', 'windowsazure\\servicemanagement\\models\\location' => '/ServiceManagement/Models/Location.php', 'windowsazure\\servicemanagement\\models\\mode' => '/ServiceManagement/Models/Mode.php', 'windowsazure\\servicemanagement\\models\\operationstatus' => '/ServiceManagement/Models/OperationStatus.php', 'windowsazure\\servicemanagement\\models\\role' => '/ServiceManagement/Models/Role.php', 'windowsazure\\servicemanagement\\models\\roleinstance' => '/ServiceManagement/Models/RoleInstance.php', 'windowsazure\\servicemanagement\\models\\storageservice' => '/ServiceManagement/Models/StorageService.php', 'windowsazure\\servicemanagement\\models\\updateserviceoptions' => '/ServiceManagement/Models/UpdateServiceOptions.php', 'windowsazure\\servicemanagement\\models\\upgradedeploymentoptions' => '/ServiceManagement/Models/UpgradeDeploymentOptions.php', 'windowsazure\\servicemanagement\\models\\upgradestatus' => '/ServiceManagement/Models/UpgradeStatus.php', 'windowsazure\\servicemanagement\\servicemanagementrestproxy' => '/ServiceManagement/ServiceManagementRestProxy.php', 'windowsazure\\serviceruntime\\internal\\acquirecurrentstate' => '/ServiceRuntime/Internal/AcquireCurrentState.php', 'windowsazure\\serviceruntime\\internal\\channelnotavailableexception' => '/ServiceRuntime/Internal/ChannelNotAvailableException.php', 'windowsazure\\serviceruntime\\internal\\chunkedgoalstatedeserializer' => '/ServiceRuntime/Internal/ChunkedGoalStateDeserializer.php', 'windowsazure\\serviceruntime\\internal\\currentstate' => '/ServiceRuntime/Internal/CurrentState.php', 'windowsazure\\serviceruntime\\internal\\currentstatus' => '/ServiceRuntime/Internal/CurrentStatus.php', 'windowsazure\\serviceruntime\\internal\\fileinputchannel' => '/ServiceRuntime/Internal/FileInputChannel.php', 'windowsazure\\serviceruntime\\internal\\fileoutputchannel' => '/ServiceRuntime/Internal/FileOutputChannel.php', 'windowsazure\\serviceruntime\\internal\\goalstate' => '/ServiceRuntime/Internal/GoalState.php', 'windowsazure\\serviceruntime\\internal\\icurrentstateserializer' => '/ServiceRuntime/Internal/ICurrentStateSerializer.php', 'windowsazure\\serviceruntime\\internal\\igoalstatedeserializer' => '/ServiceRuntime/Internal/IGoalStateDeserializer.php', 'windowsazure\\serviceruntime\\internal\\iinputchannel' => '/ServiceRuntime/Internal/IInputChannel.php', 'windowsazure\\serviceruntime\\internal\\ioutputchannel' => '/ServiceRuntime/Internal/IOutputChannel.php', 'windowsazure\\serviceruntime\\internal\\iroleenvironmentchange' => '/ServiceRuntime/Internal/IRoleEnvironmentChange.php', 'windowsazure\\serviceruntime\\internal\\iroleenvironmentdatadeserializer' => '/ServiceRuntime/Internal/IRoleEnvironmentDataDeserializer.php', 'windowsazure\\serviceruntime\\internal\\iruntimeclient' => '/ServiceRuntime/Internal/IRuntimeClient.php', 'windowsazure\\serviceruntime\\internal\\iruntimeclientfactory' => '/ServiceRuntime/Internal/IRuntimeClientFactory.php', 'windowsazure\\serviceruntime\\internal\\iruntimecurrentstateclient' => '/ServiceRuntime/Internal/IRuntimeCurrentStateClient.php', 'windowsazure\\serviceruntime\\internal\\iruntimegoalstateclient' => '/ServiceRuntime/Internal/IRuntimeGoalStateClient.php', 'windowsazure\\serviceruntime\\internal\\localresource' => '/ServiceRuntime/Internal/LocalResource.php', 'windowsazure\\serviceruntime\\internal\\protocol1runtimeclient' => '/ServiceRuntime/Internal/Protocol1RuntimeClient.php', 'windowsazure\\serviceruntime\\internal\\protocol1runtimeclientfactory' => '/ServiceRuntime/Internal/Protocol1RuntimeClientFactory.php', 'windowsazure\\serviceruntime\\internal\\protocol1runtimecurrentstateclient' => '/ServiceRuntime/Internal/Protocol1RuntimeCurrentStateClient.php', 'windowsazure\\serviceruntime\\internal\\protocol1runtimegoalstateclient' => '/ServiceRuntime/Internal/Protocol1RuntimeGoalStateClient.php', 'windowsazure\\serviceruntime\\internal\\releasecurrentstate' => '/ServiceRuntime/Internal/ReleaseCurrentState.php', 'windowsazure\\serviceruntime\\internal\\role' => '/ServiceRuntime/Internal/Role.php', 'windowsazure\\serviceruntime\\internal\\roleenvironmentconfigurationsettingchange' => '/ServiceRuntime/Internal/RoleEnvironmentConfigurationSettingChange.php', 'windowsazure\\serviceruntime\\internal\\roleenvironmentdata' => '/ServiceRuntime/Internal/RoleEnvironmentData.php', 'windowsazure\\serviceruntime\\internal\\roleenvironmentnotavailableexception' => '/ServiceRuntime/Internal/RoleEnvironmentNotAvailableException.php', 'windowsazure\\serviceruntime\\internal\\roleenvironmenttopologychange' => '/ServiceRuntime/Internal/RoleEnvironmentTopologyChange.php', 'windowsazure\\serviceruntime\\internal\\roleinstance' => '/ServiceRuntime/Internal/RoleInstance.php', 'windowsazure\\serviceruntime\\internal\\roleinstanceendpoint' => '/ServiceRuntime/Internal/RoleInstanceEndpoint.php', 'windowsazure\\serviceruntime\\internal\\roleinstancestatus' => '/ServiceRuntime/Internal/RoleInstanceStatus.php', 'windowsazure\\serviceruntime\\internal\\runtimekernel' => '/ServiceRuntime/Internal/RuntimeKernel.php', 'windowsazure\\serviceruntime\\internal\\runtimeversionmanager' => '/ServiceRuntime/Internal/RuntimeVersionManager.php', 'windowsazure\\serviceruntime\\internal\\runtimeversionprotocolclient' => '/ServiceRuntime/Internal/RuntimeVersionProtocolClient.php', 'windowsazure\\serviceruntime\\internal\\xmlcurrentstateserializer' => '/ServiceRuntime/Internal/XmlCurrentStateSerializer.php', 'windowsazure\\serviceruntime\\internal\\xmlgoalstatedeserializer' => '/ServiceRuntime/Internal/XmlGoalStateDeserializer.php', 'windowsazure\\serviceruntime\\internal\\xmlroleenvironmentdatadeserializer' => '/ServiceRuntime/Internal/XmlRoleEnvironmentDataDeserializer.php', 'windowsazure\\serviceruntime\\roleenvironment' => '/ServiceRuntime/RoleEnvironment.php', 'windowsazure\\table\\internal\\atomreaderwriter' => '/Table/Internal/AtomReaderWriter.php', 'windowsazure\\table\\internal\\iatomreaderwriter' => '/Table/Internal/IAtomReaderWriter.php', 'windowsazure\\table\\internal\\imimereaderwriter' => '/Table/Internal/IMimeReaderWriter.php', 'windowsazure\\table\\internal\\itable' => '/Table/Internal/ITable.php', 'windowsazure\\table\\internal\\mimereaderwriter' => '/Table/Internal/MimeReaderWriter.php', 'windowsazure\\table\\models\\batcherror' => '/Table/Models/BatchError.php', 'windowsazure\\table\\models\\batchoperation' => '/Table/Models/BatchOperation.php', 'windowsazure\\table\\models\\batchoperationparametername' => '/Table/Models/BatchOperationParameterName.php', 'windowsazure\\table\\models\\batchoperations' => '/Table/Models/BatchOperations.php', 'windowsazure\\table\\models\\batchoperationtype' => '/Table/Models/BatchOperationType.php', 'windowsazure\\table\\models\\batchresult' => '/Table/Models/BatchResult.php', 'windowsazure\\table\\models\\deleteentityoptions' => '/Table/Models/DeleteEntityOptions.php', 'windowsazure\\table\\models\\edmtype' => '/Table/Models/EdmType.php', 'windowsazure\\table\\models\\entity' => '/Table/Models/Entity.php', 'windowsazure\\table\\models\\filters\\binaryfilter' => '/Table/Models/Filters/BinaryFilter.php', 'windowsazure\\table\\models\\filters\\constantfilter' => '/Table/Models/Filters/ConstantFilter.php', 'windowsazure\\table\\models\\filters\\filter' => '/Table/Models/Filters/Filter.php', 'windowsazure\\table\\models\\filters\\propertynamefilter' => '/Table/Models/Filters/PropertyNameFilter.php', 'windowsazure\\table\\models\\filters\\querystringfilter' => '/Table/Models/Filters/QueryStringFilter.php', 'windowsazure\\table\\models\\filters\\unaryfilter' => '/Table/Models/Filters/UnaryFilter.php', 'windowsazure\\table\\models\\getentityresult' => '/Table/Models/GetEntityResult.php', 'windowsazure\\table\\models\\gettableresult' => '/Table/Models/GetTableResult.php', 'windowsazure\\table\\models\\insertentityresult' => '/Table/Models/InsertEntityResult.php', 'windowsazure\\table\\models\\property' => '/Table/Models/Property.php', 'windowsazure\\table\\models\\query' => '/Table/Models/Query.php', 'windowsazure\\table\\models\\queryentitiesoptions' => '/Table/Models/QueryEntitiesOptions.php', 'windowsazure\\table\\models\\queryentitiesresult' => '/Table/Models/QueryEntitiesResult.php', 'windowsazure\\table\\models\\querytablesoptions' => '/Table/Models/QueryTablesOptions.php', 'windowsazure\\table\\models\\querytablesresult' => '/Table/Models/QueryTablesResult.php', 'windowsazure\\table\\models\\tableserviceoptions' => '/Table/Models/TableServiceOptions.php', 'windowsazure\\table\\models\\updateentityresult' => '/Table/Models/UpdateEntityResult.php', 'windowsazure\\table\\tablerestproxy' => '/Table/TableRestProxy.php' ); } $cn = strtolower($class); if (isset($classes[$cn])) { require __DIR__ . $classes[$cn]; } } ); PKwL\8OO.updraftplus/includes/blockui/jquery.blockUI.jsnu[/*! * jQuery blockUI plugin * Version 2.71.0-2020.12.08 * Requires jQuery v1.12 or later * * Examples at: http://malsup.com/jquery/block/ * Copyright (c) 2007-2013 M. Alsup * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Thanks to Amir-Hossein Sobhi for some excellent contributions! */ ;(function() { /*jshint eqeqeq:false curly:false latedef:false */ "use strict"; function setup($) { var migrateDeduplicateWarnings = jQuery.migrateDeduplicateWarnings || false; jQuery.migrateDeduplicateWarnings = false; $.fn._fadeIn = $.fn.fadeIn; var noOp = $.noop || function() {}; // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle // confusing userAgent strings on Vista) var msie = /MSIE/.test(navigator.userAgent); var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent); var mode = document.documentMode || 0; var setExpr = "function" === typeof document.createElement('div').style.setExpression; // global $ methods for blocking/unblocking the entire page $.blockUI = function(opts) { install(window, opts); }; $.unblockUI = function(opts) { remove(window, opts); }; // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) $.growlUI = function(title, message, timeout, onClose) { var $m = $('

'); if (title) $m.append('

'+title+'

'); if (message) $m.append('

'+message+'

'); if (timeout === undefined) timeout = 3000; // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications var callBlock = function(opts) { opts = opts || {}; $.blockUI({ message: $m, fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700, fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000, timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout, centerY: false, showOverlay: false, onUnblock: onClose, css: $.blockUI.defaults.growlCSS }); }; callBlock(); var nonmousedOpacity = $m.css('opacity'); $m.on('mouseover', function() { callBlock({ fadeIn: 0, timeout: 30000 }); var displayBlock = $('.blockMsg'); displayBlock.stop(); // cancel fadeout if it has started displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency }).on('mouseout', function() { $('.blockMsg').fadeOut(1000); }); // End konapun additions }; // plugin method for blocking element content $.fn.block = function(opts) { if ( this[0] === window ) { $.blockUI( opts ); return this; } var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); this.each(function() { var $el = $(this); if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) return; $el.unblock({ fadeOut: 0 }); }); return this.each(function() { if ($.css(this,'position') == 'static') { this.style.position = 'relative'; $(this).data('blockUI.static', true); } this.style.zoom = 1; // force 'hasLayout' in ie install(this, opts); }); }; // plugin method for unblocking element content $.fn.unblock = function(opts) { if ( this[0] === window ) { $.unblockUI( opts ); return this; } return this.each(function() { remove(this, opts); }); }; $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost! // override these in your code to change the default behavior and style $.blockUI.defaults = { // message displayed when blocking (use null for no message) message: '

Please wait...

', title: null, // title string; only used when theme == true draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) theme: false, // set to true to use with jQuery UI themes // styles for the message when blocking; if you wish to disable // these and use an external stylesheet then do this in your code: // $.blockUI.defaults.css = {}; css: { padding: 0, margin: 0, width: '30%', top: '40%', left: '35%', textAlign: 'center', color: '#000', border: '3px solid #aaa', backgroundColor:'#fff', cursor: 'wait' }, // minimal style set used when themes are used themedCSS: { width: '30%', top: '40%', left: '35%' }, // styles for the overlay overlayCSS: { backgroundColor: '#000', opacity: 0.6, cursor: 'wait' }, // style to replace wait cursor before unblocking to correct issue // of lingering wait cursor cursorReset: 'default', // styles applied when using $.growlUI growlCSS: { width: '350px', top: '10px', left: '', right: '10px', border: 'none', padding: '5px', opacity: 0.6, cursor: 'default', color: '#fff', backgroundColor: '#000', '-webkit-border-radius':'10px', '-moz-border-radius': '10px', 'border-radius': '10px' }, // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w // (hat tip to Jorge H. N. de Vasconcelos) /*jshint scripturl:true */ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', // force usage of iframe in non-IE browsers (handy for blocking applets) forceIframe: false, // z-index for the blocking overlay baseZ: 1000, // set these to true to have the message automatically centered centerX: true, // <-- only effects element blocking (page block controlled via css above) centerY: true, // allow body element to be stetched in ie6; this makes blocking look better // on "short" pages. disable if you wish to prevent changes to the body height allowBodyStretch: true, // enable if you want key and mouse events to be disabled for content that is blocked bindEvents: true, // be default blockUI will suppress tab navigation from leaving blocking content // (if bindEvents is true) constrainTabKey: true, // fadeIn time in millis; set to 0 to disable fadeIn on block fadeIn: 200, // fadeOut time in millis; set to 0 to disable fadeOut on unblock fadeOut: 400, // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock timeout: 0, // disable if you don't want to show the overlay showOverlay: true, // if true, focus will be placed in the first available input field when // page blocking focusInput: true, // elements that can receive focus focusableElements: ':input:enabled:visible', // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) // no longer needed in 2012 // applyPlatformOpacityRules: true, // callback method invoked when fadeIn has completed and blocking message is visible onBlock: null, // callback method invoked when unblocking has completed; the callback is // passed the element that has been unblocked (which is the window object for page // blocks) and the options that were passed to the unblock call: // onUnblock(element, options) onUnblock: null, // callback method invoked when the overlay area is clicked. // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used. onOverlayClick: null, // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 quirksmodeOffsetHack: 4, // class name of the message block blockMsgClass: 'blockMsg', // if it is already blocked, then ignore it (don't unblock and reblock) ignoreIfBlocked: false }; // private data and functions follow... var pageBlock = null; var pageBlockEls = []; function install(el, opts) { var css, themedCSS; var full = (el == window); var msg = (opts && opts.message !== undefined ? opts.message : undefined); opts = $.extend({}, $.blockUI.defaults, opts || {}); if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) return; opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); if (opts.onOverlayClick) opts.overlayCSS.cursor = 'pointer'; themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); msg = msg === undefined ? opts.message : msg; // remove the current block (if there is one) if (full && pageBlock) remove(window, {fadeOut:0}); // if an existing element is being used as the blocking content then we capture // its current place in the DOM (and current display style) so we can restore // it when we unblock if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { var node = msg.jquery ? msg[0] : msg; var data = {}; $(el).data('blockUI.history', data); data.el = node; data.parent = node.parentNode; data.display = node.style.display; data.position = node.style.position; if (data.parent) data.parent.removeChild(node); } $(el).data('blockUI.onUnblock', opts.onUnblock); var z = opts.baseZ; // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; // layer1 is the iframe layer which is used to suppress bleed through of underlying content // layer2 is the overlay layer which has opacity and a wait cursor (by default) // layer3 is the message content that is displayed while blocking var lyr1, lyr2, lyr3, s; if (msie || opts.forceIframe) lyr1 = $(''); else lyr1 = $(''); if (opts.theme) lyr2 = $(''); else lyr2 = $(''); if (opts.theme && full) { s = ''; } else if (opts.theme) { s = ''; } else if (full) { s = ''; } else { s = ''; } lyr3 = $(s); // if we have a message, style it if (msg) { if (opts.theme) { lyr3.css(themedCSS); lyr3.addClass('ui-widget-content'); } else lyr3.css(css); } // style the overlay if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) lyr2.css(opts.overlayCSS); lyr2.css('position', full ? 'fixed' : 'absolute'); // make iframe layer transparent in IE if (msie || opts.forceIframe) lyr1.css('opacity',0.0); //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); $.each(layers, function() { this.appendTo($par); }); if (opts.theme && opts.draggable && $.fn.draggable) { lyr3.draggable({ handle: '.ui-dialog-titlebar', cancel: 'li' }); } // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) var expr = setExpr && ( "CSS1Compat" !== document.compatMode || $('object,embed', full ? null : el).length > 0); if (ie6 || expr) { // give body 100% height if (full && opts.allowBodyStretch && "CSS1Compat" === document.compatMode) $('html,body').css('height','100%'); // fix ie6 issue when blocked element has a border width if ((ie6 || "CSS1Compat" !== document.compatMode) && !full) { var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); var fixT = t ? '(0 - '+t+')' : 0; var fixL = l ? '(0 - '+l+')' : 0; } // simulate fixed position $.each(layers, function(i,o) { var s = o[0].style; s.position = 'absolute'; if (i < 2) { if (full) s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - ("CSS1Compat" === document.compatMode?0:'+opts.quirksmodeOffsetHack+') + "px"'); else s.setExpression('height','this.parentNode.offsetHeight + "px"'); if (full) s.setExpression('width','"CSS1Compat" === document.compatMode && document.documentElement.clientWidth || document.body.clientWidth + "px"'); else s.setExpression('width','this.parentNode.offsetWidth + "px"'); if (fixL) s.setExpression('left', fixL); if (fixT) s.setExpression('top', fixT); } else if (opts.centerY) { if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); s.marginTop = 0; } else if (!opts.centerY && full) { var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; s.setExpression('top',expression); } }); } // show the message if (msg) { if (opts.theme) lyr3.find('.ui-widget-content').append(msg); else lyr3.append(msg); if (msg.jquery || msg.nodeType) $(msg).show(); } if ((msie || opts.forceIframe) && opts.showOverlay) lyr1.show(); // opacity is zero if (opts.fadeIn) { var cb = opts.onBlock ? opts.onBlock : noOp; var cb1 = (opts.showOverlay && !msg) ? cb : noOp; var cb2 = msg ? cb : noOp; if (opts.showOverlay) lyr2._fadeIn(opts.fadeIn, cb1); if (msg) lyr3._fadeIn(opts.fadeIn, cb2); } else { if (opts.showOverlay) lyr2.show(); if (msg) lyr3.show(); if (opts.onBlock) opts.onBlock.bind(lyr3)(); } // bind key and mouse events bind(1, el, opts); if (full) { pageBlock = lyr3[0]; pageBlockEls = $(opts.focusableElements,pageBlock); if (opts.focusInput) setTimeout(focus, 20); } else center(lyr3[0], opts.centerX, opts.centerY); if (opts.timeout) { // auto-unblock var to = setTimeout(function() { if (full) $.unblockUI(opts); else $(el).unblock(opts); }, opts.timeout); $(el).data('blockUI.timeout', to); } } // remove the block function remove(el, opts) { var count; var full = (el == window); var $el = $(el); var data = $el.data('blockUI.history'); var to = $el.data('blockUI.timeout'); if (to) { clearTimeout(to); $el.removeData('blockUI.timeout'); } opts = $.extend({}, $.blockUI.defaults, opts || {}); bind(0, el, opts); // unbind events if (opts.onUnblock === null) { opts.onUnblock = $el.data('blockUI.onUnblock'); $el.removeData('blockUI.onUnblock'); } var els; if (full) // crazy selector to handle odd field errors in ie6/7 els = $('body').children().filter('.blockUI').add('body > .blockUI'); else els = $el.find('>.blockUI'); // fix cursor issue if ( opts.cursorReset ) { if ( els.length > 1 ) els[1].style.cursor = opts.cursorReset; if ( els.length > 2 ) els[2].style.cursor = opts.cursorReset; } if (full) pageBlock = pageBlockEls = null; if (opts.fadeOut) { count = els.length; els.stop().fadeOut(opts.fadeOut, function() { if ( --count === 0) reset(els,data,opts,el); }); } else reset(els, data, opts, el); } // move blocking element back into the DOM where it started function reset(els,data,opts,el) { var $el = $(el); if ( $el.data('blockUI.isBlocked') ) return; els.each(function(i,o) { // remove via DOM calls so we don't lose event handlers if (this.parentNode) this.parentNode.removeChild(this); }); if (data && data.el) { data.el.style.display = data.display; data.el.style.position = data.position; data.el.style.cursor = 'default'; // #59 if (data.parent) data.parent.appendChild(data.el); $el.removeData('blockUI.history'); } if ($el.data('blockUI.static')) { $el.css('position', 'static'); // #22 } if (typeof opts.onUnblock == 'function') opts.onUnblock(el,opts); // fix issue in Safari 6 where block artifacts remain until reflow var body = $(document.body), w = body.width(), cssW = body[0].style.width; body.width(w-1).width(w); body[0].style.width = cssW; } // bind/unbind the handler function bind(b, el, opts) { var full = el == window, $el = $(el); // don't bother unbinding if there is nothing to unbind if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) return; $el.data('blockUI.isBlocked', b); // don't bind events when overlay is not in use or if bindEvents is false if (!full || !opts.bindEvents || (b && !opts.showOverlay)) return; // bind anchors and inputs for mouse and key events var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; if (b) $(document).on(events, opts, handler); else $(document).off(events, handler); // former impl... // var $e = $('a,:input'); // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); } // event handler to suppress keyboard/mouse events when blocking function handler(e) { // allow tab navigation (conditionally) if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { if (pageBlock && e.data.constrainTabKey) { var els = pageBlockEls; var fwd = !e.shiftKey && e.target === els[els.length-1]; var back = e.shiftKey && e.target === els[0]; if (fwd || back) { setTimeout(function(){focus(back);},10); return false; } } } var opts = e.data; var target = $(e.target); if (target.hasClass('blockOverlay') && opts.onOverlayClick) opts.onOverlayClick(e); // allow events within the message content if (target.parents('div.' + opts.blockMsgClass).length > 0) return true; // allow events for content that is not being blocked return target.parents().children().filter('div.blockUI').length === 0; } function focus(back) { if (!pageBlockEls) return; var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; if (e) e.focus(); } function center(el, x, y) { var p = el.parentNode, s = el.style; var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); if (x) s.left = l > 0 ? (l+'px') : '0'; if (y) s.top = t > 0 ? (t+'px') : '0'; } function sz(el, p) { return parseInt($.css(el,p),10)||0; } jQuery.migrateDeduplicateWarnings = migrateDeduplicateWarnings; } /*global define:true */ if (typeof define === 'function' && define.amd && define.amd.jQuery) { define(['jquery'], setup); } else { setup(jQuery); } })(); PKwL\7`##9updraftplus/includes/blockui/jquery.blockUI-2-23-7.min.jsnu[!function(){"use strict";function e(p){var e=jQuery.migrateDeduplicateWarnings||!1,b=(jQuery.migrateDeduplicateWarnings=!1,p.fn._fadeIn=p.fn.fadeIn,p.noop||function(){}),h=/MSIE/.test(navigator.userAgent),m=/MSIE 6.0/.test(navigator.userAgent)&&!/MSIE 8.0/.test(navigator.userAgent),k=(document.documentMode,"function"==typeof document.createElement("div").style.setExpression),y=(p.blockUI=function(e){o(window,e)},p.unblockUI=function(e){v(window,e)},p.growlUI=function(e,t,o,n){function i(e){p.blockUI({message:s,fadeIn:void 0!==(e=e||{}).fadeIn?e.fadeIn:700,fadeOut:void 0!==e.fadeOut?e.fadeOut:1e3,timeout:void 0!==e.timeout?e.timeout:o,centerY:!1,showOverlay:!1,onUnblock:n,css:p.blockUI.defaults.growlCSS})}var s=p('
');e&&s.append("

"+e+"

"),t&&s.append("

"+t+"

"),void 0===o&&(o=3e3),i(),s.css("opacity");s.on("mouseover",function(){i({fadeIn:0,timeout:3e4});var e=p(".blockMsg");e.stop(),e.fadeTo(300,1)}).on("mouseout",function(){p(".blockMsg").fadeOut(1e3)})},p.fn.block=function(e){var t;return this[0]===window?(p.blockUI(e),this):(t=p.extend({},p.blockUI.defaults,e||{}),this.each(function(){var e=p(this);t.ignoreIfBlocked&&e.data("blockUI.isBlocked")||e.unblock({fadeOut:0})}),this.each(function(){"static"==p.css(this,"position")&&(this.style.position="relative",p(this).data("blockUI.static",!0)),this.style.zoom=1,o(this,e)}))},p.fn.unblock=function(e){return this[0]===window?(p.unblockUI(e),this):this.each(function(){v(this,e)})},p.blockUI.version=2.7,p.blockUI.defaults={message:"

Please wait...

",title:null,draggable:!0,theme:!1,css:{padding:0,margin:0,width:"30%",top:"40%",left:"35%",textAlign:"center",color:"#000",border:"3px solid #aaa",backgroundColor:"#fff",cursor:"wait"},themedCSS:{width:"30%",top:"40%",left:"35%"},overlayCSS:{backgroundColor:"#000",opacity:.6,cursor:"wait"},cursorReset:"default",growlCSS:{width:"350px",top:"10px",left:"",right:"10px",border:"none",padding:"5px",opacity:.6,cursor:"default",color:"#fff",backgroundColor:"#000","-webkit-border-radius":"10px","-moz-border-radius":"10px","border-radius":"10px"},iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank",forceIframe:!1,baseZ:1e3,centerX:!0,centerY:!0,allowBodyStretch:!0,bindEvents:!0,constrainTabKey:!0,fadeIn:200,fadeOut:400,timeout:0,showOverlay:!0,focusInput:!0,focusableElements:":input:enabled:visible",onBlock:null,onUnblock:null,onOverlayClick:null,quirksmodeOffsetHack:4,blockMsgClass:"blockMsg",ignoreIfBlocked:!1},null),g=[];function o(e,o){var n=e==window,t=o&&void 0!==o.message?o.message:void 0;if(!(o=p.extend({},p.blockUI.defaults,o||{})).ignoreIfBlocked||!p(e).data("blockUI.isBlocked")){o.overlayCSS=p.extend({},p.blockUI.defaults.overlayCSS,o.overlayCSS||{}),f=p.extend({},p.blockUI.defaults.css,o.css||{}),o.onOverlayClick&&(o.overlayCSS.cursor="pointer"),u=p.extend({},p.blockUI.defaults.themedCSS,o.themedCSS||{}),t=void 0===t?o.message:t,n&&y&&v(window,{fadeOut:0}),t&&"string"!=typeof t&&(t.parentNode||t.jquery)&&(a=t.jquery?t[0]:t,l={},p(e).data("blockUI.history",l),l.el=a,l.parent=a.parentNode,l.display=a.style.display,l.position=a.style.position,l.parent)&&l.parent.removeChild(a),p(e).data("blockUI.onUnblock",o.onUnblock);var i,s,l=o.baseZ,a=h||o.forceIframe?p(''):p(''),d=o.theme?p(''):p(''),c=(o.theme&&n?(c=''):o.theme?(c=''):c=n?'':'',l=p(c),t&&(o.theme?(l.css(u),l.addClass("ui-widget-content")):l.css(f)),o.theme||d.css(o.overlayCSS),d.css("position",n?"fixed":"absolute"),(h||o.forceIframe)&&a.css("opacity",0),[a,d,l]),r=p(n?"body":e),u=(p.each(c,function(){this.appendTo(r)}),o.theme&&o.draggable&&p.fn.draggable&&l.draggable({handle:".ui-dialog-titlebar",cancel:"li"}),k&&("CSS1Compat"!==document.compatMode||0 .blockUI"):s.find(">.blockUI"),t.cursorReset&&(1

');e&&s.append("

"+e+"

"),t&&s.append("

"+t+"

"),void 0===o&&(o=3e3),i(),s.css("opacity");s.on("mouseover",function(){i({fadeIn:0,timeout:3e4});var e=p(".blockMsg");e.stop(),e.fadeTo(300,1)}).on("mouseout",function(){p(".blockMsg").fadeOut(1e3)})},p.fn.block=function(e){if(this[0]===window)return p.blockUI(e),this;var t=p.extend({},p.blockUI.defaults,e||{});return this.each(function(){var e=p(this);t.ignoreIfBlocked&&e.data("blockUI.isBlocked")||e.unblock({fadeOut:0})}),this.each(function(){"static"==p.css(this,"position")&&(this.style.position="relative",p(this).data("blockUI.static",!0)),this.style.zoom=1,o(this,e)})},p.fn.unblock=function(e){return this[0]===window?(p.unblockUI(e),this):this.each(function(){g(this,e)})},p.blockUI.version=2.7,p.blockUI.defaults={message:"

Please wait...

",title:null,draggable:!0,theme:!1,css:{padding:0,margin:0,width:"30%",top:"40%",left:"35%",textAlign:"center",color:"#000",border:"3px solid #aaa",backgroundColor:"#fff",cursor:"wait"},themedCSS:{width:"30%",top:"40%",left:"35%"},overlayCSS:{backgroundColor:"#000",opacity:.6,cursor:"wait"},cursorReset:"default",growlCSS:{width:"350px",top:"10px",left:"",right:"10px",border:"none",padding:"5px",opacity:.6,cursor:"default",color:"#fff",backgroundColor:"#000","-webkit-border-radius":"10px","-moz-border-radius":"10px","border-radius":"10px"},iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank",forceIframe:!1,baseZ:1e3,centerX:!0,centerY:!0,allowBodyStretch:!0,bindEvents:!0,constrainTabKey:!0,fadeIn:200,fadeOut:400,timeout:0,showOverlay:!0,focusInput:!0,focusableElements:":input:enabled:visible",onBlock:null,onUnblock:null,onOverlayClick:null,quirksmodeOffsetHack:4,blockMsgClass:"blockMsg",ignoreIfBlocked:!1},null),y=[];function o(e,o){var n=e==window,t=o&&void 0!==o.message?o.message:void 0;if(!(o=p.extend({},p.blockUI.defaults,o||{})).ignoreIfBlocked||!p(e).data("blockUI.isBlocked")){o.overlayCSS=p.extend({},p.blockUI.defaults.overlayCSS,o.overlayCSS||{}),c=p.extend({},p.blockUI.defaults.css,o.css||{}),o.onOverlayClick&&(o.overlayCSS.cursor="pointer"),d=p.extend({},p.blockUI.defaults.themedCSS,o.themedCSS||{}),t=void 0===t?o.message:t,n&&k&&g(window,{fadeOut:0}),t&&"string"!=typeof t&&(t.parentNode||t.jquery)&&(s=t.jquery?t[0]:t,i={},p(e).data("blockUI.history",i),i.el=s,i.parent=s.parentNode,i.display=s.style.display,i.position=s.style.position,i.parent&&i.parent.removeChild(s)),p(e).data("blockUI.onUnblock",o.onUnblock);var r,u,i=o.baseZ,s=h||o.forceIframe?p(''):p(''),l=o.theme?p(''):p(''),a=(o.theme&&n?(a=''):o.theme?(a=''):a=n?'':'',i=p(a),t&&(o.theme?(i.css(d),i.addClass("ui-widget-content")):i.css(c)),o.theme||l.css(o.overlayCSS),l.css("position",n?"fixed":"absolute"),(h||o.forceIframe)&&s.css("opacity",0),[s,l,i]),f=p(n?"body":e),d=(p.each(a,function(){this.appendTo(f)}),o.theme&&o.draggable&&p.fn.draggable&&i.draggable({handle:".ui-dialog-titlebar",cancel:"li"}),I&&("CSS1Compat"!==document.compatMode||0 .blockUI"):s.find(">.blockUI"),t.cursorReset&&(1'); this.$iframe_container = $('
').appendTo(this.$el.find('.udp-modal__modal')).append(this.$iframe); } } } } jQuery(function(e) { checkout_embed.init(); }); })(jQuery); PKwL\e9>++Aupdraftplus/includes/checkout-embed/assets/udp-checkout-embed.cssnu[@-webkit-keyframes spin { 100% { -webkit-transform: rotate( 360deg ); transform: rotate( 360deg ); } } @keyframes spin { 100% { -webkit-transform: rotate( 360deg ); transform: rotate( 360deg ); } } body.udp-modal-is-opened { overflow: hidden; } .udp-modal { position: fixed; top: 0; left: 0; bottom: 0; right: 0; z-index: 20000; } .udp-modal__overlay { width: 100%; height: 100%; position: absolute; background: #000; opacity: 0.8; z-index: 1; } .udp-modal__modal { position: absolute; z-index: 2; left: 0; top: 32px; bottom: 0; right: 0; background: #FFF; -webkit-box-shadow: 0px 4px 10px rgba(0,0,0,0.45882); box-shadow: 0px 4px 10px rgba(0,0,0,0.45882); overflow: auto; } .udp-modal__content { position: relative; overflow: auto; } .udp-modal__content .img { padding: 0 20px; -webkit-box-sizing: border-box; box-sizing: border-box; text-align: center; } .udp-modal__content .img img { max-width: 100%; } .udp-modal__content .text { padding: 40px; } .udp-modal.loading { background-image: url(); } .udp-modal.loading::before { height: 1em; width: 1em; display: block; position: absolute; top: 50%; left: 50%; margin-left: -0.5em; margin-top: -0.5em; content: ''; -webkit-animation: spin 1s linear infinite; animation: spin 1s linear infinite; background: url('loader.svg') center center; background-size: cover; line-height: 1; text-align: center; font-size: 2em; color: #000; z-index: 3; opacity: 0.5; } .udp-modal.loading .udp-modal__content, .udp-modal.loading .udp-modal__sidebar, .iframe-is-opened .udp-modal__content, .iframe-is-opened .udp-modal__sidebar { display: none; } .udp-modal__iframe { position: absolute; top: 0; left: 0; right: 0; bottom: 0; z-index: 3; background: #FFF; } .udp-modal__iframe iframe { position: absolute; width: 100%; height: 100%; } @media(min-width: 1200px) { .udp-modal__modal { left: 20px; top: calc(20px + 32px); bottom: 20px; right: 20px; } } @media(max-width: 782px) { .udp-modal__modal { top: 46px; } }PKwL\[5updraftplus/includes/checkout-embed/assets/loader.svgnu[ PKwL\ʿR+Lupdraftplus/includes/checkout-embed/assets/udp-checkout-embed-2-23-7.min.cssnu[@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}body.udp-modal-is-opened{overflow:hidden}.udp-modal{position:fixed;top:0;left:0;bottom:0;right:0;z-index:20000}.udp-modal__overlay{width:100%;height:100%;position:absolute;background:#000;opacity:.8;z-index:1}.udp-modal__modal{position:absolute;z-index:2;left:0;top:32px;bottom:0;right:0;background:#FFF;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.45882);box-shadow:0 4px 10px rgba(0,0,0,0.45882);overflow:auto}.udp-modal__content{position:relative;overflow:auto}.udp-modal__content .img{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center}.udp-modal__content .img img{max-width:100%}.udp-modal__content .text{padding:40px}.udp-modal.loading{background-image:url()}.udp-modal.loading::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-0.5em;margin-top:-0.5em;content:'';-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background:url('loader.svg') center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:#000;z-index:3;opacity:.5}.udp-modal.loading .udp-modal__content,.udp-modal.loading .udp-modal__sidebar,.iframe-is-opened .udp-modal__content,.iframe-is-opened .udp-modal__sidebar{display:none}.udp-modal__iframe{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;background:#FFF}.udp-modal__iframe iframe{position:absolute;width:100%;height:100%}@media(min-width:1200px){.udp-modal__modal{left:20px;top:calc(20px + 32px);bottom:20px;right:20px}}@media(max-width:782px){.udp-modal__modal{top:46px}} /*# sourceMappingURL=udp-checkout-embed-2-23-7.min.css.map */ PKwL\@TKupdraftplus/includes/checkout-embed/assets/udp-checkout-embed-2-23-7.min.jsnu[!function(o){var t={loading:!1,init:function(){var t;o("a[data-embed-checkout]").length&&(t=this,o(document).on("click","a[data-embed-checkout]",function(e){e.preventDefault(),t.modal.open(o(this))}))},modal:{open:function(e){this.$target=e,(!this.product_url||this.product_url&&this.product_url!=e.data("embed-checkout"))&&(this.product_url=e.data("embed-checkout")),this.show_checkout()},setup:function(){this.$el&&(this.$el.remove(),this.$el=null);var e=o("#udp-modal-template").html();this.$el=o(e),window.addEventListener("message",function(e){var t=e.data;if(t&&t.action)switch(t.action){case"domready":this.$el.removeClass("loading");break;case"closemodal":o(document).trigger("udp/checkout/close",t.data,this.$target),this.close();break;case"ordercomplete":console.log("Order complete:",t.data),o(document).trigger("udp/checkout/done",t.data,this.$target)}}.bind(this))},close:function(e){e&&e.preventDefault(),o("body").removeClass("udp-modal-is-opened"),this.$iframe&&(this.$iframe.remove(),this.$iframe_container.remove()),this.$el.hide()},show_checkout:function(){window.location.assign(this.product_url)}}};jQuery(function(e){t.init()})}(jQuery);PKwL\r[[-updraftplus/includes/checkout-embed/readme.mdnu[# Embed the plugin's checkout page ## To use in a new plugin: - Include and instantiate `Updraft_Checkout_Embed` ```php if (!class_exists('Updraft_Checkout_Embed')) include_once (UPDRAFTPLUS_DIR.'/includes/checkout-embed/class-udp-checkout-embed.php'); global $udp_checkout_embed; $udp_checkout_embed = new Updraft_Checkout_Embed( 'updraftplus' $data_url, $load_in_pages ); ``` ### Params: - $plugin_name: (string) Current plugin using the class - $proructs_data_url: (string) url of the merchand website (eg: https://https://updraftplus.com) - $load_in_pages: (array) pages on which the script + css will be loaded ### Cache: The products data is cached and expires after 7 days. To force fetching it, add `udp-force-product-list-refresh=1` to the admin page url ## Using in the admin - Once the php is setup, you can configure the links / buttons in the admin. Add `data-embed-checkout="{$url}"` to any link. eg: ```php global $updraftplus_checkout_embed; $link_data_attr = $updraftplus_checkout_embed->get_product('updraftpremium') ? 'data-embed-checkout="'.apply_filters('updraftplus_com_link', $updraftplus_checkout_embed->get_product('updraftpremium')).'"' : ''; " > ``` - On completion (when the order is complete), the event 'udp/checkout/done' is triggered. - The event 'udp/checkout/close' is triggered when the user closes the modal, regardless of success. Use this to do something with the data received: ```javascript $(document).on('udp/checkout/done', function(event, data, $element) { // ... do something with data, currently data.email and data.order_number // $element clicked to open the modal. }); ``` PKwL\@updraftplus/includes/checkout-embed/class-udp-checkout-embed.phpnu[enqueue_scripts */ public function __construct($plugin_name, $return_url, $products_list, $base_url, $load_in_pages = null) { $this->plugin_name = sanitize_key($plugin_name); $this->return_url = $return_url; $this->products_list = $products_list; $this->load_in_pages = $load_in_pages; $this->base_url = $base_url; add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts')); add_action('admin_footer', array($this, 'print_template')); } /** * Get the product using its slug * * @param string $product_slug * @param string $return_url * @return string|bool */ public function get_product($product_slug, $return_url = '') { $products = $this->get_products(); if (empty($products)) return false; if (is_object($products)) $products = get_object_vars($products); if (is_array($products) && array_key_exists($product_slug, $products)) { if (!$return_url) $return_url = $this->return_url; $return_url = add_query_arg($this->plugin_name.'_product', $product_slug, $return_url); return apply_filters( $this->plugin_name.'_return_url', add_query_arg( array( $this->plugin_name.'_return_url' => urlencode($return_url), 'checkout_embed_product_slug' => $product_slug ), $products[$product_slug] ), $product_slug ); } return false; } /** * Get the products on the remote url * Can return an object, if the products list given to the class is. (eg. json_decode gives an object if not specified otherwise) * * @return array|object */ private function get_products() { return apply_filters($this->plugin_name.'_checkout_embed_get_products', $this->products_list ? $this->products_list : array()); } /** * Enqueue the required scripts / styles * * @param string $hook */ public function enqueue_scripts($hook) { if (is_array($this->load_in_pages)) { if (!in_array($hook, $this->load_in_pages)) { return; } } wp_enqueue_script($this->plugin_name.'-checkout-embed', trailingslashit($this->base_url).'checkout-embed/assets/udp-checkout-embed.js', array('jquery'), self::$version, true); wp_enqueue_style($this->plugin_name.'-checkout-embed', trailingslashit($this->base_url).'checkout-embed/assets/udp-checkout-embed.css', null, self::$version); } /** * Print the template for the modal */ public function print_template() { if (is_array($this->load_in_pages)) { $screen = get_current_screen(); if (!in_array($screen->base, $this->load_in_pages)) { return; } } ?> * # Authenticate to Cloud Files. The default is to automatically try * # to re-authenticate if an authentication token expires. * # * # NOTE: Some versions of cURL include an outdated certificate authority (CA) * # file. This API ships with a newer version obtained directly from * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle, * # call the CF_Authentication instance's 'ssl_use_cabundle()' method. * # * $auth = new CF_Authentication($username, $api_key); * # $auth->ssl_use_cabundle(); # bypass cURL's old CA bundle * $auth->authenticate(); * * # Establish a connection to the storage system * # * # NOTE: Some versions of cURL include an outdated certificate authority (CA) * # file. This API ships with a newer version obtained directly from * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle, * # call the CF_Connection instance's 'ssl_use_cabundle()' method. * # * $conn = new CF_Connection($auth); * # $conn->ssl_use_cabundle(); # bypass cURL's old CA bundle * * # Create a remote Container and storage Object * # * $images = $conn->create_container("photos"); * $bday = $images->create_object("first_birthday.jpg"); * * # Upload content from a local file by streaming it. Note that we use * # a "float" for the file size to overcome PHP's 32-bit integer limit for * # very large files. * # * $fname = "/home/user/photos/birthdays/birthday1.jpg"; # filename to upload * $size = (float) sprintf("%u", filesize($fname)); * $fp = open($fname, "r"); * $bday->write($fp, $size); * * # Or... use a convenience function instead * # * $bday->load_from_filename("/home/user/photos/birthdays/birthday1.jpg"); * * # Now, publish the "photos" container to serve the images by CDN. * # Use the "$uri" value to put in your web pages or send the link in an * # email message, etc. * # * $uri = $images->make_public(); * * # Or... print out the Object's public URI * # * print $bday->public_uri(); * * * See the included tests directory for additional sample code. * * Requires PHP 5.x (for Exceptions and OO syntax) and PHP's cURL module. * * It uses the supporting "cloudfiles_http.php" module for HTTP(s) support and * allows for connection re-use and streaming of content into/out of Cloud Files * via PHP's cURL module. * * See COPYING for license information. * * @author Eric "EJ" Johnson * @copyright Copyright (c) 2008, Rackspace US, Inc. * @package php-cloudfiles */ /** */ require_once(UPDRAFTPLUS_DIR."/includes/cloudfiles/cloudfiles_exceptions.php"); require_once(UPDRAFTPLUS_DIR."/includes/cloudfiles/cloudfiles_http.php"); @define("DEFAULT_CF_API_VERSION", 1); @define("MAX_CONTAINER_NAME_LEN", 256); @define("MAX_OBJECT_NAME_LEN", 1024); @define("MAX_OBJECT_SIZE", 5*1024*1024*1024+1); @define("US_AUTHURL", "https://auth.api.rackspacecloud.com"); @define("UK_AUTHURL", "https://lon.auth.api.rackspacecloud.com"); /** * Class for handling Cloud Files Authentication, call it's {@link authenticate()} * method to obtain authorized service urls and an authentication token. * * Example: * * # Create the authentication instance * # * $auth = new CF_Authentication("username", "api_key"); * * # NOTE: For UK Customers please specify your AuthURL Manually * # There is a Predefined constant to use EX: * # * # $auth = new CF_Authentication("username, "api_key", NULL, UK_AUTHURL); * # Using the UK_AUTHURL keyword will force the api to use the UK AuthUrl. * # rather then the US one. The NULL Is passed for legacy purposes and must * # be passed to function correctly. * * # NOTE: Some versions of cURL include an outdated certificate authority (CA) * # file. This API ships with a newer version obtained directly from * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle, * # call the CF_Authentication instance's 'ssl_use_cabundle()' method. * # * # $auth->ssl_use_cabundle(); # bypass cURL's old CA bundle * * # Perform authentication request * # * $auth->authenticate(); * * * @package php-cloudfiles */ class UpdraftPlus_CF_Authentication { public $dbug; public $username; public $api_key; public $auth_host; public $account; /** * Instance variables that are set after successful authentication */ public $storage_url; public $cdnm_url; public $auth_token; /** * Class constructor (PHP 5 syntax) * * @param string $username Mosso username * @param string $api_key Mosso API Access Key * @param string $account Account name * @param string $auth_host Authentication service URI */ function __construct($username=NULL, $api_key=NULL, $account=NULL, $auth_host=US_AUTHURL) { $this->dbug = False; $this->username = $username; $this->api_key = $api_key; $this->account_name = $account; $this->auth_host = $auth_host; $this->storage_url = NULL; $this->cdnm_url = NULL; $this->auth_token = NULL; $this->cfs_http = new UpdraftPlus_CF_Http(DEFAULT_CF_API_VERSION); } /** * Use the Certificate Authority bundle included with this API * * Most versions of PHP with cURL support include an outdated Certificate * Authority (CA) bundle (the file that lists all valid certificate * signing authorities). The SSL certificates used by the Cloud Files * storage system are perfectly valid but have been created/signed by * a CA not listed in these outdated cURL distributions. * * As a work-around, we've included an updated CA bundle obtained * directly from cURL's web site (http://curl.haxx.se). You can direct * the API to use this CA bundle by calling this method prior to making * any remote calls. The best place to use this method is right after * the CF_Authentication instance has been instantiated. * * You can specify your own CA bundle by passing in the full pathname * to the bundle. You can use the included CA bundle by leaving the * argument blank. * * @param string $path Specify path to CA bundle (default to included) */ function ssl_use_cabundle($path=NULL) { $this->cfs_http->ssl_use_cabundle($path); } /** * Attempt to validate Username/API Access Key * * Attempts to validate credentials with the authentication service. It * either returns True or throws an Exception. Accepts a single * (optional) argument for the storage system API version. * * Example: * * # Create the authentication instance * # * $auth = new CF_Authentication("username", "api_key"); * * # Perform authentication request * # * $auth->authenticate(); * * * @param string $version API version for Auth service (optional) * @return boolean True if successfully authenticated * @throws AuthenticationException invalid credentials * @throws InvalidResponseException invalid response */ function authenticate($version=DEFAULT_CF_API_VERSION) { list($status,$reason,$surl,$curl,$atoken) = $this->cfs_http->authenticate($this->username, $this->api_key, $this->account_name, $this->auth_host); if ($status == 401) { throw new AuthenticationException("Invalid username or access key."); } if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Unexpected response (".$status."): ".$reason); } if (!($surl || $curl) || !$atoken) { throw new InvalidResponseException( "Expected headers missing from auth service."); } $this->storage_url = $surl; $this->cdnm_url = $curl; $this->auth_token = $atoken; return True; } /** * Use Cached Token and Storage URL's rather then grabbing from the Auth System * * Example: * * #Create an Auth instance * $auth = new CF_Authentication(); * #Pass Cached URL's and Token as Args * $auth->load_cached_credentials("auth_token", "storage_url", "cdn_management_url"); * * * @param string $auth_token A Cloud Files Auth Token (Required) * @param string $storage_url The Cloud Files Storage URL (Required) * @param string $cdnm_url CDN Management URL (Required) * @return boolean True if successful * @throws SyntaxException If any of the Required Arguments are missing */ function load_cached_credentials($auth_token, $storage_url, $cdnm_url) { if(!$storage_url || !$cdnm_url) { throw new SyntaxException("Missing Required Interface URL's!"); return False; } if(!$auth_token) { throw new SyntaxException("Missing Auth Token!"); return False; } $this->storage_url = $storage_url; $this->cdnm_url = $cdnm_url; $this->auth_token = $auth_token; return True; } /** * Grab Cloud Files info to be Cached for later use with the load_cached_credentials method. * * Example: * * #Create an Auth instance * $auth = new CF_Authentication("UserName","API_Key"); * $auth->authenticate(); * $array = $auth->export_credentials(); * * * @return array of url's and an auth token. */ function export_credentials() { $arr = array(); $arr['storage_url'] = $this->storage_url; $arr['cdnm_url'] = $this->cdnm_url; $arr['auth_token'] = $this->auth_token; return $arr; } /** * Make sure the CF_Authentication instance has authenticated. * * Ensures that the instance variables necessary to communicate with * Cloud Files have been set from a previous authenticate() call. * * @return boolean True if successfully authenticated */ function authenticated() { if (!($this->storage_url || $this->cdnm_url) || !$this->auth_token) { return False; } return True; } /** * Toggle debugging - set cURL verbose flag */ function setDebug($bool) { $this->dbug = $bool; $this->cfs_http->setDebug($bool); } } /** * Class for establishing connections to the Cloud Files storage system. * Connection instances are used to communicate with the storage system at * the account level; listing and deleting Containers and returning Container * instances. * * Example: * * # Create the authentication instance * # * $auth = new CF_Authentication("username", "api_key"); * * # Perform authentication request * # * $auth->authenticate(); * * # Create a connection to the storage/cdn system(s) and pass in the * # validated CF_Authentication instance. * # * $conn = new CF_Connection($auth); * * # NOTE: Some versions of cURL include an outdated certificate authority (CA) * # file. This API ships with a newer version obtained directly from * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle, * # call the CF_Authentication instance's 'ssl_use_cabundle()' method. * # * # $conn->ssl_use_cabundle(); # bypass cURL's old CA bundle * * * @package php-cloudfiles */ class UpdraftPlus_CF_Connection { public $dbug; public $cfs_http; public $cfs_auth; /** * Pass in a previously authenticated CF_Authentication instance. * * Example: * * # Create the authentication instance * # * $auth = new CF_Authentication("username", "api_key"); * * # Perform authentication request * # * $auth->authenticate(); * * # Create a connection to the storage/cdn system(s) and pass in the * # validated CF_Authentication instance. * # * $conn = new CF_Connection($auth); * * # If you are connecting via Rackspace servers and have access * # to the servicenet network you can set the $servicenet to True * # like this. * * $conn = new CF_Connection($auth, $servicenet=True); * * * * If the environment variable RACKSPACE_SERVICENET is defined it will * force to connect via the servicenet. * * @param obj $cfs_auth previously authenticated CF_Authentication instance * @param boolean $servicenet enable/disable access via Rackspace servicenet. * @throws AuthenticationException not authenticated */ function __construct($cfs_auth, $servicenet=False) { if (isset($_ENV['RACKSPACE_SERVICENET'])) $servicenet=True; $this->cfs_http = new UpdraftPlus_CF_Http(DEFAULT_CF_API_VERSION); $this->cfs_auth = $cfs_auth; if (!$this->cfs_auth->authenticated()) { $e = "Need to pass in a previously authenticated "; $e .= "CF_Authentication instance."; throw new AuthenticationException($e); } $this->cfs_http->setCFAuth($this->cfs_auth, $servicenet=$servicenet); $this->dbug = False; } /** * Toggle debugging of instance and back-end HTTP module * * @param boolean $bool enable/disable cURL debugging */ function setDebug($bool) { $this->dbug = (boolean) $bool; $this->cfs_http->setDebug($this->dbug); } /** * Close a connection * * Example: * * * $conn->close(); * * * * Will close all current cUrl active connections. * */ public function close() { $this->cfs_http->close(); } /** * Cloud Files account information * * Return an array of two floats (since PHP only supports 32-bit integers); * number of containers on the account and total bytes used for the account. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * list($quantity, $bytes) = $conn->get_info(); * print "Number of containers: " . $quantity . "\n"; * print "Bytes stored in container: " . $bytes . "\n"; * * * @return array (number of containers, total bytes stored) * @throws InvalidResponseException unexpected response */ function get_info() { list($status, $reason, $container_count, $total_bytes) = $this->cfs_http->head_account(); #if ($status == 401 && $this->_re_auth()) { # return $this->get_info(); #} if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return array($container_count, $total_bytes); } /** * Create a Container * * Given a Container name, return a Container instance, creating a new * remote Container if it does not exit. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $images = $conn->create_container("my photos"); * * * @param string $container_name container name * @return CF_Container * @throws SyntaxException invalid name * @throws InvalidResponseException unexpected response */ function create_container($container_name=NULL) { if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Container name not set."); if (!isset($container_name) or $container_name == "") throw new SyntaxException("Container name not set."); if (strpos($container_name, "/") !== False) { $r = "Container name '".$container_name; $r .= "' cannot contain a '/' character."; throw new SyntaxException($r); } if (strlen($container_name) > MAX_CONTAINER_NAME_LEN) { throw new SyntaxException(sprintf( "Container name exceeds %d bytes.", MAX_CONTAINER_NAME_LEN)); } $return_code = $this->cfs_http->create_container($container_name); if (!$return_code) { throw new InvalidResponseException("Invalid response (" . $return_code. "): " . $this->cfs_http->get_error()); } #if ($status == 401 && $this->_re_auth()) { # return $this->create_container($container_name); #} if ($return_code != 201 && $return_code != 202) { throw new InvalidResponseException( "Invalid response (".$return_code."): " . $this->cfs_http->get_error()); } return new UpdraftPlus_CF_Container($this->cfs_auth, $this->cfs_http, $container_name); } /** * Delete a Container * * Given either a Container instance or name, remove the remote Container. * The Container must be empty prior to removing it. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $conn->delete_container("my photos"); * * * @param string|obj $container container name or instance * @return boolean True if successfully deleted * @throws SyntaxException missing proper argument * @throws InvalidResponseException invalid response * @throws NonEmptyContainerException container not empty * @throws NoSuchContainerException remote container does not exist */ function delete_container($container=NULL) { $container_name = NULL; if (is_object($container)) { if (get_class($container) == "UpdraftPlus_CF_Container") { $container_name = $container->name; } } if (is_string($container)) { $container_name = $container; } if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Must specify container object or name."); $return_code = $this->cfs_http->delete_container($container_name); if (!$return_code) { throw new InvalidResponseException("Failed to obtain http response"); } #if ($status == 401 && $this->_re_auth()) { # return $this->delete_container($container); #} if ($return_code == 409) { throw new NonEmptyContainerException( "Container must be empty prior to removing it."); } if ($return_code == 404) { throw new NoSuchContainerException( "Specified container did not exist to delete."); } if ($return_code != 204) { throw new InvalidResponseException( "Invalid response (".$return_code."): " . $this->cfs_http->get_error()); } return True; } /** * Return a Container instance * * For the given name, return a Container instance if the remote Container * exists, otherwise throw a Not Found exception. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $images = $conn->get_container("my photos"); * print "Number of Objects: " . $images->count . "\n"; * print "Bytes stored in container: " . $images->bytes . "\n"; * * * @param string $container_name name of the remote Container * @return container CF_Container instance * @throws NoSuchContainerException thrown if no remote Container * @throws InvalidResponseException unexpected response */ function get_container($container_name=NULL) { list($status, $reason, $count, $bytes) = $this->cfs_http->head_container($container_name); #if ($status == 401 && $this->_re_auth()) { # return $this->get_container($container_name); #} if ($status == 404) { throw new NoSuchContainerException("Container not found."); } if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response: ".$this->cfs_http->get_error()); } return new UpdraftPlus_3CF_Container($this->cfs_auth, $this->cfs_http, $container_name, $count, $bytes); } /** * Return array of Container instances * * Return an array of CF_Container instances on the account. The instances * will be fully populated with Container attributes (bytes stored and * Object count) * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $clist = $conn->get_containers(); * foreach ($clist as $cont) { * print "Container name: " . $cont->name . "\n"; * print "Number of Objects: " . $cont->count . "\n"; * print "Bytes stored in container: " . $cont->bytes . "\n"; * } * * * @return array An array of CF_Container instances * @throws InvalidResponseException unexpected response */ function get_containers($limit=0, $marker=NULL) { list($status, $reason, $container_info) = $this->cfs_http->list_containers_info($limit, $marker); #if ($status == 401 && $this->_re_auth()) { # return $this->get_containers(); #} if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response: ".$this->cfs_http->get_error()); } $containers = array(); foreach ($container_info as $name => $info) { $containers[] = new UpdraftPlus_CF_Container($this->cfs_auth, $this->cfs_http, $info['name'], $info["count"], $info["bytes"], False); } return $containers; } /** * Return list of remote Containers * * Return an array of strings containing the names of all remote Containers. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $container_list = $conn->list_containers(); * print_r($container_list); * Array * ( * [0] => "my photos", * [1] => "my docs" * ) * * * @param integer $limit restrict results to $limit Containers * @param string $marker return results greater than $marker * @return array list of remote Containers * @throws InvalidResponseException unexpected response */ function list_containers($limit=0, $marker=NULL) { list($status, $reason, $containers) = $this->cfs_http->list_containers($limit, $marker); #if ($status == 401 && $this->_re_auth()) { # return $this->list_containers($limit, $marker); #} if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return $containers; } /** * Return array of information about remote Containers * * Return a nested array structure of Container info. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * * $container_info = $conn->list_containers_info(); * print_r($container_info); * Array * ( * ["my photos"] => * Array * ( * ["bytes"] => 78, * ["count"] => 2 * ) * ["docs"] => * Array * ( * ["bytes"] => 37323, * ["count"] => 12 * ) * ) * * * @param integer $limit restrict results to $limit Containers * @param string $marker return results greater than $marker * @return array nested array structure of Container info * @throws InvalidResponseException unexpected response */ function list_containers_info($limit=0, $marker=NULL) { list($status, $reason, $container_info) = $this->cfs_http->list_containers_info($limit, $marker); #if ($status == 401 && $this->_re_auth()) { # return $this->list_containers_info($limit, $marker); #} if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return $container_info; } /** * Return list of Containers that have been published to the CDN. * * Return an array of strings containing the names of published Containers. * Note that this function returns the list of any Container that has * ever been CDN-enabled regardless of it's existence in the storage * system. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_containers = $conn->list_public_containers(); * print_r($public_containers); * Array * ( * [0] => "images", * [1] => "css", * [2] => "javascript" * ) * * * @param bool $enabled_only Will list all containers ever CDN enabled if * set to false or only currently enabled CDN containers if set to true. * Defaults to false. * @return array list of published Container names * @throws InvalidResponseException unexpected response */ function list_public_containers($enabled_only=False) { list($status, $reason, $containers) = $this->cfs_http->list_cdn_containers($enabled_only); #if ($status == 401 && $this->_re_auth()) { # return $this->list_public_containers(); #} if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return $containers; } /** * Set a user-supplied callback function to report download progress * * The callback function is used to report incremental progress of a data * download functions (e.g. $container->list_objects(), $obj->read(), etc). * The specified function will be periodically called with the number of * bytes transferred until the entire download is complete. This callback * function can be useful for implementing "progress bars" for large * downloads. * * The specified callback function should take a single integer parameter. * * * function read_callback($bytes_transferred) { * print ">> downloaded " . $bytes_transferred . " bytes.\n"; * # ... do other things ... * return; * } * * $conn = new CF_Connection($auth_obj); * $conn->set_read_progress_function("read_callback"); * print_r($conn->list_containers()); * * # output would look like this: * # * >> downloaded 10 bytes. * >> downloaded 11 bytes. * Array * ( * [0] => fuzzy.txt * [1] => space name * ) * * * @param string $func_name the name of the user callback function */ function set_read_progress_function($func_name) { $this->cfs_http->setReadProgressFunc($func_name); } /** * Set a user-supplied callback function to report upload progress * * The callback function is used to report incremental progress of a data * upload functions (e.g. $obj->write() call). The specified function will * be periodically called with the number of bytes transferred until the * entire upload is complete. This callback function can be useful * for implementing "progress bars" for large uploads/downloads. * * The specified callback function should take a single integer parameter. * * * function write_callback($bytes_transferred) { * print ">> uploaded " . $bytes_transferred . " bytes.\n"; * # ... do other things ... * return; * } * * $conn = new CF_Connection($auth_obj); * $conn->set_write_progress_function("write_callback"); * $container = $conn->create_container("stuff"); * $obj = $container->create_object("foo"); * $obj->write("The callback function will be called during upload."); * * # output would look like this: * # >> uploaded 51 bytes. * # * * * @param string $func_name the name of the user callback function */ function set_write_progress_function($func_name) { $this->cfs_http->setWriteProgressFunc($func_name); } /** * Use the Certificate Authority bundle included with this API * * Most versions of PHP with cURL support include an outdated Certificate * Authority (CA) bundle (the file that lists all valid certificate * signing authorities). The SSL certificates used by the Cloud Files * storage system are perfectly valid but have been created/signed by * a CA not listed in these outdated cURL distributions. * * As a work-around, we've included an updated CA bundle obtained * directly from cURL's web site (http://curl.haxx.se). You can direct * the API to use this CA bundle by calling this method prior to making * any remote calls. The best place to use this method is right after * the CF_Authentication instance has been instantiated. * * You can specify your own CA bundle by passing in the full pathname * to the bundle. You can use the included CA bundle by leaving the * argument blank. * * @param string $path Specify path to CA bundle (default to included) */ function ssl_use_cabundle($path=NULL) { $this->cfs_http->ssl_use_cabundle($path); } #private function _re_auth() #{ # $new_auth = new CF_Authentication( # $this->cfs_auth->username, # $this->cfs_auth->api_key, # $this->cfs_auth->auth_host, # $this->cfs_auth->account); # $new_auth->authenticate(); # $this->cfs_auth = $new_auth; # $this->cfs_http->setCFAuth($this->cfs_auth); # return True; #} } /** * Container operations * * Containers are storage compartments where you put your data (objects). * A container is similar to a directory or folder on a conventional filesystem * with the exception that they exist in a flat namespace, you can not create * containers inside of containers. * * You also have the option of marking a Container as "public" so that the * Objects stored in the Container are publicly available via the CDN. * * @package php-cloudfiles */ class UpdraftPlus_CF_Container { public $cfs_auth; public $cfs_http; public $name; public $object_count; public $bytes_used; public $metadata; public $cdn_enabled; public $cdn_streaming_uri; public $cdn_ssl_uri; public $cdn_uri; public $cdn_ttl; public $cdn_log_retention; public $cdn_acl_user_agent; public $cdn_acl_referrer; /** * Class constructor * * Constructor for Container * * @param obj $cfs_auth CF_Authentication instance * @param obj $cfs_http HTTP connection manager * @param string $name name of Container * @param int $count number of Objects stored in this Container * @param int $bytes number of bytes stored in this Container * @throws SyntaxException invalid Container name */ function __construct(&$cfs_auth, &$cfs_http, $name, $count=0, $bytes=0, $docdn=True) { if (strlen($name) > MAX_CONTAINER_NAME_LEN) { throw new SyntaxException("Container name exceeds " . "maximum allowed length."); } if (strpos($name, "/") !== False) { throw new SyntaxException( "Container names cannot contain a '/' character."); } $this->cfs_auth = $cfs_auth; $this->cfs_http = $cfs_http; $this->name = $name; $this->object_count = $count; $this->bytes_used = $bytes; $this->metadata = array(); $this->cdn_enabled = NULL; $this->cdn_uri = NULL; $this->cdn_ssl_uri = NULL; $this->cdn_streaming_uri = NULL; $this->cdn_ttl = NULL; $this->cdn_log_retention = NULL; $this->cdn_acl_user_agent = NULL; $this->cdn_acl_referrer = NULL; if ($this->cfs_http->getCDNMUrl() != NULL && $docdn) { $this->_cdn_initialize(); } } /** * String representation of Container * * Pretty print the Container instance. * * @return string Container details */ function __toString() { $me = sprintf("name: %s, count: %.0f, bytes: %.0f", $this->name, $this->object_count, $this->bytes_used); if ($this->cfs_http->getCDNMUrl() != NULL) { $me .= sprintf(", cdn: %s, cdn uri: %s, cdn ttl: %.0f, logs retention: %s", $this->is_public() ? "Yes" : "No", $this->cdn_uri, $this->cdn_ttl, $this->cdn_log_retention ? "Yes" : "No" ); if ($this->cdn_acl_user_agent != NULL) { $me .= ", cdn acl user agent: " . $this->cdn_acl_user_agent; } if ($this->cdn_acl_referrer != NULL) { $me .= ", cdn acl referrer: " . $this->cdn_acl_referrer; } } return $me; } /** * Enable Container content to be served via CDN or modify CDN attributes * * Either enable this Container's content to be served via CDN or * adjust its CDN attributes. This Container will always return the * same CDN-enabled URI each time it is toggled public/private/public. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->create_container("public"); * * # CDN-enable the container and set it's TTL for a month * # * $public_container->make_public(86400/2); # 12 hours (86400 seconds/day) * * * @param int $ttl the time in seconds content will be cached in the CDN * @returns string the CDN enabled Container's URI * @throws CDNNotEnabledException CDN functionality not returned during auth * @throws AuthenticationException if auth token is not valid/expired * @throws InvalidResponseException unexpected response */ function make_public($ttl=86400) { if ($this->cfs_http->getCDNMUrl() == NULL) { throw new CDNNotEnabledException( "Authentication response did not indicate CDN availability"); } if ($this->cdn_uri != NULL) { # previously published, assume we're setting new attributes list($status, $reason, $cdn_uri, $cdn_ssl_uri) = $this->cfs_http->update_cdn_container($this->name,$ttl, $this->cdn_log_retention, $this->cdn_acl_user_agent, $this->cdn_acl_referrer); #if ($status == 401 && $this->_re_auth()) { # return $this->make_public($ttl); #} if ($status == 404) { # this instance _thinks_ the container was published, but the # cdn management system thinks otherwise - try again with a PUT list($status, $reason, $cdn_uri, $cdn_ssl_uri) = $this->cfs_http->add_cdn_container($this->name,$ttl); } } else { # publish it for first time list($status, $reason, $cdn_uri, $cdn_ssl_uri) = $this->cfs_http->add_cdn_container($this->name,$ttl); } #if ($status == 401 && $this->_re_auth()) { # return $this->make_public($ttl); #} if (!in_array($status, array(201,202))) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } $this->cdn_enabled = True; $this->cdn_ttl = $ttl; $this->cdn_ssl_uri = $cdn_ssl_uri; $this->cdn_uri = $cdn_uri; $this->cdn_log_retention = False; $this->cdn_acl_user_agent = ""; $this->cdn_acl_referrer = ""; return $this->cdn_uri; } /** * Purge Containers objects from CDN Cache. * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * $container = $conn->get_container("cdn_enabled"); * $container->purge_from_cdn("user@domain.com"); * # or * $container->purge_from_cdn(); * # or * $container->purge_from_cdn("user1@domain.com,user2@domain.com"); * @returns boolean True if successful * @throws CDNNotEnabledException if CDN Is not enabled on this connection * @throws InvalidResponseException if the response expected is not returned */ function purge_from_cdn($email=null) { if (!$this->cfs_http->getCDNMUrl()) { throw new CDNNotEnabledException( "Authentication response did not indicate CDN availability"); } $status = $this->cfs_http->purge_from_cdn($this->name, $email); if ($status < 199 or $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return True; } /** * Enable ACL restriction by User Agent for this container. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->get_container("public"); * * # Enable ACL by Referrer * $public_container->acl_referrer("Mozilla"); * * * @returns boolean True if successful * @throws CDNNotEnabledException CDN functionality not returned during auth * @throws AuthenticationException if auth token is not valid/expired * @throws InvalidResponseException unexpected response */ function acl_user_agent($cdn_acl_user_agent="") { if ($this->cfs_http->getCDNMUrl() == NULL) { throw new CDNNotEnabledException( "Authentication response did not indicate CDN availability"); } list($status,$reason) = $this->cfs_http->update_cdn_container($this->name, $this->cdn_ttl, $this->cdn_log_retention, $cdn_acl_user_agent, $this->cdn_acl_referrer ); if (!in_array($status, array(202,404))) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } $this->cdn_acl_user_agent = $cdn_acl_user_agent; return True; } /** * Enable ACL restriction by referer for this container. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->get_container("public"); * * # Enable Referrer * $public_container->acl_referrer("http://www.example.com/gallery.php"); * * * @returns boolean True if successful * @throws CDNNotEnabledException CDN functionality not returned during auth * @throws AuthenticationException if auth token is not valid/expired * @throws InvalidResponseException unexpected response */ function acl_referrer($cdn_acl_referrer="") { if ($this->cfs_http->getCDNMUrl() == NULL) { throw new CDNNotEnabledException( "Authentication response did not indicate CDN availability"); } list($status,$reason) = $this->cfs_http->update_cdn_container($this->name, $this->cdn_ttl, $this->cdn_log_retention, $this->cdn_acl_user_agent, $cdn_acl_referrer ); if (!in_array($status, array(202,404))) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } $this->cdn_acl_referrer = $cdn_acl_referrer; return True; } /** * Enable log retention for this CDN container. * * Enable CDN log retention on the container. If enabled logs will * be periodically (at unpredictable intervals) compressed and * uploaded to a ".CDN_ACCESS_LOGS" container in the form of * "container_name.YYYYMMDDHH-XXXX.gz". Requires CDN be enabled on * the account. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->get_container("public"); * * # Enable logs retention. * $public_container->log_retention(True); * * * @returns boolean True if successful * @throws CDNNotEnabledException CDN functionality not returned during auth * @throws AuthenticationException if auth token is not valid/expired * @throws InvalidResponseException unexpected response */ function log_retention($cdn_log_retention=False) { if ($this->cfs_http->getCDNMUrl() == NULL) { throw new CDNNotEnabledException( "Authentication response did not indicate CDN availability"); } list($status,$reason) = $this->cfs_http->update_cdn_container($this->name, $this->cdn_ttl, $cdn_log_retention, $this->cdn_acl_user_agent, $this->cdn_acl_referrer ); if (!in_array($status, array(202,404))) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } $this->cdn_log_retention = $cdn_log_retention; return True; } /** * Disable the CDN sharing for this container * * Use this method to disallow distribution into the CDN of this Container's * content. * * NOTE: Any content already cached in the CDN will continue to be served * from its cache until the TTL expiration transpires. The default * TTL is typically one day, so "privatizing" the Container will take * up to 24 hours before the content is purged from the CDN cache. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->get_container("public"); * * # Disable CDN accessibility * # ... still cached up to a month based on previous example * # * $public_container->make_private(); * * * @returns boolean True if successful * @throws CDNNotEnabledException CDN functionality not returned during auth * @throws AuthenticationException if auth token is not valid/expired * @throws InvalidResponseException unexpected response */ function make_private() { if ($this->cfs_http->getCDNMUrl() == NULL) { throw new CDNNotEnabledException( "Authentication response did not indicate CDN availability"); } list($status,$reason) = $this->cfs_http->remove_cdn_container($this->name); #if ($status == 401 && $this->_re_auth()) { # return $this->make_private(); #} if (!in_array($status, array(202,404))) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } $this->cdn_enabled = False; $this->cdn_ttl = NULL; $this->cdn_uri = NULL; $this->cdn_ssl_uri = NULL; $this->cdn_streaming_uri - NULL; $this->cdn_log_retention = NULL; $this->cdn_acl_user_agent = NULL; $this->cdn_acl_referrer = NULL; return True; } /** * Check if this Container is being publicly served via CDN * * Use this method to determine if the Container's content is currently * available through the CDN. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->get_container("public"); * * # Display CDN accessibility * # * $public_container->is_public() ? print "Yes" : print "No"; * * * @returns boolean True if enabled, False otherwise */ function is_public() { return $this->cdn_enabled == True ? True : False; } /** * Create a new remote storage Object * * Return a new Object instance. If the remote storage Object exists, * the instance's attributes are populated. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->get_container("public"); * * # This creates a local instance of a storage object but only creates * # it in the storage system when the object's write() method is called. * # * $pic = $public_container->create_object("baby.jpg"); * * * @param string $obj_name name of storage Object * @return obj CF_Object instance */ function create_object($obj_name=NULL) { return new UpdraftPlus_CF_Object($this, $obj_name); } /** * Return an Object instance for the remote storage Object * * Given a name, return a Object instance representing the * remote storage object. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $public_container = $conn->get_container("public"); * * # This call only fetches header information and not the content of * # the storage object. Use the Object's read() or stream() methods * # to obtain the object's data. * # * $pic = $public_container->get_object("baby.jpg"); * * * @param string $obj_name name of storage Object * @return obj CF_Object instance */ function get_object($obj_name=NULL) { return new UpdraftPlus_CF_Object($this, $obj_name, True); } /** * Return a list of Objects * * Return an array of strings listing the Object names in this Container. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $images = $conn->get_container("my photos"); * * # Grab the list of all storage objects * # * $all_objects = $images->list_objects(); * * # Grab subsets of all storage objects * # * $first_ten = $images->list_objects(10); * * # Note the use of the previous result's last object name being * # used as the 'marker' parameter to fetch the next 10 objects * # * $next_ten = $images->list_objects(10, $first_ten[count($first_ten)-1]); * * # Grab images starting with "birthday_party" and default limit/marker * # to match all photos with that prefix * # * $prefixed = $images->list_objects(0, NULL, "birthday"); * * # Assuming you have created the appropriate directory marker Objects, * # you can traverse your pseudo-hierarchical containers * # with the "path" argument. * # * $animals = $images->list_objects(0,NULL,NULL,"pictures/animals"); * $dogs = $images->list_objects(0,NULL,NULL,"pictures/animals/dogs"); * * * @param int $limit optional only return $limit names * @param int $marker optional subset of names starting at $marker * @param string $prefix optional Objects whose names begin with $prefix * @param string $path optional only return results under "pathname" * @return array array of strings * @throws InvalidResponseException unexpected response */ function list_objects($limit=0, $marker=NULL, $prefix=NULL, $path=NULL) { list($status, $reason, $obj_list) = $this->cfs_http->list_objects($this->name, $limit, $marker, $prefix, $path); #if ($status == 401 && $this->_re_auth()) { # return $this->list_objects($limit, $marker, $prefix, $path); #} if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return $obj_list; } /** * Return an array of Objects * * Return an array of Object instances in this Container. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $images = $conn->get_container("my photos"); * * # Grab the list of all storage objects * # * $all_objects = $images->get_objects(); * * # Grab subsets of all storage objects * # * $first_ten = $images->get_objects(10); * * # Note the use of the previous result's last object name being * # used as the 'marker' parameter to fetch the next 10 objects * # * $next_ten = $images->list_objects(10, $first_ten[count($first_ten)-1]); * * # Grab images starting with "birthday_party" and default limit/marker * # to match all photos with that prefix * # * $prefixed = $images->get_objects(0, NULL, "birthday"); * * # Assuming you have created the appropriate directory marker Objects, * # you can traverse your pseudo-hierarchical containers * # with the "path" argument. * # * $animals = $images->get_objects(0,NULL,NULL,"pictures/animals"); * $dogs = $images->get_objects(0,NULL,NULL,"pictures/animals/dogs"); * * * @param int $limit optional only return $limit names * @param int $marker optional subset of names starting at $marker * @param string $prefix optional Objects whose names begin with $prefix * @param string $path optional only return results under "pathname" * @return array array of strings * @throws InvalidResponseException unexpected response */ function get_objects($limit=0, $marker=NULL, $prefix=NULL, $path=NULL, $delimiter=NULL) { list($status, $reason, $obj_array) = $this->cfs_http->get_objects($this->name, $limit, $marker, $prefix, $path, $delimiter); #if ($status == 401 && $this->_re_auth()) { # return $this->get_objects($limit, $marker, $prefix, $path); #} if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } $objects = array(); foreach ($obj_array as $obj) { if(!isset($obj['subdir'])) { $tmp = new UpdraftPlus_CF_Object($this, $obj["name"], False, False); $tmp->content_type = $obj["content_type"]; $tmp->content_length = (float) $obj["bytes"]; $tmp->set_etag($obj["hash"]); $tmp->last_modified = $obj["last_modified"]; $objects[] = $tmp; } } return $objects; } /** * Copy a remote storage Object to a target Container * * Given an Object instance or name and a target Container instance or name, copy copies the remote Object * and all associated metadata. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $images = $conn->get_container("my photos"); * * # Copy specific object * # * $images->copy_object_to("disco_dancing.jpg","container_target"); * * * @param obj $obj name or instance of Object to copy * @param obj $container_target name or instance of target Container * @param string $dest_obj_name name of target object (optional - uses source name if omitted) * @param array $metadata metadata array for new object (optional) * @param array $headers header fields array for the new object (optional) * @return boolean true if successfully copied * @throws SyntaxException invalid Object/Container name * @throws NoSuchObjectException remote Object does not exist * @throws InvalidResponseException unexpected response */ function copy_object_to($obj,$container_target,$dest_obj_name=NULL,$metadata=NULL,$headers=NULL) { $obj_name = NULL; if (is_object($obj)) { if (get_class($obj) == "UpdraftPlus_CF_Object") { $obj_name = $obj->name; } } if (is_string($obj)) { $obj_name = $obj; } if (!$obj_name) { throw new SyntaxException("Object name not set."); } if ($dest_obj_name === NULL) { $dest_obj_name = $obj_name; } $container_name_target = NULL; if (is_object($container_target)) { if (get_class($container_target) == "UpdraftPlus_CF_Container") { $container_name_target = $container_target->name; } } if (is_string($container_target)) { $container_name_target = $container_target; } if (!$container_name_target) { throw new SyntaxException("Container name target not set."); } $status = $this->cfs_http->copy_object($obj_name,$dest_obj_name,$this->name,$container_name_target,$metadata,$headers); if ($status == 404) { $m = "Specified object '".$this->name."/".$obj_name; $m.= "' did not exist as source to copy from or '".$container_name_target."' did not exist as target to copy to."; throw new NoSuchObjectException($m); } if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return true; } /** * Copy a remote storage Object from a source Container * * Given an Object instance or name and a source Container instance or name, copy copies the remote Object * and all associated metadata. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $images = $conn->get_container("my photos"); * * # Copy specific object * # * $images->copy_object_from("disco_dancing.jpg","container_source"); * * * @param obj $obj name or instance of Object to copy * @param obj $container_source name or instance of source Container * @param string $dest_obj_name name of target object (optional - uses source name if omitted) * @param array $metadata metadata array for new object (optional) * @param array $headers header fields array for the new object (optional) * @return boolean true if successfully copied * @throws SyntaxException invalid Object/Container name * @throws NoSuchObjectException remote Object does not exist * @throws InvalidResponseException unexpected response */ function copy_object_from($obj,$container_source,$dest_obj_name=NULL,$metadata=NULL,$headers=NULL) { $obj_name = NULL; if (is_object($obj)) { if (get_class($obj) == "UpdraftPlus_CF_Object") { $obj_name = $obj->name; } } if (is_string($obj)) { $obj_name = $obj; } if (!$obj_name) { throw new SyntaxException("Object name not set."); } if ($dest_obj_name === NULL) { $dest_obj_name = $obj_name; } $container_name_source = NULL; if (is_object($container_source)) { if (get_class($container_source) == "UpdraftPlus_CF_Container") { $container_name_source = $container_source->name; } } if (is_string($container_source)) { $container_name_source = $container_source; } if (!$container_name_source) { throw new SyntaxException("Container name source not set."); } $status = $this->cfs_http->copy_object($obj_name,$dest_obj_name,$container_name_source,$this->name,$metadata,$headers); if ($status == 404) { $m = "Specified object '".$container_name_source."/".$obj_name; $m.= "' did not exist as source to copy from or '".$this->name."/".$obj_name."' did not exist as target to copy to."; throw new NoSuchObjectException($m); } if ($status < 200 || $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return true; } /** * Move a remote storage Object to a target Container * * Given an Object instance or name and a target Container instance or name, move copies the remote Object * and all associated metadata and deletes the source Object afterwards * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $images = $conn->get_container("my photos"); * * # Move specific object * # * $images->move_object_to("disco_dancing.jpg","container_target"); * * * @param obj $obj name or instance of Object to move * @param obj $container_target name or instance of target Container * @param string $dest_obj_name name of target object (optional - uses source name if omitted) * @param array $metadata metadata array for new object (optional) * @param array $headers header fields array for the new object (optional) * @return boolean true if successfully moved * @throws SyntaxException invalid Object/Container name * @throws NoSuchObjectException remote Object does not exist * @throws InvalidResponseException unexpected response */ function move_object_to($obj,$container_target,$dest_obj_name=NULL,$metadata=NULL,$headers=NULL) { $retVal = false; if(self::copy_object_to($obj,$container_target,$dest_obj_name,$metadata,$headers)) { $retVal = self::delete_object($obj,$this->name); } return $retVal; } /** * Move a remote storage Object from a source Container * * Given an Object instance or name and a source Container instance or name, move copies the remote Object * and all associated metadata and deletes the source Object afterwards * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $images = $conn->get_container("my photos"); * * # Move specific object * # * $images->move_object_from("disco_dancing.jpg","container_target"); * * * @param obj $obj name or instance of Object to move * @param obj $container_source name or instance of target Container * @param string $dest_obj_name name of target object (optional - uses source name if omitted) * @param array $metadata metadata array for new object (optional) * @param array $headers header fields array for the new object (optional) * @return boolean true if successfully moved * @throws SyntaxException invalid Object/Container name * @throws NoSuchObjectException remote Object does not exist * @throws InvalidResponseException unexpected response */ function move_object_from($obj,$container_source,$dest_obj_name=NULL,$metadata=NULL,$headers=NULL) { $retVal = false; if(self::copy_object_from($obj,$container_source,$dest_obj_name,$metadata,$headers)) { $retVal = self::delete_object($obj,$container_source); } return $retVal; } /** * Delete a remote storage Object * * Given an Object instance or name, permanently remove the remote Object * and all associated metadata. * * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * * $images = $conn->get_container("my photos"); * * # Delete specific object * # * $images->delete_object("disco_dancing.jpg"); * * * @param obj $obj name or instance of Object to delete * @param obj $container name or instance of Container in which the object resides (optional) * @return boolean True if successfully removed * @throws SyntaxException invalid Object name * @throws NoSuchObjectException remote Object does not exist * @throws InvalidResponseException unexpected response */ function delete_object($obj,$container=NULL) { $obj_name = NULL; if (is_object($obj)) { if (get_class($obj) == "UpdraftPlus_CF_Object") { $obj_name = $obj->name; } } if (is_string($obj)) { $obj_name = $obj; } if (!$obj_name) { throw new SyntaxException("Object name not set."); } $container_name = NULL; if($container === NULL) { $container_name = $this->name; } else { if (is_object($container)) { if (get_class($container) == "UpdraftPlus_CF_Container") { $container_name = $container->name; } } if (is_string($container)) { $container_name = $container; } if (!$container_name) { throw new SyntaxException("Container name source not set."); } } $status = $this->cfs_http->delete_object($container_name, $obj_name); #if ($status == 401 && $this->_re_auth()) { # return $this->delete_object($obj); #} if ($status == 404) { $m = "Specified object '".$container_name."/".$obj_name; $m.= "' did not exist to delete."; throw new NoSuchObjectException($m); } if ($status != 204) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } return True; } /** * Helper function to create "path" elements for a given Object name * * Given an Object whose name contains '/' path separators, this function * will create the "directory marker" Objects of one byte with the * Content-Type of "application/directory". * * It assumes the last element of the full path is the "real" Object * and does NOT create a remote storage Object for that last element. */ function create_paths($path_name) { if ($path_name[0] == '/') { $path_name = mb_substr($path_name, 0, 1); } $elements = explode('/', $path_name, -1); $build_path = ""; foreach ($elements as $idx => $val) { if (!$build_path) { $build_path = $val; } else { $build_path .= "/" . $val; } $obj = new UpdraftPlus_CF_Object($this, $build_path); $obj->content_type = "application/directory"; $obj->write(".", 1); } } /** * Internal method to grab CDN/Container info if appropriate to do so * * @throws InvalidResponseException unexpected response */ private function _cdn_initialize() { list($status, $reason, $cdn_enabled, $cdn_ssl_uri, $cdn_streaming_uri, $cdn_uri, $cdn_ttl, $cdn_log_retention, $cdn_acl_user_agent, $cdn_acl_referrer) = $this->cfs_http->head_cdn_container($this->name); #if ($status == 401 && $this->_re_auth()) { # return $this->_cdn_initialize(); #} if (!in_array($status, array(204,404))) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->cfs_http->get_error()); } $this->cdn_enabled = $cdn_enabled; $this->cdn_streaming_uri = $cdn_streaming_uri; $this->cdn_ssl_uri = $cdn_ssl_uri; $this->cdn_uri = $cdn_uri; $this->cdn_ttl = $cdn_ttl; $this->cdn_log_retention = $cdn_log_retention; $this->cdn_acl_user_agent = $cdn_acl_user_agent; $this->cdn_acl_referrer = $cdn_acl_referrer; } #private function _re_auth() #{ # $new_auth = new CF_Authentication( # $this->cfs_auth->username, # $this->cfs_auth->api_key, # $this->cfs_auth->auth_host, # $this->cfs_auth->account); # $new_auth->authenticate(); # $this->cfs_auth = $new_auth; # $this->cfs_http->setCFAuth($this->cfs_auth); # return True; #} } /** * Object operations * * An Object is analogous to a file on a conventional filesystem. You can * read data from, or write data to your Objects. You can also associate * arbitrary metadata with them. * * @package php-cloudfiles */ class UpdraftPlus_CF_Object { public $container; public $name; public $last_modified; public $content_type; public $content_length; public $metadata; public $headers; public $manifest; private $etag; /** * Class constructor * * @param obj $container CF_Container instance * @param string $name name of Object * @param boolean $force_exists if set, throw an error if Object doesn't exist */ function __construct(&$container, $name, $force_exists=False, $dohead=True) { if ($name[0] == "/") { $r = "Object name '".$name; $r .= "' cannot contain begin with a '/' character."; throw new SyntaxException($r); } if (strlen($name) > MAX_OBJECT_NAME_LEN) { throw new SyntaxException("Object name exceeds " . "maximum allowed length."); } $this->container = $container; $this->name = $name; $this->etag = NULL; $this->_etag_override = False; $this->last_modified = NULL; $this->content_type = NULL; $this->content_length = 0; $this->metadata = array(); $this->headers = array(); $this->manifest = NULL; if ($dohead) { if (!$this->_initialize() && $force_exists) { throw new NoSuchObjectException("No such object '".$name."'"); } } } /** * String representation of Object * * Pretty print the Object's location and name * * @return string Object information */ function __toString() { return $this->container->name . "/" . $this->name; } /** * Internal check to get the proper mimetype. * * This function would go over the available PHP methods to get * the MIME type. * * By default it will try to use the PHP fileinfo library which is * available from PHP 5.3 or as an PECL extension * (http://pecl.php.net/package/Fileinfo). * * It will get the magic file by default from the system wide file * which is usually available in /usr/share/magic on Unix or try * to use the file specified in the source directory of the API * (share directory). * * if fileinfo is not available it will try to use the internal * mime_content_type function. * * @param string $handle name of file or buffer to guess the type from * @return boolean True if successful * @throws BadContentTypeException */ function _guess_content_type($handle) { if ($this->content_type) return; if (function_exists("finfo_open")) { $local_magic = dirname(__FILE__) . "/share/magic"; $finfo = @finfo_open(FILEINFO_MIME, $local_magic); if (!$finfo) $finfo = @finfo_open(FILEINFO_MIME); if ($finfo) { if (is_file((string)$handle)) $ct = @finfo_file($finfo, $handle); else $ct = @finfo_buffer($finfo, $handle); /* PHP 5.3 fileinfo display extra information like charset so we remove everything after the ; since we are not into that stuff */ if ($ct) { $extra_content_type_info = strpos($ct, "; "); if ($extra_content_type_info) $ct = substr($ct, 0, $extra_content_type_info); } if ($ct && $ct != 'application/octet-stream') $this->content_type = $ct; @finfo_close($finfo); } } if (!$this->content_type && (string)is_file($handle) && function_exists("mime_content_type")) { $this->content_type = @mime_content_type($handle); } if (!$this->content_type) { throw new BadContentTypeException("Required Content-Type not set"); } return True; } /** * String representation of the Object's public URI * * A string representing the Object's public URI assuming that it's * parent Container is CDN-enabled. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * # Print out the Object's CDN URI (if it has one) in an HTML img-tag * # * print "\n"; * * * @return string Object's public URI or NULL */ function public_uri() { if ($this->container->cdn_enabled) { return $this->container->cdn_uri . "/" . $this->name; } return NULL; } /** * String representation of the Object's public SSL URI * * A string representing the Object's public SSL URI assuming that it's * parent Container is CDN-enabled. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * # Print out the Object's CDN SSL URI (if it has one) in an HTML img-tag * # * print "\n"; * * * @return string Object's public SSL URI or NULL */ function public_ssl_uri() { if ($this->container->cdn_enabled) { return $this->container->cdn_ssl_uri . "/" . $this->name; } return NULL; } /** * String representation of the Object's public Streaming URI * * A string representing the Object's public Streaming URI assuming that it's * parent Container is CDN-enabled. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * # Print out the Object's CDN Streaming URI (if it has one) in an HTML img-tag * # * print "\n"; * * * @return string Object's public Streaming URI or NULL */ function public_streaming_uri() { if ($this->container->cdn_enabled) { return $this->container->cdn_streaming_uri . "/" . $this->name; } return NULL; } /** * Read the remote Object's data * * Returns the Object's data. This is useful for smaller Objects such * as images or office documents. Object's with larger content should use * the stream() method below. * * Pass in $hdrs array to set specific custom HTTP headers such as * If-Match, If-None-Match, If-Modified-Since, Range, etc. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * $my_docs = $conn->get_container("documents"); * $doc = $my_docs->get_object("README"); * $data = $doc->read(); # read image content into a string variable * print $data; * * # Or see stream() below for a different example. * # * * * @param array $hdrs user-defined headers (Range, If-Match, etc.) * @return string Object's data * @throws InvalidResponseException unexpected response */ function read($hdrs=array()) { list($status, $reason, $data) = $this->container->cfs_http->get_object_to_string($this, $hdrs); #if ($status == 401 && $this->_re_auth()) { # return $this->read($hdrs); #} if (($status < 200) || ($status > 299 && $status != 412 && $status != 304)) { throw new InvalidResponseException("Invalid response (".$status."): " . $this->container->cfs_http->get_error()); } return $data; } /** * Streaming read of Object's data * * Given an open PHP resource (see PHP's fopen() method), fetch the Object's * data and write it to the open resource handle. This is useful for * streaming an Object's content to the browser (videos, images) or for * fetching content to a local file. * * Pass in $hdrs array to set specific custom HTTP headers such as * If-Match, If-None-Match, If-Modified-Since, Range, etc. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * # Assuming this is a web script to display the README to the * # user's browser: * # * get_container("documents"); * $doc = $my_docs->get_object("README"); * * // Hand it back to user's browser with appropriate content-type * // * header("Content-Type: " . $doc->content_type); * $output = fopen("php://output", "w"); * $doc->stream($output); # stream object content to PHP's output buffer * fclose($output); * ?> * * # See read() above for a more simple example. * # * * * @param resource $fp open resource for writing data to * @param array $hdrs user-defined headers (Range, If-Match, etc.) * @return string Object's data * @throws InvalidResponseException unexpected response */ function stream(&$fp, $hdrs=array()) { list($status, $reason) = $this->container->cfs_http->get_object_to_stream($this,$fp,$hdrs); #if ($status == 401 && $this->_re_auth()) { # return $this->stream($fp, $hdrs); #} if (($status < 200) || ($status > 299 && $status != 412 && $status != 304)) { throw new InvalidResponseException("Invalid response (".$status."): " .$reason); } return True; } /** * Store new Object metadata * * Write's an Object's metadata to the remote Object. This will overwrite * an prior Object metadata. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * $my_docs = $conn->get_container("documents"); * $doc = $my_docs->get_object("README"); * * # Define new metadata for the object * # * $doc->metadata = array( * "Author" => "EJ", * "Subject" => "How to use the PHP tests", * "Version" => "1.2.2" * ); * * # Define additional headers for the object * # * $doc->headers = array( * "Content-Disposition" => "attachment", * ); * * # Push the new metadata up to the storage system * # * $doc->sync_metadata(); * * * @return boolean True if successful, False otherwise * @throws InvalidResponseException unexpected response */ function sync_metadata() { if (!empty($this->metadata) || !empty($this->headers) || $this->manifest) { $status = $this->container->cfs_http->update_object($this); #if ($status == 401 && $this->_re_auth()) { # return $this->sync_metadata(); #} if ($status != 202) { throw new InvalidResponseException("Invalid response (" .$status."): ".$this->container->cfs_http->get_error()); } return True; } return False; } /** * Store new Object manifest * * Write's an Object's manifest to the remote Object. This will overwrite * an prior Object manifest. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * $my_docs = $conn->get_container("documents"); * $doc = $my_docs->get_object("README"); * * # Define new manifest for the object * # * $doc->manifest = "container/prefix"; * * # Push the new manifest up to the storage system * # * $doc->sync_manifest(); * * * @return boolean True if successful, False otherwise * @throws InvalidResponseException unexpected response */ function sync_manifest() { return $this->sync_metadata(); } /** * Upload Object's data to Cloud Files * * Write data to the remote Object. The $data argument can either be a * PHP resource open for reading (see PHP's fopen() method) or an in-memory * variable. If passing in a PHP resource, you must also include the $bytes * parameter. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * $my_docs = $conn->get_container("documents"); * $doc = $my_docs->get_object("README"); * * # Upload placeholder text in my README * # * $doc->write("This is just placeholder text for now..."); * * * @param string|resource $data string or open resource * @param float $bytes amount of data to upload (required for resources) * @param boolean $verify generate, send, and compare MD5 checksums * @return boolean True when data uploaded successfully * @throws SyntaxException missing required parameters * @throws BadContentTypeException if no Content-Type was/could be set * @throws MisMatchedChecksumException $verify is set and checksums unequal * @throws InvalidResponseException unexpected response */ function write($data=NULL, $bytes=0, $verify=True) { if (!$data && !is_string($data)) { throw new SyntaxException("Missing data source."); } if ($bytes > MAX_OBJECT_SIZE) { throw new SyntaxException("Bytes exceeds maximum object size."); } if ($verify) { if (!$this->_etag_override) { $this->etag = $this->compute_md5sum($data); } } else { $this->etag = NULL; } $close_fh = False; if (!is_resource($data)) { # A hack to treat string data as a file handle. php://memory feels # like a better option, but it seems to break on Windows so use # a temporary file instead. # $fp = fopen("php://temp", "wb+"); #$fp = fopen("php://memory", "wb+"); fwrite($fp, $data, strlen($data)); rewind($fp); $close_fh = True; $this->content_length = (float) strlen($data); if ($this->content_length > MAX_OBJECT_SIZE) { throw new SyntaxException("Data exceeds maximum object size"); } $ct_data = substr($data, 0, 64); } else { // The original Rackspace library used rewind() instead of ftell/fseek here - which meant fseek(0), which was sometimes wrong $fpos = ftell($data); $this->content_length = $bytes; $fp = $data; $ct_data = fread($data, 64); fseek($data, $fpos); } $this->_guess_content_type($ct_data); list($status, $reason, $etag) = $this->container->cfs_http->put_object($this, $fp); #if ($status == 401 && $this->_re_auth()) { # return $this->write($data, $bytes, $verify); #} if ($status == 412) { if ($close_fh) { fclose($fp); } throw new SyntaxException("Missing Content-Type header"); } if ($status == 422) { if ($close_fh) { fclose($fp); } throw new MisMatchedChecksumException( "Supplied and computed checksums do not match."); } if ($status != 201) { if ($close_fh) { fclose($fp); } throw new InvalidResponseException("Invalid response (".$status."): " . $this->container->cfs_http->get_error()); } if (!$verify) { $this->etag = $etag; } if ($close_fh) { fclose($fp); } return True; } /** * Upload Object data from local filename * * This is a convenience function to upload the data from a local file. A * True value for $verify will cause the method to compute the Object's MD5 * checksum prior to uploading. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * $my_docs = $conn->get_container("documents"); * $doc = $my_docs->get_object("README"); * * # Upload my local README's content * # * $doc->load_from_filename("/home/ej/cloudfiles/readme"); * * * @param string $filename full path to local file * @param boolean $verify enable local/remote MD5 checksum validation * @return boolean True if data uploaded successfully * @throws SyntaxException missing required parameters * @throws BadContentTypeException if no Content-Type was/could be set * @throws MisMatchedChecksumException $verify is set and checksums unequal * @throws InvalidResponseException unexpected response * @throws IOException error opening file */ function load_from_filename($filename, $verify=True) { $fp = @fopen($filename, "r"); if (!$fp) { throw new IOException("Could not open file for reading: ".$filename); } clearstatcache(); $size = (float) sprintf("%u", filesize($filename)); if ($size > MAX_OBJECT_SIZE) { throw new SyntaxException("File size exceeds maximum object size."); } $this->_guess_content_type($filename); $this->write($fp, $size, $verify); fclose($fp); return True; } /** * Save Object's data to local filename * * Given a local filename, the Object's data will be written to the newly * created file. * * Example: * * # ... authentication/connection/container code excluded * # ... see previous examples * * # Whoops! I deleted my local README, let me download/save it * # * $my_docs = $conn->get_container("documents"); * $doc = $my_docs->get_object("README"); * * $doc->save_to_filename("/home/ej/cloudfiles/readme.restored"); * * * @param string $filename name of local file to write data to * @return boolean True if successful * @throws IOException error opening file * @throws InvalidResponseException unexpected response */ function save_to_filename($filename) { $fp = @fopen($filename, "wb"); if (!$fp) { throw new IOException("Could not open file for writing: ".$filename); } $result = $this->stream($fp); fclose($fp); return $result; } /** * Purge this Object from CDN Cache. * Example: * * # ... authentication code excluded (see previous examples) ... * # * $conn = new CF_Connection($auth); * $container = $conn->get_container("cdn_enabled"); * $obj = $container->get_object("object"); * $obj->purge_from_cdn("user@domain.com"); * # or * $obj->purge_from_cdn(); * # or * $obj->purge_from_cdn("user1@domain.com,user2@domain.com"); * * @returns boolean True if successful * @throws CDNNotEnabledException if CDN Is not enabled on this connection * @throws InvalidResponseException if the response expected is not returned */ function purge_from_cdn($email=null) { if (!$this->container->cfs_http->getCDNMUrl()) { throw new CDNNotEnabledException( "Authentication response did not indicate CDN availability"); } $status = $this->container->cfs_http->purge_from_cdn($this->container->name . "/" . $this->name, $email); if ($status < 199 or $status > 299) { throw new InvalidResponseException( "Invalid response (".$status."): ".$this->container->cfs_http->get_error()); } return True; } /** * Set Object's MD5 checksum * * Manually set the Object's ETag. Including the ETag is mandatory for * Cloud Files to perform end-to-end verification. Omitting the ETag forces * the user to handle any data integrity checks. * * @param string $etag MD5 checksum hexadecimal string */ function set_etag($etag) { $this->etag = $etag; $this->_etag_override = True; } /** * Object's MD5 checksum * * Accessor method for reading Object's private ETag attribute. * * @return string MD5 checksum hexadecimal string */ function getETag() { return $this->etag; } /** * Compute the MD5 checksum * * Calculate the MD5 checksum on either a PHP resource or data. The argument * may either be a local filename, open resource for reading, or a string. * * WARNING: if you are uploading a big file over a stream * it could get very slow to compute the md5 you probably want to * set the $verify parameter to False in the write() method and * compute yourself the md5 before if you have it. * * @param filename|obj|string $data filename, open resource, or string * @return string MD5 checksum hexadecimal string */ function compute_md5sum(&$data) { if (function_exists("hash_init") && is_resource($data)) { $ctx = hash_init('md5'); $fpos = ftell($data); while (!feof($data)) { $buffer = fgets($data, 65536); hash_update($ctx, $buffer); } $md5 = hash_final($ctx, false); fseek($data, $fpos); } elseif ((string)is_file($data)) { $md5 = md5_file($data); } else { $md5 = md5($data); } return $md5; } /** * PRIVATE: fetch information about the remote Object if it exists */ private function _initialize() { list($status, $reason, $etag, $last_modified, $content_type, $content_length, $metadata, $manifest, $headers) = $this->container->cfs_http->head_object($this); #if ($status == 401 && $this->_re_auth()) { # return $this->_initialize(); #} if ($status == 404) { return False; } if ($status < 200 || $status > 299) { throw new InvalidResponseException("Invalid response (".$status."): " . $this->container->cfs_http->get_error()); } $this->etag = $etag; $this->last_modified = $last_modified; $this->content_type = $content_type; $this->content_length = $content_length; $this->metadata = $metadata; $this->headers = $headers; $this->manifest = $manifest; return True; } /** * Generate a Temp Url for a object * Example: * * # ... authentication code excluded (see previous examples) ... * $conn = new CF_Connection($auth); * $container = $conn->get_container("foo"); * $obj = $container->get_object("foo"); * $tempurl = $obj->get_temp_url("shared_secret", "expire_time_in_seconds", "{HTTP_METHOD}"); (note: replace {HTTP_METHOD} with the request method: GET, POST, PUT, DELETE, etc. * * @returns The temp url */ public function get_temp_url($key, $expires, $method) { $expires += time(); $url = $this->container->cfs_http->getStorageUrl() . '/' . $this->container->name . '/' . $this->name; return $url . '?temp_url_sig=' . hash_hmac('sha1', strtoupper($method) . "\n" . $expires . "\n" . parse_url($url, PHP_URL_PATH), $key) . '&temp_url_expires=' . $expires; } /** * Generate hidden input for form post. * @returns array Returns an associative array with form post input. */ public function get_form_post_input($key, $expires, $redirect, $max_file_size=5368709120, $max_file_count=1) { $expires += time(); $url = $this->container->cfs_http->getStorageUrl() . '/' . $this->container->name . '/' . $this->name; $form_post = array('action' => $url, 'redirect' => $redirect, 'max_file_size' => $max_file_size, 'expires' => $expires, 'file' => $this->name); $form_post['signature'] = hash_hmac('sha1', parse_url($url, PHP_URL_PATH) . "\n" . $redirect . "\n" . $max_file_size . "\n" . $max_file_count . "\n" . $expires, $key ); return $form_post; } #private function _re_auth() #{ # $new_auth = new CF_Authentication( # $this->cfs_auth->username, # $this->cfs_auth->api_key, # $this->cfs_auth->auth_host, # $this->cfs_auth->account); # $new_auth->authenticate(); # $this->container->cfs_auth = $new_auth; # $this->container->cfs_http->setCFAuth($this->cfs_auth); # return True; #} } /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * c-hanging-comment-ender-p: nil * End: */ ?> PKwL\YMM9updraftplus/includes/cloudfiles/cloudfiles_exceptions.phpnu[ * @copyright Copyright (c) 2008, Rackspace US, Inc. * @package php-cloudfiles-exceptions */ /** * Custom Exceptions for the CloudFiles API * @package php-cloudfiles-exceptions */ if (!class_exists('SyntaxException')) { class SyntaxException extends Exception { } } if (!class_exists('AuthenticationException')) { class AuthenticationException extends Exception { } } if (!class_exists('InvalidResponseException')) { class InvalidResponseException extends Exception { } } if (!class_exists('NonEmptyContainerException')) { class NonEmptyContainerException extends Exception { } } if (!class_exists('NoSuchObjectException')) { class NoSuchObjectException extends Exception { } } if (!class_exists('NoSuchContainerException')) { class NoSuchContainerException extends Exception { } } if (!class_exists('NoSuchAccountException')) { class NoSuchAccountException extends Exception { } } if (!class_exists('MisMatchedChecksumException')) { class MisMatchedChecksumException extends Exception { } } if (!class_exists('IOException')) { class IOException extends Exception { } } if (!class_exists('CDNNotEnabledException')) { class CDNNotEnabledException extends Exception { } } if (!class_exists('BadContentTypeException')) { class BadContentTypeException extends Exception { } } if (!class_exists('InvalidUTF8Exception')) { class InvalidUTF8Exception extends Exception { } } if (!class_exists('ConnectionNotOpenException')) { class ConnectionNotOpenException extends Exception { } } /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * c-hanging-comment-ender-p: nil * End: */ ?> PKwL\AVn3updraftplus/includes/cloudfiles/cloudfiles_http.phpnu[ * @copyright Copyright (c) 2008, Rackspace US, Inc. * @package php-cloudfiles-http */ /** */ require_once("cloudfiles_exceptions.php"); @define("PHP_CF_VERSION", "1.7.11"); @define("USER_AGENT", sprintf("PHP-CloudFiles/%s", PHP_CF_VERSION)); @define("MAX_HEADER_NAME_LEN", 128); @define("MAX_HEADER_VALUE_LEN", 256); @define("ACCOUNT_CONTAINER_COUNT", "X-Account-Container-Count"); @define("ACCOUNT_BYTES_USED", "X-Account-Bytes-Used"); @define("ACCOUNT_KEY", "X-Account-Meta-Key"); @define("ACCOUNT_METADATA_HEADER_PREFIX", "X-Account-Meta-"); @define("CONTAINER_OBJ_COUNT", "X-Container-Object-Count"); @define("CONTAINER_BYTES_USED", "X-Container-Bytes-Used"); @define("CONTAINER_METADATA_HEADER_PREFIX", "X-Container-Meta-"); @define("DELETE_AFTER", "X-Delete-After"); @define("DELETE_AT", "X-Delete-At"); @define("MANIFEST_HEADER", "X-Object-Manifest"); @define("METADATA_HEADER_PREFIX", "X-Object-Meta-"); @define("CONTENT_HEADER_PREFIX", "Content-"); @define("ACCESS_CONTROL_HEADER_PREFIX", "Access-Control-"); @define("ORIGIN_HEADER", "Origin"); @define("CDN_URI", "X-CDN-URI"); @define("CDN_SSL_URI", "X-CDN-SSL-URI"); @define("CDN_STREAMING_URI", "X-CDN-Streaming-URI"); @define("CDN_ENABLED", "X-CDN-Enabled"); @define("CDN_LOG_RETENTION", "X-Log-Retention"); @define("CDN_ACL_USER_AGENT", "X-User-Agent-ACL"); @define("CDN_ACL_REFERRER", "X-Referrer-ACL"); @define("CDN_TTL", "X-TTL"); @define("CDNM_URL", "X-CDN-Management-Url"); @define("STORAGE_URL", "X-Storage-Url"); @define("AUTH_TOKEN", "X-Auth-Token"); @define("AUTH_USER_HEADER", "X-Auth-User"); @define("AUTH_KEY_HEADER", "X-Auth-Key"); @define("AUTH_USER_HEADER_LEGACY", "X-Storage-User"); @define("AUTH_KEY_HEADER_LEGACY", "X-Storage-Pass"); @define("AUTH_TOKEN_LEGACY", "X-Storage-Token"); @define("CDN_EMAIL", "X-Purge-Email"); @define("DESTINATION", "Destination"); @define("ETAG_HEADER", "ETag"); @define("LAST_MODIFIED_HEADER", "Last-Modified"); @define("CONTENT_TYPE_HEADER", "Content-Type"); @define("CONTENT_LENGTH_HEADER", "Content-Length"); @define("USER_AGENT_HEADER", "User-Agent"); /** * HTTP/cURL wrapper for Cloud Files * * This class should not be used directly. It's only purpose is to abstract * out the HTTP communication from the main API. * * @package php-cloudfiles-http */ class UpdraftPlus_CF_Http { private $error_str; private $dbug; private $cabundle_path; private $api_version; # Authentication instance variables # private $storage_url; private $cdnm_url; private $auth_token; # Request/response variables # private $response_status; private $response_reason; private $connections; # Variables used for content/header callbacks # private $_user_read_progress_callback_func; private $_user_write_progress_callback_func; private $_write_callback_type; private $_text_list; private $_account_metadata; private $_account_container_count; private $_account_bytes_used; private $_account_key; private $_container_metadata; private $_container_object_count; private $_container_bytes_used; private $_obj_delete_after; private $_obj_delete_at; private $_obj_etag; private $_obj_last_modified; private $_obj_content_type; private $_obj_content_length; private $_obj_metadata; private $_obj_headers; private $_obj_manifest; private $_obj_write_resource; private $_obj_write_string; private $_cdn_enabled; private $_cdn_ssl_uri; private $_cdn_streaming_uri; private $_cdn_uri; private $_cdn_ttl; private $_cdn_log_retention; private $_cdn_acl_user_agent; private $_cdn_acl_referrer; function __construct($api_version) { $this->dbug = False; $this->cabundle_path = NULL; $this->api_version = $api_version; $this->error_str = NULL; $this->storage_url = NULL; $this->cdnm_url = NULL; $this->auth_token = NULL; $this->response_status = NULL; $this->response_reason = NULL; # Curl connections array - since there is no way to "re-set" the # connection parameters for a cURL handle, we keep an array of # the unique use-cases and funnel all of those same type # requests through the appropriate curl connection. # $this->connections = array( "GET_CALL" => NULL, # GET objects/containers/lists "PUT_OBJ" => NULL, # PUT object "HEAD" => NULL, # HEAD requests "PUT_CONT" => NULL, # PUT container "DEL_POST" => NULL, # DELETE containers/objects, POST objects "COPY" => null, # COPY objects ); $this->_user_read_progress_callback_func = NULL; $this->_user_write_progress_callback_func = NULL; $this->_write_callback_type = NULL; $this->_text_list = array(); $this->_return_list = NULL; $this->_account_metadata = array(); $this->_account_key = NULL; $this->_account_container_count = 0; $this->_account_bytes_used = 0; $this->_container_metadata = array(); $this->_container_object_count = 0; $this->_container_bytes_used = 0; $this->_obj_delete_after = NULL; $this->_obj_delete_at = NULL; $this->_obj_write_resource = NULL; $this->_obj_write_string = ""; $this->_obj_etag = NULL; $this->_obj_last_modified = NULL; $this->_obj_content_type = NULL; $this->_obj_content_length = NULL; $this->_obj_metadata = array(); $this->_obj_manifest = NULL; $this->_obj_headers = NULL; $this->_cdn_enabled = NULL; $this->_cdn_ssl_uri = NULL; $this->_cdn_streaming_uri = NULL; $this->_cdn_uri = NULL; $this->_cdn_ttl = NULL; $this->_cdn_log_retention = NULL; $this->_cdn_acl_user_agent = NULL; $this->_cdn_acl_referrer = NULL; # The OS list with a PHP without an updated CA File for CURL to # connect to SSL Websites. It is the first 3 letters of the PHP_OS # variable. $OS_CAFILE_NONUPDATED=array( "win","dar" ); // We don't want this happening automatically - since the UpdraftPlus default is to use our own certificate already // if (in_array((strtolower (substr(PHP_OS, 0,3))), $OS_CAFILE_NONUPDATED)) // $this->ssl_use_cabundle(); } function ssl_use_cabundle($path=NULL) { if ($path) { $this->cabundle_path = $path; } else { $this->cabundle_path = UPDRAFTPLUS_DIR.'/includes/cacert.pem'; } if (!file_exists($this->cabundle_path)) { throw new IOException("Could not use CA bundle: " . $this->cabundle_path); } return; } # Uses separate cURL connection to authenticate # function authenticate($user, $pass, $acct=NULL, $host=NULL) { $path = array(); if (isset($acct)){ $headers = array( sprintf("%s: %s", AUTH_USER_HEADER_LEGACY, $user), sprintf("%s: %s", AUTH_KEY_HEADER_LEGACY, $pass), ); $path[] = $host; $path[] = rawurlencode(sprintf("v%d",$this->api_version)); $path[] = rawurlencode($acct); } else { $headers = array( sprintf("%s: %s", AUTH_USER_HEADER, $user), sprintf("%s: %s", AUTH_KEY_HEADER, $pass), ); $path[] = $host; } $path[] = "v1.0"; $url = implode("/", $path); $curl_ch = curl_init(); if (!is_null($this->cabundle_path)) { curl_setopt($curl_ch, CURLOPT_CAINFO, $this->cabundle_path); } if (defined('UPDRAFTPLUS_SSL_DISABLEVERIFY')) { curl_setopt($curl_ch, CURLOPT_SSL_VERIFYPEER, UPDRAFTPLUS_SSL_DISABLEVERIFY); } elseif (UpdraftPlus_Options::get_updraft_option('updraft_ssl_disableverify')) { curl_setopt($curl_ch, CURLOPT_SSL_VERIFYPEER, false); } else { curl_setopt($curl_ch, CURLOPT_SSL_VERIFYPEER, true); } curl_setopt($curl_ch, CURLOPT_VERBOSE, $this->dbug); curl_setopt($curl_ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl_ch, CURLOPT_MAXREDIRS, 4); curl_setopt($curl_ch, CURLOPT_HEADER, 0); curl_setopt($curl_ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl_ch, CURLOPT_USERAGENT, USER_AGENT); curl_setopt($curl_ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl_ch, CURLOPT_HEADERFUNCTION,array(&$this,'_auth_hdr_cb')); curl_setopt($curl_ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($curl_ch, CURLOPT_URL, $url); curl_exec($curl_ch); curl_close($curl_ch); return array($this->response_status, $this->response_reason, $this->storage_url, $this->cdnm_url, $this->auth_token); } # (CDN) GET /v1/Account # function list_cdn_containers($enabled_only) { $conn_type = "GET_CALL"; $url_path = $this->_make_path("CDN"); $this->_write_callback_type = "TEXT_LIST"; if ($enabled_only) { $return_code = $this->_send_request($conn_type, $url_path . '/?enabled_only=true'); } else { $return_code = $this->_send_request($conn_type, $url_path); } if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,array()); } if ($return_code == 401) { return array($return_code,"Unauthorized",array()); } if ($return_code == 404) { return array($return_code,"Account not found.",array()); } if ($return_code == 204) { return array($return_code,"Account has no CDN enabled Containers.", array()); } if ($return_code == 200) { $this->create_array(); return array($return_code,$this->response_reason,$this->_text_list); } $this->error_str = "Unexpected HTTP response: ".$this->response_reason; return array($return_code,$this->error_str,array()); } # (CDN) DELETE /v1/Account/Container or /v1/Account/Container/Object # function purge_from_cdn($path, $email=null) { if(!$path) throw new SyntaxException("Path not set"); $url_path = $this->_make_path("CDN", NULL, $path); if($email) { $hdrs = array(CDN_EMAIL => $email); $return_code = $this->_send_request("DEL_POST",$url_path,$hdrs,"DELETE"); } else $return_code = $this->_send_request("DEL_POST",$url_path,null,"DELETE"); return $return_code; } # (CDN) POST /v1/Account/Container function update_cdn_container($container_name, $ttl=86400, $cdn_log_retention=False, $cdn_acl_user_agent="", $cdn_acl_referrer) { if ($container_name == "") throw new SyntaxException("Container name not set."); if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Container name not set."); $url_path = $this->_make_path("CDN", $container_name); $hdrs = array( CDN_ENABLED => "True", CDN_TTL => $ttl, CDN_LOG_RETENTION => $cdn_log_retention ? "True" : "False", CDN_ACL_USER_AGENT => $cdn_acl_user_agent, CDN_ACL_REFERRER => $cdn_acl_referrer, ); $return_code = $this->_send_request("DEL_POST",$url_path,$hdrs,"POST"); if ($return_code == 401) { $this->error_str = "Unauthorized"; return array($return_code, $this->error_str, NULL); } if ($return_code == 404) { $this->error_str = "Container not found."; return array($return_code, $this->error_str, NULL); } if ($return_code != 202) { $this->error_str="Unexpected HTTP response: ".$this->response_reason; return array($return_code, $this->error_str, NULL); } return array($return_code, "Accepted", $this->_cdn_uri, $this->_cdn_ssl_uri); } # (CDN) PUT /v1/Account/Container # function add_cdn_container($container_name, $ttl=86400) { if ($container_name == "") throw new SyntaxException("Container name not set."); if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Container name not set."); $url_path = $this->_make_path("CDN", $container_name); $hdrs = array( CDN_ENABLED => "True", CDN_TTL => $ttl, ); $return_code = $this->_send_request("PUT_CONT", $url_path, $hdrs); if ($return_code == 401) { $this->error_str = "Unauthorized"; return array($return_code,$this->response_reason,False); } if (!in_array($return_code, array(201,202))) { $this->error_str="Unexpected HTTP response: ".$this->response_reason; return array($return_code,$this->response_reason,False); } return array($return_code,$this->response_reason,$this->_cdn_uri, $this->_cdn_ssl_uri); } # (CDN) POST /v1/Account/Container # function remove_cdn_container($container_name) { if ($container_name == "") throw new SyntaxException("Container name not set."); if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Container name not set."); $url_path = $this->_make_path("CDN", $container_name); $hdrs = array(CDN_ENABLED => "False"); $return_code = $this->_send_request("DEL_POST",$url_path,$hdrs,"POST"); if ($return_code == 401) { $this->error_str = "Unauthorized"; return array($return_code, $this->error_str); } if ($return_code == 404) { $this->error_str = "Container not found."; return array($return_code, $this->error_str); } if ($return_code != 202) { $this->error_str="Unexpected HTTP response: ".$this->response_reason; return array($return_code, $this->error_str); } return array($return_code, "Accepted"); } # (CDN) HEAD /v1/Account # function head_cdn_container($container_name) { if ($container_name == "") throw new SyntaxException("Container name not set."); if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Container name not set."); $conn_type = "HEAD"; $url_path = $this->_make_path("CDN", $container_name); $return_code = $this->_send_request($conn_type, $url_path, NULL, "GET", True); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); } if ($return_code == 401) { return array($return_code,"Unauthorized",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); } if ($return_code == 404) { return array($return_code,"Account not found.",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); } if ($return_code == 204) { return array($return_code,$this->response_reason, $this->_cdn_enabled, $this->_cdn_ssl_uri, $this->_cdn_streaming_uri, $this->_cdn_uri, $this->_cdn_ttl, $this->_cdn_log_retention, $this->_cdn_acl_user_agent, $this->_cdn_acl_referrer ); } return array($return_code,$this->response_reason, NULL,NULL,NULL,NULL, $this->_cdn_log_retention, $this->_cdn_acl_user_agent, $this->_cdn_acl_referrer, NULL ); } # GET /v1/Account # function list_containers($limit=0, $marker=NULL) { $conn_type = "GET_CALL"; $url_path = $this->_make_path(); $limit = intval($limit); $params = array(); if ($limit > 0) { $params[] = "limit=$limit"; } if ($marker) { $params[] = "marker=".rawurlencode($marker); } if (!empty($params)) { $url_path .= "?" . implode("&", $params); } $this->_write_callback_type = "TEXT_LIST"; $return_code = $this->_send_request($conn_type, $url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,array()); } if ($return_code == 204) { return array($return_code, "Account has no containers.", array()); } if ($return_code == 404) { $this->error_str = "Invalid account name for authentication token."; return array($return_code,$this->error_str,array()); } if ($return_code == 200) { $this->create_array(); return array($return_code, $this->response_reason, $this->_text_list); } $this->error_str = "Unexpected HTTP response: ".$this->response_reason; return array($return_code,$this->error_str,array()); } # GET /v1/Account?format=json # function list_containers_info($limit=0, $marker=NULL) { $conn_type = "GET_CALL"; $url_path = $this->_make_path() . "?format=json"; $limit = intval($limit); $params = array(); if ($limit > 0) { $params[] = "limit=$limit"; } if ($marker) { $params[] = "marker=".rawurlencode($marker); } if (!empty($params)) { $url_path .= "&" . implode("&", $params); } $this->_write_callback_type = "OBJECT_STRING"; $return_code = $this->_send_request($conn_type, $url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,array()); } if ($return_code == 204) { return array($return_code, "Account has no containers.", array()); } if ($return_code == 404) { $this->error_str = "Invalid account name for authentication token."; return array($return_code,$this->error_str,array()); } if ($return_code == 200) { $json_body = json_decode($this->_obj_write_string, True); return array($return_code, $this->response_reason, $json_body); } $this->error_str = "Unexpected HTTP response: ".$this->response_reason; return array($return_code,$this->error_str,array()); } # HEAD /v1/Account # function head_account() { $conn_type = "HEAD"; $url_path = $this->_make_path(); $return_code = $this->_send_request($conn_type,$url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,0,0, NULL, array()); } if ($return_code == 404) { return array($return_code,"Account not found.",0,0, NULL, array()); } if ($return_code == 204) { return array($return_code,$this->response_reason, $this->_account_container_count, $this->_account_bytes_used, $this->_account_key, $this->account_metadata); } return array($return_code,$this->response_reason,0,0, NULL, array()); } # PUT /v1/Account/Container # function create_container($container_name) { if ($container_name == "") throw new SyntaxException("Container name not set."); if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Container name not set."); $url_path = $this->_make_path("STORAGE", $container_name); $return_code = $this->_send_request("PUT_CONT",$url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return False; } return $return_code; } # DELETE /v1/Account/Container # function delete_container($container_name) { if ($container_name == "") throw new SyntaxException("Container name not set."); if ($container_name != "0" and !isset($container_name)) throw new SyntaxException("Container name not set."); $url_path = $this->_make_path("STORAGE", $container_name); $return_code = $this->_send_request("DEL_POST",$url_path,array(),"DELETE"); switch ($return_code) { case 204: break; case 0: $this->error_str .= ": Failed to obtain valid HTTP response.";; break; case 409: $this->error_str = "Container must be empty prior to removing it."; break; case 404: $this->error_str = "Specified container did not exist to delete."; break; default: $this->error_str = "Unexpected HTTP return code: $return_code."; } return $return_code; } # GET /v1/Account/Container # function list_objects($cname,$limit=0,$marker=NULL,$prefix=NULL,$path=NULL) { if (!$cname) { $this->error_str = "Container name not set."; return array(0, $this->error_str, array()); } $url_path = $this->_make_path("STORAGE", $cname); $limit = intval($limit); $params = array(); if ($limit > 0) { $params[] = "limit=$limit"; } if ($marker) { $params[] = "marker=".rawurlencode($marker); } if ($prefix) { $params[] = "prefix=".rawurlencode($prefix); } if ($path) { $params[] = "path=".rawurlencode($path); } if (!empty($params)) { $url_path .= "?" . implode("&", $params); } $conn_type = "GET_CALL"; $this->_write_callback_type = "TEXT_LIST"; $return_code = $this->_send_request($conn_type,$url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,array()); } if ($return_code == 204) { $this->error_str = "Container has no Objects."; return array($return_code,$this->error_str,array()); } if ($return_code == 404) { $this->error_str = "Container has no Objects."; return array($return_code,$this->error_str,array()); } if ($return_code == 200) { $this->create_array(); return array($return_code,$this->response_reason, $this->_text_list); } $this->error_str = "Unexpected HTTP response code: $return_code"; return array(0,$this->error_str,array()); } # GET /v1/Account/Container?format=json # function get_objects($cname,$limit=0,$marker=NULL,$prefix=NULL,$path=NULL,$delimiter=NULL) { if (strlen($cname) == 0) { $this->error_str = "Container name not set."; return array(0, $this->error_str, array()); } $url_path = $this->_make_path("STORAGE", $cname); $limit = intval($limit); $params = array(); $params[] = "format=json"; if ($limit > 0) { $params[] = "limit=$limit"; } if ($marker) { $params[] = "marker=".rawurlencode($marker); } if ($prefix) { $params[] = "prefix=".rawurlencode($prefix); } if ($path) { $params[] = "path=".rawurlencode($path); } if ($delimiter) { $params[] = "delimiter=".rawurlencode($delimiter); } if (!empty($params)) { $url_path .= "?" . implode("&", $params); } $conn_type = "GET_CALL"; $this->_write_callback_type = "OBJECT_STRING"; $return_code = $this->_send_request($conn_type,$url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,array()); } if ($return_code == 204) { $this->error_str = "Container has no Objects."; return array($return_code,$this->error_str,array()); } if ($return_code == 404) { $this->error_str = "Container has no Objects."; return array($return_code,$this->error_str,array()); } if ($return_code == 200) { $json_body = json_decode($this->_obj_write_string, True); return array($return_code,$this->response_reason, $json_body); } $this->error_str = "Unexpected HTTP response code: $return_code"; return array(0,$this->error_str,array()); } # HEAD /v1/Account/Container # function head_container($container_name) { if ($container_name == "") { $this->error_str = "Container name not set."; return False; } if ($container_name != "0" and !isset($container_name)) { $this->error_str = "Container name not set."; return False; } $conn_type = "HEAD"; $url_path = $this->_make_path("STORAGE", $container_name); $return_code = $this->_send_request($conn_type,$url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,0,0, array()); } if ($return_code == 404) { return array($return_code,"Container not found.",0,0, array()); } if ($return_code == 204 || $return_code == 200) { return array($return_code,$this->response_reason, $this->_container_object_count, $this->_container_bytes_used, $this->_container_metadata); } return array($return_code,$this->response_reason,0,0, array()); } # GET /v1/Account/Container/Object # function get_object_to_string(&$obj, $hdrs=array()) { if (!is_object($obj) || get_class($obj) != "UpdraftPlus_CF_Object") { throw new SyntaxException( "Method argument is not a valid CF_Object."); } $conn_type = "GET_CALL"; $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name); $this->_write_callback_type = "OBJECT_STRING"; $return_code = $this->_send_request($conn_type,$url_path,$hdrs); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array($return_code0,$this->error_str,NULL); } if ($return_code == 404) { $this->error_str = "Object not found."; return array($return_code0,$this->error_str,NULL); } if (($return_code < 200) || ($return_code > 299 && $return_code != 412 && $return_code != 304)) { $this->error_str = "Unexpected HTTP return code: $return_code"; return array($return_code,$this->error_str,NULL); } return array($return_code,$this->response_reason, $this->_obj_write_string); } # GET /v1/Account/Container/Object # function get_object_to_stream(&$obj, &$resource=NULL, $hdrs=array()) { if (!is_object($obj) || get_class($obj) != "UpdraftPlus_CF_Object") { throw new SyntaxException( "Method argument is not a valid CF_Object."); } if (!is_resource($resource)) { throw new SyntaxException( "Resource argument not a valid PHP resource."); } $conn_type = "GET_CALL"; $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name); $this->_obj_write_resource = $resource; $this->_write_callback_type = "OBJECT_STREAM"; $return_code = $this->_send_request($conn_type,$url_path,$hdrs); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array($return_code,$this->error_str); } if ($return_code == 404) { $this->error_str = "Object not found."; return array($return_code,$this->error_str); } if (($return_code < 200) || ($return_code > 299 && $return_code != 412 && $return_code != 304)) { $this->error_str = "Unexpected HTTP return code: $return_code"; return array($return_code,$this->error_str); } return array($return_code,$this->response_reason); } # PUT /v1/Account/Container/Object # function put_object(&$obj, &$fp) { if (!is_object($obj) || get_class($obj) != "UpdraftPlus_CF_Object") { throw new SyntaxException( "Method argument is not a valid CF_Object."); } if (!is_resource($fp)) { throw new SyntaxException( "File pointer argument is not a valid resource."); } $conn_type = "PUT_OBJ"; $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name); $hdrs = $this->_headers($obj); $etag = $obj->getETag(); if (isset($etag)) { $hdrs[] = "ETag: " . $etag; } if (!$obj->content_type) { $hdrs[] = "Content-Type: application/octet-stream"; } else { $hdrs[] = "Content-Type: " . $obj->content_type; } $this->_init($conn_type); curl_setopt($this->connections[$conn_type], CURLOPT_INFILE, $fp); if (!$obj->content_length) { # We don''t know the Content-Length, so assumed "chunked" PUT # curl_setopt($this->connections[$conn_type], CURLOPT_UPLOAD, True); $hdrs[] = 'Transfer-Encoding: chunked'; } else { # We know the Content-Length, so use regular transfer # curl_setopt($this->connections[$conn_type], CURLOPT_INFILESIZE, $obj->content_length); } $return_code = $this->_send_request($conn_type,$url_path,$hdrs); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0,$this->error_str,NULL); } if ($return_code == 412) { $this->error_str = "Missing Content-Type header"; return array($return_code,$this->error_str,NULL); } if ($return_code == 422) { $this->error_str = "Derived and computed checksums do not match."; return array($return_code,$this->error_str,NULL); } if ($return_code != 201) { $this->error_str = "Unexpected HTTP return code: $return_code"; return array($return_code,$this->error_str,NULL); } return array($return_code,$this->response_reason,$this->_obj_etag); } function post_account(&$conn) { if (!is_object($conn) || get_class($conn) != "UpdraftPlus_CF_Connection") { throw new SyntaxException( "Method argument is not a valid CF_Connection object."); } if (!is_array($conn->metadata)) { throw new SyntaxException("Metadata array is empty"); } $return_code = $this->_send_request("DEL_POST", $this->_make_path("STORAGE"), $conn->metadata, "POST"); switch ($return_code) { case 202: case 201: break; case 0: $this->error_str .= ": Failed to obtain valid HTTP response."; $return_code = 0; break; case 404: $this->error_str = "Account, Container, or Object not found."; break; default: $this->error_str = "Unexpected HTTP return code: $return_code"; break; } return $return_code; } function post_container(&$cont) { if (!is_object($cont) || get_class($cont) != "UpdraftPlus_CF_Container") { throw new SyntaxException( "Method argument is not a valid CF_Container object."); } if (!is_array($cont->metadata)) { throw new SyntaxException("Metadata array is empty"); } $return_code = $this->_send_request("DEL_POST", $this->_make_path("STORAGE", $cont->name), $cont->metadata, "POST"); switch ($return_code) { case 201: case 202: break; case 0: $this->error_str .= ": Failed to obtain valid HTTP response."; $return_code = 0; break; case 404: $this->error_str = "Account, Container, or Object not found."; break; default: $this->error_str = "Unexpected HTTP return code: $return_code"; break; } return $return_code; } # POST /v1/Account/Container/Object # function update_object(&$obj) { if (!is_object($obj) || get_class($obj) != "UpdraftPlus_CF_Object") { throw new SyntaxException( "Method argument is not a valid CF_Object."); } # TODO: The is_array check isn't in sync with the error message if (!$obj->manifest && !(is_array($obj->metadata) || is_array($obj->headers))) { $this->error_str = "Metadata and headers arrays are empty."; return 0; } $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name); $hdrs = $this->_headers($obj); $return_code = $this->_send_request("DEL_POST",$url_path,$hdrs,"POST"); switch ($return_code) { case 202: break; case 0: $this->error_str .= ": Failed to obtain valid HTTP response."; $return_code = 0; break; case 404: $this->error_str = "Account, Container, or Object not found."; break; default: $this->error_str = "Unexpected HTTP return code: $return_code"; break; } return $return_code; } # HEAD /v1/Account/Container/Object # function head_object(&$obj) { if (!is_object($obj) || get_class($obj) != "UpdraftPlus_CF_Object") { throw new SyntaxException( "Method argument is not a valid CF_Object."); } $conn_type = "HEAD"; $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name); $return_code = $this->_send_request($conn_type,$url_path); if (!$return_code) { $this->error_str .= ": Failed to obtain valid HTTP response."; return array(0, $this->error_str." ".$this->response_reason, NULL, NULL, NULL, NULL, array(), NULL, NULL, NULL, array()); } if ($return_code == 404) { return array($return_code, $this->response_reason, NULL, NULL, NULL, NULL, array(), NULL, NULL, NULL, array()); } if ($return_code == 204 || $return_code == 200) { return array($return_code,$this->response_reason, $this->_obj_etag, $this->_obj_last_modified, $this->_obj_content_type, $this->_obj_content_length, $this->_obj_metadata, $this->_obj_manifest, $this->_obj_delete_at, $this->_obj_delete_after, $this->_obj_headers); } $this->error_str = "Unexpected HTTP return code: $return_code"; return array($return_code, $this->error_str." ".$this->response_reason, NULL, NULL, NULL, NULL, array(), NULL, NULL, NULL, array()); } # COPY /v1/Account/Container/Object # function copy_object($src_obj_name, $dest_obj_name, $container_name_source, $container_name_target, $metadata=NULL, $headers=NULL) { if (!$src_obj_name) { $this->error_str = "Object name not set."; return 0; } if ($container_name_source == "") { $this->error_str = "Container name source not set."; return 0; } if ($container_name_source != "0" and !isset($container_name_source)) { $this->error_str = "Container name source not set."; return 0; } if ($container_name_target == "") { $this->error_str = "Container name target not set."; return 0; } if ($container_name_target != "0" and !isset($container_name_target)) { $this->error_str = "Container name target not set."; return 0; } $conn_type = "COPY"; $url_path = $this->_make_path("STORAGE", $container_name_source, rawurlencode($src_obj_name)); $destination = rawurlencode($container_name_target."/".$dest_obj_name); $hdrs = self::_process_headers($metadata, $headers); $hdrs[DESTINATION] = $destination; $return_code = $this->_send_request($conn_type,$url_path,$hdrs,"COPY"); switch ($return_code) { case 201: break; case 0: $this->error_str .= ": Failed to obtain valid HTTP response."; $return_code = 0; break; case 404: $this->error_str = "Specified container/object did not exist."; break; default: $this->error_str = "Unexpected HTTP return code: $return_code."; } return $return_code; } # DELETE /v1/Account/Container/Object # function delete_object($container_name, $object_name) { if ($container_name == "") { $this->error_str = "Container name not set."; return 0; } if ($container_name != "0" and !isset($container_name)) { $this->error_str = "Container name not set."; return 0; } if (!$object_name) { $this->error_str = "Object name not set."; return 0; } $url_path = $this->_make_path("STORAGE", $container_name,$object_name); $return_code = $this->_send_request("DEL_POST",$url_path,NULL,"DELETE"); switch ($return_code) { case 204: break; case 0: $this->error_str .= ": Failed to obtain valid HTTP response."; $return_code = 0; break; case 404: $this->error_str = "Specified container did not exist to delete."; break; default: $this->error_str = "Unexpected HTTP return code: $return_code."; } return $return_code; } function get_error() { return $this->error_str; } function setDebug($bool) { $this->dbug = $bool; foreach ($this->connections as $k => $v) { if (!is_null($v)) { curl_setopt($this->connections[$k], CURLOPT_VERBOSE, $this->dbug); } } } function getCDNMUrl() { return $this->cdnm_url; } function getStorageUrl() { return $this->storage_url; } function getAuthToken() { return $this->auth_token; } function setCFAuth($cfs_auth, $servicenet=False) { if ($servicenet) { $this->storage_url = "https://snet-" . substr($cfs_auth->storage_url, 8); } else { $this->storage_url = $cfs_auth->storage_url; } $this->auth_token = $cfs_auth->auth_token; $this->cdnm_url = $cfs_auth->cdnm_url; } function setReadProgressFunc($func_name) { $this->_user_read_progress_callback_func = $func_name; } function setWriteProgressFunc($func_name) { $this->_user_write_progress_callback_func = $func_name; } private function _header_cb($ch, $header) { $header_len = strlen($header); if (preg_match("/^(HTTP\/1\.[01]) (\d{3}) (.*)/", $header, $matches)) { $this->response_status = $matches[2]; $this->response_reason = $matches[3]; return $header_len; } if (strpos($header, ":") === False) return $header_len; list($name, $value) = explode(":", $header, 2); $value = trim($value); switch (strtolower($name)) { case strtolower(CDN_ENABLED): $this->_cdn_enabled = strtolower($value) == "true"; break; case strtolower(CDN_URI): $this->_cdn_uri = $value; break; case strtolower(CDN_SSL_URI): $this->_cdn_ssl_uri = $value; break; case strtolower(CDN_STREAMING_URI): $this->_cdn_streaming_uri = $value; break; case strtolower(CDN_TTL): $this->_cdn_ttl = $value; break; case strtolower(MANIFEST_HEADER): $this->_obj_manifest = $value; break; case strtolower(CDN_LOG_RETENTION): $this->_cdn_log_retention = strtolower($value) == "true"; break; case strtolower(CDN_ACL_USER_AGENT): $this->_cdn_acl_user_agent = $value; break; case strtolower(CDN_ACL_REFERRER): $this->_cdn_acl_referrer = $value; break; case strtolower(ACCOUNT_CONTAINER_COUNT): $this->_account_container_count = (float)$value+0; break; case strtolower(ACCOUNT_BYTES_USED): $this->_account_bytes_used = (float)$value+0; break; case strtolower(CONTAINER_OBJ_COUNT): $this->_container_object_count = (float)$value+0; break; case strtolower(CONTAINER_BYTES_USED): $this->_container_bytes_used = (float)$value+0; break; case strtolower(ETAG_HEADER): $this->_obj_etag = $value; break; case strtolower(LAST_MODIFIED_HEADER): $this->_obj_last_modified = $value; break; case strtolower(CONTENT_TYPE_HEADER): $this->_obj_content_type = $value; break; case strtolower(CONTENT_LENGTH_HEADER): $this->_obj_content_length = (float)$value+0; break; case strtolower(ORIGIN_HEADER): $this->_obj_headers[ORIGIN_HEADER] = $value; break; case strtolower(ACCOUNT_KEY): $this->_account_key = $value; break; default: if (strncasecmp($name, METADATA_HEADER_PREFIX, strlen(METADATA_HEADER_PREFIX)) == 0) { $name = substr($name, strlen(METADATA_HEADER_PREFIX)); $this->_obj_metadata[$name] = $value; } elseif ((strncasecmp($name, CONTENT_HEADER_PREFIX, strlen(CONTENT_HEADER_PREFIX)) == 0) || (strncasecmp($name, ACCESS_CONTROL_HEADER_PREFIX, strlen(ACCESS_CONTROL_HEADER_PREFIX)) == 0)) { $this->_obj_headers[$name] = $value; } elseif (strncasecmp($name, ACCOUNT_METADATA_HEADER_PREFIX, strlen(ACCOUNT_METADATA_HEADER_PREFIX)) == 0) { $this->_account_metadata[$name] = $value; } elseif (strncasecmp($name, CONTAINER_METADATA_HEADER_PREFIX, strlen(CONTAINER_METADATA_HEADER_PREFIX)) == 0) { $this->_container_metadata[$name] = $value; } } return $header_len; } private function _read_cb($ch, $fd, $length) { $data = fread($fd, $length); $len = strlen($data); if (isset($this->_user_write_progress_callback_func)) { call_user_func($this->_user_write_progress_callback_func, $len); } return $data; } private function _write_cb($ch, $data) { $dlen = strlen($data); switch ($this->_write_callback_type) { case "TEXT_LIST": $this->_return_list = $this->_return_list . $data; //= explode("\n",$data); # keep tab,space //his->_text_list[] = rtrim($data,"\n\r\x0B"); # keep tab,space break; case "OBJECT_STREAM": fwrite($this->_obj_write_resource, $data, $dlen); break; case "OBJECT_STRING": $this->_obj_write_string .= $data; break; } if (isset($this->_user_read_progress_callback_func)) { call_user_func($this->_user_read_progress_callback_func, $dlen); } return $dlen; } private function _auth_hdr_cb($ch, $header) { preg_match("/^HTTP\/1\.[01] (\d{3}) (.*)/", $header, $matches); if (isset($matches[1])) { $this->response_status = $matches[1]; } if (isset($matches[2])) { $this->response_reason = $matches[2]; } if (stripos($header, STORAGE_URL) === 0) { $this->storage_url = trim(substr($header, strlen(STORAGE_URL)+1)); } if (stripos($header, CDNM_URL) === 0) { $this->cdnm_url = trim(substr($header, strlen(CDNM_URL)+1)); } if (stripos($header, AUTH_TOKEN) === 0) { $this->auth_token = trim(substr($header, strlen(AUTH_TOKEN)+1)); } if (stripos($header, AUTH_TOKEN_LEGACY) === 0) { $this->auth_token = trim(substr($header,strlen(AUTH_TOKEN_LEGACY)+1)); } return strlen($header); } private function _make_headers($hdrs=NULL) { $new_headers = array(); $has_stoken = False; $has_uagent = False; if (is_array($hdrs)) { foreach ($hdrs as $h => $v) { if (is_int($h)) { list($h, $v) = explode(":", $v, 2); } if (strncasecmp($h, AUTH_TOKEN, strlen(AUTH_TOKEN)) === 0) { $has_stoken = True; } if (strncasecmp($h, USER_AGENT_HEADER, strlen(USER_AGENT_HEADER)) === 0) { $has_uagent = True; } $new_headers[] = $h . ": " . trim($v); } } if (!$has_stoken) { $new_headers[] = AUTH_TOKEN . ": " . $this->auth_token; } if (!$has_uagent) { $new_headers[] = USER_AGENT_HEADER . ": " . USER_AGENT; } return $new_headers; } private function _init($conn_type, $force_new=False) { if (!array_key_exists($conn_type, $this->connections)) { $this->error_str = "Invalid CURL_XXX connection type"; return False; } if (is_null($this->connections[$conn_type]) || $force_new) { $ch = curl_init(); } else { return; } if ($this->dbug) { curl_setopt($ch, CURLOPT_VERBOSE, 1); } if (!is_null($this->cabundle_path)) { curl_setopt($ch, CURLOPT_CAINFO, $this->cabundle_path); } if (UpdraftPlus_Options::get_updraft_option('updraft_ssl_disableverify')) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); } else { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); } curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_MAXREDIRS, 4); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this, '_header_cb')); if ($conn_type == "GET_CALL") { curl_setopt($ch, CURLOPT_WRITEFUNCTION, array(&$this, '_write_cb')); } if ($conn_type == "PUT_OBJ") { curl_setopt($ch, CURLOPT_PUT, 1); curl_setopt($ch, CURLOPT_READFUNCTION, array(&$this, '_read_cb')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); } if ($conn_type == "HEAD") { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "HEAD"); curl_setopt($ch, CURLOPT_NOBODY, 1); } if ($conn_type == "PUT_CONT") { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_INFILESIZE, 0); curl_setopt($ch, CURLOPT_NOBODY, 1); } if ($conn_type == "DEL_POST") { curl_setopt($ch, CURLOPT_NOBODY, 1); } if ($conn_type == "COPY") { curl_setopt($ch, CURLOPT_NOBODY, 1); } $this->connections[$conn_type] = $ch; return; } private function _reset_callback_vars() { $this->_text_list = array(); $this->_return_list = NULL; $this->_account_metadata = array(); $this->_account_key = NULL; $this->_account_container_count = 0; $this->_account_bytes_used = 0; $this->_container_metadata = array(); $this->_container_object_count = 0; $this->_container_bytes_used = 0; $this->_obj_delete_at = NULL; $this->_obj_delete_after = NULL; $this->_obj_etag = NULL; $this->_obj_last_modified = NULL; $this->_obj_content_type = NULL; $this->_obj_content_length = NULL; $this->_obj_metadata = array(); $this->_obj_manifest = NULL; $this->_obj_headers = NULL; $this->_obj_write_string = ""; $this->_cdn_streaming_uri = NULL; $this->_cdn_enabled = NULL; $this->_cdn_ssl_uri = NULL; $this->_cdn_uri = NULL; $this->_cdn_ttl = NULL; $this->response_status = 0; $this->response_reason = ""; } private function _make_path($t="STORAGE",$c=NULL,$o=NULL) { $path = array(); switch ($t) { case "STORAGE": $path[] = $this->storage_url; break; case "CDN": $path[] = $this->cdnm_url; break; } if ($c != "") { $path[] = rawurlencode($c); } if ($o) { # mimic Python''s urllib.quote() feature of a "safe" '/' character # $path[] = str_replace("%2F","/",rawurlencode($o)); } return implode("/",$path); } private function _headers(&$obj) { $hdrs = self::_process_headers($obj->metadata, $obj->headers); if ($obj->manifest) $hdrs[MANIFEST_HEADER] = $obj->manifest; return $hdrs; } private function _process_headers($metadata=null, $headers=null) { $rules = array( array( 'prefix' => METADATA_HEADER_PREFIX, ), array( 'prefix' => '', 'filter' => array( # key order is important, first match decides CONTENT_TYPE_HEADER => false, CONTENT_LENGTH_HEADER => false, CONTENT_HEADER_PREFIX => true, ACCESS_CONTROL_HEADER_PREFIX => true, ORIGIN_HEADER => true, ), ), ); $hdrs = array(); $argc = func_num_args(); $argv = func_get_args(); for ($argi = 0; $argi < $argc; $argi++) { if(!is_array($argv[$argi])) continue; $rule = $rules[$argi]; foreach ($argv[$argi] as $k => $v) { $k = trim($k); $v = trim($v); if (strpos($k, ":") !== False) throw new SyntaxException( "Header names cannot contain a ':' character."); if (array_key_exists('filter', $rule)) { $result = null; foreach ($rule['filter'] as $p => $f) { if (strncasecmp($k, $p, strlen($p)) == 0) { $result = $f; break; } } if (!$result) throw new SyntaxException(sprintf( "Header name %s is not allowed", $k)); } $k = $rule['prefix'] . $k; if (strlen($k) > MAX_HEADER_NAME_LEN || strlen($v) > MAX_HEADER_VALUE_LEN) throw new SyntaxException(sprintf( "Header %s exceeds maximum length: %d/%d", $k, strlen($k), strlen($v))); $hdrs[$k] = $v; } } return $hdrs; } private function _send_request($conn_type, $url_path, $hdrs=NULL, $method="GET", $force_new=False) { $this->_init($conn_type, $force_new); $this->_reset_callback_vars(); $headers = $this->_make_headers($hdrs); if (gettype($this->connections[$conn_type]) == "unknown type") throw new ConnectionNotOpenException ( "Connection is not open." ); switch ($method) { case "COPY": curl_setopt($this->connections[$conn_type], CURLOPT_CUSTOMREQUEST, "COPY"); break; case "DELETE": curl_setopt($this->connections[$conn_type], CURLOPT_CUSTOMREQUEST, "DELETE"); break; case "POST": curl_setopt($this->connections[$conn_type], CURLOPT_CUSTOMREQUEST, "POST"); default: break; } curl_setopt($this->connections[$conn_type], CURLOPT_HTTPHEADER, $headers); curl_setopt($this->connections[$conn_type], CURLOPT_URL, $url_path); if (!curl_exec($this->connections[$conn_type]) && curl_errno($this->connections[$conn_type]) !== 0) { $this->error_str = "(curl error: " . curl_errno($this->connections[$conn_type]) . ") "; $this->error_str .= curl_error($this->connections[$conn_type]); return False; } return curl_getinfo($this->connections[$conn_type], CURLINFO_HTTP_CODE); } function close() { foreach ($this->connections as $cnx) { if (isset($cnx)) { curl_close($cnx); $this->connections[$cnx] = NULL; } } } private function create_array() { $this->_text_list = explode("\n",rtrim($this->_return_list,"\n\x0B")); return True; } } /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * c-hanging-comment-ender-p: nil * End: */ ?> PKwL\}8'''updraftplus/includes/handlebars/LICENSEnu[Copyright (C) 2011-2019 by Yehuda Katz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PKwL\"PP9updraftplus/includes/handlebars/handlebars.runtime.min.jsnu[/**! @license handlebars v4.7.7 Copyright (C) 2011-2019 by Yehuda Katz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ !function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(1)["default"],f=c(2)["default"];b.__esModule=!0;var g=c(3),h=e(g),i=c(36),j=f(i),k=c(5),l=f(k),m=c(4),n=e(m),o=c(37),p=e(o),q=c(43),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(2)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(4),g=c(5),h=e(g),i=c(9),j=c(29),k=c(31),l=e(k),m=c(32),n="4.7.7";b.VERSION=n;var o=8;b.COMPILER_REVISION=o;var p=7;b.LAST_COMPATIBLE_COMPILER_REVISION=p;var q={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};b.REVISION_CHANGES=q;var r="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===r){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===r)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===r){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]},resetLoggedPropertyAccesses:function(){m.resetLoggedProperties()}};var s=l["default"].log;b.log=s,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b":">",'"':""","'":"'","`":"`","=":"="},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0,i=void 0,j=void 0;c&&(g=c.start.line,h=c.end.line,i=c.start.column,j=c.end.column,a+=" - "+g+":"+i);for(var k=Error.prototype.constructor.call(this,a),l=0;l0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){(function(d){"use strict";var e=c(12)["default"],f=c(2)["default"];b.__esModule=!0;var g=c(4),h=c(5),i=f(h);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,d){l&&(l.key=b,l.index=c,l.first=0===c,l.last=!!d,m&&(l.contextPath=m+b)),k+=f(a[b],{data:l,blockParams:g.blockParams([a[b],b],[m+b,null])})}if(!b)throw new i["default"]("Must pass iterator to #each");var f=b.fn,h=b.inverse,j=0,k="",l=void 0,m=void 0;if(b.data&&b.ids&&(m=g.appendContextPath(b.data.contextPath,b.ids[0])+"."),g.isFunction(a)&&(a=a.call(this)),b.data&&(l=g.createFrame(b.data)),a&&"object"==typeof a)if(g.isArray(a))for(var n=a.length;j=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f=v.LAST_COMPATIBLE_COMPILER_REVISION&&b<=v.COMPILER_REVISION)){if(b= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};b.REVISION_CHANGES=q;var r="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===r){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===r)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===r){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]},resetLoggedPropertyAccesses:function(){m.resetLoggedProperties()}};var s=l["default"].log;b.log=s,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b":">",'"':""","'":"'","`":"`","=":"="},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0,i=void 0,j=void 0;c&&(g=c.start.line,h=c.end.line,i=c.start.column,j=c.end.column,a+=" - "+g+":"+i);for(var k=Error.prototype.constructor.call(this,a),l=0;l0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){(function(d){"use strict";var e=c(13)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(5),h=c(6),i=f(h);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,d){l&&(l.key=b,l.index=c,l.first=0===c,l.last=!!d,m&&(l.contextPath=m+b)),k+=f(a[b],{data:l,blockParams:g.blockParams([a[b],b],[m+b,null])})}if(!b)throw new i["default"]("Must pass iterator to #each");var f=b.fn,h=b.inverse,j=0,k="",l=void 0,m=void 0;if(b.data&&b.ids&&(m=g.appendContextPath(b.data.contextPath,b.ids[0])+"."),g.isFunction(a)&&(a=a.call(this)),b.data&&(l=g.createFrame(b.data)),a&&"object"==typeof a)if(g.isArray(a))for(var n=a.length;j=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f=v.LAST_COMPATIBLE_COMPILER_REVISION&&b<=v.COMPILER_REVISION)){if(b2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;gb[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substring(a,b.yyleng-c+a)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(e(5,9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^\/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]+?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(49),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;i0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===i&&f++}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new l["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new l["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=m.extend({},b),"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(m.isArray(a)&&m.isArray(b)&&a.length===b.length){for(var c=0;c1)throw new l["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new l["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,o["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=o["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");c=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;f0&&(c+=", "+d.join(", "));var e=0;g(this.aliases).forEach(function(a){var d=b.aliases[a];d.children&&d.referenceCount>1&&(c+=", alias"+ ++e+"="+a,d.children[0]="alias"+e)}),this.lookupPropertyFunctionIsUsed&&(c+=", "+this.lookupPropertyFunctionVarDeclaration());var f=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&f.push("blockParams"),this.useDepths&&f.push("depths");var h=this.mergeSource(c);return a?(f.push(h),Function.apply(this,f)):this.source.wrap(["function(",f.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},lookupPropertyFunctionVarDeclaration:function(){return"\n lookupProperty = container.lookupProperty || function(parent, propertyName) {\n if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n return parent[propertyName];\n }\n return undefined\n }\n ".trim()},blockValue:function(a){var b=this.aliasable("container.hooks.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("container.hooks.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;cthis.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;b= 2.0.0-beta.1', 7: '>= 4.0.0 <4.3.0', 8: '>= 4.3.0' }; exports.REVISION_CHANGES = REVISION_CHANGES; var objectType = '[object Object]'; function HandlebarsEnvironment(helpers, partials, decorators) { this.helpers = helpers || {}; this.partials = partials || {}; this.decorators = decorators || {}; _helpers.registerDefaultHelpers(this); _decorators.registerDefaultDecorators(this); } HandlebarsEnvironment.prototype = { constructor: HandlebarsEnvironment, logger: _logger2['default'], log: _logger2['default'].log, registerHelper: function registerHelper(name, fn) { if (_utils.toString.call(name) === objectType) { if (fn) { throw new _exception2['default']('Arg not supported with multiple helpers'); } _utils.extend(this.helpers, name); } else { this.helpers[name] = fn; } }, unregisterHelper: function unregisterHelper(name) { delete this.helpers[name]; }, registerPartial: function registerPartial(name, partial) { if (_utils.toString.call(name) === objectType) { _utils.extend(this.partials, name); } else { if (typeof partial === 'undefined') { throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); } this.partials[name] = partial; } }, unregisterPartial: function unregisterPartial(name) { delete this.partials[name]; }, registerDecorator: function registerDecorator(name, fn) { if (_utils.toString.call(name) === objectType) { if (fn) { throw new _exception2['default']('Arg not supported with multiple decorators'); } _utils.extend(this.decorators, name); } else { this.decorators[name] = fn; } }, unregisterDecorator: function unregisterDecorator(name) { delete this.decorators[name]; }, /** * Reset the memory of illegal property accesses that have already been logged. * @deprecated should only be used in handlebars test-cases */ resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() { _internalProtoAccess.resetLoggedProperties(); } }; var log = _logger2['default'].log; exports.log = log; exports.createFrame = _utils.createFrame; exports.logger = _logger2['default']; /***/ }), /* 4 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports.extend = extend; exports.indexOf = indexOf; exports.escapeExpression = escapeExpression; exports.isEmpty = isEmpty; exports.createFrame = createFrame; exports.blockParams = blockParams; exports.appendContextPath = appendContextPath; var escape = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', '=': '=' }; var badChars = /[&<>"'`=]/g, possible = /[&<>"'`=]/; function escapeChar(chr) { return escape[chr]; } function extend(obj /* , ...source */) { for (var i = 1; i < arguments.length; i++) { for (var key in arguments[i]) { if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { obj[key] = arguments[i][key]; } } } return obj; } var toString = Object.prototype.toString; exports.toString = toString; // Sourced from lodash // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt /* eslint-disable func-style */ var isFunction = function isFunction(value) { return typeof value === 'function'; }; // fallback for older versions of Chrome and Safari /* istanbul ignore next */ if (isFunction(/x/)) { exports.isFunction = isFunction = function (value) { return typeof value === 'function' && toString.call(value) === '[object Function]'; }; } exports.isFunction = isFunction; /* eslint-enable func-style */ /* istanbul ignore next */ var isArray = Array.isArray || function (value) { return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; }; exports.isArray = isArray; // Older IE versions do not directly support indexOf so we must implement our own, sadly. function indexOf(array, value) { for (var i = 0, len = array.length; i < len; i++) { if (array[i] === value) { return i; } } return -1; } function escapeExpression(string) { if (typeof string !== 'string') { // don't escape SafeStrings, since they're already safe if (string && string.toHTML) { return string.toHTML(); } else if (string == null) { return ''; } else if (!string) { return string + ''; } // Force a string conversion as this will be done by the append regardless and // the regex test will do this transparently behind the scenes, causing issues if // an object's to string has escaped characters in it. string = '' + string; } if (!possible.test(string)) { return string; } return string.replace(badChars, escapeChar); } function isEmpty(value) { if (!value && value !== 0) { return true; } else if (isArray(value) && value.length === 0) { return true; } else { return false; } } function createFrame(object) { var frame = extend({}, object); frame._parent = object; return frame; } function blockParams(params, ids) { params.path = ids; return params; } function appendContextPath(contextPath, id) { return (contextPath ? contextPath + '.' : '') + id; } /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$defineProperty = __webpack_require__(6)['default']; exports.__esModule = true; var errorProps = ['description', 'fileName', 'lineNumber', 'endLineNumber', 'message', 'name', 'number', 'stack']; function Exception(message, node) { var loc = node && node.loc, line = undefined, endLineNumber = undefined, column = undefined, endColumn = undefined; if (loc) { line = loc.start.line; endLineNumber = loc.end.line; column = loc.start.column; endColumn = loc.end.column; message += ' - ' + line + ':' + column; } var tmp = Error.prototype.constructor.call(this, message); // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. for (var idx = 0; idx < errorProps.length; idx++) { this[errorProps[idx]] = tmp[errorProps[idx]]; } /* istanbul ignore else */ if (Error.captureStackTrace) { Error.captureStackTrace(this, Exception); } try { if (loc) { this.lineNumber = line; this.endLineNumber = endLineNumber; // Work around issue under safari where we can't directly set the column value /* istanbul ignore next */ if (_Object$defineProperty) { Object.defineProperty(this, 'column', { value: column, enumerable: true }); Object.defineProperty(this, 'endColumn', { value: endColumn, enumerable: true }); } else { this.column = column; this.endColumn = endColumn; } } } catch (nop) { /* Ignore if the browser is very particular */ } } Exception.prototype = new Error(); exports['default'] = Exception; module.exports = exports['default']; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(7), __esModule: true }; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { var $ = __webpack_require__(8); module.exports = function defineProperty(it, key, desc){ return $.setDesc(it, key, desc); }; /***/ }), /* 8 */ /***/ (function(module, exports) { var $Object = Object; module.exports = { create: $Object.create, getProto: $Object.getPrototypeOf, isEnum: {}.propertyIsEnumerable, getDesc: $Object.getOwnPropertyDescriptor, setDesc: $Object.defineProperty, setDescs: $Object.defineProperties, getKeys: $Object.keys, getNames: $Object.getOwnPropertyNames, getSymbols: $Object.getOwnPropertySymbols, each: [].forEach }; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(2)['default']; exports.__esModule = true; exports.registerDefaultHelpers = registerDefaultHelpers; exports.moveHelperToHooks = moveHelperToHooks; var _helpersBlockHelperMissing = __webpack_require__(10); var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); var _helpersEach = __webpack_require__(11); var _helpersEach2 = _interopRequireDefault(_helpersEach); var _helpersHelperMissing = __webpack_require__(24); var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); var _helpersIf = __webpack_require__(25); var _helpersIf2 = _interopRequireDefault(_helpersIf); var _helpersLog = __webpack_require__(26); var _helpersLog2 = _interopRequireDefault(_helpersLog); var _helpersLookup = __webpack_require__(27); var _helpersLookup2 = _interopRequireDefault(_helpersLookup); var _helpersWith = __webpack_require__(28); var _helpersWith2 = _interopRequireDefault(_helpersWith); function registerDefaultHelpers(instance) { _helpersBlockHelperMissing2['default'](instance); _helpersEach2['default'](instance); _helpersHelperMissing2['default'](instance); _helpersIf2['default'](instance); _helpersLog2['default'](instance); _helpersLookup2['default'](instance); _helpersWith2['default'](instance); } function moveHelperToHooks(instance, helperName, keepHelper) { if (instance.helpers[helperName]) { instance.hooks[helperName] = instance.helpers[helperName]; if (!keepHelper) { delete instance.helpers[helperName]; } } } /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _utils = __webpack_require__(4); exports['default'] = function (instance) { instance.registerHelper('blockHelperMissing', function (context, options) { var inverse = options.inverse, fn = options.fn; if (context === true) { return fn(this); } else if (context === false || context == null) { return inverse(this); } else if (_utils.isArray(context)) { if (context.length > 0) { if (options.ids) { options.ids = [options.name]; } return instance.helpers.each(context, options); } else { return inverse(this); } } else { if (options.data && options.ids) { var data = _utils.createFrame(options.data); data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); options = { data: data }; } return fn(context, options); } }); }; module.exports = exports['default']; /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var _Object$keys = __webpack_require__(12)['default']; var _interopRequireDefault = __webpack_require__(2)['default']; exports.__esModule = true; var _utils = __webpack_require__(4); var _exception = __webpack_require__(5); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('each', function (context, options) { if (!options) { throw new _exception2['default']('Must pass iterator to #each'); } var fn = options.fn, inverse = options.inverse, i = 0, ret = '', data = undefined, contextPath = undefined; if (options.data && options.ids) { contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; } if (_utils.isFunction(context)) { context = context.call(this); } if (options.data) { data = _utils.createFrame(options.data); } function execIteration(field, index, last) { if (data) { data.key = field; data.index = index; data.first = index === 0; data.last = !!last; if (contextPath) { data.contextPath = contextPath + field; } } ret = ret + fn(context[field], { data: data, blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) }); } if (context && typeof context === 'object') { if (_utils.isArray(context)) { for (var j = context.length; i < j; i++) { if (i in context) { execIteration(i, i, i === context.length - 1); } } } else if (global.Symbol && context[global.Symbol.iterator]) { var newContext = []; var iterator = context[global.Symbol.iterator](); for (var it = iterator.next(); !it.done; it = iterator.next()) { newContext.push(it.value); } context = newContext; for (var j = context.length; i < j; i++) { execIteration(i, i, i === context.length - 1); } } else { (function () { var priorKey = undefined; _Object$keys(context).forEach(function (key) { // We're running the iterations one step out of sync so we can detect // the last iteration without have to scan the object twice and create // an itermediate keys array. if (priorKey !== undefined) { execIteration(priorKey, i - 1); } priorKey = key; i++; }); if (priorKey !== undefined) { execIteration(priorKey, i - 1, true); } })(); } } if (i === 0) { ret = inverse(this); } return ret; }); }; module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(13), __esModule: true }; /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(14); module.exports = __webpack_require__(20).Object.keys; /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 Object.keys(O) var toObject = __webpack_require__(15); __webpack_require__(17)('keys', function($keys){ return function keys(it){ return $keys(toObject(it)); }; }); /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) var defined = __webpack_require__(16); module.exports = function(it){ return Object(defined(it)); }; /***/ }), /* 16 */ /***/ (function(module, exports) { // 7.2.1 RequireObjectCoercible(argument) module.exports = function(it){ if(it == undefined)throw TypeError("Can't call method on " + it); return it; }; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { // most Object methods by ES6 should accept primitives var $export = __webpack_require__(18) , core = __webpack_require__(20) , fails = __webpack_require__(23); module.exports = function(KEY, exec){ var fn = (core.Object || {})[KEY] || Object[KEY] , exp = {}; exp[KEY] = exec(fn); $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); }; /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(19) , core = __webpack_require__(20) , ctx = __webpack_require__(21) , PROTOTYPE = 'prototype'; var $export = function(type, name, source){ var IS_FORCED = type & $export.F , IS_GLOBAL = type & $export.G , IS_STATIC = type & $export.S , IS_PROTO = type & $export.P , IS_BIND = type & $export.B , IS_WRAP = type & $export.W , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] , key, own, out; if(IS_GLOBAL)source = name; for(key in source){ // contains in native own = !IS_FORCED && target && key in target; if(own && key in exports)continue; // export native or passed out = own ? target[key] : source[key]; // prevent global pollution for namespaces exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] // bind timers to global for call from export context : IS_BIND && own ? ctx(out, global) // wrap global constructors for prevent change them in library : IS_WRAP && target[key] == out ? (function(C){ var F = function(param){ return this instanceof C ? new C(param) : C(param); }; F[PROTOTYPE] = C[PROTOTYPE]; return F; // make static versions for prototype methods })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; } }; // type bitmap $export.F = 1; // forced $export.G = 2; // global $export.S = 4; // static $export.P = 8; // proto $export.B = 16; // bind $export.W = 32; // wrap module.exports = $export; /***/ }), /* 19 */ /***/ (function(module, exports) { // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef /***/ }), /* 20 */ /***/ (function(module, exports) { var core = module.exports = {version: '1.2.6'}; if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { // optional / simple context binding var aFunction = __webpack_require__(22); module.exports = function(fn, that, length){ aFunction(fn); if(that === undefined)return fn; switch(length){ case 1: return function(a){ return fn.call(that, a); }; case 2: return function(a, b){ return fn.call(that, a, b); }; case 3: return function(a, b, c){ return fn.call(that, a, b, c); }; } return function(/* ...args */){ return fn.apply(that, arguments); }; }; /***/ }), /* 22 */ /***/ (function(module, exports) { module.exports = function(it){ if(typeof it != 'function')throw TypeError(it + ' is not a function!'); return it; }; /***/ }), /* 23 */ /***/ (function(module, exports) { module.exports = function(exec){ try { return !!exec(); } catch(e){ return true; } }; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(2)['default']; exports.__esModule = true; var _exception = __webpack_require__(5); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('helperMissing', function () /* [args, ]options */{ if (arguments.length === 1) { // A missing field in a {{foo}} construct. return undefined; } else { // Someone is actually trying to call something, blow up. throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); } }); }; module.exports = exports['default']; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(2)['default']; exports.__esModule = true; var _utils = __webpack_require__(4); var _exception = __webpack_require__(5); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('if', function (conditional, options) { if (arguments.length != 2) { throw new _exception2['default']('#if requires exactly one argument'); } if (_utils.isFunction(conditional)) { conditional = conditional.call(this); } // Default behavior is to render the positive path if the value is truthy and not empty. // The `includeZero` option may be set to treat the condtional as purely not empty based on the // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { return options.inverse(this); } else { return options.fn(this); } }); instance.registerHelper('unless', function (conditional, options) { if (arguments.length != 2) { throw new _exception2['default']('#unless requires exactly one argument'); } return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); }); }; module.exports = exports['default']; /***/ }), /* 26 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports['default'] = function (instance) { instance.registerHelper('log', function () /* message, options */{ var args = [undefined], options = arguments[arguments.length - 1]; for (var i = 0; i < arguments.length - 1; i++) { args.push(arguments[i]); } var level = 1; if (options.hash.level != null) { level = options.hash.level; } else if (options.data && options.data.level != null) { level = options.data.level; } args[0] = level; instance.log.apply(instance, args); }); }; module.exports = exports['default']; /***/ }), /* 27 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports['default'] = function (instance) { instance.registerHelper('lookup', function (obj, field, options) { if (!obj) { // Note for 5.0: Change to "obj == null" in 5.0 return obj; } return options.lookupProperty(obj, field); }); }; module.exports = exports['default']; /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(2)['default']; exports.__esModule = true; var _utils = __webpack_require__(4); var _exception = __webpack_require__(5); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('with', function (context, options) { if (arguments.length != 2) { throw new _exception2['default']('#with requires exactly one argument'); } if (_utils.isFunction(context)) { context = context.call(this); } var fn = options.fn; if (!_utils.isEmpty(context)) { var data = options.data; if (options.data && options.ids) { data = _utils.createFrame(options.data); data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); } return fn(context, { data: data, blockParams: _utils.blockParams([context], [data && data.contextPath]) }); } else { return options.inverse(this); } }); }; module.exports = exports['default']; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(2)['default']; exports.__esModule = true; exports.registerDefaultDecorators = registerDefaultDecorators; var _decoratorsInline = __webpack_require__(30); var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); function registerDefaultDecorators(instance) { _decoratorsInline2['default'](instance); } /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _utils = __webpack_require__(4); exports['default'] = function (instance) { instance.registerDecorator('inline', function (fn, props, container, options) { var ret = fn; if (!props.partials) { props.partials = {}; ret = function (context, options) { // Create a new partials stack frame prior to exec. var original = container.partials; container.partials = _utils.extend({}, original, props.partials); var ret = fn(context, options); container.partials = original; return ret; }; } props.partials[options.args[0]] = options.fn; return ret; }); }; module.exports = exports['default']; /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _utils = __webpack_require__(4); var logger = { methodMap: ['debug', 'info', 'warn', 'error'], level: 'info', // Maps a given level value to the `methodMap` indexes above. lookupLevel: function lookupLevel(level) { if (typeof level === 'string') { var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); if (levelMap >= 0) { level = levelMap; } else { level = parseInt(level, 10); } } return level; }, // Can be overridden in the host environment log: function log(level) { level = logger.lookupLevel(level); if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { var method = logger.methodMap[level]; // eslint-disable-next-line no-console if (!console[method]) { method = 'log'; } for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { message[_key - 1] = arguments[_key]; } console[method].apply(console, message); // eslint-disable-line no-console } } }; exports['default'] = logger; module.exports = exports['default']; /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$create = __webpack_require__(33)['default']; var _Object$keys = __webpack_require__(12)['default']; var _interopRequireWildcard = __webpack_require__(1)['default']; exports.__esModule = true; exports.createProtoAccessControl = createProtoAccessControl; exports.resultIsAllowed = resultIsAllowed; exports.resetLoggedProperties = resetLoggedProperties; var _createNewLookupObject = __webpack_require__(35); var _logger = __webpack_require__(31); var logger = _interopRequireWildcard(_logger); var loggedProperties = _Object$create(null); function createProtoAccessControl(runtimeOptions) { var defaultMethodWhiteList = _Object$create(null); defaultMethodWhiteList['constructor'] = false; defaultMethodWhiteList['__defineGetter__'] = false; defaultMethodWhiteList['__defineSetter__'] = false; defaultMethodWhiteList['__lookupGetter__'] = false; var defaultPropertyWhiteList = _Object$create(null); // eslint-disable-next-line no-proto defaultPropertyWhiteList['__proto__'] = false; return { properties: { whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties), defaultValue: runtimeOptions.allowProtoPropertiesByDefault }, methods: { whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods), defaultValue: runtimeOptions.allowProtoMethodsByDefault } }; } function resultIsAllowed(result, protoAccessControl, propertyName) { if (typeof result === 'function') { return checkWhiteList(protoAccessControl.methods, propertyName); } else { return checkWhiteList(protoAccessControl.properties, propertyName); } } function checkWhiteList(protoAccessControlForType, propertyName) { if (protoAccessControlForType.whitelist[propertyName] !== undefined) { return protoAccessControlForType.whitelist[propertyName] === true; } if (protoAccessControlForType.defaultValue !== undefined) { return protoAccessControlForType.defaultValue; } logUnexpecedPropertyAccessOnce(propertyName); return false; } function logUnexpecedPropertyAccessOnce(propertyName) { if (loggedProperties[propertyName] !== true) { loggedProperties[propertyName] = true; logger.log('error', 'Handlebars: Access has been denied to resolve the property "' + propertyName + '" because it is not an "own property" of its parent.\n' + 'You can add a runtime option to disable the check or this warning:\n' + 'See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details'); } } function resetLoggedProperties() { _Object$keys(loggedProperties).forEach(function (propertyName) { delete loggedProperties[propertyName]; }); } /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(34), __esModule: true }; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { var $ = __webpack_require__(8); module.exports = function create(P, D){ return $.create(P, D); }; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$create = __webpack_require__(33)['default']; exports.__esModule = true; exports.createNewLookupObject = createNewLookupObject; var _utils = __webpack_require__(4); /** * Create a new object with "null"-prototype to avoid truthy results on prototype properties. * The resulting object can be used with "object[property]" to check if a property exists * @param {...object} sources a varargs parameter of source objects that will be merged * @returns {object} */ function createNewLookupObject() { for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) { sources[_key] = arguments[_key]; } return _utils.extend.apply(undefined, [_Object$create(null)].concat(sources)); } /***/ }), /* 36 */ /***/ (function(module, exports) { // Build out our basic SafeString type 'use strict'; exports.__esModule = true; function SafeString(string) { this.string = string; } SafeString.prototype.toString = SafeString.prototype.toHTML = function () { return '' + this.string; }; exports['default'] = SafeString; module.exports = exports['default']; /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$seal = __webpack_require__(38)['default']; var _Object$keys = __webpack_require__(12)['default']; var _interopRequireWildcard = __webpack_require__(1)['default']; var _interopRequireDefault = __webpack_require__(2)['default']; exports.__esModule = true; exports.checkRevision = checkRevision; exports.template = template; exports.wrapProgram = wrapProgram; exports.resolvePartial = resolvePartial; exports.invokePartial = invokePartial; exports.noop = noop; var _utils = __webpack_require__(4); var Utils = _interopRequireWildcard(_utils); var _exception = __webpack_require__(5); var _exception2 = _interopRequireDefault(_exception); var _base = __webpack_require__(3); var _helpers = __webpack_require__(9); var _internalWrapHelper = __webpack_require__(42); var _internalProtoAccess = __webpack_require__(32); function checkRevision(compilerInfo) { var compilerRevision = compilerInfo && compilerInfo[0] || 1, currentRevision = _base.COMPILER_REVISION; if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) { return; } if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) { var runtimeVersions = _base.REVISION_CHANGES[currentRevision], compilerVersions = _base.REVISION_CHANGES[compilerRevision]; throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); } else { // Use the embedded version info since the runtime doesn't know about this revision yet throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); } } function template(templateSpec, env) { /* istanbul ignore next */ if (!env) { throw new _exception2['default']('No environment passed to template'); } if (!templateSpec || !templateSpec.main) { throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); } templateSpec.main.decorator = templateSpec.main_d; // Note: Using env.VM references rather than local var references throughout this section to allow // for external users to override these as pseudo-supported APIs. env.VM.checkRevision(templateSpec.compiler); // backwards compatibility for precompiled templates with compiler-version 7 (<4.3.0) var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7; function invokePartialWrapper(partial, context, options) { if (options.hash) { context = Utils.extend({}, context, options.hash); if (options.ids) { options.ids[0] = true; } } partial = env.VM.resolvePartial.call(this, partial, context, options); var extendedOptions = Utils.extend({}, options, { hooks: this.hooks, protoAccessControl: this.protoAccessControl }); var result = env.VM.invokePartial.call(this, partial, context, extendedOptions); if (result == null && env.compile) { options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); result = options.partials[options.name](context, extendedOptions); } if (result != null) { if (options.indent) { var lines = result.split('\n'); for (var i = 0, l = lines.length; i < l; i++) { if (!lines[i] && i + 1 === l) { break; } lines[i] = options.indent + lines[i]; } result = lines.join('\n'); } return result; } else { throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); } } // Just add water var container = { strict: function strict(obj, name, loc) { if (!obj || !(name in obj)) { throw new _exception2['default']('"' + name + '" not defined in ' + obj, { loc: loc }); } return container.lookupProperty(obj, name); }, lookupProperty: function lookupProperty(parent, propertyName) { var result = parent[propertyName]; if (result == null) { return result; } if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { return result; } if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) { return result; } return undefined; }, lookup: function lookup(depths, name) { var len = depths.length; for (var i = 0; i < len; i++) { var result = depths[i] && container.lookupProperty(depths[i], name); if (result != null) { return depths[i][name]; } } }, lambda: function lambda(current, context) { return typeof current === 'function' ? current.call(context) : current; }, escapeExpression: Utils.escapeExpression, invokePartial: invokePartialWrapper, fn: function fn(i) { var ret = templateSpec[i]; ret.decorator = templateSpec[i + '_d']; return ret; }, programs: [], program: function program(i, data, declaredBlockParams, blockParams, depths) { var programWrapper = this.programs[i], fn = this.fn(i); if (data || depths || blockParams || declaredBlockParams) { programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); } else if (!programWrapper) { programWrapper = this.programs[i] = wrapProgram(this, i, fn); } return programWrapper; }, data: function data(value, depth) { while (value && depth--) { value = value._parent; } return value; }, mergeIfNeeded: function mergeIfNeeded(param, common) { var obj = param || common; if (param && common && param !== common) { obj = Utils.extend({}, common, param); } return obj; }, // An empty object to use as replacement for null-contexts nullContext: _Object$seal({}), noop: env.VM.noop, compilerInfo: templateSpec.compiler }; function ret(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var data = options.data; ret._setup(options); if (!options.partial && templateSpec.useData) { data = initData(context, data); } var depths = undefined, blockParams = templateSpec.useBlockParams ? [] : undefined; if (templateSpec.useDepths) { if (options.depths) { depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; } else { depths = [context]; } } function main(context /*, options*/) { return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); } main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); return main(context, options); } ret.isTop = true; ret._setup = function (options) { if (!options.partial) { var mergedHelpers = Utils.extend({}, env.helpers, options.helpers); wrapHelpersToPassLookupProperty(mergedHelpers, container); container.helpers = mergedHelpers; if (templateSpec.usePartial) { // Use mergeIfNeeded here to prevent compiling global partials multiple times container.partials = container.mergeIfNeeded(options.partials, env.partials); } if (templateSpec.usePartial || templateSpec.useDecorators) { container.decorators = Utils.extend({}, env.decorators, options.decorators); } container.hooks = {}; container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options); var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7; _helpers.moveHelperToHooks(container, 'helperMissing', keepHelperInHelpers); _helpers.moveHelperToHooks(container, 'blockHelperMissing', keepHelperInHelpers); } else { container.protoAccessControl = options.protoAccessControl; // internal option container.helpers = options.helpers; container.partials = options.partials; container.decorators = options.decorators; container.hooks = options.hooks; } }; ret._child = function (i, data, blockParams, depths) { if (templateSpec.useBlockParams && !blockParams) { throw new _exception2['default']('must pass block params'); } if (templateSpec.useDepths && !depths) { throw new _exception2['default']('must pass parent depths'); } return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); }; return ret; } function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { function prog(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var currentDepths = depths; if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { currentDepths = [context].concat(depths); } return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); } prog = executeDecorators(fn, prog, container, depths, data, blockParams); prog.program = i; prog.depth = depths ? depths.length : 0; prog.blockParams = declaredBlockParams || 0; return prog; } /** * This is currently part of the official API, therefore implementation details should not be changed. */ function resolvePartial(partial, context, options) { if (!partial) { if (options.name === '@partial-block') { partial = options.data['partial-block']; } else { partial = options.partials[options.name]; } } else if (!partial.call && !options.name) { // This is a dynamic partial that returned a string options.name = partial; partial = options.partials[partial]; } return partial; } function invokePartial(partial, context, options) { // Use the current closure context to save the partial-block if this partial var currentPartialBlock = options.data && options.data['partial-block']; options.partial = true; if (options.ids) { options.data.contextPath = options.ids[0] || options.data.contextPath; } var partialBlock = undefined; if (options.fn && options.fn !== noop) { (function () { options.data = _base.createFrame(options.data); // Wrapper function to get access to currentPartialBlock from the closure var fn = options.fn; partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; // Restore the partial-block from the closure for the execution of the block // i.e. the part inside the block of the partial call. options.data = _base.createFrame(options.data); options.data['partial-block'] = currentPartialBlock; return fn(context, options); }; if (fn.partials) { options.partials = Utils.extend({}, options.partials, fn.partials); } })(); } if (partial === undefined && partialBlock) { partial = partialBlock; } if (partial === undefined) { throw new _exception2['default']('The partial ' + options.name + ' could not be found'); } else if (partial instanceof Function) { return partial(context, options); } } function noop() { return ''; } function initData(context, data) { if (!data || !('root' in data)) { data = data ? _base.createFrame(data) : {}; data.root = context; } return data; } function executeDecorators(fn, prog, container, depths, data, blockParams) { if (fn.decorator) { var props = {}; prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); Utils.extend(prog, props); } return prog; } function wrapHelpersToPassLookupProperty(mergedHelpers, container) { _Object$keys(mergedHelpers).forEach(function (helperName) { var helper = mergedHelpers[helperName]; mergedHelpers[helperName] = passLookupPropertyOption(helper, container); }); } function passLookupPropertyOption(helper, container) { var lookupProperty = container.lookupProperty; return _internalWrapHelper.wrapHelper(helper, function (options) { return Utils.extend({ lookupProperty: lookupProperty }, options); }); } /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(39), __esModule: true }; /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(40); module.exports = __webpack_require__(20).Object.seal; /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.17 Object.seal(O) var isObject = __webpack_require__(41); __webpack_require__(17)('seal', function($seal){ return function seal(it){ return $seal && isObject(it) ? $seal(it) : it; }; }); /***/ }), /* 41 */ /***/ (function(module, exports) { module.exports = function(it){ return typeof it === 'object' ? it !== null : typeof it === 'function'; }; /***/ }), /* 42 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports.wrapHelper = wrapHelper; function wrapHelper(helper, transformOptionsFn) { if (typeof helper !== 'function') { // This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639 // We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function. return helper; } var wrapper = function wrapper() /* dynamic arguments */{ var options = arguments[arguments.length - 1]; arguments[arguments.length - 1] = transformOptionsFn(options); return helper.apply(this, arguments); }; return wrapper; } /***/ }), /* 43 */ /***/ (function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; exports.__esModule = true; exports['default'] = function (Handlebars) { /* istanbul ignore next */ var root = typeof global !== 'undefined' ? global : window, $Handlebars = root.Handlebars; /* istanbul ignore next */ Handlebars.noConflict = function () { if (root.Handlebars === Handlebars) { root.Handlebars = $Handlebars; } return Handlebars; }; }; module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }) /******/ ]) }); ;PKwL\"wjj-updraftplus/includes/handlebars/handlebars.jsnu[/**! @license handlebars v4.7.7 Copyright (C) 2011-2019 by Yehuda Katz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["Handlebars"] = factory(); else root["Handlebars"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _handlebarsRuntime = __webpack_require__(2); var _handlebarsRuntime2 = _interopRequireDefault(_handlebarsRuntime); // Compiler imports var _handlebarsCompilerAst = __webpack_require__(45); var _handlebarsCompilerAst2 = _interopRequireDefault(_handlebarsCompilerAst); var _handlebarsCompilerBase = __webpack_require__(46); var _handlebarsCompilerCompiler = __webpack_require__(51); var _handlebarsCompilerJavascriptCompiler = __webpack_require__(52); var _handlebarsCompilerJavascriptCompiler2 = _interopRequireDefault(_handlebarsCompilerJavascriptCompiler); var _handlebarsCompilerVisitor = __webpack_require__(49); var _handlebarsCompilerVisitor2 = _interopRequireDefault(_handlebarsCompilerVisitor); var _handlebarsNoConflict = __webpack_require__(44); var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); var _create = _handlebarsRuntime2['default'].create; function create() { var hb = _create(); hb.compile = function (input, options) { return _handlebarsCompilerCompiler.compile(input, options, hb); }; hb.precompile = function (input, options) { return _handlebarsCompilerCompiler.precompile(input, options, hb); }; hb.AST = _handlebarsCompilerAst2['default']; hb.Compiler = _handlebarsCompilerCompiler.Compiler; hb.JavaScriptCompiler = _handlebarsCompilerJavascriptCompiler2['default']; hb.Parser = _handlebarsCompilerBase.parser; hb.parse = _handlebarsCompilerBase.parse; hb.parseWithoutProcessing = _handlebarsCompilerBase.parseWithoutProcessing; return hb; } var inst = create(); inst.create = create; _handlebarsNoConflict2['default'](inst); inst.Visitor = _handlebarsCompilerVisitor2['default']; inst['default'] = inst; exports['default'] = inst; module.exports = exports['default']; /***/ }), /* 1 */ /***/ (function(module, exports) { "use strict"; exports["default"] = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; exports.__esModule = true; /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireWildcard = __webpack_require__(3)['default']; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _handlebarsBase = __webpack_require__(4); var base = _interopRequireWildcard(_handlebarsBase); // Each of these augment the Handlebars object. No need to setup here. // (This is done to easily share code between commonjs and browse envs) var _handlebarsSafeString = __webpack_require__(37); var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); var _handlebarsException = __webpack_require__(6); var _handlebarsException2 = _interopRequireDefault(_handlebarsException); var _handlebarsUtils = __webpack_require__(5); var Utils = _interopRequireWildcard(_handlebarsUtils); var _handlebarsRuntime = __webpack_require__(38); var runtime = _interopRequireWildcard(_handlebarsRuntime); var _handlebarsNoConflict = __webpack_require__(44); var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); // For compatibility and usage outside of module systems, make the Handlebars object a namespace function create() { var hb = new base.HandlebarsEnvironment(); Utils.extend(hb, base); hb.SafeString = _handlebarsSafeString2['default']; hb.Exception = _handlebarsException2['default']; hb.Utils = Utils; hb.escapeExpression = Utils.escapeExpression; hb.VM = runtime; hb.template = function (spec) { return runtime.template(spec, hb); }; return hb; } var inst = create(); inst.create = create; _handlebarsNoConflict2['default'](inst); inst['default'] = inst; exports['default'] = inst; module.exports = exports['default']; /***/ }), /* 3 */ /***/ (function(module, exports) { "use strict"; exports["default"] = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }; exports.__esModule = true; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; exports.HandlebarsEnvironment = HandlebarsEnvironment; var _utils = __webpack_require__(5); var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); var _helpers = __webpack_require__(10); var _decorators = __webpack_require__(30); var _logger = __webpack_require__(32); var _logger2 = _interopRequireDefault(_logger); var _internalProtoAccess = __webpack_require__(33); var VERSION = '4.7.7'; exports.VERSION = VERSION; var COMPILER_REVISION = 8; exports.COMPILER_REVISION = COMPILER_REVISION; var LAST_COMPATIBLE_COMPILER_REVISION = 7; exports.LAST_COMPATIBLE_COMPILER_REVISION = LAST_COMPATIBLE_COMPILER_REVISION; var REVISION_CHANGES = { 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it 2: '== 1.0.0-rc.3', 3: '== 1.0.0-rc.4', 4: '== 1.x.x', 5: '== 2.0.0-alpha.x', 6: '>= 2.0.0-beta.1', 7: '>= 4.0.0 <4.3.0', 8: '>= 4.3.0' }; exports.REVISION_CHANGES = REVISION_CHANGES; var objectType = '[object Object]'; function HandlebarsEnvironment(helpers, partials, decorators) { this.helpers = helpers || {}; this.partials = partials || {}; this.decorators = decorators || {}; _helpers.registerDefaultHelpers(this); _decorators.registerDefaultDecorators(this); } HandlebarsEnvironment.prototype = { constructor: HandlebarsEnvironment, logger: _logger2['default'], log: _logger2['default'].log, registerHelper: function registerHelper(name, fn) { if (_utils.toString.call(name) === objectType) { if (fn) { throw new _exception2['default']('Arg not supported with multiple helpers'); } _utils.extend(this.helpers, name); } else { this.helpers[name] = fn; } }, unregisterHelper: function unregisterHelper(name) { delete this.helpers[name]; }, registerPartial: function registerPartial(name, partial) { if (_utils.toString.call(name) === objectType) { _utils.extend(this.partials, name); } else { if (typeof partial === 'undefined') { throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); } this.partials[name] = partial; } }, unregisterPartial: function unregisterPartial(name) { delete this.partials[name]; }, registerDecorator: function registerDecorator(name, fn) { if (_utils.toString.call(name) === objectType) { if (fn) { throw new _exception2['default']('Arg not supported with multiple decorators'); } _utils.extend(this.decorators, name); } else { this.decorators[name] = fn; } }, unregisterDecorator: function unregisterDecorator(name) { delete this.decorators[name]; }, /** * Reset the memory of illegal property accesses that have already been logged. * @deprecated should only be used in handlebars test-cases */ resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() { _internalProtoAccess.resetLoggedProperties(); } }; var log = _logger2['default'].log; exports.log = log; exports.createFrame = _utils.createFrame; exports.logger = _logger2['default']; /***/ }), /* 5 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports.extend = extend; exports.indexOf = indexOf; exports.escapeExpression = escapeExpression; exports.isEmpty = isEmpty; exports.createFrame = createFrame; exports.blockParams = blockParams; exports.appendContextPath = appendContextPath; var escape = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', '=': '=' }; var badChars = /[&<>"'`=]/g, possible = /[&<>"'`=]/; function escapeChar(chr) { return escape[chr]; } function extend(obj /* , ...source */) { for (var i = 1; i < arguments.length; i++) { for (var key in arguments[i]) { if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { obj[key] = arguments[i][key]; } } } return obj; } var toString = Object.prototype.toString; exports.toString = toString; // Sourced from lodash // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt /* eslint-disable func-style */ var isFunction = function isFunction(value) { return typeof value === 'function'; }; // fallback for older versions of Chrome and Safari /* istanbul ignore next */ if (isFunction(/x/)) { exports.isFunction = isFunction = function (value) { return typeof value === 'function' && toString.call(value) === '[object Function]'; }; } exports.isFunction = isFunction; /* eslint-enable func-style */ /* istanbul ignore next */ var isArray = Array.isArray || function (value) { return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; }; exports.isArray = isArray; // Older IE versions do not directly support indexOf so we must implement our own, sadly. function indexOf(array, value) { for (var i = 0, len = array.length; i < len; i++) { if (array[i] === value) { return i; } } return -1; } function escapeExpression(string) { if (typeof string !== 'string') { // don't escape SafeStrings, since they're already safe if (string && string.toHTML) { return string.toHTML(); } else if (string == null) { return ''; } else if (!string) { return string + ''; } // Force a string conversion as this will be done by the append regardless and // the regex test will do this transparently behind the scenes, causing issues if // an object's to string has escaped characters in it. string = '' + string; } if (!possible.test(string)) { return string; } return string.replace(badChars, escapeChar); } function isEmpty(value) { if (!value && value !== 0) { return true; } else if (isArray(value) && value.length === 0) { return true; } else { return false; } } function createFrame(object) { var frame = extend({}, object); frame._parent = object; return frame; } function blockParams(params, ids) { params.path = ids; return params; } function appendContextPath(contextPath, id) { return (contextPath ? contextPath + '.' : '') + id; } /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$defineProperty = __webpack_require__(7)['default']; exports.__esModule = true; var errorProps = ['description', 'fileName', 'lineNumber', 'endLineNumber', 'message', 'name', 'number', 'stack']; function Exception(message, node) { var loc = node && node.loc, line = undefined, endLineNumber = undefined, column = undefined, endColumn = undefined; if (loc) { line = loc.start.line; endLineNumber = loc.end.line; column = loc.start.column; endColumn = loc.end.column; message += ' - ' + line + ':' + column; } var tmp = Error.prototype.constructor.call(this, message); // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. for (var idx = 0; idx < errorProps.length; idx++) { this[errorProps[idx]] = tmp[errorProps[idx]]; } /* istanbul ignore else */ if (Error.captureStackTrace) { Error.captureStackTrace(this, Exception); } try { if (loc) { this.lineNumber = line; this.endLineNumber = endLineNumber; // Work around issue under safari where we can't directly set the column value /* istanbul ignore next */ if (_Object$defineProperty) { Object.defineProperty(this, 'column', { value: column, enumerable: true }); Object.defineProperty(this, 'endColumn', { value: endColumn, enumerable: true }); } else { this.column = column; this.endColumn = endColumn; } } } catch (nop) { /* Ignore if the browser is very particular */ } } Exception.prototype = new Error(); exports['default'] = Exception; module.exports = exports['default']; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(8), __esModule: true }; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { var $ = __webpack_require__(9); module.exports = function defineProperty(it, key, desc){ return $.setDesc(it, key, desc); }; /***/ }), /* 9 */ /***/ (function(module, exports) { var $Object = Object; module.exports = { create: $Object.create, getProto: $Object.getPrototypeOf, isEnum: {}.propertyIsEnumerable, getDesc: $Object.getOwnPropertyDescriptor, setDesc: $Object.defineProperty, setDescs: $Object.defineProperties, getKeys: $Object.keys, getNames: $Object.getOwnPropertyNames, getSymbols: $Object.getOwnPropertySymbols, each: [].forEach }; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; exports.registerDefaultHelpers = registerDefaultHelpers; exports.moveHelperToHooks = moveHelperToHooks; var _helpersBlockHelperMissing = __webpack_require__(11); var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); var _helpersEach = __webpack_require__(12); var _helpersEach2 = _interopRequireDefault(_helpersEach); var _helpersHelperMissing = __webpack_require__(25); var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); var _helpersIf = __webpack_require__(26); var _helpersIf2 = _interopRequireDefault(_helpersIf); var _helpersLog = __webpack_require__(27); var _helpersLog2 = _interopRequireDefault(_helpersLog); var _helpersLookup = __webpack_require__(28); var _helpersLookup2 = _interopRequireDefault(_helpersLookup); var _helpersWith = __webpack_require__(29); var _helpersWith2 = _interopRequireDefault(_helpersWith); function registerDefaultHelpers(instance) { _helpersBlockHelperMissing2['default'](instance); _helpersEach2['default'](instance); _helpersHelperMissing2['default'](instance); _helpersIf2['default'](instance); _helpersLog2['default'](instance); _helpersLookup2['default'](instance); _helpersWith2['default'](instance); } function moveHelperToHooks(instance, helperName, keepHelper) { if (instance.helpers[helperName]) { instance.hooks[helperName] = instance.helpers[helperName]; if (!keepHelper) { delete instance.helpers[helperName]; } } } /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _utils = __webpack_require__(5); exports['default'] = function (instance) { instance.registerHelper('blockHelperMissing', function (context, options) { var inverse = options.inverse, fn = options.fn; if (context === true) { return fn(this); } else if (context === false || context == null) { return inverse(this); } else if (_utils.isArray(context)) { if (context.length > 0) { if (options.ids) { options.ids = [options.name]; } return instance.helpers.each(context, options); } else { return inverse(this); } } else { if (options.data && options.ids) { var data = _utils.createFrame(options.data); data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); options = { data: data }; } return fn(context, options); } }); }; module.exports = exports['default']; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; var _Object$keys = __webpack_require__(13)['default']; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _utils = __webpack_require__(5); var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('each', function (context, options) { if (!options) { throw new _exception2['default']('Must pass iterator to #each'); } var fn = options.fn, inverse = options.inverse, i = 0, ret = '', data = undefined, contextPath = undefined; if (options.data && options.ids) { contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; } if (_utils.isFunction(context)) { context = context.call(this); } if (options.data) { data = _utils.createFrame(options.data); } function execIteration(field, index, last) { if (data) { data.key = field; data.index = index; data.first = index === 0; data.last = !!last; if (contextPath) { data.contextPath = contextPath + field; } } ret = ret + fn(context[field], { data: data, blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) }); } if (context && typeof context === 'object') { if (_utils.isArray(context)) { for (var j = context.length; i < j; i++) { if (i in context) { execIteration(i, i, i === context.length - 1); } } } else if (global.Symbol && context[global.Symbol.iterator]) { var newContext = []; var iterator = context[global.Symbol.iterator](); for (var it = iterator.next(); !it.done; it = iterator.next()) { newContext.push(it.value); } context = newContext; for (var j = context.length; i < j; i++) { execIteration(i, i, i === context.length - 1); } } else { (function () { var priorKey = undefined; _Object$keys(context).forEach(function (key) { // We're running the iterations one step out of sync so we can detect // the last iteration without have to scan the object twice and create // an itermediate keys array. if (priorKey !== undefined) { execIteration(priorKey, i - 1); } priorKey = key; i++; }); if (priorKey !== undefined) { execIteration(priorKey, i - 1, true); } })(); } } if (i === 0) { ret = inverse(this); } return ret; }); }; module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(14), __esModule: true }; /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(15); module.exports = __webpack_require__(21).Object.keys; /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 Object.keys(O) var toObject = __webpack_require__(16); __webpack_require__(18)('keys', function($keys){ return function keys(it){ return $keys(toObject(it)); }; }); /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) var defined = __webpack_require__(17); module.exports = function(it){ return Object(defined(it)); }; /***/ }), /* 17 */ /***/ (function(module, exports) { // 7.2.1 RequireObjectCoercible(argument) module.exports = function(it){ if(it == undefined)throw TypeError("Can't call method on " + it); return it; }; /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { // most Object methods by ES6 should accept primitives var $export = __webpack_require__(19) , core = __webpack_require__(21) , fails = __webpack_require__(24); module.exports = function(KEY, exec){ var fn = (core.Object || {})[KEY] || Object[KEY] , exp = {}; exp[KEY] = exec(fn); $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); }; /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(20) , core = __webpack_require__(21) , ctx = __webpack_require__(22) , PROTOTYPE = 'prototype'; var $export = function(type, name, source){ var IS_FORCED = type & $export.F , IS_GLOBAL = type & $export.G , IS_STATIC = type & $export.S , IS_PROTO = type & $export.P , IS_BIND = type & $export.B , IS_WRAP = type & $export.W , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] , key, own, out; if(IS_GLOBAL)source = name; for(key in source){ // contains in native own = !IS_FORCED && target && key in target; if(own && key in exports)continue; // export native or passed out = own ? target[key] : source[key]; // prevent global pollution for namespaces exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] // bind timers to global for call from export context : IS_BIND && own ? ctx(out, global) // wrap global constructors for prevent change them in library : IS_WRAP && target[key] == out ? (function(C){ var F = function(param){ return this instanceof C ? new C(param) : C(param); }; F[PROTOTYPE] = C[PROTOTYPE]; return F; // make static versions for prototype methods })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; } }; // type bitmap $export.F = 1; // forced $export.G = 2; // global $export.S = 4; // static $export.P = 8; // proto $export.B = 16; // bind $export.W = 32; // wrap module.exports = $export; /***/ }), /* 20 */ /***/ (function(module, exports) { // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef /***/ }), /* 21 */ /***/ (function(module, exports) { var core = module.exports = {version: '1.2.6'}; if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { // optional / simple context binding var aFunction = __webpack_require__(23); module.exports = function(fn, that, length){ aFunction(fn); if(that === undefined)return fn; switch(length){ case 1: return function(a){ return fn.call(that, a); }; case 2: return function(a, b){ return fn.call(that, a, b); }; case 3: return function(a, b, c){ return fn.call(that, a, b, c); }; } return function(/* ...args */){ return fn.apply(that, arguments); }; }; /***/ }), /* 23 */ /***/ (function(module, exports) { module.exports = function(it){ if(typeof it != 'function')throw TypeError(it + ' is not a function!'); return it; }; /***/ }), /* 24 */ /***/ (function(module, exports) { module.exports = function(exec){ try { return !!exec(); } catch(e){ return true; } }; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('helperMissing', function () /* [args, ]options */{ if (arguments.length === 1) { // A missing field in a {{foo}} construct. return undefined; } else { // Someone is actually trying to call something, blow up. throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); } }); }; module.exports = exports['default']; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _utils = __webpack_require__(5); var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('if', function (conditional, options) { if (arguments.length != 2) { throw new _exception2['default']('#if requires exactly one argument'); } if (_utils.isFunction(conditional)) { conditional = conditional.call(this); } // Default behavior is to render the positive path if the value is truthy and not empty. // The `includeZero` option may be set to treat the condtional as purely not empty based on the // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { return options.inverse(this); } else { return options.fn(this); } }); instance.registerHelper('unless', function (conditional, options) { if (arguments.length != 2) { throw new _exception2['default']('#unless requires exactly one argument'); } return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); }); }; module.exports = exports['default']; /***/ }), /* 27 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports['default'] = function (instance) { instance.registerHelper('log', function () /* message, options */{ var args = [undefined], options = arguments[arguments.length - 1]; for (var i = 0; i < arguments.length - 1; i++) { args.push(arguments[i]); } var level = 1; if (options.hash.level != null) { level = options.hash.level; } else if (options.data && options.data.level != null) { level = options.data.level; } args[0] = level; instance.log.apply(instance, args); }); }; module.exports = exports['default']; /***/ }), /* 28 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports['default'] = function (instance) { instance.registerHelper('lookup', function (obj, field, options) { if (!obj) { // Note for 5.0: Change to "obj == null" in 5.0 return obj; } return options.lookupProperty(obj, field); }); }; module.exports = exports['default']; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _utils = __webpack_require__(5); var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('with', function (context, options) { if (arguments.length != 2) { throw new _exception2['default']('#with requires exactly one argument'); } if (_utils.isFunction(context)) { context = context.call(this); } var fn = options.fn; if (!_utils.isEmpty(context)) { var data = options.data; if (options.data && options.ids) { data = _utils.createFrame(options.data); data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); } return fn(context, { data: data, blockParams: _utils.blockParams([context], [data && data.contextPath]) }); } else { return options.inverse(this); } }); }; module.exports = exports['default']; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; exports.registerDefaultDecorators = registerDefaultDecorators; var _decoratorsInline = __webpack_require__(31); var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); function registerDefaultDecorators(instance) { _decoratorsInline2['default'](instance); } /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _utils = __webpack_require__(5); exports['default'] = function (instance) { instance.registerDecorator('inline', function (fn, props, container, options) { var ret = fn; if (!props.partials) { props.partials = {}; ret = function (context, options) { // Create a new partials stack frame prior to exec. var original = container.partials; container.partials = _utils.extend({}, original, props.partials); var ret = fn(context, options); container.partials = original; return ret; }; } props.partials[options.args[0]] = options.fn; return ret; }); }; module.exports = exports['default']; /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _utils = __webpack_require__(5); var logger = { methodMap: ['debug', 'info', 'warn', 'error'], level: 'info', // Maps a given level value to the `methodMap` indexes above. lookupLevel: function lookupLevel(level) { if (typeof level === 'string') { var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); if (levelMap >= 0) { level = levelMap; } else { level = parseInt(level, 10); } } return level; }, // Can be overridden in the host environment log: function log(level) { level = logger.lookupLevel(level); if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { var method = logger.methodMap[level]; // eslint-disable-next-line no-console if (!console[method]) { method = 'log'; } for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { message[_key - 1] = arguments[_key]; } console[method].apply(console, message); // eslint-disable-line no-console } } }; exports['default'] = logger; module.exports = exports['default']; /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$create = __webpack_require__(34)['default']; var _Object$keys = __webpack_require__(13)['default']; var _interopRequireWildcard = __webpack_require__(3)['default']; exports.__esModule = true; exports.createProtoAccessControl = createProtoAccessControl; exports.resultIsAllowed = resultIsAllowed; exports.resetLoggedProperties = resetLoggedProperties; var _createNewLookupObject = __webpack_require__(36); var _logger = __webpack_require__(32); var logger = _interopRequireWildcard(_logger); var loggedProperties = _Object$create(null); function createProtoAccessControl(runtimeOptions) { var defaultMethodWhiteList = _Object$create(null); defaultMethodWhiteList['constructor'] = false; defaultMethodWhiteList['__defineGetter__'] = false; defaultMethodWhiteList['__defineSetter__'] = false; defaultMethodWhiteList['__lookupGetter__'] = false; var defaultPropertyWhiteList = _Object$create(null); // eslint-disable-next-line no-proto defaultPropertyWhiteList['__proto__'] = false; return { properties: { whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties), defaultValue: runtimeOptions.allowProtoPropertiesByDefault }, methods: { whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods), defaultValue: runtimeOptions.allowProtoMethodsByDefault } }; } function resultIsAllowed(result, protoAccessControl, propertyName) { if (typeof result === 'function') { return checkWhiteList(protoAccessControl.methods, propertyName); } else { return checkWhiteList(protoAccessControl.properties, propertyName); } } function checkWhiteList(protoAccessControlForType, propertyName) { if (protoAccessControlForType.whitelist[propertyName] !== undefined) { return protoAccessControlForType.whitelist[propertyName] === true; } if (protoAccessControlForType.defaultValue !== undefined) { return protoAccessControlForType.defaultValue; } logUnexpecedPropertyAccessOnce(propertyName); return false; } function logUnexpecedPropertyAccessOnce(propertyName) { if (loggedProperties[propertyName] !== true) { loggedProperties[propertyName] = true; logger.log('error', 'Handlebars: Access has been denied to resolve the property "' + propertyName + '" because it is not an "own property" of its parent.\n' + 'You can add a runtime option to disable the check or this warning:\n' + 'See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details'); } } function resetLoggedProperties() { _Object$keys(loggedProperties).forEach(function (propertyName) { delete loggedProperties[propertyName]; }); } /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(35), __esModule: true }; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { var $ = __webpack_require__(9); module.exports = function create(P, D){ return $.create(P, D); }; /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$create = __webpack_require__(34)['default']; exports.__esModule = true; exports.createNewLookupObject = createNewLookupObject; var _utils = __webpack_require__(5); /** * Create a new object with "null"-prototype to avoid truthy results on prototype properties. * The resulting object can be used with "object[property]" to check if a property exists * @param {...object} sources a varargs parameter of source objects that will be merged * @returns {object} */ function createNewLookupObject() { for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) { sources[_key] = arguments[_key]; } return _utils.extend.apply(undefined, [_Object$create(null)].concat(sources)); } /***/ }), /* 37 */ /***/ (function(module, exports) { // Build out our basic SafeString type 'use strict'; exports.__esModule = true; function SafeString(string) { this.string = string; } SafeString.prototype.toString = SafeString.prototype.toHTML = function () { return '' + this.string; }; exports['default'] = SafeString; module.exports = exports['default']; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$seal = __webpack_require__(39)['default']; var _Object$keys = __webpack_require__(13)['default']; var _interopRequireWildcard = __webpack_require__(3)['default']; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; exports.checkRevision = checkRevision; exports.template = template; exports.wrapProgram = wrapProgram; exports.resolvePartial = resolvePartial; exports.invokePartial = invokePartial; exports.noop = noop; var _utils = __webpack_require__(5); var Utils = _interopRequireWildcard(_utils); var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); var _base = __webpack_require__(4); var _helpers = __webpack_require__(10); var _internalWrapHelper = __webpack_require__(43); var _internalProtoAccess = __webpack_require__(33); function checkRevision(compilerInfo) { var compilerRevision = compilerInfo && compilerInfo[0] || 1, currentRevision = _base.COMPILER_REVISION; if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) { return; } if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) { var runtimeVersions = _base.REVISION_CHANGES[currentRevision], compilerVersions = _base.REVISION_CHANGES[compilerRevision]; throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); } else { // Use the embedded version info since the runtime doesn't know about this revision yet throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); } } function template(templateSpec, env) { /* istanbul ignore next */ if (!env) { throw new _exception2['default']('No environment passed to template'); } if (!templateSpec || !templateSpec.main) { throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); } templateSpec.main.decorator = templateSpec.main_d; // Note: Using env.VM references rather than local var references throughout this section to allow // for external users to override these as pseudo-supported APIs. env.VM.checkRevision(templateSpec.compiler); // backwards compatibility for precompiled templates with compiler-version 7 (<4.3.0) var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7; function invokePartialWrapper(partial, context, options) { if (options.hash) { context = Utils.extend({}, context, options.hash); if (options.ids) { options.ids[0] = true; } } partial = env.VM.resolvePartial.call(this, partial, context, options); var extendedOptions = Utils.extend({}, options, { hooks: this.hooks, protoAccessControl: this.protoAccessControl }); var result = env.VM.invokePartial.call(this, partial, context, extendedOptions); if (result == null && env.compile) { options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); result = options.partials[options.name](context, extendedOptions); } if (result != null) { if (options.indent) { var lines = result.split('\n'); for (var i = 0, l = lines.length; i < l; i++) { if (!lines[i] && i + 1 === l) { break; } lines[i] = options.indent + lines[i]; } result = lines.join('\n'); } return result; } else { throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); } } // Just add water var container = { strict: function strict(obj, name, loc) { if (!obj || !(name in obj)) { throw new _exception2['default']('"' + name + '" not defined in ' + obj, { loc: loc }); } return container.lookupProperty(obj, name); }, lookupProperty: function lookupProperty(parent, propertyName) { var result = parent[propertyName]; if (result == null) { return result; } if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { return result; } if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) { return result; } return undefined; }, lookup: function lookup(depths, name) { var len = depths.length; for (var i = 0; i < len; i++) { var result = depths[i] && container.lookupProperty(depths[i], name); if (result != null) { return depths[i][name]; } } }, lambda: function lambda(current, context) { return typeof current === 'function' ? current.call(context) : current; }, escapeExpression: Utils.escapeExpression, invokePartial: invokePartialWrapper, fn: function fn(i) { var ret = templateSpec[i]; ret.decorator = templateSpec[i + '_d']; return ret; }, programs: [], program: function program(i, data, declaredBlockParams, blockParams, depths) { var programWrapper = this.programs[i], fn = this.fn(i); if (data || depths || blockParams || declaredBlockParams) { programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); } else if (!programWrapper) { programWrapper = this.programs[i] = wrapProgram(this, i, fn); } return programWrapper; }, data: function data(value, depth) { while (value && depth--) { value = value._parent; } return value; }, mergeIfNeeded: function mergeIfNeeded(param, common) { var obj = param || common; if (param && common && param !== common) { obj = Utils.extend({}, common, param); } return obj; }, // An empty object to use as replacement for null-contexts nullContext: _Object$seal({}), noop: env.VM.noop, compilerInfo: templateSpec.compiler }; function ret(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var data = options.data; ret._setup(options); if (!options.partial && templateSpec.useData) { data = initData(context, data); } var depths = undefined, blockParams = templateSpec.useBlockParams ? [] : undefined; if (templateSpec.useDepths) { if (options.depths) { depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; } else { depths = [context]; } } function main(context /*, options*/) { return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); } main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); return main(context, options); } ret.isTop = true; ret._setup = function (options) { if (!options.partial) { var mergedHelpers = Utils.extend({}, env.helpers, options.helpers); wrapHelpersToPassLookupProperty(mergedHelpers, container); container.helpers = mergedHelpers; if (templateSpec.usePartial) { // Use mergeIfNeeded here to prevent compiling global partials multiple times container.partials = container.mergeIfNeeded(options.partials, env.partials); } if (templateSpec.usePartial || templateSpec.useDecorators) { container.decorators = Utils.extend({}, env.decorators, options.decorators); } container.hooks = {}; container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options); var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7; _helpers.moveHelperToHooks(container, 'helperMissing', keepHelperInHelpers); _helpers.moveHelperToHooks(container, 'blockHelperMissing', keepHelperInHelpers); } else { container.protoAccessControl = options.protoAccessControl; // internal option container.helpers = options.helpers; container.partials = options.partials; container.decorators = options.decorators; container.hooks = options.hooks; } }; ret._child = function (i, data, blockParams, depths) { if (templateSpec.useBlockParams && !blockParams) { throw new _exception2['default']('must pass block params'); } if (templateSpec.useDepths && !depths) { throw new _exception2['default']('must pass parent depths'); } return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); }; return ret; } function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { function prog(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var currentDepths = depths; if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { currentDepths = [context].concat(depths); } return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); } prog = executeDecorators(fn, prog, container, depths, data, blockParams); prog.program = i; prog.depth = depths ? depths.length : 0; prog.blockParams = declaredBlockParams || 0; return prog; } /** * This is currently part of the official API, therefore implementation details should not be changed. */ function resolvePartial(partial, context, options) { if (!partial) { if (options.name === '@partial-block') { partial = options.data['partial-block']; } else { partial = options.partials[options.name]; } } else if (!partial.call && !options.name) { // This is a dynamic partial that returned a string options.name = partial; partial = options.partials[partial]; } return partial; } function invokePartial(partial, context, options) { // Use the current closure context to save the partial-block if this partial var currentPartialBlock = options.data && options.data['partial-block']; options.partial = true; if (options.ids) { options.data.contextPath = options.ids[0] || options.data.contextPath; } var partialBlock = undefined; if (options.fn && options.fn !== noop) { (function () { options.data = _base.createFrame(options.data); // Wrapper function to get access to currentPartialBlock from the closure var fn = options.fn; partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; // Restore the partial-block from the closure for the execution of the block // i.e. the part inside the block of the partial call. options.data = _base.createFrame(options.data); options.data['partial-block'] = currentPartialBlock; return fn(context, options); }; if (fn.partials) { options.partials = Utils.extend({}, options.partials, fn.partials); } })(); } if (partial === undefined && partialBlock) { partial = partialBlock; } if (partial === undefined) { throw new _exception2['default']('The partial ' + options.name + ' could not be found'); } else if (partial instanceof Function) { return partial(context, options); } } function noop() { return ''; } function initData(context, data) { if (!data || !('root' in data)) { data = data ? _base.createFrame(data) : {}; data.root = context; } return data; } function executeDecorators(fn, prog, container, depths, data, blockParams) { if (fn.decorator) { var props = {}; prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); Utils.extend(prog, props); } return prog; } function wrapHelpersToPassLookupProperty(mergedHelpers, container) { _Object$keys(mergedHelpers).forEach(function (helperName) { var helper = mergedHelpers[helperName]; mergedHelpers[helperName] = passLookupPropertyOption(helper, container); }); } function passLookupPropertyOption(helper, container) { var lookupProperty = container.lookupProperty; return _internalWrapHelper.wrapHelper(helper, function (options) { return Utils.extend({ lookupProperty: lookupProperty }, options); }); } /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { module.exports = { "default": __webpack_require__(40), __esModule: true }; /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(41); module.exports = __webpack_require__(21).Object.seal; /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.17 Object.seal(O) var isObject = __webpack_require__(42); __webpack_require__(18)('seal', function($seal){ return function seal(it){ return $seal && isObject(it) ? $seal(it) : it; }; }); /***/ }), /* 42 */ /***/ (function(module, exports) { module.exports = function(it){ return typeof it === 'object' ? it !== null : typeof it === 'function'; }; /***/ }), /* 43 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; exports.wrapHelper = wrapHelper; function wrapHelper(helper, transformOptionsFn) { if (typeof helper !== 'function') { // This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639 // We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function. return helper; } var wrapper = function wrapper() /* dynamic arguments */{ var options = arguments[arguments.length - 1]; arguments[arguments.length - 1] = transformOptionsFn(options); return helper.apply(this, arguments); }; return wrapper; } /***/ }), /* 44 */ /***/ (function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {'use strict'; exports.__esModule = true; exports['default'] = function (Handlebars) { /* istanbul ignore next */ var root = typeof global !== 'undefined' ? global : window, $Handlebars = root.Handlebars; /* istanbul ignore next */ Handlebars.noConflict = function () { if (root.Handlebars === Handlebars) { root.Handlebars = $Handlebars; } return Handlebars; }; }; module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }), /* 45 */ /***/ (function(module, exports) { 'use strict'; exports.__esModule = true; var AST = { // Public API used to evaluate derived attributes regarding AST nodes helpers: { // a mustache is definitely a helper if: // * it is an eligible helper, and // * it has at least one parameter or hash segment helperExpression: function helperExpression(node) { return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash); }, scopedId: function scopedId(path) { return (/^\.|this\b/.test(path.original) ); }, // an ID is simple if it only has one part, and that part is not // `..` or `this`. simpleId: function simpleId(path) { return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; } } }; // Must be exported as an object rather than the root of the module as the jison lexer // must modify the object to operate properly. exports['default'] = AST; module.exports = exports['default']; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; var _interopRequireWildcard = __webpack_require__(3)['default']; exports.__esModule = true; exports.parseWithoutProcessing = parseWithoutProcessing; exports.parse = parse; var _parser = __webpack_require__(47); var _parser2 = _interopRequireDefault(_parser); var _whitespaceControl = __webpack_require__(48); var _whitespaceControl2 = _interopRequireDefault(_whitespaceControl); var _helpers = __webpack_require__(50); var Helpers = _interopRequireWildcard(_helpers); var _utils = __webpack_require__(5); exports.parser = _parser2['default']; var yy = {}; _utils.extend(yy, Helpers); function parseWithoutProcessing(input, options) { // Just return if an already-compiled AST was passed in. if (input.type === 'Program') { return input; } _parser2['default'].yy = yy; // Altering the shared object here, but this is ok as parser is a sync operation yy.locInfo = function (locInfo) { return new yy.SourceLocation(options && options.srcName, locInfo); }; var ast = _parser2['default'].parse(input); return ast; } function parse(input, options) { var ast = parseWithoutProcessing(input, options); var strip = new _whitespaceControl2['default'](options); return strip.accept(ast); } /***/ }), /* 47 */ /***/ (function(module, exports) { // File ignored in coverage tests via setting in .istanbul.yml /* Jison generated parser */ "use strict"; exports.__esModule = true; var handlebars = (function () { var parser = { trace: function trace() {}, yy: {}, symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 }, terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" }, productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 0], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { var $0 = $$.length - 1; switch (yystate) { case 1: return $$[$0 - 1]; break; case 2: this.$ = yy.prepareProgram($$[$0]); break; case 3: this.$ = $$[$0]; break; case 4: this.$ = $$[$0]; break; case 5: this.$ = $$[$0]; break; case 6: this.$ = $$[$0]; break; case 7: this.$ = $$[$0]; break; case 8: this.$ = $$[$0]; break; case 9: this.$ = { type: 'CommentStatement', value: yy.stripComment($$[$0]), strip: yy.stripFlags($$[$0], $$[$0]), loc: yy.locInfo(this._$) }; break; case 10: this.$ = { type: 'ContentStatement', original: $$[$0], value: $$[$0], loc: yy.locInfo(this._$) }; break; case 11: this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); break; case 12: this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; break; case 13: this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); break; case 14: this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); break; case 15: this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; break; case 16: this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; break; case 17: this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; break; case 18: this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; break; case 19: var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), program = yy.prepareProgram([inverse], $$[$0 - 1].loc); program.chained = true; this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; break; case 20: this.$ = $$[$0]; break; case 21: this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; break; case 22: this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); break; case 23: this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); break; case 24: this.$ = { type: 'PartialStatement', name: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], indent: '', strip: yy.stripFlags($$[$0 - 4], $$[$0]), loc: yy.locInfo(this._$) }; break; case 25: this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); break; case 26: this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) }; break; case 27: this.$ = $$[$0]; break; case 28: this.$ = $$[$0]; break; case 29: this.$ = { type: 'SubExpression', path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], loc: yy.locInfo(this._$) }; break; case 30: this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) }; break; case 31: this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) }; break; case 32: this.$ = yy.id($$[$0 - 1]); break; case 33: this.$ = $$[$0]; break; case 34: this.$ = $$[$0]; break; case 35: this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) }; break; case 36: this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) }; break; case 37: this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) }; break; case 38: this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) }; break; case 39: this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) }; break; case 40: this.$ = $$[$0]; break; case 41: this.$ = $$[$0]; break; case 42: this.$ = yy.preparePath(true, $$[$0], this._$); break; case 43: this.$ = yy.preparePath(false, $$[$0], this._$); break; case 44: $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; break; case 45: this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; break; case 46: this.$ = []; break; case 47: $$[$0 - 1].push($$[$0]); break; case 48: this.$ = []; break; case 49: $$[$0 - 1].push($$[$0]); break; case 50: this.$ = []; break; case 51: $$[$0 - 1].push($$[$0]); break; case 58: this.$ = []; break; case 59: $$[$0 - 1].push($$[$0]); break; case 64: this.$ = []; break; case 65: $$[$0 - 1].push($$[$0]); break; case 70: this.$ = []; break; case 71: $$[$0 - 1].push($$[$0]); break; case 78: this.$ = []; break; case 79: $$[$0 - 1].push($$[$0]); break; case 82: this.$ = []; break; case 83: $$[$0 - 1].push($$[$0]); break; case 86: this.$ = []; break; case 87: $$[$0 - 1].push($$[$0]); break; case 90: this.$ = []; break; case 91: $$[$0 - 1].push($$[$0]); break; case 94: this.$ = []; break; case 95: $$[$0 - 1].push($$[$0]); break; case 98: this.$ = [$$[$0]]; break; case 99: $$[$0 - 1].push($$[$0]); break; case 100: this.$ = [$$[$0]]; break; case 101: $$[$0 - 1].push($$[$0]); break; } }, table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 15: [2, 48], 17: 39, 18: [2, 48] }, { 20: 41, 56: 40, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 44, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 45, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 41, 56: 48, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 49, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 50] }, { 72: [1, 35], 86: 51 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 52, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 53, 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 54, 47: [2, 54] }, { 28: 59, 43: 60, 44: [1, 58], 47: [2, 56] }, { 13: 62, 15: [1, 20], 18: [1, 61] }, { 33: [2, 86], 57: 63, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 64, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 65, 47: [1, 66] }, { 30: 67, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 68, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 69, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 70, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 74, 33: [2, 80], 50: 71, 63: 72, 64: 75, 65: [1, 43], 69: 73, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 79] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 50] }, { 20: 74, 53: 80, 54: [2, 84], 63: 81, 64: 75, 65: [1, 43], 69: 82, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 83, 47: [1, 66] }, { 47: [2, 55] }, { 4: 84, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 85, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 86, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 87, 47: [1, 66] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 74, 33: [2, 88], 58: 88, 63: 89, 64: 75, 65: [1, 43], 69: 90, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 91, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 92, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 31: 93, 33: [2, 60], 63: 94, 64: 75, 65: [1, 43], 69: 95, 70: 76, 71: 77, 72: [1, 78], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 66], 36: 96, 63: 97, 64: 75, 65: [1, 43], 69: 98, 70: 76, 71: 77, 72: [1, 78], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 22: 99, 23: [2, 52], 63: 100, 64: 75, 65: [1, 43], 69: 101, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 92], 62: 102, 63: 103, 64: 75, 65: [1, 43], 69: 104, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 105] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 106, 72: [1, 107], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 108], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 109] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 111, 46: 110, 47: [2, 76] }, { 33: [2, 70], 40: 112, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 113] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 74, 63: 115, 64: 75, 65: [1, 43], 67: 114, 68: [2, 96], 69: 116, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 117] }, { 32: 118, 33: [2, 62], 74: 119, 75: [1, 120] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 121, 74: 122, 75: [1, 120] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 123] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 124] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 108] }, { 20: 74, 63: 125, 64: 75, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 74, 33: [2, 72], 41: 126, 63: 127, 64: 75, 65: [1, 43], 69: 128, 70: 76, 71: 77, 72: [1, 78], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 129] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 130] }, { 33: [2, 63] }, { 72: [1, 132], 76: 131 }, { 33: [1, 133] }, { 33: [2, 69] }, { 15: [2, 12], 18: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 134, 74: 135, 75: [1, 120] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 137], 77: [1, 136] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 138] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }], defaultActions: { 4: [2, 1], 54: [2, 55], 56: [2, 20], 60: [2, 57], 73: [2, 81], 82: [2, 85], 86: [2, 18], 90: [2, 89], 101: [2, 53], 104: [2, 93], 110: [2, 19], 111: [2, 77], 116: [2, 97], 119: [2, 63], 122: [2, 69], 135: [2, 75], 136: [2, 32] }, parseError: function parseError(str, hash) { throw new Error(str); }, parse: function parse(input) { var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; this.lexer.setInput(input); this.lexer.yy = this.yy; this.yy.lexer = this.lexer; this.yy.parser = this; if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; var yyloc = this.lexer.yylloc; lstack.push(yyloc); var ranges = this.lexer.options && this.lexer.options.ranges; if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; function popStack(n) { stack.length = stack.length - 2 * n; vstack.length = vstack.length - n; lstack.length = lstack.length - n; } function lex() { var token; token = self.lexer.lex() || 1; if (typeof token !== "number") { token = self.symbols_[token] || token; } return token; } var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; while (true) { state = stack[stack.length - 1]; if (this.defaultActions[state]) { action = this.defaultActions[state]; } else { if (symbol === null || typeof symbol == "undefined") { symbol = lex(); } action = table[state] && table[state][symbol]; } if (typeof action === "undefined" || !action.length || !action[0]) { var errStr = ""; if (!recovering) { expected = []; for (p in table[state]) if (this.terminals_[p] && p > 2) { expected.push("'" + this.terminals_[p] + "'"); } if (this.lexer.showPosition) { errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; } else { errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); } this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); } } if (action[0] instanceof Array && action.length > 1) { throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); } switch (action[0]) { case 1: stack.push(symbol); vstack.push(this.lexer.yytext); lstack.push(this.lexer.yylloc); stack.push(action[1]); symbol = null; if (!preErrorSymbol) { yyleng = this.lexer.yyleng; yytext = this.lexer.yytext; yylineno = this.lexer.yylineno; yyloc = this.lexer.yylloc; if (recovering > 0) recovering--; } else { symbol = preErrorSymbol; preErrorSymbol = null; } break; case 2: len = this.productions_[action[1]][1]; yyval.$ = vstack[vstack.length - len]; yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; if (ranges) { yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; } r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); if (typeof r !== "undefined") { return r; } if (len) { stack = stack.slice(0, -1 * len * 2); vstack = vstack.slice(0, -1 * len); lstack = lstack.slice(0, -1 * len); } stack.push(this.productions_[action[1]][0]); vstack.push(yyval.$); lstack.push(yyval._$); newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; stack.push(newState); break; case 3: return true; } } return true; } }; /* Jison generated lexer */ var lexer = (function () { var lexer = { EOF: 1, parseError: function parseError(str, hash) { if (this.yy.parser) { this.yy.parser.parseError(str, hash); } else { throw new Error(str); } }, setInput: function setInput(input) { this._input = input; this._more = this._less = this.done = false; this.yylineno = this.yyleng = 0; this.yytext = this.matched = this.match = ''; this.conditionStack = ['INITIAL']; this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; if (this.options.ranges) this.yylloc.range = [0, 0]; this.offset = 0; return this; }, input: function input() { var ch = this._input[0]; this.yytext += ch; this.yyleng++; this.offset++; this.match += ch; this.matched += ch; var lines = ch.match(/(?:\r\n?|\n).*/g); if (lines) { this.yylineno++; this.yylloc.last_line++; } else { this.yylloc.last_column++; } if (this.options.ranges) this.yylloc.range[1]++; this._input = this._input.slice(1); return ch; }, unput: function unput(ch) { var len = ch.length; var lines = ch.split(/(?:\r\n?|\n)/g); this._input = ch + this._input; this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); //this.yyleng -= len; this.offset -= len; var oldLines = this.match.split(/(?:\r\n?|\n)/g); this.match = this.match.substr(0, this.match.length - 1); this.matched = this.matched.substr(0, this.matched.length - 1); if (lines.length - 1) this.yylineno -= lines.length - 1; var r = this.yylloc.range; this.yylloc = { first_line: this.yylloc.first_line, last_line: this.yylineno + 1, first_column: this.yylloc.first_column, last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len }; if (this.options.ranges) { this.yylloc.range = [r[0], r[0] + this.yyleng - len]; } return this; }, more: function more() { this._more = true; return this; }, less: function less(n) { this.unput(this.match.slice(n)); }, pastInput: function pastInput() { var past = this.matched.substr(0, this.matched.length - this.match.length); return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, ""); }, upcomingInput: function upcomingInput() { var next = this.match; if (next.length < 20) { next += this._input.substr(0, 20 - next.length); } return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); }, showPosition: function showPosition() { var pre = this.pastInput(); var c = new Array(pre.length + 1).join("-"); return pre + this.upcomingInput() + "\n" + c + "^"; }, next: function next() { if (this.done) { return this.EOF; } if (!this._input) this.done = true; var token, match, tempMatch, index, col, lines; if (!this._more) { this.yytext = ''; this.match = ''; } var rules = this._currentRules(); for (var i = 0; i < rules.length; i++) { tempMatch = this._input.match(this.rules[rules[i]]); if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { match = tempMatch; index = i; if (!this.options.flex) break; } } if (match) { lines = match[0].match(/(?:\r\n?|\n).*/g); if (lines) this.yylineno += lines.length; this.yylloc = { first_line: this.yylloc.last_line, last_line: this.yylineno + 1, first_column: this.yylloc.last_column, last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; this.yytext += match[0]; this.match += match[0]; this.matches = match; this.yyleng = this.yytext.length; if (this.options.ranges) { this.yylloc.range = [this.offset, this.offset += this.yyleng]; } this._more = false; this._input = this._input.slice(match[0].length); this.matched += match[0]; token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); if (this.done && this._input) this.done = false; if (token) return token;else return; } if (this._input === "") { return this.EOF; } else { return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno }); } }, lex: function lex() { var r = this.next(); if (typeof r !== 'undefined') { return r; } else { return this.lex(); } }, begin: function begin(condition) { this.conditionStack.push(condition); }, popState: function popState() { return this.conditionStack.pop(); }, _currentRules: function _currentRules() { return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; }, topState: function topState() { return this.conditionStack[this.conditionStack.length - 2]; }, pushState: function begin(condition) { this.begin(condition); } }; lexer.options = {}; lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { function strip(start, end) { return yy_.yytext = yy_.yytext.substring(start, yy_.yyleng - end + start); } var YYSTATE = YY_START; switch ($avoiding_name_collisions) { case 0: if (yy_.yytext.slice(-2) === "\\\\") { strip(0, 1); this.begin("mu"); } else if (yy_.yytext.slice(-1) === "\\") { strip(0, 1); this.begin("emu"); } else { this.begin("mu"); } if (yy_.yytext) return 15; break; case 1: return 15; break; case 2: this.popState(); return 15; break; case 3: this.begin('raw');return 15; break; case 4: this.popState(); // Should be using `this.topState()` below, but it currently // returns the second top instead of the first top. Opened an // issue about it at https://github.com/zaach/jison/issues/291 if (this.conditionStack[this.conditionStack.length - 1] === 'raw') { return 15; } else { strip(5, 9); return 'END_RAW_BLOCK'; } break; case 5: return 15; break; case 6: this.popState(); return 14; break; case 7: return 65; break; case 8: return 68; break; case 9: return 19; break; case 10: this.popState(); this.begin('raw'); return 23; break; case 11: return 55; break; case 12: return 60; break; case 13: return 29; break; case 14: return 47; break; case 15: this.popState();return 44; break; case 16: this.popState();return 44; break; case 17: return 34; break; case 18: return 39; break; case 19: return 51; break; case 20: return 48; break; case 21: this.unput(yy_.yytext); this.popState(); this.begin('com'); break; case 22: this.popState(); return 14; break; case 23: return 48; break; case 24: return 73; break; case 25: return 72; break; case 26: return 72; break; case 27: return 87; break; case 28: // ignore whitespace break; case 29: this.popState();return 54; break; case 30: this.popState();return 33; break; case 31: yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80; break; case 32: yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80; break; case 33: return 85; break; case 34: return 82; break; case 35: return 82; break; case 36: return 83; break; case 37: return 84; break; case 38: return 81; break; case 39: return 75; break; case 40: return 77; break; case 41: return 72; break; case 42: yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72; break; case 43: return 'INVALID'; break; case 44: return 5; break; } }; lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^\/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]+?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/]; lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } }; return lexer; })(); parser.lexer = lexer; function Parser() { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; return new Parser(); })();exports["default"] = handlebars; module.exports = exports["default"]; /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _visitor = __webpack_require__(49); var _visitor2 = _interopRequireDefault(_visitor); function WhitespaceControl() { var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; this.options = options; } WhitespaceControl.prototype = new _visitor2['default'](); WhitespaceControl.prototype.Program = function (program) { var doStandalone = !this.options.ignoreStandalone; var isRoot = !this.isRootSeen; this.isRootSeen = true; var body = program.body; for (var i = 0, l = body.length; i < l; i++) { var current = body[i], strip = this.accept(current); if (!strip) { continue; } var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), _isNextWhitespace = isNextWhitespace(body, i, isRoot), openStandalone = strip.openStandalone && _isPrevWhitespace, closeStandalone = strip.closeStandalone && _isNextWhitespace, inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; if (strip.close) { omitRight(body, i, true); } if (strip.open) { omitLeft(body, i, true); } if (doStandalone && inlineStandalone) { omitRight(body, i); if (omitLeft(body, i)) { // If we are on a standalone node, save the indent info for partials if (current.type === 'PartialStatement') { // Pull out the whitespace from the final line current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; } } } if (doStandalone && openStandalone) { omitRight((current.program || current.inverse).body); // Strip out the previous content node if it's whitespace only omitLeft(body, i); } if (doStandalone && closeStandalone) { // Always strip the next node omitRight(body, i); omitLeft((current.inverse || current.program).body); } } return program; }; WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) { this.accept(block.program); this.accept(block.inverse); // Find the inverse program that is involed with whitespace stripping. var program = block.program || block.inverse, inverse = block.program && block.inverse, firstInverse = inverse, lastInverse = inverse; if (inverse && inverse.chained) { firstInverse = inverse.body[0].program; // Walk the inverse chain to find the last inverse that is actually in the chain. while (lastInverse.chained) { lastInverse = lastInverse.body[lastInverse.body.length - 1].program; } } var strip = { open: block.openStrip.open, close: block.closeStrip.close, // Determine the standalone candiacy. Basically flag our content as being possibly standalone // so our parent can determine if we actually are standalone openStandalone: isNextWhitespace(program.body), closeStandalone: isPrevWhitespace((firstInverse || program).body) }; if (block.openStrip.close) { omitRight(program.body, null, true); } if (inverse) { var inverseStrip = block.inverseStrip; if (inverseStrip.open) { omitLeft(program.body, null, true); } if (inverseStrip.close) { omitRight(firstInverse.body, null, true); } if (block.closeStrip.open) { omitLeft(lastInverse.body, null, true); } // Find standalone else statments if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { omitLeft(program.body); omitRight(firstInverse.body); } } else if (block.closeStrip.open) { omitLeft(program.body, null, true); } return strip; }; WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) { return mustache.strip; }; WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { /* istanbul ignore next */ var strip = node.strip || {}; return { inlineStandalone: true, open: strip.open, close: strip.close }; }; function isPrevWhitespace(body, i, isRoot) { if (i === undefined) { i = body.length; } // Nodes that end with newlines are considered whitespace (but are special // cased for strip operations) var prev = body[i - 1], sibling = body[i - 2]; if (!prev) { return isRoot; } if (prev.type === 'ContentStatement') { return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); } } function isNextWhitespace(body, i, isRoot) { if (i === undefined) { i = -1; } var next = body[i + 1], sibling = body[i + 2]; if (!next) { return isRoot; } if (next.type === 'ContentStatement') { return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); } } // Marks the node to the right of the position as omitted. // I.e. {{foo}}' ' will mark the ' ' node as omitted. // // If i is undefined, then the first child will be marked as such. // // If mulitple is truthy then all whitespace will be stripped out until non-whitespace // content is met. function omitRight(body, i, multiple) { var current = body[i == null ? 0 : i + 1]; if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { return; } var original = current.value; current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); current.rightStripped = current.value !== original; } // Marks the node to the left of the position as omitted. // I.e. ' '{{foo}} will mark the ' ' node as omitted. // // If i is undefined then the last child will be marked as such. // // If mulitple is truthy then all whitespace will be stripped out until non-whitespace // content is met. function omitLeft(body, i, multiple) { var current = body[i == null ? body.length - 1 : i - 1]; if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { return; } // We omit the last node if it's whitespace only and not preceded by a non-content node. var original = current.value; current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); current.leftStripped = current.value !== original; return current.leftStripped; } exports['default'] = WhitespaceControl; module.exports = exports['default']; /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); function Visitor() { this.parents = []; } Visitor.prototype = { constructor: Visitor, mutating: false, // Visits a given value. If mutating, will replace the value if necessary. acceptKey: function acceptKey(node, name) { var value = this.accept(node[name]); if (this.mutating) { // Hacky sanity check: This may have a few false positives for type for the helper // methods but will generally do the right thing without a lot of overhead. if (value && !Visitor.prototype[value.type]) { throw new _exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); } node[name] = value; } }, // Performs an accept operation with added sanity check to ensure // required keys are not removed. acceptRequired: function acceptRequired(node, name) { this.acceptKey(node, name); if (!node[name]) { throw new _exception2['default'](node.type + ' requires ' + name); } }, // Traverses a given array. If mutating, empty respnses will be removed // for child elements. acceptArray: function acceptArray(array) { for (var i = 0, l = array.length; i < l; i++) { this.acceptKey(array, i); if (!array[i]) { array.splice(i, 1); i--; l--; } } }, accept: function accept(object) { if (!object) { return; } /* istanbul ignore next: Sanity code */ if (!this[object.type]) { throw new _exception2['default']('Unknown type: ' + object.type, object); } if (this.current) { this.parents.unshift(this.current); } this.current = object; var ret = this[object.type](object); this.current = this.parents.shift(); if (!this.mutating || ret) { return ret; } else if (ret !== false) { return object; } }, Program: function Program(program) { this.acceptArray(program.body); }, MustacheStatement: visitSubExpression, Decorator: visitSubExpression, BlockStatement: visitBlock, DecoratorBlock: visitBlock, PartialStatement: visitPartial, PartialBlockStatement: function PartialBlockStatement(partial) { visitPartial.call(this, partial); this.acceptKey(partial, 'program'); }, ContentStatement: function ContentStatement() /* content */{}, CommentStatement: function CommentStatement() /* comment */{}, SubExpression: visitSubExpression, PathExpression: function PathExpression() /* path */{}, StringLiteral: function StringLiteral() /* string */{}, NumberLiteral: function NumberLiteral() /* number */{}, BooleanLiteral: function BooleanLiteral() /* bool */{}, UndefinedLiteral: function UndefinedLiteral() /* literal */{}, NullLiteral: function NullLiteral() /* literal */{}, Hash: function Hash(hash) { this.acceptArray(hash.pairs); }, HashPair: function HashPair(pair) { this.acceptRequired(pair, 'value'); } }; function visitSubExpression(mustache) { this.acceptRequired(mustache, 'path'); this.acceptArray(mustache.params); this.acceptKey(mustache, 'hash'); } function visitBlock(block) { visitSubExpression.call(this, block); this.acceptKey(block, 'program'); this.acceptKey(block, 'inverse'); } function visitPartial(partial) { this.acceptRequired(partial, 'name'); this.acceptArray(partial.params); this.acceptKey(partial, 'hash'); } exports['default'] = Visitor; module.exports = exports['default']; /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; exports.SourceLocation = SourceLocation; exports.id = id; exports.stripFlags = stripFlags; exports.stripComment = stripComment; exports.preparePath = preparePath; exports.prepareMustache = prepareMustache; exports.prepareRawBlock = prepareRawBlock; exports.prepareBlock = prepareBlock; exports.prepareProgram = prepareProgram; exports.preparePartialBlock = preparePartialBlock; var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); function validateClose(open, close) { close = close.path ? close.path.original : close; if (open.path.original !== close) { var errorNode = { loc: open.path.loc }; throw new _exception2['default'](open.path.original + " doesn't match " + close, errorNode); } } function SourceLocation(source, locInfo) { this.source = source; this.start = { line: locInfo.first_line, column: locInfo.first_column }; this.end = { line: locInfo.last_line, column: locInfo.last_column }; } function id(token) { if (/^\[.*\]$/.test(token)) { return token.substring(1, token.length - 1); } else { return token; } } function stripFlags(open, close) { return { open: open.charAt(2) === '~', close: close.charAt(close.length - 3) === '~' }; } function stripComment(comment) { return comment.replace(/^\{\{~?!-?-?/, '').replace(/-?-?~?\}\}$/, ''); } function preparePath(data, parts, loc) { loc = this.locInfo(loc); var original = data ? '@' : '', dig = [], depth = 0; for (var i = 0, l = parts.length; i < l; i++) { var part = parts[i].part, // If we have [] syntax then we do not treat path references as operators, // i.e. foo.[this] resolves to approximately context.foo['this'] isLiteral = parts[i].original !== part; original += (parts[i].separator || '') + part; if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { if (dig.length > 0) { throw new _exception2['default']('Invalid path: ' + original, { loc: loc }); } else if (part === '..') { depth++; } } else { dig.push(part); } } return { type: 'PathExpression', data: data, depth: depth, parts: dig, original: original, loc: loc }; } function prepareMustache(path, params, hash, open, strip, locInfo) { // Must use charAt to support IE pre-10 var escapeFlag = open.charAt(3) || open.charAt(2), escaped = escapeFlag !== '{' && escapeFlag !== '&'; var decorator = /\*/.test(open); return { type: decorator ? 'Decorator' : 'MustacheStatement', path: path, params: params, hash: hash, escaped: escaped, strip: strip, loc: this.locInfo(locInfo) }; } function prepareRawBlock(openRawBlock, contents, close, locInfo) { validateClose(openRawBlock, close); locInfo = this.locInfo(locInfo); var program = { type: 'Program', body: contents, strip: {}, loc: locInfo }; return { type: 'BlockStatement', path: openRawBlock.path, params: openRawBlock.params, hash: openRawBlock.hash, program: program, openStrip: {}, inverseStrip: {}, closeStrip: {}, loc: locInfo }; } function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { if (close && close.path) { validateClose(openBlock, close); } var decorator = /\*/.test(openBlock.open); program.blockParams = openBlock.blockParams; var inverse = undefined, inverseStrip = undefined; if (inverseAndProgram) { if (decorator) { throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram); } if (inverseAndProgram.chain) { inverseAndProgram.program.body[0].closeStrip = close.strip; } inverseStrip = inverseAndProgram.strip; inverse = inverseAndProgram.program; } if (inverted) { inverted = inverse; inverse = program; program = inverted; } return { type: decorator ? 'DecoratorBlock' : 'BlockStatement', path: openBlock.path, params: openBlock.params, hash: openBlock.hash, program: program, inverse: inverse, openStrip: openBlock.strip, inverseStrip: inverseStrip, closeStrip: close && close.strip, loc: this.locInfo(locInfo) }; } function prepareProgram(statements, loc) { if (!loc && statements.length) { var firstLoc = statements[0].loc, lastLoc = statements[statements.length - 1].loc; /* istanbul ignore else */ if (firstLoc && lastLoc) { loc = { source: firstLoc.source, start: { line: firstLoc.start.line, column: firstLoc.start.column }, end: { line: lastLoc.end.line, column: lastLoc.end.column } }; } } return { type: 'Program', body: statements, strip: {}, loc: loc }; } function preparePartialBlock(open, program, close, locInfo) { validateClose(open, close); return { type: 'PartialBlockStatement', name: open.path, params: open.params, hash: open.hash, program: program, openStrip: open.strip, closeStrip: close && close.strip, loc: this.locInfo(locInfo) }; } /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { /* eslint-disable new-cap */ 'use strict'; var _Object$create = __webpack_require__(34)['default']; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; exports.Compiler = Compiler; exports.precompile = precompile; exports.compile = compile; var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); var _utils = __webpack_require__(5); var _ast = __webpack_require__(45); var _ast2 = _interopRequireDefault(_ast); var slice = [].slice; function Compiler() {} // the foundHelper register will disambiguate helper lookup from finding a // function in a context. This is necessary for mustache compatibility, which // requires that context functions in blocks are evaluated by blockHelperMissing, // and then proceed as if the resulting value was provided to blockHelperMissing. Compiler.prototype = { compiler: Compiler, equals: function equals(other) { var len = this.opcodes.length; if (other.opcodes.length !== len) { return false; } for (var i = 0; i < len; i++) { var opcode = this.opcodes[i], otherOpcode = other.opcodes[i]; if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { return false; } } // We know that length is the same between the two arrays because they are directly tied // to the opcode behavior above. len = this.children.length; for (var i = 0; i < len; i++) { if (!this.children[i].equals(other.children[i])) { return false; } } return true; }, guid: 0, compile: function compile(program, options) { this.sourceNode = []; this.opcodes = []; this.children = []; this.options = options; this.stringParams = options.stringParams; this.trackIds = options.trackIds; options.blockParams = options.blockParams || []; options.knownHelpers = _utils.extend(_Object$create(null), { helperMissing: true, blockHelperMissing: true, each: true, 'if': true, unless: true, 'with': true, log: true, lookup: true }, options.knownHelpers); return this.accept(program); }, compileProgram: function compileProgram(program) { var childCompiler = new this.compiler(), // eslint-disable-line new-cap result = childCompiler.compile(program, this.options), guid = this.guid++; this.usePartial = this.usePartial || result.usePartial; this.children[guid] = result; this.useDepths = this.useDepths || result.useDepths; return guid; }, accept: function accept(node) { /* istanbul ignore next: Sanity code */ if (!this[node.type]) { throw new _exception2['default']('Unknown type: ' + node.type, node); } this.sourceNode.unshift(node); var ret = this[node.type](node); this.sourceNode.shift(); return ret; }, Program: function Program(program) { this.options.blockParams.unshift(program.blockParams); var body = program.body, bodyLength = body.length; for (var i = 0; i < bodyLength; i++) { this.accept(body[i]); } this.options.blockParams.shift(); this.isSimple = bodyLength === 1; this.blockParams = program.blockParams ? program.blockParams.length : 0; return this; }, BlockStatement: function BlockStatement(block) { transformLiteralToPath(block); var program = block.program, inverse = block.inverse; program = program && this.compileProgram(program); inverse = inverse && this.compileProgram(inverse); var type = this.classifySexpr(block); if (type === 'helper') { this.helperSexpr(block, program, inverse); } else if (type === 'simple') { this.simpleSexpr(block); // now that the simple mustache is resolved, we need to // evaluate it by executing `blockHelperMissing` this.opcode('pushProgram', program); this.opcode('pushProgram', inverse); this.opcode('emptyHash'); this.opcode('blockValue', block.path.original); } else { this.ambiguousSexpr(block, program, inverse); // now that the simple mustache is resolved, we need to // evaluate it by executing `blockHelperMissing` this.opcode('pushProgram', program); this.opcode('pushProgram', inverse); this.opcode('emptyHash'); this.opcode('ambiguousBlockValue'); } this.opcode('append'); }, DecoratorBlock: function DecoratorBlock(decorator) { var program = decorator.program && this.compileProgram(decorator.program); var params = this.setupFullMustacheParams(decorator, program, undefined), path = decorator.path; this.useDecorators = true; this.opcode('registerDecorator', params.length, path.original); }, PartialStatement: function PartialStatement(partial) { this.usePartial = true; var program = partial.program; if (program) { program = this.compileProgram(partial.program); } var params = partial.params; if (params.length > 1) { throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); } else if (!params.length) { if (this.options.explicitPartialContext) { this.opcode('pushLiteral', 'undefined'); } else { params.push({ type: 'PathExpression', parts: [], depth: 0 }); } } var partialName = partial.name.original, isDynamic = partial.name.type === 'SubExpression'; if (isDynamic) { this.accept(partial.name); } this.setupFullMustacheParams(partial, program, undefined, true); var indent = partial.indent || ''; if (this.options.preventIndent && indent) { this.opcode('appendContent', indent); indent = ''; } this.opcode('invokePartial', isDynamic, partialName, indent); this.opcode('append'); }, PartialBlockStatement: function PartialBlockStatement(partialBlock) { this.PartialStatement(partialBlock); }, MustacheStatement: function MustacheStatement(mustache) { this.SubExpression(mustache); if (mustache.escaped && !this.options.noEscape) { this.opcode('appendEscaped'); } else { this.opcode('append'); } }, Decorator: function Decorator(decorator) { this.DecoratorBlock(decorator); }, ContentStatement: function ContentStatement(content) { if (content.value) { this.opcode('appendContent', content.value); } }, CommentStatement: function CommentStatement() {}, SubExpression: function SubExpression(sexpr) { transformLiteralToPath(sexpr); var type = this.classifySexpr(sexpr); if (type === 'simple') { this.simpleSexpr(sexpr); } else if (type === 'helper') { this.helperSexpr(sexpr); } else { this.ambiguousSexpr(sexpr); } }, ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { var path = sexpr.path, name = path.parts[0], isBlock = program != null || inverse != null; this.opcode('getContext', path.depth); this.opcode('pushProgram', program); this.opcode('pushProgram', inverse); path.strict = true; this.accept(path); this.opcode('invokeAmbiguous', name, isBlock); }, simpleSexpr: function simpleSexpr(sexpr) { var path = sexpr.path; path.strict = true; this.accept(path); this.opcode('resolvePossibleLambda'); }, helperSexpr: function helperSexpr(sexpr, program, inverse) { var params = this.setupFullMustacheParams(sexpr, program, inverse), path = sexpr.path, name = path.parts[0]; if (this.options.knownHelpers[name]) { this.opcode('invokeKnownHelper', params.length, name); } else if (this.options.knownHelpersOnly) { throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); } else { path.strict = true; path.falsy = true; this.accept(path); this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path)); } }, PathExpression: function PathExpression(path) { this.addDepth(path.depth); this.opcode('getContext', path.depth); var name = path.parts[0], scoped = _ast2['default'].helpers.scopedId(path), blockParamId = !path.depth && !scoped && this.blockParamIndex(name); if (blockParamId) { this.opcode('lookupBlockParam', blockParamId, path.parts); } else if (!name) { // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` this.opcode('pushContext'); } else if (path.data) { this.options.data = true; this.opcode('lookupData', path.depth, path.parts, path.strict); } else { this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped); } }, StringLiteral: function StringLiteral(string) { this.opcode('pushString', string.value); }, NumberLiteral: function NumberLiteral(number) { this.opcode('pushLiteral', number.value); }, BooleanLiteral: function BooleanLiteral(bool) { this.opcode('pushLiteral', bool.value); }, UndefinedLiteral: function UndefinedLiteral() { this.opcode('pushLiteral', 'undefined'); }, NullLiteral: function NullLiteral() { this.opcode('pushLiteral', 'null'); }, Hash: function Hash(hash) { var pairs = hash.pairs, i = 0, l = pairs.length; this.opcode('pushHash'); for (; i < l; i++) { this.pushParam(pairs[i].value); } while (i--) { this.opcode('assignToHash', pairs[i].key); } this.opcode('popHash'); }, // HELPERS opcode: function opcode(name) { this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); }, addDepth: function addDepth(depth) { if (!depth) { return; } this.useDepths = true; }, classifySexpr: function classifySexpr(sexpr) { var isSimple = _ast2['default'].helpers.simpleId(sexpr.path); var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); // a mustache is an eligible helper if: // * its id is simple (a single part, not `this` or `..`) var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr); // if a mustache is an eligible helper but not a definite // helper, it is ambiguous, and will be resolved in a later // pass or at runtime. var isEligible = !isBlockParam && (isHelper || isSimple); // if ambiguous, we can possibly resolve the ambiguity now // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. if (isEligible && !isHelper) { var _name = sexpr.path.parts[0], options = this.options; if (options.knownHelpers[_name]) { isHelper = true; } else if (options.knownHelpersOnly) { isEligible = false; } } if (isHelper) { return 'helper'; } else if (isEligible) { return 'ambiguous'; } else { return 'simple'; } }, pushParams: function pushParams(params) { for (var i = 0, l = params.length; i < l; i++) { this.pushParam(params[i]); } }, pushParam: function pushParam(val) { var value = val.value != null ? val.value : val.original || ''; if (this.stringParams) { if (value.replace) { value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); } if (val.depth) { this.addDepth(val.depth); } this.opcode('getContext', val.depth || 0); this.opcode('pushStringParam', value, val.type); if (val.type === 'SubExpression') { // SubExpressions get evaluated and passed in // in string params mode. this.accept(val); } } else { if (this.trackIds) { var blockParamIndex = undefined; if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) { blockParamIndex = this.blockParamIndex(val.parts[0]); } if (blockParamIndex) { var blockParamChild = val.parts.slice(1).join('.'); this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); } else { value = val.original || value; if (value.replace) { value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, ''); } this.opcode('pushId', val.type, value); } } this.accept(val); } }, setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { var params = sexpr.params; this.pushParams(params); this.opcode('pushProgram', program); this.opcode('pushProgram', inverse); if (sexpr.hash) { this.accept(sexpr.hash); } else { this.opcode('emptyHash', omitEmpty); } return params; }, blockParamIndex: function blockParamIndex(name) { for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { var blockParams = this.options.blockParams[depth], param = blockParams && _utils.indexOf(blockParams, name); if (blockParams && param >= 0) { return [depth, param]; } } } }; function precompile(input, options, env) { if (input == null || typeof input !== 'string' && input.type !== 'Program') { throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); } options = options || {}; if (!('data' in options)) { options.data = true; } if (options.compat) { options.useDepths = true; } var ast = env.parse(input, options), environment = new env.Compiler().compile(ast, options); return new env.JavaScriptCompiler().compile(environment, options); } function compile(input, options, env) { if (options === undefined) options = {}; if (input == null || typeof input !== 'string' && input.type !== 'Program') { throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); } options = _utils.extend({}, options); if (!('data' in options)) { options.data = true; } if (options.compat) { options.useDepths = true; } var compiled = undefined; function compileInput() { var ast = env.parse(input, options), environment = new env.Compiler().compile(ast, options), templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); return env.template(templateSpec); } // Template is only compiled on first use and cached after that point. function ret(context, execOptions) { if (!compiled) { compiled = compileInput(); } return compiled.call(this, context, execOptions); } ret._setup = function (setupOptions) { if (!compiled) { compiled = compileInput(); } return compiled._setup(setupOptions); }; ret._child = function (i, data, blockParams, depths) { if (!compiled) { compiled = compileInput(); } return compiled._child(i, data, blockParams, depths); }; return ret; } function argEquals(a, b) { if (a === b) { return true; } if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { for (var i = 0; i < a.length; i++) { if (!argEquals(a[i], b[i])) { return false; } } return true; } } function transformLiteralToPath(sexpr) { if (!sexpr.path.parts) { var literal = sexpr.path; // Casting to string here to make false and 0 literal values play nicely with the rest // of the system. sexpr.path = { type: 'PathExpression', data: false, depth: 0, parts: [literal.original + ''], original: literal.original + '', loc: literal.loc }; } } /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _Object$keys = __webpack_require__(13)['default']; var _interopRequireDefault = __webpack_require__(1)['default']; exports.__esModule = true; var _base = __webpack_require__(4); var _exception = __webpack_require__(6); var _exception2 = _interopRequireDefault(_exception); var _utils = __webpack_require__(5); var _codeGen = __webpack_require__(53); var _codeGen2 = _interopRequireDefault(_codeGen); function Literal(value) { this.value = value; } function JavaScriptCompiler() {} JavaScriptCompiler.prototype = { // PUBLIC API: You can override these methods in a subclass to provide // alternative compiled forms for name lookup and buffering semantics nameLookup: function nameLookup(parent, name /*, type */) { return this.internalNameLookup(parent, name); }, depthedLookup: function depthedLookup(name) { return [this.aliasable('container.lookup'), '(depths, ', JSON.stringify(name), ')']; }, compilerInfo: function compilerInfo() { var revision = _base.COMPILER_REVISION, versions = _base.REVISION_CHANGES[revision]; return [revision, versions]; }, appendToBuffer: function appendToBuffer(source, location, explicit) { // Force a source as this simplifies the merge logic. if (!_utils.isArray(source)) { source = [source]; } source = this.source.wrap(source, location); if (this.environment.isSimple) { return ['return ', source, ';']; } else if (explicit) { // This is a case where the buffer operation occurs as a child of another // construct, generally braces. We have to explicitly output these buffer // operations to ensure that the emitted code goes in the correct location. return ['buffer += ', source, ';']; } else { source.appendToBuffer = true; return source; } }, initializeBuffer: function initializeBuffer() { return this.quotedString(''); }, // END PUBLIC API internalNameLookup: function internalNameLookup(parent, name) { this.lookupPropertyFunctionIsUsed = true; return ['lookupProperty(', parent, ',', JSON.stringify(name), ')']; }, lookupPropertyFunctionIsUsed: false, compile: function compile(environment, options, context, asObject) { this.environment = environment; this.options = options; this.stringParams = this.options.stringParams; this.trackIds = this.options.trackIds; this.precompile = !asObject; this.name = this.environment.name; this.isChild = !!context; this.context = context || { decorators: [], programs: [], environments: [] }; this.preamble(); this.stackSlot = 0; this.stackVars = []; this.aliases = {}; this.registers = { list: [] }; this.hashes = []; this.compileStack = []; this.inlineStack = []; this.blockParams = []; this.compileChildren(environment, options); this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat; this.useBlockParams = this.useBlockParams || environment.useBlockParams; var opcodes = environment.opcodes, opcode = undefined, firstLoc = undefined, i = undefined, l = undefined; for (i = 0, l = opcodes.length; i < l; i++) { opcode = opcodes[i]; this.source.currentLocation = opcode.loc; firstLoc = firstLoc || opcode.loc; this[opcode.opcode].apply(this, opcode.args); } // Flush any trailing content that might be pending. this.source.currentLocation = firstLoc; this.pushSource(''); /* istanbul ignore next */ if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { throw new _exception2['default']('Compile completed with content left on stack'); } if (!this.decorators.isEmpty()) { this.useDecorators = true; this.decorators.prepend(['var decorators = container.decorators, ', this.lookupPropertyFunctionVarDeclaration(), ';\n']); this.decorators.push('return fn;'); if (asObject) { this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]); } else { this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\n'); this.decorators.push('}\n'); this.decorators = this.decorators.merge(); } } else { this.decorators = undefined; } var fn = this.createFunctionContext(asObject); if (!this.isChild) { var ret = { compiler: this.compilerInfo(), main: fn }; if (this.decorators) { ret.main_d = this.decorators; // eslint-disable-line camelcase ret.useDecorators = true; } var _context = this.context; var programs = _context.programs; var decorators = _context.decorators; for (i = 0, l = programs.length; i < l; i++) { if (programs[i]) { ret[i] = programs[i]; if (decorators[i]) { ret[i + '_d'] = decorators[i]; ret.useDecorators = true; } } } if (this.environment.usePartial) { ret.usePartial = true; } if (this.options.data) { ret.useData = true; } if (this.useDepths) { ret.useDepths = true; } if (this.useBlockParams) { ret.useBlockParams = true; } if (this.options.compat) { ret.compat = true; } if (!asObject) { ret.compiler = JSON.stringify(ret.compiler); this.source.currentLocation = { start: { line: 1, column: 0 } }; ret = this.objectLiteral(ret); if (options.srcName) { ret = ret.toStringWithSourceMap({ file: options.destName }); ret.map = ret.map && ret.map.toString(); } else { ret = ret.toString(); } } else { ret.compilerOptions = this.options; } return ret; } else { return fn; } }, preamble: function preamble() { // track the last context pushed into place to allow skipping the // getContext opcode when it would be a noop this.lastContext = 0; this.source = new _codeGen2['default'](this.options.srcName); this.decorators = new _codeGen2['default'](this.options.srcName); }, createFunctionContext: function createFunctionContext(asObject) { // istanbul ignore next var _this = this; var varDeclarations = ''; var locals = this.stackVars.concat(this.registers.list); if (locals.length > 0) { varDeclarations += ', ' + locals.join(', '); } // Generate minimizer alias mappings // // When using true SourceNodes, this will update all references to the given alias // as the source nodes are reused in situ. For the non-source node compilation mode, // aliases will not be used, but this case is already being run on the client and // we aren't concern about minimizing the template size. var aliasCount = 0; _Object$keys(this.aliases).forEach(function (alias) { var node = _this.aliases[alias]; if (node.children && node.referenceCount > 1) { varDeclarations += ', alias' + ++aliasCount + '=' + alias; node.children[0] = 'alias' + aliasCount; } }); if (this.lookupPropertyFunctionIsUsed) { varDeclarations += ', ' + this.lookupPropertyFunctionVarDeclaration(); } var params = ['container', 'depth0', 'helpers', 'partials', 'data']; if (this.useBlockParams || this.useDepths) { params.push('blockParams'); } if (this.useDepths) { params.push('depths'); } // Perform a second pass over the output to merge content when possible var source = this.mergeSource(varDeclarations); if (asObject) { params.push(source); return Function.apply(this, params); } else { return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); } }, mergeSource: function mergeSource(varDeclarations) { var isSimple = this.environment.isSimple, appendOnly = !this.forceBuffer, appendFirst = undefined, sourceSeen = undefined, bufferStart = undefined, bufferEnd = undefined; this.source.each(function (line) { if (line.appendToBuffer) { if (bufferStart) { line.prepend(' + '); } else { bufferStart = line; } bufferEnd = line; } else { if (bufferStart) { if (!sourceSeen) { appendFirst = true; } else { bufferStart.prepend('buffer += '); } bufferEnd.add(';'); bufferStart = bufferEnd = undefined; } sourceSeen = true; if (!isSimple) { appendOnly = false; } } }); if (appendOnly) { if (bufferStart) { bufferStart.prepend('return '); bufferEnd.add(';'); } else if (!sourceSeen) { this.source.push('return "";'); } } else { varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); if (bufferStart) { bufferStart.prepend('return buffer + '); bufferEnd.add(';'); } else { this.source.push('return buffer;'); } } if (varDeclarations) { this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); } return this.source.merge(); }, lookupPropertyFunctionVarDeclaration: function lookupPropertyFunctionVarDeclaration() { return '\n lookupProperty = container.lookupProperty || function(parent, propertyName) {\n if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n return parent[propertyName];\n }\n return undefined\n }\n '.trim(); }, // [blockValue] // // On stack, before: hash, inverse, program, value // On stack, after: return value of blockHelperMissing // // The purpose of this opcode is to take a block of the form // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and // replace it on the stack with the result of properly // invoking blockHelperMissing. blockValue: function blockValue(name) { var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'), params = [this.contextName(0)]; this.setupHelperArgs(name, 0, params); var blockName = this.popStack(); params.splice(1, 0, blockName); this.push(this.source.functionCall(blockHelperMissing, 'call', params)); }, // [ambiguousBlockValue] // // On stack, before: hash, inverse, program, value // Compiler value, before: lastHelper=value of last found helper, if any // On stack, after, if no lastHelper: same as [blockValue] // On stack, after, if lastHelper: value ambiguousBlockValue: function ambiguousBlockValue() { // We're being a bit cheeky and reusing the options value from the prior exec var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'), params = [this.contextName(0)]; this.setupHelperArgs('', 0, params, true); this.flushInline(); var current = this.topStack(); params.splice(1, 0, current); this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); }, // [appendContent] // // On stack, before: ... // On stack, after: ... // // Appends the string value of `content` to the current buffer appendContent: function appendContent(content) { if (this.pendingContent) { content = this.pendingContent + content; } else { this.pendingLocation = this.source.currentLocation; } this.pendingContent = content; }, // [append] // // On stack, before: value, ... // On stack, after: ... // // Coerces `value` to a String and appends it to the current buffer. // // If `value` is truthy, or 0, it is coerced into a string and appended // Otherwise, the empty string is appended append: function append() { if (this.isInline()) { this.replaceStack(function (current) { return [' != null ? ', current, ' : ""']; }); this.pushSource(this.appendToBuffer(this.popStack())); } else { var local = this.popStack(); this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); if (this.environment.isSimple) { this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']); } } }, // [appendEscaped] // // On stack, before: value, ... // On stack, after: ... // // Escape `value` and append it to the buffer appendEscaped: function appendEscaped() { this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')'])); }, // [getContext] // // On stack, before: ... // On stack, after: ... // Compiler value, after: lastContext=depth // // Set the value of the `lastContext` compiler value to the depth getContext: function getContext(depth) { this.lastContext = depth; }, // [pushContext] // // On stack, before: ... // On stack, after: currentContext, ... // // Pushes the value of the current context onto the stack. pushContext: function pushContext() { this.pushStackLiteral(this.contextName(this.lastContext)); }, // [lookupOnContext] // // On stack, before: ... // On stack, after: currentContext[name], ... // // Looks up the value of `name` on the current context and pushes // it onto the stack. lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) { var i = 0; if (!scoped && this.options.compat && !this.lastContext) { // The depthed query is expected to handle the undefined logic for the root level that // is implemented below, so we evaluate that directly in compat mode this.push(this.depthedLookup(parts[i++])); } else { this.pushContext(); } this.resolvePath('context', parts, i, falsy, strict); }, // [lookupBlockParam] // // On stack, before: ... // On stack, after: blockParam[name], ... // // Looks up the value of `parts` on the given block param and pushes // it onto the stack. lookupBlockParam: function lookupBlockParam(blockParamId, parts) { this.useBlockParams = true; this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); this.resolvePath('context', parts, 1); }, // [lookupData] // // On stack, before: ... // On stack, after: data, ... // // Push the data lookup operator lookupData: function lookupData(depth, parts, strict) { if (!depth) { this.pushStackLiteral('data'); } else { this.pushStackLiteral('container.data(data, ' + depth + ')'); } this.resolvePath('data', parts, 0, true, strict); }, resolvePath: function resolvePath(type, parts, i, falsy, strict) { // istanbul ignore next var _this2 = this; if (this.options.strict || this.options.assumeObjects) { this.push(strictLookup(this.options.strict && strict, this, parts, type)); return; } var len = parts.length; for (; i < len; i++) { /* eslint-disable no-loop-func */ this.replaceStack(function (current) { var lookup = _this2.nameLookup(current, parts[i], type); // We want to ensure that zero and false are handled properly if the context (falsy flag) // needs to have the special handling for these values. if (!falsy) { return [' != null ? ', lookup, ' : ', current]; } else { // Otherwise we can use generic falsy handling return [' && ', lookup]; } }); /* eslint-enable no-loop-func */ } }, // [resolvePossibleLambda] // // On stack, before: value, ... // On stack, after: resolved value, ... // // If the `value` is a lambda, replace it on the stack by // the return value of the lambda resolvePossibleLambda: function resolvePossibleLambda() { this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); }, // [pushStringParam] // // On stack, before: ... // On stack, after: string, currentContext, ... // // This opcode is designed for use in string mode, which // provides the string value of a parameter along with its // depth rather than resolving it immediately. pushStringParam: function pushStringParam(string, type) { this.pushContext(); this.pushString(type); // If it's a subexpression, the string result // will be pushed after this opcode. if (type !== 'SubExpression') { if (typeof string === 'string') { this.pushString(string); } else { this.pushStackLiteral(string); } } }, emptyHash: function emptyHash(omitEmpty) { if (this.trackIds) { this.push('{}'); // hashIds } if (this.stringParams) { this.push('{}'); // hashContexts this.push('{}'); // hashTypes } this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); }, pushHash: function pushHash() { if (this.hash) { this.hashes.push(this.hash); } this.hash = { values: {}, types: [], contexts: [], ids: [] }; }, popHash: function popHash() { var hash = this.hash; this.hash = this.hashes.pop(); if (this.trackIds) { this.push(this.objectLiteral(hash.ids)); } if (this.stringParams) { this.push(this.objectLiteral(hash.contexts)); this.push(this.objectLiteral(hash.types)); } this.push(this.objectLiteral(hash.values)); }, // [pushString] // // On stack, before: ... // On stack, after: quotedString(string), ... // // Push a quoted version of `string` onto the stack pushString: function pushString(string) { this.pushStackLiteral(this.quotedString(string)); }, // [pushLiteral] // // On stack, before: ... // On stack, after: value, ... // // Pushes a value onto the stack. This operation prevents // the compiler from creating a temporary variable to hold // it. pushLiteral: function pushLiteral(value) { this.pushStackLiteral(value); }, // [pushProgram] // // On stack, before: ... // On stack, after: program(guid), ... // // Push a program expression onto the stack. This takes // a compile-time guid and converts it into a runtime-accessible // expression. pushProgram: function pushProgram(guid) { if (guid != null) { this.pushStackLiteral(this.programExpression(guid)); } else { this.pushStackLiteral(null); } }, // [registerDecorator] // // On stack, before: hash, program, params..., ... // On stack, after: ... // // Pops off the decorator's parameters, invokes the decorator, // and inserts the decorator into the decorators list. registerDecorator: function registerDecorator(paramSize, name) { var foundDecorator = this.nameLookup('decorators', name, 'decorator'), options = this.setupHelperArgs(name, paramSize); this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']); }, // [invokeHelper] // // On stack, before: hash, inverse, program, params..., ... // On stack, after: result of helper invocation // // Pops off the helper's parameters, invokes the helper, // and pushes the helper's return value onto the stack. // // If the helper is not found, `helperMissing` is called. invokeHelper: function invokeHelper(paramSize, name, isSimple) { var nonHelper = this.popStack(), helper = this.setupHelper(paramSize, name); var possibleFunctionCalls = []; if (isSimple) { // direct call to helper possibleFunctionCalls.push(helper.name); } // call a function from the input object possibleFunctionCalls.push(nonHelper); if (!this.options.strict) { possibleFunctionCalls.push(this.aliasable('container.hooks.helperMissing')); } var functionLookupCode = ['(', this.itemsSeparatedBy(possibleFunctionCalls, '||'), ')']; var functionCall = this.source.functionCall(functionLookupCode, 'call', helper.callParams); this.push(functionCall); }, itemsSeparatedBy: function itemsSeparatedBy(items, separator) { var result = []; result.push(items[0]); for (var i = 1; i < items.length; i++) { result.push(separator, items[i]); } return result; }, // [invokeKnownHelper] // // On stack, before: hash, inverse, program, params..., ... // On stack, after: result of helper invocation // // This operation is used when the helper is known to exist, // so a `helperMissing` fallback is not required. invokeKnownHelper: function invokeKnownHelper(paramSize, name) { var helper = this.setupHelper(paramSize, name); this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); }, // [invokeAmbiguous] // // On stack, before: hash, inverse, program, params..., ... // On stack, after: result of disambiguation // // This operation is used when an expression like `{{foo}}` // is provided, but we don't know at compile-time whether it // is a helper or a path. // // This operation emits more code than the other options, // and can be avoided by passing the `knownHelpers` and // `knownHelpersOnly` flags at compile-time. invokeAmbiguous: function invokeAmbiguous(name, helperCall) { this.useRegister('helper'); var nonHelper = this.popStack(); this.emptyHash(); var helper = this.setupHelper(0, name, helperCall); var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; if (!this.options.strict) { lookup[0] = '(helper = '; lookup.push(' != null ? helper : ', this.aliasable('container.hooks.helperMissing')); } this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); }, // [invokePartial] // // On stack, before: context, ... // On stack after: result of partial invocation // // This operation pops off a context, invokes a partial with that context, // and pushes the result of the invocation back. invokePartial: function invokePartial(isDynamic, name, indent) { var params = [], options = this.setupParams(name, 1, params); if (isDynamic) { name = this.popStack(); delete options.name; } if (indent) { options.indent = JSON.stringify(indent); } options.helpers = 'helpers'; options.partials = 'partials'; options.decorators = 'container.decorators'; if (!isDynamic) { params.unshift(this.nameLookup('partials', name, 'partial')); } else { params.unshift(name); } if (this.options.compat) { options.depths = 'depths'; } options = this.objectLiteral(options); params.push(options); this.push(this.source.functionCall('container.invokePartial', '', params)); }, // [assignToHash] // // On stack, before: value, ..., hash, ... // On stack, after: ..., hash, ... // // Pops a value off the stack and assigns it to the current hash assignToHash: function assignToHash(key) { var value = this.popStack(), context = undefined, type = undefined, id = undefined; if (this.trackIds) { id = this.popStack(); } if (this.stringParams) { type = this.popStack(); context = this.popStack(); } var hash = this.hash; if (context) { hash.contexts[key] = context; } if (type) { hash.types[key] = type; } if (id) { hash.ids[key] = id; } hash.values[key] = value; }, pushId: function pushId(type, name, child) { if (type === 'BlockParam') { this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); } else if (type === 'PathExpression') { this.pushString(name); } else if (type === 'SubExpression') { this.pushStackLiteral('true'); } else { this.pushStackLiteral('null'); } }, // HELPERS compiler: JavaScriptCompiler, compileChildren: function compileChildren(environment, options) { var children = environment.children, child = undefined, compiler = undefined; for (var i = 0, l = children.length; i < l; i++) { child = children[i]; compiler = new this.compiler(); // eslint-disable-line new-cap var existing = this.matchExistingProgram(child); if (existing == null) { this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children var index = this.context.programs.length; child.index = index; child.name = 'program' + index; this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); this.context.decorators[index] = compiler.decorators; this.context.environments[index] = child; this.useDepths = this.useDepths || compiler.useDepths; this.useBlockParams = this.useBlockParams || compiler.useBlockParams; child.useDepths = this.useDepths; child.useBlockParams = this.useBlockParams; } else { child.index = existing.index; child.name = 'program' + existing.index; this.useDepths = this.useDepths || existing.useDepths; this.useBlockParams = this.useBlockParams || existing.useBlockParams; } } }, matchExistingProgram: function matchExistingProgram(child) { for (var i = 0, len = this.context.environments.length; i < len; i++) { var environment = this.context.environments[i]; if (environment && environment.equals(child)) { return environment; } } }, programExpression: function programExpression(guid) { var child = this.environment.children[guid], programParams = [child.index, 'data', child.blockParams]; if (this.useBlockParams || this.useDepths) { programParams.push('blockParams'); } if (this.useDepths) { programParams.push('depths'); } return 'container.program(' + programParams.join(', ') + ')'; }, useRegister: function useRegister(name) { if (!this.registers[name]) { this.registers[name] = true; this.registers.list.push(name); } }, push: function push(expr) { if (!(expr instanceof Literal)) { expr = this.source.wrap(expr); } this.inlineStack.push(expr); return expr; }, pushStackLiteral: function pushStackLiteral(item) { this.push(new Literal(item)); }, pushSource: function pushSource(source) { if (this.pendingContent) { this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); this.pendingContent = undefined; } if (source) { this.source.push(source); } }, replaceStack: function replaceStack(callback) { var prefix = ['('], stack = undefined, createdStack = undefined, usedLiteral = undefined; /* istanbul ignore next */ if (!this.isInline()) { throw new _exception2['default']('replaceStack on non-inline'); } // We want to merge the inline statement into the replacement statement via ',' var top = this.popStack(true); if (top instanceof Literal) { // Literals do not need to be inlined stack = [top.value]; prefix = ['(', stack]; usedLiteral = true; } else { // Get or create the current stack name for use by the inline createdStack = true; var _name = this.incrStack(); prefix = ['((', this.push(_name), ' = ', top, ')']; stack = this.topStack(); } var item = callback.call(this, stack); if (!usedLiteral) { this.popStack(); } if (createdStack) { this.stackSlot--; } this.push(prefix.concat(item, ')')); }, incrStack: function incrStack() { this.stackSlot++; if (this.stackSlot > this.stackVars.length) { this.stackVars.push('stack' + this.stackSlot); } return this.topStackName(); }, topStackName: function topStackName() { return 'stack' + this.stackSlot; }, flushInline: function flushInline() { var inlineStack = this.inlineStack; this.inlineStack = []; for (var i = 0, len = inlineStack.length; i < len; i++) { var entry = inlineStack[i]; /* istanbul ignore if */ if (entry instanceof Literal) { this.compileStack.push(entry); } else { var stack = this.incrStack(); this.pushSource([stack, ' = ', entry, ';']); this.compileStack.push(stack); } } }, isInline: function isInline() { return this.inlineStack.length; }, popStack: function popStack(wrapped) { var inline = this.isInline(), item = (inline ? this.inlineStack : this.compileStack).pop(); if (!wrapped && item instanceof Literal) { return item.value; } else { if (!inline) { /* istanbul ignore next */ if (!this.stackSlot) { throw new _exception2['default']('Invalid stack pop'); } this.stackSlot--; } return item; } }, topStack: function topStack() { var stack = this.isInline() ? this.inlineStack : this.compileStack, item = stack[stack.length - 1]; /* istanbul ignore if */ if (item instanceof Literal) { return item.value; } else { return item; } }, contextName: function contextName(context) { if (this.useDepths && context) { return 'depths[' + context + ']'; } else { return 'depth' + context; } }, quotedString: function quotedString(str) { return this.source.quotedString(str); }, objectLiteral: function objectLiteral(obj) { return this.source.objectLiteral(obj); }, aliasable: function aliasable(name) { var ret = this.aliases[name]; if (ret) { ret.referenceCount++; return ret; } ret = this.aliases[name] = this.source.wrap(name); ret.aliasable = true; ret.referenceCount = 1; return ret; }, setupHelper: function setupHelper(paramSize, name, blockHelper) { var params = [], paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); var foundHelper = this.nameLookup('helpers', name, 'helper'), callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : (container.nullContext || {})'); return { params: params, paramsInit: paramsInit, name: foundHelper, callParams: [callContext].concat(params) }; }, setupParams: function setupParams(helper, paramSize, params) { var options = {}, contexts = [], types = [], ids = [], objectArgs = !params, param = undefined; if (objectArgs) { params = []; } options.name = this.quotedString(helper); options.hash = this.popStack(); if (this.trackIds) { options.hashIds = this.popStack(); } if (this.stringParams) { options.hashTypes = this.popStack(); options.hashContexts = this.popStack(); } var inverse = this.popStack(), program = this.popStack(); // Avoid setting fn and inverse if neither are set. This allows // helpers to do a check for `if (options.fn)` if (program || inverse) { options.fn = program || 'container.noop'; options.inverse = inverse || 'container.noop'; } // The parameters go on to the stack in order (making sure that they are evaluated in order) // so we need to pop them off the stack in reverse order var i = paramSize; while (i--) { param = this.popStack(); params[i] = param; if (this.trackIds) { ids[i] = this.popStack(); } if (this.stringParams) { types[i] = this.popStack(); contexts[i] = this.popStack(); } } if (objectArgs) { options.args = this.source.generateArray(params); } if (this.trackIds) { options.ids = this.source.generateArray(ids); } if (this.stringParams) { options.types = this.source.generateArray(types); options.contexts = this.source.generateArray(contexts); } if (this.options.data) { options.data = 'data'; } if (this.useBlockParams) { options.blockParams = 'blockParams'; } return options; }, setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { var options = this.setupParams(helper, paramSize, params); options.loc = JSON.stringify(this.source.currentLocation); options = this.objectLiteral(options); if (useRegister) { this.useRegister('options'); params.push('options'); return ['options=', options]; } else if (params) { params.push(options); return ''; } else { return options; } } }; (function () { var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; for (var i = 0, l = reservedWords.length; i < l; i++) { compilerWords[reservedWords[i]] = true; } })(); /** * @deprecated May be removed in the next major version */ JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); }; function strictLookup(requireTerminal, compiler, parts, type) { var stack = compiler.popStack(), i = 0, len = parts.length; if (requireTerminal) { len--; } for (; i < len; i++) { stack = compiler.nameLookup(stack, parts[i], type); } if (requireTerminal) { return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ', ', JSON.stringify(compiler.source.currentLocation), ' )']; } else { return stack; } } exports['default'] = JavaScriptCompiler; module.exports = exports['default']; /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { /* global define */ 'use strict'; var _Object$keys = __webpack_require__(13)['default']; exports.__esModule = true; var _utils = __webpack_require__(5); var SourceNode = undefined; try { /* istanbul ignore next */ if (false) { // We don't support this in AMD environments. For these environments, we asusme that // they are running on the browser and thus have no need for the source-map library. var SourceMap = require('source-map'); SourceNode = SourceMap.SourceNode; } } catch (err) {} /* NOP */ /* istanbul ignore if: tested but not covered in istanbul due to dist build */ if (!SourceNode) { SourceNode = function (line, column, srcFile, chunks) { this.src = ''; if (chunks) { this.add(chunks); } }; /* istanbul ignore next */ SourceNode.prototype = { add: function add(chunks) { if (_utils.isArray(chunks)) { chunks = chunks.join(''); } this.src += chunks; }, prepend: function prepend(chunks) { if (_utils.isArray(chunks)) { chunks = chunks.join(''); } this.src = chunks + this.src; }, toStringWithSourceMap: function toStringWithSourceMap() { return { code: this.toString() }; }, toString: function toString() { return this.src; } }; } function castChunk(chunk, codeGen, loc) { if (_utils.isArray(chunk)) { var ret = []; for (var i = 0, len = chunk.length; i < len; i++) { ret.push(codeGen.wrap(chunk[i], loc)); } return ret; } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { // Handle primitives that the SourceNode will throw up on return chunk + ''; } return chunk; } function CodeGen(srcFile) { this.srcFile = srcFile; this.source = []; } CodeGen.prototype = { isEmpty: function isEmpty() { return !this.source.length; }, prepend: function prepend(source, loc) { this.source.unshift(this.wrap(source, loc)); }, push: function push(source, loc) { this.source.push(this.wrap(source, loc)); }, merge: function merge() { var source = this.empty(); this.each(function (line) { source.add([' ', line, '\n']); }); return source; }, each: function each(iter) { for (var i = 0, len = this.source.length; i < len; i++) { iter(this.source[i]); } }, empty: function empty() { var loc = this.currentLocation || { start: {} }; return new SourceNode(loc.start.line, loc.start.column, this.srcFile); }, wrap: function wrap(chunk) { var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; if (chunk instanceof SourceNode) { return chunk; } chunk = castChunk(chunk, this, loc); return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); }, functionCall: function functionCall(fn, type, params) { params = this.generateList(params); return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); }, quotedString: function quotedString(str) { return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 .replace(/\u2029/g, '\\u2029') + '"'; }, objectLiteral: function objectLiteral(obj) { // istanbul ignore next var _this = this; var pairs = []; _Object$keys(obj).forEach(function (key) { var value = castChunk(obj[key], _this); if (value !== 'undefined') { pairs.push([_this.quotedString(key), ':', value]); } }); var ret = this.generateList(pairs); ret.prepend('{'); ret.add('}'); return ret; }, generateList: function generateList(entries) { var ret = this.empty(); for (var i = 0, len = entries.length; i < len; i++) { if (i) { ret.add(','); } ret.add(castChunk(entries[i], this)); } return ret; }, generateArray: function generateArray(entries) { var ret = this.generateList(entries); ret.prepend('['); ret.add(']'); return ret; } }; exports['default'] = CodeGen; module.exports = exports['default']; /***/ }) /******/ ]) }); ;PKwL\^PLTE)[VYtRNS  !"#$'),/12348pHHHH;?l9+WOBX;K@Рr]*[՟@Cv=2`߭BfP B b -خ"m onR0h> dxHPBBBBBBB< AҊր;2e|RgG,4\82< Yw8PȨ"证3䯱\& |%\g>@ƚඅ÷}HHHHHHHHؠ3a ءOP+J69bw}`"*N1I^v 1 o:< Up7x a0ȟۈC&l@N a;h ]ԋq"GnDoH@Dp5&v/K]͐STU*<,QT.^kz?"^r"@FX4ٵu,vA"kfb ȟ+!<, ѸȆXRwt a-գ弉 pW{ *.BfDk"&nһ ڈX }p~5tц.l}>@BZ! :Dk38#&|uzG#$=.6W!T:z:b5nXVf@\ :_-~k' 7}H`kvHt~"w<6l'DDMbt2rwD%:iFG5(珒Un@p; 4]ŽMSi}e@DGoOn' C4ˠ9m\'n4l:ⶋHu2#+ 661ys,ڟب X_нU> t{<3VpZvQĂ/!~@[w?!!!!aPh?X~}n*7.U*B"].;:HG#Bbv@9{#՝/4}sٚ:Z70@>`n7{:v ,ˬ#dF@ 6p BJCct|~C8'G@Ъ  +H Y^*HjWg7{Y2 ?P?e(4pUс[}:sB=M`.-P?sE/? EB8<<pPcDLn0Y@qP iyގysk6&>໘0XgBs0V8 r^1P\uY*B֪BBBB–pyvYv|X SqؓB5?ۓ@ Ā:X4Q&׮r}?Z Je؞in'^\0th׾yJ#y >h27h=_q)\ 9{H}ũʎ3:6 `0G`HbYTcd|xsP +T^6"fp:V&cG@p G)M,bRJ3 Cj[vkU0c}Z-%у>R OAujOwbJɨj yh6j?^#qHEF@f+"(H{{d!M1{vXX06$9v~CL$Tsg ˂oYM~y8Rtbug~O{3 boWvpbZrplsz*׈OC|>9Cx _~ Ωֿc=C|C+ # g;@:WMP L7~h<_kʸӑ: nHtXJr>u,Tc&\ix `mhW u{Ν3 (xf@@B 2Q*2k:uTVMM+yʃBҋ3  _̓@*&^=uxiP?ȸ}jݜ2 2=)+גa/Ls_5g!޿pg G+o̧0uK*|؂uhN?. +I8:=4OO 1O&y駋/f >`T CB`\(p>W~;f* ^ -7}@$bŕG^߯77 58i<#n&uZ^}:7,&$$$$J>Ja9ꊾ~moR@2C9/CgSnGV%K>AB%.k\߁m\O"K^ JVf0 fx|&G X->Rh(`;6< ۀ~*o?ȈrCϑ·%z!/_9h|a V:Y2^&_\M>R\⧭*E{.߆=]@ Խ-ǠW۟z^&d=Roh1j<-K|u0~K'5Z(of8Fk^T0:Ñ[ gۯ%PooUm.vQu^oU9|@L]f|!eWV1'h,]iRs?)㽾`r/l[͗VNNplL7ZTO$/K!{*,  >%kGAwwXHFЁxob&1MJ, ?_|Sk:so'\wN_w'6@walaGߎ̪TW9]U]rBBBBBBB,6y ok˷P}H&@YT- 3@Զ "Y@n> $$$$$$$xUPt_*{%}_p}oC (P j7^UGoЉMiWؗ%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`PKwL\Eupdraftplus/includes/images/ui-bg_highlight-soft_100_eeeeee_1x100.pngnu[PNG  IHDRd2 pHYsHHFk>bKGD1DIDATWc@j&U &C'&L L$k2v3?a,6>%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\Ι=600Eupdraftplus/includes/images/ui-bg_diagonals-thick_20_666666_40x40.pngnu[PNG  IHDR((; pHYsHHFk>bKGD1rIDATHձ ;QUc1. a6syrr\ \ qXn $ dR\9b0=b m?)ՔjJ5RM ڧ+rqq%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\NN7updraftplus/includes/images/ui-icons_ef8c08_256x240.pngnu[PNG  IHDRIJPLTEjYtRNS3P/"Uq@f`2 !<BHK Z#'1S,4j8E|)Q$ bJmߜGc?oh@^bKGDH pHYsHHFk>IDATx] c۶Hj蘒]Kd%٫뺮lm:w]H^%SO~; [ r-g`I/1z~ a^RK%`;Wh y}H9pβGU AA,vU7ض- P-MJ-عL>`ӣoBJHHHHHHHؘ'a?HZp]BR⨀EߝҺ'@^!8\DRP5pp5dX`ᰄXܶp VwW:?lV; *t@ ]&"g[=V .p/4|}BY F =qB>U\ ]!Fm~]v ./A sqȄ i!qa_z6XC \HdBBBBBB®be+ұJ\[@8%*Z«;C tqMR;[@$H"2H@dmB 1r%ÀـY#KT]ꎎ<8lEUz78 xoR9E }ЂH`M$ܭ\z[@qkš #ݯQ8<8p|XzHH+$Dtpx`gV.]Oy%0W<]BOC얺f- A~ ~x?+Aӯر;|4ᦏ 9},wN";)O턈I=3N&X}Qo>BDx#P> Qs n7|i*9B,:m62d`w#UU^˕$:m{Mz]vV&sz`e2!&&&oX5A j>4nogJxNۮQ08 8|:@@pX7 [~_y .'$$$$r'gp UFE<7[JyH\# Ba'@G)qOxd^(-hT"g{hcԓo[c.[3[{փ(MfO]Rnbe`&:n֓>Ph]ih,7]Μp0NO`$`ZuA"1!u)G> !_‹>PIÏ p}ky_f8Z1Ԥ@6EJ} hax`ye-(VΜP5p u \ l"D! 8P (1WK@ "=j6֝ࡷ;p~b<~>GTW@<99cáa@% 8 (fPHB@z_W0`?@@{+0 |T#c@dQ@\ZM@ ,E@Nx/,9 Lnntz|y{'b\O*W?s]P㽵Ꟑx$\A0]h֣VSq1x!Yx,oX}ฦ#I X<7 yZ Q< d=1`3MԳ)+\ߏVR;sY;g1ggL(oF툡p~>B9ڟ ZNPBAdAu'_a58dq̸uƢlX8 ٣/>?X?OXA3*6Ԃ v'Opß `Q.n f'&$P-]Z`tVG xc2N7L}VL6^3WW᱇&ha0$^da"??/ФhLлg7ų3#koNQP# ,iI ?X LI5wv,v5kϿT-g-EV'I~7]o ?EW3J &ze@ '+'>/r(4׹3s<4⩉᫯@WP³gpF<\tCoheah8|E{U*P 9ƏOWt>T'X NP\G v`]`+j#75C7߾|7>CpȒQhC&TEf|\c/\\# ޞ*y%yVzqrWadyPSs[x׫/ J1gWOMsN'?=xZr< 8Tꯦ|=F/^=+]]%Qż1=n!c[0n|5 >Epf2p% Gg>"Q$o>x  l3 tbԇnStR}et^ET0gU̓>)kyeSgETB:U[о*{y>ɄբS:t;7c3?>h?43M`l` S|\ ַlZ?٘[C[##JC57pzL6}g|Ci"pSl^zB!u㉱Z>N 0 esK?%k.+lM@FLZh> 4! tڟk`'o'X@LÅ!k&߹7Zs#>vD,(Fx)}g\m٤_N6YńB !Q),?Z]ѻw-w: S UYw(GulȪdsiC5CgIDATx] c۶Hj蘒]Kd%٫뺮lm:w]H^%SO~; [ r-g`I/1z~ a^RK%`;Wh y}H9pβGU AA,vU7ض- P-MJ-عL>`ӣoBJHHHHHHHؘ'a?HZp]BR⨀EߝҺ'@^!8\DRP5pp5dX`ᰄXܶp VwW:?lV; *t@ ]&"g[=V .p/4|}BY F =qB>U\ ]!Fm~]v ./A sqȄ i!qa_z6XC \HdBBBBBB®be+ұJ\[@8%*Z«;C tqMR;[@$H"2H@dmB 1r%ÀـY#KT]ꎎ<8lEUz78 xoR9E }ЂH`M$ܭ\z[@qkš #ݯQ8<8p|XzHH+$Dtpx`gV.]Oy%0W<]BOC얺f- A~ ~x?+Aӯر;|4ᦏ 9},wN";)O턈I=3N&X}Qo>BDx#P> Qs n7|i*9B,:m62d`w#UU^˕$:m{Mz]vV&sz`e2!&&&oX5A j>4nogJxNۮQ08 8|:@@pX7 [~_y .'$$$$r'gp UFE<7[JyH\# Ba'@G)qOxd^(-hT"g{hcԓo[c.[3[{փ(MfO]Rnbe`&:n֓>Ph]ih,7]Μp0NO`$`ZuA"1!u)G> !_‹>PIÏ p}ky_f8Z1Ԥ@6EJ} hax`ye-(VΜP5p u \ l"D! 8P (1WK@ "=j6֝ࡷ;p~b<~>GTW@<99cáa@% 8 (fPHB@z_W0`?@@{+0 |T#c@dQ@\ZM@ ,E@Nx/,9 Lnntz|y{'b\O*W?s]P㽵Ꟑx$\A0]h֣VSq1x!Yx,oX}ฦ#I X<7 yZ Q< d=1`3MԳ)+\ߏVR;sY;g1ggL(oF툡p~>B9ڟ ZNPBAdAu'_a58dq̸uƢlX8 ٣/>?X?OXA3*6Ԃ v'Opß `Q.n f'&$P-]Z`tVG xc2N7L}VL6^3WW᱇&ha0$^da"??/ФhLлg7ų3#koNQP# ,iI ?X LI5wv,v5kϿT-g-EV'I~7]o ?EW3J &ze@ '+'>/r(4׹3s<4⩉᫯@WP³gpF<\tCoheah8|E{U*P 9ƏOWt>T'X NP\G v`]`+j#75C7߾|7>CpȒQhC&TEf|\c/\\# ޞ*y%yVzqrWadyPSs[x׫/ J1gWOMsN'?=xZr< 8Tꯦ|=F/^=+]]%Qż1=n!c[0n|5 >Epf2p% Gg>"Q$o>x  l3 tbԇnStR}et^ET0gU̓>)kyeSgETB:U[о*{y>ɄբS:t;7c3?>h?43M`l` S|\ ַlZ?٘[C[##JC57pzL6}g|Ci"pSl^zB!u㉱Z>N 0 esK?%k.+lM@FLZh> 4! tڟk`'o'X@LÅ!k&߹7Zs#>vD,(Fx)}g\m٤_N6YńB !Q),?Z]ѻw-w: S UYw(GulȪdsiC5CgbKGD XmIDAT(ScL `0 @3@Yg ʀxx"bx1A z^SYlX_Y,j-ú" aSH>G@[%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\LzhhEupdraftplus/includes/images/ui-bg_diagonals-thick_18_b81900_40x40.pngnu[PNG  IHDR((S y pHYsHHFk>bKGD XIDATh! FὅC4?[ RFq-ώm?6c w>lk~U*֦f`CK8v5M`% XZR `mj@M`?3^i:6?ҏhZ4-MEӢiѴhZ4-MEӢiѴhZ4N ݾ^PM%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\gOO7updraftplus/includes/images/ui-icons_222222_256x240.pngnu[PNG  IHDRIJ pHYsHHFk>PLTE""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""FgYtRNS  !"#$'),/12348pHHHH;?l9+WOBX;K@Рr]*[՟@Cv=2`߭BfP B b -خ"m onR0h> dxHPBBBBBBB< AҊր;2e|RgG,4\82< Yw8PȨ"证3䯱\& |%\g>@ƚඅ÷}HHHHHHHHؠ3a ءOP+J69bw}`"*N1I^v 1 o:< Up7x a0ȟۈC&l@N a;h ]ԋq"GnDoH@Dp5&v/K]͐STU*<,QT.^kz?"^r"@FX4ٵu,vA"kfb ȟ+!<, ѸȆXRwt a-գ弉 pW{ *.BfDk"&nһ ڈX }p~5tц.l}>@BZ! :Dk38#&|uzG#$=.6W!T:z:b5nXVf@\ :_-~k' 7}H`kvHt~"w<6l'DDMbt2rwD%:iFG5(珒Un@p; 4]ŽMSi}e@DGoOn' C4ˠ9m\'n4l:ⶋHu2#+ 661ys,ڟب X_нU> t{<3VpZvQĂ/!~@[w?!!!!aPh?X~}n*7.U*B"].;:HG#Bbv@9{#՝/4}sٚ:Z70@>`n7{:v ,ˬ#dF@ 6p BJCct|~C8'G@Ъ  +H Y^*HjWg7{Y2 ?P?e(4pUс[}:sB=M`.-P?sE/? EB8<<pPcDLn0Y@qP iyގysk6&>໘0XgBs0V8 r^1P\uY*B֪BBBB–pyvYv|X SqؓB5?ۓ@ Ā:X4Q&׮r}?Z Je؞in'^\0th׾yJ#y >h27h=_q)\ 9{H}ũʎ3:6 `0G`HbYTcd|xsP +T^6"fp:V&cG@p G)M,bRJ3 Cj[vkU0c}Z-%у>R OAujOwbJɨj yh6j?^#qHEF@f+"(H{{d!M1{vXX06$9v~CL$Tsg ˂oYM~y8Rtbug~O{3 boWvpbZrplsz*׈OC|>9Cx _~ Ωֿc=C|C+ # g;@:WMP L7~h<_kʸӑ: nHtXJr>u,Tc&\ix `mhW u{Ν3 (xf@@B 2Q*2k:uTVMM+yʃBҋ3  _̓@*&^=uxiP?ȸ}jݜ2 2=)+גa/Ls_5g!޿pg G+o̧0uK*|؂uhN?. +I8:=4OO 1O&y駋/f >`T CB`\(p>W~;f* ^ -7}@$bŕG^߯77 58i<#n&uZ^}:7,&$$$$J>Ja9ꊾ~moR@2C9/CgSnGV%K>AB%.k\߁m\O"K^ JVf0 fx|&G X->Rh(`;6< ۀ~*o?ȈrCϑ·%z!/_9h|a V:Y2^&_\M>R\⧭*E{.߆=]@ Խ-ǠW۟z^&d=Roh1j<-K|u0~K'5Z(of8Fk^T0:Ñ[ gۯ%PooUm.vQu^oU9|@L]f|!eWV1'h,]iRs?)㽾`r/l[͗VNNplL7ZTO$/K!{*,  >%kGAwwXHFЁxob&1MJ, ?_|Sk:so'\wN_w'6@walaGߎ̪TW9]U]rBBBBBBB,6y ok˷P}H&@YT- 3@Զ "Y@n> $$$$$$$xUPt_*{%}_p}oC (P j7^UGoЉMiWؗ%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`PKwL\!VV;updraftplus/includes/images/ui-bg_flat_10_000000_40x100.pngnu[PNG  IHDR(dΪ9PLTEz=IDATcXTGIENDB`PKwL\g ;updraftplus/includes/images/ui-bg_glass_65_ffffff_1x400.pngnu[PNG  IHDRG#7vbKGD݊ pHYsHHFk>IDAT(ch`ph4i%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\}OJJ<updraftplus/includes/images/ui-bg_glass_100_fdf5ce_1x400.pngnu[PNG  IHDRA pHYsHHFk>bKGD XIDATH!@yBP R$8j=Mn&& 8>1n,pq~λN6Ү"NL9)Vk%r-( Њ]ĒMQ,8lf"coQ)Ęʗ;|=%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\igNN7updraftplus/includes/images/ui-icons_228ef1_256x240.pngnu[PNG  IHDRIJPLTE""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""3~YtRNS3P/"Uq@f`2 !<BHK Z#'1S,4j8E|)Q$ bJmߜGc?oh@^bKGDH pHYsHHFk>IDATx] c۶Hj蘒]Kd%٫뺮lm:w]H^%SO~; [ r-g`I/1z~ a^RK%`;Wh y}H9pβGU AA,vU7ض- P-MJ-عL>`ӣoBJHHHHHHHؘ'a?HZp]BR⨀EߝҺ'@^!8\DRP5pp5dX`ᰄXܶp VwW:?lV; *t@ ]&"g[=V .p/4|}BY F =qB>U\ ]!Fm~]v ./A sqȄ i!qa_z6XC \HdBBBBBB®be+ұJ\[@8%*Z«;C tqMR;[@$H"2H@dmB 1r%ÀـY#KT]ꎎ<8lEUz78 xoR9E }ЂH`M$ܭ\z[@qkš #ݯQ8<8p|XzHH+$Dtpx`gV.]Oy%0W<]BOC얺f- A~ ~x?+Aӯر;|4ᦏ 9},wN";)O턈I=3N&X}Qo>BDx#P> Qs n7|i*9B,:m62d`w#UU^˕$:m{Mz]vV&sz`e2!&&&oX5A j>4nogJxNۮQ08 8|:@@pX7 [~_y .'$$$$r'gp UFE<7[JyH\# Ba'@G)qOxd^(-hT"g{hcԓo[c.[3[{փ(MfO]Rnbe`&:n֓>Ph]ih,7]Μp0NO`$`ZuA"1!u)G> !_‹>PIÏ p}ky_f8Z1Ԥ@6EJ} hax`ye-(VΜP5p u \ l"D! 8P (1WK@ "=j6֝ࡷ;p~b<~>GTW@<99cáa@% 8 (fPHB@z_W0`?@@{+0 |T#c@dQ@\ZM@ ,E@Nx/,9 Lnntz|y{'b\O*W?s]P㽵Ꟑx$\A0]h֣VSq1x!Yx,oX}ฦ#I X<7 yZ Q< d=1`3MԳ)+\ߏVR;sY;g1ggL(oF툡p~>B9ڟ ZNPBAdAu'_a58dq̸uƢlX8 ٣/>?X?OXA3*6Ԃ v'Opß `Q.n f'&$P-]Z`tVG xc2N7L}VL6^3WW᱇&ha0$^da"??/ФhLлg7ų3#koNQP# ,iI ?X LI5wv,v5kϿT-g-EV'I~7]o ?EW3J &ze@ '+'>/r(4׹3s<4⩉᫯@WP³gpF<\tCoheah8|E{U*P 9ƏOWt>T'X NP\G v`]`+j#75C7߾|7>CpȒQhC&TEf|\c/\\# ޞ*y%yVzqrWadyPSs[x׫/ J1gWOMsN'?=xZr< 8Tꯦ|=F/^=+]]%Qż1=n!c[0n|5 >Epf2p% Gg>"Q$o>x  l3 tbԇnStR}et^ET0gU̓>)kyeSgETB:U[о*{y>ɄբS:t;7c3?>h?43M`l` S|\ ַlZ?٘[C[##JC57pzL6}g|Ci"pSl^zB!u㉱Z>N 0 esK?%k.+lM@FLZh> 4! tڟk`'o'X@LÅ!k&߹7Zs#>vD,(Fx)}g\m٤_N6YńB !Q),?Z]ѻw-w: S UYw(GulȪdsiC5CgbKGD XIDATxo^UITS^"UJ*ԤI؎c'qivŸ6}6!h"P@VB$mji޵QP/(mTTHr!nguwƿ3gGw̙3gfdm&DDDDDl@9#"""""wDDDDD9#""""rpGDDDDD;"""""rpGDDDD;"""""wDDDDD7\~=vO힖c-F='Ch=/b8[̾u~=1Wׅ5yk =y[_Jkyڲ**k0oԨ឵ O赺쌔]#z^juO<2ܺ䵯(ݾ*=t4~+:ؖJVs=5ʚJkW6ΨR^0szuo7m!n5kSNj+wӚcgn^}Zc;=[e\Poy-VL9"""""6i;>c;bOY?Ǿ{KXMaO{D:YG_e>{Wֈ653XZ_zoQs^+Oko)z?GzvOVXi׭7}eO ]z.Of՟C 2fߎҚ~gڌJOZGuog֓֌Uf:Gbbq+5:^˵#驱ZWOR6 kHzf߿J;jr^n(3W5“=P2eX%)19#""""s\wdsmwI(M}\ԈU*s=WKeu٘3\{2:FbUc-(V^[:e3> ѿkJ̗'ַDzT;c|;z";XbT{J'xc> kE?*;=y}N̋}?s52wyʳ6=NF)U1Cjٕ29W;ϼK':sǁӟͧw{Hn{,;ȺCDD&; k\[GiGټwY#_'룰^?VJzӟ 4yNL\wl{Z8ҲB;8k+5GYўW=t3(g};GDDDDĖ NزO_?ADDDDĖ gN~YDDDDDl[6t*~C߰lط{yBϳ['ș<3R;,U%bs5Y5f_X67X(+ZKGەo]5٫R_kCk5µwi>c'޻,"""""l~DDDDDĖ ol[eC_DDDDDl^("""""l?\C]wYϳ֔w)?>mۘ)V !oZg9_7df^JJ޲26[Vjo-uVY-R:NO!""""bˆm[6tݷu"""""l~i[GDDDDĖ ]o"""""lͼ*DDDDDl1k:k_JJ=7}{6=je,zFWbWNLB_ɟRʳuޓjf^<̦/ewgO!j?gңs̫~V\z̧=sXbo{jtOhX{'J?oTF?Ly=ɻߓ{֔ព9]ַR,OS뒒-{%[zk4?=3⩁Jv;rJj25hYi;Jo{S;-轝VښYu]J =QbRzZțR#yo)U?3YfçT.*+U;sYqzm W ǬQ:IJF&x+-7;EDDDDĖ}kf5aƸ~kx +F$KE՟^P㯔Fj(nO_3Q[VLw1}'Swj8.k Wçb(d2wzn?޲1gN?8剞{[9XOlURUEm^ X#PJ^kʸoWG/֫{XӗgW_(jrgX1-m-ѥߕ?ton?oޕ8+wQRTfS<{6o(Z΅>^=z>xT)k}λu'ңYy/FNꩄ|YB(OI֝њEmϩC'ڭ%n>e@eX]䭈qWkXך?gUњB^[Gkw.zf$[yCjR,/ ѿkJ̗'ַDzT;ƊHmwn~=mׇƮ+-O?ׂOS:SzLqKlwe\#ijv: ^gR*{T5c}Tg_Qzk Pjmy5*ʳd说yBl*}89DV،מy檫eӅj\+l%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\,N<updraftplus/includes/images/ui-bg_glass_100_f6f6f6_1x400.pngnu[PNG  IHDRD pHYsHHFk>bKGD1BIDAT8c5a"*?L*L AL LL eLeL L0v.C c 9h"b _u%tEXtdate:create2015-12-02T23:52:01+00:00(os%tEXtdate:modify2015-12-02T23:52:01+00:00YIENDB`PKwL\] Vupdraftplus/includes/jquery-ui.dialog.extended/jquery-ui.dialog.extended-2-23-7.min.jsnu[!function(o){o.widget("ui.dialog",o.ui.dialog,{options:{height:200,closeModalOnClick:!0,dialogClass:"updraft-dialog",forceFullscreen:!1,resizeOnWindowResize:!1,scrollWithViewport:!1,resizeAccordingToViewport:!0,resizeToBestPossibleSize:!1,useContentSize:!1,useAnimation:!0,animateOptions:{duration:500,queue:!1},resized:null},change:function(t,i,e,s){(s="boolean"!=typeof s?this.options.useAnimation:s)?(this.setAriaLive(!0),this.element.one(this.widgetEventPrefix+"resized",this,function(i){i.data.element.html(t),i.data.setAriaLive(!1),i.data.focusTabbable()})):this.element.html(t),this.changeSize(i,e)},changeSize:function(i,t){this._setOptions({width:i,height:t})},_setOption:function(i,t){"width"===i&&(this._oldSize.width=t),"height"===i&&(this._oldSize.height=t),this.options.useAnimation&&this.options.useContentSize&&this._isVisible&&("width"===i&&(t+=this.uiDialog.width()-this.element.width()),"height"===i)&&(t+=this.uiDialog.outerHeight()-this.element.height()),this._super(i,t)},_getSize:function(i){var t=this.options,e=o.position.getWithinInfo(t.position.of),s=e.height>=e.width,e={width:e.width-(this.uiDialog.outerWidth()-this.uiDialog.width()),height:e.height};return t.forceFullscreen?e:(t.resizeToBestPossibleSize&&(i=s?this._calcSize(i,e.width,"width","height"):this._calcSize(i,e.height,"height","width")),(t.resizeAccordingToViewport||t.resizeToBestPossibleSize)&&(e.widtht.width+e&&(t.width=t.minWidth),i=this.uiDialog.css({height:"auto",width:t.width+e}).outerHeight(),e=this._getSize({width:t.width+e,height:t.height+i}),this.uiDialog.css("width",e.width),this.element.height(Math.max(0,e.height-i)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight()),o.extend(t,e)},_animateUsing:function(i,t){var e=this;i.left=t.target.left+(t.target.width-this.options.width-(this.uiDialog.outerWidth()-this.uiDialog.width()))/2,i.top=t.target.top+(t.target.height-this.options.height)/2,i.top<0&&(i.top=0),this.uiDialog.animate(i,o.extend({},this.options.animateOptions,{complete:function(){e._trigger("resized")}}))},_animateSize:function(){var i=this.options;this.uiDialog.animate({width:i.width},i.animateOptions),this.element.animate({height:i.height-(this.uiDialog.outerHeight()-this.element.height())},i.animateOptions)},_position:function(){var e=this;this._positionOptions=this.options.position,this.options.useAnimation&&this._isVisible&&(this.options.position.using=function(i,t){e._animateUsing(i,t)}),this._super(),this.options.position=this._positionOptions},setAriaLive:function(i){this.uiDialog.attr({"aria-live":"assertive","aria-relevant":"additions removals text","aria-busy":i})},_create:function(){this._super(),this._isVisible=!1,this._oldSize={width:this.options.width,height:this.options.height},this._on(window,this._windowResizeEvents),o(".updraft-dialog").not(".updraft-container > .updraft-dialog").wrap('
')},_windowResizeEvents:{resize:function(i){this.options.resizeOnWindowResize&&(window===i.target?this._addTimeout(function(){this._setOptions(this._oldSize)}):this._addTimeout(function(){this._position()}))},scroll:function(){this.options.scrollWithViewport&&this.timeout?this._addTimeout(function(){this._position()}):this.timeout=!0}},_addTimeout:function(i){clearTimeout(this.timeout),this._isVisible&&(this.timeout=this._delay(i,250))},_makeResizable:function(){this._super(),this.element.on(this.widgetEventPrefix+"resizestop",this,function(i){i.data.element.css("width","auto"),i.data.uiDialog.css("height","auto")})},_makeDraggable:function(){this._super(),this.element.on(this.widgetEventPrefix+"dragstop",this,function(i){i.data.options.position=i.data._positionOptions})},open:function(){this._super(),this._isVisible=!0},close:function(){this._super(),this._isVisible=!1},focusTabbable:function(){this._focusTabbable()},_createOverlay:function(){this._super(),this.options.modal&&this.options.closeModalOnClick&&this._on(this.overlay,{mousedown:function(i){this.close(i)}})}})}(jQuery);PKwL\a{<&<&Kupdraftplus/includes/jquery-ui.dialog.extended/jquery-ui.dialog.extended.jsnu[/** * v1.0.4 - 05-04-2021 20:10 * * JQuery UI Dialog Extended * * Copyright 2013-2015, Felix Nagel (http://www.felixnagel.com) * Copyright 2021, Team Updraft * Dual licensed under the MIT or GPL Version 2 licenses. * * http://github.com/fnagel/jquery-ui-extensions * * Depends: * jquery.ui.core.js * jquery.ui.widget.js * jquery.ui.dialog.js * * Changes: * Add "updraft-dialog" class for every jQuery UI dialog created by UpdraftPlus plugin. * Wrap all "updraft-dialog" class with "updraft-container" class * to prevent CSS conflict with other plugins that use jQuery UI too. */ (function( $ ) { /* * Option width and height normally set the overall dialog dimensions. * This extensions make these options the dimensions of the content pane if * option useContentSize is enabled. This way it's possible to set the real * content dimensions. * * Please note you won't get the original size but the calculated overall size * when using the width and height option getter. */ $.widget("ui.dialog", $.ui.dialog, { options: { height: 200, // auto is not allowed when using animation closeModalOnClick: true, dialogClass: 'updraft-dialog', // viewport settings forceFullscreen: false, resizeOnWindowResize: false, scrollWithViewport: false, resizeAccordingToViewport: true, resizeToBestPossibleSize: false, // width and height set the content size, not overall size useContentSize: false, // animated options useAnimation: true, animateOptions: { duration: 500, queue: false }, // callbacks resized: null }, // Changes content and resizes dialog change: function(content, width, height, animate) { if (typeof animate !== "boolean") { animate = this.options.useAnimation; } if (animate) { this.setAriaLive(true); this.element.one(this.widgetEventPrefix + "resized", this, function(event) { event.data.element.html(content); event.data.setAriaLive(false); event.data.focusTabbable(); }); } else { this.element.html(content); } this.changeSize(width, height); }, // Changes size changeSize: function(width, height) { this._setOptions({ width: width, height: height }); }, _setOption: function(key, value) { if (key === "width") { this._oldSize.width = value; } if (key === "height") { this._oldSize.height = value; } // we need to adjust the size as we need to set the overall dialog size if (this.options.useAnimation && this.options.useContentSize && this._isVisible) { if (key === "width") { value = value + ( this.uiDialog.width() - this.element.width() ); } if (key === "height") { value = value + ( this.uiDialog.outerHeight() - this.element.height() ); } } this._super(key, value); }, // calculate actual displayed size, data contains already the overall dimensions _getSize: function(data) { var options = this.options, feedback = $.position.getWithinInfo(options.position.of), portrait = ( feedback.height >= feedback.width ) ? true : false, viewport = { width: feedback.width - ( this.uiDialog.outerWidth() - this.uiDialog.width() ), height: feedback.height }; if (options.forceFullscreen) { return viewport; } if (options.resizeToBestPossibleSize) { if (portrait) { data = this._calcSize(data, viewport.width, "width", "height"); } else { data = this._calcSize(data, viewport.height, "height", "width"); } } if (options.resizeAccordingToViewport || options.resizeToBestPossibleSize) { if (viewport.width < data.width) { data = this._calcSize(data, viewport.width, "width", "height"); } if (viewport.height < data.height) { data = this._calcSize(data, viewport.height, "height", "width"); } } return data; }, _calcSize: function( data, value, sortBy, toSort ) { var newData = {}; newData[toSort] = Math.max(0, (data[ toSort ] / data[ sortBy ]) * value); newData[sortBy] = value; return newData; }, _size: function() { // overwrite options with recalculated dimensions $.extend(this.options, this._getSize(this.options)); if (this._isVisible && this.options.useAnimation) { this._animateSize(); return; } if (this.options.useContentSize) { this._contentSize(); return; } this._super(); }, /* * Sets the size of the dialog * * Options width and height define content size, not overall size */ _contentSize: function() { // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content // divs will both have width and height set, so we need to reset them var nonContentHeight, nonContentWidth, actualSize, options = this.options; // Reset content sizing nonContentWidth = this.element.show().css({ width: options.width, minHeight: 0, maxHeight: "none", height: 0 }).outerWidth() - options.width; this.element.css("width", "auto"); if (options.minWidth > options.width + nonContentWidth) { options.width = options.minWidth; } // reset wrapper sizing // determine the height of all the non-content elements nonContentHeight = this.uiDialog.css({ height: "auto", width: options.width + nonContentWidth }) .outerHeight(); actualSize = this._getSize({ width: options.width + nonContentWidth, height: options.height + nonContentHeight }); this.uiDialog.css("width", actualSize.width); this.element.height(Math.max(0, actualSize.height - nonContentHeight)); if (this.uiDialog.is(":data(ui-resizable)") ) { this.uiDialog.resizable("option", "minHeight", this._minHeight()); } // save calculated overall size $.extend(options, actualSize); }, // Processes the animated positioning (position using callback), works with any width and height options _animateUsing: function( position, data ) { var that = this; // calculate new position based on the viewport position.left = ( data.target.left + ( data.target.width - this.options.width - ( this.uiDialog.outerWidth() - this.uiDialog.width() ) ) / 2 ); position.top = ( data.target.top + ( data.target.height - this.options.height ) / 2 ); if (position.top < 0) { position.top = 0; } this.uiDialog.animate(position, $.extend({}, this.options.animateOptions, { complete: function() { that._trigger("resized"); } })); }, // animated the size, uses width and height options like default dialog widget (overall size) _animateSize: function() { var options = this.options; this.uiDialog.animate({ width: options.width }, options.animateOptions); this.element.animate({ // options.height is overall size, we need content size height: options.height - ( this.uiDialog.outerHeight() - this.element.height() ) }, options.animateOptions); }, // position overwrite for animated positioning _position: function() { var that = this; this._positionOptions = this.options.position; // change position.using mechanism if (this.options.useAnimation && this._isVisible) { this.options.position.using = function(position, feedback) { that._animateUsing(position, feedback); }; } this._super(); // reset position.using mechanism this.options.position = this._positionOptions; }, // ARIA helper setAriaLive: function(busy) { this.uiDialog.attr({ "aria-live": "assertive", "aria-relevant": "additions removals text", "aria-busy": busy }); }, // all following functions add a variable to determine if the dialog is visible _create: function() { this._super(); this._isVisible = false; this._oldSize = { width: this.options.width, height: this.options.height }; // make dialog responsive to viewport changes this._on(window, this._windowResizeEvents); // add wrapper to dialog $('.updraft-dialog').not('.updraft-container > .updraft-dialog').wrap('
'); }, _windowResizeEvents: { resize: function(e) { if (this.options.resizeOnWindowResize) { if (window === e.target) { this._addTimeout(function() { this._setOptions(this._oldSize); }); } else { this._addTimeout(function() { this._position(); }); } } }, scroll: function() { // second test prevents initial page load scroll event if (this.options.scrollWithViewport && this.timeout) { this._addTimeout(function() { this._position(); }); } else { this.timeout = true; } } }, _addTimeout: function(callback) { clearTimeout(this.timeout); if (this._isVisible) { this.timeout = this._delay(callback, 250); } }, _makeResizable: function() { this._super(); this.element.on(this.widgetEventPrefix + "resizestop", this, function(event) { event.data.element.css("width", "auto"); event.data.uiDialog.css("height", "auto"); }); }, _makeDraggable: function() { this._super(); this.element.on(this.widgetEventPrefix + "dragstop", this, function(event) { event.data.options.position = event.data._positionOptions; }); }, open: function() { this._super(); this._isVisible = true; }, close: function() { this._super(); this._isVisible = false; }, focusTabbable: function() { this._focusTabbable(); }, _createOverlay: function() { this._super(); if (this.options.modal && this.options.closeModalOnClick) { this._on(this.overlay, { mousedown: function(event) { this.close(event); } }); } } }); }( jQuery )); PKwL\ ^Eupdraftplus/includes/jquery.serializeJSON/jquery.serializejson.min.jsnu[/*! SerializeJSON jQuery plugin. https://github.com/marioizquierdo/jquery.serializeJSON version 3.2.0 (Dec, 2020) Copyright (c) 2012-2021 Mario Izquierdo Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. */ !function(e){if("function"==typeof define&&define.amd)define(["jquery"],e);else if("object"==typeof exports){var n=require("jquery");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){"use strict";var n=/\r?\n/g,r=/^(?:submit|button|image|reset|file)$/i,t=/^(?:input|select|textarea|keygen)/i,i=/^(?:checkbox|radio)$/i;e.fn.serializeJSON=function(n){var r=e.serializeJSON,t=r.setupOpts(n),i=e.extend({},t.defaultTypes,t.customTypes),a=r.serializeArray(this,t),u={};return e.each(a,function(n,a){var s=a.name,l=e(a.el).attr("data-value-type");if(!l&&!t.disableColonTypes){var o=r.splitType(a.name);s=o[0],l=o[1]}if("skip"!==l){l||(l=t.defaultType);var p=r.applyTypeFunc(a.name,a.value,l,a.el,i);if(p||!r.shouldSkipFalsy(a.name,s,l,a.el,t)){var f=r.splitInputNameIntoKeysArray(s);r.deepSet(u,f,p,t)}}}),u},e.serializeJSON={defaultOptions:{},defaultBaseOptions:{checkboxUncheckedValue:void 0,useIntKeysAsArrayIndex:!1,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],disableColonTypes:!1,customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===["false","null","undefined","","0"].indexOf(e)},null:function(e){return-1===["false","null","undefined","","0"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},skip:null},defaultType:"string"},setupOpts:function(n){null==n&&(n={});var r=e.serializeJSON,t=["checkboxUncheckedValue","useIntKeysAsArrayIndex","skipFalsyValuesForTypes","skipFalsyValuesForFields","disableColonTypes","customTypes","defaultTypes","defaultType"];for(var i in n)if(-1===t.indexOf(i))throw new Error("serializeJSON ERROR: invalid option '"+i+"'. Please use one of "+t.join(", "));return e.extend({},r.defaultBaseOptions,r.defaultOptions,n)},serializeArray:function(a,u){null==u&&(u={});var s=e.serializeJSON;return a.map(function(){var n=e.prop(this,"elements");return n?e.makeArray(n):this}).filter(function(){var n=e(this),a=this.type;return this.name&&!n.is(":disabled")&&t.test(this.nodeName)&&!r.test(a)&&(this.checked||!i.test(a)||null!=s.getCheckboxUncheckedValue(n,u))}).map(function(r,t){var a=e(this),l=a.val(),p=this.type;return null==l?null:(i.test(p)&&!this.checked&&(l=s.getCheckboxUncheckedValue(a,u)),o(l)?e.map(l,function(e){return{name:t.name,value:e.replace(n,"\r\n"),el:t}}):{name:t.name,value:l.replace(n,"\r\n"),el:t})}).get()},getCheckboxUncheckedValue:function(e,n){var r=e.attr("data-unchecked-value");return null==r&&(r=n.checkboxUncheckedValue),r},applyTypeFunc:function(e,n,r,t,i){var u=i[r];if(!u)throw new Error("serializeJSON ERROR: Invalid type "+r+" found in input name '"+e+"', please use one of "+a(i).join(", "));return u(n,t)},splitType:function(e){var n=e.split(":");if(n.length>1){var r=n.pop();return[n.join(":"),r]}return[e,""]},shouldSkipFalsy:function(n,r,t,i,a){var u=e(i).attr("data-skip-falsy");if(null!=u)return"false"!==u;var s=a.skipFalsyValuesForFields;if(s&&(-1!==s.indexOf(r)||-1!==s.indexOf(n)))return!0;var l=a.skipFalsyValuesForTypes;return!(!l||-1===l.indexOf(t))},splitInputNameIntoKeysArray:function(n){var r=n.split("[");return""===(r=e.map(r,function(e){return e.replace(/\]/g,"")}))[0]&&r.shift(),r},deepSet:function(n,r,t,i){null==i&&(i={});var a=e.serializeJSON;if(s(n))throw new Error("ArgumentError: param 'o' expected to be an object or array, found undefined");if(!r||0===r.length)throw new Error("ArgumentError: param 'keys' expected to be an array with least one element");var p=r[0];if(1!==r.length){var f=r[1],c=r.slice(1);if(""===p){var d=n.length-1,y=n[d];p=u(y)&&s(a.deepGet(y,c))?d:d+1}""===f?!s(n[p])&&o(n[p])||(n[p]=[]):i.useIntKeysAsArrayIndex&&l(f)?!s(n[p])&&o(n[p])||(n[p]=[]):!s(n[p])&&u(n[p])||(n[p]={}),a.deepSet(n[p],c,t,i)}else""===p?n.push(t):n[p]=t},deepGet:function(n,r){var t=e.serializeJSON;if(s(n)||s(r)||0===r.length||!u(n)&&!o(n))return n;var i=r[0];if(""!==i){if(1===r.length)return n[i];var a=r.slice(1);return t.deepGet(n[i],a)}}};var a=function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},u=function(e){return e===Object(e)},s=function(e){return void 0===e},l=function(e){return/^[0-9]+$/.test(String(e))},o=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}}); PKwL\b <<Aupdraftplus/includes/jquery.serializeJSON/jquery.serializejson.jsnu[/*! SerializeJSON jQuery plugin. https://github.com/marioizquierdo/jquery.serializeJSON version 3.2.0 (Dec, 2020) Copyright (c) 2012-2021 Mario Izquierdo Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. */ (function (factory) { /* global define, require, module */ if (typeof define === "function" && define.amd) { // AMD. Register as an anonymous module. define(["jquery"], factory); } else if (typeof exports === "object") { // Node/CommonJS var jQuery = require("jquery"); module.exports = factory(jQuery); } else { // Browser globals (zepto supported) factory(window.jQuery || window.Zepto || window.$); // Zepto supported on browsers as well } }(function ($) { "use strict"; var rCRLF = /\r?\n/g; var rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i; var rsubmittable = /^(?:input|select|textarea|keygen)/i; var rcheckableType = /^(?:checkbox|radio)$/i; $.fn.serializeJSON = function (options) { var f = $.serializeJSON; var $form = this; // NOTE: the set of matched elements is most likely a form, but it could also be a group of inputs var opts = f.setupOpts(options); // validate options and apply defaults var typeFunctions = $.extend({}, opts.defaultTypes, opts.customTypes); // Make a list with {name, value, el} for each input element var serializedArray = f.serializeArray($form, opts); // Convert the serializedArray into a serializedObject with nested keys var serializedObject = {}; $.each(serializedArray, function (_i, obj) { var nameSansType = obj.name; var type = $(obj.el).attr("data-value-type"); if (!type && !opts.disableColonTypes) { // try getting the type from the input name var p = f.splitType(obj.name); // "foo:string" => ["foo", "string"] nameSansType = p[0]; type = p[1]; } if (type === "skip") { return; // ignore fields with type skip } if (!type) { type = opts.defaultType; // "string" by default } var typedValue = f.applyTypeFunc(obj.name, obj.value, type, obj.el, typeFunctions); // Parse type as string, number, etc. if (!typedValue && f.shouldSkipFalsy(obj.name, nameSansType, type, obj.el, opts)) { return; // ignore falsy inputs if specified in the options } var keys = f.splitInputNameIntoKeysArray(nameSansType); f.deepSet(serializedObject, keys, typedValue, opts); }); return serializedObject; }; // Use $.serializeJSON as namespace for the auxiliar functions // and to define defaults $.serializeJSON = { defaultOptions: {}, // reassign to override option defaults for all serializeJSON calls defaultBaseOptions: { // do not modify, use defaultOptions instead checkboxUncheckedValue: undefined, // to include that value for unchecked checkboxes (instead of ignoring them) useIntKeysAsArrayIndex: false, // name="foo[2]" value="v" => {foo: [null, null, "v"]}, instead of {foo: ["2": "v"]} skipFalsyValuesForTypes: [], // skip serialization of falsy values for listed value types skipFalsyValuesForFields: [], // skip serialization of falsy values for listed field names disableColonTypes: false, // do not interpret ":type" suffix as a type customTypes: {}, // extends defaultTypes defaultTypes: { "string": function(str) { return String(str); }, "number": function(str) { return Number(str); }, "boolean": function(str) { var falses = ["false", "null", "undefined", "", "0"]; return falses.indexOf(str) === -1; }, "null": function(str) { var falses = ["false", "null", "undefined", "", "0"]; return falses.indexOf(str) === -1 ? str : null; }, "array": function(str) { return JSON.parse(str); }, "object": function(str) { return JSON.parse(str); }, "skip": null // skip is a special type used to ignore fields }, defaultType: "string", }, // Validate and set defaults setupOpts: function(options) { if (options == null) options = {}; var f = $.serializeJSON; // Validate var validOpts = [ "checkboxUncheckedValue", "useIntKeysAsArrayIndex", "skipFalsyValuesForTypes", "skipFalsyValuesForFields", "disableColonTypes", "customTypes", "defaultTypes", "defaultType" ]; for (var opt in options) { if (validOpts.indexOf(opt) === -1) { throw new Error("serializeJSON ERROR: invalid option '" + opt + "'. Please use one of " + validOpts.join(", ")); } } // Helper to get options or defaults return $.extend({}, f.defaultBaseOptions, f.defaultOptions, options); }, // Just like jQuery's serializeArray method, returns an array of objects with name and value. // but also includes the dom element (el) and is handles unchecked checkboxes if the option or data attribute are provided. serializeArray: function($form, opts) { if (opts == null) { opts = {}; } var f = $.serializeJSON; return $form.map(function() { var elements = $.prop(this, "elements"); // handle propHook "elements" to filter or add form elements return elements ? $.makeArray(elements) : this; }).filter(function() { var $el = $(this); var type = this.type; // Filter with the standard W3C rules for successful controls: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2 return this.name && // must contain a name attribute !$el.is(":disabled") && // must not be disable (use .is(":disabled") so that fieldset[disabled] works) rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && // only serialize submittable fields (and not buttons) (this.checked || !rcheckableType.test(type) || f.getCheckboxUncheckedValue($el, opts) != null); // skip unchecked checkboxes (unless using opts) }).map(function(_i, el) { var $el = $(this); var val = $el.val(); var type = this.type; // "input", "select", "textarea", "checkbox", etc. if (val == null) { return null; } if (rcheckableType.test(type) && !this.checked) { val = f.getCheckboxUncheckedValue($el, opts); } if (isArray(val)) { return $.map(val, function(val) { return { name: el.name, value: val.replace(rCRLF, "\r\n"), el: el }; } ); } return { name: el.name, value: val.replace(rCRLF, "\r\n"), el: el }; }).get(); }, getCheckboxUncheckedValue: function($el, opts) { var val = $el.attr("data-unchecked-value"); if (val == null) { val = opts.checkboxUncheckedValue; } return val; }, // Parse value with type function applyTypeFunc: function(name, valStr, type, el, typeFunctions) { var typeFunc = typeFunctions[type]; if (!typeFunc) { // quick feedback to user if there is a typo or missconfiguration throw new Error("serializeJSON ERROR: Invalid type " + type + " found in input name '" + name + "', please use one of " + objectKeys(typeFunctions).join(", ")); } return typeFunc(valStr, el); }, // Splits a field name into the name and the type. Examples: // "foo" => ["foo", ""] // "foo:boolean" => ["foo", "boolean"] // "foo[bar]:null" => ["foo[bar]", "null"] splitType : function(name) { var parts = name.split(":"); if (parts.length > 1) { var t = parts.pop(); return [parts.join(":"), t]; } else { return [name, ""]; } }, // Check if this input should be skipped when it has a falsy value, // depending on the options to skip values by name or type, and the data-skip-falsy attribute. shouldSkipFalsy: function(name, nameSansType, type, el, opts) { var skipFromDataAttr = $(el).attr("data-skip-falsy"); if (skipFromDataAttr != null) { return skipFromDataAttr !== "false"; // any value is true, except the string "false" } var optForFields = opts.skipFalsyValuesForFields; if (optForFields && (optForFields.indexOf(nameSansType) !== -1 || optForFields.indexOf(name) !== -1)) { return true; } var optForTypes = opts.skipFalsyValuesForTypes; if (optForTypes && optForTypes.indexOf(type) !== -1) { return true; } return false; }, // Split the input name in programatically readable keys. // Examples: // "foo" => ["foo"] // "[foo]" => ["foo"] // "foo[inn][bar]" => ["foo", "inn", "bar"] // "foo[inn[bar]]" => ["foo", "inn", "bar"] // "foo[inn][arr][0]" => ["foo", "inn", "arr", "0"] // "arr[][val]" => ["arr", "", "val"] splitInputNameIntoKeysArray: function(nameWithNoType) { var keys = nameWithNoType.split("["); // split string into array keys = $.map(keys, function (key) { return key.replace(/\]/g, ""); }); // remove closing brackets if (keys[0] === "") { keys.shift(); } // ensure no opening bracket ("[foo][inn]" should be same as "foo[inn]") return keys; }, // Set a value in an object or array, using multiple keys to set in a nested object or array. // This is the main function of the script, that allows serializeJSON to use nested keys. // Examples: // // deepSet(obj, ["foo"], v) // obj["foo"] = v // deepSet(obj, ["foo", "inn"], v) // obj["foo"]["inn"] = v // Create the inner obj["foo"] object, if needed // deepSet(obj, ["foo", "inn", "123"], v) // obj["foo"]["arr"]["123"] = v // // // deepSet(obj, ["0"], v) // obj["0"] = v // deepSet(arr, ["0"], v, {useIntKeysAsArrayIndex: true}) // arr[0] = v // deepSet(arr, [""], v) // arr.push(v) // deepSet(obj, ["arr", ""], v) // obj["arr"].push(v) // // arr = []; // deepSet(arr, ["", v] // arr => [v] // deepSet(arr, ["", "foo"], v) // arr => [v, {foo: v}] // deepSet(arr, ["", "bar"], v) // arr => [v, {foo: v, bar: v}] // deepSet(arr, ["", "bar"], v) // arr => [v, {foo: v, bar: v}, {bar: v}] // deepSet: function (o, keys, value, opts) { if (opts == null) { opts = {}; } var f = $.serializeJSON; if (isUndefined(o)) { throw new Error("ArgumentError: param 'o' expected to be an object or array, found undefined"); } if (!keys || keys.length === 0) { throw new Error("ArgumentError: param 'keys' expected to be an array with least one element"); } var key = keys[0]; // Only one key, then it's not a deepSet, just assign the value in the object or add it to the array. if (keys.length === 1) { if (key === "") { // push values into an array (o must be an array) o.push(value); } else { o[key] = value; // keys can be object keys (strings) or array indexes (numbers) } return; } var nextKey = keys[1]; // nested key var tailKeys = keys.slice(1); // list of all other nested keys (nextKey is first) if (key === "") { // push nested objects into an array (o must be an array) var lastIdx = o.length - 1; var lastVal = o[lastIdx]; // if the last value is an object or array, and the new key is not set yet if (isObject(lastVal) && isUndefined(f.deepGet(lastVal, tailKeys))) { key = lastIdx; // then set the new value as a new attribute of the same object } else { key = lastIdx + 1; // otherwise, add a new element in the array } } if (nextKey === "") { // "" is used to push values into the nested array "array[]" if (isUndefined(o[key]) || !isArray(o[key])) { o[key] = []; // define (or override) as array to push values } } else { if (opts.useIntKeysAsArrayIndex && isValidArrayIndex(nextKey)) { // if 1, 2, 3 ... then use an array, where nextKey is the index if (isUndefined(o[key]) || !isArray(o[key])) { o[key] = []; // define (or override) as array, to insert values using int keys as array indexes } } else { // nextKey is going to be the nested object's attribute if (isUndefined(o[key]) || !isObject(o[key])) { o[key] = {}; // define (or override) as object, to set nested properties } } } // Recursively set the inner object f.deepSet(o[key], tailKeys, value, opts); }, deepGet: function (o, keys) { var f = $.serializeJSON; if (isUndefined(o) || isUndefined(keys) || keys.length === 0 || (!isObject(o) && !isArray(o))) { return o; } var key = keys[0]; if (key === "") { // "" means next array index (used by deepSet) return undefined; } if (keys.length === 1) { return o[key]; } var tailKeys = keys.slice(1); return f.deepGet(o[key], tailKeys); } }; // polyfill Object.keys to get option keys in IE<9 var objectKeys = function(obj) { if (Object.keys) { return Object.keys(obj); } else { var key, keys = []; for (key in obj) { keys.push(key); } return keys; } }; var isObject = function(obj) { return obj === Object(obj); }; // true for Objects and Arrays var isUndefined = function(obj) { return obj === void 0; }; // safe check for undefined values var isValidArrayIndex = function(val) { return /^[0-9]+$/.test(String(val)); }; // 1,2,3,4 ... are valid array indexes var isArray = Array.isArray || function(obj) { return Object.prototype.toString.call(obj) === "[object Array]"; }; })); PKwL\W7updraftplus/includes/jstree/themes/default/throbber.gifnu[GIF89azzzXXX666FFF$$$hhh! NETSCAPE2.0!Created with ajaxload.info! ,@pɇhuʤ" 3 @J@"S , !$JJdσ-ד%LXwVrP5 g*"B` :1 o!Y3 ! ,]BN%I8"d,!p#a BI0![փXʇah@7a([/` (4U%s!sj#! ,ZLX6BG&9!T1@HJ=M!3 R .|V}F5$p19S"! ,\) 275&D %!VAX% QPpr٥!( ` Pㄐ}B  &-! ,EɉBX)!(^gPpX^OaJ0Arɔ>C A9N"BkJfPE! ,k!&S!$N'PaG(!A@L8`Ua0P$،a(4A6O 00"AQfJPh #il~! ,[Xi xJ 2> YH-t i&$h Cq8N#<1Px nSAx\y ĚH;1>8)! ,VI LZ/i] P8Hn !@5H+k±b:SWJq82ڱ4c! ,]X$\guHael4x/( 'Y0B M!8xFC0,v8z~ > !6J9! ,Zji%ZmNLB\TINS ! B İr&Ɓ)Y Ñ8 Cf(-Lsp`u(5&E! ,XIx"PE BRMZӉҢgGCU$p>b34$ 3 W`&Hހ"! ,ZIR|RiㅰY+%$XExpa$N`#0dNӤ@HHN}h<F`}q/)D;PKwL\{{4updraftplus/includes/jstree/themes/default/style.cssnu[/* jsTree default theme */ .jstree-node, .jstree-children, .jstree-container-ul { display: block; margin: 0; padding: 0; list-style-type: none; list-style-image: none; } .jstree-node { white-space: nowrap; } .jstree-anchor { display: inline-block; color: black; white-space: nowrap; padding: 0 4px 0 1px; margin: 0; vertical-align: top; } .jstree-anchor:focus { outline: 0; } .jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration: none; color: inherit; } .jstree-icon { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-icon:empty { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-ocl { cursor: pointer; } .jstree-leaf > .jstree-ocl { cursor: default; } .jstree .jstree-open > .jstree-children { display: block; } .jstree .jstree-closed > .jstree-children, .jstree .jstree-leaf > .jstree-children { display: none; } .jstree-anchor > .jstree-themeicon { margin-right: 2px; } .jstree-no-icons .jstree-themeicon, .jstree-anchor > .jstree-themeicon-hidden { display: none; } .jstree-hidden, .jstree-node.jstree-hidden { display: none; } .jstree-rtl .jstree-anchor { padding: 0 1px 0 4px; } .jstree-rtl .jstree-anchor > .jstree-themeicon { margin-left: 2px; margin-right: 0; } .jstree-rtl .jstree-node { margin-left: 0; } .jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; } .jstree-wholerow-ul { position: relative; display: inline-block; min-width: 100%; } .jstree-wholerow-ul .jstree-leaf > .jstree-ocl { cursor: pointer; } .jstree-wholerow-ul .jstree-anchor, .jstree-wholerow-ul .jstree-icon { position: relative; } .jstree-wholerow-ul .jstree-wholerow { width: 100%; cursor: pointer; position: absolute; left: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .jstree-contextmenu .jstree-anchor { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ user-select: none; } .vakata-context { display: none; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; } .vakata-context ul { list-style: none; left: 100%; margin-top: -2.7em; margin-left: -4px; } .vakata-context .vakata-context-right ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context li { list-style: none; } .vakata-context li > a { display: block; padding: 0 2em 0 2em; text-decoration: none; width: auto; color: black; white-space: nowrap; line-height: 2.4em; text-shadow: 1px 1px 0 white; border-radius: 1px; } .vakata-context li > a:hover { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context li > a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position: right center; background-repeat: no-repeat; } .vakata-context li > a:focus { outline: 0; } .vakata-context .vakata-context-no-icons { margin-left: 0; } .vakata-context .vakata-context-hover > a { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context .vakata-context-separator > a, .vakata-context .vakata-context-separator > a:hover { background: white; border: 0; border-top: 1px solid #e2e3e3; height: 1px; min-height: 1px; max-height: 1px; padding: 0; margin: 0 0 0 2.4em; border-left: 1px solid #e0e0e0; text-shadow: 0 0 0 transparent; box-shadow: 0 0 0 transparent; border-radius: 0; } .vakata-context .vakata-contextmenu-disabled a, .vakata-context .vakata-contextmenu-disabled a:hover { color: silver; background-color: transparent; border: 0; box-shadow: 0 0 0; } .vakata-context .vakata-contextmenu-disabled > a > i { filter: grayscale(100%); } .vakata-context li > a > i { text-decoration: none; display: inline-block; width: 2.4em; height: 2.4em; background: transparent; margin: 0 0 0 -2em; vertical-align: top; text-align: center; line-height: 2.4em; } .vakata-context li > a > i:empty { width: 2.4em; line-height: 2.4em; } .vakata-context li > a .vakata-contextmenu-sep { display: inline-block; width: 1px; height: 2.4em; background: white; margin: 0 0.5em 0 0; border-left: 1px solid #e2e3e3; } .vakata-context .vakata-contextmenu-shortcut { font-size: 0.8em; color: silver; opacity: 0.5; display: none; } .vakata-context-rtl ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context-rtl li > a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position: left center; background-repeat: no-repeat; } .vakata-context-rtl .vakata-context-separator > a { margin: 0 2.4em 0 0; border-left: 0; border-right: 1px solid #e2e3e3; } .vakata-context-rtl .vakata-context-left ul { right: auto; left: 100%; margin-left: -4px; margin-right: auto; } .vakata-context-rtl li > a > i { margin: 0 -2em 0 0; } .vakata-context-rtl li > a .vakata-contextmenu-sep { margin: 0 0 0 0.5em; border-left-color: white; background: #e2e3e3; } #jstree-marker { position: absolute; top: 0; left: 0; margin: -5px 0 0 0; padding: 0; border-right: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid; width: 0; height: 0; font-size: 0; line-height: 0; } #jstree-dnd { line-height: 16px; margin: 0; padding: 4px; } #jstree-dnd .jstree-icon, #jstree-dnd .jstree-copy { display: inline-block; text-decoration: none; margin: 0 2px 0 0; padding: 0; width: 16px; height: 16px; } #jstree-dnd .jstree-ok { background: green; } #jstree-dnd .jstree-er { background: red; } #jstree-dnd .jstree-copy { margin: 0 2px 0 2px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-repeat: no-repeat; background-color: transparent; } .jstree-default .jstree-anchor, .jstree-default .jstree-animated, .jstree-default .jstree-wholerow { transition: background-color 0.15s, box-shadow 0.15s; } .jstree-default .jstree-hovered { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-default .jstree-context { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-default .jstree-clicked { background: #beebff; border-radius: 2px; box-shadow: inset 0 0 1px #999999; } .jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon { display: none; } .jstree-default .jstree-disabled { background: transparent; color: #666666; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; box-shadow: none; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-disabled > .jstree-icon { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default .jstree-search { font-style: italic; color: #8b0000; font-weight: bold; } .jstree-default .jstree-no-checkboxes .jstree-checkbox { display: none !important; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked { background: transparent; box-shadow: none; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { background: #e7f4f9; } .jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked { background: transparent; } .jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default > .jstree-striped { min-width: 100%; display: inline-block; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; } .jstree-default > .jstree-wholerow-ul .jstree-hovered, .jstree-default > .jstree-wholerow-ul .jstree-clicked { background: transparent; box-shadow: none; border-radius: 0; } .jstree-default .jstree-wholerow { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .jstree-default .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default .jstree-wholerow-clicked { background: #beebff; background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%); background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%); } .jstree-default .jstree-node { min-height: 24px; line-height: 24px; margin-left: 24px; min-width: 24px; } .jstree-default .jstree-anchor { line-height: 24px; height: 24px; } .jstree-default .jstree-icon { width: 24px; height: 24px; line-height: 24px; } .jstree-default .jstree-icon:empty { width: 24px; height: 24px; line-height: 24px; } .jstree-default.jstree-rtl .jstree-node { margin-right: 24px; } .jstree-default .jstree-wholerow { height: 24px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-image: url("32px.png"); } .jstree-default .jstree-node { background-position: -292px -4px; background-repeat: repeat-y; } .jstree-default .jstree-last { background-image: none; } .jstree-default .jstree-open > .jstree-ocl { background-position: -132px -4px; } .jstree-default .jstree-closed > .jstree-ocl { background-position: -100px -4px; } .jstree-default .jstree-leaf > .jstree-ocl { background-position: -68px -4px; } .jstree-default .jstree-themeicon { background-position: -260px -4px; } .jstree-default > .jstree-no-dots .jstree-node, .jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -4px; } .jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -4px; } .jstree-default .jstree-disabled { background: transparent; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-checkbox { background-position: -164px -4px; } .jstree-default .jstree-checkbox:hover { background-position: -164px -36px; } .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default .jstree-checked > .jstree-checkbox { background-position: -228px -4px; } .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default .jstree-checked > .jstree-checkbox:hover { background-position: -228px -36px; } .jstree-default .jstree-anchor > .jstree-undetermined { background-position: -196px -4px; } .jstree-default .jstree-anchor > .jstree-undetermined:hover { background-position: -196px -36px; } .jstree-default .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default > .jstree-striped { background-size: auto 48px; } .jstree-default.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default.jstree-rtl .jstree-last { background-image: none; } .jstree-default.jstree-rtl .jstree-open > .jstree-ocl { background-position: -132px -36px; } .jstree-default.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -100px -36px; } .jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -68px -36px; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -36px; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -36px; } .jstree-default .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default .jstree-file { background: url("32px.png") -100px -68px no-repeat; } .jstree-default .jstree-folder { background: url("32px.png") -260px -4px no-repeat; } .jstree-default > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default { line-height: 24px; padding: 0 4px; } #jstree-dnd.jstree-default .jstree-ok, #jstree-dnd.jstree-default .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default i { background: transparent; width: 24px; height: 24px; line-height: 24px; } #jstree-dnd.jstree-default .jstree-ok { background-position: -4px -68px; } #jstree-dnd.jstree-default .jstree-er { background-position: -36px -68px; } .jstree-default .jstree-ellipsis { overflow: hidden; } .jstree-default .jstree-ellipsis .jstree-anchor { width: calc(100% - 24px + 5px); text-overflow: ellipsis; overflow: hidden; } .jstree-default.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default.jstree-rtl .jstree-last { background-image: none; } .jstree-default-small .jstree-node { min-height: 18px; line-height: 18px; margin-left: 18px; min-width: 18px; } .jstree-default-small .jstree-anchor { line-height: 18px; height: 18px; } .jstree-default-small .jstree-icon { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small .jstree-icon:empty { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small.jstree-rtl .jstree-node { margin-right: 18px; } .jstree-default-small .jstree-wholerow { height: 18px; } .jstree-default-small .jstree-node, .jstree-default-small .jstree-icon { background-image: url("32px.png"); } .jstree-default-small .jstree-node { background-position: -295px -7px; background-repeat: repeat-y; } .jstree-default-small .jstree-last { background-image: none; } .jstree-default-small .jstree-open > .jstree-ocl { background-position: -135px -7px; } .jstree-default-small .jstree-closed > .jstree-ocl { background-position: -103px -7px; } .jstree-default-small .jstree-leaf > .jstree-ocl { background-position: -71px -7px; } .jstree-default-small .jstree-themeicon { background-position: -263px -7px; } .jstree-default-small > .jstree-no-dots .jstree-node, .jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -7px; } .jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -7px; } .jstree-default-small .jstree-disabled { background: transparent; } .jstree-default-small .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-small .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-small .jstree-checkbox { background-position: -167px -7px; } .jstree-default-small .jstree-checkbox:hover { background-position: -167px -39px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-small .jstree-checked > .jstree-checkbox { background-position: -231px -7px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-small .jstree-checked > .jstree-checkbox:hover { background-position: -231px -39px; } .jstree-default-small .jstree-anchor > .jstree-undetermined { background-position: -199px -7px; } .jstree-default-small .jstree-anchor > .jstree-undetermined:hover { background-position: -199px -39px; } .jstree-default-small .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-small > .jstree-striped { background-size: auto 36px; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-small.jstree-rtl .jstree-last { background-image: none; } .jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl { background-position: -135px -39px; } .jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -103px -39px; } .jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -71px -39px; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -39px; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -39px; } .jstree-default-small .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-small .jstree-file { background: url("32px.png") -103px -71px no-repeat; } .jstree-default-small .jstree-folder { background: url("32px.png") -263px -7px no-repeat; } .jstree-default-small > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-small { line-height: 18px; padding: 0 4px; } #jstree-dnd.jstree-default-small .jstree-ok, #jstree-dnd.jstree-default-small .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-small i { background: transparent; width: 18px; height: 18px; line-height: 18px; } #jstree-dnd.jstree-default-small .jstree-ok { background-position: -7px -71px; } #jstree-dnd.jstree-default-small .jstree-er { background-position: -39px -71px; } .jstree-default-small .jstree-ellipsis { overflow: hidden; } .jstree-default-small .jstree-ellipsis .jstree-anchor { width: calc(100% - 18px + 5px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-small.jstree-rtl .jstree-last { background-image: none; } .jstree-default-large .jstree-node { min-height: 32px; line-height: 32px; margin-left: 32px; min-width: 32px; } .jstree-default-large .jstree-anchor { line-height: 32px; height: 32px; } .jstree-default-large .jstree-icon { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large .jstree-icon:empty { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large.jstree-rtl .jstree-node { margin-right: 32px; } .jstree-default-large .jstree-wholerow { height: 32px; } .jstree-default-large .jstree-node, .jstree-default-large .jstree-icon { background-image: url("32px.png"); } .jstree-default-large .jstree-node { background-position: -288px 0px; background-repeat: repeat-y; } .jstree-default-large .jstree-last { background-image: none; } .jstree-default-large .jstree-open > .jstree-ocl { background-position: -128px 0px; } .jstree-default-large .jstree-closed > .jstree-ocl { background-position: -96px 0px; } .jstree-default-large .jstree-leaf > .jstree-ocl { background-position: -64px 0px; } .jstree-default-large .jstree-themeicon { background-position: -256px 0px; } .jstree-default-large > .jstree-no-dots .jstree-node, .jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px 0px; } .jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px 0px; } .jstree-default-large .jstree-disabled { background: transparent; } .jstree-default-large .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-large .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-large .jstree-checkbox { background-position: -160px 0px; } .jstree-default-large .jstree-checkbox:hover { background-position: -160px -32px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-large .jstree-checked > .jstree-checkbox { background-position: -224px 0px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-large .jstree-checked > .jstree-checkbox:hover { background-position: -224px -32px; } .jstree-default-large .jstree-anchor > .jstree-undetermined { background-position: -192px 0px; } .jstree-default-large .jstree-anchor > .jstree-undetermined:hover { background-position: -192px -32px; } .jstree-default-large .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-large > .jstree-striped { background-size: auto 64px; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-large.jstree-rtl .jstree-last { background-image: none; } .jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl { background-position: -128px -32px; } .jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -96px -32px; } .jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -64px -32px; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px -32px; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px -32px; } .jstree-default-large .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-large .jstree-file { background: url("32px.png") -96px -64px no-repeat; } .jstree-default-large .jstree-folder { background: url("32px.png") -256px 0px no-repeat; } .jstree-default-large > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-large { line-height: 32px; padding: 0 4px; } #jstree-dnd.jstree-default-large .jstree-ok, #jstree-dnd.jstree-default-large .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-large i { background: transparent; width: 32px; height: 32px; line-height: 32px; } #jstree-dnd.jstree-default-large .jstree-ok { background-position: 0px -64px; } #jstree-dnd.jstree-default-large .jstree-er { background-position: -32px -64px; } .jstree-default-large .jstree-ellipsis { overflow: hidden; } .jstree-default-large .jstree-ellipsis .jstree-anchor { width: calc(100% - 32px + 5px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-large.jstree-rtl .jstree-last { background-image: none; } @media (max-width: 768px) { #jstree-dnd.jstree-dnd-responsive { line-height: 40px; font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } #jstree-dnd.jstree-dnd-responsive > i { background: transparent; width: 40px; height: 40px; } #jstree-dnd.jstree-dnd-responsive > .jstree-ok { background-image: url("40px.png"); background-position: 0 -200px; background-size: 120px 240px; } #jstree-dnd.jstree-dnd-responsive > .jstree-er { background-image: url("40px.png"); background-position: -40px -200px; background-size: 120px 240px; } #jstree-marker.jstree-dnd-responsive { border-left-width: 10px; border-top-width: 10px; border-bottom-width: 10px; margin-top: -10px; } } @media (max-width: 768px) { .jstree-default-responsive { /* .jstree-open > .jstree-ocl, .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } */ } .jstree-default-responsive .jstree-icon { background-image: url("40px.png"); } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-node { min-height: 40px; line-height: 40px; margin-left: 40px; min-width: 40px; white-space: nowrap; } .jstree-default-responsive .jstree-anchor { line-height: 40px; height: 40px; } .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-icon:empty { width: 40px; height: 40px; line-height: 40px; } .jstree-default-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; } .jstree-default-responsive.jstree-rtl .jstree-node { margin-left: 0; margin-right: 40px; background: transparent; } .jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; } .jstree-default-responsive .jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-size: 120px 240px; } .jstree-default-responsive .jstree-leaf > .jstree-ocl, .jstree-default-responsive.jstree-rtl .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-open > .jstree-ocl { background-position: 0 0 !important; } .jstree-default-responsive .jstree-closed > .jstree-ocl { background-position: 0 -40px !important; } .jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -40px 0 !important; } .jstree-default-responsive .jstree-themeicon { background-position: -40px -40px; } .jstree-default-responsive .jstree-checkbox, .jstree-default-responsive .jstree-checkbox:hover { background-position: -40px -80px; } .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-responsive .jstree-checked > .jstree-checkbox, .jstree-default-responsive .jstree-checked > .jstree-checkbox:hover { background-position: 0 -80px; } .jstree-default-responsive .jstree-anchor > .jstree-undetermined, .jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover { background-position: 0 -120px; } .jstree-default-responsive .jstree-anchor { font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } .jstree-default-responsive > .jstree-striped { background: transparent; } .jstree-default-responsive .jstree-wholerow { border-top: 1px solid rgba(255, 255, 255, 0.7); border-bottom: 1px solid rgba(64, 64, 64, 0.2); background: #ebebeb; height: 40px; } .jstree-default-responsive .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default-responsive .jstree-wholerow-clicked { background: #beebff; } .jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow { box-shadow: inset 0 -6px 3px -5px #666666; } .jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow { box-shadow: inset 0 6px 3px -5px #666666; border-top: 0; } .jstree-default-responsive .jstree-children .jstree-open + .jstree-open { box-shadow: none; } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-node > .jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-image: url("40px.png"); background-size: 120px 240px; } .jstree-default-responsive .jstree-node { background-position: -80px 0; background-repeat: repeat-y; } .jstree-default-responsive .jstree-last { background-image: none; } .jstree-default-responsive .jstree-leaf > .jstree-ocl { background-position: -40px -120px; } .jstree-default-responsive .jstree-last > .jstree-ocl { background-position: -40px -160px; } .jstree-default-responsive .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-responsive .jstree-file { background: url("40px.png") 0 -160px no-repeat; background-size: 120px 240px; } .jstree-default-responsive .jstree-folder { background: url("40px.png") -40px -40px no-repeat; background-size: 120px 240px; } .jstree-default-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } } PKwL\!G3updraftplus/includes/jstree/themes/default/40px.pngnu[PNG  IHDR*EPLTE333333333333333333333333333333333333333333333333333<<<tRNS !PY\]c7IDATx( Ogͬ-KiقӞ%~xc p.ר]L6k 0`6߼[xwX?"bWB,px/F&fn-w8яOޣ.F/y1qoxۛ '/m={ye>J+9h=a'MW.(5E^ҊWj`+4=Z_$.b=AdNKҫBi",*-_u%Ғ^KY,V$ՙNOI'fiSҋ+Z/I/_.n J+jli´J+.|XY0` 0` 0` 0`gnsoŸ~V^wbhEe?6,S{;mX XH2Xw"I+Zҏ%bcIHl , 6n[7́[b6Ep$E KA%$H% eזufX.:h~A\jqxhhy|aeQb`ʇ4 0` 0` 0` p,'' ÖCy\nJ 츓[Ϯ{ u[Z3xWv? ~WD, o{:;n׷(Q (xŁ9#Q5CQ1x, 4 >ZGF#7)>khٔ3K<4$-Ζféq{``YbsxK-_ė7//`k_/Q^ _EH{ELyaL|i 0` 0` 0` 0`OWܵHs!:pRAmŠ}uPЭ }O~n?+8w e*}4` 0`s a|tIiӴ$[jo1m+yetiRhyZ0` 0` p 0` Ep 0`~:m2\)'fOϳdz<I"-?codã}`?Z8=X<_f0zz2 0` 0`V<d nSvmvxlmï+8|vOR?` ݻ['xK.e zڽWN7畂]z{{\GE'3 NftgBwS7]GSN;;eKM8X<]H>k*3hơVW8 2W"KZY&pKsD`WFk8 xE1ؕG0~7x`WpeKpqu՝#Gp SW^},pԑl4+:u%%]. G]Fa2yת#h|(]׃_GßÕ-e񑖫n.br pfT4[*w,x.x9n>\\=eV^O7Ji A:QOIENDB`PKwL\f3updraftplus/includes/jstree/themes/default/32px.pngnu[PNG  IHDR@`lK(IDATx tU+ EaW6uAx<7$"Ƨ"2Ge`P A%Ic%!}M:aJΞNBN~] m1s~v;}*ݿoݪn kwo-.crqq^  '@ '@ '0N\Y\\\Y8rqdrqqqdrTPm}3ߣ>;"Tu!((Ȣ,fVmfAtN~G?m}̶uۛub"^~ʂ\/iZ!dy cE"(,X(X.A./+H//G~Q P`̓׉֯L<VTJ5?ɑl*Mi2tN ZK ӐP͗E_ $rYNDMIngӎ" p1#Yq>+n18'm"-m* Ұm x["א)!Tť=z@sJ`o, POİҜ|9yy6ED@Mo?av.Şl6\( a8{s;ƥH]ۀQU{óBԝ_&ȜHYX6܇)Jw`U4H﷠Qt`"jV_3gffe@ZZӑEȗEX 0*,V[[,yXqf&6dY4.BqawR,ZXuSCWcީ11~cwjτ/'`"n_4c/-HrVNJM7zclN_ LMKEJJ*RSӐ~CH0 9B(%"cIf Imv&š>c 2/k6d̿ Ao-j:QObN3=7 F۽@*9>G#}05 _-Q]>$&BE"AWzl#|#`s4ÚT!? IJNE,BP򐰸Xo7ƽ /ӄ8$(4 OF? #c4cM`ԡysk14&}#A $<*sM<$Ml NGlZ>&@e^| .|!?`PikտHJ{$=}^pדe!1eBvؘ('@$?=汞o{cr;Aawa\p\U}7tW\UvCwg ok"6T1P-Hb+^r{`L1pld%DO‹#>.ze$]Oi0:,cĀ 0?BÀP7xĠBx0(<)gh xoNQS-'v/k'%, HB@ =Vއcn~-䗓 .g M:6cPfi;)#.J^ d`JjH'`n~NQ#_-*n}XHR[ ]ǣH>nzt2#e7E{ 7ˬmYY|hq%2jWfy)"@EnM:u.qZ`Y| +RwajpKZk> A.ABN 4J$F4ay,@agwd aN,@ard2  aXY& ϰ92  gXar3,@N ð9r '@aX9rm87B(?92$o߂m#gBfLVӶkI6â,qfǺ)˚?1[^﾿QO;y9q,2fsp=ޏy֑>с^1 ~қ"ހA9!@o߮,K;Kt7ETd\X-!Uҵ`9ĽO/a">ֿibdtl&^1pX@g:#ð}.x-=#ƤaD=!B% ZWj2 XP;7oBomJU{?!@oU;(vIP"`5c!BxUK&{}?&Ĥ0DOuqwtGxSa.ju_u}H n~!mW0p8wP> `}plZ`Sϡz WAY /Cb~VTuIB[ zgv.v k` 7KxB'+PBOAą}B1@yYL*q^$(Q0FɵI"N4STO1~'tgel0MHR ߻,oG} geHVw*:!gf1 ܀tJ8LV)[!ҫQr|"Sn|^7w~? {hV ]rEx|}8|8@vD; H(2>i$tOb76%3-H:EB qw#Z\ ۫{0Mlu6,O&r:x ^b6&?R.#>tC4|%èp%]ffȓ'/M~=!/#ّr脯f> gAÇ!P;VQ 0 '@aXard a '@aXard a '@a8rd aN,@a8d '@ ð9 /Ijw$Rs0 `Fu⛶`A?y\ݝqsm;RKJRk{r_q cg8,_S~K.[oj+h֭C $k֘vwSy (߶tMOHHK8Hj<8Ufƻж-^x5˖h*STǎc V6!2NDŖ-7u4R WWge6 } K\\3K}oF6cےogzȜHYX6܇^>'V KPԾ='OFXXXظزسydCP #%X-b RKBd 2U`=99b0V/wWV;?9Xŗ&⋸Ixm$iB^*D|`$\k ̞ ˜9y%05NB$x9 N,(@ɝ9+敜wxHL zɻC mqdO/(T>(jN}UsX칍KJPc6ZnKbIu F!AZ!O0H=zt(uFha\ZL{xz}gGD߃Ix*TB/[^|= B%RNWKNNr,IK?bzV ^Z'@-!0%B Pc=KLp aV "/DB [&a'T]A{h1w&M(IÕ=iJOiz ?W†,@>_kΓzoN$W/Z\觺mkpe*xDAmR$'($ط/r'OPl!C|,fK7n ,@ڧ5o$t`OB%o> %?g类O;#ɐ+D˖&Yɑ<77cwu4M :l6`550ᮌ]S]# d8jqxEvׯ\e+vE{f㈳3bS)1g춷n#Xv^?gan60xy!sZ 4dSUU&=L&+t̯Z:'pd8jx"-ZT wpsn`  lÄo;k;.xy4Iee&F rd8jx%_Z&@{nnB۶v۩.ʕ"eDwNN豚Km,6֔nDPZ,Cd2և!8ޛ&K{X}M*see***PQ^ʊJTWaq'ANM㰜ڋ̞kp.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-hidden,.jstree-node.jstree-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jstree-contextmenu .jstree-anchor{-webkit-user-select:none;-webkit-touch-callout:none;user-select:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;box-shadow:2px 2px 2px #999999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none}.vakata-context li>a{display:block;padding:0 2em 0 2em;text-decoration:none;width:auto;color:black;white-space:nowrap;line-height:2.4em;text-shadow:1px 1px 0 white;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-no-icons{margin-left:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:white;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;text-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context .vakata-contextmenu-disabled>a>i{filter:grayscale(100%)}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:transparent;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:white;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:white;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px 0 2px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default .jstree-anchor,.jstree-default .jstree-animated,.jstree-default .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default .jstree-hovered{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #cccccc}.jstree-default .jstree-context{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #cccccc}.jstree-default .jstree-clicked{background:#beebff;border-radius:2px;box-shadow:inset 0 0 1px #999999}.jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default .jstree-disabled{background:transparent;color:#666666}.jstree-default .jstree-disabled.jstree-hovered{background:transparent;box-shadow:none}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default .jstree-search{font-style:italic;color:#8b0000;font-weight:bold}.jstree-default .jstree-no-checkboxes .jstree-checkbox{display:none !important}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked{background:transparent;box-shadow:none}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#e7f4f9}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:transparent}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#e7f4f9}.jstree-default>.jstree-striped{min-width:100%;display:inline-block;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat}.jstree-default>.jstree-wholerow-ul .jstree-hovered,.jstree-default>.jstree-wholerow-ul .jstree-clicked{background:transparent;box-shadow:none;border-radius:0}.jstree-default .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default .jstree-wholerow-clicked{background:#beebff;background:-webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%);background:linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%)}.jstree-default .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default .jstree-anchor{line-height:24px;height:24px}.jstree-default .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default.jstree-rtl .jstree-node{margin-right:24px}.jstree-default .jstree-wholerow{height:24px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-image:url("32px.png")}.jstree-default .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default .jstree-last{background-image:none}.jstree-default .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default .jstree-themeicon{background-position:-260px -4px}.jstree-default>.jstree-no-dots .jstree-node,.jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default .jstree-disabled{background:transparent}.jstree-default .jstree-disabled.jstree-hovered{background:transparent}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-checkbox{background-position:-164px -4px}.jstree-default .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default>.jstree-striped{background-size:auto 48px}.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default.jstree-rtl .jstree-last{background-image:none}.jstree-default.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default .jstree-file{background:url("32px.png") -100px -68px no-repeat}.jstree-default .jstree-folder{background:url("32px.png") -260px -4px no-repeat}.jstree-default>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default .jstree-ok,#jstree-dnd.jstree-default .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default i{background:transparent;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default .jstree-er{background-position:-36px -68px}.jstree-default .jstree-ellipsis{overflow:hidden}.jstree-default .jstree-ellipsis .jstree-anchor{width:calc(100% - 24px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default.jstree-rtl .jstree-last{background-image:none}.jstree-default-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-small .jstree-wholerow{height:18px}.jstree-default-small .jstree-node,.jstree-default-small .jstree-icon{background-image:url("32px.png")}.jstree-default-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-small .jstree-last{background-image:none}.jstree-default-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-small>.jstree-no-dots .jstree-node,.jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-small .jstree-disabled{background:transparent}.jstree-default-small .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-small .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-small>.jstree-striped{background-size:auto 36px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-small .jstree-file{background:url("32px.png") -103px -71px no-repeat}.jstree-default-small .jstree-folder{background:url("32px.png") -263px -7px no-repeat}.jstree-default-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-small .jstree-ok,#jstree-dnd.jstree-default-small .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-small i{background:transparent;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-small .jstree-er{background-position:-39px -71px}.jstree-default-small .jstree-ellipsis{overflow:hidden}.jstree-default-small .jstree-ellipsis .jstree-anchor{width:calc(100% - 18px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-large .jstree-wholerow{height:32px}.jstree-default-large .jstree-node,.jstree-default-large .jstree-icon{background-image:url("32px.png")}.jstree-default-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-large .jstree-last{background-image:none}.jstree-default-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-large .jstree-themeicon{background-position:-256px 0}.jstree-default-large>.jstree-no-dots .jstree-node,.jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-large .jstree-disabled{background:transparent}.jstree-default-large .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-large .jstree-checkbox{background-position:-160px 0}.jstree-default-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-large .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-large>.jstree-striped{background-size:auto 64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-large.jstree-rtl .jstree-last{background-image:none}.jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-large .jstree-file{background:url("32px.png") -96px -64px no-repeat}.jstree-default-large .jstree-folder{background:url("32px.png") -256px 0 no-repeat}.jstree-default-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-large .jstree-ok,#jstree-dnd.jstree-default-large .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-large i{background:transparent;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-large .jstree-er{background-position:-32px -64px}.jstree-default-large .jstree-ellipsis{overflow:hidden}.jstree-default-large .jstree-ellipsis .jstree-anchor{width:calc(100% - 32px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-large.jstree-rtl .jstree-last{background-image:none}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}#jstree-dnd.jstree-dnd-responsive>i{background:transparent;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url("40px.png");background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url("40px.png");background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-responsive .jstree-icon{background-image:url("40px.png")}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px;background:transparent}.jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-responsive .jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-responsive .jstree-leaf>.jstree-ocl,.jstree-default-responsive.jstree-rtl .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-responsive .jstree-open>.jstree-ocl{background-position:0 0 !important}.jstree-default-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px !important}.jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0 !important}.jstree-default-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-responsive .jstree-checked>.jstree-checkbox,.jstree-default-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-responsive .jstree-anchor{font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}.jstree-default-responsive>.jstree-striped{background:transparent}.jstree-default-responsive .jstree-wholerow{border-top:1px solid rgba(255,255,255,0.7);border-bottom:1px solid rgba(64,64,64,0.2);background:#ebebeb;height:40px}.jstree-default-responsive .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default-responsive .jstree-wholerow-clicked{background:#beebff}.jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #666666}.jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #666666;border-top:0}.jstree-default-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-node>.jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-image:url("40px.png");background-size:120px 240px}.jstree-default-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-responsive .jstree-last{background-image:none}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-responsive .jstree-file{background:url("40px.png") 0 -160px no-repeat;background-size:120px 240px}.jstree-default-responsive .jstree-folder{background:url("40px.png") -40px -40px no-repeat;background-size:120px 240px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}PKwL\JUW<updraftplus/includes/jstree/themes/default-dark/throbber.gifnu[GIF89a@@@pppPPP```999hhhXXXxxx333! NETSCAPE2.0!Created with ajaxload.info! ,@pɇhuʤ" 3 @J@"S , !$JJdσ-ד%LXwVrP5 g*"B` :1 o!Y3 ! ,]BN%I8"d,!p#a BI0![փXʇah@7a([/` (4U%s!sj#! ,ZLX6BG&9!T1@HJ=M!3 R .|V}F5$p19S"! ,\) 275&D %!VAX% QPpr٥!( ` Pㄐ}B  &-! ,EɉBX)!(^gPpX^OaJ0Arɔ>C A9N"BkJfPE! ,k!&S!$N'PaG(!A@L8`Ua0P$،a(4A6O 00"AQfJPh #il~! ,[Xi xJ 2> YH-t i&$h Cq8N#<1Px nSAx\y ĚH;1>8)! ,VI LZ/i] P8Hn !@5H+k±b:SWJq82ڱ4c! ,]X$\guHael4x/( 'Y0B M!8xFC0,v8z~ > !6J9! ,Zji%ZmNLB\TINS ! B İr&Ɓ)Y Ñ8 Cf(-Lsp`u(5&E! ,XIx"PE BRMZӉҢgGCU$p>b34$ 3 W`&Hހ"! ,ZIR|RiㅰY+%$XExpa$N`#0dNӤ@HHN}h<F`}q/)D;PKwL\<9!ɠ9updraftplus/includes/jstree/themes/default-dark/style.cssnu[/* jsTree default dark theme */ .jstree-node, .jstree-children, .jstree-container-ul { display: block; margin: 0; padding: 0; list-style-type: none; list-style-image: none; } .jstree-node { white-space: nowrap; } .jstree-anchor { display: inline-block; color: black; white-space: nowrap; padding: 0 4px 0 1px; margin: 0; vertical-align: top; } .jstree-anchor:focus { outline: 0; } .jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration: none; color: inherit; } .jstree-icon { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-icon:empty { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-ocl { cursor: pointer; } .jstree-leaf > .jstree-ocl { cursor: default; } .jstree .jstree-open > .jstree-children { display: block; } .jstree .jstree-closed > .jstree-children, .jstree .jstree-leaf > .jstree-children { display: none; } .jstree-anchor > .jstree-themeicon { margin-right: 2px; } .jstree-no-icons .jstree-themeicon, .jstree-anchor > .jstree-themeicon-hidden { display: none; } .jstree-hidden, .jstree-node.jstree-hidden { display: none; } .jstree-rtl .jstree-anchor { padding: 0 1px 0 4px; } .jstree-rtl .jstree-anchor > .jstree-themeicon { margin-left: 2px; margin-right: 0; } .jstree-rtl .jstree-node { margin-left: 0; } .jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; } .jstree-wholerow-ul { position: relative; display: inline-block; min-width: 100%; } .jstree-wholerow-ul .jstree-leaf > .jstree-ocl { cursor: pointer; } .jstree-wholerow-ul .jstree-anchor, .jstree-wholerow-ul .jstree-icon { position: relative; } .jstree-wholerow-ul .jstree-wholerow { width: 100%; cursor: pointer; position: absolute; left: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .jstree-contextmenu .jstree-anchor { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ user-select: none; } .vakata-context { display: none; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; } .vakata-context ul { list-style: none; left: 100%; margin-top: -2.7em; margin-left: -4px; } .vakata-context .vakata-context-right ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context li { list-style: none; } .vakata-context li > a { display: block; padding: 0 2em 0 2em; text-decoration: none; width: auto; color: black; white-space: nowrap; line-height: 2.4em; text-shadow: 1px 1px 0 white; border-radius: 1px; } .vakata-context li > a:hover { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context li > a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position: right center; background-repeat: no-repeat; } .vakata-context li > a:focus { outline: 0; } .vakata-context .vakata-context-no-icons { margin-left: 0; } .vakata-context .vakata-context-hover > a { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context .vakata-context-separator > a, .vakata-context .vakata-context-separator > a:hover { background: white; border: 0; border-top: 1px solid #e2e3e3; height: 1px; min-height: 1px; max-height: 1px; padding: 0; margin: 0 0 0 2.4em; border-left: 1px solid #e0e0e0; text-shadow: 0 0 0 transparent; box-shadow: 0 0 0 transparent; border-radius: 0; } .vakata-context .vakata-contextmenu-disabled a, .vakata-context .vakata-contextmenu-disabled a:hover { color: silver; background-color: transparent; border: 0; box-shadow: 0 0 0; } .vakata-context .vakata-contextmenu-disabled > a > i { filter: grayscale(100%); } .vakata-context li > a > i { text-decoration: none; display: inline-block; width: 2.4em; height: 2.4em; background: transparent; margin: 0 0 0 -2em; vertical-align: top; text-align: center; line-height: 2.4em; } .vakata-context li > a > i:empty { width: 2.4em; line-height: 2.4em; } .vakata-context li > a .vakata-contextmenu-sep { display: inline-block; width: 1px; height: 2.4em; background: white; margin: 0 0.5em 0 0; border-left: 1px solid #e2e3e3; } .vakata-context .vakata-contextmenu-shortcut { font-size: 0.8em; color: silver; opacity: 0.5; display: none; } .vakata-context-rtl ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context-rtl li > a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position: left center; background-repeat: no-repeat; } .vakata-context-rtl .vakata-context-separator > a { margin: 0 2.4em 0 0; border-left: 0; border-right: 1px solid #e2e3e3; } .vakata-context-rtl .vakata-context-left ul { right: auto; left: 100%; margin-left: -4px; margin-right: auto; } .vakata-context-rtl li > a > i { margin: 0 -2em 0 0; } .vakata-context-rtl li > a .vakata-contextmenu-sep { margin: 0 0 0 0.5em; border-left-color: white; background: #e2e3e3; } #jstree-marker { position: absolute; top: 0; left: 0; margin: -5px 0 0 0; padding: 0; border-right: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid; width: 0; height: 0; font-size: 0; line-height: 0; } #jstree-dnd { line-height: 16px; margin: 0; padding: 4px; } #jstree-dnd .jstree-icon, #jstree-dnd .jstree-copy { display: inline-block; text-decoration: none; margin: 0 2px 0 0; padding: 0; width: 16px; height: 16px; } #jstree-dnd .jstree-ok { background: green; } #jstree-dnd .jstree-er { background: red; } #jstree-dnd .jstree-copy { margin: 0 2px 0 2px; } .jstree-default-dark .jstree-node, .jstree-default-dark .jstree-icon { background-repeat: no-repeat; background-color: transparent; } .jstree-default-dark .jstree-anchor, .jstree-default-dark .jstree-animated, .jstree-default-dark .jstree-wholerow { transition: background-color 0.15s, box-shadow 0.15s; } .jstree-default-dark .jstree-hovered { background: #555; border-radius: 2px; box-shadow: inset 0 0 1px #555; } .jstree-default-dark .jstree-context { background: #555; border-radius: 2px; box-shadow: inset 0 0 1px #555; } .jstree-default-dark .jstree-clicked { background: #5fa2db; border-radius: 2px; box-shadow: inset 0 0 1px #666666; } .jstree-default-dark .jstree-no-icons .jstree-anchor > .jstree-themeicon { display: none; } .jstree-default-dark .jstree-disabled { background: transparent; color: #666666; } .jstree-default-dark .jstree-disabled.jstree-hovered { background: transparent; box-shadow: none; } .jstree-default-dark .jstree-disabled.jstree-clicked { background: #333333; } .jstree-default-dark .jstree-disabled > .jstree-icon { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark .jstree-search { font-style: italic; color: #ffffff; font-weight: bold; } .jstree-default-dark .jstree-no-checkboxes .jstree-checkbox { display: none !important; } .jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked { background: transparent; box-shadow: none; } .jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { background: #555; } .jstree-default-dark.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked { background: transparent; } .jstree-default-dark.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { background: #555; } .jstree-default-dark > .jstree-striped { min-width: 100%; display: inline-block; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; } .jstree-default-dark > .jstree-wholerow-ul .jstree-hovered, .jstree-default-dark > .jstree-wholerow-ul .jstree-clicked { background: transparent; box-shadow: none; border-radius: 0; } .jstree-default-dark .jstree-wholerow { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .jstree-default-dark .jstree-wholerow-hovered { background: #555; } .jstree-default-dark .jstree-wholerow-clicked { background: #5fa2db; background: -webkit-linear-gradient(top, #5fa2db 0%, #5fa2db 100%); background: linear-gradient(to bottom, #5fa2db 0%, #5fa2db 100%); } .jstree-default-dark .jstree-node { min-height: 24px; line-height: 24px; margin-left: 24px; min-width: 24px; } .jstree-default-dark .jstree-anchor { line-height: 24px; height: 24px; } .jstree-default-dark .jstree-icon { width: 24px; height: 24px; line-height: 24px; } .jstree-default-dark .jstree-icon:empty { width: 24px; height: 24px; line-height: 24px; } .jstree-default-dark.jstree-rtl .jstree-node { margin-right: 24px; } .jstree-default-dark .jstree-wholerow { height: 24px; } .jstree-default-dark .jstree-node, .jstree-default-dark .jstree-icon { background-image: url("32px.png"); } .jstree-default-dark .jstree-node { background-position: -292px -4px; background-repeat: repeat-y; } .jstree-default-dark .jstree-last { background-image: none; } .jstree-default-dark .jstree-open > .jstree-ocl { background-position: -132px -4px; } .jstree-default-dark .jstree-closed > .jstree-ocl { background-position: -100px -4px; } .jstree-default-dark .jstree-leaf > .jstree-ocl { background-position: -68px -4px; } .jstree-default-dark .jstree-themeicon { background-position: -260px -4px; } .jstree-default-dark > .jstree-no-dots .jstree-node, .jstree-default-dark > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -4px; } .jstree-default-dark > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -4px; } .jstree-default-dark .jstree-disabled { background: transparent; } .jstree-default-dark .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-dark .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-dark .jstree-checkbox { background-position: -164px -4px; } .jstree-default-dark .jstree-checkbox:hover { background-position: -164px -36px; } .jstree-default-dark.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-dark .jstree-checked > .jstree-checkbox { background-position: -228px -4px; } .jstree-default-dark.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-dark .jstree-checked > .jstree-checkbox:hover { background-position: -228px -36px; } .jstree-default-dark .jstree-anchor > .jstree-undetermined { background-position: -196px -4px; } .jstree-default-dark .jstree-anchor > .jstree-undetermined:hover { background-position: -196px -36px; } .jstree-default-dark .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark > .jstree-striped { background-size: auto 48px; } .jstree-default-dark.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-dark.jstree-rtl .jstree-last { background-image: none; } .jstree-default-dark.jstree-rtl .jstree-open > .jstree-ocl { background-position: -132px -36px; } .jstree-default-dark.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -100px -36px; } .jstree-default-dark.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -68px -36px; } .jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -36px; } .jstree-default-dark.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -36px; } .jstree-default-dark .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-dark .jstree-file { background: url("32px.png") -100px -68px no-repeat; } .jstree-default-dark .jstree-folder { background: url("32px.png") -260px -4px no-repeat; } .jstree-default-dark > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-dark { line-height: 24px; padding: 0 4px; } #jstree-dnd.jstree-default-dark .jstree-ok, #jstree-dnd.jstree-default-dark .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-dark i { background: transparent; width: 24px; height: 24px; line-height: 24px; } #jstree-dnd.jstree-default-dark .jstree-ok { background-position: -4px -68px; } #jstree-dnd.jstree-default-dark .jstree-er { background-position: -36px -68px; } .jstree-default-dark .jstree-ellipsis { overflow: hidden; } .jstree-default-dark .jstree-ellipsis .jstree-anchor { width: calc(100% - 24px + 5px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-dark.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default-dark.jstree-rtl .jstree-last { background-image: none; } .jstree-default-dark-small .jstree-node { min-height: 18px; line-height: 18px; margin-left: 18px; min-width: 18px; } .jstree-default-dark-small .jstree-anchor { line-height: 18px; height: 18px; } .jstree-default-dark-small .jstree-icon { width: 18px; height: 18px; line-height: 18px; } .jstree-default-dark-small .jstree-icon:empty { width: 18px; height: 18px; line-height: 18px; } .jstree-default-dark-small.jstree-rtl .jstree-node { margin-right: 18px; } .jstree-default-dark-small .jstree-wholerow { height: 18px; } .jstree-default-dark-small .jstree-node, .jstree-default-dark-small .jstree-icon { background-image: url("32px.png"); } .jstree-default-dark-small .jstree-node { background-position: -295px -7px; background-repeat: repeat-y; } .jstree-default-dark-small .jstree-last { background-image: none; } .jstree-default-dark-small .jstree-open > .jstree-ocl { background-position: -135px -7px; } .jstree-default-dark-small .jstree-closed > .jstree-ocl { background-position: -103px -7px; } .jstree-default-dark-small .jstree-leaf > .jstree-ocl { background-position: -71px -7px; } .jstree-default-dark-small .jstree-themeicon { background-position: -263px -7px; } .jstree-default-dark-small > .jstree-no-dots .jstree-node, .jstree-default-dark-small > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark-small > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -7px; } .jstree-default-dark-small > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -7px; } .jstree-default-dark-small .jstree-disabled { background: transparent; } .jstree-default-dark-small .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-dark-small .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-dark-small .jstree-checkbox { background-position: -167px -7px; } .jstree-default-dark-small .jstree-checkbox:hover { background-position: -167px -39px; } .jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-dark-small .jstree-checked > .jstree-checkbox { background-position: -231px -7px; } .jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-dark-small .jstree-checked > .jstree-checkbox:hover { background-position: -231px -39px; } .jstree-default-dark-small .jstree-anchor > .jstree-undetermined { background-position: -199px -7px; } .jstree-default-dark-small .jstree-anchor > .jstree-undetermined:hover { background-position: -199px -39px; } .jstree-default-dark-small .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark-small > .jstree-striped { background-size: auto 36px; } .jstree-default-dark-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-dark-small.jstree-rtl .jstree-last { background-image: none; } .jstree-default-dark-small.jstree-rtl .jstree-open > .jstree-ocl { background-position: -135px -39px; } .jstree-default-dark-small.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -103px -39px; } .jstree-default-dark-small.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -71px -39px; } .jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -39px; } .jstree-default-dark-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -39px; } .jstree-default-dark-small .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark-small > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-dark-small .jstree-file { background: url("32px.png") -103px -71px no-repeat; } .jstree-default-dark-small .jstree-folder { background: url("32px.png") -263px -7px no-repeat; } .jstree-default-dark-small > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-dark-small { line-height: 18px; padding: 0 4px; } #jstree-dnd.jstree-default-dark-small .jstree-ok, #jstree-dnd.jstree-default-dark-small .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-dark-small i { background: transparent; width: 18px; height: 18px; line-height: 18px; } #jstree-dnd.jstree-default-dark-small .jstree-ok { background-position: -7px -71px; } #jstree-dnd.jstree-default-dark-small .jstree-er { background-position: -39px -71px; } .jstree-default-dark-small .jstree-ellipsis { overflow: hidden; } .jstree-default-dark-small .jstree-ellipsis .jstree-anchor { width: calc(100% - 18px + 5px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-dark-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-dark-small.jstree-rtl .jstree-last { background-image: none; } .jstree-default-dark-large .jstree-node { min-height: 32px; line-height: 32px; margin-left: 32px; min-width: 32px; } .jstree-default-dark-large .jstree-anchor { line-height: 32px; height: 32px; } .jstree-default-dark-large .jstree-icon { width: 32px; height: 32px; line-height: 32px; } .jstree-default-dark-large .jstree-icon:empty { width: 32px; height: 32px; line-height: 32px; } .jstree-default-dark-large.jstree-rtl .jstree-node { margin-right: 32px; } .jstree-default-dark-large .jstree-wholerow { height: 32px; } .jstree-default-dark-large .jstree-node, .jstree-default-dark-large .jstree-icon { background-image: url("32px.png"); } .jstree-default-dark-large .jstree-node { background-position: -288px 0px; background-repeat: repeat-y; } .jstree-default-dark-large .jstree-last { background-image: none; } .jstree-default-dark-large .jstree-open > .jstree-ocl { background-position: -128px 0px; } .jstree-default-dark-large .jstree-closed > .jstree-ocl { background-position: -96px 0px; } .jstree-default-dark-large .jstree-leaf > .jstree-ocl { background-position: -64px 0px; } .jstree-default-dark-large .jstree-themeicon { background-position: -256px 0px; } .jstree-default-dark-large > .jstree-no-dots .jstree-node, .jstree-default-dark-large > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark-large > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px 0px; } .jstree-default-dark-large > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px 0px; } .jstree-default-dark-large .jstree-disabled { background: transparent; } .jstree-default-dark-large .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-dark-large .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-dark-large .jstree-checkbox { background-position: -160px 0px; } .jstree-default-dark-large .jstree-checkbox:hover { background-position: -160px -32px; } .jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-dark-large .jstree-checked > .jstree-checkbox { background-position: -224px 0px; } .jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-dark-large .jstree-checked > .jstree-checkbox:hover { background-position: -224px -32px; } .jstree-default-dark-large .jstree-anchor > .jstree-undetermined { background-position: -192px 0px; } .jstree-default-dark-large .jstree-anchor > .jstree-undetermined:hover { background-position: -192px -32px; } .jstree-default-dark-large .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark-large > .jstree-striped { background-size: auto 64px; } .jstree-default-dark-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-dark-large.jstree-rtl .jstree-last { background-image: none; } .jstree-default-dark-large.jstree-rtl .jstree-open > .jstree-ocl { background-position: -128px -32px; } .jstree-default-dark-large.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -96px -32px; } .jstree-default-dark-large.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -64px -32px; } .jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px -32px; } .jstree-default-dark-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px -32px; } .jstree-default-dark-large .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark-large > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-dark-large .jstree-file { background: url("32px.png") -96px -64px no-repeat; } .jstree-default-dark-large .jstree-folder { background: url("32px.png") -256px 0px no-repeat; } .jstree-default-dark-large > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-dark-large { line-height: 32px; padding: 0 4px; } #jstree-dnd.jstree-default-dark-large .jstree-ok, #jstree-dnd.jstree-default-dark-large .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-dark-large i { background: transparent; width: 32px; height: 32px; line-height: 32px; } #jstree-dnd.jstree-default-dark-large .jstree-ok { background-position: 0px -64px; } #jstree-dnd.jstree-default-dark-large .jstree-er { background-position: -32px -64px; } .jstree-default-dark-large .jstree-ellipsis { overflow: hidden; } .jstree-default-dark-large .jstree-ellipsis .jstree-anchor { width: calc(100% - 32px + 5px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-dark-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-dark-large.jstree-rtl .jstree-last { background-image: none; } @media (max-width: 768px) { #jstree-dnd.jstree-dnd-responsive { line-height: 40px; font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } #jstree-dnd.jstree-dnd-responsive > i { background: transparent; width: 40px; height: 40px; } #jstree-dnd.jstree-dnd-responsive > .jstree-ok { background-image: url("40px.png"); background-position: 0 -200px; background-size: 120px 240px; } #jstree-dnd.jstree-dnd-responsive > .jstree-er { background-image: url("40px.png"); background-position: -40px -200px; background-size: 120px 240px; } #jstree-marker.jstree-dnd-responsive { border-left-width: 10px; border-top-width: 10px; border-bottom-width: 10px; margin-top: -10px; } } @media (max-width: 768px) { .jstree-default-dark-responsive { /* .jstree-open > .jstree-ocl, .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } */ } .jstree-default-dark-responsive .jstree-icon { background-image: url("40px.png"); } .jstree-default-dark-responsive .jstree-node, .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark-responsive .jstree-node { min-height: 40px; line-height: 40px; margin-left: 40px; min-width: 40px; white-space: nowrap; } .jstree-default-dark-responsive .jstree-anchor { line-height: 40px; height: 40px; } .jstree-default-dark-responsive .jstree-icon, .jstree-default-dark-responsive .jstree-icon:empty { width: 40px; height: 40px; line-height: 40px; } .jstree-default-dark-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; } .jstree-default-dark-responsive.jstree-rtl .jstree-node { margin-left: 0; margin-right: 40px; background: transparent; } .jstree-default-dark-responsive.jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; } .jstree-default-dark-responsive .jstree-ocl, .jstree-default-dark-responsive .jstree-themeicon, .jstree-default-dark-responsive .jstree-checkbox { background-size: 120px 240px; } .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl, .jstree-default-dark-responsive.jstree-rtl .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-dark-responsive .jstree-open > .jstree-ocl { background-position: 0 0 !important; } .jstree-default-dark-responsive .jstree-closed > .jstree-ocl { background-position: 0 -40px !important; } .jstree-default-dark-responsive.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -40px 0 !important; } .jstree-default-dark-responsive .jstree-themeicon { background-position: -40px -40px; } .jstree-default-dark-responsive .jstree-checkbox, .jstree-default-dark-responsive .jstree-checkbox:hover { background-position: -40px -80px; } .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-dark-responsive .jstree-checked > .jstree-checkbox, .jstree-default-dark-responsive .jstree-checked > .jstree-checkbox:hover { background-position: 0 -80px; } .jstree-default-dark-responsive .jstree-anchor > .jstree-undetermined, .jstree-default-dark-responsive .jstree-anchor > .jstree-undetermined:hover { background-position: 0 -120px; } .jstree-default-dark-responsive .jstree-anchor { font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } .jstree-default-dark-responsive > .jstree-striped { background: transparent; } .jstree-default-dark-responsive .jstree-wholerow { border-top: 1px solid #666; border-bottom: 1px solid #000; background: #333333; height: 40px; } .jstree-default-dark-responsive .jstree-wholerow-hovered { background: #555; } .jstree-default-dark-responsive .jstree-wholerow-clicked { background: #5fa2db; } .jstree-default-dark-responsive .jstree-children .jstree-last > .jstree-wholerow { box-shadow: inset 0 -6px 3px -5px #111111; } .jstree-default-dark-responsive .jstree-children .jstree-open > .jstree-wholerow { box-shadow: inset 0 6px 3px -5px #111111; border-top: 0; } .jstree-default-dark-responsive .jstree-children .jstree-open + .jstree-open { box-shadow: none; } .jstree-default-dark-responsive .jstree-node, .jstree-default-dark-responsive .jstree-icon, .jstree-default-dark-responsive .jstree-node > .jstree-ocl, .jstree-default-dark-responsive .jstree-themeicon, .jstree-default-dark-responsive .jstree-checkbox { background-image: url("40px.png"); background-size: 120px 240px; } .jstree-default-dark-responsive .jstree-node { background-position: -80px 0; background-repeat: repeat-y; } .jstree-default-dark-responsive .jstree-last { background-image: none; } .jstree-default-dark-responsive .jstree-leaf > .jstree-ocl { background-position: -40px -120px; } .jstree-default-dark-responsive .jstree-last > .jstree-ocl { background-position: -40px -160px; } .jstree-default-dark-responsive .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark-responsive .jstree-file { background: url("40px.png") 0 -160px no-repeat; background-size: 120px 240px; } .jstree-default-dark-responsive .jstree-folder { background: url("40px.png") -40px -40px no-repeat; background-size: 120px 240px; } .jstree-default-dark-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } } .jstree-default-dark { background: #333; } .jstree-default-dark .jstree-anchor { color: #999; text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5); } .jstree-default-dark .jstree-clicked, .jstree-default-dark .jstree-checked { color: white; } .jstree-default-dark .jstree-hovered { color: white; } #jstree-marker.jstree-default-dark { border-left-color: #999; background: transparent; } .jstree-default-dark .jstree-anchor > .jstree-icon { opacity: 0.75; } .jstree-default-dark .jstree-clicked > .jstree-icon, .jstree-default-dark .jstree-hovered > .jstree-icon, .jstree-default-dark .jstree-checked > .jstree-icon { opacity: 1; } .jstree-default-dark.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default-dark.jstree-rtl .jstree-last { background-image: none; } .jstree-default-dark-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-dark-small.jstree-rtl .jstree-last { background-image: none; } .jstree-default-dark-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-dark-large.jstree-rtl .jstree-last { background-image: none; } PKwL\`~~8updraftplus/includes/jstree/themes/default-dark/40px.pngnu[PNG  IHDR*PLTE333ssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ XXX$$$dddhhhooo000UUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^TTTNNNOOOPPPQQQRRRSSSTTTUUUVVV[[[KKKLLLUtRNS %&(01369:=>>CEGGGGIKTTTTTTTTTTUX\\\\\\\\\\ahhy? IDATxkՙs5#ØEdB[98OLgq͐XXl \l Zl:d9|6Ͱ;J3@]V:sms,2}E6cx`sD#P#lű;Tz|6WB׽. YPQ^7pM5xy]m\gVn.T}M]{mjYxǬ=՛)pڹ5iwݼcuîb8zZh̥=}xP+ mXYJucu!HA)ZB skJ İ.A ]SrTYH)U1:`駚F&owde3 "p[~S !,1~Vm<UBp%Tj"3,zt/w^BN;B|j٣0=띻![Z{{{0 oKHn!֏6 dpi sB-g? ~y, :kkkkkkd*冎R+mjBhǑ߆e4#Xx5ȬTsexjqu~"$d+&63^ -N > bkƫAs՞DGY9/֤3^ $^|ne_~ؙjmpJ2^ [P(Gx5X}woUH}sD kQz A(iqHG٤Ұ4"a ! KͰ4V=Fñ(=񈡸L+~~S؉]Z/[:WقP`@&%2E<5іD"lJe &O?s%޼ :\]g^iؚg/>FMzqњ wS8CMzqeޒ P) 6`,2#f\UBpHޜ1Ǿs d}_M 0?VL'oxĥ>薂;#l"8ʢ 2*Gx3>8oK[۾ؗ{KaExqg^,9eF"y|%SaaGVTOdԎ'}W <>#a]sga ɫηy&C x}-*T0bjY4Dxa` okkkkkkeث&:8/p#5Ve&֨-J.[amѺ4{Udi[yR*0r7v$S}r.#X#cBڛ5/M@6(9~'6zOp^O m:hw]RYoHV@X}|>GܵR .z=9יmL=Dj ŧoyYK;f<_yrn6@xi)uƵ'wK9_35n1M{\:[O<1f}ia6ܘf>^?u\d{D\y7ӾL]14y\0.TPV9D&7^\kyw+T#ӓ*`uU%h];L<|'pT7ZMFh]yskS'&-Sؕ7H_D^N`%X-I^"Fʛ?J_rNFKcʛĻE>  .h $`+[$ 1Ø]oycy=)bT\dD s*5kվOP rTi@̘N :FHp>1\&<t5X5X5X5XGlkkkkkkkk\+mG Uh WA#* pt_P@Q8RG*Uh W_L-‹~pS+W 2_Ucئ{2ncơOkkGܔaj؃r[DMPLMYZX*T,Rpzڍt%U6p_݈P䶢 \mE?>\ŪWc2U RRI _1:nT׈_m?83e0MƃZ+(Vd"jWƬ>dp5Z9=#CJ/}XW /_w;A \%ʿM0֑,HJa"*p_r'JG)U0 WA#*0pT_F$_ #}/t` ` ` I{-)]1zsݞ}fl[=dicwM8MIQ' Lb[<Ȱ4 & ƵڪZ^9jI_r{M h=ڟ&hDS?j3'>?ͯx/>_O8 (0ljϥ%VیK I-#[AӪ4LZ|#j7؈YR^`oD ,DQ  {UNop%!z 1l=%^8F'9L_{,je %v"~'=#,D gZ&+?xO<5Fi3^`sFKji R9m \<ѷb1L֧kp :#_t5X5X58\h ῡ6٘"<ϻ?:a]Fo舆yޅZ8<J6x.El.`(Y :P`wt.9Qϥ|g++:isz>+As_%p \x[Zhsͫy>y[s-\-^bexm6VVU\#_pR[e3t),'bv"Sjw{()\ XvڹΩGRt6%wVx`/rVYX`Ł{fwv7w8c98uoGm}x{+}8owpt!v@]ݚx4^`]xU/y; ~QɉGVx_'}#Z~NO_JA@t}  "gPa~1іoVO_#"z jmEe^'BuBK<*vENSN@"ƌ5.e+e8M:yEzF<#(U@` `;g/;_|?p \:xY QfD @OF`{Ug/n љA I+l:IYj?:Ad7;Z [h1 C^8Zh KII< FQ+}{{ 38?2=,}ck118f:h{^~ײc(%6\;eZys٨=n;7}pYcB/[4Yo'b ~bɩ{d&p$$zޤU8%'֔Z+ߪ4jamvFZ-ĄbAO<*˝:#S;X1}/RHU+,uھ>#k) gWw$W 2 s:u'1Hj."3OC+EE̠Dr}{rJ(z- 2w,})GO9U4;fxQQsaZ*wع4[ϬCJ=j0`ՓB(aLv9g.+EH>}sreLvYa-)v;#>wj;W[ mC0s^Irs.g+}0x_^~ƟxUeuʼnrqd~q\jߗ~)bb_5ߏ{/g<b۳ؘ0pZ/opep"dxAY/"MZqñ;Jkp :۶?9#2=-wNIENDB`PKwL\D8updraftplus/includes/jstree/themes/default-dark/32px.pngnu[PNG  IHDR@`[[PLTEհ???Ƌ hhh虙ȏxxxt{FtRNS1 =%+Oa;y۵D̐9Fi"IDATx S0IҴ,"(nBZJ[o{ &}@fz?zOk,֛M D v l`Sp:@98դ- t9wMuwONky Ceš ,'\:z(`M¤\0Z3&E/ }M?|EZy~6?+?R )?/!& $‡TW0Z~~ 4 VϐUJY?V<bSx~F$.mKI ]~M'yzxq5Oa(?")#U5=]'I$۽X(0ZAFf 7 s@5dM.tr{meHru0d 0kR'~ԱOu.% @؛=|_z4?h=1ʯW)4?hGT`(WUG_j-5O)8 :ho{>|08Z{VJ @Yy7|;{V87q>׈!/7q>1f=㴷H7""t l R l 1-?8N7zƁ\{e䌣ߎףd6>DAzd|< BL^ǁ_ K!#l,y&)6PgD'G5e"@cXS~s;V]/ǭ VY~:9$?A~@i"w4?bSY3`IEQal(6QďK8` ;챠g0/P'FO"k,K)g4_)FOl *n ~/ӷ@5@4A +l8acPf " -Ql&ѭ\k5 .jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-hidden,.jstree-node.jstree-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jstree-contextmenu .jstree-anchor{-webkit-user-select:none;-webkit-touch-callout:none;user-select:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;box-shadow:2px 2px 2px #999999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none}.vakata-context li>a{display:block;padding:0 2em 0 2em;text-decoration:none;width:auto;color:black;white-space:nowrap;line-height:2.4em;text-shadow:1px 1px 0 white;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-no-icons{margin-left:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:white;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;text-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context .vakata-contextmenu-disabled>a>i{filter:grayscale(100%)}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:transparent;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:white;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:white;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px 0 2px}.jstree-default-dark .jstree-node,.jstree-default-dark .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default-dark .jstree-anchor,.jstree-default-dark .jstree-animated,.jstree-default-dark .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default-dark .jstree-hovered{background:#555;border-radius:2px;box-shadow:inset 0 0 1px #555}.jstree-default-dark .jstree-context{background:#555;border-radius:2px;box-shadow:inset 0 0 1px #555}.jstree-default-dark .jstree-clicked{background:#5fa2db;border-radius:2px;box-shadow:inset 0 0 1px #666666}.jstree-default-dark .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default-dark .jstree-disabled{background:transparent;color:#666666}.jstree-default-dark .jstree-disabled.jstree-hovered{background:transparent;box-shadow:none}.jstree-default-dark .jstree-disabled.jstree-clicked{background:#333333}.jstree-default-dark .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark .jstree-search{font-style:italic;color:#ffffff;font-weight:bold}.jstree-default-dark .jstree-no-checkboxes .jstree-checkbox{display:none !important}.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked{background:transparent;box-shadow:none}.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#555}.jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:transparent}.jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#555}.jstree-default-dark>.jstree-striped{min-width:100%;display:inline-block;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat}.jstree-default-dark>.jstree-wholerow-ul .jstree-hovered,.jstree-default-dark>.jstree-wholerow-ul .jstree-clicked{background:transparent;box-shadow:none;border-radius:0}.jstree-default-dark .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default-dark .jstree-wholerow-hovered{background:#555}.jstree-default-dark .jstree-wholerow-clicked{background:#5fa2db;background:-webkit-linear-gradient(top, #5fa2db 0%, #5fa2db 100%);background:linear-gradient(to bottom, #5fa2db 0%, #5fa2db 100%)}.jstree-default-dark .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default-dark .jstree-anchor{line-height:24px;height:24px}.jstree-default-dark .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default-dark .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default-dark.jstree-rtl .jstree-node{margin-right:24px}.jstree-default-dark .jstree-wholerow{height:24px}.jstree-default-dark .jstree-node,.jstree-default-dark .jstree-icon{background-image:url("32px.png")}.jstree-default-dark .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default-dark .jstree-last{background-image:none}.jstree-default-dark .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default-dark .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default-dark .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default-dark .jstree-themeicon{background-position:-260px -4px}.jstree-default-dark>.jstree-no-dots .jstree-node,.jstree-default-dark>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default-dark>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default-dark .jstree-disabled{background:transparent}.jstree-default-dark .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark .jstree-checkbox{background-position:-164px -4px}.jstree-default-dark .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default-dark .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default-dark .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default-dark .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark>.jstree-striped{background-size:auto 48px}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default-dark.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default-dark.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default-dark .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark .jstree-file{background:url("32px.png") -100px -68px no-repeat}.jstree-default-dark .jstree-folder{background:url("32px.png") -260px -4px no-repeat}.jstree-default-dark>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default-dark .jstree-ok,#jstree-dnd.jstree-default-dark .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark i{background:transparent;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default-dark .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default-dark .jstree-er{background-position:-36px -68px}.jstree-default-dark .jstree-ellipsis{overflow:hidden}.jstree-default-dark .jstree-ellipsis .jstree-anchor{width:calc(100% - 24px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default-dark.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-dark-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-dark-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-dark-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-dark-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-dark-small .jstree-wholerow{height:18px}.jstree-default-dark-small .jstree-node,.jstree-default-dark-small .jstree-icon{background-image:url("32px.png")}.jstree-default-dark-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-dark-small .jstree-last{background-image:none}.jstree-default-dark-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-dark-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-dark-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-dark-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-dark-small>.jstree-no-dots .jstree-node,.jstree-default-dark-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-dark-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-dark-small .jstree-disabled{background:transparent}.jstree-default-dark-small .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-dark-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-dark-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-dark-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-dark-small .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark-small>.jstree-striped{background-size:auto 36px}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-dark-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-dark-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-dark-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark-small .jstree-file{background:url("32px.png") -103px -71px no-repeat}.jstree-default-dark-small .jstree-folder{background:url("32px.png") -263px -7px no-repeat}.jstree-default-dark-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-dark-small .jstree-ok,#jstree-dnd.jstree-default-dark-small .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark-small i{background:transparent;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-dark-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-dark-small .jstree-er{background-position:-39px -71px}.jstree-default-dark-small .jstree-ellipsis{overflow:hidden}.jstree-default-dark-small .jstree-ellipsis .jstree-anchor{width:calc(100% - 18px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-dark-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-dark-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-dark-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-dark-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-dark-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-dark-large .jstree-wholerow{height:32px}.jstree-default-dark-large .jstree-node,.jstree-default-dark-large .jstree-icon{background-image:url("32px.png")}.jstree-default-dark-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-dark-large .jstree-last{background-image:none}.jstree-default-dark-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-dark-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-dark-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-dark-large .jstree-themeicon{background-position:-256px 0}.jstree-default-dark-large>.jstree-no-dots .jstree-node,.jstree-default-dark-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-dark-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-dark-large .jstree-disabled{background:transparent}.jstree-default-dark-large .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark-large .jstree-checkbox{background-position:-160px 0}.jstree-default-dark-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-dark-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-dark-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-dark-large .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark-large>.jstree-striped{background-size:auto 64px}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark-large.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-dark-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-dark-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-dark-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark-large .jstree-file{background:url("32px.png") -96px -64px no-repeat}.jstree-default-dark-large .jstree-folder{background:url("32px.png") -256px 0 no-repeat}.jstree-default-dark-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-dark-large .jstree-ok,#jstree-dnd.jstree-default-dark-large .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark-large i{background:transparent;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-dark-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-dark-large .jstree-er{background-position:-32px -64px}.jstree-default-dark-large .jstree-ellipsis{overflow:hidden}.jstree-default-dark-large .jstree-ellipsis .jstree-anchor{width:calc(100% - 32px + 5px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-dark-large.jstree-rtl .jstree-last{background-image:none}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}#jstree-dnd.jstree-dnd-responsive>i{background:transparent;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url("40px.png");background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url("40px.png");background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-dark-responsive .jstree-icon{background-image:url("40px.png")}.jstree-default-dark-responsive .jstree-node,.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-dark-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-dark-responsive .jstree-icon,.jstree-default-dark-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-dark-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-dark-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px;background:transparent}.jstree-default-dark-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-dark-responsive .jstree-ocl,.jstree-default-dark-responsive .jstree-themeicon,.jstree-default-dark-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl,.jstree-default-dark-responsive.jstree-rtl .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-responsive .jstree-open>.jstree-ocl{background-position:0 0 !important}.jstree-default-dark-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px !important}.jstree-default-dark-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0 !important}.jstree-default-dark-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-dark-responsive .jstree-checkbox,.jstree-default-dark-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-responsive .jstree-checked>.jstree-checkbox,.jstree-default-dark-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-dark-responsive .jstree-anchor{font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}.jstree-default-dark-responsive>.jstree-striped{background:transparent}.jstree-default-dark-responsive .jstree-wholerow{border-top:1px solid #666;border-bottom:1px solid #000;background:#333333;height:40px}.jstree-default-dark-responsive .jstree-wholerow-hovered{background:#555}.jstree-default-dark-responsive .jstree-wholerow-clicked{background:#5fa2db}.jstree-default-dark-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #111111}.jstree-default-dark-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #111111;border-top:0}.jstree-default-dark-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-dark-responsive .jstree-node,.jstree-default-dark-responsive .jstree-icon,.jstree-default-dark-responsive .jstree-node>.jstree-ocl,.jstree-default-dark-responsive .jstree-themeicon,.jstree-default-dark-responsive .jstree-checkbox{background-image:url("40px.png");background-size:120px 240px}.jstree-default-dark-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-dark-responsive .jstree-last{background-image:none}.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-dark-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-dark-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-responsive .jstree-file{background:url("40px.png") 0 -160px no-repeat;background-size:120px 240px}.jstree-default-dark-responsive .jstree-folder{background:url("40px.png") -40px -40px no-repeat;background-size:120px 240px}.jstree-default-dark-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}.jstree-default-dark{background:#333}.jstree-default-dark .jstree-anchor{color:#999;text-shadow:1px 1px 0 rgba(0,0,0,0.5)}.jstree-default-dark .jstree-clicked,.jstree-default-dark .jstree-checked{color:white}.jstree-default-dark .jstree-hovered{color:white}#jstree-marker.jstree-default-dark{border-left-color:#999;background:transparent}.jstree-default-dark .jstree-anchor>.jstree-icon{opacity:.75}.jstree-default-dark .jstree-clicked>.jstree-icon,.jstree-default-dark .jstree-hovered>.jstree-icon,.jstree-default-dark .jstree-checked>.jstree-icon{opacity:1}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default-dark.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-dark-small.jstree-rtl .jstree-last{background-image:none}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-dark-large.jstree-rtl .jstree-last{background-image:none}PKwL\'$[*[*)updraftplus/includes/jstree/jstree.min.jsnu[/*! jsTree - v3.3.15 - 2023-02-20 - (MIT) */ !function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e(require("jquery")):e(jQuery)}(function(E,P){"use strict";if(!E.jstree){var s=0,a=!1,n=!1,d=!1,r=[],e=E("script:last").attr("src"),b=window.document,c=window.setImmediate,i=window.Promise;!c&&i&&(c=function(e,t){i.resolve(t).then(e)}),E.jstree={version:"3.3.15",defaults:{plugins:[]},plugins:{},path:e&&-1!==e.indexOf("/")?e.replace(/\/[^\/]+$/,""):"",idregex:/[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g,root:"#"},E.jstree.create=function(e,i){var r=new E.jstree.core(++s),t=i;return i=E.extend(!0,{},E.jstree.defaults,i),t&&t.plugins&&(i.plugins=t.plugins),E.each(i.plugins,function(e,t){"core"!==e&&(r=r.plugin(t,i[t]))}),E(e).data("jstree",r),r.init(e,i),r},E.jstree.destroy=function(){E(".jstree:jstree").jstree("destroy"),E(b).off(".jstree")},E.jstree.core=function(e){this._id=e,this._cnt=0,this._wrk=null,this._data={core:{themes:{name:!1,dots:!1,icons:!1,ellipsis:!1},selected:[],last_error:{},working:!1,worker_queue:[],focused:null}}},E.jstree.reference=function(t){var i=null,e=null;if(!t||!t.id||t.tagName&&t.nodeType||(t=t.id),!e||!e.length)try{e=E(t)}catch(e){}if(!e||!e.length)try{e=E("#"+t.replace(E.jstree.idregex,"\\$&"))}catch(e){}return e&&e.length&&(e=e.closest(".jstree")).length&&(e=e.data("jstree"))?i=e:E(".jstree").each(function(){var e=E(this).data("jstree");if(e&&e._model.data[t])return i=e,!1}),i},E.fn.jstree=function(i){var r="string"==typeof i,s=Array.prototype.slice.call(arguments,1),a=null;return!(!0===i&&!this.length)&&(this.each(function(){var e=E.jstree.reference(this),t=r&&e?e[i]:null;if(a=r&&t?t.apply(e,s):null,e||r||i!==P&&!E.isPlainObject(i)||E.jstree.create(this,i),null!==(a=e&&!r||!0===i?e||!1:a)&&a!==P)return!1}),null!==a&&a!==P?a:this)},E.expr.pseudos.jstree=E.expr.createPseudo(function(e){return function(e){return E(e).hasClass("jstree")&&E(e).data("jstree")!==P}}),E.jstree.defaults.core={data:!1,strings:!1,check_callback:!1,error:E.noop,animation:200,multiple:!0,themes:{name:!1,url:!1,dir:!1,dots:!0,icons:!0,ellipsis:!1,stripes:!1,variant:!1,responsive:!1},expand_selected_onload:!0,worker:!0,force_text:!1,dblclick_toggle:!0,loaded_state:!1,restore_focus:!0,compute_elements_positions:!1,keyboard:{"ctrl-space":function(e){e.type="click",E(e.currentTarget).trigger(e)},enter:function(e){e.type="click",E(e.currentTarget).trigger(e)},left:function(e){var e;e.preventDefault(),this.is_open(e.currentTarget)?this.close_node(e.currentTarget):(e=this.get_parent(e.currentTarget))&&e.id!==E.jstree.root&&this.get_node(e,!0).children(".jstree-anchor").trigger("focus")},up:function(e){e.preventDefault();var e=this.get_prev_dom(e.currentTarget);e&&e.length&&e.children(".jstree-anchor").trigger("focus")},right:function(e){var e;e.preventDefault(),this.is_closed(e.currentTarget)?this.open_node(e.currentTarget,function(e){this.get_node(e,!0).children(".jstree-anchor").trigger("focus")}):!this.is_open(e.currentTarget)||(e=this.get_node(e.currentTarget,!0).children(".jstree-children")[0])&&E(this._firstChild(e)).children(".jstree-anchor").trigger("focus")},down:function(e){e.preventDefault();var e=this.get_next_dom(e.currentTarget);e&&e.length&&e.children(".jstree-anchor").trigger("focus")},"*":function(e){this.open_all()},home:function(e){e.preventDefault();var e=this._firstChild(this.get_container_ul()[0]);e&&E(e).children(".jstree-anchor").filter(":visible").trigger("focus")},end:function(e){e.preventDefault(),this.element.find(".jstree-anchor").filter(":visible").last().trigger("focus")},f2:function(e){e.preventDefault(),this.edit(e.currentTarget)}}},E.jstree.core.prototype={plugin:function(e,t){var i=E.jstree.plugins[e];return i?(this._data[e]={},i.prototype=this,new i(t,this)):this},init:function(e,t){this._model={data:{},changed:[],force_full_redraw:!1,redraw_timeout:!1,default_state:{loaded:!0,opened:!1,selected:!1,disabled:!1}},this._model.data[E.jstree.root]={id:E.jstree.root,parent:null,parents:[],children:[],children_d:[],state:{loaded:!1}},this.element=E(e).addClass("jstree jstree-"+this._id),this.settings=t,this._data.core.ready=!1,this._data.core.loaded=!1,this._data.core.rtl="rtl"===this.element.css("direction"),this.element[this._data.core.rtl?"addClass":"removeClass"]("jstree-rtl"),this.element.attr("role","tree"),this.settings.core.multiple&&this.element.attr("aria-multiselectable",!0),this.element.attr("tabindex")||this.element.attr("tabindex","0"),this.bind(),this.trigger("init"),this._data.core.original_container_html=this.element.find(" > ul > li").clone(!0),this._data.core.original_container_html.find("li").addBack().contents().filter(function(){return 3===this.nodeType&&(!this.nodeValue||/^\s+$/.test(this.nodeValue))}).remove(),this.element.html(""),this.element.attr("aria-activedescendant","j"+this._id+"_loading"),this._data.core.li_height=this.get_container_ul().children("li").first().outerHeight()||24,this._data.core.node=this._create_prototype_node(),this.trigger("loading"),this.load_node(E.jstree.root)},destroy:function(e){if(this.trigger("destroy"),this._wrk)try{window.URL.revokeObjectURL(this._wrk),this._wrk=null}catch(e){}e||this.element.empty(),this.teardown()},_create_prototype_node:function(){var e=b.createElement("LI"),t,i;return e.setAttribute("role","none"),(t=b.createElement("I")).className="jstree-icon jstree-ocl",t.setAttribute("role","presentation"),e.appendChild(t),(t=b.createElement("A")).className="jstree-anchor",t.setAttribute("href","#"),t.setAttribute("tabindex","-1"),t.setAttribute("role","treeitem"),(i=b.createElement("I")).className="jstree-icon jstree-themeicon",i.setAttribute("role","presentation"),t.appendChild(i),e.appendChild(t),t=i=null,e},_kbevent_to_func:function(e){var t={8:"Backspace",9:"Tab",13:"Enter",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock",16:"Shift",17:"Ctrl",18:"Alt",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*",173:"-"},i=[];if(e.ctrlKey&&i.push("ctrl"),e.altKey&&i.push("alt"),e.shiftKey&&i.push("shift"),i.push(t[e.which]?t[e.which].toLowerCase():e.which),"shift-shift"===(i=i.sort().join("-").toLowerCase())||"ctrl-ctrl"===i||"alt-alt"===i)return null;var r=this.settings.core.keyboard,s,a;for(s in r)if(r.hasOwnProperty(s)&&(a="-"!==(a=s)&&"+"!==a?(a=a.replace("--","-MINUS").replace("+-","-MINUS").replace("++","-PLUS").replace("-+","-PLUS")).split(/-|\+/).sort().join("-").replace("MINUS","-").replace("PLUS","+").toLowerCase():a)===i)return r[s];return null},teardown:function(){this.unbind(),this.element.removeClass("jstree").removeData("jstree").find("[class^='jstree']").addBack().attr("class",function(){return this.className.replace(/jstree[^ ]*|$/gi,"")}),this.element=null},bind:function(){var s="",a=null,t=0;this.element.on("dblclick.jstree",function(e){if(e.target.tagName&&"input"===e.target.tagName.toLowerCase())return!0;if(b.selection&&b.selection.empty)b.selection.empty();else if(window.getSelection){var e=window.getSelection();try{e.removeAllRanges(),e.collapse()}catch(e){}}}).on("mousedown.jstree",function(e){e.target===this.element[0]&&(e.preventDefault(),t=+new Date)}.bind(this)).on("mousedown.jstree",".jstree-ocl",function(e){e.preventDefault()}).on("click.jstree",".jstree-ocl",function(e){this.toggle_node(e.target)}.bind(this)).on("dblclick.jstree",".jstree-anchor",function(e){if(e.target.tagName&&"input"===e.target.tagName.toLowerCase())return!0;this.settings.core.dblclick_toggle&&this.toggle_node(e.target)}.bind(this)).on("click.jstree",".jstree-anchor",function(e){e.preventDefault(),e.currentTarget!==b.activeElement&&E(e.currentTarget).trigger("focus"),this.activate_node(e.currentTarget,e)}.bind(this)).on("keydown.jstree",".jstree-anchor",function(e){if(e.target.tagName&&"input"===e.target.tagName.toLowerCase())return!0;this._data.core.rtl&&(37===e.which?e.which=39:39===e.which&&(e.which=37));var t=this._kbevent_to_func(e);if(t){var e=t.call(this,e);if(!1===e||!0===e)return e}}.bind(this)).on("load_node.jstree",function(e,t){t.status&&(t.node.id!==E.jstree.root||this._data.core.loaded||(this._data.core.loaded=!0,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.trigger("loaded")),this._data.core.ready||setTimeout(function(){if(this.element&&!this.get_container_ul().find(".jstree-loading").length){if(this._data.core.ready=!0,this._data.core.selected.length){if(this.settings.core.expand_selected_onload){for(var e=[],t,i,t=0,i=this._data.core.selected.length;t .jstree-anchor").trigger("focus"))}.bind(this)).on("mouseenter.jstree",".jstree-anchor",function(e){this.hover_node(e.currentTarget)}.bind(this)).on("mouseleave.jstree",".jstree-anchor",function(e){this.dehover_node(e.currentTarget)}.bind(this))},unbind:function(){this.element.off(".jstree"),E(b).off(".jstree-"+this._id)},trigger:function(e,t){((t=t||{}).instance=this).element.triggerHandler(e.replace(".jstree","")+".jstree",t)},get_container:function(){return this.element},get_container_ul:function(){return this.element.children(".jstree-children").first()},get_string:function(e){var t=this.settings.core.strings;return E.vakata.is_function(t)?t.call(this,e):t&&t[e]?t[e]:e},_firstChild:function(e){e=e?e.firstChild:null;while(null!==e&&1!==e.nodeType)e=e.nextSibling;return e},_nextSibling:function(e){e=e?e.nextSibling:null;while(null!==e&&1!==e.nodeType)e=e.nextSibling;return e},_previousSibling:function(e){e=e?e.previousSibling:null;while(null!==e&&1!==e.nodeType)e=e.previousSibling;return e},get_node:function(e,t){var i;(e=e&&(e.id||0===e.id)?e.id:e)instanceof E&&e.length&&e[0].id&&(e=e[0].id);try{if(this._model.data[e])e=this._model.data[e];else if("string"==typeof e&&this._model.data[e.replace(/^#/,"")])e=this._model.data[e.replace(/^#/,"")];else if("string"==typeof e&&(i=E("#"+e.replace(E.jstree.idregex,"\\$&"),this.element)).length&&this._model.data[i.closest(".jstree-node").attr("id")])e=this._model.data[i.closest(".jstree-node").attr("id")];else if((i=this.element.find(e)).length&&this._model.data[i.closest(".jstree-node").attr("id")])e=this._model.data[i.closest(".jstree-node").attr("id")];else{if(!(i=this.element.find(e)).length||!i.hasClass("jstree"))return!1;e=this._model.data[E.jstree.root]}return e=t?e.id===E.jstree.root?this.element:E("#"+e.id.replace(E.jstree.idregex,"\\$&"),this.element):e}catch(e){return!1}},get_path:function(e,t,i){if(!(e=e.parents?e:this.get_node(e))||e.id===E.jstree.root||!e.parents)return!1;var r,s,a=[];for(a.push(i?e.id:e.text),r=0,s=e.parents.length;r
").html(t),n.text=this.settings.core.force_text?t.text():t.html(),t=e.data(),n.data=t?E.extend(!0,{},t):null,n.state.opened=e.hasClass("jstree-open"),n.state.selected=e.children("a").hasClass("jstree-clicked"),n.state.disabled=e.children("a").hasClass("jstree-disabled"),n.data&&n.data.jstree)for(d in n.data.jstree)n.data.jstree.hasOwnProperty(d)&&(n.state[d]=n.data.jstree[d]);(t=e.children("a").children(".jstree-themeicon")).length&&(n.icon=!t.hasClass("jstree-themeicon-hidden")&&t.attr("rel")),n.state.icon!==P&&(n.icon=n.state.icon),n.icon!==P&&null!==n.icon&&""!==n.icon||(n.icon=!0),t=e.children("ul").children("li");do{o="j"+this._id+"_"+ ++this._cnt}while(a[o]);return n.id=n.li_attr.id?n.li_attr.id.toString():o,t.length?(t.each(function(e,t){r=this._parse_model_from_html(E(t),n.id,i),s=this._model.data[r],n.children.push(r),s.children_d.length&&(n.children_d=n.children_d.concat(s.children_d))}.bind(this)),n.children_d=n.children_d.concat(n.children)):e.hasClass("jstree-closed")&&(n.state.loaded=!1),n.li_attr.class&&(n.li_attr.class=n.li_attr.class.replace("jstree-closed","").replace("jstree-open","")),n.a_attr.class&&(n.a_attr.class=n.a_attr.class.replace("jstree-clicked","").replace("jstree-disabled","")),(a[n.id]=n).state.selected&&this._data.core.selected.push(n.id),n.id},_parse_model_from_flat_json:function(e,t,i){i=i?i.concat():[],t&&i.unshift(t);var r=e.id.toString(),s=this._model.data,a=this._model.default_state,n,d,o,c,l={id:r,text:e.text||"",icon:e.icon===P||e.icon,parent:t,parents:i,children:e.children||[],children_d:e.children_d||[],data:e.data,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(n in a)a.hasOwnProperty(n)&&(l.state[n]=a[n]);if(e&&e.data&&e.data.jstree&&e.data.jstree.icon&&(l.icon=e.data.jstree.icon),l.icon!==P&&null!==l.icon&&""!==l.icon||(l.icon=!0),e&&e.data&&(l.data=e.data,e.data.jstree))for(n in e.data.jstree)e.data.jstree.hasOwnProperty(n)&&(l.state[n]=e.data.jstree[n]);if(e&&"object"==typeof e.state)for(n in e.state)e.state.hasOwnProperty(n)&&(l.state[n]=e.state[n]);if(e&&"object"==typeof e.li_attr)for(n in e.li_attr)e.li_attr.hasOwnProperty(n)&&(l.li_attr[n]=e.li_attr[n]);if(l.li_attr.id||(l.li_attr.id=r),e&&"object"==typeof e.a_attr)for(n in e.a_attr)e.a_attr.hasOwnProperty(n)&&(l.a_attr[n]=e.a_attr[n]);for(e&&e.children&&!0===e.children&&(l.state.loaded=!1,l.children=[],l.children_d=[]),n=0,d=(s[l.id]=l).children.length;n
  • "+this.get_string("Loading ...")+"
  • "),this.element.attr("aria-activedescendant","j"+this._id+"_loading")),this.load_node(E.jstree.root,function(e,t){t&&(this.get_container_ul()[0].className=i,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.set_state(E.extend(!0,{},this._data.core.state),function(){this.trigger("refresh")})),this._data.core.state=null})},refresh_node:function(t){if(!(t=this.get_node(t))||t.id===E.jstree.root)return!1;var i=[],e=[],r=this._data.core.selected.concat([]);e.push(t.id),!0===t.state.opened&&i.push(t.id),this.get_node(t,!0).find(".jstree-open").each(function(){e.push(this.id),i.push(this.id)}),this._load_nodes(e,function(e){this.open_node(i,!1,0),this.select_node(r),this.trigger("refresh_node",{node:t,nodes:e})}.bind(this),!1,!0)},set_id:function(e,t){if(!(e=this.get_node(e))||e.id===E.jstree.root)return!1;var i,r,s=this._model.data,a=e.id;for(t=t.toString(),s[e.parent].children[E.inArray(e.id,s[e.parent].children)]=t,i=0,r=e.parents.length;ie.children.length&&(i=e.children.length),t.id===P&&(t.id=!0),!this.check("create_node",t,e,i))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(!0===t.id&&delete t.id,!(t=this._parse_model_from_json(t,e.id,e.parents.concat())))return!1;for(a=this.get_node(t),(n=[]).push(t),n=n.concat(a.children_d),this.trigger("model",{nodes:n,parent:e.id}),e.children_d=e.children_d.concat(n),d=0,o=e.parents.length;dh.children.length&&(i=h.children.length),!this.check("move_node",e,h,i,{core:!0,origin:n,is_multi:_&&_._id&&_._id!==this._id,is_foreign:!_||!_._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(e.parent===h.id){for(u=h.children.concat(),-1!==(f=E.inArray(e.id,u))&&(u=E.vakata.array_remove(u,f),ff.children.length&&(i=f.children.length),!this.check("copy_node",e,f,i,{core:!0,origin:n,is_multi:p&&p._id&&p._id!==this._id,is_foreign:!p||!p._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(!(g=p?p.get_json(e,{no_id:!0,no_data:!0,no_state:!0}):e))return!1;if(!0===g.id&&delete g.id,!(g=this._parse_model_from_json(g,f.id,f.parents.concat())))return!1;for(l=this.get_node(g),e&&e.state&&!1===e.state.loaded&&(l.state.loaded=!1),(c=[]).push(g),c=c.concat(l.children_d),this.trigger("model",{nodes:c,parent:f.id}),h=0,_=f.parents.length;h<_;h++)this._model.data[f.parents[h]].children_d=this._model.data[f.parents[h]].children_d.concat(c);for(c=[],h=0,_=f.children.length;h<_;h++)c[i<=h?h+1:h]=f.children[h];return c[i]=l.id,f.children=c,f.children_d.push(l.id),f.children_d=f.children_d.concat(l.children_d),f.id===E.jstree.root&&(this._model.force_full_redraw=!0),this._model.force_full_redraw||this._node_changed(f.id),a||this.redraw(f.id===E.jstree.root),r&&r.call(this,l,f,i),this.trigger("copy_node",{node:l,original:e,parent:f.id,position:i,old_parent:u,old_position:p&&p._id&&u&&p._model.data[u]&&p._model.data[u].children?E.inArray(e.id,p._model.data[u].children):-1,is_multi:p&&p._id&&p._id!==this._id,is_foreign:!p||!p._id,old_instance:p,new_instance:this}),l.id},cut:function(e){if(e=e||this._data.core.selected.concat(),!(e=!E.vakata.is_array(e)?[e]:e).length)return!1;for(var t=[],i,r,s,r=0,s=e.length;r"),d=e,o=E("
    ",{css:{position:"absolute",top:"-200px",left:t?"0px":"-1000px",visibility:"hidden"}}).appendTo(b.body),c=E("",{value:d,class:"jstree-rename-input",css:{padding:"0",border:"1px solid silver","box-sizing":"border-box",display:"inline-block",height:this._data.core.li_height+"px",lineHeight:this._data.core.li_height+"px",width:"150px"},blur:function(e){e.stopImmediatePropagation(),e.preventDefault();var t,i=n.children(".jstree-rename-input").val(),e=this.settings.core.force_text,e;""===i&&(i=d),o.remove(),n.replaceWith(a),n.remove(),d=e?d:E("
    ").append(E.parseHTML(d)).html(),r=this.get_node(r),this.set_text(r,d),(e=!!this.rename_node(r,e?E("
    ").text(i).text():E("
    ").append(E.parseHTML(i)).html()))||this.set_text(r,d),this._data.core.focused=l.id,setTimeout(function(){var e=this.get_node(l.id,!0);e.length&&(this._data.core.focused=l.id,e.children(".jstree-anchor").trigger("focus"))}.bind(this),0),s&&s.call(this,l,e,h,i),c=null}.bind(this),keydown:function(e){var t=e.which;27===t&&(h=!0,this.value=d),27!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&32!==t||e.stopImmediatePropagation(),27!==t&&13!==t||(e.preventDefault(),this.blur())},click:function(e){e.stopImmediatePropagation()},mousedown:function(e){e.stopImmediatePropagation()},keyup:function(e){c.width(Math.min(o.text("pW"+this.value).width(),i))},keypress:function(e){if(13===e.which)return!1}}),t={fontFamily:a.css("fontFamily")||"",fontSize:a.css("fontSize")||"",fontWeight:a.css("fontWeight")||"",fontStyle:a.css("fontStyle")||"",fontStretch:a.css("fontStretch")||"",fontVariant:a.css("fontVariant")||"",letterSpacing:a.css("letterSpacing")||"",wordSpacing:a.css("wordSpacing")||""},n.attr("class",a.attr("class")).append(a.contents().clone()).append(c),a.replaceWith(n),o.css(t),c.css(t).width(Math.min(o.text("pW"+c[0].value).width(),i))[0].select(),void E(b).one("mousedown.jstree touchstart.jstree dnd_start.vakata",function(e){c&&e.target!==c&&E(c).trigger("blur")})):(this.settings.core.error.call(this,this._data.core.last_error),!1))},set_theme:function(e,t){if(!e)return!1;var i,i;(t=!0===t?(i=(i=this.settings.core.themes.dir)||E.jstree.path+"/themes")+"/"+e+"/style.css":t)&&-1===E.inArray(t,r)&&(E("head").append(''),r.push(t)),this._data.core.themes.name&&this.element.removeClass("jstree-"+this._data.core.themes.name),this._data.core.themes.name=e,this.element.addClass("jstree-"+e),this.element[this.settings.core.themes.responsive?"addClass":"removeClass"]("jstree-"+e+"-responsive"),this.trigger("set_theme",{theme:e})},get_theme:function(){return this._data.core.themes.name},set_theme_variant:function(e){this._data.core.themes.variant&&this.element.removeClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant),(this._data.core.themes.variant=e)&&this.element.addClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant)},get_theme_variant:function(){return this._data.core.themes.variant},show_stripes:function(){this._data.core.themes.stripes=!0,this.get_container_ul().addClass("jstree-striped"),this.trigger("show_stripes")},hide_stripes:function(){this._data.core.themes.stripes=!1,this.get_container_ul().removeClass("jstree-striped"),this.trigger("hide_stripes")},toggle_stripes:function(){this._data.core.themes.stripes?this.hide_stripes():this.show_stripes()},show_dots:function(){this._data.core.themes.dots=!0,this.get_container_ul().removeClass("jstree-no-dots"),this.trigger("show_dots")},hide_dots:function(){this._data.core.themes.dots=!1,this.get_container_ul().addClass("jstree-no-dots"),this.trigger("hide_dots")},toggle_dots:function(){this._data.core.themes.dots?this.hide_dots():this.show_dots()},show_icons:function(){this._data.core.themes.icons=!0,this.get_container_ul().removeClass("jstree-no-icons"),this.trigger("show_icons")},hide_icons:function(){this._data.core.themes.icons=!1,this.get_container_ul().addClass("jstree-no-icons"),this.trigger("hide_icons")},toggle_icons:function(){this._data.core.themes.icons?this.hide_icons():this.show_icons()},show_ellipsis:function(){this._data.core.themes.ellipsis=!0,this.get_container_ul().addClass("jstree-ellipsis"),this.trigger("show_ellipsis")},hide_ellipsis:function(){this._data.core.themes.ellipsis=!1,this.get_container_ul().removeClass("jstree-ellipsis"),this.trigger("hide_ellipsis")},toggle_ellipsis:function(){this._data.core.themes.ellipsis?this.hide_ellipsis():this.show_ellipsis()},set_icon:function(e,t){var i,r,s,a;if(E.vakata.is_array(e)){for(i=0,r=(e=e.slice()).length;i "),r=!1,i+="
  • ",i+="",h.vakata.context.settings.icons&&(i+="'+(t.shortcut_label||"")+"":"")+"",t.submenu&&(s=h.vakata.context._parse(t.submenu,!0))&&(i+=s),i+="
  • ",void(t.separator_after&&(i+="
  •  
  • ",r=!0)))}),i=i.replace(/
  • <\/li\>$/,""),t&&(i+=""),t||(g.html=i,h.vakata.context._trigger("parse")),10"),g.element.on("mouseenter","li",function(e){e.stopImmediatePropagation(),h.contains(this,e.relatedTarget)||(i&&clearTimeout(i),g.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end(),h(this).siblings().find("ul").hide().end().end().parentsUntil(".vakata-context","li").addBack().addClass("vakata-context-hover"),h.vakata.context._show_submenu(this))}).on("mouseleave","li",function(e){h.contains(this,e.relatedTarget)||h(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover")}).on("mouseleave",function(e){var t;h(this).find(".vakata-context-hover").removeClass("vakata-context-hover"),h.vakata.context.settings.hide_onmouseleave&&(i=setTimeout((t=this,function(){h.vakata.context.hide()}),h.vakata.context.settings.hide_onmouseleave))}).on("click","a",function(e){e.preventDefault(),h(this).trigger("blur").parent().hasClass("vakata-context-disabled")||!1===h.vakata.context._execute(h(this).attr("rel"))||h.vakata.context.hide()}).on("keydown","a",function(e){var t=null;switch(e.which){case 13:case 32:e.type="click",e.preventDefault(),h(e.currentTarget).trigger(e);break;case 37:g.is_visible&&(g.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 38:g.is_visible&&((t=!(t=g.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first()).length?g.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last():t).addClass("vakata-context-hover").children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 39:g.is_visible&&(g.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 40:g.is_visible&&((t=!(t=g.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first()).length?g.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first():t).addClass("vakata-context-hover").children("a").trigger("focus"),e.stopImmediatePropagation(),e.preventDefault());break;case 27:h.vakata.context.hide(),e.preventDefault()}}).on("keydown",function(e){e.preventDefault();var e=g.element.find(".vakata-contextmenu-shortcut-"+e.which).parent();e.parent().not(".vakata-context-disabled")&&e.trigger("click")}),h(b).on("mousedown.vakata.jstree",function(e){g.is_visible&&g.element[0]!==e.target&&!h.contains(g.element[0],e.target)&&h.vakata.context.hide()}).on("context_show.vakata.jstree",function(e,t){g.element.find("li:has(ul)").children("a").addClass("vakata-context-parent"),_&&g.element.addClass("vakata-context-rtl").css("direction","rtl"),g.element.find("ul").hide().end()})}),E.jstree.defaults.dnd={copy:!0,open_timeout:500,is_draggable:!0,check_while_dragging:!0,always_copy:!1,inside_pos:0,drag_selection:!0,touch:!0,large_drop_target:!1,large_drag_target:!1,use_html5:!1,blank_space_drop:!1},E.jstree.plugins.dnd=function(e,d){this.init=function(e,t){d.init.call(this,e,t),this.settings.dnd.use_html5=this.settings.dnd.use_html5&&"draggable"in b.createElement("span")},this.bind=function(){d.bind.call(this),this.element.on(this.settings.dnd.use_html5?"dragstart.jstree":"mousedown.jstree touchstart.jstree",this.settings.dnd.large_drag_target?".jstree-node":".jstree-anchor",function(e){if(this.settings.dnd.large_drag_target&&E(e.target).closest(".jstree-node")[0]!==e.currentTarget)return!0;if("touchstart"===e.type&&(!this.settings.dnd.touch||"selected"===this.settings.dnd.touch&&!E(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").hasClass("jstree-clicked")))return!0;var t=this.get_node(e.target),i=this.is_selected(t)&&this.settings.dnd.drag_selection?this.get_top_selected().length:1,r=1'+r+'+
  • ');E.vakata.dnd._trigger("start",e,{helper:E(),element:u,data:o})}}.bind(this)),this.settings.dnd.use_html5&&this.element.on("dragover.jstree",function(e){return e.preventDefault(),E.vakata.dnd._trigger("move",e,{helper:E(),element:u,data:o}),!1}).on("drop.jstree",function(e){return e.preventDefault(),E.vakata.dnd._trigger("stop",e,{helper:E(),element:u,data:o}),!1}.bind(this))},this.redraw_node=function(e,t,i,r){if((e=d.redraw_node.apply(this,arguments))&&this.settings.dnd.use_html5)if(this.settings.dnd.large_drag_target)e.setAttribute("draggable",!0);else{for(var s,a,n=null,s=0,a=e.childNodes.length;s 
    ').hide();E(b).on("dragover.vakata.jstree",function(e){u&&E.vakata.dnd._trigger("move",e,{helper:E(),element:u,data:o})}).on("drop.vakata.jstree",function(e){u&&(E.vakata.dnd._trigger("stop",e,{helper:E(),element:u,data:o}),o=u=null)}).on("dnd_start.vakata.jstree",function(e,t){O=N=!1,t&&t.data&&t.data.jstree&&S.appendTo(b.body)}).on("dnd_move.vakata.jstree",function(e,s){var a=s.event.target!==O.target;if(A&&(s.event&&"dragover"===s.event.type&&!a||clearTimeout(A)),s&&s.data&&s.data.jstree&&(!s.event.target.id||"jstree-marker"!==s.event.target.id)){O=s.event;var n=E.jstree.reference(s.event.target),d=!1,o=!1,t=!1,i,c,l,h,_,g,u,f,p,m,v,j,k,b,y,x,w,C;if(n&&n._data&&n._data.dnd)if(S.attr("class","jstree-"+n.get_theme()+(n.settings.core.themes.responsive?" jstree-dnd-responsive":"")),x=s.data.origin&&(s.data.origin.settings.dnd.always_copy||s.data.origin.settings.dnd.copy&&(s.event.metaKey||s.event.ctrlKey)),s.helper.children().attr("class","jstree-"+n.get_theme()+" jstree-"+n.get_theme()+"-"+n.get_theme_variant()+" "+(n.settings.core.themes.responsive?" jstree-dnd-responsive":"")).find(".jstree-copy").first()[x?"show":"hide"](),s.event.target!==n.element[0]&&s.event.target!==n.get_container_ul()[0]||0!==n.get_container_ul().children().length&&!n.settings.dnd.blank_space_drop){if((d=n.settings.dnd.large_drop_target?E(s.event.target).closest(".jstree-node").children(".jstree-anchor"):E(s.event.target).closest(".jstree-anchor"))&&d.length&&d.parent().is(".jstree-closed, .jstree-open, .jstree-leaf")&&(o=d.offset(),t=(s.event.pageY!==P?s.event:s.event.originalEvent).pageY-o.top,h=d.outerHeight(),u=tE.inArray(s.data.nodes[p],k.children)&&--j),!(f=f&&(n&&n.settings&&n.settings.dnd&&!1===n.settings.dnd.check_while_dragging||n.check(v,s.data.origin&&s.data.origin!==n?s.data.origin.get_node(s.data.nodes[p]):s.data.nodes[p],_,j,{dnd:!0,ref:n.get_node(d.parent()),pos:t,origin:s.data.origin,is_multi:s.data.origin&&s.data.origin!==n,is_foreign:!s.data.origin})))){n&&n.last_error&&(T=n.last_error());break}var i,r;if("i"===t&&d.parent().is(".jstree-closed")&&n.settings.dnd.open_timeout&&(s.event&&"dragover"===s.event.type&&!a||(A&&clearTimeout(A),A=setTimeout((r=d,function(){i.open_node(r)}),(i=n).settings.dnd.open_timeout))),f)return(w=n.get_node(_,!0)).hasClass(".jstree-dnd-parent")||(E(".jstree-dnd-parent").removeClass("jstree-dnd-parent"),w.addClass("jstree-dnd-parent")),N={ins:n,par:_,pos:"i"!==t||"last"!==b||0!==g||n.is_loaded(y)?g:"last"},S.css({left:c+"px",top:l+"px"}).show(),S.removeClass("jstree-above jstree-inside jstree-below").addClass(C),s.helper.find(".jstree-icon").first().removeClass("jstree-er").addClass("jstree-ok"),s.event.originalEvent&&s.event.originalEvent.dataTransfer&&(s.event.originalEvent.dataTransfer.dropEffect=x?"copy":"move"),T={},!(u=!0)}),!0===u))return}else{for(f=!0,p=0,m=s.data.nodes.length;p"),escape:function(e){return f.vakata.html.div.text(e).html()},strip:function(e){return f.vakata.html.div.empty().append(f.parseHTML(e)).text()}}),target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1},f.vakata.dnd={settings:{scroll_speed:10,scroll_proximity:20,helper_left:5,helper_top:10,threshold:5,threshold_touch:10},_trigger:function(e,t,i){(i=i===P?f.vakata.dnd._get():i).event=t,f(b).triggerHandler("dnd_"+e+".vakata",i)},_get:function(){return{data:p.data,element:p.element,helper:p.helper}},_clean:function(){p.helper&&p.helper.remove(),p.scroll_i&&(clearInterval(p.scroll_i),p.scroll_i=!1),p={element:!1,target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1},u=null,f(b).off("mousemove.vakata.jstree touchmove.vakata.jstree",f.vakata.dnd.drag),f(b).off("mouseup.vakata.jstree touchend.vakata.jstree",f.vakata.dnd.stop)},_scroll:function(e){if(!p.scroll_e||!p.scroll_l&&!p.scroll_t)return p.scroll_i&&(clearInterval(p.scroll_i),p.scroll_i=!1),!1;if(!p.scroll_i)return p.scroll_i=setInterval(f.vakata.dnd._scroll,100),!1;if(!0===e)return!1;var t=p.scroll_e.scrollTop(),e=p.scroll_e.scrollLeft();p.scroll_e.scrollTop(t+p.scroll_t*f.vakata.dnd.settings.scroll_speed),p.scroll_e.scrollLeft(e+p.scroll_l*f.vakata.dnd.settings.scroll_speed),t===p.scroll_e.scrollTop()&&e===p.scroll_e.scrollLeft()||f.vakata.dnd._trigger("scroll",p.scroll_e)},start:function(e,t,i){"touchstart"===e.type&&e.originalEvent&&e.originalEvent.changedTouches&&e.originalEvent.changedTouches[0]&&(e.pageX=e.originalEvent.changedTouches[0].pageX,e.pageY=e.originalEvent.changedTouches[0].pageY,e.target=b.elementFromPoint(e.originalEvent.changedTouches[0].pageX-window.pageXOffset,e.originalEvent.changedTouches[0].pageY-window.pageYOffset)),p.is_drag&&f.vakata.dnd.stop({});try{e.currentTarget.unselectable="on",e.currentTarget.onselectstart=function(){return!1},e.currentTarget.style&&(e.currentTarget.style.touchAction="none",e.currentTarget.style.msTouchAction="none",e.currentTarget.style.MozUserSelect="none")}catch(e){}return p.init_x=e.pageX,p.init_y=e.pageY,p.data=t,p.is_down=!0,p.element=e.currentTarget,p.target=e.target,p.is_touch="touchstart"===e.type,!1!==i&&(p.helper=f("
    ").html(i).css({display:"block",margin:"0",padding:"0",position:"absolute",top:"-2000px",lineHeight:"16px",zIndex:"10000"})),f(b).on("mousemove.vakata.jstree touchmove.vakata.jstree",f.vakata.dnd.drag),f(b).on("mouseup.vakata.jstree touchend.vakata.jstree",f.vakata.dnd.stop),!1},drag:function(i){if("touchmove"===i.type&&i.originalEvent&&i.originalEvent.changedTouches&&i.originalEvent.changedTouches[0]&&(i.pageX=i.originalEvent.changedTouches[0].pageX,i.pageY=i.originalEvent.changedTouches[0].pageY,i.target=b.elementFromPoint(i.originalEvent.changedTouches[0].pageX-window.pageXOffset,i.originalEvent.changedTouches[0].pageY-window.pageYOffset)),p.is_down){if(!p.is_drag){if(!(Math.abs(i.pageX-p.init_x)>(p.is_touch?f.vakata.dnd.settings.threshold_touch:f.vakata.dnd.settings.threshold)||Math.abs(i.pageY-p.init_y)>(p.is_touch?f.vakata.dnd.settings.threshold_touch:f.vakata.dnd.settings.threshold)))return;p.helper&&(p.helper.appendTo(b.body),p.helper_w=p.helper.outerWidth()),p.is_drag=!0,f(p.target).one("click.vakata",!1),f.vakata.dnd._trigger("start",i)}var e=!1,t=!1,r=!1,s=!1,a=!1,n=!1,d=!1,o=!1,c=!1,l=!1;return p.scroll_t=0,p.scroll_l=0,p.scroll_e=!1,f(f(i.target).parentsUntil("body").addBack().get().reverse()).filter(function(){return this.ownerDocument&&/^auto|scroll$/.test(f(this).css("overflow"))&&(this.scrollHeight>this.offsetHeight||this.scrollWidth>this.offsetWidth)}).each(function(){var e=f(this),t=e.offset();if(this.scrollHeight>this.offsetHeight&&(t.top+e.height()-i.pageYthis.offsetWidth&&(t.left+e.width()-i.pageXa&&(l=a-(p.helper_w+2)),p.helper.css({left:l+"px",top:(c=r&&rs)break;c=_}return{isMatch:0<=a,score:u}},!0===e?{search:t}:t(e)},w.vakata.search.defaults={location:0,distance:100,threshold:.6,fuzzy:!1,caseSensitive:!1},E.jstree.defaults.sort=function(e,t){return this.get_text(e)>this.get_text(t)?1:-1};var m=!(E.jstree.plugins.sort=function(e,t){this.bind=function(){t.bind.call(this),this.element.on("model.jstree",function(e,t){this.sort(t.parent,!0)}.bind(this)).on("rename_node.jstree create_node.jstree",function(e,t){this.sort(t.parent||t.node.parent,!1),this.redraw_node(t.parent||t.node.parent,!0)}.bind(this)).on("move_node.jstree copy_node.jstree",function(e,t){this.sort(t.parent,!1),this.redraw_node(t.parent,!0)}.bind(this))},this.sort=function(e,t){var i,r;if((e=this.get_node(e))&&e.children&&e.children.length&&(e.children.sort(this.settings.sort.bind(this)),t))for(i=0,r=e.children_d.length;ii.ttl)&&(!!(i=(i=i&&i.state?i.state:i)&&E.vakata.is_function(this.settings.state.filter)?this.settings.state.filter.call(this,i):i)&&(this.settings.state.preserve_loaded||delete i.core.loaded,this.element.one("set_state.jstree",function(e,t){t.instance.trigger("restore_state",{state:E.extend(!0,{},i)})}),this.set_state(i),!0))},this.clear_state=function(){return E.vakata.storage.del(this.settings.state.key)}},E.vakata.storage={set:function(e,t){return window.localStorage.setItem(e,t)},get:function(e){return window.localStorage.getItem(e)},del:function(e){return window.localStorage.removeItem(e)}},E.jstree.defaults.types={default:{}},E.jstree.defaults.types[E.jstree.root]={},E.jstree.plugins.types=function(e,l){this.init=function(e,t){var i,r;if(t&&t.types&&t.types.default)for(i in t.types)if("default"!==i&&i!==E.jstree.root&&t.types.hasOwnProperty(i))for(r in t.types.default)t.types.default.hasOwnProperty(r)&&t.types[i][r]===P&&(t.types[i][r]=t.types.default[r]);l.init.call(this,e,t),this._model.data[E.jstree.root].type=E.jstree.root},this.refresh=function(e,t){l.refresh.call(this,e,t),this._model.data[E.jstree.root].type=E.jstree.root},this.bind=function(){this.element.on("model.jstree",function(e,t){for(var i=this._model.data,r=t.nodes,s=this.settings.types,a,n,d="default",o,a=0,n=r.length;a .jstree-ocl",function(e){e.stopImmediatePropagation();var t=E.Event("click",{metaKey:e.metaKey,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey});E(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(t).trigger("focus")}.bind(this)).on("mouseover.jstree",".jstree-wholerow, .jstree-icon",function(e){return e.stopImmediatePropagation(),this.is_disabled(e.currentTarget)||this.hover_node(e.currentTarget),!1}.bind(this)).on("mouseleave.jstree",".jstree-node",function(e){this.dehover_node(e.currentTarget)}.bind(this))},this.teardown=function(){this.settings.wholerow&&this.element.find(".jstree-wholerow").remove(),a.teardown.call(this)},this.redraw_node=function(e,t,i,r){var s;return(e=a.redraw_node.apply(this,arguments))&&(s=j.cloneNode(!0),-1!==E.inArray(e.id,this._data.core.selected)&&(s.className+=" jstree-wholerow-clicked"),this._data.core.focused&&this._data.core.focused===e.id&&(s.className+=" jstree-wholerow-hovered"),e.insertBefore(s,e.childNodes[0])),e}},window.customElements&&Object&&Object.create){var e=Object.create(HTMLElement.prototype);e.createdCallback=function(){var e={core:{},plugins:[]},t;for(t in E.jstree.plugins)E.jstree.plugins.hasOwnProperty(t)&&this.attributes[t]&&(e.plugins.push(t),this.getAttribute(t)&&JSON.parse(this.getAttribute(t))&&(e[t]=JSON.parse(this.getAttribute(t))));for(t in E.jstree.defaults.core)E.jstree.defaults.core.hasOwnProperty(t)&&this.attributes[t]&&(e.core[t]=JSON.parse(this.getAttribute(t))||this.getAttribute(t));E(this).jstree(e)};try{window.customElements.define("vakata-jstree",function(){},{prototype:e})}catch(e){}}}});PKwL\}z9rEE%updraftplus/includes/jstree/jstree.jsnu[/*globals jQuery, define, module, exports, require, window, document, postMessage */ (function (factory) { "use strict"; if (typeof define === 'function' && define.amd) { define(['jquery'], factory); } else if(typeof module !== 'undefined' && module.exports) { module.exports = factory(require('jquery')); } else { factory(jQuery); } }(function ($, undefined) { "use strict"; /*! * jsTree 3.3.15 * http://jstree.com/ * * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com) * * Licensed same as jquery - under the terms of the MIT License * http://www.opensource.org/licenses/mit-license.php */ /*! * if using jslint please allow for the jQuery global and use following options: * jslint: loopfunc: true, browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true */ /*jshint -W083 */ // prevent another load? maybe there is a better way? if($.jstree) { return; } /** * ### jsTree core functionality */ // internal variables var instance_counter = 0, ccp_node = false, ccp_mode = false, ccp_inst = false, themes_loaded = [], src = $('script:last').attr('src'), document = window.document; // local variable is always faster to access then a global var setImmediate = window.setImmediate; var Promise = window.Promise; if (!setImmediate && Promise) { // Good enough approximation of setImmediate setImmediate = function (cb, arg) { Promise.resolve(arg).then(cb); }; } /** * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances. * @name $.jstree */ $.jstree = { /** * specifies the jstree version in use * @name $.jstree.version */ version : '3.3.15', /** * holds all the default options used when creating new instances * @name $.jstree.defaults */ defaults : { /** * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]` * @name $.jstree.defaults.plugins */ plugins : [] }, /** * stores all loaded jstree plugins (used internally) * @name $.jstree.plugins */ plugins : {}, path : src && src.indexOf('/') !== -1 ? src.replace(/\/[^\/]+$/,'') : '', idregex : /[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g, root : '#' }; /** * creates a jstree instance * @name $.jstree.create(el [, options]) * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector * @param {Object} options options for this instance (extends `$.jstree.defaults`) * @return {jsTree} the new instance */ $.jstree.create = function (el, options) { var tmp = new $.jstree.core(++instance_counter), opt = options; options = $.extend(true, {}, $.jstree.defaults, options); if(opt && opt.plugins) { options.plugins = opt.plugins; } $.each(options.plugins, function (i, k) { if(i !== 'core') { tmp = tmp.plugin(k, options[k]); } }); $(el).data('jstree', tmp); tmp.init(el, options); return tmp; }; /** * remove all traces of jstree from the DOM and destroy all instances * @name $.jstree.destroy() */ $.jstree.destroy = function () { $('.jstree:jstree').jstree('destroy'); $(document).off('.jstree'); }; /** * the jstree class constructor, used only internally * @private * @name $.jstree.core(id) * @param {Number} id this instance's index */ $.jstree.core = function (id) { this._id = id; this._cnt = 0; this._wrk = null; this._data = { core : { themes : { name : false, dots : false, icons : false, ellipsis : false }, selected : [], last_error : {}, working : false, worker_queue : [], focused : null } }; }; /** * get a reference to an existing instance * * __Examples__ * * // provided a container with an ID of "tree", and a nested node with an ID of "branch" * // all of there will return the same instance * $.jstree.reference('tree'); * $.jstree.reference('#tree'); * $.jstree.reference($('#tree')); * $.jstree.reference(document.getElementByID('tree')); * $.jstree.reference('branch'); * $.jstree.reference('#branch'); * $.jstree.reference($('#branch')); * $.jstree.reference(document.getElementByID('branch')); * * @name $.jstree.reference(needle) * @param {DOMElement|jQuery|String} needle * @return {jsTree|null} the instance or `null` if not found */ $.jstree.reference = function (needle) { var tmp = null, obj = null; if(needle && needle.id && (!needle.tagName || !needle.nodeType)) { needle = needle.id; } if(!obj || !obj.length) { try { obj = $(needle); } catch (ignore) { } } if(!obj || !obj.length) { try { obj = $('#' + needle.replace($.jstree.idregex,'\\$&')); } catch (ignore) { } } if(obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) { tmp = obj; } else { $('.jstree').each(function () { var inst = $(this).data('jstree'); if(inst && inst._model.data[needle]) { tmp = inst; return false; } }); } return tmp; }; /** * Create an instance, get an instance or invoke a command on a instance. * * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken). * * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function). * * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`). * * In any other case - nothing is returned and chaining is not broken. * * __Examples__ * * $('#tree1').jstree(); // creates an instance * $('#tree2').jstree({ plugins : [] }); // create an instance with some options * $('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments * $('#tree2').jstree(); // get an existing instance (or create an instance) * $('#tree2').jstree(true); // get an existing instance (will not create new instance) * $('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method) * * @name $().jstree([arg]) * @param {String|Object} arg * @return {Mixed} */ $.fn.jstree = function (arg) { // check for string argument var is_method = (typeof arg === 'string'), args = Array.prototype.slice.call(arguments, 1), result = null; if(arg === true && !this.length) { return false; } this.each(function () { // get the instance (if there is one) and method (if it exists) var instance = $.jstree.reference(this), method = is_method && instance ? instance[arg] : null; // if calling a method, and method is available - execute on the instance result = is_method && method ? method.apply(instance, args) : null; // if there is no instance and no method is being called - create one if(!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) { $.jstree.create(this, arg); } // if there is an instance and no method is called - return the instance if( (instance && !is_method) || arg === true ) { result = instance || false; } // if there was a method call which returned a result - break and return the value if(result !== null && result !== undefined) { return false; } }); // if there was a method call with a valid return value - return that, otherwise continue the chain return result !== null && result !== undefined ? result : this; }; /** * used to find elements containing an instance * * __Examples__ * * $('div:jstree').each(function () { * $(this).jstree('destroy'); * }); * * @name $(':jstree') * @return {jQuery} */ $.expr.pseudos.jstree = $.expr.createPseudo(function(search) { return function(a) { return $(a).hasClass('jstree') && $(a).data('jstree') !== undefined; }; }); /** * stores all defaults for the core * @name $.jstree.defaults.core */ $.jstree.defaults.core = { /** * data configuration * * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items). * * You can also pass in a HTML string or a JSON array here. * * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree. * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used. * * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result. * * __Examples__ * * // AJAX * $('#tree').jstree({ * 'core' : { * 'data' : { * 'url' : '/get/children/', * 'data' : function (node) { * return { 'id' : node.id }; * } * } * }); * * // direct data * $('#tree').jstree({ * 'core' : { * 'data' : [ * 'Simple root node', * { * 'id' : 'node_2', * 'text' : 'Root node with options', * 'state' : { 'opened' : true, 'selected' : true }, * 'children' : [ { 'text' : 'Child 1' }, 'Child 2'] * } * ] * } * }); * * // function * $('#tree').jstree({ * 'core' : { * 'data' : function (obj, callback) { * callback.call(this, ['Root 1', 'Root 2']); * } * }); * * @name $.jstree.defaults.core.data */ data : false, /** * configure the various strings used throughout the tree * * You can use an object where the key is the string you need to replace and the value is your replacement. * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement. * If left as `false` no replacement is made. * * __Examples__ * * $('#tree').jstree({ * 'core' : { * 'strings' : { * 'Loading ...' : 'Please wait ...' * } * } * }); * * @name $.jstree.defaults.core.strings */ strings : false, /** * determines what happens when a user tries to modify the structure of the tree * If left as `false` all operations like create, rename, delete, move or copy are prevented. * You can set this to `true` to allow all interactions or use a function to have better control. * * __Examples__ * * $('#tree').jstree({ * 'core' : { * 'check_callback' : function (operation, node, node_parent, node_position, more) { * // operation can be 'create_node', 'rename_node', 'delete_node', 'move_node', 'copy_node' or 'edit' * // in case of 'rename_node' node_position is filled with the new node name * return operation === 'rename_node' ? true : false; * } * } * }); * * @name $.jstree.defaults.core.check_callback */ check_callback : false, /** * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc) * @name $.jstree.defaults.core.error */ error : $.noop, /** * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`) * @name $.jstree.defaults.core.animation */ animation : 200, /** * a boolean indicating if multiple nodes can be selected * @name $.jstree.defaults.core.multiple */ multiple : true, /** * theme configuration object * @name $.jstree.defaults.core.themes */ themes : { /** * the name of the theme to use (if left as `false` the default theme is used) * @name $.jstree.defaults.core.themes.name */ name : false, /** * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme. * @name $.jstree.defaults.core.themes.url */ url : false, /** * the location of all jstree themes - only used if `url` is set to `true` * @name $.jstree.defaults.core.themes.dir */ dir : false, /** * a boolean indicating if connecting dots are shown * @name $.jstree.defaults.core.themes.dots */ dots : true, /** * a boolean indicating if node icons are shown * @name $.jstree.defaults.core.themes.icons */ icons : true, /** * a boolean indicating if node ellipsis should be shown - this only works with a fixed with on the container * @name $.jstree.defaults.core.themes.ellipsis */ ellipsis : false, /** * a boolean indicating if the tree background is striped * @name $.jstree.defaults.core.themes.stripes */ stripes : false, /** * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants) * @name $.jstree.defaults.core.themes.variant */ variant : false, /** * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`. * @name $.jstree.defaults.core.themes.responsive */ responsive : false }, /** * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user) * @name $.jstree.defaults.core.expand_selected_onload */ expand_selected_onload : true, /** * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true` * @name $.jstree.defaults.core.worker */ worker : true, /** * Force node text to plain text (and escape HTML). Defaults to `false` * @name $.jstree.defaults.core.force_text */ force_text : false, /** * Should the node be toggled if the text is double clicked. Defaults to `true` * @name $.jstree.defaults.core.dblclick_toggle */ dblclick_toggle : true, /** * Should the loaded nodes be part of the state. Defaults to `false` * @name $.jstree.defaults.core.loaded_state */ loaded_state : false, /** * Should the last active node be focused when the tree container is blurred and the focused again. This helps working with screen readers. Defaults to `true` * @name $.jstree.defaults.core.restore_focus */ restore_focus : true, /** * Force to compute and set "aria-setsize" and "aria-posinset" explicitly for each treeitem. * Some browsers may compute incorrect elements position and produce wrong announcements for screen readers. Defaults to `false` * @name $.jstree.defaults.core.compute_elements_positions */ compute_elements_positions : false, /** * Default keyboard shortcuts (an object where each key is the button name or combo - like 'enter', 'ctrl-space', 'p', etc and the value is the function to execute in the instance's scope) * @name $.jstree.defaults.core.keyboard */ keyboard : { 'ctrl-space': function (e) { // aria defines space only with Ctrl e.type = "click"; $(e.currentTarget).trigger(e); }, 'enter': function (e) { // enter e.type = "click"; $(e.currentTarget).trigger(e); }, 'left': function (e) { // left e.preventDefault(); if(this.is_open(e.currentTarget)) { this.close_node(e.currentTarget); } else { var o = this.get_parent(e.currentTarget); if(o && o.id !== $.jstree.root) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); } } }, 'up': function (e) { // up e.preventDefault(); var o = this.get_prev_dom(e.currentTarget); if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); } }, 'right': function (e) { // right e.preventDefault(); if(this.is_closed(e.currentTarget)) { this.open_node(e.currentTarget, function (o) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); }); } else if (this.is_open(e.currentTarget)) { var o = this.get_node(e.currentTarget, true).children('.jstree-children')[0]; if(o) { $(this._firstChild(o)).children('.jstree-anchor').trigger('focus'); } } }, 'down': function (e) { // down e.preventDefault(); var o = this.get_next_dom(e.currentTarget); if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); } }, '*': function (e) { // aria defines * on numpad as open_all - not very common this.open_all(); }, 'home': function (e) { // home e.preventDefault(); var o = this._firstChild(this.get_container_ul()[0]); if(o) { $(o).children('.jstree-anchor').filter(':visible').trigger('focus'); } }, 'end': function (e) { // end e.preventDefault(); this.element.find('.jstree-anchor').filter(':visible').last().trigger('focus'); }, 'f2': function (e) { // f2 - safe to include - if check_callback is false it will fail e.preventDefault(); this.edit(e.currentTarget); } } }; $.jstree.core.prototype = { /** * used to decorate an instance with a plugin. Used internally. * @private * @name plugin(deco [, opts]) * @param {String} deco the plugin to decorate with * @param {Object} opts options for the plugin * @return {jsTree} */ plugin : function (deco, opts) { var Child = $.jstree.plugins[deco]; if(Child) { this._data[deco] = {}; Child.prototype = this; return new Child(opts, this); } return this; }, /** * initialize the instance. Used internally. * @private * @name init(el, optons) * @param {DOMElement|jQuery|String} el the element we are transforming * @param {Object} options options for this instance * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree */ init : function (el, options) { this._model = { data : {}, changed : [], force_full_redraw : false, redraw_timeout : false, default_state : { loaded : true, opened : false, selected : false, disabled : false } }; this._model.data[$.jstree.root] = { id : $.jstree.root, parent : null, parents : [], children : [], children_d : [], state : { loaded : false } }; this.element = $(el).addClass('jstree jstree-' + this._id); this.settings = options; this._data.core.ready = false; this._data.core.loaded = false; this._data.core.rtl = (this.element.css("direction") === "rtl"); this.element[this._data.core.rtl ? 'addClass' : 'removeClass']("jstree-rtl"); this.element.attr('role','tree'); if(this.settings.core.multiple) { this.element.attr('aria-multiselectable', true); } if(!this.element.attr('tabindex')) { this.element.attr('tabindex','0'); } this.bind(); /** * triggered after all events are bound * @event * @name init.jstree */ this.trigger("init"); this._data.core.original_container_html = this.element.find(" > ul > li").clone(true); this._data.core.original_container_html .find("li").addBack() .contents().filter(function() { return this.nodeType === 3 && (!this.nodeValue || /^\s+$/.test(this.nodeValue)); }) .remove(); this.element.html("<"+"ul class='jstree-container-ul jstree-children' role='group'><"+"li id='j"+this._id+"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none'><"+"a class='jstree-anchor' role='treeitem' href='#'>" + this.get_string("Loading ...") + ""); this.element.attr('aria-activedescendant','j' + this._id + '_loading'); this._data.core.li_height = this.get_container_ul().children("li").first().outerHeight() || 24; this._data.core.node = this._create_prototype_node(); /** * triggered after the loading text is shown and before loading starts * @event * @name loading.jstree */ this.trigger("loading"); this.load_node($.jstree.root); }, /** * destroy an instance * @name destroy() * @param {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact */ destroy : function (keep_html) { /** * triggered before the tree is destroyed * @event * @name destroy.jstree */ this.trigger("destroy"); if(this._wrk) { try { window.URL.revokeObjectURL(this._wrk); this._wrk = null; } catch (ignore) { } } if(!keep_html) { this.element.empty(); } this.teardown(); }, /** * Create a prototype node * @name _create_prototype_node() * @return {DOMElement} */ _create_prototype_node : function () { var _node = document.createElement('LI'), _temp1, _temp2; _node.setAttribute('role', 'none'); _temp1 = document.createElement('I'); _temp1.className = 'jstree-icon jstree-ocl'; _temp1.setAttribute('role', 'presentation'); _node.appendChild(_temp1); _temp1 = document.createElement('A'); _temp1.className = 'jstree-anchor'; _temp1.setAttribute('href','#'); _temp1.setAttribute('tabindex','-1'); _temp1.setAttribute('role', 'treeitem'); _temp2 = document.createElement('I'); _temp2.className = 'jstree-icon jstree-themeicon'; _temp2.setAttribute('role', 'presentation'); _temp1.appendChild(_temp2); _node.appendChild(_temp1); _temp1 = _temp2 = null; return _node; }, _kbevent_to_func : function (e) { var keys = { 8: "Backspace", 9: "Tab", 13: "Enter", 19: "Pause", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "Print", 45: "Insert", 46: "Delete", 96: "Numpad0", 97: "Numpad1", 98: "Numpad2", 99 : "Numpad3", 100: "Numpad4", 101: "Numpad5", 102: "Numpad6", 103: "Numpad7", 104: "Numpad8", 105: "Numpad9", '-13': "NumpadEnter", 112: "F1", 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 144: "Numlock", 145: "Scrolllock", 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*', 173: '-' }; var parts = []; if (e.ctrlKey) { parts.push('ctrl'); } if (e.altKey) { parts.push('alt'); } if (e.shiftKey) { parts.push('shift'); } parts.push(keys[e.which] ? keys[e.which].toLowerCase() : e.which); parts = parts.sort().join('-').toLowerCase(); if (parts === 'shift-shift' || parts === 'ctrl-ctrl' || parts === 'alt-alt') { return null; } var kb = this.settings.core.keyboard, i, tmp; for (i in kb) { if (kb.hasOwnProperty(i)) { tmp = i; if (tmp !== '-' && tmp !== '+') { tmp = tmp.replace('--', '-MINUS').replace('+-', '-MINUS').replace('++', '-PLUS').replace('-+', '-PLUS'); tmp = tmp.split(/-|\+/).sort().join('-').replace('MINUS', '-').replace('PLUS', '+').toLowerCase(); } if (tmp === parts) { return kb[i]; } } } return null; }, /** * part of the destroying of an instance. Used internally. * @private * @name teardown() */ teardown : function () { this.unbind(); this.element .removeClass('jstree') .removeData('jstree') .find("[class^='jstree']") .addBack() .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); }); this.element = null; }, /** * bind all events. Used internally. * @private * @name bind() */ bind : function () { var word = '', tout = null, was_click = 0; this.element .on("dblclick.jstree", function (e) { if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if(document.selection && document.selection.empty) { document.selection.empty(); } else { if(window.getSelection) { var sel = window.getSelection(); try { sel.removeAllRanges(); sel.collapse(); } catch (ignore) { } } } }) .on("mousedown.jstree", function (e) { if(e.target === this.element[0]) { e.preventDefault(); // prevent losing focus when clicking scroll arrows (FF, Chrome) was_click = +(new Date()); // ie does not allow to prevent losing focus } }.bind(this)) .on("mousedown.jstree", ".jstree-ocl", function (e) { e.preventDefault(); // prevent any node inside from losing focus when clicking the open/close icon }) .on("click.jstree", ".jstree-ocl", function (e) { this.toggle_node(e.target); }.bind(this)) .on("dblclick.jstree", ".jstree-anchor", function (e) { if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if(this.settings.core.dblclick_toggle) { this.toggle_node(e.target); } }.bind(this)) .on("click.jstree", ".jstree-anchor", function (e) { e.preventDefault(); if(e.currentTarget !== document.activeElement) { $(e.currentTarget).trigger('focus'); } this.activate_node(e.currentTarget, e); }.bind(this)) .on('keydown.jstree', '.jstree-anchor', function (e) { if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if(this._data.core.rtl) { if(e.which === 37) { e.which = 39; } else if(e.which === 39) { e.which = 37; } } var f = this._kbevent_to_func(e); if (f) { var r = f.call(this, e); if (r === false || r === true) { return r; } } }.bind(this)) .on("load_node.jstree", function (e, data) { if(data.status) { if(data.node.id === $.jstree.root && !this._data.core.loaded) { this._data.core.loaded = true; if(this._firstChild(this.get_container_ul()[0])) { this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id); } /** * triggered after the root node is loaded for the first time * @event * @name loaded.jstree */ this.trigger("loaded"); } if(!this._data.core.ready) { setTimeout(function() { if(this.element && !this.get_container_ul().find('.jstree-loading').length) { this._data.core.ready = true; if(this._data.core.selected.length) { if(this.settings.core.expand_selected_onload) { var tmp = [], i, j; for(i = 0, j = this._data.core.selected.length; i < j; i++) { tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents); } tmp = $.vakata.array_unique(tmp); for(i = 0, j = tmp.length; i < j; i++) { this.open_node(tmp[i], false, 0); } } this.trigger('changed', { 'action' : 'ready', 'selected' : this._data.core.selected }); } /** * triggered after all nodes are finished loading * @event * @name ready.jstree */ this.trigger("ready"); } }.bind(this), 0); } } }.bind(this)) // quick searching when the tree is focused .on('keypress.jstree', function (e) { if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if(tout) { clearTimeout(tout); } tout = setTimeout(function () { word = ''; }, 500); var chr = String.fromCharCode(e.which).toLowerCase(), col = this.element.find('.jstree-anchor').filter(':visible'), ind = col.index(document.activeElement) || 0, end = false; word += chr; // match for whole word from current node down (including the current node) if(word.length > 1) { col.slice(ind).each(function (i, v) { if($(v).text().toLowerCase().indexOf(word) === 0) { $(v).trigger('focus'); end = true; return false; } }.bind(this)); if(end) { return; } // match for whole word from the beginning of the tree col.slice(0, ind).each(function (i, v) { if($(v).text().toLowerCase().indexOf(word) === 0) { $(v).trigger('focus'); end = true; return false; } }.bind(this)); if(end) { return; } } // list nodes that start with that letter (only if word consists of a single char) if(new RegExp('^' + chr.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '+$').test(word)) { // search for the next node starting with that letter col.slice(ind + 1).each(function (i, v) { if($(v).text().toLowerCase().charAt(0) === chr) { $(v).trigger('focus'); end = true; return false; } }.bind(this)); if(end) { return; } // search from the beginning col.slice(0, ind + 1).each(function (i, v) { if($(v).text().toLowerCase().charAt(0) === chr) { $(v).trigger('focus'); end = true; return false; } }.bind(this)); if(end) { return; } } }.bind(this)) // THEME RELATED .on("init.jstree", function () { var s = this.settings.core.themes; this._data.core.themes.dots = s.dots; this._data.core.themes.stripes = s.stripes; this._data.core.themes.icons = s.icons; this._data.core.themes.ellipsis = s.ellipsis; this.set_theme(s.name || "default", s.url); this.set_theme_variant(s.variant); }.bind(this)) .on("loading.jstree", function () { this[ this._data.core.themes.dots ? "show_dots" : "hide_dots" ](); this[ this._data.core.themes.icons ? "show_icons" : "hide_icons" ](); this[ this._data.core.themes.stripes ? "show_stripes" : "hide_stripes" ](); this[ this._data.core.themes.ellipsis ? "show_ellipsis" : "hide_ellipsis" ](); }.bind(this)) .on('blur.jstree', '.jstree-anchor', function (e) { this._data.core.focused = null; $(e.currentTarget).filter('.jstree-hovered').trigger('mouseleave'); this.element.attr('tabindex', '0'); $(e.currentTarget).attr('tabindex', '-1'); }.bind(this)) .on('focus.jstree', '.jstree-anchor', function (e) { var tmp = this.get_node(e.currentTarget); if(tmp && (tmp.id || tmp.id === 0)) { this._data.core.focused = tmp.id; } this.element.find('.jstree-hovered').not(e.currentTarget).trigger('mouseleave'); $(e.currentTarget).trigger('mouseenter'); this.element.attr('tabindex', '-1'); $(e.currentTarget).attr('tabindex', '0'); }.bind(this)) .on('focus.jstree', function () { if(+(new Date()) - was_click > 500 && !this._data.core.focused && this.settings.core.restore_focus) { was_click = 0; var act = this.get_node(this.element.attr('aria-activedescendant'), true); if(act) { act.find('> .jstree-anchor').trigger('focus'); } } }.bind(this)) .on('mouseenter.jstree', '.jstree-anchor', function (e) { this.hover_node(e.currentTarget); }.bind(this)) .on('mouseleave.jstree', '.jstree-anchor', function (e) { this.dehover_node(e.currentTarget); }.bind(this)); }, /** * part of the destroying of an instance. Used internally. * @private * @name unbind() */ unbind : function () { this.element.off('.jstree'); $(document).off('.jstree-' + this._id); }, /** * trigger an event. Used internally. * @private * @name trigger(ev [, data]) * @param {String} ev the name of the event to trigger * @param {Object} data additional data to pass with the event */ trigger : function (ev, data) { if(!data) { data = {}; } data.instance = this; this.element.triggerHandler(ev.replace('.jstree','') + '.jstree', data); }, /** * returns the jQuery extended instance container * @name get_container() * @return {jQuery} */ get_container : function () { return this.element; }, /** * returns the jQuery extended main UL node inside the instance container. Used internally. * @private * @name get_container_ul() * @return {jQuery} */ get_container_ul : function () { return this.element.children(".jstree-children").first(); }, /** * gets string replacements (localization). Used internally. * @private * @name get_string(key) * @param {String} key * @return {String} */ get_string : function (key) { var a = this.settings.core.strings; if($.vakata.is_function(a)) { return a.call(this, key); } if(a && a[key]) { return a[key]; } return key; }, /** * gets the first child of a DOM node. Used internally. * @private * @name _firstChild(dom) * @param {DOMElement} dom * @return {DOMElement} */ _firstChild : function (dom) { dom = dom ? dom.firstChild : null; while(dom !== null && dom.nodeType !== 1) { dom = dom.nextSibling; } return dom; }, /** * gets the next sibling of a DOM node. Used internally. * @private * @name _nextSibling(dom) * @param {DOMElement} dom * @return {DOMElement} */ _nextSibling : function (dom) { dom = dom ? dom.nextSibling : null; while(dom !== null && dom.nodeType !== 1) { dom = dom.nextSibling; } return dom; }, /** * gets the previous sibling of a DOM node. Used internally. * @private * @name _previousSibling(dom) * @param {DOMElement} dom * @return {DOMElement} */ _previousSibling : function (dom) { dom = dom ? dom.previousSibling : null; while(dom !== null && dom.nodeType !== 1) { dom = dom.previousSibling; } return dom; }, /** * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc) * @name get_node(obj [, as_dom]) * @param {mixed} obj * @param {Boolean} as_dom * @return {Object|jQuery} */ get_node : function (obj, as_dom) { if(obj && (obj.id || obj.id === 0)) { obj = obj.id; } if (obj instanceof $ && obj.length && obj[0].id) { obj = obj[0].id; } var dom; try { if(this._model.data[obj]) { obj = this._model.data[obj]; } else if(typeof obj === "string" && this._model.data[obj.replace(/^#/, '')]) { obj = this._model.data[obj.replace(/^#/, '')]; } else if(typeof obj === "string" && (dom = $('#' + obj.replace($.jstree.idregex,'\\$&'), this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) { obj = this._model.data[dom.closest('.jstree-node').attr('id')]; } else if((dom = this.element.find(obj)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) { obj = this._model.data[dom.closest('.jstree-node').attr('id')]; } else if((dom = this.element.find(obj)).length && dom.hasClass('jstree')) { obj = this._model.data[$.jstree.root]; } else { return false; } if(as_dom) { obj = obj.id === $.jstree.root ? this.element : $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element); } return obj; } catch (ex) { return false; } }, /** * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array) * @name get_path(obj [, glue, ids]) * @param {mixed} obj the node * @param {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned * @param {Boolean} ids if set to true build the path using ID, otherwise node text is used * @return {mixed} */ get_path : function (obj, glue, ids) { obj = obj.parents ? obj : this.get_node(obj); if(!obj || obj.id === $.jstree.root || !obj.parents) { return false; } var i, j, p = []; p.push(ids ? obj.id : obj.text); for(i = 0, j = obj.parents.length; i < j; i++) { p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i])); } p = p.reverse().slice(1); return glue ? p.join(glue) : p; }, /** * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned. * @name get_next_dom(obj [, strict]) * @param {mixed} obj * @param {Boolean} strict * @return {jQuery} */ get_next_dom : function (obj, strict) { var tmp; obj = this.get_node(obj, true); if(obj[0] === this.element[0]) { tmp = this._firstChild(this.get_container_ul()[0]); while (tmp && tmp.offsetHeight === 0) { tmp = this._nextSibling(tmp); } return tmp ? $(tmp) : false; } if(!obj || !obj.length) { return false; } if(strict) { tmp = obj[0]; do { tmp = this._nextSibling(tmp); } while (tmp && tmp.offsetHeight === 0); return tmp ? $(tmp) : false; } if(obj.hasClass("jstree-open")) { tmp = this._firstChild(obj.children('.jstree-children')[0]); while (tmp && tmp.offsetHeight === 0) { tmp = this._nextSibling(tmp); } if(tmp !== null) { return $(tmp); } } tmp = obj[0]; do { tmp = this._nextSibling(tmp); } while (tmp && tmp.offsetHeight === 0); if(tmp !== null) { return $(tmp); } return obj.parentsUntil(".jstree",".jstree-node").nextAll(".jstree-node:visible").first(); }, /** * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned. * @name get_prev_dom(obj [, strict]) * @param {mixed} obj * @param {Boolean} strict * @return {jQuery} */ get_prev_dom : function (obj, strict) { var tmp; obj = this.get_node(obj, true); if(obj[0] === this.element[0]) { tmp = this.get_container_ul()[0].lastChild; while (tmp && tmp.offsetHeight === 0) { tmp = this._previousSibling(tmp); } return tmp ? $(tmp) : false; } if(!obj || !obj.length) { return false; } if(strict) { tmp = obj[0]; do { tmp = this._previousSibling(tmp); } while (tmp && tmp.offsetHeight === 0); return tmp ? $(tmp) : false; } tmp = obj[0]; do { tmp = this._previousSibling(tmp); } while (tmp && tmp.offsetHeight === 0); if(tmp !== null) { obj = $(tmp); while(obj.hasClass("jstree-open")) { obj = obj.children(".jstree-children").first().children(".jstree-node:visible:last"); } return obj; } tmp = obj[0].parentNode.parentNode; return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false; }, /** * get the parent ID of a node * @name get_parent(obj) * @param {mixed} obj * @return {String} */ get_parent : function (obj) { obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } return obj.parent; }, /** * get a jQuery collection of all the children of a node (node must be rendered), returns false on error * @name get_children_dom(obj) * @param {mixed} obj * @return {jQuery} */ get_children_dom : function (obj) { obj = this.get_node(obj, true); if(obj[0] === this.element[0]) { return this.get_container_ul().children(".jstree-node"); } if(!obj || !obj.length) { return false; } return obj.children(".jstree-children").children(".jstree-node"); }, /** * checks if a node has children * @name is_parent(obj) * @param {mixed} obj * @return {Boolean} */ is_parent : function (obj) { obj = this.get_node(obj); return obj && (obj.state.loaded === false || obj.children.length > 0); }, /** * checks if a node is loaded (its children are available) * @name is_loaded(obj) * @param {mixed} obj * @return {Boolean} */ is_loaded : function (obj) { obj = this.get_node(obj); return obj && obj.state.loaded; }, /** * check if a node is currently loading (fetching children) * @name is_loading(obj) * @param {mixed} obj * @return {Boolean} */ is_loading : function (obj) { obj = this.get_node(obj); return obj && obj.state && obj.state.loading; }, /** * check if a node is opened * @name is_open(obj) * @param {mixed} obj * @return {Boolean} */ is_open : function (obj) { obj = this.get_node(obj); return obj && obj.state.opened; }, /** * check if a node is in a closed state * @name is_closed(obj) * @param {mixed} obj * @return {Boolean} */ is_closed : function (obj) { obj = this.get_node(obj); return obj && this.is_parent(obj) && !obj.state.opened; }, /** * check if a node has no children * @name is_leaf(obj) * @param {mixed} obj * @return {Boolean} */ is_leaf : function (obj) { return !this.is_parent(obj); }, /** * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array. * @name load_node(obj [, callback]) * @param {mixed} obj * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status * @return {Boolean} * @trigger load_node.jstree */ load_node : function (obj, callback) { var dom = this.get_node(obj, true), k, l, i, j, c; if($.vakata.is_array(obj)) { this._load_nodes(obj.slice(), callback); return true; } obj = this.get_node(obj); if(!obj) { if(callback) { callback.call(this, obj, false); } return false; } // if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again? if(obj.state.loaded) { obj.state.loaded = false; for(i = 0, j = obj.parents.length; i < j; i++) { this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) { return $.inArray(v, obj.children_d) === -1; }); } for(k = 0, l = obj.children_d.length; k < l; k++) { if(this._model.data[obj.children_d[k]].state.selected) { c = true; } delete this._model.data[obj.children_d[k]]; } if (c) { this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) { return $.inArray(v, obj.children_d) === -1; }); } obj.children = []; obj.children_d = []; if(c) { this.trigger('changed', { 'action' : 'load_node', 'node' : obj, 'selected' : this._data.core.selected }); } } obj.state.failed = false; obj.state.loading = true; if (obj.id !== $.jstree.root) { dom.children(".jstree-anchor").attr('aria-busy', true); } else { dom.attr('aria-busy', true); } dom.addClass("jstree-loading"); this._load_node(obj, function (status) { obj = this._model.data[obj.id]; obj.state.loading = false; obj.state.loaded = status; obj.state.failed = !obj.state.loaded; var dom = this.get_node(obj, true), i = 0, j = 0, m = this._model.data, has_children = false; for(i = 0, j = obj.children.length; i < j; i++) { if(m[obj.children[i]] && !m[obj.children[i]].state.hidden) { has_children = true; break; } } if(obj.state.loaded && dom && dom.length) { dom.removeClass('jstree-closed jstree-open jstree-leaf'); if (!has_children) { dom.addClass('jstree-leaf'); } else { if (obj.id !== '#') { dom.addClass(obj.state.opened ? 'jstree-open' : 'jstree-closed'); } } } if (obj.id !== $.jstree.root) { dom.children(".jstree-anchor").attr('aria-busy', false); } else { dom.attr('aria-busy', false); } dom.removeClass("jstree-loading"); /** * triggered after a node is loaded * @event * @name load_node.jstree * @param {Object} node the node that was loading * @param {Boolean} status was the node loaded successfully */ this.trigger('load_node', { "node" : obj, "status" : status }); if(callback) { callback.call(this, obj, status); } }.bind(this)); return true; }, /** * load an array of nodes (will also load unavailable nodes as soon as they appear in the structure). Used internally. * @private * @name _load_nodes(nodes [, callback]) * @param {array} nodes * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes */ _load_nodes : function (nodes, callback, is_callback, force_reload) { var r = true, c = function () { this._load_nodes(nodes, callback, true); }, m = this._model.data, i, j, tmp = []; for(i = 0, j = nodes.length; i < j; i++) { if(m[nodes[i]] && ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || (!is_callback && force_reload) )) { if(!this.is_loading(nodes[i])) { this.load_node(nodes[i], c); } r = false; } } if(r) { for(i = 0, j = nodes.length; i < j; i++) { if(m[nodes[i]] && m[nodes[i]].state.loaded) { tmp.push(nodes[i]); } } if(callback && !callback.done) { callback.call(this, tmp); callback.done = true; } } }, /** * loads all unloaded nodes * @name load_all([obj, callback]) * @param {mixed} obj the node to load recursively, omit to load all nodes in the tree * @param {function} callback a function to be executed once loading all the nodes is complete, * @trigger load_all.jstree */ load_all : function (obj, callback) { if(!obj) { obj = $.jstree.root; } obj = this.get_node(obj); if(!obj) { return false; } var to_load = [], m = this._model.data, c = m[obj.id].children_d, i, j; if(obj.state && !obj.state.loaded) { to_load.push(obj.id); } for(i = 0, j = c.length; i < j; i++) { if(m[c[i]] && m[c[i]].state && !m[c[i]].state.loaded) { to_load.push(c[i]); } } if(to_load.length) { this._load_nodes(to_load, function () { this.load_all(obj, callback); }); } else { /** * triggered after a load_all call completes * @event * @name load_all.jstree * @param {Object} node the recursively loaded node */ if(callback) { callback.call(this, obj); } this.trigger('load_all', { "node" : obj }); } }, /** * handles the actual loading of a node. Used only internally. * @private * @name _load_node(obj [, callback]) * @param {mixed} obj * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status * @return {Boolean} */ _load_node : function (obj, callback) { var s = this.settings.core.data, t; var notTextOrCommentNode = function notTextOrCommentNode () { return this.nodeType !== 3 && this.nodeType !== 8; }; // use original HTML if(!s) { if(obj.id === $.jstree.root) { return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) { callback.call(this, status); }); } else { return callback.call(this, false); } // return callback.call(this, obj.id === $.jstree.root ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false); } if($.vakata.is_function(s)) { return s.call(this, obj, function (d) { if(d === false) { callback.call(this, false); } else { this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $($.parseHTML(d)).filter(notTextOrCommentNode) : d, function (status) { callback.call(this, status); }); } // return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d)); }.bind(this)); } if(typeof s === 'object') { if(s.url) { s = $.extend(true, {}, s); if($.vakata.is_function(s.url)) { s.url = s.url.call(this, obj); } if($.vakata.is_function(s.data)) { s.data = s.data.call(this, obj); } return $.ajax(s) .done(function (d,t,x) { var type = x.getResponseHeader('Content-Type'); if((type && type.indexOf('json') !== -1) || typeof d === "object") { return this._append_json_data(obj, d, function (status) { callback.call(this, status); }); //return callback.call(this, this._append_json_data(obj, d)); } if((type && type.indexOf('html') !== -1) || typeof d === "string") { return this._append_html_data(obj, $($.parseHTML(d)).filter(notTextOrCommentNode), function (status) { callback.call(this, status); }); // return callback.call(this, this._append_html_data(obj, $(d))); } this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : x }) }; this.settings.core.error.call(this, this._data.core.last_error); return callback.call(this, false); }.bind(this)) .fail(function (f) { this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : f }) }; callback.call(this, false); this.settings.core.error.call(this, this._data.core.last_error); }.bind(this)); } if ($.vakata.is_array(s)) { t = $.extend(true, [], s); } else if ($.isPlainObject(s)) { t = $.extend(true, {}, s); } else { t = s; } if(obj.id === $.jstree.root) { return this._append_json_data(obj, t, function (status) { callback.call(this, status); }); } else { this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_05', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) }; this.settings.core.error.call(this, this._data.core.last_error); return callback.call(this, false); } //return callback.call(this, (obj.id === $.jstree.root ? this._append_json_data(obj, t) : false) ); } if(typeof s === 'string') { if(obj.id === $.jstree.root) { return this._append_html_data(obj, $($.parseHTML(s)).filter(notTextOrCommentNode), function (status) { callback.call(this, status); }); } else { this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_06', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) }; this.settings.core.error.call(this, this._data.core.last_error); return callback.call(this, false); } //return callback.call(this, (obj.id === $.jstree.root ? this._append_html_data(obj, $(s)) : false) ); } return callback.call(this, false); }, /** * adds a node to the list of nodes to redraw. Used only internally. * @private * @name _node_changed(obj [, callback]) * @param {mixed} obj */ _node_changed : function (obj) { obj = this.get_node(obj); if (obj && $.inArray(obj.id, this._model.changed) === -1) { this._model.changed.push(obj.id); } }, /** * appends HTML content to the tree. Used internally. * @private * @name _append_html_data(obj, data) * @param {mixed} obj the node to append to * @param {String} data the HTML string to parse and append * @trigger model.jstree, changed.jstree */ _append_html_data : function (dom, data, cb) { dom = this.get_node(dom); dom.children = []; dom.children_d = []; var dat = data.is('ul') ? data.children() : data, par = dom.id, chd = [], dpc = [], m = this._model.data, p = m[par], s = this._data.core.selected.length, tmp, i, j; dat.each(function (i, v) { tmp = this._parse_model_from_html($(v), par, p.parents.concat()); if(tmp) { chd.push(tmp); dpc.push(tmp); if(m[tmp].children_d.length) { dpc = dpc.concat(m[tmp].children_d); } } }.bind(this)); p.children = chd; p.children_d = dpc; for(i = 0, j = p.parents.length; i < j; i++) { m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); } /** * triggered when new data is inserted to the tree model * @event * @name model.jstree * @param {Array} nodes an array of node IDs * @param {String} parent the parent ID of the nodes */ this.trigger('model', { "nodes" : dpc, 'parent' : par }); if(par !== $.jstree.root) { this._node_changed(par); this.redraw(); } else { this.get_container_ul().children('.jstree-initial-node').remove(); this.redraw(true); } if(this._data.core.selected.length !== s) { this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected }); } cb.call(this, true); }, /** * appends JSON content to the tree. Used internally. * @private * @name _append_json_data(obj, data) * @param {mixed} obj the node to append to * @param {String} data the JSON object to parse and append * @param {Boolean} force_processing internal param - do not set * @trigger model.jstree, changed.jstree */ _append_json_data : function (dom, data, cb, force_processing) { if(this.element === null) { return; } dom = this.get_node(dom); dom.children = []; dom.children_d = []; // *%$@!!! if(data.d) { data = data.d; if(typeof data === "string") { data = JSON.parse(data); } } if(!$.vakata.is_array(data)) { data = [data]; } var w = null, args = { 'df' : this._model.default_state, 'dat' : data, 'par' : dom.id, 'm' : this._model.data, 't_id' : this._id, 't_cnt' : this._cnt, 'sel' : this._data.core.selected }, inst = this, func = function (data, undefined) { if(data.data) { data = data.data; } var dat = data.dat, par = data.par, chd = [], dpc = [], add = [], df = data.df, t_id = data.t_id, t_cnt = data.t_cnt, m = data.m, p = m[par], sel = data.sel, tmp, i, j, rslt, parse_flat = function (d, p, ps) { if(!ps) { ps = []; } else { ps = ps.concat(); } if(p) { ps.unshift(p); } var tid = d.id.toString(), i, j, c, e, tmp = { id : tid, text : d.text || '', icon : d.icon !== undefined ? d.icon : true, parent : p, parents : ps, children : d.children || [], children_d : d.children_d || [], data : d.data, state : { }, li_attr : { id : false }, a_attr : { href : '#' }, original : false }; for(i in df) { if(df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if(d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if(d && d.data) { tmp.data = d.data; if(d.data.jstree) { for(i in d.data.jstree) { if(d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if(d && typeof d.state === 'object') { for (i in d.state) { if(d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if(d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if(d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if(!tmp.li_attr.id) { tmp.li_attr.id = tid; } if(d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if(d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if(d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } m[tmp.id] = tmp; for(i = 0, j = tmp.children.length; i < j; i++) { c = parse_flat(m[tmp.children[i]], tmp.id, ps); e = m[c]; tmp.children_d.push(c); if(e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } delete d.data; delete d.children; m[tmp.id].original = d; if(tmp.state.selected) { add.push(tmp.id); } return tmp.id; }, parse_nest = function (d, p, ps) { if(!ps) { ps = []; } else { ps = ps.concat(); } if(p) { ps.unshift(p); } var tid = false, i, j, c, e, tmp; do { tid = 'j' + t_id + '_' + (++t_cnt); } while(m[tid]); tmp = { id : false, text : typeof d === 'string' ? d : '', icon : typeof d === 'object' && d.icon !== undefined ? d.icon : true, parent : p, parents : ps, children : [], children_d : [], data : null, state : { }, li_attr : { id : false }, a_attr : { href : '#' }, original : false }; for(i in df) { if(df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); } if(d && d.text) { tmp.text = d.text; } if(d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if(d && d.data) { tmp.data = d.data; if(d.data.jstree) { for(i in d.data.jstree) { if(d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if(d && typeof d.state === 'object') { for (i in d.state) { if(d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if(d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if(d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) { tmp.id = tmp.li_attr.id.toString(); } if(!(tmp.id || tmp.id === 0)) { tmp.id = tid; } if(!tmp.li_attr.id) { tmp.li_attr.id = tmp.id; } if(d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if(d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if(d && d.children && d.children.length) { for(i = 0, j = d.children.length; i < j; i++) { c = parse_nest(d.children[i], tmp.id, ps); e = m[c]; tmp.children.push(c); if(e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } tmp.children_d = tmp.children_d.concat(tmp.children); } if(d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } delete d.data; delete d.children; tmp.original = d; m[tmp.id] = tmp; if(tmp.state.selected) { add.push(tmp.id); } return tmp.id; }; if(dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) { // Flat JSON support (for easy import from DB): // 1) convert to object (foreach) for(i = 0, j = dat.length; i < j; i++) { if(!dat[i].children) { dat[i].children = []; } if(!dat[i].state) { dat[i].state = {}; } m[dat[i].id.toString()] = dat[i]; } // 2) populate children (foreach) for(i = 0, j = dat.length; i < j; i++) { if (!m[dat[i].parent.toString()]) { if (typeof inst !== "undefined") { inst._data.core.last_error = { 'error' : 'parse', 'plugin' : 'core', 'id' : 'core_07', 'reason' : 'Node with invalid parent', 'data' : JSON.stringify({ 'id' : dat[i].id.toString(), 'parent' : dat[i].parent.toString() }) }; inst.settings.core.error.call(inst, inst._data.core.last_error); } continue; } m[dat[i].parent.toString()].children.push(dat[i].id.toString()); // populate parent.children_d p.children_d.push(dat[i].id.toString()); } // 3) normalize && populate parents and children_d with recursion for(i = 0, j = p.children.length; i < j; i++) { tmp = parse_flat(m[p.children[i]], par, p.parents.concat()); dpc.push(tmp); if(m[tmp].children_d.length) { dpc = dpc.concat(m[tmp].children_d); } } for(i = 0, j = p.parents.length; i < j; i++) { m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); } // ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true; rslt = { 'cnt' : t_cnt, 'mod' : m, 'sel' : sel, 'par' : par, 'dpc' : dpc, 'add' : add }; } else { for(i = 0, j = dat.length; i < j; i++) { tmp = parse_nest(dat[i], par, p.parents.concat()); if(tmp) { chd.push(tmp); dpc.push(tmp); if(m[tmp].children_d.length) { dpc = dpc.concat(m[tmp].children_d); } } } p.children = chd; p.children_d = dpc; for(i = 0, j = p.parents.length; i < j; i++) { m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); } rslt = { 'cnt' : t_cnt, 'mod' : m, 'sel' : sel, 'par' : par, 'dpc' : dpc, 'add' : add }; } if(typeof window === 'undefined' || typeof window.document === 'undefined') { postMessage(rslt); } else { return rslt; } }, rslt = function (rslt, worker) { if(this.element === null) { return; } this._cnt = rslt.cnt; var i, m = this._model.data; for (i in m) { if (m.hasOwnProperty(i) && m[i].state && m[i].state.loading && rslt.mod[i]) { rslt.mod[i].state.loading = true; } } this._model.data = rslt.mod; // breaks the reference in load_node - careful if(worker) { var j, a = rslt.add, r = rslt.sel, s = this._data.core.selected.slice(); m = this._model.data; // if selection was changed while calculating in worker if(r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) { // deselect nodes that are no longer selected for(i = 0, j = r.length; i < j; i++) { if($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) { m[r[i]].state.selected = false; } } // select nodes that were selected in the mean time for(i = 0, j = s.length; i < j; i++) { if($.inArray(s[i], r) === -1) { m[s[i]].state.selected = true; } } } } if(rslt.add.length) { this._data.core.selected = this._data.core.selected.concat(rslt.add); } this.trigger('model', { "nodes" : rslt.dpc, 'parent' : rslt.par }); if(rslt.par !== $.jstree.root) { this._node_changed(rslt.par); this.redraw(); } else { // this.get_container_ul().children('.jstree-initial-node').remove(); this.redraw(true); } if(rslt.add.length) { this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected }); } // If no worker, try to mimic worker behavioour, by invoking cb asynchronously if (!worker && setImmediate) { setImmediate(function(){ cb.call(inst, true); }); } else { cb.call(inst, true); } }; if(this.settings.core.worker && window.Blob && window.URL && window.Worker) { try { if(this._wrk === null) { this._wrk = window.URL.createObjectURL( new window.Blob( ['self.onmessage = ' + func.toString()], {type:"text/javascript"} ) ); } if(!this._data.core.working || force_processing) { this._data.core.working = true; w = new window.Worker(this._wrk); w.onmessage = function (e) { rslt.call(this, e.data, true); try { w.terminate(); w = null; } catch(ignore) { } if(this._data.core.worker_queue.length) { this._append_json_data.apply(this, this._data.core.worker_queue.shift()); } else { this._data.core.working = false; } }.bind(this); w.onerror = function (e) { rslt.call(this, func(args), false); if(this._data.core.worker_queue.length) { this._append_json_data.apply(this, this._data.core.worker_queue.shift()); } else { this._data.core.working = false; } }.bind(this); if(!args.par) { if(this._data.core.worker_queue.length) { this._append_json_data.apply(this, this._data.core.worker_queue.shift()); } else { this._data.core.working = false; } } else { w.postMessage(args); } } else { this._data.core.worker_queue.push([dom, data, cb, true]); } } catch(e) { rslt.call(this, func(args), false); if(this._data.core.worker_queue.length) { this._append_json_data.apply(this, this._data.core.worker_queue.shift()); } else { this._data.core.working = false; } } } else { rslt.call(this, func(args), false); } }, /** * parses a node from a jQuery object and appends them to the in memory tree model. Used internally. * @private * @name _parse_model_from_html(d [, p, ps]) * @param {jQuery} d the jQuery object to parse * @param {String} p the parent ID * @param {Array} ps list of all parents * @return {String} the ID of the object added to the model */ _parse_model_from_html : function (d, p, ps) { if(!ps) { ps = []; } else { ps = [].concat(ps); } if(p) { ps.unshift(p); } var c, e, m = this._model.data, data = { id : false, text : false, icon : true, parent : p, parents : ps, children : [], children_d : [], data : null, state : { }, li_attr : { id : false }, a_attr : { href : '#' }, original : false }, i, tmp, tid; for(i in this._model.default_state) { if(this._model.default_state.hasOwnProperty(i)) { data.state[i] = this._model.default_state[i]; } } tmp = $.vakata.attributes(d, true); $.each(tmp, function (i, v) { v = $.vakata.trim(v); if(!v.length) { return true; } data.li_attr[i] = v; if(i === 'id') { data.id = v.toString(); } }); tmp = d.children('a').first(); if(tmp.length) { tmp = $.vakata.attributes(tmp, true); $.each(tmp, function (i, v) { v = $.vakata.trim(v); if(v.length) { data.a_attr[i] = v; } }); } tmp = d.children("a").first().length ? d.children("a").first().clone() : d.clone(); tmp.children("ins, i, ul").remove(); tmp = tmp.html(); tmp = $('
    ').html(tmp); data.text = this.settings.core.force_text ? tmp.text() : tmp.html(); tmp = d.data(); data.data = tmp ? $.extend(true, {}, tmp) : null; data.state.opened = d.hasClass('jstree-open'); data.state.selected = d.children('a').hasClass('jstree-clicked'); data.state.disabled = d.children('a').hasClass('jstree-disabled'); if(data.data && data.data.jstree) { for(i in data.data.jstree) { if(data.data.jstree.hasOwnProperty(i)) { data.state[i] = data.data.jstree[i]; } } } tmp = d.children("a").children(".jstree-themeicon"); if(tmp.length) { data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel'); } if(data.state.icon !== undefined) { data.icon = data.state.icon; } if(data.icon === undefined || data.icon === null || data.icon === "") { data.icon = true; } tmp = d.children("ul").children("li"); do { tid = 'j' + this._id + '_' + (++this._cnt); } while(m[tid]); data.id = data.li_attr.id ? data.li_attr.id.toString() : tid; if(tmp.length) { tmp.each(function (i, v) { c = this._parse_model_from_html($(v), data.id, ps); e = this._model.data[c]; data.children.push(c); if(e.children_d.length) { data.children_d = data.children_d.concat(e.children_d); } }.bind(this)); data.children_d = data.children_d.concat(data.children); } else { if(d.hasClass('jstree-closed')) { data.state.loaded = false; } } if(data.li_attr['class']) { data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed','').replace('jstree-open',''); } if(data.a_attr['class']) { data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked','').replace('jstree-disabled',''); } m[data.id] = data; if(data.state.selected) { this._data.core.selected.push(data.id); } return data.id; }, /** * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally. * @private * @name _parse_model_from_flat_json(d [, p, ps]) * @param {Object} d the JSON object to parse * @param {String} p the parent ID * @param {Array} ps list of all parents * @return {String} the ID of the object added to the model */ _parse_model_from_flat_json : function (d, p, ps) { if(!ps) { ps = []; } else { ps = ps.concat(); } if(p) { ps.unshift(p); } var tid = d.id.toString(), m = this._model.data, df = this._model.default_state, i, j, c, e, tmp = { id : tid, text : d.text || '', icon : d.icon !== undefined ? d.icon : true, parent : p, parents : ps, children : d.children || [], children_d : d.children_d || [], data : d.data, state : { }, li_attr : { id : false }, a_attr : { href : '#' }, original : false }; for(i in df) { if(df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if(d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if(d && d.data) { tmp.data = d.data; if(d.data.jstree) { for(i in d.data.jstree) { if(d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if(d && typeof d.state === 'object') { for (i in d.state) { if(d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if(d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if(d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if(!tmp.li_attr.id) { tmp.li_attr.id = tid; } if(d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if(d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if(d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } m[tmp.id] = tmp; for(i = 0, j = tmp.children.length; i < j; i++) { c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps); e = m[c]; tmp.children_d.push(c); if(e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } delete d.data; delete d.children; m[tmp.id].original = d; if(tmp.state.selected) { this._data.core.selected.push(tmp.id); } return tmp.id; }, /** * parses a node from a JSON object and appends it to the in memory tree model. Used internally. * @private * @name _parse_model_from_json(d [, p, ps]) * @param {Object} d the JSON object to parse * @param {String} p the parent ID * @param {Array} ps list of all parents * @return {String} the ID of the object added to the model */ _parse_model_from_json : function (d, p, ps) { if(!ps) { ps = []; } else { ps = ps.concat(); } if(p) { ps.unshift(p); } var tid = false, i, j, c, e, m = this._model.data, df = this._model.default_state, tmp; do { tid = 'j' + this._id + '_' + (++this._cnt); } while(m[tid]); tmp = { id : false, text : typeof d === 'string' ? d : '', icon : typeof d === 'object' && d.icon !== undefined ? d.icon : true, parent : p, parents : ps, children : [], children_d : [], data : null, state : { }, li_attr : { id : false }, a_attr : { href : '#' }, original : false }; for(i in df) { if(df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); } if(d && d.text) { tmp.text = d.text; } if(d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if(d && d.data) { tmp.data = d.data; if(d.data.jstree) { for(i in d.data.jstree) { if(d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if(d && typeof d.state === 'object') { for (i in d.state) { if(d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if(d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if(d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) { tmp.id = tmp.li_attr.id.toString(); } if(!(tmp.id || tmp.id === 0)) { tmp.id = tid; } if(!tmp.li_attr.id) { tmp.li_attr.id = tmp.id; } if(d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if(d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if(d && d.children && d.children.length) { for(i = 0, j = d.children.length; i < j; i++) { c = this._parse_model_from_json(d.children[i], tmp.id, ps); e = m[c]; tmp.children.push(c); if(e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } tmp.children_d = tmp.children.concat(tmp.children_d); } if(d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } delete d.data; delete d.children; tmp.original = d; m[tmp.id] = tmp; if(tmp.state.selected) { this._data.core.selected.push(tmp.id); } return tmp.id; }, /** * redraws all nodes that need to be redrawn. Used internally. * @private * @name _redraw() * @trigger redraw.jstree */ _redraw : function () { var nodes = this._model.force_full_redraw ? this._model.data[$.jstree.root].children.concat([]) : this._model.changed.concat([]), f = document.createElement('UL'), tmp, i, j, fe = this._data.core.focused; for(i = 0, j = nodes.length; i < j; i++) { tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw); if(tmp && this._model.force_full_redraw) { f.appendChild(tmp); } } if(this._model.force_full_redraw) { f.className = this.get_container_ul()[0].className; f.setAttribute('role','presentation'); this.element.empty().append(f); //this.get_container_ul()[0].appendChild(f); } if(fe !== null && this.settings.core.restore_focus) { tmp = this.get_node(fe, true); if(tmp && tmp.length && tmp.children('.jstree-anchor')[0] !== document.activeElement) { tmp.children('.jstree-anchor').trigger('focus'); } else { this._data.core.focused = null; } } this._model.force_full_redraw = false; this._model.changed = []; /** * triggered after nodes are redrawn * @event * @name redraw.jstree * @param {array} nodes the redrawn nodes */ this.trigger('redraw', { "nodes" : nodes }); }, /** * redraws all nodes that need to be redrawn or optionally - the whole tree * @name redraw([full]) * @param {Boolean} full if set to `true` all nodes are redrawn. */ redraw : function (full) { if(full) { this._model.force_full_redraw = true; } //if(this._model.redraw_timeout) { // clearTimeout(this._model.redraw_timeout); //} //this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0); this._redraw(); }, /** * redraws a single node's children. Used internally. * @private * @name draw_children(node) * @param {mixed} node the node whose children will be redrawn */ draw_children : function (node) { var obj = this.get_node(node), i = false, j = false, k = false, d = document; if(!obj) { return false; } if(obj.id === $.jstree.root) { return this.redraw(true); } node = this.get_node(node, true); if(!node || !node.length) { return false; } // TODO: quick toggle node.children('.jstree-children').remove(); node = node[0]; if(obj.children.length && obj.state.loaded) { k = d.createElement('UL'); k.setAttribute('role', 'group'); k.className = 'jstree-children'; for(i = 0, j = obj.children.length; i < j; i++) { k.appendChild(this.redraw_node(obj.children[i], true, true)); } node.appendChild(k); } }, /** * redraws a single node. Used internally. * @private * @name redraw_node(node, deep, is_callback, force_render) * @param {mixed} node the node to redraw * @param {Boolean} deep should child nodes be redrawn too * @param {Boolean} is_callback is this a recursion call * @param {Boolean} force_render should children of closed parents be drawn anyway */ redraw_node : function (node, deep, is_callback, force_render) { var obj = this.get_node(node), par = false, ind = false, old = false, i = false, j = false, k = false, c = '', d = document, m = this._model.data, f = false, s = false, tmp = null, t = 0, l = 0, has_children = false, last_sibling = false; if(!obj) { return false; } if(obj.id === $.jstree.root) { return this.redraw(true); } deep = deep || obj.children.length === 0; node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + ("0123456789".indexOf(obj.id[0]) !== -1 ? '\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex,'\\$&') : obj.id.replace($.jstree.idregex,'\\$&')) ); //, this.element); if(!node) { deep = true; //node = d.createElement('LI'); if(!is_callback) { par = obj.parent !== $.jstree.root ? $('#' + obj.parent.replace($.jstree.idregex,'\\$&'), this.element)[0] : null; if(par !== null && (!par || !m[obj.parent].state.opened)) { return false; } ind = $.inArray(obj.id, par === null ? m[$.jstree.root].children : m[obj.parent].children); } } else { node = $(node); if(!is_callback) { par = node.parent().parent()[0]; if(par === this.element[0]) { par = null; } ind = node.index(); } // m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage if(!deep && obj.children.length && !node.children('.jstree-children').length) { deep = true; } if(!deep) { old = node.children('.jstree-children')[0]; } f = node.children('.jstree-anchor')[0] === document.activeElement; node.remove(); //node = d.createElement('LI'); //node = node[0]; } node = this._data.core.node.cloneNode(true); // node is DOM, deep is boolean c = 'jstree-node '; for(i in obj.li_attr) { if(obj.li_attr.hasOwnProperty(i)) { if(i === 'id') { continue; } if(i !== 'class') { node.setAttribute(i, obj.li_attr[i]); } else { c += obj.li_attr[i]; } } } if(!obj.a_attr.id) { obj.a_attr.id = obj.id + '_anchor'; } node.childNodes[1].setAttribute('aria-selected', !!obj.state.selected); node.childNodes[1].setAttribute('aria-level', obj.parents.length); if(this.settings.core.compute_elements_positions) { node.childNodes[1].setAttribute('aria-setsize', m[obj.parent].children.length); node.childNodes[1].setAttribute('aria-posinset', m[obj.parent].children.indexOf(obj.id) + 1); } if(obj.state.disabled) { node.childNodes[1].setAttribute('aria-disabled', true); } for(i = 0, j = obj.children.length; i < j; i++) { if(!m[obj.children[i]].state.hidden) { has_children = true; break; } } if(obj.parent !== null && m[obj.parent] && !obj.state.hidden) { i = $.inArray(obj.id, m[obj.parent].children); last_sibling = obj.id; if(i !== -1) { i++; for(j = m[obj.parent].children.length; i < j; i++) { if(!m[m[obj.parent].children[i]].state.hidden) { last_sibling = m[obj.parent].children[i]; } if(last_sibling !== obj.id) { break; } } } } if(obj.state.hidden) { c += ' jstree-hidden'; } if (obj.state.loading) { c += ' jstree-loading'; } if(obj.state.loaded && !has_children) { c += ' jstree-leaf'; } else { c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed'; node.childNodes[1].setAttribute('aria-expanded', (obj.state.opened && obj.state.loaded) ); } if(last_sibling === obj.id) { c += ' jstree-last'; } node.id = obj.id; node.className = c; c = ( obj.state.selected ? ' jstree-clicked' : '') + ( obj.state.disabled ? ' jstree-disabled' : ''); for(j in obj.a_attr) { if(obj.a_attr.hasOwnProperty(j)) { if(j === 'href' && obj.a_attr[j] === '#') { continue; } if(j !== 'class') { node.childNodes[1].setAttribute(j, obj.a_attr[j]); } else { c += ' ' + obj.a_attr[j]; } } } if(c.length) { node.childNodes[1].className = 'jstree-anchor ' + c; } if((obj.icon && obj.icon !== true) || obj.icon === false) { if(obj.icon === false) { node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden'; } else if(obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) { node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom'; } else { node.childNodes[1].childNodes[0].style.backgroundImage = 'url("'+obj.icon+'")'; node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center'; node.childNodes[1].childNodes[0].style.backgroundSize = 'auto'; node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom'; } } if(this.settings.core.force_text) { node.childNodes[1].appendChild(d.createTextNode(obj.text)); } else { node.childNodes[1].innerHTML += obj.text; } if(deep && obj.children.length && (obj.state.opened || force_render) && obj.state.loaded) { k = d.createElement('UL'); k.setAttribute('role', 'group'); k.className = 'jstree-children'; for(i = 0, j = obj.children.length; i < j; i++) { k.appendChild(this.redraw_node(obj.children[i], deep, true)); } node.appendChild(k); } if(old) { node.appendChild(old); } if(!is_callback) { // append back using par / ind if(!par) { par = this.element[0]; } for(i = 0, j = par.childNodes.length; i < j; i++) { if(par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) { tmp = par.childNodes[i]; break; } } if(!tmp) { tmp = d.createElement('UL'); tmp.setAttribute('role', 'group'); tmp.className = 'jstree-children'; par.appendChild(tmp); } par = tmp; if(ind < par.childNodes.length) { par.insertBefore(node, par.childNodes[ind]); } else { par.appendChild(node); } if(f) { t = this.element[0].scrollTop; l = this.element[0].scrollLeft; node.childNodes[1].focus(); this.element[0].scrollTop = t; this.element[0].scrollLeft = l; } } if(obj.state.opened && !obj.state.loaded) { obj.state.opened = false; setTimeout(function () { this.open_node(obj.id, false, 0); }.bind(this), 0); } return node; }, /** * opens a node, revealing its children. If the node is not loaded it will be loaded and opened once ready. * @name open_node(obj [, callback, animation]) * @param {mixed} obj the node to open * @param {Function} callback a function to execute once the node is opened * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation. * @trigger open_node.jstree, after_open.jstree, before_open.jstree */ open_node : function (obj, callback, animation) { var t1, t2, d, t; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.open_node(obj[t1], callback, animation); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } animation = animation === undefined ? this.settings.core.animation : animation; if(!this.is_closed(obj)) { if(callback) { callback.call(this, obj, false); } return false; } if(!this.is_loaded(obj)) { if(this.is_loading(obj)) { return setTimeout(function () { this.open_node(obj, callback, animation); }.bind(this), 500); } this.load_node(obj, function (o, ok) { return ok ? this.open_node(o, callback, animation) : (callback ? callback.call(this, o, false) : false); }); } else { d = this.get_node(obj, true); t = this; if(d.length) { if(animation && d.children(".jstree-children").length) { d.children(".jstree-children").stop(true, true); } if(obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) { this.draw_children(obj); //d = this.get_node(obj, true); } if(!animation) { this.trigger('before_open', { "node" : obj }); d[0].className = d[0].className.replace('jstree-closed', 'jstree-open'); d[0].childNodes[1].setAttribute("aria-expanded", true); } else { this.trigger('before_open', { "node" : obj }); d .children(".jstree-children").css("display","none").end() .removeClass("jstree-closed").addClass("jstree-open") .children('.jstree-anchor').attr("aria-expanded", true).end() .children(".jstree-children").stop(true, true) .slideDown(animation, function () { this.style.display = ""; if (t.element) { t.trigger("after_open", { "node" : obj }); } }); } } obj.state.opened = true; if(callback) { callback.call(this, obj, true); } if(!d.length) { /** * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet) * @event * @name before_open.jstree * @param {Object} node the opened node */ this.trigger('before_open', { "node" : obj }); } /** * triggered when a node is opened (if there is an animation it will not be completed yet) * @event * @name open_node.jstree * @param {Object} node the opened node */ this.trigger('open_node', { "node" : obj }); if(!animation || !d.length) { /** * triggered when a node is opened and the animation is complete * @event * @name after_open.jstree * @param {Object} node the opened node */ this.trigger("after_open", { "node" : obj }); } return true; } }, /** * opens every parent of a node (node should be loaded) * @name _open_to(obj) * @param {mixed} obj the node to reveal * @private */ _open_to : function (obj) { obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } var i, j, p = obj.parents; for(i = 0, j = p.length; i < j; i+=1) { if(i !== $.jstree.root) { this.open_node(p[i], false, 0); } } return $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element); }, /** * closes a node, hiding its children * @name close_node(obj [, animation]) * @param {mixed} obj the node to close * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation. * @trigger close_node.jstree, after_close.jstree */ close_node : function (obj, animation) { var t1, t2, t, d; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.close_node(obj[t1], animation); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } if(this.is_closed(obj)) { return false; } animation = animation === undefined ? this.settings.core.animation : animation; t = this; d = this.get_node(obj, true); obj.state.opened = false; /** * triggered when a node is closed (if there is an animation it will not be complete yet) * @event * @name close_node.jstree * @param {Object} node the closed node */ this.trigger('close_node',{ "node" : obj }); if(!d.length) { /** * triggered when a node is closed and the animation is complete * @event * @name after_close.jstree * @param {Object} node the closed node */ this.trigger("after_close", { "node" : obj }); } else { if(!animation) { d[0].className = d[0].className.replace('jstree-open', 'jstree-closed'); d.children('.jstree-anchor').attr("aria-expanded", false); d.children('.jstree-children').remove(); this.trigger("after_close", { "node" : obj }); } else { d .children(".jstree-children").attr("style","display:block !important").end() .removeClass("jstree-open").addClass("jstree-closed") .children('.jstree-anchor').attr("aria-expanded", false).end() .children(".jstree-children").stop(true, true).slideUp(animation, function () { this.style.display = ""; d.children('.jstree-children').remove(); if (t.element) { t.trigger("after_close", { "node" : obj }); } }); } } }, /** * toggles a node - closing it if it is open, opening it if it is closed * @name toggle_node(obj) * @param {mixed} obj the node to toggle */ toggle_node : function (obj) { var t1, t2; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.toggle_node(obj[t1]); } return true; } if(this.is_closed(obj)) { return this.open_node(obj); } if(this.is_open(obj)) { return this.close_node(obj); } }, /** * opens all nodes within a node (or the tree), revealing their children. If the node is not loaded it will be loaded and opened once ready. * @name open_all([obj, animation, original_obj]) * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation * @param {jQuery} reference to the node that started the process (internal use) * @trigger open_all.jstree */ open_all : function (obj, animation, original_obj) { if(!obj) { obj = $.jstree.root; } obj = this.get_node(obj); if(!obj) { return false; } var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), i, j, _this; if(!dom.length) { for(i = 0, j = obj.children_d.length; i < j; i++) { if(this.is_closed(this._model.data[obj.children_d[i]])) { this._model.data[obj.children_d[i]].state.opened = true; } } return this.trigger('open_all', { "node" : obj }); } original_obj = original_obj || dom; _this = this; dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed'); dom.each(function () { _this.open_node( this, function(node, status) { if(status && this.is_parent(node)) { this.open_all(node, animation, original_obj); } }, animation || 0 ); }); if(original_obj.find('.jstree-closed').length === 0) { /** * triggered when an `open_all` call completes * @event * @name open_all.jstree * @param {Object} node the opened node */ this.trigger('open_all', { "node" : this.get_node(original_obj) }); } }, /** * closes all nodes within a node (or the tree), revealing their children * @name close_all([obj, animation]) * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation * @trigger close_all.jstree */ close_all : function (obj, animation) { if(!obj) { obj = $.jstree.root; } obj = this.get_node(obj); if(!obj) { return false; } var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), _this = this, i, j; if(dom.length) { dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open'); $(dom.get().reverse()).each(function () { _this.close_node(this, animation || 0); }); } for(i = 0, j = obj.children_d.length; i < j; i++) { this._model.data[obj.children_d[i]].state.opened = false; } /** * triggered when an `close_all` call completes * @event * @name close_all.jstree * @param {Object} node the closed node */ this.trigger('close_all', { "node" : obj }); }, /** * checks if a node is disabled (not selectable) * @name is_disabled(obj) * @param {mixed} obj * @return {Boolean} */ is_disabled : function (obj) { obj = this.get_node(obj); return obj && obj.state && obj.state.disabled; }, /** * enables a node - so that it can be selected * @name enable_node(obj) * @param {mixed} obj the node to enable * @trigger enable_node.jstree */ enable_node : function (obj) { var t1, t2; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.enable_node(obj[t1]); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } obj.state.disabled = false; this.get_node(obj,true).children('.jstree-anchor').removeClass('jstree-disabled').attr('aria-disabled', false); /** * triggered when an node is enabled * @event * @name enable_node.jstree * @param {Object} node the enabled node */ this.trigger('enable_node', { 'node' : obj }); }, /** * disables a node - so that it can not be selected * @name disable_node(obj) * @param {mixed} obj the node to disable * @trigger disable_node.jstree */ disable_node : function (obj) { var t1, t2; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.disable_node(obj[t1]); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } obj.state.disabled = true; this.get_node(obj,true).children('.jstree-anchor').addClass('jstree-disabled').attr('aria-disabled', true); /** * triggered when an node is disabled * @event * @name disable_node.jstree * @param {Object} node the disabled node */ this.trigger('disable_node', { 'node' : obj }); }, /** * determines if a node is hidden * @name is_hidden(obj) * @param {mixed} obj the node */ is_hidden : function (obj) { obj = this.get_node(obj); return obj.state.hidden === true; }, /** * hides a node - it is still in the structure but will not be visible * @name hide_node(obj) * @param {mixed} obj the node to hide * @param {Boolean} skip_redraw internal parameter controlling if redraw is called * @trigger hide_node.jstree */ hide_node : function (obj, skip_redraw) { var t1, t2; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.hide_node(obj[t1], true); } if (!skip_redraw) { this.redraw(); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } if(!obj.state.hidden) { obj.state.hidden = true; this._node_changed(obj.parent); if(!skip_redraw) { this.redraw(); } /** * triggered when an node is hidden * @event * @name hide_node.jstree * @param {Object} node the hidden node */ this.trigger('hide_node', { 'node' : obj }); } }, /** * shows a node * @name show_node(obj) * @param {mixed} obj the node to show * @param {Boolean} skip_redraw internal parameter controlling if redraw is called * @trigger show_node.jstree */ show_node : function (obj, skip_redraw) { var t1, t2; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.show_node(obj[t1], true); } if (!skip_redraw) { this.redraw(); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } if(obj.state.hidden) { obj.state.hidden = false; this._node_changed(obj.parent); if(!skip_redraw) { this.redraw(); } /** * triggered when an node is shown * @event * @name show_node.jstree * @param {Object} node the shown node */ this.trigger('show_node', { 'node' : obj }); } }, /** * hides all nodes * @name hide_all() * @trigger hide_all.jstree */ hide_all : function (skip_redraw) { var i, m = this._model.data, ids = []; for(i in m) { if(m.hasOwnProperty(i) && i !== $.jstree.root && !m[i].state.hidden) { m[i].state.hidden = true; ids.push(i); } } this._model.force_full_redraw = true; if(!skip_redraw) { this.redraw(); } /** * triggered when all nodes are hidden * @event * @name hide_all.jstree * @param {Array} nodes the IDs of all hidden nodes */ this.trigger('hide_all', { 'nodes' : ids }); return ids; }, /** * shows all nodes * @name show_all() * @trigger show_all.jstree */ show_all : function (skip_redraw) { var i, m = this._model.data, ids = []; for(i in m) { if(m.hasOwnProperty(i) && i !== $.jstree.root && m[i].state.hidden) { m[i].state.hidden = false; ids.push(i); } } this._model.force_full_redraw = true; if(!skip_redraw) { this.redraw(); } /** * triggered when all nodes are shown * @event * @name show_all.jstree * @param {Array} nodes the IDs of all shown nodes */ this.trigger('show_all', { 'nodes' : ids }); return ids; }, /** * called when a node is selected by the user. Used internally. * @private * @name activate_node(obj, e) * @param {mixed} obj the node * @param {Object} e the related event * @trigger activate_node.jstree, changed.jstree */ activate_node : function (obj, e) { if(this.is_disabled(obj)) { return false; } if(!e || typeof e !== 'object') { e = {}; } // ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null; if(this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) { this._data.core.last_clicked = null; } if(!this._data.core.last_clicked && this._data.core.selected.length) { this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]); } if(!this.settings.core.multiple || (!e.metaKey && !e.ctrlKey && !e.shiftKey) || (e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent ) )) { if(!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) { this.deselect_node(obj, false, e); } else { if (!this.is_selected(obj) || this._data.core.selected.length !== 1) { this.deselect_all(true); this.select_node(obj, false, false, e); } this._data.core.last_clicked = this.get_node(obj); } } else { if(e.shiftKey) { var o = this.get_node(obj).id, l = this._data.core.last_clicked.id, p = this.get_node(this._data.core.last_clicked.parent).children, c = false, i, j; for(i = 0, j = p.length; i < j; i += 1) { // separate IFs work whem o and l are the same if(p[i] === o) { c = !c; } if(p[i] === l) { c = !c; } if(!this.is_disabled(p[i]) && (c || p[i] === o || p[i] === l)) { if (!this.is_hidden(p[i])) { this.select_node(p[i], true, false, e); } } else { if (!e.ctrlKey) { this.deselect_node(p[i], true, e); } } } this.trigger('changed', { 'action' : 'select_node', 'node' : this.get_node(obj), 'selected' : this._data.core.selected, 'event' : e }); } else { if(!this.is_selected(obj)) { if (e.ctrlKey) { this._data.core.last_clicked = this.get_node(obj); } this.select_node(obj, false, false, e); } else { this.deselect_node(obj, false, e); } } } /** * triggered when an node is clicked or intercated with by the user * @event * @name activate_node.jstree * @param {Object} node * @param {Object} event the ooriginal event (if any) which triggered the call (may be an empty object) */ this.trigger('activate_node', { 'node' : this.get_node(obj), 'event' : e }); }, /** * applies the hover state on a node, called when a node is hovered by the user. Used internally. * @private * @name hover_node(obj) * @param {mixed} obj * @trigger hover_node.jstree */ hover_node : function (obj) { obj = this.get_node(obj, true); if(!obj || !obj.length || obj.children('.jstree-hovered').length) { return false; } var o = this.element.find('.jstree-hovered'), t = this.element; if(o && o.length) { this.dehover_node(o); } obj.children('.jstree-anchor').addClass('jstree-hovered'); /** * triggered when an node is hovered * @event * @name hover_node.jstree * @param {Object} node */ this.trigger('hover_node', { 'node' : this.get_node(obj) }); setTimeout(function () { t.attr('aria-activedescendant', obj[0].id); }, 0); }, /** * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally. * @private * @name dehover_node(obj) * @param {mixed} obj * @trigger dehover_node.jstree */ dehover_node : function (obj) { obj = this.get_node(obj, true); if(!obj || !obj.length || !obj.children('.jstree-hovered').length) { return false; } obj.children('.jstree-anchor').removeClass('jstree-hovered'); /** * triggered when an node is no longer hovered * @event * @name dehover_node.jstree * @param {Object} node */ this.trigger('dehover_node', { 'node' : this.get_node(obj) }); }, /** * select a node * @name select_node(obj [, supress_event, prevent_open]) * @param {mixed} obj an array can be used to select multiple nodes * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened * @trigger select_node.jstree, changed.jstree */ select_node : function (obj, supress_event, prevent_open, e) { var dom, t1, t2, th; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.select_node(obj[t1], supress_event, prevent_open, e); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if(!obj.state.selected) { obj.state.selected = true; this._data.core.selected.push(obj.id); if(!prevent_open) { dom = this._open_to(obj); } if(dom && dom.length) { dom.children('.jstree-anchor').addClass('jstree-clicked').attr('aria-selected', true); } /** * triggered when an node is selected * @event * @name select_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this select_node */ this.trigger('select_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); if(!supress_event) { /** * triggered when selection changes * @event * @name changed.jstree * @param {Object} node * @param {Object} action the action that caused the selection to change * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this changed event */ this.trigger('changed', { 'action' : 'select_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); } } }, /** * deselect a node * @name deselect_node(obj [, supress_event]) * @param {mixed} obj an array can be used to deselect multiple nodes * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @trigger deselect_node.jstree, changed.jstree */ deselect_node : function (obj, supress_event, e) { var t1, t2, dom; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.deselect_node(obj[t1], supress_event, e); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if(obj.state.selected) { obj.state.selected = false; this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id); if(dom.length) { dom.children('.jstree-anchor').removeClass('jstree-clicked').attr('aria-selected', false); } /** * triggered when an node is deselected * @event * @name deselect_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this deselect_node */ this.trigger('deselect_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); if(!supress_event) { this.trigger('changed', { 'action' : 'deselect_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); } } }, /** * select all nodes in the tree * @name select_all([supress_event]) * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @trigger select_all.jstree, changed.jstree */ select_all : function (supress_event) { var tmp = this._data.core.selected.concat([]), i, j; this._data.core.selected = this._model.data[$.jstree.root].children_d.concat(); for(i = 0, j = this._data.core.selected.length; i < j; i++) { if(this._model.data[this._data.core.selected[i]]) { this._model.data[this._data.core.selected[i]].state.selected = true; } } this.redraw(true); /** * triggered when all nodes are selected * @event * @name select_all.jstree * @param {Array} selected the current selection */ this.trigger('select_all', { 'selected' : this._data.core.selected }); if(!supress_event) { this.trigger('changed', { 'action' : 'select_all', 'selected' : this._data.core.selected, 'old_selection' : tmp }); } }, /** * deselect all selected nodes * @name deselect_all([supress_event]) * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @trigger deselect_all.jstree, changed.jstree */ deselect_all : function (supress_event) { var tmp = this._data.core.selected.concat([]), i, j; for(i = 0, j = this._data.core.selected.length; i < j; i++) { if(this._model.data[this._data.core.selected[i]]) { this._model.data[this._data.core.selected[i]].state.selected = false; } } this._data.core.selected = []; this.element.find('.jstree-clicked').removeClass('jstree-clicked').attr('aria-selected', false); /** * triggered when all nodes are deselected * @event * @name deselect_all.jstree * @param {Object} node the previous selection * @param {Array} selected the current selection */ this.trigger('deselect_all', { 'selected' : this._data.core.selected, 'node' : tmp }); if(!supress_event) { this.trigger('changed', { 'action' : 'deselect_all', 'selected' : this._data.core.selected, 'old_selection' : tmp }); } }, /** * checks if a node is selected * @name is_selected(obj) * @param {mixed} obj * @return {Boolean} */ is_selected : function (obj) { obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } return obj.state.selected; }, /** * get an array of all selected nodes * @name get_selected([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} */ get_selected : function (full) { return full ? $.map(this._data.core.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.core.selected.slice(); }, /** * get an array of all top level selected nodes (ignoring children of selected nodes) * @name get_top_selected([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} */ get_top_selected : function (full) { var tmp = this.get_selected(true), obj = {}, i, j, k, l; for(i = 0, j = tmp.length; i < j; i++) { obj[tmp[i].id] = tmp[i]; } for(i = 0, j = tmp.length; i < j; i++) { for(k = 0, l = tmp[i].children_d.length; k < l; k++) { if(obj[tmp[i].children_d[k]]) { delete obj[tmp[i].children_d[k]]; } } } tmp = []; for(i in obj) { if(obj.hasOwnProperty(i)) { tmp.push(i); } } return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp; }, /** * get an array of all bottom level selected nodes (ignoring selected parents) * @name get_bottom_selected([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} */ get_bottom_selected : function (full) { var tmp = this.get_selected(true), obj = [], i, j; for(i = 0, j = tmp.length; i < j; i++) { if(!tmp[i].children.length) { obj.push(tmp[i].id); } } return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj; }, /** * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally. * @name get_state() * @private * @return {Object} */ get_state : function () { var state = { 'core' : { 'open' : [], 'loaded' : [], 'scroll' : { 'left' : this.element.scrollLeft(), 'top' : this.element.scrollTop() }, /*! 'themes' : { 'name' : this.get_theme(), 'icons' : this._data.core.themes.icons, 'dots' : this._data.core.themes.dots }, */ 'selected' : [] } }, i; for(i in this._model.data) { if(this._model.data.hasOwnProperty(i)) { if(i !== $.jstree.root) { if(this._model.data[i].state.loaded && this.settings.core.loaded_state) { state.core.loaded.push(i); } if(this._model.data[i].state.opened) { state.core.open.push(i); } if(this._model.data[i].state.selected) { state.core.selected.push(i); } } } } return state; }, /** * sets the state of the tree. Used internally. * @name set_state(state [, callback]) * @private * @param {Object} state the state to restore. Keep in mind this object is passed by reference and jstree will modify it. * @param {Function} callback an optional function to execute once the state is restored. * @trigger set_state.jstree */ set_state : function (state, callback) { if(state) { if(state.core && state.core.selected && state.core.initial_selection === undefined) { state.core.initial_selection = this._data.core.selected.concat([]).sort().join(','); } if(state.core) { var res, n, t, _this, i; if(state.core.loaded) { if(!this.settings.core.loaded_state || !$.vakata.is_array(state.core.loaded) || !state.core.loaded.length) { delete state.core.loaded; this.set_state(state, callback); } else { this._load_nodes(state.core.loaded, function (nodes) { delete state.core.loaded; this.set_state(state, callback); }); } return false; } if(state.core.open) { if(!$.vakata.is_array(state.core.open) || !state.core.open.length) { delete state.core.open; this.set_state(state, callback); } else { this._load_nodes(state.core.open, function (nodes) { this.open_node(nodes, false, 0); delete state.core.open; this.set_state(state, callback); }); } return false; } if(state.core.scroll) { if(state.core.scroll && state.core.scroll.left !== undefined) { this.element.scrollLeft(state.core.scroll.left); } if(state.core.scroll && state.core.scroll.top !== undefined) { this.element.scrollTop(state.core.scroll.top); } delete state.core.scroll; this.set_state(state, callback); return false; } if(state.core.selected) { _this = this; if (state.core.initial_selection === undefined || state.core.initial_selection === this._data.core.selected.concat([]).sort().join(',') ) { this.deselect_all(); $.each(state.core.selected, function (i, v) { _this.select_node(v, false, true); }); } delete state.core.initial_selection; delete state.core.selected; this.set_state(state, callback); return false; } for(i in state) { if(state.hasOwnProperty(i) && i !== "core" && $.inArray(i, this.settings.plugins) === -1) { delete state[i]; } } if($.isEmptyObject(state.core)) { delete state.core; this.set_state(state, callback); return false; } } if($.isEmptyObject(state)) { state = null; if(callback) { callback.call(this); } /** * triggered when a `set_state` call completes * @event * @name set_state.jstree */ this.trigger('set_state'); return false; } return true; } return false; }, /** * refreshes the tree - all nodes are reloaded with calls to `load_node`. * @name refresh() * @param {Boolean} skip_loading an option to skip showing the loading indicator * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state * @trigger refresh.jstree */ refresh : function (skip_loading, forget_state) { this._data.core.state = forget_state === true ? {} : this.get_state(); if(forget_state && $.vakata.is_function(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); } this._cnt = 0; this._model.data = {}; this._model.data[$.jstree.root] = { id : $.jstree.root, parent : null, parents : [], children : [], children_d : [], state : { loaded : false } }; this._data.core.selected = []; this._data.core.last_clicked = null; this._data.core.focused = null; var c = this.get_container_ul()[0].className; if(!skip_loading) { this.element.html("<"+"ul class='"+c+"' role='group'><"+"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none' id='j"+this._id+"_loading'><"+"a class='jstree-anchor' role='treeitem' href='#'>" + this.get_string("Loading ...") + ""); this.element.attr('aria-activedescendant','j'+this._id+'_loading'); } this.load_node($.jstree.root, function (o, s) { if(s) { this.get_container_ul()[0].className = c; if(this._firstChild(this.get_container_ul()[0])) { this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id); } this.set_state($.extend(true, {}, this._data.core.state), function () { /** * triggered when a `refresh` call completes * @event * @name refresh.jstree */ this.trigger('refresh'); }); } this._data.core.state = null; }); }, /** * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`. * @name refresh_node(obj) * @param {mixed} obj the node * @trigger refresh_node.jstree */ refresh_node : function (obj) { obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } var opened = [], to_load = [], s = this._data.core.selected.concat([]); to_load.push(obj.id); if(obj.state.opened === true) { opened.push(obj.id); } this.get_node(obj, true).find('.jstree-open').each(function() { to_load.push(this.id); opened.push(this.id); }); this._load_nodes(to_load, function (nodes) { this.open_node(opened, false, 0); this.select_node(s); /** * triggered when a node is refreshed * @event * @name refresh_node.jstree * @param {Object} node - the refreshed node * @param {Array} nodes - an array of the IDs of the nodes that were reloaded */ this.trigger('refresh_node', { 'node' : obj, 'nodes' : nodes }); }.bind(this), false, true); }, /** * set (change) the ID of a node * @name set_id(obj, id) * @param {mixed} obj the node * @param {String} id the new ID * @return {Boolean} * @trigger set_id.jstree */ set_id : function (obj, id) { obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } var i, j, m = this._model.data, old = obj.id; id = id.toString(); // update parents (replace current ID with new one in children and children_d) m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id; for(i = 0, j = obj.parents.length; i < j; i++) { m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id; } // update children (replace current ID with new one in parent and parents) for(i = 0, j = obj.children.length; i < j; i++) { m[obj.children[i]].parent = id; } for(i = 0, j = obj.children_d.length; i < j; i++) { m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id; } i = $.inArray(obj.id, this._data.core.selected); if(i !== -1) { this._data.core.selected[i] = id; } // update model and obj itself (obj.id, this._model.data[KEY]) i = this.get_node(obj.id, true); if(i) { i.attr('id', id); //.children('.jstree-anchor').attr('id', id + '_anchor').end().attr('aria-labelledby', id + '_anchor'); if(this.element.attr('aria-activedescendant') === obj.id) { this.element.attr('aria-activedescendant', id); } } delete m[obj.id]; obj.id = id; obj.li_attr.id = id; m[id] = obj; /** * triggered when a node id value is changed * @event * @name set_id.jstree * @param {Object} node * @param {String} old the old id */ this.trigger('set_id',{ "node" : obj, "new" : obj.id, "old" : old }); return true; }, /** * get the text value of a node * @name get_text(obj) * @param {mixed} obj the node * @return {String} */ get_text : function (obj) { obj = this.get_node(obj); return (!obj || obj.id === $.jstree.root) ? false : obj.text; }, /** * set the text value of a node. Used internally, please use `rename_node(obj, val)`. * @private * @name set_text(obj, val) * @param {mixed} obj the node, you can pass an array to set the text on multiple nodes * @param {String} val the new text value * @return {Boolean} * @trigger set_text.jstree */ set_text : function (obj, val) { var t1, t2; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.set_text(obj[t1], val); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } obj.text = val; if(this.get_node(obj, true).length) { this.redraw_node(obj.id); } /** * triggered when a node text value is changed * @event * @name set_text.jstree * @param {Object} obj * @param {String} text the new value */ this.trigger('set_text',{ "obj" : obj, "text" : val }); return true; }, /** * gets a JSON representation of a node (or the whole tree) * @name get_json([obj, options]) * @param {mixed} obj * @param {Object} options * @param {Boolean} options.no_state do not return state information * @param {Boolean} options.no_id do not return ID * @param {Boolean} options.no_children do not include children * @param {Boolean} options.no_data do not include node data * @param {Boolean} options.no_li_attr do not include LI attributes * @param {Boolean} options.no_a_attr do not include A attributes * @param {Boolean} options.flat return flat JSON instead of nested * @return {Object} */ get_json : function (obj, options, flat) { obj = this.get_node(obj || $.jstree.root); if(!obj) { return false; } if(options && options.flat && !flat) { flat = []; } var tmp = { 'id' : obj.id, 'text' : obj.text, 'icon' : this.get_icon(obj), 'li_attr' : $.extend(true, {}, obj.li_attr), 'a_attr' : $.extend(true, {}, obj.a_attr), 'state' : {}, 'data' : options && options.no_data ? false : $.extend(true, $.vakata.is_array(obj.data)?[]:{}, obj.data) //( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ), }, i, j; if(options && options.flat) { tmp.parent = obj.parent; } else { tmp.children = []; } if(!options || !options.no_state) { for(i in obj.state) { if(obj.state.hasOwnProperty(i)) { tmp.state[i] = obj.state[i]; } } } else { delete tmp.state; } if(options && options.no_li_attr) { delete tmp.li_attr; } if(options && options.no_a_attr) { delete tmp.a_attr; } if(options && options.no_id) { delete tmp.id; if(tmp.li_attr && tmp.li_attr.id) { delete tmp.li_attr.id; } if(tmp.a_attr && tmp.a_attr.id) { delete tmp.a_attr.id; } } if(options && options.flat && obj.id !== $.jstree.root) { flat.push(tmp); } if(!options || !options.no_children) { for(i = 0, j = obj.children.length; i < j; i++) { if(options && options.flat) { this.get_json(obj.children[i], options, flat); } else { tmp.children.push(this.get_json(obj.children[i], options)); } } } return options && options.flat ? flat : (obj.id === $.jstree.root ? tmp.children : tmp); }, /** * create a new node (do not confuse with load_node) * @name create_node([par, node, pos, callback, is_loaded]) * @param {mixed} par the parent node (to create a root node use either "#" (string) or `null`) * @param {mixed} node the data for the new node (a valid JSON object, or a simple string with the name) * @param {mixed} pos the index at which to insert the node, "first" and "last" are also supported, default is "last" * @param {Function} callback a function to be called once the node is created * @param {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded * @return {String} the ID of the newly create node * @trigger model.jstree, create_node.jstree */ create_node : function (par, node, pos, callback, is_loaded) { if(par === null) { par = $.jstree.root; } par = this.get_node(par); if(!par) { return false; } pos = pos === undefined ? "last" : pos; if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return this.load_node(par, function () { this.create_node(par, node, pos, callback, true); }); } if(!node) { node = { "text" : this.get_string('New node') }; } if(typeof node === "string") { node = { "text" : node }; } else { node = $.extend(true, {}, node); } if(node.text === undefined) { node.text = this.get_string('New node'); } var tmp, dpc, i, j; if(par.id === $.jstree.root) { if(pos === "before") { pos = "first"; } if(pos === "after") { pos = "last"; } } switch(pos) { case "before": tmp = this.get_node(par.parent); pos = $.inArray(par.id, tmp.children); par = tmp; break; case "after" : tmp = this.get_node(par.parent); pos = $.inArray(par.id, tmp.children) + 1; par = tmp; break; case "inside": case "first": pos = 0; break; case "last": pos = par.children.length; break; default: if(!pos) { pos = 0; } break; } if(pos > par.children.length) { pos = par.children.length; } if(node.id === undefined) { node.id = true; } if(!this.check("create_node", node, par, pos)) { this.settings.core.error.call(this, this._data.core.last_error); return false; } if(node.id === true) { delete node.id; } node = this._parse_model_from_json(node, par.id, par.parents.concat()); if(!node) { return false; } tmp = this.get_node(node); dpc = []; dpc.push(node); dpc = dpc.concat(tmp.children_d); this.trigger('model', { "nodes" : dpc, "parent" : par.id }); par.children_d = par.children_d.concat(dpc); for(i = 0, j = par.parents.length; i < j; i++) { this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc); } node = tmp; tmp = []; for(i = 0, j = par.children.length; i < j; i++) { tmp[i >= pos ? i+1 : i] = par.children[i]; } tmp[pos] = node.id; par.children = tmp; this.redraw_node(par, true); /** * triggered when a node is created * @event * @name create_node.jstree * @param {Object} node * @param {String} parent the parent's ID * @param {Number} position the position of the new node among the parent's children */ this.trigger('create_node', { "node" : this.get_node(node), "parent" : par.id, "position" : pos }); if(callback) { callback.call(this, this.get_node(node)); } return node.id; }, /** * set the text value of a node * @name rename_node(obj, val) * @param {mixed} obj the node, you can pass an array to rename multiple nodes to the same name * @param {String} val the new text value * @return {Boolean} * @trigger rename_node.jstree */ rename_node : function (obj, val) { var t1, t2, old; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.rename_node(obj[t1], val); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } old = obj.text; if(!this.check("rename_node", obj, this.get_parent(obj), val)) { this.settings.core.error.call(this, this._data.core.last_error); return false; } this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments)) /** * triggered when a node is renamed * @event * @name rename_node.jstree * @param {Object} node * @param {String} text the new value * @param {String} old the old value */ this.trigger('rename_node', { "node" : obj, "text" : val, "old" : old }); return true; }, /** * remove a node * @name delete_node(obj) * @param {mixed} obj the node, you can pass an array to delete multiple nodes * @return {Boolean} * @trigger delete_node.jstree, changed.jstree */ delete_node : function (obj) { var t1, t2, par, pos, tmp, i, j, k, l, c, top, lft; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.delete_node(obj[t1]); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } par = this.get_node(obj.parent); pos = $.inArray(obj.id, par.children); c = false; if(!this.check("delete_node", obj, par, pos)) { this.settings.core.error.call(this, this._data.core.last_error); return false; } if(pos !== -1) { par.children = $.vakata.array_remove(par.children, pos); } tmp = obj.children_d.concat([]); tmp.push(obj.id); for(i = 0, j = obj.parents.length; i < j; i++) { this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) { return $.inArray(v, tmp) === -1; }); } for(k = 0, l = tmp.length; k < l; k++) { if(this._model.data[tmp[k]].state.selected) { c = true; break; } } if (c) { this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) { return $.inArray(v, tmp) === -1; }); } /** * triggered when a node is deleted * @event * @name delete_node.jstree * @param {Object} node * @param {String} parent the parent's ID */ this.trigger('delete_node', { "node" : obj, "parent" : par.id }); if(c) { this.trigger('changed', { 'action' : 'delete_node', 'node' : obj, 'selected' : this._data.core.selected, 'parent' : par.id }); } for(k = 0, l = tmp.length; k < l; k++) { delete this._model.data[tmp[k]]; } if($.inArray(this._data.core.focused, tmp) !== -1) { this._data.core.focused = null; top = this.element[0].scrollTop; lft = this.element[0].scrollLeft; if(par.id === $.jstree.root) { if (this._model.data[$.jstree.root].children[0]) { this.get_node(this._model.data[$.jstree.root].children[0], true).children('.jstree-anchor').trigger('focus'); } } else { this.get_node(par, true).children('.jstree-anchor').trigger('focus'); } this.element[0].scrollTop = top; this.element[0].scrollLeft = lft; } this.redraw_node(par, true); return true; }, /** * check if an operation is premitted on the tree. Used internally. * @private * @name check(chk, obj, par, pos) * @param {String} chk the operation to check, can be "create_node", "rename_node", "delete_node", "copy_node" or "move_node" * @param {mixed} obj the node * @param {mixed} par the parent * @param {mixed} pos the position to insert at, or if "rename_node" - the new name * @param {mixed} more some various additional information, for example if a "move_node" operations is triggered by DND this will be the hovered node * @return {Boolean} */ check : function (chk, obj, par, pos, more) { obj = obj && obj.id ? obj : this.get_node(obj); par = par && par.id ? par : this.get_node(par); var tmp = chk.match(/^(move_node|copy_node|create_node)$/i) ? par : obj, chc = this.settings.core.check_callback; if(chk === "move_node" || chk === "copy_node") { if((!more || !more.is_multi) && (chk === "move_node" && $.inArray(obj.id, par.children) === pos)) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_08', 'reason' : 'Moving node to its current position', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } if((!more || !more.is_multi) && (obj.id === par.id || (chk === "move_node" && $.inArray(obj.id, par.children) === pos) || $.inArray(par.id, obj.children_d) !== -1)) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_01', 'reason' : 'Moving parent inside child', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } } if(tmp && tmp.data) { tmp = tmp.data; } if(tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) { if(tmp.functions[chk] === false) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_02', 'reason' : 'Node data prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; } return tmp.functions[chk]; } if(chc === false || ($.vakata.is_function(chc) && chc.call(this, chk, obj, par, pos, more) === false) || (chc && chc[chk] === false)) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_03', 'reason' : 'User config for core.check_callback prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } return true; }, /** * get the last error * @name last_error() * @return {Object} */ last_error : function () { return this._data.core.last_error; }, /** * move a node to a new parent * @name move_node(obj, par [, pos, callback, is_loaded]) * @param {mixed} obj the node to move, pass an array to move multiple nodes * @param {mixed} par the new parent * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0` * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position * @param {Boolean} is_loaded internal parameter indicating if the parent node has been loaded * @param {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn * @param {Boolean} instance internal parameter indicating if the node comes from another instance * @trigger move_node.jstree */ move_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) { var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p; par = this.get_node(par); pos = pos === undefined ? 0 : pos; if(!par) { return false; } if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return this.load_node(par, function () { this.move_node(obj, par, pos, callback, true, false, origin); }); } if($.vakata.is_array(obj)) { if(obj.length === 1) { obj = obj[0]; } else { //obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { if((tmp = this.move_node(obj[t1], par, pos, callback, is_loaded, false, origin))) { par = tmp; pos = "after"; } } this.redraw(); return true; } } obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } old_par = (obj.parent || $.jstree.root).toString(); new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent); old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id)); is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id); old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1; if(old_ins && old_ins._id) { obj = old_ins._model.data[obj.id]; } if(is_multi) { if((tmp = this.copy_node(obj, par, pos, callback, is_loaded, false, origin))) { if(old_ins) { old_ins.delete_node(obj); } return tmp; } return false; } //var m = this._model.data; if(par.id === $.jstree.root) { if(pos === "before") { pos = "first"; } if(pos === "after") { pos = "last"; } } switch(pos) { case "before": pos = $.inArray(par.id, new_par.children); break; case "after" : pos = $.inArray(par.id, new_par.children) + 1; break; case "inside": case "first": pos = 0; break; case "last": pos = new_par.children.length; break; default: if(!pos) { pos = 0; } break; } if(pos > new_par.children.length) { pos = new_par.children.length; } if(!this.check("move_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) { this.settings.core.error.call(this, this._data.core.last_error); return false; } if(obj.parent === new_par.id) { dpc = new_par.children.concat(); tmp = $.inArray(obj.id, dpc); if(tmp !== -1) { dpc = $.vakata.array_remove(dpc, tmp); if(pos > tmp) { pos--; } } tmp = []; for(i = 0, j = dpc.length; i < j; i++) { tmp[i >= pos ? i+1 : i] = dpc[i]; } tmp[pos] = obj.id; new_par.children = tmp; this._node_changed(new_par.id); this.redraw(new_par.id === $.jstree.root); } else { // clean old parent and up tmp = obj.children_d.concat(); tmp.push(obj.id); for(i = 0, j = obj.parents.length; i < j; i++) { dpc = []; p = old_ins._model.data[obj.parents[i]].children_d; for(k = 0, l = p.length; k < l; k++) { if($.inArray(p[k], tmp) === -1) { dpc.push(p[k]); } } old_ins._model.data[obj.parents[i]].children_d = dpc; } old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id); // insert into new parent and up for(i = 0, j = new_par.parents.length; i < j; i++) { this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp); } dpc = []; for(i = 0, j = new_par.children.length; i < j; i++) { dpc[i >= pos ? i+1 : i] = new_par.children[i]; } dpc[pos] = obj.id; new_par.children = dpc; new_par.children_d.push(obj.id); new_par.children_d = new_par.children_d.concat(obj.children_d); // update object obj.parent = new_par.id; tmp = new_par.parents.concat(); tmp.unshift(new_par.id); p = obj.parents.length; obj.parents = tmp; // update object children tmp = tmp.concat(); for(i = 0, j = obj.children_d.length; i < j; i++) { this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0,p*-1); Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp); } if(old_par === $.jstree.root || new_par.id === $.jstree.root) { this._model.force_full_redraw = true; } if(!this._model.force_full_redraw) { this._node_changed(old_par); this._node_changed(new_par.id); } if(!skip_redraw) { this.redraw(); } } if(callback) { callback.call(this, obj, new_par, pos); } /** * triggered when a node is moved * @event * @name move_node.jstree * @param {Object} node * @param {String} parent the parent's ID * @param {Number} position the position of the node among the parent's children * @param {String} old_parent the old parent of the node * @param {Number} old_position the old position of the node * @param {Boolean} is_multi do the node and new parent belong to different instances * @param {jsTree} old_instance the instance the node came from * @param {jsTree} new_instance the instance of the new parent */ this.trigger('move_node', { "node" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_pos, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this }); return obj.id; }, /** * copy a node to a new parent * @name copy_node(obj, par [, pos, callback, is_loaded]) * @param {mixed} obj the node to copy, pass an array to copy multiple nodes * @param {mixed} par the new parent * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0` * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position * @param {Boolean} is_loaded internal parameter indicating if the parent node has been loaded * @param {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn * @param {Boolean} instance internal parameter indicating if the node comes from another instance * @trigger model.jstree copy_node.jstree */ copy_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) { var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi; par = this.get_node(par); pos = pos === undefined ? 0 : pos; if(!par) { return false; } if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true, false, origin); }); } if($.vakata.is_array(obj)) { if(obj.length === 1) { obj = obj[0]; } else { //obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { if((tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true, origin))) { par = tmp; pos = "after"; } } this.redraw(); return true; } } obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } old_par = (obj.parent || $.jstree.root).toString(); new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent); old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id)); is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id); if(old_ins && old_ins._id) { obj = old_ins._model.data[obj.id]; } if(par.id === $.jstree.root) { if(pos === "before") { pos = "first"; } if(pos === "after") { pos = "last"; } } switch(pos) { case "before": pos = $.inArray(par.id, new_par.children); break; case "after" : pos = $.inArray(par.id, new_par.children) + 1; break; case "inside": case "first": pos = 0; break; case "last": pos = new_par.children.length; break; default: if(!pos) { pos = 0; } break; } if(pos > new_par.children.length) { pos = new_par.children.length; } if(!this.check("copy_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) { this.settings.core.error.call(this, this._data.core.last_error); return false; } node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj; if(!node) { return false; } if(node.id === true) { delete node.id; } node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat()); if(!node) { return false; } tmp = this.get_node(node); if(obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; } dpc = []; dpc.push(node); dpc = dpc.concat(tmp.children_d); this.trigger('model', { "nodes" : dpc, "parent" : new_par.id }); // insert into new parent and up for(i = 0, j = new_par.parents.length; i < j; i++) { this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc); } dpc = []; for(i = 0, j = new_par.children.length; i < j; i++) { dpc[i >= pos ? i+1 : i] = new_par.children[i]; } dpc[pos] = tmp.id; new_par.children = dpc; new_par.children_d.push(tmp.id); new_par.children_d = new_par.children_d.concat(tmp.children_d); if(new_par.id === $.jstree.root) { this._model.force_full_redraw = true; } if(!this._model.force_full_redraw) { this._node_changed(new_par.id); } if(!skip_redraw) { this.redraw(new_par.id === $.jstree.root); } if(callback) { callback.call(this, tmp, new_par, pos); } /** * triggered when a node is copied * @event * @name copy_node.jstree * @param {Object} node the copied node * @param {Object} original the original node * @param {String} parent the parent's ID * @param {Number} position the position of the node among the parent's children * @param {String} old_parent the old parent of the node * @param {Number} old_position the position of the original node * @param {Boolean} is_multi do the node and new parent belong to different instances * @param {jsTree} old_instance the instance the node came from * @param {jsTree} new_instance the instance of the new parent */ this.trigger('copy_node', { "node" : tmp, "original" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this }); return tmp.id; }, /** * cut a node (a later call to `paste(obj)` would move the node) * @name cut(obj) * @param {mixed} obj multiple objects can be passed using an array * @trigger cut.jstree */ cut : function (obj) { if(!obj) { obj = this._data.core.selected.concat(); } if(!$.vakata.is_array(obj)) { obj = [obj]; } if(!obj.length) { return false; } var tmp = [], o, t1, t2; for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { o = this.get_node(obj[t1]); if(o && (o.id || o.id === 0) && o.id !== $.jstree.root) { tmp.push(o); } } if(!tmp.length) { return false; } ccp_node = tmp; ccp_inst = this; ccp_mode = 'move_node'; /** * triggered when nodes are added to the buffer for moving * @event * @name cut.jstree * @param {Array} node */ this.trigger('cut', { "node" : obj }); }, /** * copy a node (a later call to `paste(obj)` would copy the node) * @name copy(obj) * @param {mixed} obj multiple objects can be passed using an array * @trigger copy.jstree */ copy : function (obj) { if(!obj) { obj = this._data.core.selected.concat(); } if(!$.vakata.is_array(obj)) { obj = [obj]; } if(!obj.length) { return false; } var tmp = [], o, t1, t2; for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { o = this.get_node(obj[t1]); if(o && (o.id !== undefined) && o.id !== $.jstree.root) { tmp.push(o); } } if(!tmp.length) { return false; } ccp_node = tmp; ccp_inst = this; ccp_mode = 'copy_node'; /** * triggered when nodes are added to the buffer for copying * @event * @name copy.jstree * @param {Array} node */ this.trigger('copy', { "node" : obj }); }, /** * get the current buffer (any nodes that are waiting for a paste operation) * @name get_buffer() * @return {Object} an object consisting of `mode` ("copy_node" or "move_node"), `node` (an array of objects) and `inst` (the instance) */ get_buffer : function () { return { 'mode' : ccp_mode, 'node' : ccp_node, 'inst' : ccp_inst }; }, /** * check if there is something in the buffer to paste * @name can_paste() * @return {Boolean} */ can_paste : function () { return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node]; }, /** * copy or move the previously cut or copied nodes to a new parent * @name paste(obj [, pos]) * @param {mixed} obj the new parent * @param {mixed} pos the position to insert at (besides integer, "first" and "last" are supported), defaults to integer `0` * @trigger paste.jstree */ paste : function (obj, pos) { obj = this.get_node(obj); if(!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) { return false; } if(this[ccp_mode](ccp_node, obj, pos, false, false, false, ccp_inst)) { /** * triggered when paste is invoked * @event * @name paste.jstree * @param {String} parent the ID of the receiving node * @param {Array} node the nodes in the buffer * @param {String} mode the performed operation - "copy_node" or "move_node" */ this.trigger('paste', { "parent" : obj.id, "node" : ccp_node, "mode" : ccp_mode }); } ccp_node = false; ccp_mode = false; ccp_inst = false; }, /** * clear the buffer of previously copied or cut nodes * @name clear_buffer() * @trigger clear_buffer.jstree */ clear_buffer : function () { ccp_node = false; ccp_mode = false; ccp_inst = false; /** * triggered when the copy / cut buffer is cleared * @event * @name clear_buffer.jstree */ this.trigger('clear_buffer'); }, /** * put a node in edit mode (input field to rename the node) * @name edit(obj [, default_text, callback]) * @param {mixed} obj * @param {String} default_text the text to populate the input with (if omitted or set to a non-string value the node's text value is used) * @param {Function} callback a function to be called once the text box is blurred, it is called in the instance's scope and receives the node, a status parameter (true if the rename is successful, false otherwise), a boolean indicating if the user cancelled the edit and the original unescaped value provided by the user. You can also access the node's title using .text */ edit : function (obj, default_text, callback) { var rtl, w, a, s, t, h1, h2, fn, tmp, cancel = false; obj = this.get_node(obj); if(!obj) { return false; } if(!this.check("edit", obj, this.get_parent(obj))) { this.settings.core.error.call(this, this._data.core.last_error); return false; } tmp = obj; default_text = typeof default_text === 'string' ? default_text : obj.text; this.set_text(obj, ""); obj = this._open_to(obj); tmp.text = default_text; rtl = this._data.core.rtl; w = this.element.width(); this._data.core.focused = tmp.id; a = obj.children('.jstree-anchor').trigger('focus'); s = $(''); /*! oi = obj.children("i:visible"), ai = a.children("i:visible"), w1 = oi.width() * oi.length, w2 = ai.width() * ai.length, */ t = default_text; h1 = $("<"+"div>", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo(document.body); h2 = $("<"+"input />", { "value" : t, "class" : "jstree-rename-input", // "size" : t.length, "css" : { "padding" : "0", "border" : "1px solid silver", "box-sizing" : "border-box", "display" : "inline-block", "height" : (this._data.core.li_height) + "px", "lineHeight" : (this._data.core.li_height) + "px", "width" : "150px" // will be set a bit further down }, "blur" : function (e) { e.stopImmediatePropagation(); e.preventDefault(); var i = s.children(".jstree-rename-input"), v = i.val(), f = this.settings.core.force_text, nv; if(v === "") { v = t; } h1.remove(); s.replaceWith(a); s.remove(); t = f ? t : $('
    ').append($.parseHTML(t)).html(); obj = this.get_node(obj); this.set_text(obj, t); nv = !!this.rename_node(obj, f ? $('
    ').text(v).text() : $('
    ').append($.parseHTML(v)).html()); if(!nv) { this.set_text(obj, t); // move this up? and fix #483 } this._data.core.focused = tmp.id; setTimeout(function () { var node = this.get_node(tmp.id, true); if(node.length) { this._data.core.focused = tmp.id; node.children('.jstree-anchor').trigger('focus'); } }.bind(this), 0); if(callback) { callback.call(this, tmp, nv, cancel, v); } h2 = null; }.bind(this), "keydown" : function (e) { var key = e.which; if(key === 27) { cancel = true; this.value = t; } if(key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) { e.stopImmediatePropagation(); } if(key === 27 || key === 13) { e.preventDefault(); this.blur(); } }, "click" : function (e) { e.stopImmediatePropagation(); }, "mousedown" : function (e) { e.stopImmediatePropagation(); }, "keyup" : function (e) { h2.width(Math.min(h1.text("pW" + this.value).width(),w)); }, "keypress" : function(e) { if(e.which === 13) { return false; } } }); fn = { fontFamily : a.css('fontFamily') || '', fontSize : a.css('fontSize') || '', fontWeight : a.css('fontWeight') || '', fontStyle : a.css('fontStyle') || '', fontStretch : a.css('fontStretch') || '', fontVariant : a.css('fontVariant') || '', letterSpacing : a.css('letterSpacing') || '', wordSpacing : a.css('wordSpacing') || '' }; s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2); a.replaceWith(s); h1.css(fn); h2.css(fn).width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select(); $(document).one('mousedown.jstree touchstart.jstree dnd_start.vakata', function (e) { if (h2 && e.target !== h2) { $(h2).trigger('blur'); } }); }, /** * changes the theme * @name set_theme(theme_name [, theme_url]) * @param {String} theme_name the name of the new theme to apply * @param {mixed} theme_url the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory. * @trigger set_theme.jstree */ set_theme : function (theme_name, theme_url) { if(!theme_name) { return false; } if(theme_url === true) { var dir = this.settings.core.themes.dir; if(!dir) { dir = $.jstree.path + '/themes'; } theme_url = dir + '/' + theme_name + '/style.css'; } if(theme_url && $.inArray(theme_url, themes_loaded) === -1) { $('head').append('<'+'link rel="stylesheet" href="' + theme_url + '" type="text/css" />'); themes_loaded.push(theme_url); } if(this._data.core.themes.name) { this.element.removeClass('jstree-' + this._data.core.themes.name); } this._data.core.themes.name = theme_name; this.element.addClass('jstree-' + theme_name); this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass' ]('jstree-' + theme_name + '-responsive'); /** * triggered when a theme is set * @event * @name set_theme.jstree * @param {String} theme the new theme */ this.trigger('set_theme', { 'theme' : theme_name }); }, /** * gets the name of the currently applied theme name * @name get_theme() * @return {String} */ get_theme : function () { return this._data.core.themes.name; }, /** * changes the theme variant (if the theme has variants) * @name set_theme_variant(variant_name) * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed) */ set_theme_variant : function (variant_name) { if(this._data.core.themes.variant) { this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant); } this._data.core.themes.variant = variant_name; if(variant_name) { this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant); } }, /** * gets the name of the currently applied theme variant * @name get_theme() * @return {String} */ get_theme_variant : function () { return this._data.core.themes.variant; }, /** * shows a striped background on the container (if the theme supports it) * @name show_stripes() */ show_stripes : function () { this._data.core.themes.stripes = true; this.get_container_ul().addClass("jstree-striped"); /** * triggered when stripes are shown * @event * @name show_stripes.jstree */ this.trigger('show_stripes'); }, /** * hides the striped background on the container * @name hide_stripes() */ hide_stripes : function () { this._data.core.themes.stripes = false; this.get_container_ul().removeClass("jstree-striped"); /** * triggered when stripes are hidden * @event * @name hide_stripes.jstree */ this.trigger('hide_stripes'); }, /** * toggles the striped background on the container * @name toggle_stripes() */ toggle_stripes : function () { if(this._data.core.themes.stripes) { this.hide_stripes(); } else { this.show_stripes(); } }, /** * shows the connecting dots (if the theme supports it) * @name show_dots() */ show_dots : function () { this._data.core.themes.dots = true; this.get_container_ul().removeClass("jstree-no-dots"); /** * triggered when dots are shown * @event * @name show_dots.jstree */ this.trigger('show_dots'); }, /** * hides the connecting dots * @name hide_dots() */ hide_dots : function () { this._data.core.themes.dots = false; this.get_container_ul().addClass("jstree-no-dots"); /** * triggered when dots are hidden * @event * @name hide_dots.jstree */ this.trigger('hide_dots'); }, /** * toggles the connecting dots * @name toggle_dots() */ toggle_dots : function () { if(this._data.core.themes.dots) { this.hide_dots(); } else { this.show_dots(); } }, /** * show the node icons * @name show_icons() */ show_icons : function () { this._data.core.themes.icons = true; this.get_container_ul().removeClass("jstree-no-icons"); /** * triggered when icons are shown * @event * @name show_icons.jstree */ this.trigger('show_icons'); }, /** * hide the node icons * @name hide_icons() */ hide_icons : function () { this._data.core.themes.icons = false; this.get_container_ul().addClass("jstree-no-icons"); /** * triggered when icons are hidden * @event * @name hide_icons.jstree */ this.trigger('hide_icons'); }, /** * toggle the node icons * @name toggle_icons() */ toggle_icons : function () { if(this._data.core.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }, /** * show the node ellipsis * @name show_icons() */ show_ellipsis : function () { this._data.core.themes.ellipsis = true; this.get_container_ul().addClass("jstree-ellipsis"); /** * triggered when ellisis is shown * @event * @name show_ellipsis.jstree */ this.trigger('show_ellipsis'); }, /** * hide the node ellipsis * @name hide_ellipsis() */ hide_ellipsis : function () { this._data.core.themes.ellipsis = false; this.get_container_ul().removeClass("jstree-ellipsis"); /** * triggered when ellisis is hidden * @event * @name hide_ellipsis.jstree */ this.trigger('hide_ellipsis'); }, /** * toggle the node ellipsis * @name toggle_icons() */ toggle_ellipsis : function () { if(this._data.core.themes.ellipsis) { this.hide_ellipsis(); } else { this.show_ellipsis(); } }, /** * set the node icon for a node * @name set_icon(obj, icon) * @param {mixed} obj * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class */ set_icon : function (obj, icon) { var t1, t2, dom, old; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.set_icon(obj[t1], icon); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } old = obj.icon; obj.icon = icon === true || icon === null || icon === undefined || icon === '' ? true : icon; dom = this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon"); if(icon === false) { dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel"); this.hide_icon(obj); } else if(icon === true || icon === null || icon === undefined || icon === '') { dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel"); if(old === false) { this.show_icon(obj); } } else if(icon.indexOf("/") === -1 && icon.indexOf(".") === -1) { dom.removeClass(old).css("background",""); dom.addClass(icon + ' jstree-themeicon-custom').attr("rel",icon); if(old === false) { this.show_icon(obj); } } else { dom.removeClass(old).css("background",""); dom.addClass('jstree-themeicon-custom').css("background", "url('" + icon + "') center center no-repeat").attr("rel",icon); if(old === false) { this.show_icon(obj); } } return true; }, /** * get the node icon for a node * @name get_icon(obj) * @param {mixed} obj * @return {String} */ get_icon : function (obj) { obj = this.get_node(obj); return (!obj || obj.id === $.jstree.root) ? false : obj.icon; }, /** * hide the icon on an individual node * @name hide_icon(obj) * @param {mixed} obj */ hide_icon : function (obj) { var t1, t2; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.hide_icon(obj[t1]); } return true; } obj = this.get_node(obj); if(!obj || obj === $.jstree.root) { return false; } obj.icon = false; this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon").addClass('jstree-themeicon-hidden'); return true; }, /** * show the icon on an individual node * @name show_icon(obj) * @param {mixed} obj */ show_icon : function (obj) { var t1, t2, dom; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.show_icon(obj[t1]); } return true; } obj = this.get_node(obj); if(!obj || obj === $.jstree.root) { return false; } dom = this.get_node(obj, true); obj.icon = dom.length ? dom.children(".jstree-anchor").children(".jstree-themeicon").attr('rel') : true; if(!obj.icon) { obj.icon = true; } dom.children(".jstree-anchor").children(".jstree-themeicon").removeClass('jstree-themeicon-hidden'); return true; } }; // helpers $.vakata = {}; // collect attributes $.vakata.attributes = function(node, with_values) { node = $(node)[0]; var attr = with_values ? {} : []; if(node && node.attributes) { $.each(node.attributes, function (i, v) { if($.inArray(v.name.toLowerCase(),['style','contenteditable','hasfocus','tabindex']) !== -1) { return; } if(v.value !== null && $.vakata.trim(v.value) !== '') { if(with_values) { attr[v.name] = v.value; } else { attr.push(v.name); } } }); } return attr; }; $.vakata.array_unique = function(array) { var a = [], i, j, l, o = {}; for(i = 0, l = array.length; i < l; i++) { if(o[array[i]] === undefined) { a.push(array[i]); o[array[i]] = true; } } return a; }; // remove item from array $.vakata.array_remove = function(array, from) { array.splice(from, 1); return array; //var rest = array.slice((to || from) + 1 || array.length); //array.length = from < 0 ? array.length + from : from; //array.push.apply(array, rest); //return array; }; // remove item from array $.vakata.array_remove_item = function(array, item) { var tmp = $.inArray(item, array); return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array; }; $.vakata.array_filter = function(c,a,b,d,e) { if (c.filter) { return c.filter(a, b); } d=[]; for (e in c) { if (~~e+''===e+'' && e>=0 && a.call(b,c[e],+e,c)) { d.push(c[e]); } } return d; }; $.vakata.trim = function (text) { return String.prototype.trim ? String.prototype.trim.call(text.toString()) : text.toString().replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }; $.vakata.is_function = function(obj) { return typeof obj === "function" && typeof obj.nodeType !== "number"; }; $.vakata.is_array = Array.isArray || function (obj) { return Object.prototype.toString.call(obj) === "[object Array]"; }; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind#polyfill if (!Function.prototype.bind) { Function.prototype.bind = function () { var thatFunc = this, thatArg = arguments[0]; var args = Array.prototype.slice.call(arguments, 1); if (typeof thatFunc !== 'function') { // closest thing possible to the ECMAScript 5 // internal IsCallable function throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); } return function(){ var funcArgs = args.concat(Array.prototype.slice.call(arguments)); return thatFunc.apply(thatArg, funcArgs); }; }; } /** * ### Changed plugin * * This plugin adds more information to the `changed.jstree` event. The new data is contained in the `changed` event data property, and contains a lists of `selected` and `deselected` nodes. */ $.jstree.plugins.changed = function (options, parent) { var last = []; this.trigger = function (ev, data) { var i, j; if(!data) { data = {}; } if(ev.replace('.jstree','') === 'changed') { data.changed = { selected : [], deselected : [] }; var tmp = {}; for(i = 0, j = last.length; i < j; i++) { tmp[last[i]] = 1; } for(i = 0, j = data.selected.length; i < j; i++) { if(!tmp[data.selected[i]]) { data.changed.selected.push(data.selected[i]); } else { tmp[data.selected[i]] = 2; } } for(i = 0, j = last.length; i < j; i++) { if(tmp[last[i]] === 1) { data.changed.deselected.push(last[i]); } } last = data.selected.slice(); } /** * triggered when selection changes (the "changed" plugin enhances the original event with more data) * @event * @name changed.jstree * @param {Object} node * @param {Object} action the action that caused the selection to change * @param {Array} selected the current selection * @param {Object} changed an object containing two properties `selected` and `deselected` - both arrays of node IDs, which were selected or deselected since the last changed event * @param {Object} event the event (if any) that triggered this changed event * @plugin changed */ parent.trigger.call(this, ev, data); }; this.refresh = function (skip_loading, forget_state) { last = []; return parent.refresh.apply(this, arguments); }; }; /** * ### Checkbox plugin * * This plugin renders checkbox icons in front of each node, making multiple selection much easier. * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up. */ var _i = document.createElement('I'); _i.className = 'jstree-icon jstree-checkbox'; _i.setAttribute('role', 'presentation'); /** * stores all defaults for the checkbox plugin * @name $.jstree.defaults.checkbox * @plugin checkbox */ $.jstree.defaults.checkbox = { /** * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`. * @name $.jstree.defaults.checkbox.visible * @plugin checkbox */ visible : true, /** * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`. * @name $.jstree.defaults.checkbox.three_state * @plugin checkbox */ three_state : true, /** * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`. * @name $.jstree.defaults.checkbox.whole_node * @plugin checkbox */ whole_node : true, /** * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`. * @name $.jstree.defaults.checkbox.keep_selected_style * @plugin checkbox */ keep_selected_style : true, /** * This setting controls how cascading and undetermined nodes are applied. * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used. * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''. * @name $.jstree.defaults.checkbox.cascade * @plugin checkbox */ cascade : '', /** * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing. * @name $.jstree.defaults.checkbox.tie_selection * @plugin checkbox */ tie_selection : true, /** * This setting controls if cascading down affects disabled checkboxes * @name $.jstree.defaults.checkbox.cascade_to_disabled * @plugin checkbox */ cascade_to_disabled : true, /** * This setting controls if cascading down affects hidden checkboxes * @name $.jstree.defaults.checkbox.cascade_to_hidden * @plugin checkbox */ cascade_to_hidden : true }; $.jstree.plugins.checkbox = function (options, parent) { this.bind = function () { parent.bind.call(this); this._data.checkbox.uto = false; this._data.checkbox.selected = []; if(this.settings.checkbox.three_state) { this.settings.checkbox.cascade = 'up+down+undetermined'; } this.element .on("init.jstree", function () { this._data.checkbox.visible = this.settings.checkbox.visible; if(!this.settings.checkbox.keep_selected_style) { this.element.addClass('jstree-checkbox-no-clicked'); } if(this.settings.checkbox.tie_selection) { this.element.addClass('jstree-checkbox-selection'); } }.bind(this)) .on("loading.jstree", function () { this[ this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes' ](); }.bind(this)); if(this.settings.checkbox.cascade.indexOf('undetermined') !== -1) { this.element .on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', function () { // only if undetermined is in setting if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); } this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50); }.bind(this)); } if(!this.settings.checkbox.tie_selection) { this.element .on('model.jstree', function (e, data) { var m = this._model.data, p = m[data.parent], dpc = data.nodes, i, j; for(i = 0, j = dpc.length; i < j; i++) { m[dpc[i]].state.checked = m[dpc[i]].state.checked || (m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked); if(m[dpc[i]].state.checked) { this._data.checkbox.selected.push(dpc[i]); } } }.bind(this)); } if(this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) { this.element .on('model.jstree', function (e, data) { var m = this._model.data, p = m[data.parent], dpc = data.nodes, chd = [], c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection; if(s.indexOf('down') !== -1) { // apply down if(p.state[ t ? 'selected' : 'checked' ]) { for(i = 0, j = dpc.length; i < j; i++) { m[dpc[i]].state[ t ? 'selected' : 'checked' ] = true; } this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(dpc); } else { for(i = 0, j = dpc.length; i < j; i++) { if(m[dpc[i]].state[ t ? 'selected' : 'checked' ]) { for(k = 0, l = m[dpc[i]].children_d.length; k < l; k++) { m[m[dpc[i]].children_d[k]].state[ t ? 'selected' : 'checked' ] = true; } this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(m[dpc[i]].children_d); } } } } if(s.indexOf('up') !== -1) { // apply up for(i = 0, j = p.children_d.length; i < j; i++) { if(!m[p.children_d[i]].children.length) { chd.push(m[p.children_d[i]].parent); } } chd = $.vakata.array_unique(chd); for(k = 0, l = chd.length; k < l; k++) { p = m[chd[k]]; while(p && p.id !== $.jstree.root) { c = 0; for(i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; } if(c === j) { p.state[ t ? 'selected' : 'checked' ] = true; this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); tmp = this.get_node(p, true); if(tmp && tmp.length) { tmp.children('.jstree-anchor').attr('aria-selected', true).addClass( t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } p = this.get_node(p.parent); } } } this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected); }.bind(this)) .on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', function (e, data) { var self = this, obj = data.node, m = this._model.data, par = this.get_node(obj.parent), i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection, sel = {}, cur = this._data[ t ? 'core' : 'checkbox' ].selected; for (i = 0, j = cur.length; i < j; i++) { sel[cur[i]] = true; } // apply down if(s.indexOf('down') !== -1) { //this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d)); var selectedIds = this._cascade_new_checked_state(obj.id, true); var temp = obj.children_d.concat(obj.id); for (i = 0, j = temp.length; i < j; i++) { if (selectedIds.indexOf(temp[i]) > -1) { sel[temp[i]] = true; } else { delete sel[temp[i]]; } } } // apply up if(s.indexOf('up') !== -1) { while(par && par.id !== $.jstree.root) { c = 0; for(i = 0, j = par.children.length; i < j; i++) { c += m[par.children[i]].state[ t ? 'selected' : 'checked' ]; } if(c === j) { par.state[ t ? 'selected' : 'checked' ] = true; sel[par.id] = true; //this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id); tmp = this.get_node(par, true); if(tmp && tmp.length) { tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } par = this.get_node(par.parent); } } cur = []; for (i in sel) { if (sel.hasOwnProperty(i)) { cur.push(i); } } this._data[ t ? 'core' : 'checkbox' ].selected = cur; }.bind(this)) .on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', function (e, data) { var obj = this.get_node($.jstree.root), m = this._model.data, i, j, tmp; for(i = 0, j = obj.children_d.length; i < j; i++) { tmp = m[obj.children_d[i]]; if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) { tmp.original.state.undetermined = false; } } }.bind(this)) .on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', function (e, data) { var self = this, obj = data.node, dom = this.get_node(obj, true), i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection, cur = this._data[ t ? 'core' : 'checkbox' ].selected, sel = {}, stillSelectedIds = [], allIds = obj.children_d.concat(obj.id); // apply down if(s.indexOf('down') !== -1) { var selectedIds = this._cascade_new_checked_state(obj.id, false); cur = $.vakata.array_filter(cur, function(id) { return allIds.indexOf(id) === -1 || selectedIds.indexOf(id) > -1; }); } // only apply up if cascade up is enabled and if this node is not selected // (if all child nodes are disabled and cascade_to_disabled === false then this node will till be selected). if(s.indexOf('up') !== -1 && cur.indexOf(obj.id) === -1) { for(i = 0, j = obj.parents.length; i < j; i++) { tmp = this._model.data[obj.parents[i]]; tmp.state[ t ? 'selected' : 'checked' ] = false; if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) { tmp.original.state.undetermined = false; } tmp = this.get_node(obj.parents[i], true); if(tmp && tmp.length) { tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } } cur = $.vakata.array_filter(cur, function(id) { return obj.parents.indexOf(id) === -1; }); } this._data[ t ? 'core' : 'checkbox' ].selected = cur; }.bind(this)); } if(this.settings.checkbox.cascade.indexOf('up') !== -1) { this.element .on('delete_node.jstree', function (e, data) { // apply up (whole handler) var p = this.get_node(data.parent), m = this._model.data, i, j, c, tmp, t = this.settings.checkbox.tie_selection; while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) { c = 0; for(i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; } if(j > 0 && c === j) { p.state[ t ? 'selected' : 'checked' ] = true; this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); tmp = this.get_node(p, true); if(tmp && tmp.length) { tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } p = this.get_node(p.parent); } }.bind(this)) .on('move_node.jstree', function (e, data) { // apply up (whole handler) var is_multi = data.is_multi, old_par = data.old_parent, new_par = this.get_node(data.parent), m = this._model.data, p, c, i, j, tmp, t = this.settings.checkbox.tie_selection; if(!is_multi) { p = this.get_node(old_par); while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) { c = 0; for(i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; } if(j > 0 && c === j) { p.state[ t ? 'selected' : 'checked' ] = true; this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); tmp = this.get_node(p, true); if(tmp && tmp.length) { tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } p = this.get_node(p.parent); } } p = new_par; while(p && p.id !== $.jstree.root) { c = 0; for(i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; } if(c === j) { if(!p.state[ t ? 'selected' : 'checked' ]) { p.state[ t ? 'selected' : 'checked' ] = true; this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); tmp = this.get_node(p, true); if(tmp && tmp.length) { tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } } else { if(p.state[ t ? 'selected' : 'checked' ]) { p.state[ t ? 'selected' : 'checked' ] = false; this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_remove_item(this._data[ t ? 'core' : 'checkbox' ].selected, p.id); tmp = this.get_node(p, true); if(tmp && tmp.length) { tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } } p = this.get_node(p.parent); } }.bind(this)); } }; /** * get an array of all nodes whose state is "undetermined" * @name get_undetermined([full]) * @param {boolean} full: if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_undetermined = function (full) { if (this.settings.checkbox.cascade.indexOf('undetermined') === -1) { return []; } var i, j, k, l, o = {}, m = this._model.data, t = this.settings.checkbox.tie_selection, s = this._data[ t ? 'core' : 'checkbox' ].selected, p = [], tt = this, r = []; for(i = 0, j = s.length; i < j; i++) { if(m[s[i]] && m[s[i]].parents) { for(k = 0, l = m[s[i]].parents.length; k < l; k++) { if(o[m[s[i]].parents[k]] !== undefined) { break; } if(m[s[i]].parents[k] !== $.jstree.root) { o[m[s[i]].parents[k]] = true; p.push(m[s[i]].parents[k]); } } } } // attempt for server side undetermined state this.element.find('.jstree-closed').not(':has(.jstree-children)') .each(function () { var tmp = tt.get_node(this), tmp2; if(!tmp) { return; } if(!tmp.state.loaded) { if(tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) { if(o[tmp.id] === undefined && tmp.id !== $.jstree.root) { o[tmp.id] = true; p.push(tmp.id); } for(k = 0, l = tmp.parents.length; k < l; k++) { if(o[tmp.parents[k]] === undefined && tmp.parents[k] !== $.jstree.root) { o[tmp.parents[k]] = true; p.push(tmp.parents[k]); } } } } else { for(i = 0, j = tmp.children_d.length; i < j; i++) { tmp2 = m[tmp.children_d[i]]; if(!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) { if(o[tmp2.id] === undefined && tmp2.id !== $.jstree.root) { o[tmp2.id] = true; p.push(tmp2.id); } for(k = 0, l = tmp2.parents.length; k < l; k++) { if(o[tmp2.parents[k]] === undefined && tmp2.parents[k] !== $.jstree.root) { o[tmp2.parents[k]] = true; p.push(tmp2.parents[k]); } } } } } }); for (i = 0, j = p.length; i < j; i++) { if(!m[p[i]].state[ t ? 'selected' : 'checked' ]) { r.push(full ? m[p[i]] : p[i]); } } return r; }; /** * set the undetermined state where and if necessary. Used internally. * @private * @name _undetermined() * @plugin checkbox */ this._undetermined = function () { if(this.element === null) { return; } var p = this.get_undetermined(false), i, j, s; this.element.find('.jstree-undetermined').removeClass('jstree-undetermined'); for (i = 0, j = p.length; i < j; i++) { s = this.get_node(p[i], true); if(s && s.length) { s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined'); } } }; this.redraw_node = function(obj, deep, is_callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if(obj) { var i, j, tmp = null, icon = null; for(i = 0, j = obj.childNodes.length; i < j; i++) { if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { tmp = obj.childNodes[i]; break; } } if(tmp) { if(!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) { tmp.className += ' jstree-checked'; } icon = _i.cloneNode(false); if(this._model.data[obj.id].state.checkbox_disabled) { icon.className += ' jstree-checkbox-disabled'; } tmp.insertBefore(icon, tmp.childNodes[0]); } } if(!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) { if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); } this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50); } return obj; }; /** * show the node checkbox icons * @name show_checkboxes() * @plugin checkbox */ this.show_checkboxes = function () { this._data.core.themes.checkboxes = true; this.get_container_ul().removeClass("jstree-no-checkboxes"); }; /** * hide the node checkbox icons * @name hide_checkboxes() * @plugin checkbox */ this.hide_checkboxes = function () { this._data.core.themes.checkboxes = false; this.get_container_ul().addClass("jstree-no-checkboxes"); }; /** * toggle the node icons * @name toggle_checkboxes() * @plugin checkbox */ this.toggle_checkboxes = function () { if(this._data.core.themes.checkboxes) { this.hide_checkboxes(); } else { this.show_checkboxes(); } }; /** * checks if a node is in an undetermined state * @name is_undetermined(obj) * @param {mixed} obj * @return {Boolean} */ this.is_undetermined = function (obj) { obj = this.get_node(obj); var s = this.settings.checkbox.cascade, i, j, t = this.settings.checkbox.tie_selection, d = this._data[ t ? 'core' : 'checkbox' ].selected, m = this._model.data; if(!obj || obj.state[ t ? 'selected' : 'checked' ] === true || s.indexOf('undetermined') === -1 || (s.indexOf('down') === -1 && s.indexOf('up') === -1)) { return false; } if(!obj.state.loaded && obj.original.state.undetermined === true) { return true; } for(i = 0, j = obj.children_d.length; i < j; i++) { if($.inArray(obj.children_d[i], d) !== -1 || (!m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined)) { return true; } } return false; }; /** * disable a node's checkbox * @name disable_checkbox(obj) * @param {mixed} obj an array can be used too * @trigger disable_checkbox.jstree * @plugin checkbox */ this.disable_checkbox = function (obj) { var t1, t2, dom; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.disable_checkbox(obj[t1]); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if(!obj.state.checkbox_disabled) { obj.state.checkbox_disabled = true; if(dom && dom.length) { dom.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-checkbox-disabled'); } /** * triggered when an node's checkbox is disabled * @event * @name disable_checkbox.jstree * @param {Object} node * @plugin checkbox */ this.trigger('disable_checkbox', { 'node' : obj }); } }; /** * enable a node's checkbox * @name enable_checkbox(obj) * @param {mixed} obj an array can be used too * @trigger enable_checkbox.jstree * @plugin checkbox */ this.enable_checkbox = function (obj) { var t1, t2, dom; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.enable_checkbox(obj[t1]); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if(obj.state.checkbox_disabled) { obj.state.checkbox_disabled = false; if(dom && dom.length) { dom.children('.jstree-anchor').children('.jstree-checkbox').removeClass('jstree-checkbox-disabled'); } /** * triggered when an node's checkbox is enabled * @event * @name enable_checkbox.jstree * @param {Object} node * @plugin checkbox */ this.trigger('enable_checkbox', { 'node' : obj }); } }; this.activate_node = function (obj, e) { if($(e.target).hasClass('jstree-checkbox-disabled')) { return false; } if(this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) { e.ctrlKey = true; } if(this.settings.checkbox.tie_selection || (!this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox'))) { return parent.activate_node.call(this, obj, e); } if(this.is_disabled(obj)) { return false; } if(this.is_checked(obj)) { this.uncheck_node(obj, e); } else { this.check_node(obj, e); } this.trigger('activate_node', { 'node' : this.get_node(obj) }); }; this.delete_node = function (obj) { if(this.settings.checkbox.tie_selection || $.vakata.is_array(obj)) { return parent.delete_node.call(this, obj); } var tmp, k, l, c = false; obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } tmp = obj.children_d.concat([]); tmp.push(obj.id); for(k = 0, l = tmp.length; k < l; k++) { if(this._model.data[tmp[k]].state.checked) { c = true; break; } } if (c) { this._data.checkbox.selected = $.vakata.array_filter(this._data.checkbox.selected, function (v) { return $.inArray(v, tmp) === -1; }); } return parent.delete_node.call(this, obj); }; /** * Cascades checked state to a node and all its descendants. This function does NOT affect hidden and disabled nodes (or their descendants). * However if these unaffected nodes are already selected their ids will be included in the returned array. * @private * @name _cascade_new_checked_state(id, checkedState) * @param {string} id the node ID * @param {bool} checkedState should the nodes be checked or not * @returns {Array} Array of all node id's (in this tree branch) that are checked. */ this._cascade_new_checked_state = function (id, checkedState) { var self = this; var t = this.settings.checkbox.tie_selection; var node = this._model.data[id]; var selectedNodeIds = []; var selectedChildrenIds = [], i, j, selectedChildIds; if ( (this.settings.checkbox.cascade_to_disabled || !node.state.disabled) && (this.settings.checkbox.cascade_to_hidden || !node.state.hidden) ) { //First try and check/uncheck the children if (node.children) { for (i = 0, j = node.children.length; i < j; i++) { var childId = node.children[i]; selectedChildIds = self._cascade_new_checked_state(childId, checkedState); selectedNodeIds = selectedNodeIds.concat(selectedChildIds); if (selectedChildIds.indexOf(childId) > -1) { selectedChildrenIds.push(childId); } } } var dom = self.get_node(node, true); //A node's state is undetermined if some but not all of it's children are checked/selected . var undetermined = selectedChildrenIds.length > 0 && selectedChildrenIds.length < node.children.length; if(node.original && node.original.state && node.original.state.undetermined) { node.original.state.undetermined = undetermined; } //If a node is undetermined then remove selected class if (undetermined) { node.state[ t ? 'selected' : 'checked' ] = false; dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } //Otherwise, if the checkedState === true (i.e. the node is being checked now) and all of the node's children are checked (if it has any children), //check the node and style it correctly. else if (checkedState && selectedChildrenIds.length === node.children.length) { node.state[ t ? 'selected' : 'checked' ] = checkedState; selectedNodeIds.push(node.id); dom.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); } else { node.state[ t ? 'selected' : 'checked' ] = false; dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { selectedChildIds = this.get_checked_descendants(id); if (node.state[ t ? 'selected' : 'checked' ]) { selectedChildIds.push(node.id); } selectedNodeIds = selectedNodeIds.concat(selectedChildIds); } return selectedNodeIds; }; /** * Gets ids of nodes selected in branch (of tree) specified by id (does not include the node specified by id) * @name get_checked_descendants(obj) * @param {string} id the node ID * @return {Array} array of IDs * @plugin checkbox */ this.get_checked_descendants = function (id) { var self = this; var t = self.settings.checkbox.tie_selection; var node = self._model.data[id]; return $.vakata.array_filter(node.children_d, function(_id) { return self._model.data[_id].state[ t ? 'selected' : 'checked' ]; }); }; /** * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally) * @name check_node(obj) * @param {mixed} obj an array can be used to check multiple nodes * @trigger check_node.jstree * @plugin checkbox */ this.check_node = function (obj, e) { if(this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); } var dom, t1, t2, th; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.check_node(obj[t1], e); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if(!obj.state.checked) { obj.state.checked = true; this._data.checkbox.selected.push(obj.id); if(dom && dom.length) { dom.children('.jstree-anchor').addClass('jstree-checked'); } /** * triggered when an node is checked (only if tie_selection in checkbox settings is false) * @event * @name check_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this check_node * @plugin checkbox */ this.trigger('check_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e }); } }; /** * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally) * @name uncheck_node(obj) * @param {mixed} obj an array can be used to uncheck multiple nodes * @trigger uncheck_node.jstree * @plugin checkbox */ this.uncheck_node = function (obj, e) { if(this.settings.checkbox.tie_selection) { return this.deselect_node(obj, false, e); } var t1, t2, dom; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.uncheck_node(obj[t1], e); } return true; } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if(obj.state.checked) { obj.state.checked = false; this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id); if(dom.length) { dom.children('.jstree-anchor').removeClass('jstree-checked'); } /** * triggered when an node is unchecked (only if tie_selection in checkbox settings is false) * @event * @name uncheck_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this uncheck_node * @plugin checkbox */ this.trigger('uncheck_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e }); } }; /** * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally) * @name check_all() * @trigger check_all.jstree, changed.jstree * @plugin checkbox */ this.check_all = function () { if(this.settings.checkbox.tie_selection) { return this.select_all(); } var tmp = this._data.checkbox.selected.concat([]), i, j; this._data.checkbox.selected = this._model.data[$.jstree.root].children_d.concat(); for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) { if(this._model.data[this._data.checkbox.selected[i]]) { this._model.data[this._data.checkbox.selected[i]].state.checked = true; } } this.redraw(true); /** * triggered when all nodes are checked (only if tie_selection in checkbox settings is false) * @event * @name check_all.jstree * @param {Array} selected the current selection * @plugin checkbox */ this.trigger('check_all', { 'selected' : this._data.checkbox.selected }); }; /** * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally) * @name uncheck_all() * @trigger uncheck_all.jstree * @plugin checkbox */ this.uncheck_all = function () { if(this.settings.checkbox.tie_selection) { return this.deselect_all(); } var tmp = this._data.checkbox.selected.concat([]), i, j; for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) { if(this._model.data[this._data.checkbox.selected[i]]) { this._model.data[this._data.checkbox.selected[i]].state.checked = false; } } this._data.checkbox.selected = []; this.element.find('.jstree-checked').removeClass('jstree-checked'); /** * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false) * @event * @name uncheck_all.jstree * @param {Object} node the previous selection * @param {Array} selected the current selection * @plugin checkbox */ this.trigger('uncheck_all', { 'selected' : this._data.checkbox.selected, 'node' : tmp }); }; /** * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected) * @name is_checked(obj) * @param {mixed} obj * @return {Boolean} * @plugin checkbox */ this.is_checked = function (obj) { if(this.settings.checkbox.tie_selection) { return this.is_selected(obj); } obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } return obj.state.checked; }; /** * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected) * @name get_checked([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_checked = function (full) { if(this.settings.checkbox.tie_selection) { return this.get_selected(full); } return full ? $.map(this._data.checkbox.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.checkbox.selected.slice(); }; /** * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected) * @name get_top_checked([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_top_checked = function (full) { if(this.settings.checkbox.tie_selection) { return this.get_top_selected(full); } var tmp = this.get_checked(true), obj = {}, i, j, k, l; for(i = 0, j = tmp.length; i < j; i++) { obj[tmp[i].id] = tmp[i]; } for(i = 0, j = tmp.length; i < j; i++) { for(k = 0, l = tmp[i].children_d.length; k < l; k++) { if(obj[tmp[i].children_d[k]]) { delete obj[tmp[i].children_d[k]]; } } } tmp = []; for(i in obj) { if(obj.hasOwnProperty(i)) { tmp.push(i); } } return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp; }; /** * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected) * @name get_bottom_checked([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_bottom_checked = function (full) { if(this.settings.checkbox.tie_selection) { return this.get_bottom_selected(full); } var tmp = this.get_checked(true), obj = [], i, j; for(i = 0, j = tmp.length; i < j; i++) { if(!tmp[i].children.length) { obj.push(tmp[i].id); } } return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj; }; this.load_node = function (obj, callback) { var k, l, i, j, c, tmp; if(!$.vakata.is_array(obj) && !this.settings.checkbox.tie_selection) { tmp = this.get_node(obj); if(tmp && tmp.state.loaded) { for(k = 0, l = tmp.children_d.length; k < l; k++) { if(this._model.data[tmp.children_d[k]].state.checked) { c = true; this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, tmp.children_d[k]); } } } } return parent.load_node.apply(this, arguments); }; this.get_state = function () { var state = parent.get_state.apply(this, arguments); if(this.settings.checkbox.tie_selection) { return state; } state.checkbox = this._data.checkbox.selected.slice(); return state; }; this.set_state = function (state, callback) { var res = parent.set_state.apply(this, arguments); if(res && state.checkbox) { if(!this.settings.checkbox.tie_selection) { this.uncheck_all(); var _this = this; $.each(state.checkbox, function (i, v) { _this.check_node(v); }); } delete state.checkbox; this.set_state(state, callback); return false; } return res; }; this.refresh = function (skip_loading, forget_state) { if(this.settings.checkbox.tie_selection) { this._data.checkbox.selected = []; } return parent.refresh.apply(this, arguments); }; }; // include the checkbox plugin by default // $.jstree.defaults.plugins.push("checkbox"); /** * ### Conditionalselect plugin * * This plugin allows defining a callback to allow or deny node selection by user input (activate node method). */ /** * a callback (function) which is invoked in the instance's scope and receives two arguments - the node and the event that triggered the `activate_node` call. Returning false prevents working with the node, returning true allows invoking activate_node. Defaults to returning `true`. * @name $.jstree.defaults.checkbox.visible * @plugin checkbox */ $.jstree.defaults.conditionalselect = function () { return true; }; $.jstree.plugins.conditionalselect = function (options, parent) { // own function this.activate_node = function (obj, e) { if(this.settings.conditionalselect.call(this, this.get_node(obj), e)) { return parent.activate_node.call(this, obj, e); } }; }; /** * ### Contextmenu plugin * * Shows a context menu when a node is right-clicked. */ /** * stores all defaults for the contextmenu plugin * @name $.jstree.defaults.contextmenu * @plugin contextmenu */ $.jstree.defaults.contextmenu = { /** * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`. * @name $.jstree.defaults.contextmenu.select_node * @plugin contextmenu */ select_node : true, /** * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used. * @name $.jstree.defaults.contextmenu.show_at_node * @plugin contextmenu */ show_at_node : true, /** * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too). * * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required). Once a menu item is activated the `action` function will be invoked with an object containing the following keys: item - the contextmenu item definition as seen below, reference - the DOM node that was used (the tree node), element - the contextmenu DOM element, position - an object with x/y properties indicating the position of the menu. * * * `separator_before` - a boolean indicating if there should be a separator before this item * * `separator_after` - a boolean indicating if there should be a separator after this item * * `_disabled` - a boolean indicating if this action should be disabled * * `label` - a string - the name of the action (could be a function returning a string) * * `title` - a string - an optional tooltip for the item * * `action` - a function to be executed if this item is chosen, the function will receive * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2) * * `shortcut_label` - shortcut label (like for example `F2` for rename) * * `submenu` - an object with the same structure as $.jstree.defaults.contextmenu.items which can be used to create a submenu - each key will be rendered as a separate option in a submenu that will appear once the current item is hovered * * @name $.jstree.defaults.contextmenu.items * @plugin contextmenu */ items : function (o, cb) { // Could be an object directly return { "create" : { "separator_before" : false, "separator_after" : true, "_disabled" : false, //(this.check("create_node", data.reference, {}, "last")), "label" : "Create", "action" : function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); inst.create_node(obj, {}, "last", function (new_node) { try { inst.edit(new_node); } catch (ex) { setTimeout(function () { inst.edit(new_node); },0); } }); } }, "rename" : { "separator_before" : false, "separator_after" : false, "_disabled" : false, //(this.check("rename_node", data.reference, this.get_parent(data.reference), "")), "label" : "Rename", /*! "shortcut" : 113, "shortcut_label" : 'F2', "icon" : "glyphicon glyphicon-leaf", */ "action" : function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); inst.edit(obj); } }, "remove" : { "separator_before" : false, "icon" : false, "separator_after" : false, "_disabled" : false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")), "label" : "Delete", "action" : function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); if(inst.is_selected(obj)) { inst.delete_node(inst.get_selected()); } else { inst.delete_node(obj); } } }, "ccp" : { "separator_before" : true, "icon" : false, "separator_after" : false, "label" : "Edit", "action" : false, "submenu" : { "cut" : { "separator_before" : false, "separator_after" : false, "label" : "Cut", "action" : function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); if(inst.is_selected(obj)) { inst.cut(inst.get_top_selected()); } else { inst.cut(obj); } } }, "copy" : { "separator_before" : false, "icon" : false, "separator_after" : false, "label" : "Copy", "action" : function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); if(inst.is_selected(obj)) { inst.copy(inst.get_top_selected()); } else { inst.copy(obj); } } }, "paste" : { "separator_before" : false, "icon" : false, "_disabled" : function (data) { return !$.jstree.reference(data.reference).can_paste(); }, "separator_after" : false, "label" : "Paste", "action" : function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); inst.paste(obj); } } } } }; } }; $.jstree.plugins.contextmenu = function (options, parent) { this.bind = function () { parent.bind.call(this); var last_ts = 0, cto = null, ex, ey; this.element .on("init.jstree loading.jstree ready.jstree", function () { this.get_container_ul().addClass('jstree-contextmenu'); }.bind(this)) .on("contextmenu.jstree", ".jstree-anchor", function (e, data) { if (e.target.tagName.toLowerCase() === 'input') { return; } e.preventDefault(); last_ts = e.ctrlKey ? +new Date() : 0; if(data || cto) { last_ts = (+new Date()) + 10000; } if(cto) { clearTimeout(cto); } if(!this.is_loading(e.currentTarget)) { this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e); } }.bind(this)) .on("click.jstree", ".jstree-anchor", function (e) { if(this._data.contextmenu.visible && (!last_ts || (+new Date()) - last_ts > 250)) { // work around safari & macOS ctrl+click $.vakata.context.hide(); } last_ts = 0; }.bind(this)) .on("touchstart.jstree", ".jstree-anchor", function (e) { if(!e.originalEvent || !e.originalEvent.changedTouches || !e.originalEvent.changedTouches[0]) { return; } ex = e.originalEvent.changedTouches[0].clientX; ey = e.originalEvent.changedTouches[0].clientY; cto = setTimeout(function () { $(e.currentTarget).trigger('contextmenu', true); }, 750); }) .on('touchmove.vakata.jstree', function (e) { if(cto && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0] && (Math.abs(ex - e.originalEvent.changedTouches[0].clientX) > 10 || Math.abs(ey - e.originalEvent.changedTouches[0].clientY) > 10)) { clearTimeout(cto); $.vakata.context.hide(); } }) .on('touchend.vakata.jstree', function (e) { if(cto) { clearTimeout(cto); } }); /*! if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) { var el = null, tm = null; this.element .on("touchstart", ".jstree-anchor", function (e) { el = e.currentTarget; tm = +new Date(); $(document).one("touchend", function (e) { e.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset); e.currentTarget = e.target; tm = ((+(new Date())) - tm); if(e.target === el && tm > 600 && tm < 1000) { e.preventDefault(); $(el).trigger('contextmenu', e); } el = null; tm = null; }); }); } */ $(document).on("context_hide.vakata.jstree", function (e, data) { this._data.contextmenu.visible = false; $(data.reference).removeClass('jstree-context'); }.bind(this)); }; this.teardown = function () { if(this._data.contextmenu.visible) { $.vakata.context.hide(); } $(document).off("context_hide.vakata.jstree"); parent.teardown.call(this); }; /** * prepare and show the context menu for a node * @name show_contextmenu(obj [, x, y]) * @param {mixed} obj the node * @param {Number} x the x-coordinate relative to the document to show the menu at * @param {Number} y the y-coordinate relative to the document to show the menu at * @param {Object} e the event if available that triggered the contextmenu * @plugin contextmenu * @trigger show_contextmenu.jstree */ this.show_contextmenu = function (obj, x, y, e) { obj = this.get_node(obj); if(!obj || obj.id === $.jstree.root) { return false; } var s = this.settings.contextmenu, d = this.get_node(obj, true), a = d.children(".jstree-anchor"), o = false, i = false; if(s.show_at_node || x === undefined || y === undefined) { o = a.offset(); x = o.left; y = o.top + this._data.core.li_height; } if(this.settings.contextmenu.select_node && !this.is_selected(obj)) { this.activate_node(obj, e); } i = s.items; if($.vakata.is_function(i)) { i = i.call(this, obj, function (i) { this._show_contextmenu(obj, x, y, i); }.bind(this)); } if($.isPlainObject(i)) { this._show_contextmenu(obj, x, y, i); } }; /** * show the prepared context menu for a node * @name _show_contextmenu(obj, x, y, i) * @param {mixed} obj the node * @param {Number} x the x-coordinate relative to the document to show the menu at * @param {Number} y the y-coordinate relative to the document to show the menu at * @param {Number} i the object of items to show * @plugin contextmenu * @trigger show_contextmenu.jstree * @private */ this._show_contextmenu = function (obj, x, y, i) { var d = this.get_node(obj, true), a = d.children(".jstree-anchor"); $(document).one("context_show.vakata.jstree", function (e, data) { var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu'; $(data.element).addClass(cls); a.addClass('jstree-context'); }.bind(this)); this._data.contextmenu.visible = true; $.vakata.context.show(a, { 'x' : x, 'y' : y }, i); /** * triggered when the contextmenu is shown for a node * @event * @name show_contextmenu.jstree * @param {Object} node the node * @param {Number} x the x-coordinate of the menu relative to the document * @param {Number} y the y-coordinate of the menu relative to the document * @plugin contextmenu */ this.trigger('show_contextmenu', { "node" : obj, "x" : x, "y" : y }); }; }; // contextmenu helper (function ($) { var right_to_left = false, vakata_context = { element : false, reference : false, position_x : 0, position_y : 0, items : [], html : "", is_visible : false }; $.vakata.context = { settings : { hide_onmouseleave : 0, icons : true }, _trigger : function (event_name) { $(document).triggerHandler("context_" + event_name + ".vakata", { "reference" : vakata_context.reference, "element" : vakata_context.element, "position" : { "x" : vakata_context.position_x, "y" : vakata_context.position_y } }); }, _execute : function (i) { i = vakata_context.items[i]; return i && (!i._disabled || ($.vakata.is_function(i._disabled) && !i._disabled({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }))) && i.action ? i.action.call(null, { "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element, "position" : { "x" : vakata_context.position_x, "y" : vakata_context.position_y } }) : false; }, _parse : function (o, is_callback) { if(!o) { return false; } if(!is_callback) { vakata_context.html = ""; vakata_context.items = []; } var str = "", sep = false, tmp; if(is_callback) { str += "<"+"ul>"; } $.each(o, function (i, val) { if(!val) { return true; } vakata_context.items.push(val); if(!sep && val.separator_before) { str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + "> <"+"/a><"+"/li>"; } sep = false; str += "<"+"li class='" + (val._class || "") + (val._disabled === true || ($.vakata.is_function(val._disabled) && val._disabled({ "item" : val, "reference" : vakata_context.reference, "element" : vakata_context.element })) ? " vakata-contextmenu-disabled " : "") + "' "+(val.shortcut?" data-shortcut='"+val.shortcut+"' ":'')+">"; str += "<"+"a href='#' rel='" + (vakata_context.items.length - 1) + "' " + (val.title ? "title='" + val.title + "'" : "") + ">"; if($.vakata.context.settings.icons) { str += "<"+"i "; if(val.icon) { if(val.icon.indexOf("/") !== -1 || val.icon.indexOf(".") !== -1) { str += " style='background:url(\"" + val.icon + "\") center center no-repeat' "; } else { str += " class='" + val.icon + "' "; } } str += "><"+"/i><"+"span class='vakata-contextmenu-sep'> <"+"/span>"; } str += ($.vakata.is_function(val.label) ? val.label({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }) : val.label) + (val.shortcut?' '+ (val.shortcut_label || '') +'':'') + "<"+"/a>"; if(val.submenu) { tmp = $.vakata.context._parse(val.submenu, true); if(tmp) { str += tmp; } } str += "<"+"/li>"; if(val.separator_after) { str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + "> <"+"/a><"+"/li>"; sep = true; } }); str = str.replace(/
  • <\/li\>$/,""); if(is_callback) { str += ""; } /** * triggered on the document when the contextmenu is parsed (HTML is built) * @event * @plugin contextmenu * @name context_parse.vakata * @param {jQuery} reference the element that was right clicked * @param {jQuery} element the DOM element of the menu itself * @param {Object} position the x & y coordinates of the menu */ if(!is_callback) { vakata_context.html = str; $.vakata.context._trigger("parse"); } return str.length > 10 ? str : false; }, _show_submenu : function (o) { o = $(o); if(!o.length || !o.children("ul").length) { return; } var e = o.children("ul"), xl = o.offset().left, x = xl + o.outerWidth(), y = o.offset().top, w = e.width(), h = e.height(), dw = $(window).width() + $(window).scrollLeft(), dh = $(window).height() + $(window).scrollTop(); // може да се спести е една проверка - дали няма някой от класовете вече нагоре if(right_to_left) { o[x - (w + 10 + o.outerWidth()) < 0 ? "addClass" : "removeClass"]("vakata-context-left"); } else { o[x + w > dw && xl > dw - x ? "addClass" : "removeClass"]("vakata-context-right"); } if(y + h + 10 > dh) { e.css("bottom","-1px"); } //if does not fit - stick it to the side if (o.hasClass('vakata-context-right')) { if (xl < w) { e.css("margin-right", xl - w); } } else { if (dw - x < w) { e.css("margin-left", dw - x - w); } } e.show(); }, show : function (reference, position, data) { var o, e, x, y, w, h, dw, dh, cond = true; if(vakata_context.element && vakata_context.element.length) { vakata_context.element.width(''); } switch(cond) { case (!position && !reference): return false; case (!!position && !!reference): vakata_context.reference = reference; vakata_context.position_x = position.x; vakata_context.position_y = position.y; break; case (!position && !!reference): vakata_context.reference = reference; o = reference.offset(); vakata_context.position_x = o.left + reference.outerHeight(); vakata_context.position_y = o.top; break; case (!!position && !reference): vakata_context.position_x = position.x; vakata_context.position_y = position.y; break; } if(!!reference && !data && $(reference).data('vakata_contextmenu')) { data = $(reference).data('vakata_contextmenu'); } if($.vakata.context._parse(data)) { vakata_context.element.html(vakata_context.html); } if(vakata_context.items.length) { vakata_context.element.appendTo(document.body); e = vakata_context.element; x = vakata_context.position_x; y = vakata_context.position_y; w = e.width(); h = e.height(); dw = $(window).width() + $(window).scrollLeft(); dh = $(window).height() + $(window).scrollTop(); if(right_to_left) { x -= (e.outerWidth() - $(reference).outerWidth()); if(x < $(window).scrollLeft() + 20) { x = $(window).scrollLeft() + 20; } } if(x + w + 20 > dw) { x = dw - (w + 20); } if(y + h + 20 > dh) { y = dh - (h + 20); } vakata_context.element .css({ "left" : x, "top" : y }) .show() .find('a').first().trigger('focus').parent().addClass("vakata-context-hover"); vakata_context.is_visible = true; /** * triggered on the document when the contextmenu is shown * @event * @plugin contextmenu * @name context_show.vakata * @param {jQuery} reference the element that was right clicked * @param {jQuery} element the DOM element of the menu itself * @param {Object} position the x & y coordinates of the menu */ $.vakata.context._trigger("show"); } }, hide : function () { if(vakata_context.is_visible) { vakata_context.element.hide().find("ul").hide().end().find(':focus').trigger('blur').end().detach(); vakata_context.is_visible = false; /** * triggered on the document when the contextmenu is hidden * @event * @plugin contextmenu * @name context_hide.vakata * @param {jQuery} reference the element that was right clicked * @param {jQuery} element the DOM element of the menu itself * @param {Object} position the x & y coordinates of the menu */ $.vakata.context._trigger("hide"); } } }; $(function () { right_to_left = $(document.body).css("direction") === "rtl"; var to = false; vakata_context.element = $("
      "); vakata_context.element .on("mouseenter", "li", function (e) { e.stopImmediatePropagation(); if($.contains(this, e.relatedTarget)) { // премахнато заради delegate mouseleave по-долу // $(this).find(".vakata-context-hover").removeClass("vakata-context-hover"); return; } if(to) { clearTimeout(to); } vakata_context.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end(); $(this) .siblings().find("ul").hide().end().end() .parentsUntil(".vakata-context", "li").addBack().addClass("vakata-context-hover"); $.vakata.context._show_submenu(this); }) // тестово - дали не натоварва? .on("mouseleave", "li", function (e) { if($.contains(this, e.relatedTarget)) { return; } $(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover"); }) .on("mouseleave", function (e) { $(this).find(".vakata-context-hover").removeClass("vakata-context-hover"); if($.vakata.context.settings.hide_onmouseleave) { to = setTimeout( (function (t) { return function () { $.vakata.context.hide(); }; }(this)), $.vakata.context.settings.hide_onmouseleave); } }) .on("click", "a", function (e) { e.preventDefault(); //}) //.on("mouseup", "a", function (e) { if(!$(this).trigger('blur').parent().hasClass("vakata-context-disabled") && $.vakata.context._execute($(this).attr("rel")) !== false) { $.vakata.context.hide(); } }) .on('keydown', 'a', function (e) { var o = null; switch(e.which) { case 13: case 32: e.type = "click"; e.preventDefault(); $(e.currentTarget).trigger(e); break; case 37: if(vakata_context.is_visible) { vakata_context.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children('a').trigger('focus'); e.stopImmediatePropagation(); e.preventDefault(); } break; case 38: if(vakata_context.is_visible) { o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first(); if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last(); } o.addClass("vakata-context-hover").children('a').trigger('focus'); e.stopImmediatePropagation(); e.preventDefault(); } break; case 39: if(vakata_context.is_visible) { vakata_context.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children('a').trigger('focus'); e.stopImmediatePropagation(); e.preventDefault(); } break; case 40: if(vakata_context.is_visible) { o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first(); if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first(); } o.addClass("vakata-context-hover").children('a').trigger('focus'); e.stopImmediatePropagation(); e.preventDefault(); } break; case 27: $.vakata.context.hide(); e.preventDefault(); break; default: //console.log(e.which); break; } }) .on('keydown', function (e) { e.preventDefault(); var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent(); if(a.parent().not('.vakata-context-disabled')) { a.trigger('click'); } }); $(document) .on("mousedown.vakata.jstree", function (e) { if(vakata_context.is_visible && vakata_context.element[0] !== e.target && !$.contains(vakata_context.element[0], e.target)) { $.vakata.context.hide(); } }) .on("context_show.vakata.jstree", function (e, data) { vakata_context.element.find("li:has(ul)").children("a").addClass("vakata-context-parent"); if(right_to_left) { vakata_context.element.addClass("vakata-context-rtl").css("direction", "rtl"); } // also apply a RTL class? vakata_context.element.find("ul").hide().end(); }); }); }($)); // $.jstree.defaults.plugins.push("contextmenu"); /** * ### Drag'n'drop plugin * * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations. */ /** * stores all defaults for the drag'n'drop plugin * @name $.jstree.defaults.dnd * @plugin dnd */ $.jstree.defaults.dnd = { /** * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`. * @name $.jstree.defaults.dnd.copy * @plugin dnd */ copy : true, /** * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`. * @name $.jstree.defaults.dnd.open_timeout * @plugin dnd */ open_timeout : 500, /** * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging * @name $.jstree.defaults.dnd.is_draggable * @plugin dnd */ is_draggable : true, /** * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true` * @name $.jstree.defaults.dnd.check_while_dragging * @plugin dnd */ check_while_dragging : true, /** * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false` * @name $.jstree.defaults.dnd.always_copy * @plugin dnd */ always_copy : false, /** * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0` * @name $.jstree.defaults.dnd.inside_pos * @plugin dnd */ inside_pos : 0, /** * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node * @name $.jstree.defaults.dnd.drag_selection * @plugin dnd */ drag_selection : true, /** * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices. * @name $.jstree.defaults.dnd.touch * @plugin dnd */ touch : true, /** * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target. * @name $.jstree.defaults.dnd.large_drop_target * @plugin dnd */ large_drop_target : false, /** * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to "selected". * @name $.jstree.defaults.dnd.large_drag_target * @plugin dnd */ large_drag_target : false, /** * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls. * @reference http://caniuse.com/#feat=dragndrop * @name $.jstree.defaults.dnd.use_html5 * @plugin dnd */ use_html5: false, /** * controls whether items can be dropped anywhere on the tree. * @name $.jstree.defaults.dnd.blank_space_drop * @plugin dnd */ blank_space_drop: false }; var drg, elm; // TODO: now check works by checking for each node individually, how about max_children, unique, etc? $.jstree.plugins.dnd = function (options, parent) { this.init = function (el, options) { parent.init.call(this, el, options); this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && ('draggable' in document.createElement('span')); }; this.bind = function () { parent.bind.call(this); this.element .on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', function (e) { if(this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) { return true; } if(e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked')))) { return true; } var obj = this.get_node(e.target), mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1, txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget)); if(this.settings.core.force_text) { txt = $.vakata.html.escape(txt); } if(obj && (obj.id || obj.id === 0) && obj.id !== $.jstree.root && (e.which === 1 || e.type === "touchstart" || e.type === "dragstart") && (this.settings.dnd.is_draggable === true || ($.vakata.is_function(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_top_selected(true) : [obj]), e))) ) { drg = { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_top_selected() : [obj.id] }; elm = e.currentTarget; if (this.settings.dnd.use_html5) { $.vakata.dnd._trigger('start', e, { 'helper': $(), 'element': elm, 'data': drg }); } else { this.element.trigger('mousedown.jstree'); return $.vakata.dnd.start(e, drg, '
      ' + txt + '+
      '); } } }.bind(this)); if (this.settings.dnd.use_html5) { this.element .on('dragover.jstree', function (e) { e.preventDefault(); $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); return false; }) //.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) { // e.preventDefault(); // $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); // return false; // }, this)) .on('drop.jstree', function (e) { e.preventDefault(); $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg }); return false; }.bind(this)); } }; this.redraw_node = function(obj, deep, callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if (obj && this.settings.dnd.use_html5) { if (this.settings.dnd.large_drag_target) { obj.setAttribute('draggable', true); } else { var i, j, tmp = null; for(i = 0, j = obj.childNodes.length; i < j; i++) { if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { tmp = obj.childNodes[i]; break; } } if(tmp) { tmp.setAttribute('draggable', true); } } } return obj; }; }; $(function() { // bind only once for all instances var lastmv = false, laster = false, lastev = false, opento = false, marker = $('
       
      ').hide(); //.appendTo('body'); $(document) .on('dragover.vakata.jstree', function (e) { if (elm) { $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); } }) .on('drop.vakata.jstree', function (e) { if (elm) { $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg }); elm = null; drg = null; } }) .on('dnd_start.vakata.jstree', function (e, data) { lastmv = false; lastev = false; if(!data || !data.data || !data.data.jstree) { return; } marker.appendTo(document.body); //.show(); }) .on('dnd_move.vakata.jstree', function (e, data) { var isDifferentNode = data.event.target !== lastev.target; if(opento) { if (!data.event || data.event.type !== 'dragover' || isDifferentNode) { clearTimeout(opento); } } if(!data || !data.data || !data.data.jstree) { return; } // if we are hovering the marker image do nothing (can happen on "inside" drags) if(data.event.target.id && data.event.target.id === 'jstree-marker') { return; } lastev = data.event; var ins = $.jstree.reference(data.event.target), ref = false, off = false, rel = false, tmp, l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm, is_copy, pn, c; // if we are over an instance if(ins && ins._data && ins._data.dnd) { marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' )); is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))); data.helper .children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' )) .find('.jstree-copy').first()[ is_copy ? 'show' : 'hide' ](); // if are hovering the container itself add a new root node //console.log(data.event); if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && (ins.get_container_ul().children().length === 0 || ins.settings.dnd.blank_space_drop)) { ok = true; for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) { ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), $.jstree.root, 'last', { 'dnd' : true, 'ref' : ins.get_node($.jstree.root), 'pos' : 'i', 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }); if(!ok) { break; } } if(ok) { lastmv = { 'ins' : ins, 'par' : $.jstree.root, 'pos' : 'last' }; marker.hide(); data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok'); if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move'; } return; } } else { // if we are hovering a tree node ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor'); if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) { off = ref.offset(); rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top; h = ref.outerHeight(); if(rel < h / 3) { o = ['b', 'i', 'a']; } else if(rel > h - h / 3) { o = ['a', 'i', 'b']; } else { o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a']; } $.each(o, function (j, v) { switch(v) { case 'b': l = off.left - 6; t = off.top; p = ins.get_parent(ref); i = ref.parent().index(); c = 'jstree-below'; break; case 'i': ip = ins.settings.dnd.inside_pos; tm = ins.get_node(ref.parent()); l = off.left - 2; t = off.top + h / 2 + 1; p = tm.id; i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length)); c = 'jstree-inside'; break; case 'a': l = off.left - 6; t = off.top + h; p = ins.get_parent(ref); i = ref.parent().index() + 1; c = 'jstree-above'; break; } ok = true; for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) { op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node"; ps = i; if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) { pr = ins.get_node(p); if(ps > $.inArray(data.data.nodes[t1], pr.children)) { ps -= 1; } } ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) ); if(!ok) { if(ins && ins.last_error) { laster = ins.last_error(); } break; } } if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) { if (!data.event || data.event.type !== 'dragover' || isDifferentNode) { if (opento) { clearTimeout(opento); } opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout); } } if(ok) { pn = ins.get_node(p, true); if (!pn.hasClass('.jstree-dnd-parent')) { $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); pn.addClass('jstree-dnd-parent'); } lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i }; marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show(); marker.removeClass('jstree-above jstree-inside jstree-below').addClass(c); data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok'); if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move'; } laster = {}; o = true; return false; } }); if(o === true) { return; } } } } $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); lastmv = false; data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er'); if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { //data.event.originalEvent.dataTransfer.dropEffect = 'none'; } marker.hide(); }) .on('dnd_scroll.vakata.jstree', function (e, data) { if(!data || !data.data || !data.data.jstree) { return; } marker.hide(); lastmv = false; lastev = false; data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er'); }) .on('dnd_stop.vakata.jstree', function (e, data) { $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); if(opento) { clearTimeout(opento); } if(!data || !data.data || !data.data.jstree) { return; } marker.hide().detach(); var i, j, nodes = []; if(lastmv) { for(i = 0, j = data.data.nodes.length; i < j; i++) { nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i]; } lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin); } else { i = $(data.event.target).closest('.jstree'); if(i.length && laster && laster.error && laster.error === 'check') { i = i.jstree(true); if(i) { i.settings.core.error.call(this, laster); } } } lastev = false; lastmv = false; }) .on('keyup.jstree keydown.jstree', function (e, data) { data = $.vakata.dnd._get(); if(data && data.data && data.data.jstree) { if (e.type === "keyup" && e.which === 27) { if (opento) { clearTimeout(opento); } lastmv = false; laster = false; lastev = false; opento = false; marker.hide().detach(); $.vakata.dnd._clean(); } else { data.helper.find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ](); if(lastev) { lastev.metaKey = e.metaKey; lastev.ctrlKey = e.ctrlKey; $.vakata.dnd._trigger('move', lastev); } } } }); }); // helpers (function ($) { $.vakata.html = { div : $('
      '), escape : function (str) { return $.vakata.html.div.text(str).html(); }, strip : function (str) { return $.vakata.html.div.empty().append($.parseHTML(str)).text(); } }; // private variable var vakata_dnd = { element : false, target : false, is_down : false, is_drag : false, helper : false, helper_w: 0, data : false, init_x : 0, init_y : 0, scroll_l: 0, scroll_t: 0, scroll_e: false, scroll_i: false, is_touch: false }; $.vakata.dnd = { settings : { scroll_speed : 10, scroll_proximity : 20, helper_left : 5, helper_top : 10, threshold : 5, threshold_touch : 10 }, _trigger : function (event_name, e, data) { if (data === undefined) { data = $.vakata.dnd._get(); } data.event = e; $(document).triggerHandler("dnd_" + event_name + ".vakata", data); }, _get : function () { return { "data" : vakata_dnd.data, "element" : vakata_dnd.element, "helper" : vakata_dnd.helper }; }, _clean : function () { if(vakata_dnd.helper) { vakata_dnd.helper.remove(); } if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; } vakata_dnd = { element : false, target : false, is_down : false, is_drag : false, helper : false, helper_w: 0, data : false, init_x : 0, init_y : 0, scroll_l: 0, scroll_t: 0, scroll_e: false, scroll_i: false, is_touch: false }; elm = null; $(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag); $(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop); }, _scroll : function (init_only) { if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) { if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; } return false; } if(!vakata_dnd.scroll_i) { vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100); return false; } if(init_only === true) { return false; } var i = vakata_dnd.scroll_e.scrollTop(), j = vakata_dnd.scroll_e.scrollLeft(); vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed); vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed); if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) { /** * triggered on the document when a drag causes an element to scroll * @event * @plugin dnd * @name dnd_scroll.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {jQuery} event the element that is scrolling */ $.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e); } }, start : function (e, data, html) { if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { e.pageX = e.originalEvent.changedTouches[0].pageX; e.pageY = e.originalEvent.changedTouches[0].pageY; e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); } if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); } try { e.currentTarget.unselectable = "on"; e.currentTarget.onselectstart = function() { return false; }; if(e.currentTarget.style) { e.currentTarget.style.touchAction = "none"; e.currentTarget.style.msTouchAction = "none"; e.currentTarget.style.MozUserSelect = "none"; } } catch(ignore) { } vakata_dnd.init_x = e.pageX; vakata_dnd.init_y = e.pageY; vakata_dnd.data = data; vakata_dnd.is_down = true; vakata_dnd.element = e.currentTarget; vakata_dnd.target = e.target; vakata_dnd.is_touch = e.type === "touchstart"; if(html !== false) { vakata_dnd.helper = $("
      ").html(html).css({ "display" : "block", "margin" : "0", "padding" : "0", "position" : "absolute", "top" : "-2000px", "lineHeight" : "16px", "zIndex" : "10000" }); } $(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag); $(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop); return false; }, drag : function (e) { if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { e.pageX = e.originalEvent.changedTouches[0].pageX; e.pageY = e.originalEvent.changedTouches[0].pageY; e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); } if(!vakata_dnd.is_down) { return; } if(!vakata_dnd.is_drag) { if( Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) || Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ) { if(vakata_dnd.helper) { vakata_dnd.helper.appendTo(document.body); vakata_dnd.helper_w = vakata_dnd.helper.outerWidth(); } vakata_dnd.is_drag = true; $(vakata_dnd.target).one('click.vakata', false); /** * triggered on the document when a drag starts * @event * @plugin dnd * @name dnd_start.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {Object} event the event that caused the start (probably mousemove) */ $.vakata.dnd._trigger("start", e); } else { return; } } var d = false, w = false, dh = false, wh = false, dw = false, ww = false, dt = false, dl = false, ht = false, hl = false; vakata_dnd.scroll_t = 0; vakata_dnd.scroll_l = 0; vakata_dnd.scroll_e = false; $($(e.target).parentsUntil("body").addBack().get().reverse()) .filter(function () { return this.ownerDocument && (/^auto|scroll$/).test($(this).css("overflow")) && (this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth); }) .each(function () { var t = $(this), o = t.offset(); if(this.scrollHeight > this.offsetHeight) { if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; } if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; } } if(this.scrollWidth > this.offsetWidth) { if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; } if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; } } if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) { vakata_dnd.scroll_e = $(this); return false; } }); if(!vakata_dnd.scroll_e) { d = $(document); w = $(window); dh = d.height(); wh = w.height(); dw = d.width(); ww = w.width(); dt = d.scrollTop(); dl = d.scrollLeft(); if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; } if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; } if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; } if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; } if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) { vakata_dnd.scroll_e = d; } } if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); } if(vakata_dnd.helper) { ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10); hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10); if(dh && ht + 25 > dh) { ht = dh - 50; } if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); } vakata_dnd.helper.css({ left : hl + "px", top : ht + "px" }); } /** * triggered on the document when a drag is in progress * @event * @plugin dnd * @name dnd_move.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {Object} event the event that caused this to trigger (most likely mousemove) */ $.vakata.dnd._trigger("move", e); return false; }, stop : function (e) { if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { e.pageX = e.originalEvent.changedTouches[0].pageX; e.pageY = e.originalEvent.changedTouches[0].pageY; e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); } if(vakata_dnd.is_drag) { /** * triggered on the document when a drag stops (the dragged element is dropped) * @event * @plugin dnd * @name dnd_stop.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {Object} event the event that caused the stop */ if (e.target !== vakata_dnd.target) { $(vakata_dnd.target).off('click.vakata'); } $.vakata.dnd._trigger("stop", e); } else { if(e.type === "touchend" && e.target === vakata_dnd.target) { var to = setTimeout(function () { $(e.target).trigger('click'); }, 100); $(e.target).one('click', function() { if(to) { clearTimeout(to); } }); } } $.vakata.dnd._clean(); return false; } }; }($)); // include the dnd plugin by default // $.jstree.defaults.plugins.push("dnd"); /** * ### Massload plugin * * Adds massload functionality to jsTree, so that multiple nodes can be loaded in a single request (only useful with lazy loading). */ /** * massload configuration * * It is possible to set this to a standard jQuery-like AJAX config. * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node IDs need to be loaded, the return value of those functions will be used. * * You can also set this to a function, that function will receive the node IDs being loaded as argument and a second param which is a function (callback) which should be called with the result. * * Both the AJAX and the function approach rely on the same return value - an object where the keys are the node IDs, and the value is the children of that node as an array. * * { * "id1" : [{ "text" : "Child of ID1", "id" : "c1" }, { "text" : "Another child of ID1", "id" : "c2" }], * "id2" : [{ "text" : "Child of ID2", "id" : "c3" }] * } * * @name $.jstree.defaults.massload * @plugin massload */ $.jstree.defaults.massload = null; $.jstree.plugins.massload = function (options, parent) { this.init = function (el, options) { this._data.massload = {}; parent.init.call(this, el, options); }; this._load_nodes = function (nodes, callback, is_callback, force_reload) { var s = this.settings.massload, toLoad = [], m = this._model.data, i, j, dom; if (!is_callback) { for(i = 0, j = nodes.length; i < j; i++) { if(!m[nodes[i]] || ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || force_reload) ) { toLoad.push(nodes[i]); dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.addClass("jstree-loading").attr('aria-busy',true); } } } this._data.massload = {}; if (toLoad.length) { if($.vakata.is_function(s)) { return s.call(this, toLoad, function (data) { var i, j; if(data) { for(i in data) { if(data.hasOwnProperty(i)) { this._data.massload[i] = data[i]; } } } for(i = 0, j = nodes.length; i < j; i++) { dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy',false); } } parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }.bind(this)); } if(typeof s === 'object' && s && s.url) { s = $.extend(true, {}, s); if($.vakata.is_function(s.url)) { s.url = s.url.call(this, toLoad); } if($.vakata.is_function(s.data)) { s.data = s.data.call(this, toLoad); } return $.ajax(s) .done(function (data,t,x) { var i, j; if(data) { for(i in data) { if(data.hasOwnProperty(i)) { this._data.massload[i] = data[i]; } } } for(i = 0, j = nodes.length; i < j; i++) { dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy',false); } } parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }.bind(this)) .fail(function (f) { parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }.bind(this)); } } } return parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }; this._load_node = function (obj, callback) { var data = this._data.massload[obj.id], rslt = null, dom; if(data) { rslt = this[typeof data === 'string' ? '_append_html_data' : '_append_json_data']( obj, typeof data === 'string' ? $($.parseHTML(data)).filter(function () { return this.nodeType !== 3; }) : data, function (status) { callback.call(this, status); } ); dom = this.get_node(obj.id, true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy',false); } delete this._data.massload[obj.id]; return rslt; } return parent._load_node.call(this, obj, callback); }; }; /** * ### Search plugin * * Adds search functionality to jsTree. */ /** * stores all defaults for the search plugin * @name $.jstree.defaults.search * @plugin search */ $.jstree.defaults.search = { /** * a jQuery-like AJAX config, which jstree uses if a server should be queried for results. * * A `str` (which is the search string) parameter will be added with the request, an optional `inside` parameter will be added if the search is limited to a node id. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed. * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 3 parameters - the search string, the callback to call with the array of nodes to load, and the optional node ID to limit the search to * @name $.jstree.defaults.search.ajax * @plugin search */ ajax : false, /** * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`. * @name $.jstree.defaults.search.fuzzy * @plugin search */ fuzzy : false, /** * Indicates if the search should be case sensitive. Default is `false`. * @name $.jstree.defaults.search.case_sensitive * @plugin search */ case_sensitive : false, /** * Indicates if the tree should be filtered (by default) to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers). * This setting can be changed at runtime when calling the search method. Default is `false`. * @name $.jstree.defaults.search.show_only_matches * @plugin search */ show_only_matches : false, /** * Indicates if the children of matched element are shown (when show_only_matches is true) * This setting can be changed at runtime when calling the search method. Default is `false`. * @name $.jstree.defaults.search.show_only_matches_children * @plugin search */ show_only_matches_children : false, /** * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`. * @name $.jstree.defaults.search.close_opened_onclear * @plugin search */ close_opened_onclear : true, /** * Indicates if only leaf nodes should be included in search results. Default is `false`. * @name $.jstree.defaults.search.search_leaves_only * @plugin search */ search_leaves_only : false, /** * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution). * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`. * @name $.jstree.defaults.search.search_callback * @plugin search */ search_callback : false }; $.jstree.plugins.search = function (options, parent) { this.bind = function () { parent.bind.call(this); this._data.search.str = ""; this._data.search.dom = $(); this._data.search.res = []; this._data.search.opn = []; this._data.search.som = false; this._data.search.smc = false; this._data.search.hdn = []; this.element .on("search.jstree", function (e, data) { if(this._data.search.som && data.res.length) { var m = this._model.data, i, j, p = [], k, l; for(i = 0, j = data.res.length; i < j; i++) { if(m[data.res[i]] && !m[data.res[i]].state.hidden) { p.push(data.res[i]); p = p.concat(m[data.res[i]].parents); if(this._data.search.smc) { for (k = 0, l = m[data.res[i]].children_d.length; k < l; k++) { if (m[m[data.res[i]].children_d[k]] && !m[m[data.res[i]].children_d[k]].state.hidden) { p.push(m[data.res[i]].children_d[k]); } } } } } p = $.vakata.array_remove_item($.vakata.array_unique(p), $.jstree.root); this._data.search.hdn = this.hide_all(true); this.show_node(p, true); this.redraw(true); } }.bind(this)) .on("clear_search.jstree", function (e, data) { if(this._data.search.som && data.res.length) { this.show_node(this._data.search.hdn, true); this.redraw(true); } }.bind(this)); }; /** * used to search the tree nodes for a given string * @name search(str [, skip_async]) * @param {String} str the search string * @param {Boolean} skip_async if set to true server will not be queried even if configured * @param {Boolean} show_only_matches if set to true only matching nodes will be shown (keep in mind this can be very slow on large trees or old browsers) * @param {mixed} inside an optional node to whose children to limit the search * @param {Boolean} append if set to true the results of this search are appended to the previous search * @plugin search * @trigger search.jstree */ this.search = function (str, skip_async, show_only_matches, inside, append, show_only_matches_children) { if(str === false || $.vakata.trim(str.toString()) === "") { return this.clear_search(); } inside = this.get_node(inside); inside = inside && (inside.id || inside.id === 0) ? inside.id : null; str = str.toString(); var s = this.settings.search, a = s.ajax ? s.ajax : false, m = this._model.data, f = null, r = [], p = [], i, j; if(this._data.search.res.length && !append) { this.clear_search(); } if(show_only_matches === undefined) { show_only_matches = s.show_only_matches; } if(show_only_matches_children === undefined) { show_only_matches_children = s.show_only_matches_children; } if(!skip_async && a !== false) { if($.vakata.is_function(a)) { return a.call(this, str, function (d) { if(d && d.d) { d = d.d; } this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () { this.search(str, true, show_only_matches, inside, append, show_only_matches_children); }); }.bind(this), inside); } else { a = $.extend({}, a); if(!a.data) { a.data = {}; } a.data.str = str; if(inside) { a.data.inside = inside; } if (this._data.search.lastRequest) { this._data.search.lastRequest.abort(); } this._data.search.lastRequest = $.ajax(a) .fail(function () { this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'search', 'id' : 'search_01', 'reason' : 'Could not load search parents', 'data' : JSON.stringify(a) }; this.settings.core.error.call(this, this._data.core.last_error); }.bind(this)) .done(function (d) { if(d && d.d) { d = d.d; } this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () { this.search(str, true, show_only_matches, inside, append, show_only_matches_children); }); }.bind(this)); return this._data.search.lastRequest; } } if(!append) { this._data.search.str = str; this._data.search.dom = $(); this._data.search.res = []; this._data.search.opn = []; this._data.search.som = show_only_matches; this._data.search.smc = show_only_matches_children; } f = new $.vakata.search(str, true, { caseSensitive : s.case_sensitive, fuzzy : s.fuzzy }); $.each(m[inside ? inside : $.jstree.root].children_d, function (ii, i) { var v = m[i]; if(v.text && !v.state.hidden && (!s.search_leaves_only || (v.state.loaded && v.children.length === 0)) && ( (s.search_callback && s.search_callback.call(this, str, v)) || (!s.search_callback && f.search(v.text).isMatch) ) ) { r.push(i); p = p.concat(v.parents); } }); if(r.length) { p = $.vakata.array_unique(p); for(i = 0, j = p.length; i < j; i++) { if(p[i] !== $.jstree.root && m[p[i]] && this.open_node(p[i], null, 0) === true) { this._data.search.opn.push(p[i]); } } if(!append) { this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #'))); this._data.search.res = r; } else { this._data.search.dom = this._data.search.dom.add($(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')))); this._data.search.res = $.vakata.array_unique(this._data.search.res.concat(r)); } this._data.search.dom.children(".jstree-anchor").addClass('jstree-search'); } /** * triggered after search is complete * @event * @name search.jstree * @param {jQuery} nodes a jQuery collection of matching nodes * @param {String} str the search string * @param {Array} res a collection of objects represeing the matching nodes * @plugin search */ this.trigger('search', { nodes : this._data.search.dom, str : str, res : this._data.search.res, show_only_matches : show_only_matches }); }; /** * used to clear the last search (removes classes and shows all nodes if filtering is on) * @name clear_search() * @plugin search * @trigger clear_search.jstree */ this.clear_search = function () { if(this.settings.search.close_opened_onclear) { this.close_node(this._data.search.opn, 0); } /** * triggered after search is complete * @event * @name clear_search.jstree * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search) * @param {String} str the search string (the last search string) * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search) * @plugin search */ this.trigger('clear_search', { 'nodes' : this._data.search.dom, str : this._data.search.str, res : this._data.search.res }); if(this._data.search.res.length) { this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(this._data.search.res, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #'))); this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search"); } this._data.search.str = ""; this._data.search.res = []; this._data.search.opn = []; this._data.search.dom = $(); }; this.redraw_node = function(obj, deep, callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if(obj) { if($.inArray(obj.id, this._data.search.res) !== -1) { var i, j, tmp = null; for(i = 0, j = obj.childNodes.length; i < j; i++) { if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { tmp = obj.childNodes[i]; break; } } if(tmp) { tmp.className += ' jstree-search'; } } } return obj; }; }; // helpers (function ($) { // from http://kiro.me/projects/fuse.html $.vakata.search = function(pattern, txt, options) { options = options || {}; options = $.extend({}, $.vakata.search.defaults, options); if(options.fuzzy !== false) { options.fuzzy = true; } pattern = options.caseSensitive ? pattern : pattern.toLowerCase(); var MATCH_LOCATION = options.location, MATCH_DISTANCE = options.distance, MATCH_THRESHOLD = options.threshold, patternLen = pattern.length, matchmask, pattern_alphabet, match_bitapScore, search; if(patternLen > 32) { options.fuzzy = false; } if(options.fuzzy) { matchmask = 1 << (patternLen - 1); pattern_alphabet = (function () { var mask = {}, i = 0; for (i = 0; i < patternLen; i++) { mask[pattern.charAt(i)] = 0; } for (i = 0; i < patternLen; i++) { mask[pattern.charAt(i)] |= 1 << (patternLen - i - 1); } return mask; }()); match_bitapScore = function (e, x) { var accuracy = e / patternLen, proximity = Math.abs(MATCH_LOCATION - x); if(!MATCH_DISTANCE) { return proximity ? 1.0 : accuracy; } return accuracy + (proximity / MATCH_DISTANCE); }; } search = function (text) { text = options.caseSensitive ? text.toString() : text.toString().toLowerCase(); if(pattern === text || text.indexOf(pattern) !== -1) { return { isMatch: true, score: 0 }; } if(!options.fuzzy) { return { isMatch: false, score: 1 }; } var i, j, textLen = text.length, scoreThreshold = MATCH_THRESHOLD, bestLoc = text.indexOf(pattern, MATCH_LOCATION), binMin, binMid, binMax = patternLen + textLen, lastRd, start, finish, rd, charMatch, score = 1, locations = []; if (bestLoc !== -1) { scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold); bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen); if (bestLoc !== -1) { scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold); } } bestLoc = -1; for (i = 0; i < patternLen; i++) { binMin = 0; binMid = binMax; while (binMin < binMid) { if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) { binMin = binMid; } else { binMax = binMid; } binMid = Math.floor((binMax - binMin) / 2 + binMin); } binMax = binMid; start = Math.max(1, MATCH_LOCATION - binMid + 1); finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen; rd = new Array(finish + 2); rd[finish + 1] = (1 << i) - 1; for (j = finish; j >= start; j--) { charMatch = pattern_alphabet[text.charAt(j - 1)]; if (i === 0) { rd[j] = ((rd[j + 1] << 1) | 1) & charMatch; } else { rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((lastRd[j + 1] | lastRd[j]) << 1) | 1) | lastRd[j + 1]; } if (rd[j] & matchmask) { score = match_bitapScore(i, j - 1); if (score <= scoreThreshold) { scoreThreshold = score; bestLoc = j - 1; locations.push(bestLoc); if (bestLoc > MATCH_LOCATION) { start = Math.max(1, 2 * MATCH_LOCATION - bestLoc); } else { break; } } } } if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) { break; } lastRd = rd; } return { isMatch: bestLoc >= 0, score: score }; }; return txt === true ? { 'search' : search } : search(txt); }; $.vakata.search.defaults = { location : 0, distance : 100, threshold : 0.6, fuzzy : false, caseSensitive : false }; }($)); // include the search plugin by default // $.jstree.defaults.plugins.push("search"); /** * ### Sort plugin * * Automatically sorts all siblings in the tree according to a sorting function. */ /** * the settings function used to sort the nodes. * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`. * @name $.jstree.defaults.sort * @plugin sort */ $.jstree.defaults.sort = function (a, b) { //return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b); return this.get_text(a) > this.get_text(b) ? 1 : -1; }; $.jstree.plugins.sort = function (options, parent) { this.bind = function () { parent.bind.call(this); this.element .on("model.jstree", function (e, data) { this.sort(data.parent, true); }.bind(this)) .on("rename_node.jstree create_node.jstree", function (e, data) { this.sort(data.parent || data.node.parent, false); this.redraw_node(data.parent || data.node.parent, true); }.bind(this)) .on("move_node.jstree copy_node.jstree", function (e, data) { this.sort(data.parent, false); this.redraw_node(data.parent, true); }.bind(this)); }; /** * used to sort a node's children * @private * @name sort(obj [, deep]) * @param {mixed} obj the node * @param {Boolean} deep if set to `true` nodes are sorted recursively. * @plugin sort * @trigger search.jstree */ this.sort = function (obj, deep) { var i, j; obj = this.get_node(obj); if(obj && obj.children && obj.children.length) { obj.children.sort(this.settings.sort.bind(this)); if(deep) { for(i = 0, j = obj.children_d.length; i < j; i++) { this.sort(obj.children_d[i], false); } } } }; }; // include the sort plugin by default // $.jstree.defaults.plugins.push("sort"); /** * ### State plugin * * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc) */ var to = false; /** * stores all defaults for the state plugin * @name $.jstree.defaults.state * @plugin state */ $.jstree.defaults.state = { /** * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`. * @name $.jstree.defaults.state.key * @plugin state */ key : 'jstree', /** * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`. * @name $.jstree.defaults.state.events * @plugin state */ events : 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree', /** * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire. * @name $.jstree.defaults.state.ttl * @plugin state */ ttl : false, /** * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state. * @name $.jstree.defaults.state.filter * @plugin state */ filter : false, /** * Should loaded nodes be restored (setting this to true means that it is possible that the whole tree will be loaded for some users - use with caution). Defaults to `false` * @name $.jstree.defaults.state.preserve_loaded * @plugin state */ preserve_loaded : false }; $.jstree.plugins.state = function (options, parent) { this.bind = function () { parent.bind.call(this); var bind = function () { this.element.on(this.settings.state.events, function () { if(to) { clearTimeout(to); } to = setTimeout(function () { this.save_state(); }.bind(this), 100); }.bind(this)); /** * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore). * @event * @name state_ready.jstree * @plugin state */ this.trigger('state_ready'); }.bind(this); this.element .on("ready.jstree", function (e, data) { this.element.one("restore_state.jstree", bind); if(!this.restore_state()) { bind(); } }.bind(this)); }; /** * save the state * @name save_state() * @plugin state */ this.save_state = function () { var tm = this.get_state(); if (!this.settings.state.preserve_loaded) { delete tm.core.loaded; } var st = { 'state' : tm, 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) }; $.vakata.storage.set(this.settings.state.key, JSON.stringify(st)); }; /** * restore the state from the user's computer * @name restore_state() * @plugin state */ this.restore_state = function () { var k = $.vakata.storage.get(this.settings.state.key); if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } } if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; } if(!!k && k.state) { k = k.state; } if(!!k && $.vakata.is_function(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); } if(!!k) { if (!this.settings.state.preserve_loaded) { delete k.core.loaded; } this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); }); this.set_state(k); return true; } return false; }; /** * clear the state on the user's computer * @name clear_state() * @plugin state */ this.clear_state = function () { return $.vakata.storage.del(this.settings.state.key); }; }; (function ($, undefined) { $.vakata.storage = { // simply specifying the functions in FF throws an error set : function (key, val) { return window.localStorage.setItem(key, val); }, get : function (key) { return window.localStorage.getItem(key); }, del : function (key) { return window.localStorage.removeItem(key); } }; }($)); // include the state plugin by default // $.jstree.defaults.plugins.push("state"); /** * ### Types plugin * * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group. */ /** * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional). * * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited. * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited. * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits. * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme. * * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data) * * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data) * * There are two predefined types: * * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes. * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified. * * @name $.jstree.defaults.types * @plugin types */ $.jstree.defaults.types = { 'default' : {} }; $.jstree.defaults.types[$.jstree.root] = {}; $.jstree.plugins.types = function (options, parent) { this.init = function (el, options) { var i, j; if(options && options.types && options.types['default']) { for(i in options.types) { if(i !== "default" && i !== $.jstree.root && options.types.hasOwnProperty(i)) { for(j in options.types['default']) { if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) { options.types[i][j] = options.types['default'][j]; } } } } } parent.init.call(this, el, options); this._model.data[$.jstree.root].type = $.jstree.root; }; this.refresh = function (skip_loading, forget_state) { parent.refresh.call(this, skip_loading, forget_state); this._model.data[$.jstree.root].type = $.jstree.root; }; this.bind = function () { this.element .on('model.jstree', function (e, data) { var m = this._model.data, dpc = data.nodes, t = this.settings.types, i, j, c = 'default', k; for(i = 0, j = dpc.length; i < j; i++) { c = 'default'; if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) { c = m[dpc[i]].original.type; } if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) { c = m[dpc[i]].data.jstree.type; } m[dpc[i]].type = c; if(m[dpc[i]].icon === true && t[c].icon !== undefined) { m[dpc[i]].icon = t[c].icon; } if(t[c].li_attr !== undefined && typeof t[c].li_attr === 'object') { for (k in t[c].li_attr) { if (t[c].li_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[dpc[i]].li_attr[k] === undefined) { m[dpc[i]].li_attr[k] = t[c].li_attr[k]; } else if (k === 'class') { m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class']; } } } } if(t[c].a_attr !== undefined && typeof t[c].a_attr === 'object') { for (k in t[c].a_attr) { if (t[c].a_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[dpc[i]].a_attr[k] === undefined) { m[dpc[i]].a_attr[k] = t[c].a_attr[k]; } else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') { m[dpc[i]].a_attr['href'] = t[c].a_attr['href']; } else if (k === 'class') { m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class']; } } } } } m[$.jstree.root].type = $.jstree.root; }.bind(this)); parent.bind.call(this); }; this.get_json = function (obj, options, flat) { var i, j, m = this._model.data, opt = options ? $.extend(true, {}, options, {no_id:false}) : {}, tmp = parent.get_json.call(this, obj, opt, flat); if(tmp === false) { return false; } if($.vakata.is_array(tmp)) { for(i = 0, j = tmp.length; i < j; i++) { tmp[i].type = (tmp[i].id || tmp[i].id === 0) && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default"; if(options && options.no_id) { delete tmp[i].id; if(tmp[i].li_attr && tmp[i].li_attr.id) { delete tmp[i].li_attr.id; } if(tmp[i].a_attr && tmp[i].a_attr.id) { delete tmp[i].a_attr.id; } } } } else { tmp.type = (tmp.id || tmp.id === 0) && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default"; if(options && options.no_id) { tmp = this._delete_ids(tmp); } } return tmp; }; this._delete_ids = function (tmp) { if($.vakata.is_array(tmp)) { for(var i = 0, j = tmp.length; i < j; i++) { tmp[i] = this._delete_ids(tmp[i]); } return tmp; } delete tmp.id; if(tmp.li_attr && tmp.li_attr.id) { delete tmp.li_attr.id; } if(tmp.a_attr && tmp.a_attr.id) { delete tmp.a_attr.id; } if(tmp.children && $.vakata.is_array(tmp.children)) { tmp.children = this._delete_ids(tmp.children); } return tmp; }; this.check = function (chk, obj, par, pos, more) { if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; } obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj); par = par && (par.id || par.id === 0) ? par : this.get_node(par); var m = obj && (obj.id || obj.id === 0) ? (more && more.origin ? more.origin : $.jstree.reference(obj.id)) : null, tmp, d, i, j; m = m && m._model && m._model.data ? m._model.data : null; switch(chk) { case "create_node": case "move_node": case "copy_node": if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) { tmp = this.get_rules(par); if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; return false; } if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; return false; } if(m && obj.children_d && obj.parents) { d = 0; for(i = 0, j = obj.children_d.length; i < j; i++) { d = Math.max(d, m[obj.children_d[i]].parents.length); } d = d - obj.parents.length + 1; } if(d <= 0 || d === undefined) { d = 1; } do { if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; return false; } par = this.get_node(par.parent); tmp = this.get_rules(par); d++; } while(par); } break; } return true; }; /** * used to retrieve the type settings object for a node * @name get_rules(obj) * @param {mixed} obj the node to find the rules for * @return {Object} * @plugin types */ this.get_rules = function (obj) { obj = this.get_node(obj); if(!obj) { return false; } var tmp = this.get_type(obj, true); if(tmp.max_depth === undefined) { tmp.max_depth = -1; } if(tmp.max_children === undefined) { tmp.max_children = -1; } if(tmp.valid_children === undefined) { tmp.valid_children = -1; } return tmp; }; /** * used to retrieve the type string or settings object for a node * @name get_type(obj [, rules]) * @param {mixed} obj the node to find the rules for * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned * @return {String|Object} * @plugin types */ this.get_type = function (obj, rules) { obj = this.get_node(obj); return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type); }; /** * used to change a node's type * @name set_type(obj, type) * @param {mixed} obj the node to change * @param {String} type the new type * @plugin types */ this.set_type = function (obj, type) { var m = this._model.data, t, t1, t2, old_type, old_icon, k, d, a; if($.vakata.is_array(obj)) { obj = obj.slice(); for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.set_type(obj[t1], type); } return true; } t = this.settings.types; obj = this.get_node(obj); if(!t[type] || !obj) { return false; } d = this.get_node(obj, true); if (d && d.length) { a = d.children('.jstree-anchor'); } old_type = obj.type; old_icon = this.get_icon(obj); obj.type = type; if(old_icon === true || !t[old_type] || (t[old_type].icon !== undefined && old_icon === t[old_type].icon)) { this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true); } // remove old type props if(t[old_type] && t[old_type].li_attr !== undefined && typeof t[old_type].li_attr === 'object') { for (k in t[old_type].li_attr) { if (t[old_type].li_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (k === 'class') { m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], ''); if (d) { d.removeClass(t[old_type].li_attr[k]); } } else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) { m[obj.id].li_attr[k] = null; if (d) { d.removeAttr(k); } } } } } if(t[old_type] && t[old_type].a_attr !== undefined && typeof t[old_type].a_attr === 'object') { for (k in t[old_type].a_attr) { if (t[old_type].a_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (k === 'class') { m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], ''); if (a) { a.removeClass(t[old_type].a_attr[k]); } } else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) { if (k === 'href') { m[obj.id].a_attr[k] = '#'; if (a) { a.attr('href', '#'); } } else { delete m[obj.id].a_attr[k]; if (a) { a.removeAttr(k); } } } } } } // add new props if(t[type].li_attr !== undefined && typeof t[type].li_attr === 'object') { for (k in t[type].li_attr) { if (t[type].li_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[obj.id].li_attr[k] === undefined) { m[obj.id].li_attr[k] = t[type].li_attr[k]; if (d) { if (k === 'class') { d.addClass(t[type].li_attr[k]); } else { d.attr(k, t[type].li_attr[k]); } } } else if (k === 'class') { m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class']; if (d) { d.addClass(t[type].li_attr[k]); } } } } } if(t[type].a_attr !== undefined && typeof t[type].a_attr === 'object') { for (k in t[type].a_attr) { if (t[type].a_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[obj.id].a_attr[k] === undefined) { m[obj.id].a_attr[k] = t[type].a_attr[k]; if (a) { if (k === 'class') { a.addClass(t[type].a_attr[k]); } else { a.attr(k, t[type].a_attr[k]); } } } else if (k === 'href' && m[obj.id].a_attr[k] === '#') { m[obj.id].a_attr['href'] = t[type].a_attr['href']; if (a) { a.attr('href', t[type].a_attr['href']); } } else if (k === 'class') { m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class']; if (a) { a.addClass(t[type].a_attr[k]); } } } } } return true; }; }; // include the types plugin by default // $.jstree.defaults.plugins.push("types"); /** * ### Unique plugin * * Enforces that no nodes with the same name can coexist as siblings. */ /** * stores all defaults for the unique plugin * @name $.jstree.defaults.unique * @plugin unique */ $.jstree.defaults.unique = { /** * Indicates if the comparison should be case sensitive. Default is `false`. * @name $.jstree.defaults.unique.case_sensitive * @plugin unique */ case_sensitive : false, /** * Indicates if white space should be trimmed before the comparison. Default is `false`. * @name $.jstree.defaults.unique.trim_whitespace * @plugin unique */ trim_whitespace : false, /** * A callback executed in the instance's scope when a new node is created with no name and a node with the default name already exists, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`. * @name $.jstree.defaults.unique.duplicate * @plugin unique */ duplicate : function (name, counter) { return name + ' (' + counter + ')'; } }; $.jstree.plugins.unique = function (options, parent) { this.check = function (chk, obj, par, pos, more) { if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; } obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj); par = par && (par.id || par.id === 0) ? par : this.get_node(par); if(!par || !par.children) { return true; } var n = chk === "rename_node" ? pos : obj.text, c = [], s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, m = this._model.data, i, j, t; for(i = 0, j = par.children.length; i < j; i++) { t = m[par.children[i]].text; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } c.push(t); } if(!s) { n = n.toLowerCase(); } if (w) { n = n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } switch(chk) { case "delete_node": return true; case "rename_node": t = obj.text || ''; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } i = ($.inArray(n, c) === -1 || (obj.text && t === n)); if(!i) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_01', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; } return i; case "create_node": i = ($.inArray(n, c) === -1); if(!i) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_04', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; } return i; case "copy_node": i = ($.inArray(n, c) === -1); if(!i) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_02', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; } return i; case "move_node": i = ( (obj.parent === par.id && (!more || !more.is_multi)) || $.inArray(n, c) === -1); if(!i) { this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_03', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; } return i; } return true; }; this.create_node = function (par, node, pos, callback, is_loaded) { if(!node || (typeof node === 'object' && node.text === undefined)) { if(par === null) { par = $.jstree.root; } par = this.get_node(par); if(!par) { return parent.create_node.call(this, par, node, pos, callback, is_loaded); } pos = pos === undefined ? "last" : pos; if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return parent.create_node.call(this, par, node, pos, callback, is_loaded); } if(!node) { node = {}; } var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, cb = this.settings.unique.duplicate, t; n = tmp = this.get_string('New node'); dpc = []; for(i = 0, j = par.children.length; i < j; i++) { t = m[par.children[i]].text; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } dpc.push(t); } i = 1; t = n; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } while($.inArray(t, dpc) !== -1) { n = cb.call(this, tmp, (++i)).toString(); t = n; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } } node.text = n; } return parent.create_node.call(this, par, node, pos, callback, is_loaded); }; }; // include the unique plugin by default // $.jstree.defaults.plugins.push("unique"); /** * ### Wholerow plugin * * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers. */ var div = document.createElement('DIV'); div.setAttribute('unselectable','on'); div.setAttribute('role','presentation'); div.className = 'jstree-wholerow'; div.innerHTML = ' '; $.jstree.plugins.wholerow = function (options, parent) { this.bind = function () { parent.bind.call(this); this.element .on('ready.jstree set_state.jstree', function () { this.hide_dots(); }.bind(this)) .on("init.jstree loading.jstree ready.jstree", function () { //div.style.height = this._data.core.li_height + 'px'; this.get_container_ul().addClass('jstree-wholerow-ul'); }.bind(this)) .on("deselect_all.jstree", function (e, data) { this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked'); }.bind(this)) .on("changed.jstree", function (e, data) { this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked'); var tmp = false, i, j; for(i = 0, j = data.selected.length; i < j; i++) { tmp = this.get_node(data.selected[i], true); if(tmp && tmp.length) { tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked'); } } }.bind(this)) .on("open_node.jstree", function (e, data) { this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked'); }.bind(this)) .on("hover_node.jstree dehover_node.jstree", function (e, data) { if(e.type === "hover_node" && this.is_disabled(data.node)) { return; } this.get_node(data.node, true).children('.jstree-wholerow')[e.type === "hover_node"?"addClass":"removeClass"]('jstree-wholerow-hovered'); }.bind(this)) .on("contextmenu.jstree", ".jstree-wholerow", function (e) { if (this._data.contextmenu) { e.preventDefault(); var tmp = $.Event('contextmenu', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey, pageX : e.pageX, pageY : e.pageY }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp); } }.bind(this)) /*! .on("mousedown.jstree touchstart.jstree", ".jstree-wholerow", function (e) { if(e.target === e.currentTarget) { var a = $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor"); e.target = a[0]; a.trigger(e); } }) */ .on("click.jstree", ".jstree-wholerow", function (e) { e.stopImmediatePropagation(); var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus'); }) .on("dblclick.jstree", ".jstree-wholerow", function (e) { e.stopImmediatePropagation(); var tmp = $.Event('dblclick', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus'); }) .on("click.jstree", ".jstree-leaf > .jstree-ocl", function (e) { e.stopImmediatePropagation(); var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus'); }.bind(this)) .on("mouseover.jstree", ".jstree-wholerow, .jstree-icon", function (e) { e.stopImmediatePropagation(); if(!this.is_disabled(e.currentTarget)) { this.hover_node(e.currentTarget); } return false; }.bind(this)) .on("mouseleave.jstree", ".jstree-node", function (e) { this.dehover_node(e.currentTarget); }.bind(this)); }; this.teardown = function () { if(this.settings.wholerow) { this.element.find(".jstree-wholerow").remove(); } parent.teardown.call(this); }; this.redraw_node = function(obj, deep, callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if(obj) { var tmp = div.cloneNode(true); //tmp.style.height = this._data.core.li_height + 'px'; if($.inArray(obj.id, this._data.core.selected) !== -1) { tmp.className += ' jstree-wholerow-clicked'; } if(this._data.core.focused && this._data.core.focused === obj.id) { tmp.className += ' jstree-wholerow-hovered'; } obj.insertBefore(tmp, obj.childNodes[0]); } return obj; }; }; // include the wholerow plugin by default // $.jstree.defaults.plugins.push("wholerow"); if(window.customElements && Object && Object.create) { var proto = Object.create(HTMLElement.prototype); proto.createdCallback = function () { var c = { core : {}, plugins : [] }, i; for(i in $.jstree.plugins) { if($.jstree.plugins.hasOwnProperty(i) && this.attributes[i]) { c.plugins.push(i); if(this.getAttribute(i) && JSON.parse(this.getAttribute(i))) { c[i] = JSON.parse(this.getAttribute(i)); } } } for(i in $.jstree.defaults.core) { if($.jstree.defaults.core.hasOwnProperty(i) && this.attributes[i]) { c.core[i] = JSON.parse(this.getAttribute(i)) || this.getAttribute(i); } } $(this).jstree(c); }; // proto.attributeChangedCallback = function (name, previous, value) { }; try { window.customElements.define("vakata-jstree", function() {}, { prototype: proto }); } catch (ignore) { } } }));PKxL\ N_>>7updraftplus/includes/labelauty/images/input-checked.pngnu[PNG  IHDR(-SfPLTE-!tRNS  fIDATx^7@ DQrrΞ_J* .eel@7S`C4z,`%_Mvb=<{fA>Y?=NIENDB`PKxL\[t9updraftplus/includes/labelauty/images/input-unchecked.pngnu[PNG  IHDRRPLTE}VAtRNSwRp&IDATx^c 0 , `[GG2(+&IENDB`PKxL\E =updraftplus/includes/labelauty/jquery-labelauty-2-23-7.min.jsnu[!function(h){function p(e){var a=e,e=(a=e.clone().attr("style","position: absolute !important; top: -1000 !important; ").appendTo("body")).width(!0);return a.remove(),e}function b(e,a){e&&window.console&&window.console.log&&window.console.log("jQuery-LABELAUTY: "+a)}h.fn.labelauty=function(e){var u=h.extend({development:!1,class:"labelauty",label:!0,separator:"|",checked_label:"Checked",unchecked_label:"Unchecked",force_random_id:!1,minimum_width:!1,same_width:!0},e);return this.each(function(){var e,a=jQuery.migrateDeduplicateWarnings||!1,l=(u.development&&(jQuery.migrateDeduplicateWarnings=!1),h(this)),t=l.is(":checked"),n=l.attr("type"),c=!0,i=l.attr("aria-label");if(l.attr("aria-hidden",!0),!1===l.is(":checkbox")&&!1===l.is(":radio"))return this;if(l.addClass(u.class),d=l.attr("data-labelauty"),!0===(c=u.label)&&(null==d||0===d.length?((e=new Array)[0]=u.unchecked_label,e[1]=u.checked_label):2<(e=d.split(u.separator)).length?(c=!1,b(u.development,"There's more than two labels. LABELAUTY will not use labels.")):1===e.length&&b(u.development,"There's just one label. LABELAUTY will use this one for both cases.")),l.css({display:"none"}),l.removeAttr("data-labelauty"),s=l.attr("id"),u.force_random_id||null==s||""===s.trim()){for(var r=1+Math.floor(1024e3*Math.random()),s="labelauty-"+r;0!==h(s).length;)s="labelauty-"+ ++r,b(u.development,"Holy crap, between 1024 thousand numbers, one raised a conflict. Trying again.");l.attr("id",s)}var d,o=jQuery(function(e,a,l,t,n,c){var i,r,s="";null==n?i=r="":(i=n[0],r=null==n[1]?i:n[1]);s=null==a?"":'tabindex="0" role="'+t+'" aria-checked="'+l+'" aria-label="'+a+'"';n=1==c?'":'';return n}(s,i,t,n,e,c));o.on("click",function(){l.is(":checked")?h(o).attr("aria-checked",!1):h(o).attr("aria-checked",!0)}),o.on("keypress",function(e){e.preventDefault(),32!==e.keyCode&&13!==e.keyCode||(l.is(":checked")?(l.prop("checked",!1),h(o).attr("aria-checked",!1)):(l.prop("checked",!0),h(o).attr("aria-checked",!0)))}),l.after(o),!1!==u.minimum_width&&l.next("label[for="+s+"]").css({"min-width":u.minimum_width}),0!=u.same_width&&1==u.label&&(i=p((d=l.next("label[for="+s+"]")).find("span.labelauty-unchecked")),(t=p(d.find("span.labelauty-checked"))) 2 ) { use_labels = false; debug( settings.development, "There's more than two labels. LABELAUTY will not use labels." ); } else { // If there's just one label (no split by "settings.separator"), it will be used for both cases // Here, we have the possibility of use the same label for both cases if( labels_object.length === 1 ) debug( settings.development, "There's just one label. LABELAUTY will use this one for both cases." ); } } } /* * Let's begin the beauty */ // Start hiding ugly checkboxes // Obviously, we don't need native checkboxes :O $object.css({ display : "none" }); // We don't need more data-labelauty attributes! // Ok, ok, it's just for beauty improvement $object.removeAttr( "data-labelauty" ); // Now, grab checkbox ID Attribute for "label" tag use // If there's no ID Attribute, then generate a new one input_id = $object.attr( "id" ); if( settings.force_random_id || input_id == null || input_id.trim() === "") { var input_id_number = 1 + Math.floor( Math.random() * 1024000 ); input_id = "labelauty-" + input_id_number; // Is there any element with this random ID ? // If exists, then increment until get an unused ID while( $( input_id ).length !== 0 ) { input_id_number++; input_id = "labelauty-" + input_id_number; debug( settings.development, "Holy crap, between 1024 thousand numbers, one raised a conflict. Trying again." ); } $object.attr( "id", input_id ); } // Now, add necessary tags to make this work // Here, we're going to test some control variables and act properly var element = jQuery(create( input_id, aria_label, selected, type, labels_object, use_labels )) element.on('click', function(){ if($object.is(':checked')){ $(element).attr('aria-checked', false); }else{ $(element).attr('aria-checked', true); } }); element.on('keypress', function(event){ event.preventDefault(); if(event.keyCode === 32 || event.keyCode === 13){ if($object.is(':checked')){ $object.prop('checked', false); $(element).attr('aria-checked',false); }else{ $object.prop('checked', true); $(element).attr('aria-checked', true); } } }) $object.after(element); // Now, add "min-width" to label // Let's say the truth, a fixed width is more beautiful than a variable width if( settings.minimum_width !== false ) $object.next( "label[for=" + input_id + "]" ).css({ "min-width": settings.minimum_width }); // Now, add "min-width" to label // Let's say the truth, a fixed width is more beautiful than a variable width if( settings.same_width != false && settings.label == true ) { var label_object = $object.next( "label[for=" + input_id + "]" ); var unchecked_width = getRealWidth(label_object.find( "span.labelauty-unchecked" )); var checked_width = getRealWidth(label_object.find( "span.labelauty-checked" )); if( unchecked_width > checked_width ) label_object.find( "span.labelauty-checked" ).width( unchecked_width ); else label_object.find( "span.labelauty-unchecked" ).width( checked_width ); } if (settings.development) jQuery.migrateDeduplicateWarnings = migrateDeduplicateWarnings; }); }; /* * Tricky code to work with hidden elements, like tabs. * Note: This code is based on jquery.actual plugin. * https://github.com/dreamerslab/jquery.actual */ function getRealWidth( element ) { var width = 0; var $target = element; var style = 'position: absolute !important; top: -1000 !important; '; $target = $target.clone().attr('style', style).appendTo('body'); width = $target.width(true); $target.remove(); return width; } function debug( debug, message ) { if( debug && window.console && window.console.log ) window.console.log( "jQuery-LABELAUTY: " + message ); }; function create( input_id, aria_label, selected, type, messages_object, label ) { var block; var unchecked_message; var checked_message; var aria = ""; if( messages_object == null ) unchecked_message = checked_message = ""; else { unchecked_message = messages_object[0]; // If checked message is null, then put the same text of unchecked message if( messages_object[1] == null ) checked_message = unchecked_message; else checked_message = messages_object[1]; } if(aria_label == null) aria = ""; else aria = 'tabindex="0" role="' + type + '" aria-checked="' + selected + '" aria-label="' + aria_label + '"'; if( label == true ) { block = ''; } else { block = ''; } return block; }; }( jQuery ));PKxL\^II>updraftplus/includes/labelauty/jquery-labelauty-2-23-7.min.cssnu[/* * LABELAUTY jQuery Plugin Styles * * @file: jquery-labelauty.css * @author: Francisco Neves (@fntneves) * @site: www.francisconeves.com * @license: MIT License */input.labelauty+label ::-moz-selection{background-color:rgba(255,255,255,0)}input.labelauty+label ::selection{background-color:rgba(255,255,255,0)}input.labelauty+label ::-moz-selection{background-color:rgba(255,255,255,0)}input.labelauty{display:none !important}input.labelauty+label{display:inline-block;font-size:13px;padding:10px;background-color:#efefef;color:black;cursor:pointer;margin-top:10px;margin-right:10px;width:96%;border-radius:3px 3px 3px 3px;-moz-border-radius:3px 3px 3px 3px;-webkit-border-radius:3px 3px 3px 3px;transition:background-color .25s;-moz-transition:background-color .25s;-webkit-transition:background-color .25s;-o-transition:background-color .25s;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}input.labelauty+label>span.labelauty-unchecked,input.labelauty+label>span.labelauty-checked{display:inline-block;line-height:1.1;vertical-align:middle}input.labelauty+label>span.labelauty-unchecked-image,input.labelauty+label>span.labelauty-checked-image{display:inline-block;width:30px;height:30px;vertical-align:middle;background-repeat:no-repeat;background-position:left center;background-size:contain;transition:background-image .5s linear;-moz-transition:background-image .5s linear;-webkit-transition:background-image .5s linear;-o-transition:background-image .5s linear}input.labelauty+label>span.labelauty-unchecked-image+span.labelauty-unchecked,input.labelauty+label>span.labelauty-checked-image+span.labelauty-checked{margin-left:7px}input.labelauty:not(:checked):not([disabled])+label:hover{background-color:#eaeaea;color:#a7a7a7}input.labelauty:not(:checked)+label>span.labelauty-checked-image{display:none}input.labelauty:not(:checked)+label>span.labelauty-checked{display:none}input.labelauty:checked+label{background-color:#3498db;color:#fff}input.labelauty:checked:not([disabled])+label:hover{background-color:#72c5fd}input.labelauty:checked+label>span.labelauty-unchecked-image{display:none}input.labelauty:checked+label>span.labelauty-unchecked{display:none}input.labelauty:checked+label>span.labelauty-checked{display:inline-block}input.labelauty.no-label:checked+label>span.labelauty-checked{display:block}input.labelauty[disabled]+label{opacity:.5}input.labelauty+label>span.labelauty-unchecked-image{background-image:url(images/icons/folder.png)}input.labelauty+label>span.labelauty-checked-image{background-image:url(images/icons/folder.png)}input.labelauty.email+label>span.labelauty-checked-image,input.labelauty.email+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/email.png)}input.labelauty.cloudfiles+label>span.labelauty-checked-image,input.labelauty.cloudfiles+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/cloudfiles.png)}input.labelauty.dreamobjects+label>span.labelauty-checked-image,input.labelauty.dreamobjects+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/dreamobjects.png)}input.labelauty.dropbox+label>span.labelauty-checked-image,input.labelauty.dropbox+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/dropbox.png)}input.labelauty.pcloud+label>span.labelauty-checked-image,input.labelauty.pcloud+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/pcloud.png)}input.labelauty.ftp+label>span.labelauty-checked-image,input.labelauty.ftp+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/folder.png)}input.labelauty.sftp+label>span.labelauty-checked-image,input.labelauty.sftp+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/folder.png)}input.labelauty.googledrive+label>span.labelauty-checked-image,input.labelauty.googledrive+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/googledrive.png)}input.labelauty.s3generic+label>span.labelauty-checked-image,input.labelauty.s3generic+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/folder.png)}input.labelauty.onedrive+label>span.labelauty-checked-image,input.labelauty.onedrive+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/onedrive.png)}input.labelauty.azure+label>span.labelauty-checked-image,input.labelauty.azure+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/azure.png)}input.labelauty.backblaze+label>span.labelauty-checked-image,input.labelauty.backblaze+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/backblaze.png)}input.labelauty.openstack+label>span.labelauty-checked-image,input.labelauty.openstack+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/openstack.png)}input.labelauty.s3+label>span.labelauty-checked-image,input.labelauty.s3+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/s3.png)}input.labelauty.updraftvault+label>span.labelauty-checked-image,input.labelauty.updraftvault+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/updraftvault.png)}input.labelauty.webdav+label>span.labelauty-checked-image,input.labelauty.webdav+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/webdav.png)}input.labelauty.googlecloud+label>span.labelauty-checked-image,input.labelauty.googlecloud+label>span.labelauty-unchecked-image{background-image:url(../../images/icons/googlecloud.png)}#remote-storage-container{height:auto;width:auto;-moz-column-count:2;-webkit-column-count:2;column-count:2}@media only screen and (min-width:480px){#remote-storage-container{height:auto;width:auto}}@media only screen and (min-width:1000px){#remote-storage-container{-moz-column-count:3;-webkit-column-count:3;column-count:3;height:auto;width:auto}}@media only screen and (max-width:480px){input.labelauty+label{text-align:center}input.labelauty+label>span.labelauty-unchecked-image,input.labelauty+label>span.labelauty-checked-image{display:block;margin:0 auto;margin-bottom:4px}} /*# sourceMappingURL=jquery-labelauty-2-23-7.min.css.map */ PKxL\^dg-3updraftplus/includes/labelauty/jquery-labelauty.cssnu[/*! * LABELAUTY jQuery Plugin Styles * * @file: jquery-labelauty.css * @author: Francisco Neves (@fntneves) * @site: www.francisconeves.com * @license: MIT License */ /* Prevent text and blocks selection */ input.labelauty + label ::-moz-selection { background-color: rgba(255, 255, 255, 0); } input.labelauty + label ::selection { background-color: rgba(255, 255, 255, 0); } input.labelauty + label ::-moz-selection { background-color: rgba(255, 255, 255, 0); } /* Hide original checkboxes. They are ugly! */ input.labelauty { display: none !important; } /* * Let's style the input * Feel free to work with it as you wish! */ input.labelauty + label { display: inline-block; font-size: 13px; padding: 10px; background-color: #efefef; color: black; cursor: pointer; margin-top: 10px; margin-right: 10px; width: 96%; border-radius: 3px 3px 3px 3px; -moz-border-radius: 3px 3px 3px 3px; -webkit-border-radius: 3px 3px 3px 3px; transition: background-color 0.25s; -moz-transition: background-color 0.25s; -webkit-transition: background-color 0.25s; -o-transition: background-color 0.25s; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -o-user-select: none; } /* Stylish text inside label */ input.labelauty + label > span.labelauty-unchecked, input.labelauty + label > span.labelauty-checked { display: inline-block; line-height: 1.1; vertical-align: middle; } /* Stylish icons inside label */ input.labelauty + label > span.labelauty-unchecked-image, input.labelauty + label > span.labelauty-checked-image { display: inline-block; width: 30px; height: 30px; vertical-align: middle; background-repeat: no-repeat; background-position: left center; background-size: contain; transition: background-image 0.5s linear; -moz-transition: background-image 0.5s linear; -webkit-transition: background-image 0.5s linear; -o-transition: background-image 0.5s linear; } /* When there's a label, add a little margin to the left */ input.labelauty + label > span.labelauty-unchecked-image + span.labelauty-unchecked, input.labelauty + label > span.labelauty-checked-image + span.labelauty-checked { margin-left: 7px; } /* When not Checked */ input.labelauty:not(:checked):not([disabled]) + label:hover { background-color: #eaeaea; color: #a7a7a7; } input.labelauty:not(:checked) + label > span.labelauty-checked-image { display: none; } input.labelauty:not(:checked) + label > span.labelauty-checked { display: none; } /* When Checked */ input.labelauty:checked + label { background-color: #3498db; color: #ffffff; } input.labelauty:checked:not([disabled]) + label:hover { background-color: #72c5fd; } input.labelauty:checked + label > span.labelauty-unchecked-image { display: none; } input.labelauty:checked + label > span.labelauty-unchecked { display: none; } input.labelauty:checked + label > span.labelauty-checked { display: inline-block; } input.labelauty.no-label:checked + label > span.labelauty-checked { display: block; } /* When Disabled */ input.labelauty[disabled] + label { opacity: 0.5; } /* Add a background to (un)checked images */ input.labelauty + label > span.labelauty-unchecked-image { background-image: url( images/icons/folder.png ); } input.labelauty + label > span.labelauty-checked-image { background-image: url( images/icons/folder.png ); } input.labelauty.email + label > span.labelauty-checked-image, input.labelauty.email + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/email.png ); } input.labelauty.cloudfiles + label > span.labelauty-checked-image, input.labelauty.cloudfiles + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/cloudfiles.png ); } input.labelauty.dreamobjects + label > span.labelauty-checked-image, input.labelauty.dreamobjects + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/dreamobjects.png ); } input.labelauty.dropbox + label > span.labelauty-checked-image, input.labelauty.dropbox + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/dropbox.png ); } input.labelauty.pcloud + label > span.labelauty-checked-image, input.labelauty.pcloud + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/pcloud.png ); } input.labelauty.ftp + label > span.labelauty-checked-image, input.labelauty.ftp + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/folder.png ); } input.labelauty.sftp + label > span.labelauty-checked-image, input.labelauty.sftp + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/folder.png ); } input.labelauty.googledrive + label > span.labelauty-checked-image, input.labelauty.googledrive + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/googledrive.png ); } input.labelauty.s3generic + label > span.labelauty-checked-image, input.labelauty.s3generic + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/folder.png ); } input.labelauty.onedrive + label > span.labelauty-checked-image, input.labelauty.onedrive + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/onedrive.png ); } input.labelauty.azure + label > span.labelauty-checked-image, input.labelauty.azure + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/azure.png ); } input.labelauty.backblaze + label > span.labelauty-checked-image, input.labelauty.backblaze + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/backblaze.png ); } input.labelauty.openstack + label > span.labelauty-checked-image, input.labelauty.openstack + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/openstack.png ); } input.labelauty.s3 + label > span.labelauty-checked-image, input.labelauty.s3 + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/s3.png ); } input.labelauty.updraftvault + label > span.labelauty-checked-image, input.labelauty.updraftvault + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/updraftvault.png ); } input.labelauty.webdav + label > span.labelauty-checked-image, input.labelauty.webdav + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/webdav.png ); } input.labelauty.googlecloud + label > span.labelauty-checked-image, input.labelauty.googlecloud + label > span.labelauty-unchecked-image { background-image: url( ../../images/icons/googlecloud.png ); } #remote-storage-container { height: auto; width: auto; -moz-column-count: 2; -webkit-column-count: 2; column-count: 2; } @media only screen and (min-width: 480px) { #remote-storage-container { height: auto; width: auto; } } @media only screen and (min-width: 1000px) { #remote-storage-container { -moz-column-count: 3; -webkit-column-count: 3; column-count: 3; height: auto; width: auto; } } @media only screen and (max-width: 480px) { input.labelauty + label { text-align: center; } input.labelauty + label > span.labelauty-unchecked-image, input.labelauty + label > span.labelauty-checked-image { display: block; margin: 0 auto; margin-bottom: 4px; } }PKxL\RG%G%Bupdraftplus/includes/labelauty/jquery-labelauty-2-23-7.min.css.mapnu[{"version":3,"sources":["includes/labelauty/jquery-labelauty.css"],"names":[],"mappings":"AAAA;;;;;;;EAOE;;AAEF,sCAAsC;AACtC,2CAAsC,wCAAwC,EAAE;AAAhF,sCAAsC,wCAAwC,EAAE;AAChF,2CAA2C,wCAAwC,EAAE;;AAErF,6CAA6C;AAC7C,kBAAkB,wBAAwB,EAAE;;AAE5C;;;EAGE;AACF;;CAEC,qBAAqB;CACrB,eAAe;CACf,aAAa;CACb,yBAAyB;CACzB,YAAY;CACZ,eAAe;CACf,gBAAgB;CAChB,kBAAkB;CAClB,UAAU;;CAEV,8BAA8B;CAC9B,mCAAmC;CACnC,sCAAsC;;;CAGtC,kCAAkC;CAClC,uCAAuC;CACvC,0CAA0C;CAC1C,qCAAqC;;CAErC,sBAAsB;CACtB,wBAAwB;CACxB,yBAAyB;CACzB,oBAAoB;AACrB;;AAEA,8BAA8B;;AAE9B;;;CAGC,qBAAqB;CACrB,gBAAgB;CAChB,sBAAsB;AACvB;;AAEA,+BAA+B;;AAE/B;;;CAGC,qBAAqB;CACrB,WAAW;CACX,YAAY;CACZ,sBAAsB;CACtB,4BAA4B;CAC5B,gCAAgC;CAChC,wBAAwB;;CAExB,wCAAwC;CACxC,6CAA6C;CAC7C,gDAAgD;CAChD,2CAA2C;AAC5C;;AAEA,0DAA0D;AAC1D;;;CAGC,gBAAgB;AACjB;;AAEA,qBAAqB;AACrB;;CAEC,yBAAyB;CACzB,cAAc;AACf;AACA;;CAEC,aAAa;AACd;;AAEA;;CAEC,aAAa;AACd;;AAEA,iBAAiB;AACjB;;CAEC,yBAAyB;CACzB,cAAc;AACf;;AAEA;;CAEC,yBAAyB;AAC1B;AACA;;CAEC,aAAa;AACd;;AAEA;;CAEC,aAAa;AACd;;AAEA;;CAEC,qBAAqB;AACtB;;AAEA;;CAEC,cAAc;AACf;;AAEA,kBAAkB;AAClB;;CAEC,YAAY;AACb;;AAEA,2CAA2C;AAC3C;;CAEC,gDAAgD;AACjD;;AAEA;;CAEC,gDAAgD;AACjD;;AAEA;;CAEC,qDAAqD;AACtD;;AAEA;;CAEC,0DAA0D;AAC3D;;AAEA;;CAEC,4DAA4D;AAC7D;;AAEA;;CAEC,uDAAuD;AACxD;;AAEA;;CAEC,sDAAsD;AACvD;;AAEA;;CAEC,sDAAsD;AACvD;;AAEA;;CAEC,sDAAsD;AACvD;;AAEA;;CAEC,2DAA2D;AAC5D;;AAEA;;CAEC,sDAAsD;AACvD;;AAEA;;CAEC,wDAAwD;AACzD;;AAEA;;CAEC,qDAAqD;AACtD;;AAEA;;CAEC,yDAAyD;AAC1D;;AAEA;;CAEC,yDAAyD;AAC1D;;AAEA;;CAEC,kDAAkD;AACnD;;AAEA;;CAEC,4DAA4D;AAC7D;;AAEA;;CAEC,sDAAsD;AACvD;;AAEA;;CAEC,2DAA2D;AAC5D;;AAEA;IACI,YAAY;IACZ,WAAW;CACd,oBAAoB;CACpB,uBAAuB;CACvB,eAAe;AAChB;;AAEA;;CAEC;EACC,YAAY;EACZ,WAAW;CACZ;;AAED;;AAEA;;CAEC;EACC,oBAAoB;EACpB,uBAAuB;EACvB,eAAe;EACf,YAAY;EACZ,WAAW;CACZ;;AAED;;AAEA;;CAEC;EACC,kBAAkB;CACnB;;CAEA;EACC,cAAc;EACd,cAAc;EACd,kBAAkB;CACnB;;AAED","file":"jquery-labelauty-2-23-7.min.css","sourcesContent":["/*!\n * LABELAUTY jQuery Plugin Styles\n *\n * @file: jquery-labelauty.css\n * @author: Francisco Neves (@fntneves)\n * @site: www.francisconeves.com\n * @license: MIT License\n */\n\n/* Prevent text and blocks selection */\ninput.labelauty + label ::selection { background-color: rgba(255, 255, 255, 0); }\ninput.labelauty + label ::-moz-selection { background-color: rgba(255, 255, 255, 0); }\n\n/* Hide original checkboxes. They are ugly! */\ninput.labelauty { display: none !important; }\n\n/*\n * Let's style the input\n * Feel free to work with it as you wish!\n */\ninput.labelauty + label\n{\n\tdisplay: inline-block;\n\tfont-size: 13px;\n\tpadding: 10px;\n\tbackground-color: #efefef;\n\tcolor: black;\n\tcursor: pointer;\n\tmargin-top: 10px;\n\tmargin-right: 10px;\n\twidth: 96%;\n\n\tborder-radius: 3px 3px 3px 3px;\n\t-moz-border-radius: 3px 3px 3px 3px;\n\t-webkit-border-radius: 3px 3px 3px 3px;\n\n\n\ttransition: background-color 0.25s;\n\t-moz-transition: background-color 0.25s;\n\t-webkit-transition: background-color 0.25s;\n\t-o-transition: background-color 0.25s;\n\n\t-moz-user-select: none;\n\t-khtml-user-select: none;\n\t-webkit-user-select: none;\n\t-o-user-select: none;\n}\n\n/* Stylish text inside label */\n\ninput.labelauty + label > span.labelauty-unchecked,\ninput.labelauty + label > span.labelauty-checked\n{\n\tdisplay: inline-block;\n\tline-height: 1.1;\n\tvertical-align: middle;\n}\n\n/* Stylish icons inside label */\n\ninput.labelauty + label > span.labelauty-unchecked-image,\ninput.labelauty + label > span.labelauty-checked-image\n{\n\tdisplay: inline-block;\n\twidth: 30px;\n\theight: 30px;\n\tvertical-align: middle;\n\tbackground-repeat: no-repeat;\n\tbackground-position: left center;\n\tbackground-size: contain;\n\n\ttransition: background-image 0.5s linear;\n\t-moz-transition: background-image 0.5s linear;\n\t-webkit-transition: background-image 0.5s linear;\n\t-o-transition: background-image 0.5s linear;\n}\n\n/* When there's a label, add a little margin to the left */\ninput.labelauty + label > span.labelauty-unchecked-image + span.labelauty-unchecked,\ninput.labelauty + label > span.labelauty-checked-image + span.labelauty-checked\n{\n\tmargin-left: 7px;\n}\n\n/* When not Checked */\ninput.labelauty:not(:checked):not([disabled]) + label:hover\n{\n\tbackground-color: #eaeaea;\n\tcolor: #a7a7a7;\n}\ninput.labelauty:not(:checked) + label > span.labelauty-checked-image\n{\n\tdisplay: none;\n}\n\ninput.labelauty:not(:checked) + label > span.labelauty-checked\n{\n\tdisplay: none;\n}\n\n/* When Checked */\ninput.labelauty:checked + label\n{\n\tbackground-color: #3498db;\n\tcolor: #ffffff;\n}\n\ninput.labelauty:checked:not([disabled]) + label:hover\n{\n\tbackground-color: #72c5fd;\n}\ninput.labelauty:checked + label > span.labelauty-unchecked-image\n{\n\tdisplay: none;\n}\n\ninput.labelauty:checked + label > span.labelauty-unchecked\n{\n\tdisplay: none;\n}\n\ninput.labelauty:checked + label > span.labelauty-checked\n{\n\tdisplay: inline-block;\n}\n\ninput.labelauty.no-label:checked + label > span.labelauty-checked\n{\n\tdisplay: block;\n}\n\n/* When Disabled */\ninput.labelauty[disabled] + label\n{\n\topacity: 0.5;\n}\n\n/* Add a background to (un)checked images */\ninput.labelauty + label > span.labelauty-unchecked-image\n{\n\tbackground-image: url( images/icons/folder.png );\n}\n\ninput.labelauty + label > span.labelauty-checked-image\n{\n\tbackground-image: url( images/icons/folder.png );\n}\n\ninput.labelauty.email + label > span.labelauty-checked-image,\ninput.labelauty.email + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/email.png );\n}\n\ninput.labelauty.cloudfiles + label > span.labelauty-checked-image,\ninput.labelauty.cloudfiles + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/cloudfiles.png );\n}\n\ninput.labelauty.dreamobjects + label > span.labelauty-checked-image,\ninput.labelauty.dreamobjects + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/dreamobjects.png );\n}\n\ninput.labelauty.dropbox + label > span.labelauty-checked-image,\ninput.labelauty.dropbox + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/dropbox.png );\n}\n\ninput.labelauty.pcloud + label > span.labelauty-checked-image,\ninput.labelauty.pcloud + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/pcloud.png );\n}\n\ninput.labelauty.ftp + label > span.labelauty-checked-image,\ninput.labelauty.ftp + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/folder.png );\n}\n\ninput.labelauty.sftp + label > span.labelauty-checked-image,\ninput.labelauty.sftp + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/folder.png );\n}\n\ninput.labelauty.googledrive + label > span.labelauty-checked-image,\ninput.labelauty.googledrive + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/googledrive.png );\n}\n\ninput.labelauty.s3generic + label > span.labelauty-checked-image,\ninput.labelauty.s3generic + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/folder.png );\n}\n\ninput.labelauty.onedrive + label > span.labelauty-checked-image,\ninput.labelauty.onedrive + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/onedrive.png );\n}\n\ninput.labelauty.azure + label > span.labelauty-checked-image,\ninput.labelauty.azure + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/azure.png );\n}\n\ninput.labelauty.backblaze + label > span.labelauty-checked-image,\ninput.labelauty.backblaze + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/backblaze.png );\n}\n\ninput.labelauty.openstack + label > span.labelauty-checked-image,\ninput.labelauty.openstack + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/openstack.png );\n}\n\ninput.labelauty.s3 + label > span.labelauty-checked-image,\ninput.labelauty.s3 + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/s3.png );\n}\n\ninput.labelauty.updraftvault + label > span.labelauty-checked-image,\ninput.labelauty.updraftvault + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/updraftvault.png );\n}\n\ninput.labelauty.webdav + label > span.labelauty-checked-image,\ninput.labelauty.webdav + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/webdav.png );\n}\n\ninput.labelauty.googlecloud + label > span.labelauty-checked-image,\ninput.labelauty.googlecloud + label > span.labelauty-unchecked-image {\n\tbackground-image: url( ../../images/icons/googlecloud.png );\n}\n\n#remote-storage-container {\n height: auto;\n width: auto;\n\t-moz-column-count: 2;\n\t-webkit-column-count: 2;\n\tcolumn-count: 2;\n}\n\n@media only screen and (min-width: 480px) {\n\n\t#remote-storage-container {\n\t\theight: auto;\n\t\twidth: auto;\n\t}\n\n}\n\n@media only screen and (min-width: 1000px) {\n\n\t#remote-storage-container {\n\t\t-moz-column-count: 3;\n\t\t-webkit-column-count: 3;\n\t\tcolumn-count: 3;\n\t\theight: auto;\n\t\twidth: auto;\n\t}\n\n}\n\n@media only screen and (max-width: 480px) {\n\n\tinput.labelauty + label {\n\t\ttext-align: center;\n\t}\n\n\tinput.labelauty + label > span.labelauty-unchecked-image, input.labelauty + label > span.labelauty-checked-image {\n\t\tdisplay: block;\n\t\tmargin: 0 auto;\n\t\tmargin-bottom: 4px;\n\t}\n\n}"]}PKxL\ true, CURLOPT_SSL_VERIFYHOST => ($this->_sslVerify ? 2 : false), CURLOPT_SSL_VERIFYPEER => $this->_sslVerify, CURLOPT_AUTOREFERER => true, ); if ($this->_sslVerify && $this->_sslCAPath) { $default_options[CURLOPT_CAINFO] = $this->_sslCAPath; } // Prevent misleading PHP notice if (!$this->safeMode) $default_options[CURLOPT_FOLLOWLOCATION] = true; // See http://php.net/manual/en/function.array-merge.php for a description of the + operator (and why array_merge() would be wrong) $final_options = $options + $default_options; curl_setopt_array($curl, $final_options); return $curl; } /** * Processes a result returned by the OneDrive API call using a cURL object. * * @param (resource) $curl - The cURL object used to perform the call. * @return (object|string) The content returned, as an object instance if * served a JSON, or as a string if served as anything else. */ private function _processResult($curl) { $result = curl_exec($curl); if (false === $result) { throw new \Exception('curl_exec() failed: ' . curl_error($curl)); } $info = curl_getinfo($curl); $this->_httpStatus = array_key_exists('http_code', $info) ? (int) $info['http_code'] : null; $this->_contentType = array_key_exists('content_type', $info) ? (string) $info['content_type'] : null; // Parse nothing but JSON. if (1 !== preg_match('|^application/json|', $this->_contentType)) { return $result; } // Empty JSON string is returned as an empty object. if ('' == $result) { return (object) array(); } $decoded = json_decode($result); $vars = get_object_vars($decoded); if (array_key_exists('error', $vars)) { throw new \Exception($decoded->error->message, (int) $decoded->error->code); } return $decoded; } /** * Constructor. * * @param (array) $options. The options to use while creating this object. * Valid supported keys are: * 'state': When defined, it should contain a valid OneDrive client * state, as returned by getState(). Default: array(). * (boolean)'ssl_verify': whether to verify SSL hosts and peers (default: false) * (boolean|string)'ssl_capath': CA path to use for verifying SSL certificate chain (default: false) */ public function __construct(array $options = array()) { $this->_clientId = array_key_exists('client_id', $options) ? (string) $options['client_id'] : null; $this->_state = array_key_exists('state', $options) ? $options['state'] : (object) array( 'redirect_uri' => null, 'token' => null ); $this->_sslVerify = array_key_exists('ssl_verify', $options) ? $options['ssl_verify'] : false; $this->_sslCAPath = array_key_exists('ssl_capath', $options) ? $options['ssl_capath'] : false; $this->safeMode = (@ini_get('safe_mode') && strtolower(@ini_get('safe_mode')) != "off") ? 1 : 0; $this->use_msgraph_api = array_key_exists('use_msgraph_api', $options) ? $options['use_msgraph_api'] : false; if ($this->use_msgraph_api) { $endpoint_tld = (isset($options['endpoint_tld']) && 'de' == $options['endpoint_tld']) ? $options['endpoint_tld'] : 'com'; $this->api_url = UpdraftPlus_OneDrive_Account::$types[$endpoint_tld]['api_url']; $this->route_prefix = 'me/'; // The base URL for authorization requests. $this->auth_url = UpdraftPlus_OneDrive_Account::$types[$endpoint_tld]['auth_url']; // The base URL for token requests. $this->token_url = UpdraftPlus_OneDrive_Account::$types[$endpoint_tld]['token_url']; } else { // Custom App or old live sdk $this->route_prefix = ''; $this->api_url = 'https://api.onedrive.com/v1.0/'; // The base URL for authorization requests. $this->auth_url = 'https://login.live.com/oauth20_authorize.srf'; // The base URL for token requests. $this->token_url = 'https://login.live.com/oauth20_token.srf'; } } /** * Gets the current state of this Client instance. Typically saved in the * session and passed back to the Client constructor for further requests. * * @return (object) The state of this Client instance. */ public function getState() { return $this->_state; } /** * Gets the URL of the log in form. After login, the browser is redirected to * the redirect URL, and a code is passed as a GET parameter to this URL. * * The browser is also redirected to this URL if the user is already logged * in. * * @param (array) $scopes - The OneDrive scopes requested by the application. * Supported values: 'wl.signin', 'wl.basic', 'wl.contacts_skydrive', * 'wl.skydrive_update'. * @param (string) $redirectUri - The URI to which to redirect to upon * successful log in. * @param (array) $options. Reserved for future use. Default: array(). TODO: * support it. * @param (string) $instance_id - the id of the instance that we are currently trying to authorise * @param string $callback_uri - the current site url where control should redirect after auth server authenticated * @return (string) The login URL. */ public function getLogInUrl(array $scopes, $redirectUri, array $options = array(), $instance_id = '', $callback_uri = '') { if (null === $this->_clientId) { throw new \Exception('The client ID must be set to call getLoginUrl()'); } if ($this->use_msgraph_api) { $imploded = implode(' ', $scopes); } else { $imploded = implode(',', $scopes); } $redirectUri = (string) $redirectUri; $this->_state->redirect_uri = $redirectUri; $prefixed_instance_id = ':' . $instance_id; if ($this->use_msgraph_api) { $token = 'token'.$prefixed_instance_id.$callback_uri; } else { $token = $prefixed_instance_id; } // When using this URL, the browser will eventually be redirected to the // callback URL with a code passed in the URL query string (the name of the // variable is "code"). This is suitable for PHP. $url = $this->auth_url . '?client_id=' . urlencode($this->_clientId) . '&scope=' . urlencode($imploded) . '&response_type=code' . '&redirect_uri=' . urlencode($redirectUri) . '&state=' . urlencode($token) . '&display=popup' . '&locale=en'; return $url; } /** * Gets the access token expiration delay. * * @return (int) The token expiration delay, in seconds. */ public function getTokenExpire() { return $this->_state->token->obtained + $this->_state->token->data->expires_in - time(); } /** * Gets the status of the current access token. * * @return (int) The status of the current access token: * 0 => no access token * -1 => access token will expire soon (1 minute or less) * -2 => access token is expired * 1 => access token is valid */ public function getAccessTokenStatus() { if (null === $this->_state->token) { return 0; } $remaining = $this->getTokenExpire(); if (0 >= $remaining) { return -2; } if (60 >= $remaining) { return -1; } return 1; } /** * Obtains a new access token from OAuth. This token is valid for one hour. * * @param (string) $clientSecret - The OneDrive client secret. * @param (string) $code - The code returned by OneDrive after successful log * in. * @param (string) $redirectUri. Must be the same as the redirect URI passed * to getLoginUrl(). */ public function obtainAccessToken($clientSecret, $code) { if (null === $this->_clientId) { throw new \Exception('The client ID must be set to call obtainAccessToken()'); } if (null === $this->_state->redirect_uri) { throw new \Exception('The state\'s redirect URI must be set to call obtainAccessToken()'); } $url = $this->token_url; $curl = curl_init(); $curl_options = array( CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => ($this->_sslVerify ? 2 : false), CURLOPT_SSL_VERIFYPEER => $this->_sslVerify, CURLOPT_URL => $url, CURLOPT_AUTOREFERER => true, CURLOPT_POST => 1, // i am sending post data CURLOPT_POSTFIELDS => 'client_id=' . urlencode($this->_clientId) . '&redirect_uri=' . urlencode($this->_state->redirect_uri) . '&client_secret=' . urlencode($clientSecret) . '&grant_type=authorization_code' . '&code=' . urlencode($code), ); // Prevent misleading PHP notice if (!$this->safeMode) $curl_options[CURLOPT_FOLLOWLOCATION] = true; curl_setopt_array($curl, $curl_options); $result = curl_exec($curl); if (false === $result) { if (curl_errno($curl)) { throw new \Exception('Curl error: '.curl_error($curl)); } else { throw new \Exception('Curl error: empty response'); } } $decoded = json_decode($result); if (null === $decoded) { throw new \Exception('json_decode() failed'); } $this->_state->redirect_uri = null; $this->_state->token = (object) array( 'obtained' => time(), 'data' => $decoded ); } /** * Renews the access token from OAuth. This token is valid for one hour. */ /*public function renewAccessToken($clientSecret, $redirectUri) { $url = self::TOKEN_URL . '?client_id=' . $this->_clientId . '&redirect_uri=' . (string) $redirectUri . '&client_secret=' . (string) $clientSecret . '&grant_type=' . 'refresh_token' . '&code=' . (string) $code; }*/ /** * Performs a call to the OneDrive API using the GET method. * * @param (string) $path - The path of the API call (eg. me/skydrive). * @param (array) $options - Further curl options to set. * @return (boolean) Object of result */ public function apiGet($path, $options = array()) { $api = $this->api_url; $url = (strpos($path, 'https://') === 0) ? $path : $api . $path; if (!$this->use_msgraph_api) $url .= '?access_token=' . urlencode($this->_state->token->data->access_token); $curl = $this->_createCurl($path, $options); $curl_options = array( CURLOPT_URL => $url, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $this->_state->token->data->access_token ), ); curl_setopt_array($curl, $curl_options); //curl_setopt($curl, CURLOPT_URL, $url); return $this->_processResult($curl); } /** * Performs a call to the OneDrive API using the POST method. * * @param (string) $path - The path of the API call (eg. me/skydrive). * @param (array|object) $data - The data to pass in the body of the request. */ public function apiPost($path, $data = null) { $api = $this->api_url; $url = (strpos($path, 'https://') === 0) ? $path : $api . $path; $curl = $this->_createCurl($path); $curl_options = array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', // The data is sent as JSON as per OneDrive documentation 'Authorization: Bearer ' . $this->_state->token->data->access_token ), ); if (null !== $data) { $data = (object) $data; $curl_options[CURLOPT_POSTFIELDS] = json_encode($data); } else { // This doesn't seem to be necessary in my testing, but another user got an error from OneDrive indicating it was needed. Perhaps varies between curl versions? $curl_options[CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; } curl_setopt_array($curl, $curl_options); return $this->_processResult($curl); } /** * Performs a call to the OneDrive API using the PUT method. * * @param (string) $path - The path of the API call (eg. me/skydrive). * @param (resource) $stream - The data stream to upload. * @param (string) $contentType - The MIME type of the data stream, or null * if unknown. Default: null. * @param (int) $size - The number of bytes to send. Default: as many as are left in the stream. * @param (array) $headers - Further headers to send */ public function apiPut($path, $stream, $contentType = null, $size = null, $headers = array()) { $api = $this->api_url; $url = (strpos($path, 'https://') === 0) ? $path : $api . $path; $curl = $this->_createCurl($path); if (null === $size) { $stats = fstat($stream); $size = $stats[7]; } $headers[] = 'Authorization: Bearer ' . $this->_state->token->data->access_token; if (null !== $contentType) { $headers[] = 'Content-Type: ' . $contentType; } $options = array( CURLOPT_URL => $url, CURLOPT_HTTPHEADER => $headers, CURLOPT_PUT => true, CURLOPT_INFILE => $stream, CURLOPT_INFILESIZE => $size ); curl_setopt_array($curl, $options); return $this->_processResult($curl); } /** * Performs a call to the OneDrive API using the DELETE method. * * @param (string) $path - The path of the API call (eg. me/skydrive). */ public function apiDelete($path) { $url = $this->api_url . $path; // . '?access_token=' . urlencode($this->_state->token->data->access_token); $curl = $this->_createCurl($path); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $this->_state->token->data->access_token ) )); return $this->_processResult($curl); } /** * Performs a call to the OneDrive API using the DELETE method. * * @param (string) $path - The path of the API call (eg. me/skydrive). * @param (array) $objectIdArray - An array of unique IDs of the objects to delete. */ public function apiDeleteMulti($path, $objectIdArray) { $multi_curl = curl_multi_init(); $curl_objects = array(); foreach($objectIdArray as $id) { $current_path = $path . $id; $url = $this->api_url . $current_path; $curl = $this->_createCurl($current_path); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => array( 'Authorization: Bearer ' . $this->_state->token->data->access_token ) )); curl_multi_add_handle($multi_curl, $curl); $curl_objects[] = $curl; } $active = null; do { $status = curl_multi_exec($multi_curl, $active); if ($active) { // Wait a short time for more activity curl_multi_select($multi_curl); } } while ($active && $status == CURLM_OK); $response_array = array(); foreach ($curl_objects as $curl_object) { $response = curl_multi_getcontent($curl_object); // If empty then it's a success other wise we have an error array if (empty($response)) { $response_array[] = 'success'; } else { $response_array[] = json_decode($response, true); } curl_multi_remove_handle($multi_curl, $curl_object); } curl_multi_close($multi_curl); return $response_array; } /** * Performs a call to the OneDrive API using the MOVE method. * * @param (string) $path - The path of the API call (eg. me/skydrive). * @param (array|object) $data - The data to pass in the body of the request. */ public function apiMove($path, $data) { $url = $this->api_url . $path; $data = (object) $data; $curl = $this->_createCurl($path); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => 'MOVE', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', // The data is sent as JSON as per OneDrive documentation 'Authorization: Bearer ' . $this->_state->token->data->access_token ), CURLOPT_POSTFIELDS => json_encode($data) )); return $this->_processResult($curl); } /** * Performs a call to the OneDrive API using the COPY method. * * @param (string) $path - The path of the API call (eg. me/skydrive). * @param (array|object) $data - The data to pass in the body of the request. */ public function apiCopy($path, $data) { $url = $this->api_url . $path; $data = (object) $data; $curl = $this->_createCurl($path); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => 'COPY', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', // The data is sent as JSON as per OneDrive documentation 'Authorization: Bearer ' . $this->_state->token->data->access_token ), CURLOPT_POSTFIELDS => json_encode($data) )); return $this->_processResult($curl); } /** * Creates a folder in the current OneDrive account. * * @param (string) $name - The name of the OneDrive folder to be created. * @param (null|string) $parentId - The ID of the OneDrive folder into which * to create the OneDrive folder, or null to create it in the OneDrive * root folder. Default: null. * @param (null|string) $description - The description of the OneDrive folder to be * created, or null to create it without a description. Default: null. * @return (Folder) The folder created, as a Folder instance referencing to * the OneDrive folder created. */ public function createFolder($name, $parentId = null, $description = null) { if (null === $parentId) { $parent_path = $this->route_prefix.'drive/root/children'; } else{ $parent_path = $this->route_prefix.'drive/items/'.$parentId.'/children'; } $properties = array( 'name' => (string) $name, 'folder' => (object) array() ); //if (null !== $description) { // $properties['description'] = (string) $description; //} $folder_body = (object) $properties; $folder = $this->apiPost($parent_path, $folder_body); return new Folder($this, $folder->id, $folder); } /** * Creates a file in the current OneDrive account. * * @param (string) $name - The name of the OneDrive file to be created. * @param (null|string) $parentId - The ID of the OneDrive folder into which * to create the OneDrive file, or null to create it in the OneDrive * root folder. Default: null. * @param (string|resource) $content - The content of the OneDrive file to be created. * @return (File) The file created, as File instance referencing to the * OneDrive file created. * @throw (\Exception) Thrown on I/O errors. */ public function createFile($name, $parentId = null, $content = '') { if (null === $parentId) { $parent_path = $this->route_prefix.'drive/root'; } else{ $parent_path = $this->route_prefix.'drive/items/'.$parentId; } if (is_resource($content)) { $stream = $content; } else { $stream = fopen('php://temp', 'rw+b'); if (false === $stream) { throw new \Exception('fopen() failed'); } if (false === fwrite($stream, $content)) { fclose($stream); throw new \Exception('fwrite() failed'); } if (!rewind($stream)) { fclose($stream); throw new \Exception('rewind() failed'); } } // TODO: some versions of cURL cannot PUT memory streams? See here for a // workaround: https://bugs.php.net/bug.php?id=43468 $file = $this->apiPut($parent_path . '/children/' . urlencode($name).'/content/', $stream, null, null, array()); if (!is_resource($content)) fclose($stream); return new File($this, $file->id, $file); } /** * Fetches an object from the current OneDrive account. * * @param (null|string) The unique ID of the OneDrive object to fetch, or * null to fetch the OneDrive root folder. Default: null. * @return (Object) The object fetched, as an Object instance referencing to * the OneDrive object fetched. */ public function fetchObject($objectId = null) { $objectId = null !== $objectId ? $objectId : $this->route_prefix.'drive/root'; $result = $this->apiGet($objectId, array()); if (property_exists($result, 'folder')) { return new Folder($this, $objectId, $result); } return new File($this, $objectId, $result); } /** * Fetches the root folder from the current OneDrive account. * * @return (Folder) The root folder, as a Folder instance referencing to the * OneDrive root folder. */ public function fetchRoot() { return $this->fetchObject(); } /** * Fetches the "Camera Roll" folder from the current OneDrive account. * * @return (Folder) The "Camera Roll" folder, as a Folder instance referencing * to the OneDrive "Camera Roll" folder. */ public function fetchCameraRoll() { return $this->fetchObject($this->route_prefix.'drive/special/cameraroll'); } /** * Fetches the "Documents" folder from the current OneDrive account. * * @return (Folder) The "Documents" folder, as a Folder instance referencing * to the OneDrive "Documents" folder. */ public function fetchDocs() { return $this->fetchObject($this->route_prefix.'drive/special/documents'); } /** * Fetches the "Pictures" folder from the current OneDrive account. * * @return (Folder) The "Pictures" folder, as a Folder instance referencing to * the OneDrive "Pictures" folder. */ public function fetchPics() { return $this->fetchObject($this->route_prefix.'drive/special/photos'); } /** * Fetches the "Public" folder from the current OneDrive account. * * @return (Folder) The "Public" folder, as a Folder instance referencing to * the OneDrive "Public" folder. */ public function fetchPublicDocs() { return $this->fetchObject($this->route_prefix.'drive/special/public_documents'); } /** * Fetches the properties of an object in the current OneDrive account. * * @return (array) The properties of the object fetched. */ public function fetchProperties($objectId) { if (null === $objectId) { $object_path = $this->route_prefix.'drive/root'; } else { $object_path = $this->route_prefix.'drive/items/'.$objectId; } return $this->apiGet($objectId, array()); } /** * Fetches the objects in a folder in the current OneDrive account. * * @return (array) The objects in the folder fetched, as Object instances * referencing OneDrive objects. */ public function fetchObjects($objectId) { if (null === $objectId) { $object_path = $this->route_prefix.'drive/root'; } else{ $object_path = $this->route_prefix.'drive/items/'.$objectId; } $fetch_url = $object_path . '/children'; $objects = array(); while ($fetch_url) { $result = $this->apiGet($fetch_url, array()); foreach ($result->value as $data) { $object = property_exists($data, 'folder') ? new Folder($this, $data->id, $data) : new File($this, $data->id, $data); $objects[] = $object; } $next_url_key = '@odata.nextLink'; $fetch_url = !empty($result->$next_url_key) ? $result->$next_url_key : false; } return $objects; } /** * Updates the properties of an object in the current OneDrive account. * * @param (string) $objectId - The unique ID of the object to update. * @param (array|object) $properties - The properties to update. Default: * array(). * @throw (\Exception) Thrown on I/O errors. */ public function updateObject($objectId, $properties = array()) { $objectId = $objectId; $properties = (object) $properties; $encoded = json_encode($properties); $stream = fopen('php://temp', 'w+b'); if (false === $stream) { throw new \Exception('fopen() failed'); } if (false === fwrite($stream, $encoded)) { throw new \Exception('fwrite() failed'); } if (!rewind($stream)) { throw new \Exception('rewind() failed'); } $this->apiPut($objectId, $stream, 'application/json', null, array()); } /** * Moves an object into another folder. * * @param (string) The unique ID of the object to move. * @param (null|string) The unique ID of the folder into which to move the * object, or null to move it to the OneDrive root folder. Default: * null. */ public function moveObject($objectId, $destinationId = null) { if (null === $destinationId) { $destinationId = $this->route_prefix.'drive/root'; } $this->apiMove($objectId, array( 'destination' => $destinationId )); } /** * Copies a file into another folder. OneDrive does not support copying * folders. * * @param (string) The unique ID of the file to copy. * @param (null|string) The unique ID of the folder into which to copy the * file, or null to copy it to the OneDrive root folder. Default: * null. */ public function copyFile($objectId, $destinationId = null) { if (null === $destinationId) { $destinationId = $this->route_prefix.'drive/root'; } $this->apiCopy($objectId, array( 'destination' => $destinationId )); } /** * Deletes an object in the current OneDrive account. * * @param (string) $objectId - The unique ID of the object to delete. */ public function deleteObject($objectId) { $objectId = $objectId; $this->apiDelete($this->route_prefix.'drive/items/'.$objectId); } /** * Deletes an array of objects in the current OneDrive account. * * @param (array) $objectIdArray - An array of unique IDs of the objects to delete. * * @return array - returns an array of responses */ public function deleteObjectMulti($objectIdArray) { if (!is_array($objectIdArray)) return; return $this->apiDeleteMulti($this->route_prefix.'drive/items/', $objectIdArray); } /** * Fetches the quota of the current OneDrive account. * * @return (object) An object with the following properties: * (int) quota - The total space, in bytes. * (int) available - The available space, in bytes. */ public function fetchQuota() { $drive = $this->apiGet($this->route_prefix.'drive', array()); return $drive->quota; } /** * Fetches the account info of the current OneDrive account. * * @return (object) An object with the following properties: * (string) id - OneDrive account ID. * (string) first_name - account owner's first name. * (string) last_name - account owner's last name. * (string) name - account owner's full name. * (string) gender - account owner's gender. * (string) locale - account owner's locale. */ public function fetchAccountInfo() { //$drive = $this->apiGet('drive', array(), true); $drive = $this->apiGet($this->route_prefix.'drive', array()); return $drive->owner; } /** * Fetches the recent documents uploaded to the current OneDrive account. * * @return (object) An object with the following properties: * (array) data - The list of the recent documents uploaded. */ public function fetchRecentDocs() { return $this->apiGet($this->route_prefix.'drive/special/recent_docs', array()); } /** * Fetches the objects shared with the current OneDrive account. * * @return (object) An object with the following properties: * (array) data - The list of the shared objects. */ public function fetchShared() { return $this->apiGet($this->route_prefix.'drive/special/shared', array()); } /** * Give $use_msgraph_api variable * * @return boolean private $use_msgraph_api var */ public function use_msgraph_api() { return $this->use_msgraph_api; } } PKxL\bv11%updraftplus/includes/onedrive/LICENSEnu[GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . PKxL\ (updraftplus/includes/onedrive/folder.phpnu[_client->fetchObjects($this->_id); } /** * Creates a folder in the OneDrive folder referenced by this Folder instance. * * @param (string) $name - The name of the OneDrive folder to be created. * @param (null|string) $description - The description of the OneDrive folder * to be created, or null to create it without a description. Default: * null. * @return (Folder) The folder created, as a Folder instance. */ public function createFolder($name, $description = null) { return $this->_client->createFolder($name, $this->_id, $description); } /** * Creates a file in the OneDrive folder referenced by this Folder instance. * * @param (string) $name - The name of the OneDrive file to be created. * @param (string) $content - The content of the OneDrive file to be created. * Default: ''. * @return (File) The file created, as a File instance. * @throw (\Exception) Thrown on I/O errors. */ public function createFile($name, $content = '') { return $this->_client->createFile($name, $this->_id, $content); } } PKxL\&updraftplus/includes/onedrive/file.phpnu[_client->use_msgraph_api()) { return $this->_client->apiGet('me/drive/items/'.$this->_id . '/content', $options, true); } return $this->_client->apiGet('drive/items/'.$this->_id . '/content', $options, true); } /** * Copies the OneDrive file referenced by this File instance into another * OneDrive folder. * * @param (null|string) The unique ID of the OneDrive folder into which to * copy the OneDrive file referenced by this File instance, or null to * copy it in the OneDrive root folder. Default: null. */ public function copy($destinationId = null) { $this->_client->copyFile($this->_id, $destinationId); } } PKxL\sϱ((updraftplus/includes/onedrive/object.phpnu[_client = $client; $this->_id = null !== $id ? (string) $id : null; $this->_parentId = property_exists($options, 'parent_id') ? (string) $options->parent_id : null; $this->_name = property_exists($options, 'name') ? (string) $options->name : null; $this->_description = property_exists($options, 'description') ? (string) $options->description : null; $this->_size = property_exists($options, 'size') ? (int) $options->size : null; $this->_createdTime = property_exists($options, 'created_time') ? strtotime($options->created_time) : null; $this->_updatedTime = property_exists($options, 'updated_time') ? strtotime($options->updated_time) : null; } /** * Determines whether the OneDrive object referenced by this Object instance * is a folder. * * @return (bool) true if the OneDrive object referenced by this Object * instance is a folder, false otherwise. */ public function isFolder() { return false; } /** * Fetches the properties of the OneDrive object referenced by this Object * instance. Some properties are cached for faster subsequent access. * * @return (array) The properties of the OneDrive object referenced by this * Object instance. */ public function fetchProperties() { $result = $this->_client->fetchProperties($this->_id); $this->_parentId = '' != $result->parentReference['id'] ? (string) $result->parentReference['id'] : null; $this->_name = $result->name; $this->_description = '' != $result->description ? (string) $result->description : null; $this->_size = (int) $result->size; $this->_createdTime = strtotime($result->createdDateTime); $this->_updatedTime = strtotime($result->lastModifiedDateTime); return $result; } /** * Gets the unique ID of the OneDrive object referenced by this Object * instance. * * @return (string) The unique ID of the OneDrive object referenced by this * Object instance. */ public function getId() { return $this->_id; } /** * Gets the unique ID of the parent folder of the OneDrive object referenced * by this Object instance. * * @return (string) The unique ID of the OneDrive folder containing the object * referenced by this Object instance. */ public function getParentId() { if (null === $this->_parentId) { $this->fetchProperties(); } return $this->_parentId; } /** * Gets the name of the OneDrive object referenced by this Object instance. * * @return (string) The name of the OneDrive object referenced by this Object * instance. */ public function getName() { if (null === $this->_name) { $this->fetchProperties(); } return $this->_name; } /** * Gets the description of the OneDrive object referenced by this Object * instance. * * @return (string) The description of the OneDrive object referenced by this * Object instance. */ public function getDescription() { if (null === $this->_description) { $this->fetchProperties(); } return $this->_description; } /** * Gets the size of the OneDrive object referenced by this Object instance. * * @return (int) The size of the OneDrive object referenced by this Object * instance. */ public function getSize() { if (null === $this->_size) { $this->fetchProperties(); } return $this->_size; } /** * Gets the creation time of the OneDrive object referenced by this Object * instance. * * @return (int) The creation time of the object referenced by this Object * instance, in seconds since UNIX epoch. */ public function getCreatedTime() { if (null === $this->_createdTime) { $this->fetchProperties(); } return $this->_createdTime; } /** * Gets the last modification time of the OneDrive object referenced by this * Object instance. * * @return (int) The last modification time of the object referenced by this * Object instance, in seconds since UNIX epoch. */ public function getUpdatedTime() { if (null === $this->_updatedTime) { $this->fetchProperties(); } return $this->_updatedTime; } /** * Moves the OneDrive object referenced by this Object instance into another * OneDrive folder. * * @param (null|string) The unique ID of the OneDrive folder into which to * move the OneDrive object referenced by this Object instance, or * null to move it to the OneDrive root folder. Default: null. */ public function move($destinationId = null) { $this->_client->moveObject($this->_id, $destinationId); } } PKxL\J#*updraftplus/includes/onedrive/onedrive.phpnu[auth = $auth; } /** * Set location ID * * @param int|string $location Location ID. * * @return void */ public function set_location($location = 1) { if (1 === $location) { $this->apiep = 'https://api.pcloud.com'; } else { $this->apiep = 'https://eapi.pcloud.com'; } } /** * Set backup folder * * @param string $folder - the backup folder * * @return void */ public function set_folder($folder) { $this->folder = $folder; } /** * Retrieves information about the user's account * * @return array|WP_Error - returns the response array or a WP_Error */ public function account_info() { $params = array( 'access_token' => $this->auth ); $args = array( 'method' => 'GET', ); $response = $this->make_request('userinfo', $params, $args); if (is_wp_error($response)) return $response; if (is_array($response) && isset($response['quota'])) { return $response; } else { return new WP_Error('unexpected_response', 'pCloud userinfo request returned an unexpected result: '.json_encode($response)); } } /** * Create base remote directory * * @param string $dir_name - the directory name. * * @return int|WP_Error - returns the int result or a WP_Error */ public function make_directory($dir_name) { $folder_id = 0; $folders = explode("/", $dir_name); foreach ($folders as $folder) { $params = array( 'name' => untrailingslashit($folder), 'folderid' => $folder_id, 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('createfolderifnotexists', $params, $args); if (is_wp_error($response)) return $response; if (is_array($response) && isset($response['metadata']) && isset($response['metadata']['folderid'])) { $folder_id = intval($response['metadata']['folderid']); } else { return new WP_Error('unexpected_response', 'pCloud createfolderifnotexists request returned an unexpected result: '.json_encode($response)); } } return $folder_id; } /** * Get upload Dir ID * * @return int|WP_Error - returns upload folder ID or a WP_Error */ public function get_upload_dir_id() { $backup_dir = $this->get_backup_dir(); $params = array( 'path' => '/' . $backup_dir, 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('listfolder', $params, $args); if (is_wp_error($response)) return $response; if (!isset($response['result']) || 2005 === $response['result']) { return $this->make_directory($backup_dir); } else { if (isset($response['metadata'])) { return $response['metadata']['folderid']; } } return 0; } /** * Prepare to initiate Upload process * * @return array|WP_Error - returns response array or a WP_Error */ public function create_upload() { $params = array( 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('upload_create', $params, $args); if (is_wp_error($response)) return $response; return $response; } /** * Chunked upload * * @param string $path - path/file to be uploaded. * @param int $upload_id - pCloud Upload ID. * @param int $uploadoffset - file offset. * * @return int|WP_Error returns the new offset OR -2 when end of file reached or WP_Error */ public function chunked_upload($path, $upload_id = 0, $uploadoffset = 0) { if (!file_exists($path) || !is_file($path) || !is_readable($path)) { return new WP_Error('invalid_file', 'pCloud chunked upload: Invalid file provided: '.$path); } $filesize = abs(filesize($path)); if ($uploadoffset >= $filesize) { return -2; } $file = fopen($path, 'r'); if (0 < $uploadoffset) { fseek($file, $uploadoffset); } $params = array( 'uploadid' => $upload_id, 'uploadoffset' => $uploadoffset, ); $content = fread($file, $this->part_size); if (!empty($content)) { $result = $this->write($content, $params); if (is_wp_error($result)) { fclose($file); return $result; } $uploadoffset += $this->part_size; } fclose($file); if ($uploadoffset >= $filesize) { return -2; } return $uploadoffset; } /** * Save the uploaded file * * @param int $upload_id - pCloud Upload ID. * @param string $path - File Path. * @param int $folder_id - pCloud Folder ID. * * @return array|WP_Error - returns response array or a WP_Error */ public function save($upload_id, $path, $folder_id) { $path = str_replace(array('\\'), "/", $path); $parts = explode("/", $path); $filename = end($parts); $params = array( 'uploadid' => intval($upload_id), 'name' => rawurlencode($filename), 'folderid' => intval($folder_id), 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('upload_save', $params, $args); if (is_wp_error($response)) return $response; return $response; } /** * Collecting existing backups on pCloud servers * * @return array|WP_Error - returns response array or a WP_Error */ public function list_backups() { $backup_dir = $this->get_backup_dir(); $params = array( 'path' => '/' . $backup_dir, 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('listfolder', $params, $args); if (is_wp_error($response)) return $response; if (is_bool($response) || !isset($response['metadata']) || !isset($response['metadata']['contents'])) { return new WP_Error('unexpected_response', 'pCloud listfolder: returned an unexpected result: '.json_encode($response)); } return $response['metadata']['contents']; } /** * Chunked downloads a file. * * @param int $file_id - pCloud File ID. * @param resource $archive_file - the local file handle. * @param array $options - any extra options to be passed e.g. headers. * @param array $offset - you can create real chunked download using this offset param. * * @return int * @throws Exception Throws standard exception. */ public function download($file_id, $archive_file = null, $options = array(), $offset = 0) { $chunksize = 3 * (1024 * 1024); if (isset($options['Range'])) { // Disabled ! $range_tmp = str_replace('bytes=', '', $options['Range']); $range_arr = explode('-', $range_tmp); if (is_array($range_arr)) { if (isset($range_arr[0]) && is_numeric($range_arr[0]) && isset($range_arr[1]) && is_numeric($range_arr[1])) { $offset = intval($range_arr[0]); $chunksize = intval($range_arr[1]) - $offset; } } } $dwl_url = ''; $params = array( 'fileid' => $file_id, 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('getfilelink', $params, $args); if (is_wp_error($response)) return $response; if (isset($response['hosts']) && isset($response['hosts'][0])) { $dwl_url = $response['hosts'][0] . $response['path']; } if (empty($dwl_url)) { return new WP_Error('unexpected_response', 'pCloud download: Failed to get file download link.'); } $errstr = ''; $args = array( 'headers' => array( 'Range' => 'bytes=' . $offset . '-' . ($offset + ($chunksize - 1)), ), ); $content = false; $api_response = wp_remote_get('https://' . $dwl_url, $args); if (is_array($api_response) && !is_wp_error($api_response)) { $response_body = wp_remote_retrieve_body($api_response); if (is_string($response_body)) { $content = $response_body; } } else { $errstr = $api_response->get_error_message(); } if (!$content) { return new WP_Error('unexpected_response', 'pCloud download: Failed to open connection to the backup file: ' . $dwl_url . ' error:' . $errstr); } else { if (!fwrite($archive_file, $content)) { return new WP_Error('unexpected_response', 'pCloud download: Failed to write content to output file.'); } else { $offset += $chunksize; } } return $offset; } /** * Deletes remote file * * @param string $path - The path to the file to be deleted. * * @return array|WP_Error - returns response array or a WP_Error */ public function delete($path) { $params = array( 'path' => $path, 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('deletefile', $params, $args); if (is_wp_error($response)) return $response; if (is_bool($response)) { return new WP_Error('unexpected_response', 'pCloud deletefile: returned an unexpected result: '.json_encode($response)); } return $response; } /** * Get File info from * * @param string $file - basename, needed file. * * @return array|WP_Error - returns response array or a WP_Error */ public function get_file_info($file) { $path = "/" . $this->get_backup_dir() . "/" . $file; $params = array( 'path' => $path, 'access_token' => $this->auth, ); $args = array( 'method' => 'GET', ); $response = $this->make_request('checksumfile', $params, $args); if (is_wp_error($response)) return $response; if (is_bool($response)) { return new WP_Error('unexpected_response', 'pCloud checksumfile: returned an unexpected result: '.json_encode($response)); } $response = $response['metadata']; return $response; } /** * Get Backup directory * * @return string - the backup directory */ public function get_backup_dir() { return untrailingslashit(apply_filters('updraftplus_pcloud_backup_dir', 'UpdraftPlus').'/'.$this->folder); } /** * Upload - write content chunk * * @param string $content - String content to be written. * @param array $params - Additional request params. * * @return WP_Error - returns a WP_Error if something goes wrong */ private function write($content, $params) { $params['access_token'] = $this->auth; $args = array( 'method' => 'PUT', 'redirection' => 5, 'blocking' => true, 'headers' => array(), 'body' => $content, ); $response = $this->make_request('upload_write', $params, $args); if (is_wp_error($response)) return $response; } /** * This function will make a API request andcheck the response. Returns the response or a WordPress error. * * @param string $endpoint - the API endpoint * @param array $params - the API request parameters * @param array $args - an array of request options * * @return array|WP_Error - returns an array response or WP_Error */ private function make_request($endpoint, $params, $args) { $api_response = wp_remote_request($this->apiep . '/'. $endpoint . '?' . http_build_query($params), $args); if (is_wp_error($api_response)) { return $api_response; } $response_code = wp_remote_retrieve_response_code($api_response); if ($response_code < 200 || $response_code >= 300) { return new WP_Error('unexpected_response_code', 'pCloud ' . $endpoint . ': returned an unexpected response code: '. $response_code . ' response: '.json_encode($api_response)); } $response_body = wp_remote_retrieve_body($api_response); if (empty($response_body) || !is_string($response_body)) { return new WP_Error('no_response_body', 'pCloud ' . $endpoint . ': returned no response body: ' . json_encode($api_response)); } $response_array = json_decode($response_body, true); if (!is_array($response_array)) { return new WP_Error('json_decode_failed', 'pCloud ' . $endpoint . ': Failed to json decode: ' . $response_body); } return $response_array; } } PKxL\W$II(updraftplus/includes/select2/select2.cssnu[.select2-container { box-sizing: border-box; display: inline-block; margin: 0; position: relative; vertical-align: middle; } .select2-container .select2-selection--single { box-sizing: border-box; cursor: pointer; display: block; height: 28px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--single .select2-selection__rendered { display: block; padding-left: 8px; padding-right: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-selection--single .select2-selection__clear { background-color: transparent; border: none; font-size: 1em; } .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 8px; padding-left: 20px; } .select2-container .select2-selection--multiple { box-sizing: border-box; cursor: pointer; display: block; min-height: 32px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--multiple .select2-selection__rendered { display: inline; list-style: none; padding: 0; } .select2-container .select2-selection--multiple .select2-selection__clear { background-color: transparent; border: none; font-size: 1em; } .select2-container .select2-search--inline .select2-search__field { box-sizing: border-box; border: none; font-size: 100%; margin-top: 5px; margin-left: 5px; padding: 0; max-width: 100%; resize: none; height: 18px; vertical-align: bottom; font-family: sans-serif; overflow: hidden; word-break: keep-all; } .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-dropdown { background-color: white; border: 1px solid #aaa; border-radius: 4px; box-sizing: border-box; display: block; position: absolute; left: -100000px; width: 100%; z-index: 1051; } .select2-results { display: block; } .select2-results__options { list-style: none; margin: 0; padding: 0; } .select2-results__option { padding: 6px; user-select: none; -webkit-user-select: none; } .select2-results__option--selectable { cursor: pointer; } .select2-container--open .select2-dropdown { left: 0; } .select2-container--open .select2-dropdown--above { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--open .select2-dropdown--below { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-search--dropdown { display: block; padding: 4px; } .select2-search--dropdown .select2-search__field { padding: 4px; width: 100%; box-sizing: border-box; } .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-search--dropdown.select2-search--hide { display: none; } .select2-close-mask { border: 0; margin: 0; padding: 0; display: block; position: fixed; left: 0; top: 0; min-height: 100%; min-width: 100%; height: auto; width: auto; opacity: 0; z-index: 99; background-color: #fff; filter: alpha(opacity=0); } .select2-hidden-accessible { border: 0 !important; clip: rect(0 0 0 0) !important; -webkit-clip-path: inset(50%) !important; clip-path: inset(50%) !important; height: 1px !important; overflow: hidden !important; padding: 0 !important; position: absolute !important; width: 1px !important; white-space: nowrap !important; } .select2-container--default .select2-selection--single { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; } .select2-container--default .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--default .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; height: 26px; margin-right: 20px; padding-right: 0px; } .select2-container--default .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; } .select2-container--default .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { left: 1px; right: auto; } .select2-container--default.select2-container--disabled .select2-selection--single { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { display: none; } .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--default .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; padding-bottom: 5px; padding-right: 5px; position: relative; } .select2-container--default .select2-selection--multiple.select2-selection--clearable { padding-right: 25px; } .select2-container--default .select2-selection--multiple .select2-selection__clear { cursor: pointer; font-weight: bold; height: 20px; margin-right: 10px; margin-top: 5px; position: absolute; right: 0; padding: 1px; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; box-sizing: border-box; display: inline-block; margin-left: 5px; margin-top: 5px; padding: 0; padding-left: 20px; position: relative; max-width: 100%; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; white-space: nowrap; } .select2-container--default .select2-selection--multiple .select2-selection__choice__display { cursor: default; padding-left: 2px; padding-right: 5px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { background-color: transparent; border: none; border-right: 1px solid #aaa; border-top-left-radius: 4px; border-bottom-left-radius: 4px; color: #999; cursor: pointer; font-size: 1em; font-weight: bold; padding: 0 4px; position: absolute; left: 0; top: 0; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover, .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus { background-color: #f1f1f1; color: #333; outline: none; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display { padding-left: 5px; padding-right: 2px; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { border-left: 1px solid #aaa; border-right: none; border-top-left-radius: 0; border-bottom-left-radius: 0; border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__clear { float: left; margin-left: 10px; margin-right: auto; } .select2-container--default.select2-container--focus .select2-selection--multiple { border: solid black 1px; outline: 0; } .select2-container--default.select2-container--disabled .select2-selection--multiple { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection__choice__remove { display: none; } .select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--default .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; } .select2-container--default .select2-search--inline .select2-search__field { background: transparent; border: none; outline: 0; box-shadow: none; -webkit-appearance: textfield; } .select2-container--default .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--default .select2-results__option .select2-results__option { padding-left: 1em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__group { padding-left: 0; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option { margin-left: -1em; padding-left: 2em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -2em; padding-left: 3em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -3em; padding-left: 4em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -4em; padding-left: 5em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -5em; padding-left: 6em; } .select2-container--default .select2-results__option--group { padding: 0; } .select2-container--default .select2-results__option--disabled { color: #999; } .select2-container--default .select2-results__option--selected { background-color: #ddd; } .select2-container--default .select2-results__option--highlighted.select2-results__option--selectable { background-color: #5897fb; color: white; } .select2-container--default .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic .select2-selection--single { background-color: #f7f7f7; border: 1px solid #aaa; border-radius: 4px; outline: 0; background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic .select2-selection--single:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--classic .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; height: 26px; margin-right: 20px; } .select2-container--classic .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--classic .select2-selection--single .select2-selection__arrow { background-color: #ddd; border: none; border-left: 1px solid #aaa; border-top-right-radius: 4px; border-bottom-right-radius: 4px; height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } .select2-container--classic .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { border: none; border-right: 1px solid #aaa; border-radius: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; left: 1px; right: auto; } .select2-container--classic.select2-container--open .select2-selection--single { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { background: transparent; border: none; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } .select2-container--classic .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; outline: 0; padding-bottom: 5px; padding-right: 5px; } .select2-container--classic .select2-selection--multiple:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--multiple .select2-selection__clear { display: none; } .select2-container--classic .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; display: inline-block; margin-left: 5px; margin-top: 5px; padding: 0; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__display { cursor: default; padding-left: 2px; padding-right: 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { background-color: transparent; border: none; border-top-left-radius: 4px; border-bottom-left-radius: 4px; color: #888; cursor: pointer; font-size: 1em; font-weight: bold; padding: 0 4px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { color: #555; outline: none; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display { padding-left: 5px; padding-right: 2px; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { border-top-left-radius: 0; border-bottom-left-radius: 0; border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .select2-container--classic.select2-container--open .select2-selection--multiple { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--classic .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; outline: 0; } .select2-container--classic .select2-search--inline .select2-search__field { outline: 0; box-shadow: none; } .select2-container--classic .select2-dropdown { background-color: white; border: 1px solid transparent; } .select2-container--classic .select2-dropdown--above { border-bottom: none; } .select2-container--classic .select2-dropdown--below { border-top: none; } .select2-container--classic .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--classic .select2-results__option--group { padding: 0; } .select2-container--classic .select2-results__option--disabled { color: grey; } .select2-container--classic .select2-results__option--highlighted.select2-results__option--selectable { background-color: #3875d7; color: white; } .select2-container--classic .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic.select2-container--open .select2-dropdown { border-color: #5897fb; } PKxL\'H_ee'updraftplus/includes/select2/select2.jsnu[/*! * Select2 4.1.0-rc.0 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ ;(function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof module === 'object' && module.exports) { // Node/CommonJS module.exports = function (root, jQuery) { if (jQuery === undefined) { // require('jQuery') returns a factory that requires window to // build a jQuery instance, we normalize how we use modules // that require this pattern but the window provided is a noop // if it's defined (how jquery works) if (typeof window !== 'undefined') { jQuery = require('jquery'); } else { jQuery = require('jquery')(root); } } factory(jQuery); return jQuery; }; } else { // Browser globals factory(jQuery); } } (function (jQuery) { // This is needed so we can catch the AMD loader configuration and use it // The inner file should be wrapped (by `banner.start.js`) in a function that // returns the AMD loader references. var S2 =(function () { // Restore the Select2 AMD loader so it can be used // Needed mostly in the language files, where the loader is not inserted if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { var S2 = jQuery.fn.select2.amd; } var S2;(function () { if (!S2 || !S2.requirejs) { if (!S2) { S2 = {}; } else { require = S2; } /** * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. * Released under MIT license, http://github.com/requirejs/almond/LICENSE */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. /*global setTimeout: false */ var requirejs, require, define; (function (undef) { var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\.js$/; function hasProp(obj, prop) { return hasOwn.call(obj, prop); } /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. if (name) { name = name.split('/'); lastIndex = name.length - 1; // If wanting node ID compatibility, strip .js from end // of IDs. Have to do this here, and not in nameToUrl // because node allows either .js or non .js to map // to same file. if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } // Starts with a '.' so need the baseName if (name[0].charAt(0) === '.' && baseParts) { //Convert baseName to array, and lop off the last part, //so that . matches that 'directory' and not name of the baseName's //module. For instance, baseName of 'one/two/three', maps to //'one/two/three.js', but we want the directory, 'one/two' for //this normalization. normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); name = normalizedBaseParts.concat(name); } //start trimDots for (i = 0; i < name.length; i++) { part = name[i]; if (part === '.') { name.splice(i, 1); i -= 1; } else if (part === '..') { // If at the start, or previous value is still .., // keep them so that when converted to a path it may // still work when converted to a path, even though // as an ID it is less than ideal. In larger point // releases, may be better to just kick out an error. if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { continue; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } } //end trimDots name = name.join('/'); } //Apply map config if available. if ((baseParts || starMap) && map) { nameParts = name.split('/'); for (i = nameParts.length; i > 0; i -= 1) { nameSegment = nameParts.slice(0, i).join("/"); if (baseParts) { //Find the longest baseName segment match in the config. //So, do joins on the biggest to smallest lengths of baseParts. for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; foundI = i; break; } } } } if (foundMap) { break; } //Check for a star map match, but just hold on to it, //if there is a shorter segment match later in a matching //config, then favor over this star map. if (!foundStarMap && starMap && starMap[nameSegment]) { foundStarMap = starMap[nameSegment]; starI = i; } } if (!foundMap && foundStarMap) { foundMap = foundStarMap; foundI = starI; } if (foundMap) { nameParts.splice(0, foundI, foundMap); name = nameParts.join('/'); } } return name; } function makeRequire(relName, forceSync) { return function () { //A version of a require function that passes a moduleName //value for items that may need to //look up paths relative to the moduleName var args = aps.call(arguments, 0); //If first arg is not require('string'), and there is only //one arg, it is the array form without a callback. Insert //a null so that the following concat is correct. if (typeof args[0] !== 'string' && args.length === 1) { args.push(null); } return req.apply(undef, args.concat([relName, forceSync])); }; } function makeNormalize(relName) { return function (name) { return normalize(name, relName); }; } function makeLoad(depName) { return function (value) { defined[depName] = value; }; } function callDep(name) { if (hasProp(waiting, name)) { var args = waiting[name]; delete waiting[name]; defining[name] = true; main.apply(undef, args); } if (!hasProp(defined, name) && !hasProp(defining, name)) { throw new Error('No ' + name); } return defined[name]; } //Turns a plugin!resource to [plugin, resource] //with the plugin being undefined if the name //did not have a plugin prefix. function splitPrefix(name) { var prefix, index = name ? name.indexOf('!') : -1; if (index > -1) { prefix = name.substring(0, index); name = name.substring(index + 1, name.length); } return [prefix, name]; } //Creates a parts array for a relName where first part is plugin ID, //second part is resource ID. Assumes relName has already been normalized. function makeRelParts(relName) { return relName ? splitPrefix(relName) : []; } /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ makeMap = function (name, relParts) { var plugin, parts = splitPrefix(name), prefix = parts[0], relResourceName = relParts[1]; name = parts[1]; if (prefix) { prefix = normalize(prefix, relResourceName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { name = plugin.normalize(name, makeNormalize(relResourceName)); } else { name = normalize(name, relResourceName); } } else { name = normalize(name, relResourceName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; if (prefix) { plugin = callDep(prefix); } } //Using ridiculous property names for space reasons return { f: prefix ? prefix + '!' + name : name, //fullName n: name, pr: prefix, p: plugin }; }; function makeConfig(name) { return function () { return (config && config.config && config.config[name]) || {}; }; } handlers = { require: function (name) { return makeRequire(name); }, exports: function (name) { var e = defined[name]; if (typeof e !== 'undefined') { return e; } else { return (defined[name] = {}); } }, module: function (name) { return { id: name, uri: '', exports: defined[name], config: makeConfig(name) }; } }; main = function (name, deps, callback, relName) { var cjsModule, depName, ret, map, i, relParts, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; relParts = makeRelParts(relName); //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { //Pull out the defined dependencies and pass the ordered //values to the callback. //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { map = makeMap(deps[i], relParts); depName = map.f; //Fast path CommonJS standard dependencies. if (depName === "require") { args[i] = handlers.require(name); } else if (depName === "exports") { //CommonJS module spec 1.1 args[i] = handlers.exports(name); usingExports = true; } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = handlers.module(name); } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; } else { throw new Error(name + ' missing ' + depName); } } ret = callback ? callback.apply(defined[name], args) : undefined; if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { //May just be an object definition for the module. Only //worry about defining if have a module name. defined[name] = callback; } }; requirejs = require = req = function (deps, callback, relName, forceSync, alt) { if (typeof deps === "string") { if (handlers[deps]) { //callback in this case is really relName return handlers[deps](callback); } //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, makeRelParts(callback)).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; if (config.deps) { req(config.deps, config.callback); } if (!callback) { return; } if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; callback = relName; relName = null; } else { deps = undef; } } //Support require(['a']) callback = callback || function () {}; //If relName is a function, it is an errback handler, //so remove it. if (typeof relName === 'function') { relName = forceSync; forceSync = alt; } //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { //Using a non-zero value because of concern for what old browsers //do, and latest browsers "upgrade" to 4 if lower value is used: //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: //If want a value immediately, use require('id') instead -- something //that works in almond on the global level, but not guaranteed and //unlikely to work in other AMD implementations. setTimeout(function () { main(undef, deps, callback, relName); }, 4); } return req; }; /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ req.config = function (cfg) { return req(cfg); }; /** * Expose module registry for debugging and tooling */ requirejs._defined = defined; define = function (name, deps, callback) { if (typeof name !== 'string') { throw new Error('See almond README: incorrect module build, no module name'); } //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means //an object literal or factory function for //the value. Adjust args. callback = deps; deps = []; } if (!hasProp(defined, name) && !hasProp(waiting, name)) { waiting[name] = [name, deps, callback]; } }; define.amd = { jQuery: true }; }()); S2.requirejs = requirejs;S2.require = require;S2.define = define; } }()); S2.define("almond", function(){}); /* global jQuery:false, $:false */ S2.define('jquery',[],function () { var _$ = jQuery || $; if (_$ == null && console && console.error) { console.error( 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.' ); } return _$; }); S2.define('select2/utils',[ 'jquery' ], function ($) { var Utils = {}; Utils.Extend = function (ChildClass, SuperClass) { var __hasProp = {}.hasOwnProperty; function BaseConstructor () { this.constructor = ChildClass; } for (var key in SuperClass) { if (__hasProp.call(SuperClass, key)) { ChildClass[key] = SuperClass[key]; } } BaseConstructor.prototype = SuperClass.prototype; ChildClass.prototype = new BaseConstructor(); ChildClass.__super__ = SuperClass.prototype; return ChildClass; }; function getMethods (theClass) { var proto = theClass.prototype; var methods = []; for (var methodName in proto) { var m = proto[methodName]; if (typeof m !== 'function') { continue; } if (methodName === 'constructor') { continue; } methods.push(methodName); } return methods; } Utils.Decorate = function (SuperClass, DecoratorClass) { var decoratedMethods = getMethods(DecoratorClass); var superMethods = getMethods(SuperClass); function DecoratedClass () { var unshift = Array.prototype.unshift; var argCount = DecoratorClass.prototype.constructor.length; var calledConstructor = SuperClass.prototype.constructor; if (argCount > 0) { unshift.call(arguments, SuperClass.prototype.constructor); calledConstructor = DecoratorClass.prototype.constructor; } calledConstructor.apply(this, arguments); } DecoratorClass.displayName = SuperClass.displayName; function ctr () { this.constructor = DecoratedClass; } DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { var superMethod = superMethods[m]; DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { // Stub out the original method if it's not decorating an actual method var originalMethod = function () {}; if (methodName in DecoratedClass.prototype) { originalMethod = DecoratedClass.prototype[methodName]; } var decoratedMethod = DecoratorClass.prototype[methodName]; return function () { var unshift = Array.prototype.unshift; unshift.call(arguments, originalMethod); return decoratedMethod.apply(this, arguments); }; }; for (var d = 0; d < decoratedMethods.length; d++) { var decoratedMethod = decoratedMethods[d]; DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); } return DecoratedClass; }; var Observable = function () { this.listeners = {}; }; Observable.prototype.on = function (event, callback) { this.listeners = this.listeners || {}; if (event in this.listeners) { this.listeners[event].push(callback); } else { this.listeners[event] = [callback]; } }; Observable.prototype.trigger = function (event) { var slice = Array.prototype.slice; var params = slice.call(arguments, 1); this.listeners = this.listeners || {}; // Params should always come in as an array if (params == null) { params = []; } // If there are no arguments to the event, use a temporary object if (params.length === 0) { params.push({}); } // Set the `_type` of the first object to the event params[0]._type = event; if (event in this.listeners) { this.invoke(this.listeners[event], slice.call(arguments, 1)); } if ('*' in this.listeners) { this.invoke(this.listeners['*'], arguments); } }; Observable.prototype.invoke = function (listeners, params) { for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].apply(this, params); } }; Utils.Observable = Observable; Utils.generateChars = function (length) { var chars = ''; for (var i = 0; i < length; i++) { var randomChar = Math.floor(Math.random() * 36); chars += randomChar.toString(36); } return chars; }; Utils.bind = function (func, context) { return function () { func.apply(context, arguments); }; }; Utils._convertData = function (data) { for (var originalKey in data) { var keys = originalKey.split('-'); var dataLevel = data; if (keys.length === 1) { continue; } for (var k = 0; k < keys.length; k++) { var key = keys[k]; // Lowercase the first letter // By default, dash-separated becomes camelCase key = key.substring(0, 1).toLowerCase() + key.substring(1); if (!(key in dataLevel)) { dataLevel[key] = {}; } if (k == keys.length - 1) { dataLevel[key] = data[originalKey]; } dataLevel = dataLevel[key]; } delete data[originalKey]; } return data; }; Utils.hasScroll = function (index, el) { // Adapted from the function created by @ShadowScripter // and adapted by @BillBarry on the Stack Exchange Code Review website. // The original code can be found at // http://codereview.stackexchange.com/q/13338 // and was designed to be used with the Sizzle selector engine. var $el = $(el); var overflowX = el.style.overflowX; var overflowY = el.style.overflowY; //Check both x and y declarations if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) { return false; } if (overflowX === 'scroll' || overflowY === 'scroll') { return true; } return ($el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth); }; Utils.escapeMarkup = function (markup) { var replaceMap = { '\\': '\', '&': '&', '<': '<', '>': '>', '"': '"', '\'': ''', '/': '/' }; // Do not try to escape the markup if it's not a string if (typeof markup !== 'string') { return markup; } return String(markup).replace(/[&<>"'\/\\]/g, function (match) { return replaceMap[match]; }); }; // Cache objects in Utils.__cache instead of $.data (see #4346) Utils.__cache = {}; var id = 0; Utils.GetUniqueElementId = function (element) { // Get a unique element Id. If element has no id, // creates a new unique number, stores it in the id // attribute and returns the new id with a prefix. // If an id already exists, it simply returns it with a prefix. var select2Id = element.getAttribute('data-select2-id'); if (select2Id != null) { return select2Id; } // If element has id, use it. if (element.id) { select2Id = 'select2-data-' + element.id; } else { select2Id = 'select2-data-' + (++id).toString() + '-' + Utils.generateChars(4); } element.setAttribute('data-select2-id', select2Id); return select2Id; }; Utils.StoreData = function (element, name, value) { // Stores an item in the cache for a specified element. // name is the cache key. var id = Utils.GetUniqueElementId(element); if (!Utils.__cache[id]) { Utils.__cache[id] = {}; } Utils.__cache[id][name] = value; }; Utils.GetData = function (element, name) { // Retrieves a value from the cache by its key (name) // name is optional. If no name specified, return // all cache items for the specified element. // and for a specified element. var id = Utils.GetUniqueElementId(element); if (name) { if (Utils.__cache[id]) { if (Utils.__cache[id][name] != null) { return Utils.__cache[id][name]; } return $(element).data(name); // Fallback to HTML5 data attribs. } return $(element).data(name); // Fallback to HTML5 data attribs. } else { return Utils.__cache[id]; } }; Utils.RemoveData = function (element) { // Removes all cached items for a specified element. var id = Utils.GetUniqueElementId(element); if (Utils.__cache[id] != null) { delete Utils.__cache[id]; } element.removeAttribute('data-select2-id'); }; Utils.copyNonInternalCssClasses = function (dest, src) { var classes; var destinationClasses = dest.getAttribute('class').trim().split(/\s+/); destinationClasses = destinationClasses.filter(function (clazz) { // Save all Select2 classes return clazz.indexOf('select2-') === 0; }); var sourceClasses = src.getAttribute('class').trim().split(/\s+/); sourceClasses = sourceClasses.filter(function (clazz) { // Only copy non-Select2 classes return clazz.indexOf('select2-') !== 0; }); var replacements = destinationClasses.concat(sourceClasses); dest.setAttribute('class', replacements.join(' ')); }; return Utils; }); S2.define('select2/results',[ 'jquery', './utils' ], function ($, Utils) { function Results ($element, options, dataAdapter) { this.$element = $element; this.data = dataAdapter; this.options = options; Results.__super__.constructor.call(this); } Utils.Extend(Results, Utils.Observable); Results.prototype.render = function () { var $results = $( '
        ' ); if (this.options.get('multiple')) { $results.attr('aria-multiselectable', 'true'); } this.$results = $results; return $results; }; Results.prototype.clear = function () { this.$results.empty(); }; Results.prototype.displayMessage = function (params) { var escapeMarkup = this.options.get('escapeMarkup'); this.clear(); this.hideLoading(); var $message = $( '
      • ' ); var message = this.options.get('translations').get(params.message); $message.append( escapeMarkup( message(params.args) ) ); $message[0].className += ' select2-results__message'; this.$results.append($message); }; Results.prototype.hideMessages = function () { this.$results.find('.select2-results__message').remove(); }; Results.prototype.append = function (data) { this.hideLoading(); var $options = []; if (data.results == null || data.results.length === 0) { if (this.$results.children().length === 0) { this.trigger('results:message', { message: 'noResults' }); } return; } data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) { var item = data.results[d]; var $option = this.option(item); $options.push($option); } this.$results.append($options); }; Results.prototype.position = function ($results, $dropdown) { var $resultsContainer = $dropdown.find('.select2-results'); $resultsContainer.append($results); }; Results.prototype.sort = function (data) { var sorter = this.options.get('sorter'); return sorter(data); }; Results.prototype.highlightFirstItem = function () { var $options = this.$results .find('.select2-results__option--selectable'); var $selected = $options.filter('.select2-results__option--selected'); // Check if there are any selected options if ($selected.length > 0) { // If there are selected options, highlight the first $selected.first().trigger('mouseenter'); } else { // If there are no selected options, highlight the first option // in the dropdown $options.first().trigger('mouseenter'); } this.ensureHighlightVisible(); }; Results.prototype.setClasses = function () { var self = this; this.data.current(function (selected) { var selectedIds = selected.map(function (s) { return s.id.toString(); }); var $options = self.$results .find('.select2-results__option--selectable'); $options.each(function () { var $option = $(this); var item = Utils.GetData(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; if ((item.element != null && item.element.selected) || (item.element == null && selectedIds.indexOf(id) > -1)) { this.classList.add('select2-results__option--selected'); $option.attr('aria-selected', 'true'); } else { this.classList.remove('select2-results__option--selected'); $option.attr('aria-selected', 'false'); } }); }); }; Results.prototype.showLoading = function (params) { this.hideLoading(); var loadingMore = this.options.get('translations').get('searching'); var loading = { disabled: true, loading: true, text: loadingMore(params) }; var $loading = this.option(loading); $loading.className += ' loading-results'; this.$results.prepend($loading); }; Results.prototype.hideLoading = function () { this.$results.find('.loading-results').remove(); }; Results.prototype.option = function (data) { var option = document.createElement('li'); option.classList.add('select2-results__option'); option.classList.add('select2-results__option--selectable'); var attrs = { 'role': 'option' }; var matches = window.Element.prototype.matches || window.Element.prototype.msMatchesSelector || window.Element.prototype.webkitMatchesSelector; if ((data.element != null && matches.call(data.element, ':disabled')) || (data.element == null && data.disabled)) { attrs['aria-disabled'] = 'true'; option.classList.remove('select2-results__option--selectable'); option.classList.add('select2-results__option--disabled'); } if (data.id == null) { option.classList.remove('select2-results__option--selectable'); } if (data._resultId != null) { option.id = data._resultId; } if (data.title) { option.title = data.title; } if (data.children) { attrs.role = 'group'; attrs['aria-label'] = data.text; option.classList.remove('select2-results__option--selectable'); option.classList.add('select2-results__option--group'); } for (var attr in attrs) { var val = attrs[attr]; option.setAttribute(attr, val); } if (data.children) { var $option = $(option); var label = document.createElement('strong'); label.className = 'select2-results__group'; this.template(data, label); var $children = []; for (var c = 0; c < data.children.length; c++) { var child = data.children[c]; var $child = this.option(child); $children.push($child); } var $childrenContainer = $('
          ', { 'class': 'select2-results__options select2-results__options--nested', 'role': 'none' }); $childrenContainer.append($children); $option.append(label); $option.append($childrenContainer); } else { this.template(data, option); } Utils.StoreData(option, 'data', data); return option; }; Results.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-results'; this.$results.attr('id', id); container.on('results:all', function (params) { self.clear(); self.append(params.data); if (container.isOpen()) { self.setClasses(); self.highlightFirstItem(); } }); container.on('results:append', function (params) { self.append(params.data); if (container.isOpen()) { self.setClasses(); } }); container.on('query', function (params) { self.hideMessages(); self.showLoading(params); }); container.on('select', function () { if (!container.isOpen()) { return; } self.setClasses(); if (self.options.get('scrollAfterSelect')) { self.highlightFirstItem(); } }); container.on('unselect', function () { if (!container.isOpen()) { return; } self.setClasses(); if (self.options.get('scrollAfterSelect')) { self.highlightFirstItem(); } }); container.on('open', function () { // When the dropdown is open, aria-expended="true" self.$results.attr('aria-expanded', 'true'); self.$results.attr('aria-hidden', 'false'); self.setClasses(); self.ensureHighlightVisible(); }); container.on('close', function () { // When the dropdown is closed, aria-expended="false" self.$results.attr('aria-expanded', 'false'); self.$results.attr('aria-hidden', 'true'); self.$results.removeAttr('aria-activedescendant'); }); container.on('results:toggle', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } $highlighted.trigger('mouseup'); }); container.on('results:select', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } var data = Utils.GetData($highlighted[0], 'data'); if ($highlighted.hasClass('select2-results__option--selected')) { self.trigger('close', {}); } else { self.trigger('select', { data: data }); } }); container.on('results:previous', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('.select2-results__option--selectable'); var currentIndex = $options.index($highlighted); // If we are already at the top, don't move further // If no options, currentIndex will be -1 if (currentIndex <= 0) { return; } var nextIndex = currentIndex - 1; // If none are highlighted, highlight the first if ($highlighted.length === 0) { nextIndex = 0; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top; var nextTop = $next.offset().top; var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextTop - currentOffset < 0) { self.$results.scrollTop(nextOffset); } }); container.on('results:next', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('.select2-results__option--selectable'); var currentIndex = $options.index($highlighted); var nextIndex = currentIndex + 1; // If we are at the last option, stay there if (nextIndex >= $options.length) { return; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var nextBottom = $next.offset().top + $next.outerHeight(false); var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextBottom > currentOffset) { self.$results.scrollTop(nextOffset); } }); container.on('results:focus', function (params) { params.element[0].classList.add('select2-results__option--highlighted'); params.element[0].setAttribute('aria-selected', 'true'); }); container.on('results:message', function (params) { self.displayMessage(params); }); if ($.fn.mousewheel) { this.$results.on('mousewheel', function (e) { var top = self.$results.scrollTop(); var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); if (isAtTop) { self.$results.scrollTop(0); e.preventDefault(); e.stopPropagation(); } else if (isAtBottom) { self.$results.scrollTop( self.$results.get(0).scrollHeight - self.$results.height() ); e.preventDefault(); e.stopPropagation(); } }); } this.$results.on('mouseup', '.select2-results__option--selectable', function (evt) { var $this = $(this); var data = Utils.GetData(this, 'data'); if ($this.hasClass('select2-results__option--selected')) { if (self.options.get('multiple')) { self.trigger('unselect', { originalEvent: evt, data: data }); } else { self.trigger('close', {}); } return; } self.trigger('select', { originalEvent: evt, data: data }); }); this.$results.on('mouseenter', '.select2-results__option--selectable', function (evt) { var data = Utils.GetData(this, 'data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted') .attr('aria-selected', 'false'); self.trigger('results:focus', { data: data, element: $(this) }); }); }; Results.prototype.getHighlightedResults = function () { var $highlighted = this.$results .find('.select2-results__option--highlighted'); return $highlighted; }; Results.prototype.destroy = function () { this.$results.remove(); }; Results.prototype.ensureHighlightVisible = function () { var $highlighted = this.getHighlightedResults(); if ($highlighted.length === 0) { return; } var $options = this.$results.find('.select2-results__option--selectable'); var currentIndex = $options.index($highlighted); var currentOffset = this.$results.offset().top; var nextTop = $highlighted.offset().top; var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); var offsetDelta = nextTop - currentOffset; nextOffset -= $highlighted.outerHeight(false) * 2; if (currentIndex <= 2) { this.$results.scrollTop(0); } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { this.$results.scrollTop(nextOffset); } }; Results.prototype.template = function (result, container) { var template = this.options.get('templateResult'); var escapeMarkup = this.options.get('escapeMarkup'); var content = template(result, container); if (content == null) { container.style.display = 'none'; } else if (typeof content === 'string') { container.innerHTML = escapeMarkup(content); } else { $(container).append(content); } }; return Results; }); S2.define('select2/keys',[ ], function () { var KEYS = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }; return KEYS; }); S2.define('select2/selection/base',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function BaseSelection ($element, options) { this.$element = $element; this.options = options; BaseSelection.__super__.constructor.call(this); } Utils.Extend(BaseSelection, Utils.Observable); BaseSelection.prototype.render = function () { var $selection = $( '' ); this._tabindex = 0; if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); $selection.attr('aria-disabled', 'false'); this.$selection = $selection; return $selection; }; BaseSelection.prototype.bind = function (container, $container) { var self = this; var resultsId = container.id + '-results'; this.container = container; this.$selection.on('focus', function (evt) { self.trigger('focus', evt); }); this.$selection.on('blur', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', function (evt) { self.trigger('keypress', evt); if (evt.which === KEYS.SPACE) { evt.preventDefault(); } }); container.on('results:focus', function (params) { self.$selection.attr('aria-activedescendant', params.data._resultId); }); container.on('selection:update', function (params) { self.update(params.data); }); container.on('open', function () { // When the dropdown is open, aria-expanded="true" self.$selection.attr('aria-expanded', 'true'); self.$selection.attr('aria-owns', resultsId); self._attachCloseHandler(container); }); container.on('close', function () { // When the dropdown is closed, aria-expanded="false" self.$selection.attr('aria-expanded', 'false'); self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); self.$selection.trigger('focus'); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); self.$selection.attr('aria-disabled', 'false'); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); self.$selection.attr('aria-disabled', 'true'); }); }; BaseSelection.prototype._handleBlur = function (evt) { var self = this; // This needs to be delayed as the active element is the body when the tab // key is pressed, possibly along with others. window.setTimeout(function () { // Don't trigger `blur` if the focus is still in the selection if ( (document.activeElement == self.$selection[0]) || ($.contains(self.$selection[0], document.activeElement)) ) { return; } self.trigger('blur', evt); }, 1); }; BaseSelection.prototype._attachCloseHandler = function (container) { $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); var $select = $target.closest('.select2'); var $all = $('.select2.select2-container--open'); $all.each(function () { if (this == $select[0]) { return; } var $element = Utils.GetData(this, 'element'); $element.select2('close'); }); }); }; BaseSelection.prototype._detachCloseHandler = function (container) { $(document.body).off('mousedown.select2.' + container.id); }; BaseSelection.prototype.position = function ($selection, $container) { var $selectionContainer = $container.find('.selection'); $selectionContainer.append($selection); }; BaseSelection.prototype.destroy = function () { this._detachCloseHandler(this.container); }; BaseSelection.prototype.update = function (data) { throw new Error('The `update` method must be defined in child classes.'); }; /** * Helper method to abstract the "enabled" (not "disabled") state of this * object. * * @return {true} if the instance is not disabled. * @return {false} if the instance is disabled. */ BaseSelection.prototype.isEnabled = function () { return !this.isDisabled(); }; /** * Helper method to abstract the "disabled" state of this object. * * @return {true} if the disabled option is true. * @return {false} if the disabled option is false. */ BaseSelection.prototype.isDisabled = function () { return this.options.get('disabled'); }; return BaseSelection; }); S2.define('select2/selection/single',[ 'jquery', './base', '../utils', '../keys' ], function ($, BaseSelection, Utils, KEYS) { function SingleSelection () { SingleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(SingleSelection, BaseSelection); SingleSelection.prototype.render = function () { var $selection = SingleSelection.__super__.render.call(this); $selection[0].classList.add('select2-selection--single'); $selection.html( '' + '' + '' + '' ); return $selection; }; SingleSelection.prototype.bind = function (container, $container) { var self = this; SingleSelection.__super__.bind.apply(this, arguments); var id = container.id + '-container'; this.$selection.find('.select2-selection__rendered') .attr('id', id) .attr('role', 'textbox') .attr('aria-readonly', 'true'); this.$selection.attr('aria-labelledby', id); this.$selection.attr('aria-controls', id); this.$selection.on('mousedown', function (evt) { // Only respond to left clicks if (evt.which !== 1) { return; } self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on('focus', function (evt) { // User focuses on the container }); this.$selection.on('blur', function (evt) { // User exits the container }); container.on('focus', function (evt) { if (!container.isOpen()) { self.$selection.trigger('focus'); } }); }; SingleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); // clear tooltip on empty }; SingleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; SingleSelection.prototype.selectionContainer = function () { return $(''); }; SingleSelection.prototype.update = function (data) { if (data.length === 0) { this.clear(); return; } var selection = data[0]; var $rendered = this.$selection.find('.select2-selection__rendered'); var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); var title = selection.title || selection.text; if (title) { $rendered.attr('title', title); } else { $rendered.removeAttr('title'); } }; return SingleSelection; }); S2.define('select2/selection/multiple',[ 'jquery', './base', '../utils' ], function ($, BaseSelection, Utils) { function MultipleSelection ($element, options) { MultipleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(MultipleSelection, BaseSelection); MultipleSelection.prototype.render = function () { var $selection = MultipleSelection.__super__.render.call(this); $selection[0].classList.add('select2-selection--multiple'); $selection.html( '
            ' ); return $selection; }; MultipleSelection.prototype.bind = function (container, $container) { var self = this; MultipleSelection.__super__.bind.apply(this, arguments); var id = container.id + '-container'; this.$selection.find('.select2-selection__rendered').attr('id', id); this.$selection.on('click', function (evt) { self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on( 'click', '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled if (self.isDisabled()) { return; } var $remove = $(this); var $selection = $remove.parent(); var data = Utils.GetData($selection[0], 'data'); self.trigger('unselect', { originalEvent: evt, data: data }); } ); this.$selection.on( 'keydown', '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled if (self.isDisabled()) { return; } evt.stopPropagation(); } ); }; MultipleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); }; MultipleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; MultipleSelection.prototype.selectionContainer = function () { var $container = $( '
          • ' + '' + '' + '
          • ' ); return $container; }; MultipleSelection.prototype.update = function (data) { this.clear(); if (data.length === 0) { return; } var $selections = []; var selectionIdPrefix = this.$selection.find('.select2-selection__rendered') .attr('id') + '-choice-'; for (var d = 0; d < data.length; d++) { var selection = data[d]; var $selection = this.selectionContainer(); var formatted = this.display(selection, $selection); var selectionId = selectionIdPrefix + Utils.generateChars(4) + '-'; if (selection.id) { selectionId += selection.id; } else { selectionId += Utils.generateChars(4); } $selection.find('.select2-selection__choice__display') .append(formatted) .attr('id', selectionId); var title = selection.title || selection.text; if (title) { $selection.attr('title', title); } var removeItem = this.options.get('translations').get('removeItem'); var $remove = $selection.find('.select2-selection__choice__remove'); $remove.attr('title', removeItem()); $remove.attr('aria-label', removeItem()); $remove.attr('aria-describedby', selectionId); Utils.StoreData($selection[0], 'data', selection); $selections.push($selection); } var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.append($selections); }; return MultipleSelection; }); S2.define('select2/selection/placeholder',[ ], function () { function Placeholder (decorated, $element, options) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options); } Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { var $placeholder = this.selectionContainer(); $placeholder.html(this.display(placeholder)); $placeholder[0].classList.add('select2-selection__placeholder'); $placeholder[0].classList.remove('select2-selection__choice'); var placeholderTitle = placeholder.title || placeholder.text || $placeholder.text(); this.$selection.find('.select2-selection__rendered').attr( 'title', placeholderTitle ); return $placeholder; }; Placeholder.prototype.update = function (decorated, data) { var singlePlaceholder = ( data.length == 1 && data[0].id != this.placeholder.id ); var multipleSelections = data.length > 1; if (multipleSelections || singlePlaceholder) { return decorated.call(this, data); } this.clear(); var $placeholder = this.createPlaceholder(this.placeholder); this.$selection.find('.select2-selection__rendered').append($placeholder); }; return Placeholder; }); S2.define('select2/selection/allowClear',[ 'jquery', '../keys', '../utils' ], function ($, KEYS, Utils) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); if (this.placeholder == null) { if (this.options.get('debug') && window.console && console.error) { console.error( 'Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.' ); } } this.$selection.on('mousedown', '.select2-selection__clear', function (evt) { self._handleClear(evt); }); container.on('keypress', function (evt) { self._handleKeyboardClear(evt, container); }); }; AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled if (this.isDisabled()) { return; } var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected if ($clear.length === 0) { return; } evt.stopPropagation(); var data = Utils.GetData($clear[0], 'data'); var previousVal = this.$element.val(); this.$element.val(this.placeholder.id); var unselectData = { data: data }; this.trigger('clear', unselectData); if (unselectData.prevented) { this.$element.val(previousVal); return; } for (var d = 0; d < data.length; d++) { unselectData = { data: data[d] }; // Trigger the `unselect` event, so people can prevent it from being // cleared. this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out. if (unselectData.prevented) { this.$element.val(previousVal); return; } } this.$element.trigger('input').trigger('change'); this.trigger('toggle', {}); }; AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { if (container.isOpen()) { return; } if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { this._handleClear(evt); } }; AllowClear.prototype.update = function (decorated, data) { decorated.call(this, data); this.$selection.find('.select2-selection__clear').remove(); this.$selection[0].classList.remove('select2-selection--clearable'); if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) { return; } var selectionId = this.$selection.find('.select2-selection__rendered') .attr('id'); var removeAll = this.options.get('translations').get('removeAllItems'); var $remove = $( '' ); $remove.attr('title', removeAll()); $remove.attr('aria-label', removeAll()); $remove.attr('aria-describedby', selectionId); Utils.StoreData($remove[0], 'data', data); this.$selection.prepend($remove); this.$selection[0].classList.add('select2-selection--clearable'); }; return AllowClear; }); S2.define('select2/selection/search',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function Search (decorated, $element, options) { decorated.call(this, $element, options); } Search.prototype.render = function (decorated) { var searchLabel = this.options.get('translations').get('search'); var $search = $( '' + '' + '' ); this.$searchContainer = $search; this.$search = $search.find('textarea'); this.$search.prop('autocomplete', this.options.get('autocomplete')); this.$search.attr('aria-label', searchLabel()); var $rendered = decorated.call(this); this._transferTabIndex(); $rendered.append(this.$searchContainer); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; var resultsId = container.id + '-results'; var selectionId = container.id + '-container'; decorated.call(this, container, $container); self.$search.attr('aria-describedby', selectionId); container.on('open', function () { self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.resizeSearch(); self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { if (params.data._resultId) { self.$search.attr('aria-activedescendant', params.data._resultId); } else { self.$search.removeAttr('aria-activedescendant'); } }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$selection .find('.select2-selection__choice').last(); if ($previousChoice.length > 0) { var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); this.$selection.on('click', '.select2-search--inline', function (evt) { if (self.$search.val()) { evt.stopPropagation(); } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.resizeSearch(); if (searchHadFocus) { this.$search.trigger('focus'); } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = '100%'; if (this.$search.attr('placeholder') === '') { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/selectionCss',[ '../utils' ], function (Utils) { function SelectionCSS () { } SelectionCSS.prototype.render = function (decorated) { var $selection = decorated.call(this); var selectionCssClass = this.options.get('selectionCssClass') || ''; if (selectionCssClass.indexOf(':all:') !== -1) { selectionCssClass = selectionCssClass.replace(':all:', ''); Utils.copyNonInternalCssClasses($selection[0], this.$element[0]); } $selection.addClass(selectionCssClass); return $selection; }; return SelectionCSS; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting', 'clear', 'clearing' ]; var preventableEvents = [ 'opening', 'closing', 'selecting', 'unselecting', 'clearing' ]; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if (relayEvents.indexOf(name) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if (preventableEvents.indexOf(name) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u0152': 'OE', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u0153': 'oe', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03CE': '\u03C9', '\u03C2': '\u03C3', '\u2019': '\'' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var self = this; var data = Array.prototype.map.call( this.$element[0].querySelectorAll(':checked'), function (selectedElement) { return self.item($(selectedElement)); } ); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ( data.element != null && data.element.tagName.toLowerCase() === 'option' ) { data.element.selected = true; this.$element.trigger('input').trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if (val.indexOf(id) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('input').trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('input').trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ( data.element != null && data.element.tagName.toLowerCase() === 'option' ) { data.element.selected = false; this.$element.trigger('input').trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && val.indexOf(id) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('input').trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 Utils.RemoveData(this); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { if ( this.tagName.toLowerCase() !== 'option' && this.tagName.toLowerCase() !== 'optgroup' ) { return; } var $option = $(this); var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { this.$element.append($options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id !== undefined) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data Utils.StoreData(option, 'data', normalizedData); return $(option); }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = Utils.GetData($option[0], 'data'); if (data != null) { return data; } var option = $option[0]; if (option.tagName.toLowerCase() === 'option') { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if (option.tagName.toLowerCase() === 'optgroup') { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (item !== Object(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { this._dataToConvert = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.bind = function (container, $container) { ArrayAdapter.__super__.bind.call(this, container, $container); this.addOptions(this.convertToOptions(this._dataToConvert)); }; ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if (existingIds.indexOf(item.id) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); $option.append($children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if (typeof this._request.abort === 'function') { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !Array.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property if ('status' in $request && ($request.status === 0 || $request.status === '0')) { return; } self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term != null) { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if (Array.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var optionText = (option.text || '').toUpperCase(); var paramsTerm = (params.term || '').toUpperCase(); var checkText = optionText === paramsTerm; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', 'true'); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { if (params.term == null) { return null; } var term = params.term.trim(); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function createAndSelect (data) { // Normalize the data object so we can use it for checks var item = self._normalizeItem(data); // Check if the data object already exists as a tag // Select it if it doesn't var $existingOptions = self.$element.find('option').filter(function () { return $(this).val() === item.id; }); // If an existing option wasn't found for it, create the option if (!$existingOptions.length) { var $option = self.option(item); $option.attr('data-select2-tag', true); self._removeOldTags(); self.addOptions([$option]); } // Select the item, now that we know there is an option for it select(item); } function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, createAndSelect); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.trigger('focus'); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if (separators.indexOf(termChar) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function () { self._checkIfMaximumSelected(); }); }; MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this._checkIfMaximumSelected(function () { decorated.call(self, params, callback); }); }; MaximumSelectionLength.prototype._checkIfMaximumSelected = function (_, successCallback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } if (successCallback) { successCallback(); } }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '' + '' + '' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implemented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery' ], function ($) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var searchLabel = this.options.get('translations').get('search'); var $search = $( '' + '' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); this.$search.prop('autocomplete', this.options.get('autocomplete')); this.$search.attr('aria-label', searchLabel()); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; var resultsId = container.id + '-results'; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); window.setTimeout(function () { self.$search.trigger('focus'); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.val(''); self.$search.trigger('blur'); }); container.on('focus', function () { if (!container.isOpen()) { self.$search.trigger('focus'); } }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer[0].classList.remove('select2-search--hide'); } else { self.$searchContainer[0].classList.add('select2-search--hide'); } } }); container.on('results:focus', function (params) { if (params.data._resultId) { self.$search.attr('aria-activedescendant', params.data._resultId); } else { self.$search.removeAttr('aria-activedescendant'); } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); this.loadMoreIfNeeded(); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); }; InfiniteScroll.prototype.loadMoreIfNeeded = function () { var isLoadMoreVisible = $.contains( document.documentElement, this.$loadingMore[0] ); if (this.loading || !isLoadMoreVisible) { return; } var currentOffset = this.$results.offset().top + this.$results.outerHeight(false); var loadingMoreOffset = this.$loadingMore.offset().top + this.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { this.loadMore(); } }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '
          • ' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = $(options.get('dropdownParent') || document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); // Must bind after the results handlers to ensure correct sizing self._bindContainerResultHandlers(container); }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown[0].classList.remove('select2'); $dropdown[0].classList.add('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $(''); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._bindContainerResultHandlers = function (decorated, container) { // These should only be bound once if (this._containerResultsHandlersBound) { return; } var self = this; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:message', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('select', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('unselect', function () { self._positionDropdown(); self._resizeDropdown(); }); this._containerResultsHandlersBound = true; }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown[0].classList .contains('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown[0].classList .contains('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calculating the offset var $offsetParent = this.$dropdownParent; // For statically positioned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = { top: 0, left: 0 }; if ( $.contains(document.body, $offsetParent[0]) || $offsetParent[0].isConnected ) { parentOffset = $offsetParent.offset(); } css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - parentOffset.top - dropdown.height; } if (newDirection != null) { this.$dropdown[0].classList.remove('select2-dropdown--below'); this.$dropdown[0].classList.remove('select2-dropdown--above'); this.$dropdown[0].classList.add('select2-dropdown--' + newDirection); this.$container[0].classList.remove('select2-container--below'); this.$container[0].classList.remove('select2-container--above'); this.$container[0].classList.add('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.position = 'relative'; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ '../utils' ], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function (params) { self._handleSelectOnClose(params); }); }; SelectOnClose.prototype._handleSelectOnClose = function (_, params) { if (params && params.originalSelect2Event != null) { var event = params.originalSelect2Event; // Don't select an item if the close event was triggered from a select or // unselect event if (event._type === 'select' || event._type === 'unselect') { return; } } var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { return; } this.trigger('close', { originalEvent: originalEvent, originalSelect2Event: evt }); }; return CloseOnSelect; }); S2.define('select2/dropdown/dropdownCss',[ '../utils' ], function (Utils) { function DropdownCSS () { } DropdownCSS.prototype.render = function (decorated) { var $dropdown = decorated.call(this); var dropdownCssClass = this.options.get('dropdownCssClass') || ''; if (dropdownCssClass.indexOf(':all:') !== -1) { dropdownCssClass = dropdownCssClass.replace(':all:', ''); Utils.copyNonInternalCssClasses($dropdown[0], this.$element[0]); } $dropdown.addClass(dropdownCssClass); return $dropdown; }; return DropdownCSS; }); S2.define('select2/dropdown/tagsSearchHighlight',[ '../utils' ], function (Utils) { function TagsSearchHighlight () { } TagsSearchHighlight.prototype.highlightFirstItem = function (decorated) { var $options = this.$results .find( '.select2-results__option--selectable' + ':not(.select2-results__option--selected)' ); if ($options.length > 0) { var $firstOption = $options.first(); var data = Utils.GetData($firstOption[0], 'data'); var firstElement = data.element; if (firstElement && firstElement.getAttribute) { if (firstElement.getAttribute('data-select2-tag') === 'true') { $firstOption.trigger('mouseenter'); return; } } } decorated.call(this); }; return TagsSearchHighlight; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; }, removeAllItems: function () { return 'Remove all items'; }, removeItem: function () { return 'Remove item'; }, search: function() { return 'Search'; } }; }); S2.define('select2/defaults',[ 'jquery', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/selectionCss', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './dropdown/dropdownCss', './dropdown/tagsSearchHighlight', './i18n/en' ], function ($, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, SelectionCSS, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, DropdownCSS, TagsSearchHighlight, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } if (options.tags) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, TagsSearchHighlight ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if (options.dropdownCssClass != null) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if (options.selectionCssClass != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } // If the defaults were not previously applied from an element, it is // possible for the language option to have not been resolved options.language = this._resolveLanguage(options.language); // Always fall back to English since it will always be complete options.language.push('en'); var uniqueLanguages = []; for (var l = 0; l < options.language.length; l++) { var language = options.language[l]; if (uniqueLanguages.indexOf(language) === -1) { uniqueLanguages.push(language); } } options.language = uniqueLanguages; options.translations = this._processTranslations( options.language, options.debug ); return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if (params.term == null || params.term.trim() === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdLanguageBase: './i18n/', autocomplete: 'off', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: {}, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, scrollAfterSelect: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.applyFromElement = function (options, $element) { var optionLanguage = options.language; var defaultLanguage = this.defaults.language; var elementLanguage = $element.prop('lang'); var parentLanguage = $element.closest('[lang]').prop('lang'); var languages = Array.prototype.concat.call( this._resolveLanguage(elementLanguage), this._resolveLanguage(optionLanguage), this._resolveLanguage(defaultLanguage), this._resolveLanguage(parentLanguage) ); options.language = languages; return options; }; Defaults.prototype._resolveLanguage = function (language) { if (!language) { return []; } if ($.isEmptyObject(language)) { return []; } if ($.isPlainObject(language)) { return [language]; } var languages; if (!Array.isArray(language)) { languages = [language]; } else { languages = language; } var resolvedLanguages = []; for (var l = 0; l < languages.length; l++) { resolvedLanguages.push(languages[l]); if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { // Extract the region information if it is included var languageParts = languages[l].split('-'); var baseLanguage = languageParts[0]; resolvedLanguages.push(baseLanguage); } } return resolvedLanguages; }; Defaults.prototype._processTranslations = function (languages, debug) { var translations = new Translation(); for (var l = 0; l < languages.length; l++) { var languageData = new Translation(); var language = languages[l]; if (typeof language === 'string') { try { // Try to load it with the original name languageData = Translation.loadPath(language); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path language = this.defaults.amdLanguageBase + language; languageData = Translation.loadPath(language); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files if (debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + language + '" could ' + 'not be automatically loaded. A fallback will be used instead.' ); } } } } else if ($.isPlainObject(language)) { languageData = new Translation(language); } else { languageData = language; } translations.extend(languageData); } return translations; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'jquery', './defaults', './utils' ], function ($, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } if ($element != null) { this.options = Defaults.applyFromElement(this.options, $element); } this.options = Defaults.apply(this.options); } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.autocomplete == null && $e.prop('autocomplete')) { this.options.autocomplete = $e.prop('autocomplete'); } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); Utils.StoreData($e[0], 'tags', true); } if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; function upperCaseLetter(_, letter) { return letter.toUpperCase(); } // Pre-load all of the attributes which are prefixed with `data-` for (var attr = 0; attr < $e[0].attributes.length; attr++) { var attributeName = $e[0].attributes[attr].name; var prefix = 'data-'; if (attributeName.substr(0, prefix.length) == prefix) { // Get the contents of the attribute after `data-` var dataName = attributeName.substring(prefix.length); // Get the data contents from the consistent source // This is more than likely the jQuery data helper var dataValue = Utils.GetData($e[0], dataName); // camelCase the attribute name to match the spec var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); // Store the data attribute contents into the dataset since dataset[camelDataName] = dataValue; } } // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, dataset); } // Prefer our internal data cache if it exists var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); data = Utils._convertData(data); for (var key in data) { if (excludedData.indexOf(key) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if (Utils.GetData($element[0], 'select2') != null) { Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element[0].classList.add('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); Utils.StoreData($element[0], 'select2', this); // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } if (method == 'computedstyle') { var computedStyle = window.getComputedStyle($element[0]); return computedStyle.width; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this.$element.on('focus.select2', function (evt) { self.trigger('focus', evt); }); this._syncA = Utils.bind(this._syncAttributes, this); this._syncS = Utils.bind(this._syncSubtree, this); this._observer = new window.MutationObserver(function (mutations) { self._syncA(); self._syncS(mutations); }); this._observer.observe(this.$element[0], { attributes: true, childList: true, subtree: false }); }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if (nonRelayEvents.indexOf(name) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container[0].classList.add('select2-container--open'); }); this.on('close', function () { self.$container[0].classList.remove('select2-container--open'); }); this.on('enable', function () { self.$container[0].classList.remove('select2-container--disabled'); }); this.on('disable', function () { self.$container[0].classList.add('select2-container--disabled'); }); this.on('blur', function () { self.$container[0].classList.remove('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || (key === KEYS.UP && evt.altKey)) { self.close(evt); evt.preventDefault(); } else if (key === KEYS.ENTER || key === KEYS.TAB) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.isDisabled()) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; Select2.prototype._isChangeMutation = function (mutations) { var self = this; if (mutations.addedNodes && mutations.addedNodes.length > 0) { for (var n = 0; n < mutations.addedNodes.length; n++) { var node = mutations.addedNodes[n]; if (node.selected) { return true; } } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { return true; } else if (Array.isArray(mutations)) { return mutations.some(function (mutation) { return self._isChangeMutation(mutation); }); } return false; }; Select2.prototype._syncSubtree = function (mutations) { var changed = this._isChangeMutation(mutations); var self = this; // Only re-pull the data if we think there is a change if (changed) { this.dataAdapter.current(function (currentData) { self.trigger('selection:update', { data: currentData }); }); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting', 'clear': 'clearing' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.isDisabled()) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } if (this.isDisabled()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function (evt) { if (!this.isOpen()) { return; } this.trigger('close', { originalEvent : evt }); }; /** * Helper method to abstract the "enabled" (not "disabled") state of this * object. * * @return {true} if the instance is not disabled. * @return {false} if the instance is disabled. */ Select2.prototype.isEnabled = function () { return !this.isDisabled(); }; /** * Helper method to abstract the "disabled" state of this object. * * @return {true} if the disabled option is true. * @return {false} if the disabled option is false. */ Select2.prototype.isDisabled = function () { return this.options.get('disabled'); }; Select2.prototype.isOpen = function () { return this.$container[0].classList.contains('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container[0].classList.contains('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container[0].classList.add('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if (Array.isArray(newVal)) { newVal = newVal.map(function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('input').trigger('change'); }; Select2.prototype.destroy = function () { Utils.RemoveData(this.$container[0]); this.$container.remove(); this._observer.disconnect(); this._observer = null; this._syncA = null; this._syncS = null; this.$element.off('.select2'); this.$element.attr('tabindex', Utils.GetData(this.$element[0], 'old-tabindex')); this.$element[0].classList.remove('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '' + '' + '' + '' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container[0].classList .add('select2-container--' + this.options.get('theme')); Utils.StoreData($container[0], 'element', this.$element); return $container; }; return Select2; }); S2.define('jquery-mousewheel',[ 'jquery' ], function ($) { // Used to shim jQuery.mousewheel for non-full builds. return $; }); S2.define('jquery.select2',[ 'jquery', 'jquery-mousewheel', './select2/core', './select2/defaults', './select2/utils' ], function ($, _, Select2, Defaults, Utils) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; $.fn.select2 = function (options) { options = options || {}; if (typeof options === 'object') { this.each(function () { var instanceOptions = $.extend(true, {}, options); var instance = new Select2($(this), instanceOptions); }); return this; } else if (typeof options === 'string') { var ret; var args = Array.prototype.slice.call(arguments, 1); this.each(function () { var instance = Utils.GetData(this, 'select2'); if (instance == null && window.console && console.error) { console.error( 'The select2(\'' + options + '\') method was called on an ' + 'element that is not using Select2.' ); } ret = instance[options].apply(instance, args); }); // Check if we should be returning `this` if (thisMethods.indexOf(options) > -1) { return this; } return ret; } else { throw new Error('Invalid arguments for Select2: ' + options); } }; } if ($.fn.select2.defaults == null) { $.fn.select2.defaults = Defaults; } return Select2; }); // Return the AMD loader configuration so it can be used outside of this file return { define: S2.define, require: S2.require }; }()); // Autoload the jQuery bindings // We know that all of the modules exist above this, so we're safe var select2 = S2.require('jquery.select2'); // Hold the AMD module references on the jQuery function that was just loaded // This allows Select2 to use the internal loader outside of this file, such // as in the language files. jQuery.fn.select2.amd = S2; // Return the Select2 instance for anyone who is importing it. return select2; })); PKxL\T??,updraftplus/includes/select2/select2.min.cssnu[.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline;list-style:none;padding:0}.select2-container .select2-selection--multiple .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;margin-left:5px;padding:0;max-width:100%;resize:none;height:18px;vertical-align:bottom;font-family:sans-serif;overflow:hidden;word-break:keep-all}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option--selectable{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px;padding-right:0px}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;padding-bottom:5px;padding-right:5px;position:relative}.select2-container--default .select2-selection--multiple.select2-selection--clearable{padding-right:25px}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;font-weight:bold;height:20px;margin-right:10px;margin-top:5px;position:absolute;right:0;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:inline-block;margin-left:5px;margin-top:5px;padding:0;padding-left:20px;position:relative;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;white-space:nowrap}.select2-container--default .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-right:1px solid #aaa;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#999;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px;position:absolute;left:0;top:0}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover,.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus{background-color:#f1f1f1;color:#333;outline:none}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-left:1px solid #aaa;border-right:none;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__clear{float:left;margin-left:10px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--group{padding:0}.select2-container--default .select2-results__option--disabled{color:#999}.select2-container--default .select2-results__option--selected{background-color:#ddd}.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;padding-bottom:5px;padding-right:5px}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;display:inline-block;margin-left:5px;margin-top:5px;padding:0}.select2-container--classic .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#888;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;outline:none}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option--group{padding:0}.select2-container--classic .select2-results__option--disabled{color:grey}.select2-container--classic .select2-results__option--highlighted.select2-results__option--selectable{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} PKxL\\+updraftplus/includes/select2/select2.min.jsnu[/*! Select2 4.1.0-rc.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(t){var e,n,s,p,r,o,h,f,g,m,y,v,i,a,_,s=((u=t&&t.fn&&t.fn.select2&&t.fn.select2.amd?t.fn.select2.amd:u)&&u.requirejs||(u?n=u:u={},g={},m={},y={},v={},i=Object.prototype.hasOwnProperty,a=[].slice,_=/\.js$/,h=function(e,t){var n,s,i=c(e),r=i[0],t=t[1];return e=i[1],r&&(n=x(r=l(r,t))),r?e=n&&n.normalize?n.normalize(e,(s=t,function(e){return l(e,s)})):l(e,t):(r=(i=c(e=l(e,t)))[0],e=i[1],r&&(n=x(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},f={require:function(e){return w(e)},exports:function(e){var t=g[e];return void 0!==t?t:g[e]={}},module:function(e){return{id:e,uri:"",exports:g[e],config:(t=e,function(){return y&&y.config&&y.config[t]||{}})};var t}},r=function(e,t,n,s){var i,r,o,a,l,c=[],u=typeof n,d=A(s=s||e);if("undefined"==u||"function"==u){for(t=!t.length&&n.length?["require","exports","module"]:t,a=0;a":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},s.__cache={};var n=0;return s.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null!=t||(t=e.id?"select2-data-"+e.id:"select2-data-"+(++n).toString()+"-"+s.generateChars(4),e.setAttribute("data-select2-id",t)),t},s.StoreData=function(e,t,n){e=s.GetUniqueElementId(e);s.__cache[e]||(s.__cache[e]={}),s.__cache[e][t]=n},s.GetData=function(e,t){var n=s.GetUniqueElementId(e);return t?s.__cache[n]&&null!=s.__cache[n][t]?s.__cache[n][t]:r(e).data(t):s.__cache[n]},s.RemoveData=function(e){var t=s.GetUniqueElementId(e);null!=s.__cache[t]&&delete s.__cache[t],e.removeAttribute("data-select2-id")},s.copyNonInternalCssClasses=function(e,t){var n=(n=e.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0===e.indexOf("select2-")}),t=(t=t.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0!==e.indexOf("select2-")}),t=n.concat(t);e.setAttribute("class",t.join(" "))},s}),u.define("select2/results",["jquery","./utils"],function(d,p){function s(e,t,n){this.$element=e,this.data=n,this.options=t,s.__super__.constructor.call(this)}return p.Extend(s,p.Observable),s.prototype.render=function(){var e=d('
              ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},s.prototype.clear=function(){this.$results.empty()},s.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=d(''),s=this.options.get("translations").get(e.message);n.append(t(s(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},s.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},s.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested",role:"none"});i.append(l),o.append(a),o.append(i)}else this.template(e,t);return p.StoreData(t,"data",e),t},s.prototype.bind=function(t,e){var i=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("results:append",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on("query",function(e){i.hideMessages(),i.showLoading(e)}),t.on("select",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("open",function(){i.$results.attr("aria-expanded","true"),i.$results.attr("aria-hidden","false"),i.setClasses(),i.ensureHighlightVisible()}),t.on("close",function(){i.$results.attr("aria-expanded","false"),i.$results.attr("aria-hidden","true"),i.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e,t=i.getHighlightedResults();0!==t.length&&(e=p.GetData(t[0],"data"),t.hasClass("select2-results__option--selected")?i.trigger("close",{}):i.trigger("select",{data:e}))}),t.on("results:previous",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t);s<=0||(e=s-1,0===t.length&&(e=0),(s=n.eq(e)).trigger("mouseenter"),t=i.$results.offset().top,n=s.offset().top,s=i.$results.scrollTop()+(n-t),0===e?i.$results.scrollTop(0):n-t<0&&i.$results.scrollTop(s))}),t.on("results:next",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t)+1;s>=n.length||((e=n.eq(s)).trigger("mouseenter"),t=i.$results.offset().top+i.$results.outerHeight(!1),n=e.offset().top+e.outerHeight(!1),e=i.$results.scrollTop()+n-t,0===s?i.$results.scrollTop(0):tthis.$results.outerHeight()||s<0)&&this.$results.scrollTop(n))},s.prototype.template=function(e,t){var n=this.options.get("templateResult"),s=this.options.get("escapeMarkup"),e=n(e,t);null==e?t.style.display="none":"string"==typeof e?t.innerHTML=s(e):d(t).append(e)},s}),u.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),u.define("select2/selection/base",["jquery","../utils","../keys"],function(n,s,i){function r(e,t){this.$element=e,this.options=t,r.__super__.constructor.call(this)}return s.Extend(r,s.Observable),r.prototype.render=function(){var e=n('');return this._tabindex=0,null!=s.GetData(this.$element[0],"old-tabindex")?this._tabindex=s.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},r.prototype.bind=function(e,t){var n=this,s=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",s),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},r.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},r.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&s.GetData(this,"element").select2("close")})})},r.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},r.prototype.position=function(e,t){t.find(".selection").append(e)},r.prototype.destroy=function(){this._detachCloseHandler(this.container)},r.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},r.prototype.isEnabled=function(){return!this.isDisabled()},r.prototype.isDisabled=function(){return this.options.get("disabled")},r}),u.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,s){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e[0].classList.add("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var s=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",s),this.$selection.attr("aria-controls",s),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){var t,n;0!==e.length?(n=e[0],t=this.$selection.find(".select2-selection__rendered"),e=this.display(n,t),t.empty().append(e),(n=n.title||n.text)?t.attr("title",n):t.removeAttr("title")):this.clear()},i}),u.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,c){function r(e,t){r.__super__.constructor.apply(this,arguments)}return c.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e[0].classList.add("select2-selection--multiple"),e.html('
                '),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var s=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s),this.$selection.on("click",function(e){n.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){var t;n.isDisabled()||(t=i(this).parent(),t=c.GetData(t[0],"data"),n.trigger("unselect",{originalEvent:e,data:t}))}),this.$selection.on("keydown",".select2-selection__choice__remove",function(e){n.isDisabled()||e.stopPropagation()})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return i('
              • ')},r.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=this.$selection.find(".select2-selection__rendered").attr("id")+"-choice-",s=0;s')).attr("title",s()),e.attr("aria-label",s()),e.attr("aria-describedby",n),a.StoreData(e[0],"data",t),this.$selection.prepend(e),this.$selection[0].classList.add("select2-selection--clearable"))},e}),u.define("select2/selection/search",["jquery","../utils","../keys"],function(s,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=this.options.get("translations").get("search"),n=s('');this.$searchContainer=n,this.$search=n.find("textarea"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",t());e=e.call(this);return this._transferTabIndex(),e.append(this.$searchContainer),e},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results",r=t.id+"-container";e.call(this,t,n),s.$search.attr("aria-describedby",r),t.on("open",function(){s.$search.attr("aria-controls",i),s.$search.trigger("focus")}),t.on("close",function(){s.$search.val(""),s.resizeSearch(),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.trigger("focus")}),t.on("enable",function(){s.$search.prop("disabled",!1),s._transferTabIndex()}),t.on("disable",function(){s.$search.prop("disabled",!0)}),t.on("focus",function(e){s.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){s.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){s._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){var t;e.stopPropagation(),s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented(),e.which!==l.BACKSPACE||""!==s.$search.val()||0<(t=s.$selection.find(".select2-selection__choice").last()).length&&(t=a.GetData(t[0],"data"),s.searchRemoveChoice(t),e.preventDefault())}),this.$selection.on("click",".select2-search--inline",function(e){s.$search.val()&&e.stopPropagation()});var t=document.documentMode,o=t&&t<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){o?s.$selection.off("input.search input.searchcheck"):s.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){var t;o&&"input"===e.type?s.$selection.off("input.search input.searchcheck"):(t=e.which)!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&s.handleSearch(e)})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){var e;this.resizeSearch(),this._keyUpPrevented||(e=this.$search.val(),this.trigger("query",{term:e})),this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="100%";""===this.$search.attr("placeholder")&&(e=.75*(this.$search.val().length+1)+"em"),this.$search.css("width",e)},e}),u.define("select2/selection/selectionCss",["../utils"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get("selectionCssClass")||"";return-1!==e.indexOf(":all:")&&(e=e.replace(":all:",""),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define("select2/selection/eventRelay",["jquery"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var s=this,i=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],r=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){var n;-1!==i.indexOf(e)&&(t=t||{},n=o.Event("select2:"+e,{params:t}),s.$element.trigger(n),-1!==r.indexOf(e)&&(t.prevented=n.isDefaultPrevented()))})},e}),u.define("select2/translation",["jquery","require"],function(t,n){function s(e){this.dict=e||{}}return s.prototype.all=function(){return this.dict},s.prototype.get=function(e){return this.dict[e]},s.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},s._cache={},s.loadPath=function(e){var t;return e in s._cache||(t=n(e),s._cache[e]=t),new s(s._cache[e])},s}),u.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),u.define("select2/data/base",["../utils"],function(n){function s(e,t){s.__super__.constructor.call(this)}return n.Extend(s,n.Observable),s.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},s.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},s.prototype.bind=function(e,t){},s.prototype.destroy=function(){},s.prototype.generateResultId=function(e,t){e=e.id+"-result-";return e+=n.generateChars(4),null!=t.id?e+="-"+t.id.toString():e+="-"+n.generateChars(4),e},s}),u.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var t=this;e(Array.prototype.map.call(this.$element[0].querySelectorAll(":checked"),function(e){return t.item(l(e))}))},n.prototype.select=function(i){var e,r=this;if(i.selected=!0,null!=i.element&&"option"===i.element.tagName.toLowerCase())return i.element.selected=!0,void this.$element.trigger("input").trigger("change");this.$element.prop("multiple")?this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;nthis.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("select",function(){s._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var s=this;this._checkIfMaximumSelected(function(){e.call(s,t,n)})},e.prototype._checkIfMaximumSelected=function(e,t){var n=this;this.current(function(e){e=null!=e?e.length:0;0=n.maximumSelectionLength?n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):t&&t()})},e}),u.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),u.define("select2/dropdown/search",["jquery"],function(r){function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("translations").get("search"),e=r('');return this.$searchContainer=e,this.$search=e.find("input"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",n()),t.prepend(e),t},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){r(this).off("keyup")}),this.$search.on("keyup input",function(e){s.handleSearch(e)}),t.on("open",function(){s.$search.attr("tabindex",0),s.$search.attr("aria-controls",i),s.$search.trigger("focus"),window.setTimeout(function(){s.$search.trigger("focus")},0)}),t.on("close",function(){s.$search.attr("tabindex",-1),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.val(""),s.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||s.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(s.showSearch(e)?s.$searchContainer[0].classList.remove("select2-search--hide"):s.$searchContainer[0].classList.add("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")})},e.prototype.handleSearch=function(e){var t;this._keyUpPrevented||(t=this.$search.val(),this.trigger("query",{term:t})),this._keyUpPrevented=!1},e.prototype.showSearch=function(e,t){return!0},e}),u.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,s){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,s)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return t="string"==typeof t?{id:"",text:t}:t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),s=t.length-1;0<=s;s--){var i=t[s];this.placeholder.id===i.id&&n.splice(s,1)}return n},e}),u.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,s){this.lastParams={},e.call(this,t,n,s),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("query",function(e){s.lastParams=e,s.loading=!0}),t.on("query:append",function(e){s.lastParams=e,s.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);!this.loading&&e&&(e=this.$results.offset().top+this.$results.outerHeight(!1),this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=e+50&&this.loadMore())},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
              • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),u.define("select2/dropdown/attachBody",["jquery","../utils"],function(u,o){function e(e,t,n){this.$dropdownParent=u(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("open",function(){s._showDropdown(),s._attachPositioningHandler(t),s._bindContainerResultHandlers(t)}),t.on("close",function(){s._hideDropdown(),s._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t[0].classList.remove("select2"),t[0].classList.add("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=u(""),e=e.call(this);return t.append(e),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){var n;this._containerResultsHandlersBound||(n=this,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0)},e.prototype._attachPositioningHandler=function(e,t){var n=this,s="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id,t=this.$container.parents().filter(o.hasScroll);t.each(function(){o.StoreData(this,"select2-scroll-position",{x:u(this).scrollLeft(),y:u(this).scrollTop()})}),t.on(s,function(e){var t=o.GetData(this,"select2-scroll-position");u(this).scrollTop(t.y)}),u(window).on(s+" "+i+" "+r,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,s="resize.select2."+t.id,t="orientationchange.select2."+t.id;this.$container.parents().filter(o.hasScroll).off(n),u(window).off(n+" "+s+" "+t)},e.prototype._positionDropdown=function(){var e=u(window),t=this.$dropdown[0].classList.contains("select2-dropdown--above"),n=this.$dropdown[0].classList.contains("select2-dropdown--below"),s=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=i.top,r.bottom=i.top+r.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+o,a={left:i.left,top:r.bottom},l=this.$dropdownParent;"static"===l.css("position")&&(l=l.offsetParent());i={top:0,left:0};(u.contains(document.body,l[0])||l[0].isConnected)&&(i=l.offset()),a.top-=i.top,a.left-=i.left,t||n||(s="below"),e||!c||t?!c&&e&&t&&(s="below"):s="above",("above"==s||t&&"below"!==s)&&(a.top=r.top-i.top-o),null!=s&&(this.$dropdown[0].classList.remove("select2-dropdown--below"),this.$dropdown[0].classList.remove("select2-dropdown--above"),this.$dropdown[0].classList.add("select2-dropdown--"+s),this.$container[0].classList.remove("select2-container--below"),this.$container[0].classList.remove("select2-container--above"),this.$container[0].classList.add("select2-container--"+s)),this.$dropdownContainer.css(a)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),u.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,s){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,s)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,s=0;s');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container[0].classList.add("select2-container--"+this.options.get("theme")),r.StoreData(e[0],"element",this.$element),e},o}),u.define("jquery-mousewheel",["jquery"],function(e){return e}),u.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,r,t,o){var a;return null==i.fn.select2&&(a=["open","close","destroy"],i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new r(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=o.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,s)}),-1=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function i(){O&&document.body.removeChild(O),O=null}function n(t){var o=void 0;t===document?(o=document,t=document.documentElement):o=t.ownerDocument;var i=o.documentElement,n=e(t),r=A();return n.top-=r.top,n.left-=r.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-i.clientTop,n.left=n.left-i.clientLeft,n.right=o.body.clientWidth-n.width-n.left,n.bottom=o.body.clientHeight-n.height-n.top,n}function r(t){return t.offsetParent||document.documentElement}function s(){if(T)return T;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");a(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return T={width:n,height:n}}function a(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function f(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=d(t).replace(o," ");u(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{f(t,e);var o=d(t)+(" "+e);u(t,o)}}function h(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=d(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function d(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function u(t,e){t.setAttribute("class",e)}function p(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&h(t,o)&&f(t,o)}),e.forEach(function(e){h(t,e)||l(t,e)})}function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"object"==typeof performance&&"function"==typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i1?o-1:0),n=1;n16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||(null!=o&&(clearTimeout(o),o=null),t=m(),F(),e=m()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var Y={center:"center",left:"right",right:"left"},D={middle:"middle",top:"bottom",bottom:"top"},L={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},X=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=Y[e.left]),"auto"===i&&(i=D[e.top]),{left:o,top:i}},H=function(t){var e=t.left,o=t.top;return"undefined"!=typeof L[t.left]&&(e=L[t.left]),"undefined"!=typeof L[t.top]&&(o=L[t.top]),{left:e,top:o}},N=function(t){var e=t.split(" "),o=k(e,2),i=o[0],n=o[1];return{top:i,left:n}},R=N,U=function(e){function h(e){var o=this;t(this,h),_(Object.getPrototypeOf(h.prototype),"constructor",this).call(this),this.position=this.position.bind(this),j.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return c(h,e),w(h,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,i=arguments.length<=1||void 0===arguments[1]||arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=a(n,t);var r=this.options,s=r.element,f=r.target,h=r.targetModifier;if(this.element=s,this.target=f,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=R(this.options.targetAttachment),this.attachment=R(this.options.attachment),this.offset=N(this.options.offset),this.targetOffset=N(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=o(this.target),this.options.enabled!==!1&&this.enable(i)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return n(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=n(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;r&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;a<408&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-a);return e.top=l*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;f(this.target,this.getClass("enabled")),f(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),j.forEach(function(e,o){e===t&&j.splice(o,1)}),0===j.length&&i()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),S(function(){"undefined"!=typeof o._addAttachClasses&&(p(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&p(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=X(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return n(t.element)}),a=i.width,f=i.height;if(0===a&&0===f&&"undefined"!=typeof this.lastSize){var l=this.lastSize;a=l.width,f=l.height}else this.lastSize={width:a,height:f};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,u=y(H(this.attachment),{width:a,height:f}),p=y(H(o),d),c=y(this.offset,{width:a,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=h.left+p.left-u.left,b=h.top+p.top-u.top,w=0;wA.documentElement.clientHeight&&(P=this.cache("scrollbar-size",s),x.viewport.bottom-=P.height),T.innerWidth>A.documentElement.clientWidth&&(P=this.cache("scrollbar-size",s),x.viewport.right-=P.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(x.page.bottom=A.body.scrollHeight-b-f,x.page.right=A.body.scrollWidth-m-a),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return r(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return n(e)}),i=getComputedStyle(e),s=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-s.width+a.right,o.bottom=A.body.scrollHeight-o.top-s.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,l=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+l-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&W(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var s=!1,f=0;f=0){var p=s.split(" "),g=k(p,2);d=g[0],h=g[1]}else h=d=s;var w=b(e,n);"target"!==d&&"both"!==d||(ow[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ow[3]&&o-(f-u)>=w[1]&&(o-=f-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+f>w[3]?(o-=u,v.top="top",o-=f,y.top="bottom"):"bottom"===y.top&&ow[3]&&"top"===y.top?(o-=f,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=c,v.left="left")),"together"===h&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=c,v.left="left",i-=l,y.left="right"):"right"===y.left&&(i-=c,v.left="left",i+=l,y.left="left"):"center"===v.left&&(i+l>w[2]&&"left"===y.left?(i-=l,y.left="right"):iw[3]&&"top"===y.top&&(o-=f,y.top="bottom")),"element"!==h&&"both"!==h||(iw[2]&&("left"===y.left?(i-=l,y.left="right"):"center"===y.left&&(i-=l/2,y.left="right"))),"string"==typeof a?a=a.split(",").map(function(t){return t.trim()}):a===!0&&(a=["top","left","right","bottom"]),a=a||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+f>w[3]&&(a.indexOf("bottom")>=0?(o=w[3]-f,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+l>w[2]&&(a.indexOf("right")>=0?(i=w[2]-l,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===r.top&&v.left===r.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),S(function(){e.options.addTargetClasses!==!1&&p(e.target,m,g),p(e.element,m,g)}),{top:o,left:i}}});var z=C.Utils,n=z.getBounds,p=z.updateClasses,S=z.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,r=this.cache("element-bounds",function(){return n(e.element)}),s=r.height,a=r.width,f=this.getTargetBounds(),l=o+s,h=i+a,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var u=[],c=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&c.push(this.getClass("abutted")),d.forEach(function(t){c.push(e.getClass("abutted")+"-"+t)}),S(function(){e.options.addTargetClasses!==!1&&p(e.target,c,u),p(e.element,c,u)}),!0}});var k=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=k(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),V});PKxL\:Oll%updraftplus/includes/tether/tether.jsnu[/*! tether 1.4.7 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define([], factory); } else if (typeof exports === 'object') { module.exports = factory(); } else { root.Tether = factory(); } }(this, function() { 'use strict'; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var TetherBase = undefined; if (typeof TetherBase === 'undefined') { TetherBase = { modules: [] }; } var zeroElement = null; // Same as native getBoundingClientRect, except it takes into account parent offsets // if the element lies within a nested document ( or '); jQuery('#updraft-iframe-modal').dialog({ title: title, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { jQuery(this).dialog('option', 'width', width), jQuery(this).dialog('option', 'minHeight', 260); if (jQuery(window).height() > height) { jQuery(this).dialog('option', 'height', height); } else { jQuery(this).dialog('option', 'height', jQuery(window).height()-30); } } }).dialog('open'); } function updraft_html_modal(showwhat, title, width, height) { jQuery('#updraft-iframe-modal-innards').html(showwhat); var updraft_html_modal_buttons = {}; if (width < 450) { updraft_html_modal_buttons[updraftlion.close] = function() { jQuery(this).dialog("close"); }; } jQuery('#updraft-iframe-modal').dialog({ title: title, buttons: updraft_html_modal_buttons, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { jQuery(this).dialog('option', 'width', width), jQuery(this).dialog('option', 'minHeight', 260); if (jQuery(window).height() > height) { jQuery(this).dialog('option', 'height', height); } else { jQuery(this).dialog('option', 'height', jQuery(window).height()-30); } } }).dialog('open'); } function updraftplus_diskspace() { jQuery('#updraft-navtab-backups-content .updraft_diskspaceused').html(''+updraftlion.calculating+''); updraft_send_command('get_fragment', { fragment: 'disk_usage', data: 'updraft' }, function(response) { jQuery('#updraft-navtab-backups-content .updraft_diskspaceused').html(response.output); }, { type: 'GET' }); } var lastlog_lastmessage = ""; function updraftplus_deletefromserver(timestamp, type, findex) { if (!findex) findex=0; var pdata = { stage: 'delete', timestamp: timestamp, type: type, findex: findex }; updraft_send_command('updraft_download_backup', pdata, null, { action: 'updraft_download_backup', nonce: updraft_download_nonce, nonce_key: '_wpnonce' }); } function updraftplus_downloadstage2(timestamp, type, findex) { location.href =ajaxurl+'?_wpnonce='+updraft_download_nonce+'×tamp='+timestamp+'&type='+type+'&stage=2&findex='+findex+'&action=updraft_download_backup'; } function updraftplus_show_contents(timestamp, type, findex) { var modal_content = '

                ' + updraftlion.zip_file_contents_info + ' -

                '+updraftlion.browse_download_link+'
                '; updraft_html_modal(modal_content, updraftlion.zip_file_contents, 780, 500); zip_files_jstree('zipbrowser', timestamp, type, findex); } /** * Creates the jstree and makes a call to the backend to dynamically get the tree nodes * * @param {string} entity Entity for the jstree * @param {integer} timestamp Timestamp of the jstree * @param {string} type Type of file to display in the JS tree * @param {array} findex Index of Zip */ function zip_files_jstree(entity, timestamp, type, findex) { jQuery('#updraft_zip_files_jstree').jstree({ "core": { "multiple": false, "data": function (nodeid, callback) { updraft_send_command('get_jstree_directory_nodes', {entity:entity, node:nodeid, timestamp:timestamp, type:type, findex:findex}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else { callback.call(this, response.nodes); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft_zip_files_jstree').html('

                '+resp.fatal_error_message+'

                '); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft_zip_files_jstree').html('

                '+error_message+'

                '); console.log(error_message); alert(error_message); console.log(response); } } }); }, "error": function(error) { alert(error); console.log(error); }, }, "search": { "show_only_matches": true }, "plugins": ["search", "sort"], }); // Update modal title once tree loads jQuery('#updraft_zip_files_jstree').on('ready.jstree', function(e, data) { jQuery('#updraft-iframe-modal').dialog('option', 'title', updraftlion.zip_file_contents + ': ' + data.instance.get_node('#').children[0]) }); // Search function for jstree, this will hide nodes that don't match the search var timeout = false; jQuery('#zip_files_jstree_search').on('keyup', function () { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(function () { var value = jQuery('#zip_files_jstree_search').val(); jQuery('#updraft_zip_files_jstree').jstree(true).search(value); }, 250); }); // Detect change on the tree and update the input that has been marked as editing jQuery('#updraft_zip_files_jstree').on("changed.jstree", function (e, data) { jQuery('#updraft_zip_path_text').text(data.node.li_attr.path); if (data.node.li_attr.size) { jQuery('#updraft_zip_size_text').text(data.node.li_attr.size); jQuery('#updraft_zip_download_item').show(); } else { jQuery('#updraft_zip_size_text').text(''); jQuery('#updraft_zip_download_item').hide(); } }); jQuery('#updraft_zip_download_item').on('click', function(event) { event.preventDefault(); var path = jQuery('#updraft_zip_path_text').text(); updraft_send_command('get_zipfile_download', {path:path, timestamp:timestamp, type:type, findex:findex}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else if (response.hasOwnProperty('path')) { location.href =ajaxurl+'?_wpnonce='+updraft_download_nonce+'×tamp='+timestamp+'&type='+type+'&stage=2&findex='+findex+'&filepath='+response.path+'&action=updraft_download_backup'; } else { alert(updraftlion.download_timeout); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); }); } /** * This function will clean up the updraft downloader UI * * @param {object} item - the object pressed in the UI * @param {string} what - the file entity */ function remove_updraft_downloader(item, what) { jQuery(item).closest('.updraftplus_downloader').fadeOut().remove(); if (0 == jQuery('.updraftplus_downloader_container_'+what+' .updraftplus_downloader').length) jQuery('.updraftplus_downloader_container_'+what).remove(); } /** * This function will prepare the downloader UI and kick of the request to download the file entities. * * @param {string} base - the base string for the id * @param {integer} backup_timestamp - the backup timestamp * @param {string} what - the file entity * @param {string} whicharea - the area we want to append the downloader * @param {string} set_contents - the contents we want to download * @param {string} prettydate - the pretty backup date * @param {boolean} async - boolean to indicate if this is a async request or not */ function updraft_downloader(base, backup_timestamp, what, whicharea, set_contents, prettydate, async) { if (typeof set_contents !== "string") set_contents = set_contents.toString(); jQuery('.ud_downloadstatus').show(); var set_contents = set_contents.split(','); var prdate = (prettydate) ? prettydate : backup_timestamp; // Old-style, from when it was a form // var data = jQuery('#updraft-navtab-backups-content .uddownloadform_'+what+'_'+backup_timestamp+'_'+set_contents[i]).serialize(); var nonce = jQuery('#updraft-navtab-backups-content .uddownloadform_'+what+'_'+backup_timestamp+'_'+set_contents[0]).data('wp_nonce').toString(); if (!jQuery('.updraftplus_downloader_container_'+what).length) { jQuery(whicharea).append('
                '); jQuery('.updraftplus_downloader_container_' + what).append('' + updraftlion.download + ' ' + what + ' (' + prdate + '):'); } for (var i = 0; i < set_contents.length; i++) { // Create somewhere for the status to be found var stid = base+backup_timestamp+'_'+what+'_'+set_contents[i]; var stid_selector = '.'+stid; var show_index = parseInt(set_contents[i]); show_index++; var itext = (0 == set_contents[i]) ? '' : ' ('+show_index+')'; if (!jQuery(stid_selector).length) { jQuery('.updraftplus_downloader_container_'+what).append('
                '+what+itext+':
                '+updraftlion.begunlooking+'
                '); jQuery(stid_selector).data('downloaderfor', { base: base, nonce: backup_timestamp, what: what, index: set_contents[i] }); setTimeout(function() { updraft_activejobs_update(true); }, 1500); } jQuery(stid_selector).data('lasttimebegan', (new Date).getTime()); } // Now send the actual request to kick it all off async = async ? true : false; var data = { type: what, timestamp: backup_timestamp, findex: set_contents }; var options = { action: 'updraft_download_backup', nonce_key: '_wpnonce', nonce: nonce, timeout: 10000, async: async } updraft_send_command('updraft_download_backup', data, function (response) {}, options); // We don't want the form to submit as that replaces the document return false; } /** * Parse JSON string, including automatically detecting unwanted extra input and skipping it * * @param {string} json_mix_str - JSON string which need to parse and convert to object * @param {boolean} analyse - if true, then the return format will contain information on the parsing, and parsing will skip attempting to JSON.parse() the entire string (will begin with trying to locate the actual JSON) * * @throws SyntaxError|String (including passing on what JSON.parse may throw) if a parsing error occurs. * * @returns Mixed parsed JSON object. Will only return if parsing is successful (otherwise, will throw). If analyse is true, then will rather return an object with properties (mixed)parsed, (integer)json_start_pos and (integer)json_end_pos */ function ud_parse_json(json_mix_str, analyse) { analyse = ('undefined' === typeof analyse) ? false : true; // Just try it - i.e. the 'default' case where things work (which can include extra whitespace/line-feeds, and simple strings, etc.). if (!analyse) { try { var result = JSON.parse(json_mix_str); return result; } catch (e) { console.log('UpdraftPlus: Exception when trying to parse JSON (1) - will attempt to fix/re-parse based upon first/last curly brackets'); console.log(json_mix_str); } } var json_start_pos = json_mix_str.indexOf('{'); var json_last_pos = json_mix_str.lastIndexOf('}'); // Case where some php notice may be added after or before json string if (json_start_pos > -1 && json_last_pos > -1) { var json_str = json_mix_str.slice(json_start_pos, json_last_pos + 1); try { var parsed = JSON.parse(json_str); if (!analyse) { console.log('UpdraftPlus: JSON re-parse successful'); } return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: json_last_pos + 1 } : parsed; } catch (e) { console.log('UpdraftPlus: Exception when trying to parse JSON (2) - will attempt to fix/re-parse based upon bracket counting'); var cursor = json_start_pos; var open_count = 0; var last_character = ''; var inside_string = false; // Don't mistake this for a real JSON parser. Its aim is to improve the odds in real-world cases seen, not to arrive at universal perfection. while ((open_count > 0 || cursor == json_start_pos) && cursor <= json_last_pos) { var current_character = json_mix_str.charAt(cursor); if (!inside_string && '{' == current_character) { open_count++; } else if (!inside_string && '}' == current_character) { open_count--; } else if ('"' == current_character && '\\' != last_character) { inside_string = inside_string ? false : true; } last_character = current_character; cursor++; } console.log("Started at cursor="+json_start_pos+", ended at cursor="+cursor+" with result following:"); console.log(json_mix_str.substring(json_start_pos, cursor)); try { var parsed = JSON.parse(json_mix_str.substring(json_start_pos, cursor)); console.log('UpdraftPlus: JSON re-parse successful'); return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: cursor } : parsed; } catch (e) { // Throw it again, so that our function works just like JSON.parse() in its behaviour. throw e; } } } throw "UpdraftPlus: could not parse the JSON"; } // Catch HTTP errors if the download status check returns them jQuery(document).ajaxError(function(event, jqxhr, settings, exception) { if (exception == null || exception == '') return; if (jqxhr.responseText == null || jqxhr.responseText == '') return; console.log("Error caught by UpdraftPlus ajaxError handler (follows) for "+settings.url); console.log(exception); if (settings.url.search(ajaxurl) == 0) { // TODO subaction=downloadstatus is no longer used. This should be adjusted to the current set-up. if (settings.url.search('subaction=downloadstatus') >= 0) { var timestamp = settings.url.match(/timestamp=\d+/); var type = settings.url.match(/type=[a-z]+/); var findex = settings.url.match(/findex=\d+/); var base = settings.url.match(/base=[a-z_]+/); findex = (findex instanceof Array) ? parseInt(findex[0].substr(7)) : 0; type = (type instanceof Array) ? type[0].substr(5) : ''; base = (base instanceof Array) ? base[0].substr(5) : ''; timestamp = (timestamp instanceof Array) ? parseInt(timestamp[0].substr(10)) : 0; if ('' != base && '' != type && timestamp >0) { var stid = base+timestamp+'_'+type+'_'+findex; jQuery('.'+stid+' .raw').html(''+updraftlion.error+' '+updraftlion.servererrorcode); } } else if (settings.url.search('subaction=restore_alldownloaded') >= 0) { // var timestamp = settings.url.match(/timestamp=\d+/); jQuery('#updraft-restore-modal-stage2a').append('
                '+updraftlion.error+' '+updraftlion.servererrorcode+': '+exception); } } }); function updraft_restorer_checkstage2(doalert) { // How many left? var stilldownloading = jQuery('#ud_downloadstatus2 .file').length; if (stilldownloading > 0) { if (doalert) { alert(updraftlion.stilldownloading); } return; } // Allow pressing 'Restore' to proceed jQuery('.updraft-restore--next-step').prop('disabled', true); jQuery('#updraft-restore-modal-stage2a').html(' '+updraftlion.preparing_backup_files); updraft_send_command('restore_alldownloaded', { timestamp: jQuery('#updraft_restore_timestamp').val(), restoreopts: jQuery('#updraft_restore_form').serialize() }, function(resp, status, data) { var info = null; jQuery('#updraft_restorer_restore_options').val(''); jQuery('.updraft-restore--next-step').prop('disabled', false); try { // var resp = ud_parse_json(data); if (null == resp) { jQuery('#updraft-restore-modal-stage2a').html(updraftlion.emptyresponse); return; } var report = resp.m; if (resp.w != '') { report = report + '

                ' + updraftlion.warnings +'

                ' + resp.w + '
                '; } if (resp.e != '') { report = report + '

                ' + updraftlion.errors+'

                ' + resp.e + '
                '; } else { updraft_restore_stage = 3; } if (resp.hasOwnProperty('i')) { // Store the information passed back from the backup scan try { info = ud_parse_json(resp.i); // if (info.hasOwnProperty('multisite') && info.multisite && info.hasOwnProperty('same_url') && info.same_url) { if (info.hasOwnProperty('addui')) { console.log("Further UI options are being displayed"); var addui = info.addui; report += '
                '+addui+'
                '; if (typeof JSON == 'object' && typeof JSON.stringify == 'function') { // If possible, remove from the stored info, to prevent passing back potentially large amounts of unwanted data delete info.addui; resp.i = JSON.stringify(info); } } if (info.hasOwnProperty('php_max_input_vars')) { php_max_input_vars = parseInt(info.php_max_input_vars); } if (info.hasOwnProperty('skipped_db_scan')) { skipped_db_scan = parseInt(info.skipped_db_scan); } } catch (err) { console.log(err); console.log(resp); } jQuery('#updraft_restorer_backup_info').val(resp.i); } else { jQuery('#updraft_restorer_backup_info').val(); } jQuery('#updraft-restore-modal-stage2a').html(report); jQuery('.updraft-restore--next-step').text(updraftlion.restore); if (jQuery('#updraft-restore-modal-stage2a .updraft_select2').length > 0) { jQuery('#updraft-restore-modal-stage2a .updraft_select2').select2(); } } catch (err) { console.log(data); console.log(err); jQuery('#updraft-restore-modal-stage2a').text(updraftlion.jsonnotunderstood+' '+updraftlion.errordata+": "+data).html(); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft-restore-modal-stage2a').html('

                '+resp.fatal_error_message+'

                '); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft-restore-modal-stage2a').html('

                '+error_message+'

                '); console.log(error_message); alert(error_message); console.log(response); } } }); } function updraft_downloader_status(base, nonce, what, findex) { // Short-circuit. See previous versions for the old code. return; } function updraft_downloader_status_update(download_status, response_raw) { var cancel_repeat = 0; jQuery(download_status).each(function (x, dstatus) { if (dstatus.base == '') return; var stid = dstatus.base + dstatus.timestamp + '_' + dstatus.what + '_' + dstatus.findex; var stid_selector = '.' + stid; if (dstatus.e != null) { jQuery(stid_selector + ' .raw').html('' + updraftlion.error + ' ' + dstatus.e); console.log(dstatus); } else if (dstatus.p != null) { jQuery(stid_selector + '_st .dlfileprogress').width(dstatus.p + '%'); // jQuery(stid_selector+'_st .dlsofar').html(Math.round(dstatus.s/1024)); // jQuery(stid_selector+'_st .dlsize').html(Math.round(dstatus.t/1024)); // Is a restart appropriate? // dstatus.a, if set, indicates that a) the download is incomplete and b) the value is the number of seconds since the file was last modified... if (dstatus.a != null && dstatus.a > 0) { var timenow = (new Date).getTime(); var lasttimebegan = jQuery(stid_selector).data('lasttimebegan'); // Remember that this is in milliseconds var sincelastrestart = timenow - lasttimebegan; if (dstatus.a > 90 && sincelastrestart > 60000) { console.log(dstatus.timestamp + " " + dstatus.what + " " + dstatus.findex + ": restarting download: file_age=" + dstatus.a + ", sincelastrestart_ms=" + sincelastrestart); jQuery(stid_selector).data('lasttimebegan', (new Date).getTime()); var $original_button = jQuery('#updraft-navtab-backups-content .uddownloadform_' + dstatus.what + '_' + dstatus.timestamp + '_' + dstatus.findex); var data = { type: dstatus.what, timestamp: dstatus.timestamp, findex: dstatus.findex }; var options = { action: 'updraft_download_backup', nonce_key: '_wpnonce', nonce: $original_button.data('wp_nonce').toString(), timeout: 10000 }; updraft_send_command('updraft_download_backup', data, function (response) {}, options); jQuery(stid_selector).data('lasttimebegan', (new Date).getTime()); } } if (dstatus.m != null) { if (dstatus.p >= 100 && 'udrestoredlstatus_' == dstatus.base) { jQuery(stid_selector + ' .raw').html(dstatus.m); jQuery(stid_selector).fadeOut('slow', function () { remove_updraft_downloader(this, dstatus.what); updraft_restorer_checkstage2(0); }); } else if (dstatus.p >= 100 && dstatus.base == 'udclonedlstatus_') { jQuery(stid_selector + ' .raw').html(dstatus.m); jQuery(stid_selector).fadeOut('slow', function () { remove_updraft_downloader(this, dstatus.what); }); } else if (dstatus.p < 100 || dstatus.base != 'uddlstatus_') { jQuery(stid_selector + ' .raw').html(dstatus.m); } else { var file_ready_actions = updraftlion.fileready + ' ' + updraftlion.actions + ': \ \ '; if (dstatus.hasOwnProperty('can_show_contents') && dstatus.can_show_contents) { file_ready_actions += ' '; } jQuery(stid_selector + ' .raw').html(file_ready_actions); jQuery(stid_selector + '_st').remove(); } } // dlstatus_lastlog = response_raw; } else if (dstatus.m != null) { jQuery(stid_selector + ' .raw').html(dstatus.m); } else { jQuery(stid_selector + ' .raw').html(updraftlion.jsonnotunderstood + ' (' + response_raw + ')'); cancel_repeat = 1; } }); return cancel_repeat; } /** * Function that sets up a ajax call to start a backup * * @param {Integer} backupnow_nodb Indicate whether the database should be backed up: valid values are 0, 1 * @param {Integer} backupnow_nofiles Indicate whether any files should be backed up: valid values are 0, 1 * @param {Integer} backupnow_nocloud Indicate whether the backup should be uploaded to cloud storage: valid values are 0, 1 * @param {String} onlythesefileentities A csv list of file entities to be backed up * @param {String} onlythesetableentities A csv list of table entities to be backed up * @param {Array} extradata any extra data to be added * @param {String} label A optional label to be added to a backup * @param {String} only_these_cloud_services An array of remote sorage locations to be backed up to */ function updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythesefileentities, extradata, label, onlythesetableentities, only_these_cloud_services) { var params = { backupnow_nodb: backupnow_nodb, backupnow_nofiles: backupnow_nofiles, backupnow_nocloud: backupnow_nocloud, backupnow_label: label, extradata: extradata }; if ('' != onlythesefileentities) { params.onlythisfileentity = onlythesefileentities; } if ('' != onlythesetableentities) { params.onlythesetableentities = onlythesetableentities; } if ('' != only_these_cloud_services) { params.only_these_cloud_services = only_these_cloud_services; } params.always_keep = (typeof extradata.always_keep !== 'undefined') ? extradata.always_keep : 0; delete extradata.always_keep; params.incremental = (typeof extradata.incremental !== 'undefined') ? extradata.incremental : 0; delete extradata.incremental; params.db_anon_all = (typeof extradata.db_anon !== 'undefined' && typeof extradata.db_anon.all !== 'undefined') ? extradata.db_anon.all : 0; params.db_anon_non_staff = (typeof extradata.db_anon !== 'undefined' && typeof extradata.db_anon.non_staff !== 'undefined') ? extradata.db_anon.non_staff : 0; params.db_anon_wc_orders = (typeof extradata.db_anon !== 'undefined' && typeof extradata.db_anon.wc_orders !== 'undefined') ? extradata.db_anon.wc_orders : 0; if ('undefined' !== typeof extradata.db_anon) { delete extradata.db_anon.all; delete extradata.db_anon.non_staff; delete extradata.db_anon.wc_orders; } // Display Request start message if (!jQuery('.updraft_requeststart').length) { var requeststart_el = jQuery('
                ').html(''+updraftlion.requeststart); requeststart_el.data('remove', false); setTimeout( function() { requeststart_el.data('remove', true); }, 3000 ); setTimeout( function() { requeststart_el.remove(); }, 75000 ); jQuery('#updraft_activejobsrow').before(requeststart_el); } updraft_activejobslist_backupnownonce_only = 1; updraft_send_command('backupnow', params, function(resp) { if (resp.hasOwnProperty('error')) { jQuery('.updraft_requeststart').remove(); alert(resp.error); return; } jQuery('#updraft_backup_started').html(resp.m); if (resp.hasOwnProperty('nonce')) { // Can't return it from this context updraft_backupnow_nonce = resp.nonce; console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce); } setTimeout(function() { updraft_activejobs_update(true);}, 500); }); } jQuery(function($) { // actioned When the checkout embed is complete $(document).on('udp/checkout/done', function(e, data) { if (data.hasOwnProperty('product') && 'updraftpremium' === data.product && 'complete' === data.status) { $('.premium-upgrade-purchase-success').show(); $('.updraft_feat_table').closest('section').hide(); $('.updraft_premium_cta__action').hide(); } }); // Advanced settings new menu button listeners $('.expertmode .advanced_settings_container .advanced_tools_button').on('click', function() { advanced_tool_hide($(this).attr("id")); }); function advanced_tool_hide(show_tool) { $('.expertmode .advanced_settings_container .advanced_tools:not(".'+show_tool+'")').hide(); $('.expertmode .advanced_settings_container .advanced_tools.'+show_tool).fadeIn('slow'); $('.expertmode .advanced_settings_container .advanced_tools_button:not(#'+show_tool+')').removeClass('active'); $('.expertmode .advanced_settings_container .advanced_tools_button#'+show_tool).addClass('active'); } // https://github.com/select2/select2/issues/1246#issuecomment-71710835 if (jQuery.ui && jQuery.ui.dialog && jQuery.ui.dialog.prototype._allowInteraction) { var ui_dialog_interaction = jQuery.ui.dialog.prototype._allowInteraction; jQuery.ui.dialog.prototype._allowInteraction = function(e) { if (jQuery(e.target).closest('.select2-dropdown').length) return true; return ui_dialog_interaction.apply(this, arguments); }; } // Update WebDAV URL as user edits $('#updraft-navtab-settings-content #remote-storage-holder').on('change keyup paste', '.updraft_webdav_settings', function() { var updraft_webdav_settings = []; $('.updraft_webdav_settings').each(function(index, item) { var id = $(item).attr('id'); if (id && 'updraft_webdav_' == id.substring(0, 15)) { var which_one = id.substring(15); id_split = which_one.split('_'); which_one = id_split[0]; var instance_id = id_split[1]; if ('undefined' == typeof updraft_webdav_settings[instance_id]) updraft_webdav_settings[instance_id] = []; updraft_webdav_settings[instance_id][which_one] = this.value; } }); var updraft_webdav_url = ""; var host = "@"; var slash = "/"; var colon = ":"; var colon_port = ":"; for (var instance_id in updraft_webdav_settings) { if (updraft_webdav_settings[instance_id]['host'].indexOf("@") >= 0 || "" === updraft_webdav_settings[instance_id]['host']) { host = ""; } if (updraft_webdav_settings[instance_id]['host'].indexOf("/") >= 0) { $('.webdav-'+instance_id+' .updraft_webdav_host_error').show(); } else { $('.webdav-'+instance_id+' .updraft_webdav_host_error').hide(); } if (0 == updraft_webdav_settings[instance_id]['path'].indexOf("/") || "" === updraft_webdav_settings[instance_id]['path']) { slash = ""; } if ("" === updraft_webdav_settings[instance_id]['user'] || "" === updraft_webdav_settings[instance_id]['pass']) { colon = ""; } if ("" === updraft_webdav_settings[instance_id]['host'] || "" === updraft_webdav_settings[instance_id]['port']) { colon_port = ""; } updraft_webdav_url = updraft_webdav_settings[instance_id]['webdav'] + updraft_webdav_settings[instance_id]['user'] + colon + updraft_webdav_settings[instance_id]['pass'] + host +encodeURIComponent(updraft_webdav_settings[instance_id]['host']) + colon_port + updraft_webdav_settings[instance_id]['port'] + slash + updraft_webdav_settings[instance_id]['path']; masked_webdav_url = updraft_webdav_settings[instance_id]['webdav'] + updraft_webdav_settings[instance_id]['user'] + colon + updraft_webdav_settings[instance_id]['pass'].replace(/./gi,'*') + host +encodeURIComponent(updraft_webdav_settings[instance_id]['host']) + colon_port + updraft_webdav_settings[instance_id]['port'] + slash + updraft_webdav_settings[instance_id]['path']; $('#updraft_webdav_url_' + instance_id).val(updraft_webdav_url); $('#updraft_webdav_masked_url_' + instance_id).val(masked_webdav_url); } }); $('div.ud-phpseclib-notice').on('click', 'button.notice-dismiss', function (event) { event.stopImmediatePropagation(); updraft_send_command('dismiss_phpseclib_notice', null, function(resp, status, response) { if (!resp.hasOwnProperty('success') || 1 !== resp.success) { console.log(resp); alert(updraftlion.unexpectedresponse+' '+response); } }); }); // Delete button $('#updraft-navtab-backups-content').on('click', '.js--delete-selected-backups', function(e) { e.preventDefault(); updraft_deleteallselected(); }); $('#updraft-navtab-backups-content').on('click', '.updraft_existing_backups .backup-select input', function(e) { // e.preventDefault(); updraft_backups_selection.toggle($(this).closest('.updraft_existing_backups_row')); }); $('#updraft-navtab-backups-content').on('click', '#cb-select-all', function(e) { if ($(this).is(':checked')) { updraft_backups_selection.selectAll(); } else { updraft_backups_selection.deselectAll(); } }); $('#updraft-wrap').on('click', '[id^=updraftplus_manual_authorisation_submit_]', function(e) { e.preventDefault(); var method = $(this).data('method'); var auth_data = $('#updraftplus_manual_authentication_data_'+method).val(); $('#updraftplus_manual_authentication_error_'+method).text(); $('#updraft-wrap #updraftplus_manual_authorisation_template_'+method+' .updraftplus_spinner.spinner').addClass('visible'); $('#updraftplus_manual_authorisation_submit_'+method).prop('disabled', true); manual_remote_storage_auth(method, auth_data); }); /** * This method will send the ajax request to manually authenticate the remote storage method and then update the page with the response * * @param {string} method - the remote storage method * @param {string} auth_data - the auth data as a base64 json encoded string */ function manual_remote_storage_auth(method, auth_data) { updraft_send_command('manual_remote_storage_authentication', {method: method, auth_data: auth_data}, function(response) { $('#updraft-wrap #updraftplus_manual_authorisation_template_'+method+' .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('result') && 'success' === response.result) { $('#updraft-wrap .updraftplus-top-menu').before(response.data); $('#updraft-wrap #updraftplus_manual_authorisation_template_'+method).parent().remove(); $('#updraft-wrap .updraft_authenticate_'+method).remove(); } else if (response.hasOwnProperty('result') && 'error' === response.result) { $('#updraftplus_manual_authentication_error_'+method).text(response.data); $('#updraftplus_manual_authorisation_submit_'+method).prop('disabled', false); } }); } $('#updraft-navtab-backups-content').on('click', '.js--select-all-backups', function(e) { updraft_backups_selection.selectAll(); }); $('#updraft-navtab-backups-content').on('click', '.js--deselect-all-backups', function(e) { updraft_backups_selection.deselectAll(); }); $('#updraft-navtab-backups-content').on('click', '.updraft_existing_backups .updraft_existing_backups_row', function(e) { if (!e.ctrlKey && !e.metaKey) return; if (e.shiftKey) { // it's multiple range selection, it requires the user to hold shift+ctrl buttons during the range selection, the initial and the new starting index is saved in firstMultipleSelectionIndex variable if ("undefined" == typeof updraft_backups_selection.firstMultipleSelectionIndex) { // if all the above conditions are fulfilled then we need to set up the keyup event handler only for range selection operation. By doing it, we also ignore the Apple Command (metaKey) keycode checking which varies among the browser https://unixpapa.com/js/key.html $(document).on('keyup.MultipleSelection', function(e) { // multiple range selection operation requires the user to hold ctrl/cmd + shift buttons all the time during the selections, the range selection operation will be canceled if the user releases one of the held buttons (shitf or ctrl/cmd) and if that happens the highlight mode will stop working updraft_backups_selection.unregister_highlight_mode(); // once this event handler has been triggered and the highlight mode has been turned off, this event handler needs to be removed by using its namespace .MultipleSelection $(document).off('.MultipleSelection'); }); updraft_backups_selection.select(this); $(this).addClass('range-selection-start'); updraft_backups_selection.register_highlight_mode(); } else { updraft_backups_selection.selectAllInBetween(this); jQuery('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').removeClass('range-selection'); } // set the new starting index to the ending range index updraft_backups_selection.firstMultipleSelectionIndex = this.rowIndex - 1; } else { updraft_backups_selection.toggle(this); } }); updraft_backups_selection.checkSelectionStatus(); $('#updraft-navtab-addons-content .wrap').on('click', '.updraftplus_com_login .ud_connectsubmit', function (e) { e.preventDefault(); var email = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_email').val(); var password = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_password').val(); var auto_update = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_updates').is(':checked') ? 1: 0; var auto_udc_connect = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_udc_connect').is(':checked') ? 1: 0; var options = { email: email, password: password, auto_update: auto_update, auto_udc_connect: auto_udc_connect }; updraftplus_com_login.submit(options); }); $('#updraft-navtab-addons-content .wrap').on('keydown', '.updraftplus_com_login input', function (e) { if (13 == e.which) { e.preventDefault(); var email = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_email').val(); var password = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_password').val(); var auto_update = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_updates').is(':checked') ? 1: 0; var auto_udc_connect = $('#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_udc_connect').is(':checked') ? 1: 0; var options = { email: email, password: password, auto_update: auto_update, auto_udc_connect: auto_udc_connect }; updraftplus_com_login.submit(options); } }); $('#updraft-navtab-migrate-content').on('click', '.updraftclone_show_step_1', function (e) { $('.updraftplus-clone').addClass('opened'); $('.updraftclone_show_step_1').hide(); $('.updraft_migrate_widget_temporary_clone_stage1').show(); $('.updraft_migrate_widget_temporary_clone_stage0').hide(); }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_temporary_clone_show_stage0', function(e) { e.preventDefault(); $('.updraft_migrate_widget_temporary_clone_stage0').toggle(); }); // First tab setup setup_migrate_tabs(); // hide section when clicking the close button $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content .close', function (e) { $('.updraft_migrate_intro').show(); $(this).closest('.updraft_migrate_widget_module_content').hide(); }); $('#updraft-navtab-migrate-content').on('click', '#updraft_migrate_tab_alt .close', function (e) { e.preventDefault(); $('.updraft_migrate_intro').show(); $('#updraft_migrate_tab_alt').html('').hide(); }); // Migrate show Add site button $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_add_site--trigger', function (e) { e.preventDefault(); $('.updraft_migrate_add_site').toggle(); }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content .updraftplus_com_login .ud_connectsubmit', function (e) { e.preventDefault(); var email = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_email').val(); var password = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_password').val(); var tfa = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { email: email, password: password, two_factor_code: tfa, consent: consent } }; if (!email || !password) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html('' + updraftlion.error + ' ' + updraftlion.username_password_required).show(); } else { temporary_clone_submit(options); } }); $('#updraft-navtab-migrate-content').on('keydown', '.updraft_migrate_widget_module_content .updraftplus_com_login input', function (e) { if (13 == e.which) { e.preventDefault(); var email = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_email').val(); var password = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_password').val(); var tfa = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { email: email, password: password, two_factor_code: tfa, consent: consent } }; if (!email || !password) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html('' + updraftlion.error + ' ' + updraftlion.username_password_required).show(); } else { temporary_clone_submit(options); } } }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content .updraftplus_com_key .ud_key_connectsubmit', function (e) { e.preventDefault(); var clone_key = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key #temporary_clone_options_key').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { clone_key: clone_key, consent: consent } }; if (!clone_key) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html('' + updraftlion.error + ' ' + updraftlion.clone_key_required).show(); } else { temporary_clone_key_submit(options); } }); $('#updraft-navtab-migrate-content').on('keydown', '.updraft_migrate_widget_module_content .updraftplus_com_key input', function (e) { if (13 == e.which) { e.preventDefault(); var clone_key = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key #temporary_clone_options_key').val(); var consent = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .temporary_clone_terms_and_conditions').is(':checked') ? 1 : 0; var options = { form_data: { clone_key: clone_key, consent: consent } }; if (!clone_key) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html('' + updraftlion.error + ' ' + updraftlion.clone_key_required).show(); } else { temporary_clone_key_submit(options); } } }); $('#updraft-navtab-migrate-content').on('change', '.updraft_migrate_widget_module_content #updraftplus_clone_php_options', function () { var php_version = $(this).data('php_version'); var selected_version = $(this).val(); if (selected_version < php_version) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.clone_version_warning); } else { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(''); } }); $('#updraft-navtab-migrate-content').on('change', '.updraft_migrate_widget_module_content #updraftplus_clone_wp_options', function () { var wp_version = $(this).data('wp_version'); var selected_version = $(this).val(); if (selected_version < wp_version) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.clone_version_warning); } else { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(''); } }); $('#updraft-navtab-migrate-content').on('change', '.updraft_migrate_widget_module_content #updraftplus_clone_backup_options', function() { // reset the package list $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options > option').each(function() { var value = $(this).val(); if ('starter' == value) $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop('selected', true); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop("disabled", false); }); var clone_backup_select = $(this).find('option:selected'); if ('current' == $(clone_backup_select).data('nonce') || 'wp_only' == $(clone_backup_select).data('nonce')) return; var total_size = $(clone_backup_select).data('size'); // Disable packages that are to small for this backup set, then set the first available package as the selected option $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options > option').each(function() { var size = $(this).data('size'); var value = $(this).val(); if (total_size >= size) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop("disabled", true); } else { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+value+'"]').prop('selected', true); return false; } }); }); $('#updraft-navtab-migrate-content').on('click', '.updraft_migrate_widget_module_content #updraft_migrate_createclone', function (e) { e.preventDefault(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone').prop('disabled', true); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(''); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner').addClass('visible'); var clone_id = $(this).data('clone_id'); var secret_token = $(this).data('secret_token'); var php_version = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_php_options').val(); var wp_version = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_wp_options').val(); var region = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_region_options').val(); var package = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options').val(); var updraftclone_branch = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_updraftclone_branch').val(); var updraftplus_branch = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_updraftplus_branch').val(); var admin_only = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_admin_login_options').is(':checked'); var use_queue = $('#updraftplus_clone_use_queue').is(':checked') ? 1 : 0; var db_anon_all = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_all').is(':checked') ? 1 : 0; var db_anon_non_staff = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_non_staff').is(':checked') ? 1 : 0; var db_anon_wc_orders = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_wc_order_data').is(':checked') ? 1 : 0; var backup_nonce = 'current'; var backup_timestamp = 'current'; var clone_backup_select_length = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backup_options').length; var clone_backup_select = $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backup_options').find('option:selected'); if (0 !== clone_backup_select_length && 'undefined' !== typeof clone_backup_select) { backup_nonce = clone_backup_select.data('nonce'); backup_timestamp = clone_backup_select.data('timestamp'); } var options = { form_data: { clone_id: clone_id, secret_token: secret_token, install_info: { php_version: php_version, wp_version: wp_version, region: region, package: package, admin_only: admin_only, updraftclone_branch: ('undefined' === typeof updraftclone_branch) ? '' : updraftclone_branch, updraftplus_branch: ('undefined' === typeof updraftplus_branch) ? '' : updraftplus_branch, use_queue: ('undefined' === typeof use_queue) ? 1 : use_queue } } }; var backup_options = { db_anon_all: db_anon_all, db_anon_non_staff: db_anon_non_staff, db_anon_wc_orders: db_anon_wc_orders, clone_region: region } if ('wp_only' === backup_nonce) { options['form_data']['install_info']['wp_only'] = 1; } temporary_clone_process_create(options, backup_timestamp, backup_nonce, backup_options); }); // Create a updraftplus_com_login object, to store functions and variables var updraftplus_com_login = {}; updraftplus_com_login.set_status = function(status) { $('#updraft-navtab-addons-content .wrap').find('.updraftplus_spinner.spinner').text(status); } updraftplus_com_login.show_loader = function() { $('#updraft-navtab-addons-content .wrap').find('.updraftplus_spinner.spinner').addClass('visible'); $('#updraft-navtab-addons-content .wrap').find('.ud_connectsubmit').prop('disabled', 'disabled'); } updraftplus_com_login.hide_loader = function() { $('#updraft-navtab-addons-content .wrap').find('.updraftplus_spinner.spinner').removeClass('visible').text(updraftlion.processing); $('#updraft-navtab-addons-content .wrap').find('.ud_connectsubmit').prop('disabled', false); } /* This function will send an AJAX request to the backend to check the users credentials, then it will either inform the user of any errors or if there are none it will submit the form. @param {array} options - an array that includes the users email and password */ updraftplus_com_login.submit = function(options) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html('').hide(); if (this.stage) { switch (this.stage) { case 'connect_udc': case 'connect_udc_TFA': // update data in object var email = $('#updraftplus-addons_options_email').val(); var password = $('#updraftplus-addons_options_password').val(); this.login_data.email = email; this.login_data.password = password; // connect_udc again this.connect_udc(); break; case 'create_key': this.create_key(); break; default: this.stage = null; updraftplus_com_login.submit(); break; } return; } this.set_status(updraftlion.connecting); this.show_loader(); updraft_send_command('updraftplus_com_login_submit', { data: options, }, function (response) { if (response.hasOwnProperty('success')) { // logged in was successful, so create a key if the checkbox was checked. if ($('#updraftplus-addons_options_auto_udc_connect').is(':checked')) { this.login_data = { email: options.email, password: options.password, i_consent: 1, two_factor_code: '' }; // CREATE KEY updraftplus_com_login.create_key(); } else { updraftplus_com_login.hide_loader(); $('#updraft-navtab-addons-content .wrap .updraftplus_com_login').trigger('submit'); } } else if (response.hasOwnProperty('error')) { updraftplus_com_login.hide_loader(); $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(response.message).show(); } }.bind(this)); } updraftplus_com_login.create_key = function() { this.stage = 'create_key'; this.set_status(updraftlion.udc_cloud_connected); this.show_loader(); var command_data = { where_send: '__updraftpluscom', key_description: '', key_size: null, mothership_firewalled: 0 }; // updraftcentral_cloud_show_spinner(modal); updraft_send_command('updraftcentral_create_key', command_data, function(response) { // updraftcentral_cloud_hide_spinner(modal); try { var data = ud_parse_json(response); if (data.hasOwnProperty('error')) { console.log(data); return; } if (data.hasOwnProperty('bundle')) { console.log('bundle', data.bundle); this.login_data.key = data.bundle, this.stage = 'connect_udc'; updraftplus_com_login.connect_udc(); } else { if (data.hasOwnProperty('r')) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.trouble_connecting).show(); alert(data.r); } else { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.trouble_connecting).show(); console.log(data); } updraftplus_com_login.hide_loader(); } } catch (err) { console.log(err); updraftplus_com_login.hide_loader(); } }.bind(this), { json_parse: false }); } updraftplus_com_login.connect_udc = function() { var container = $('#updraft-navtab-addons-content .wrap'); updraftplus_com_login.set_status(updraftlion.udc_cloud_key_created); updraftplus_com_login.show_loader(); if ('connect_udc_TFA' == this.stage) { this.login_data.two_factor_code = container.find('input#updraftplus-addons_options_two_factor_code').val(); updraftplus_com_login.set_status(updraftlion.checking_tfa_code); } var login_data = { form_data: this.login_data }; login_data.form_data.addons_options_connect = 1; // Final step, connect UDC with the Key and all. updraft_send_command('process_updraftcentral_login', login_data, function(login_response) { try { var data = ud_parse_json(login_response); if (data.hasOwnProperty('error')) { if ('incorrect_password' === data.code) { container.find('.tfa_fields').hide(); container.find('.non_tfa_fields').show(); container.find('input#updraftplus-addons_options_two_factor_code').val(''); container.find('input#updraftplus-addons_options_password').val('').trigger('focus'); } if ('no_key_found' === data.code) { this.stage = 'create_key'; } // Continue with UpdraftPlus account even if the user has used all UpdraftCentral licences if ('no_licences_available' === data.code) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.login_udc_no_licences_short).show(); data.status = 'authenticated'; container.find('input[name="_wp_http_referer"]').val(function(index, val) { return val + '&udc_connect=0'; }); } else { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(data.message).show(); $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').find('a').attr('target', '_blank'); console.log(data); updraftplus_com_login.hide_loader(); return; } } if (data.hasOwnProperty('tfa_enabled') && true == data.tfa_enabled) { $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html('').hide(); container.find('.non_tfa_fields').hide(); container.find('.tfa_fields').show(); container.find('input#updraftplus-addons_options_two_factor_code').trigger('focus'); this.stage = 'connect_udc_TFA'; } if ('authenticated' === data.status) { container.find('.non_tfa_fields').hide(); container.find('.tfa_fields').hide(); container.find('.updraft-after-form-table').hide(); this.stage = null; $('#updraft-navtab-addons-content .wrap .updraftplus_com_login_status').html(updraftlion.login_successful_short).show().addClass('success'); // submit the form (to reload the page). setTimeout(function() { $('#updraft-navtab-addons-content .wrap form.updraftplus_com_login').trigger('submit'); }, 1000); } } catch (err) { console.log(err); } updraftplus_com_login.hide_loader(); }.bind(this), { json_parse: false }); } /** * This function will send an AJAX request to the backend to check the users credentials, then it will either inform the user of any errors or display UI elements that include their token count and a way to create new clones. * * @param {array} options - an array that includes the users email and password */ function temporary_clone_submit(options) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html('').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .updraftplus_spinner.spinner').addClass('visible'); updraft_send_command('process_updraftplus_clone_login', options, function (response) { try { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('status') && 'error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status').html(response.message).show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code').val(''); return; } if (response.hasOwnProperty('tfa_enabled') && true == response.tfa_enabled) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 input#temporary_clone_options_two_factor_code').trigger('focus'); } if ('authenticated' === response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 input#temporary_clone_options_two_factor_code').val(''); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').html(response.html); if (response.hasOwnProperty('clone_info') && response.clone_info.hasOwnProperty('expires_after')) temporary_clone_timer(response.clone_info.expires_after); } } catch (err) { console.log(err); } }); } /** * This function will send an AJAX request to the backend to check the clone key, then it will either inform the user of any errors or display UI elements that include their token count and a way to create new clones. * * @param {array} options - an array that includes the clone key */ function temporary_clone_key_submit(options) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html('').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .updraftplus_spinner.spinner').addClass('visible'); updraft_send_command('process_updraftplus_clone_login', options, function (response) { try { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('status') && 'error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status').html(response.message).show(); return; } if ('authenticated' === response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').html(response.html); if (response.hasOwnProperty('clone_info') && response.clone_info.hasOwnProperty('expires_after')) temporary_clone_timer(response.clone_info.expires_after); } } catch (err) { console.log(err); } }); } /** * This function will add a timer to reset the UI if the user does not create the clone before it expires * * @param {integer} expires_after - the clone expires time in seconds */ function temporary_clone_timer(expires_after) { // the expires_after time is in seconds we need it in milliseconds for the setTimeout function var timeout = expires_after * 1000; temporary_clone_timeout = setTimeout(function () { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').html(''); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1').show(); }, timeout); } /** * This function will check if we are using an existing backup and if anything needs downloading before proceeding to process the clone create command * * @param {array} options - an array of options to create the clone * @param {string} backup_timestamp - the timestamp of the backup we want to use or 'current' to create a new backup * @param {string} backup_nonce - the backup nonce of the backup we want to use or 'current' to create a new backup * @param {array} backup_options - an array of options for the backup */ function temporary_clone_process_create(options, backup_timestamp, backup_nonce, backup_options) { var which_to_download = ''; if ('current' != backup_timestamp) { updraft_send_command('whichdownloadsneeded', { updraftplus_clone: true, timestamp: backup_timestamp }, function (response) { if (response.hasOwnProperty('downloads')) { console.log('UpdraftPlus: items which still require downloading follow'); which_to_download = response.downloads; console.log(which_to_download); } // Kick off any downloads, if needed if (0 == which_to_download.length) return; for (var i = 0; i < which_to_download.length; i++) { // updraft_downloader(base, backup_timestamp, what, whicharea, set_contents, prettydate, async) updraft_downloader('udclonedlstatus_', backup_timestamp, which_to_download[i][0], '#ud_downloadstatus3', which_to_download[i][1], '', false); } }, { alert_on_error: false, error_callback: function (response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html('

                ' + resp.fatal_error_message + '

                '); } else { var error_message = "updraft_send_command: error: " + status + " (" + error_code + ")"; $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html('

                ' + error_message + '

                '); console.log(error_message); console.log(response); } } }); } setTimeout(function () { if (0 != which_to_download.length) { temporary_clone_process_create(options, backup_timestamp, backup_nonce, backup_options); return; } var clone_id = options['form_data']['clone_id']; var secret_token = options['form_data']['secret_token']; updraft_send_command('process_updraftplus_clone_create', options, function (response) { try { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone').prop('disabled', false); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner').removeClass('visible'); if (response.hasOwnProperty('status') && 'error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.error + ' ' + response.message).show(); return; } if ('success' === response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2').hide(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage3').show(); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage3').html(response.html); // remove the clone timeout as the clone has now been created if (temporary_clone_timeout) clearTimeout(temporary_clone_timeout); // check if the response includes a secret token, if it does we have claimed a clone from the queue and need to update our current secret token to the one that belongs to the claimed clone if (response.hasOwnProperty('secret_token')) { secret_token = response.secret_token; } if ('wp_only' === backup_nonce) { jQuery('#updraft_clone_progress .updraftplus_spinner.spinner').addClass('visible'); temporary_clone_poll(clone_id, secret_token); } else { jQuery('#updraft_clone_progress .updraftplus_spinner.spinner').addClass('visible'); temporary_clone_boot_backup(clone_id, secret_token, response.url, response.key, backup_nonce, backup_timestamp, backup_options); } } } catch (err) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone').prop('disabled', false); console.log("Error when processing the response of process_updraftplus_clone_create (as follows)"); console.log(err); } }); }, 5000); } /** * This function will send an AJAX request to the backend to start a clone backup job * * @param {string} clone_id - the clone id * @param {string} secret_token - the clone secret * @param {string} clone_url - the clone url * @param {string} key - the migration key * @param {string} backup_nonce - the nonce for the backup we want to use or 'current' for a fresh backup * @param {string} backup_timestamp - the timestamp for the backup we want to use or 'current' for a fresh backup * @param {array} backup_options - an array of options for the backup */ function temporary_clone_boot_backup(clone_id, secret_token, clone_url, key, backup_nonce, backup_timestamp, backup_options) { var params = { updraftplus_clone_backup: 1, backupnow_nodb: 0, backupnow_nofiles: 0, backupnow_nocloud: 0, backupnow_label: 'UpdraftClone', extradata: '', onlythisfileentity: 'plugins,themes,uploads,others', clone_id: clone_id, secret_token: secret_token, clone_url: clone_url, key: key, backup_nonce: backup_nonce, backup_timestamp: backup_timestamp, db_anon_all: backup_options['db_anon_all'], db_anon_non_staff: backup_options['db_anon_non_staff'], db_anon_wc_orders: backup_options['db_anon_wc_orders'], clone_region: backup_options['clone_region'] }; updraft_activejobslist_backupnownonce_only = 1; updraft_send_command('backupnow', params, function (response) { jQuery('#updraft_clone_progress .updraftplus_spinner.spinner').removeClass('visible'); jQuery('#updraft_backup_started').html(response.m); if (response.hasOwnProperty('nonce')) { // Can't return it from this context updraft_backupnow_nonce = response.nonce; updraft_clone_jobs.push(updraft_backupnow_nonce); updraft_inpage_success_callback = function () { jQuery('#updraft_clone_activejobsrow').hide(); // If user aborts the job if (updraft_aborted_jobs[updraft_backupnow_nonce]) { jQuery('#updraft_clone_progress').html(updraftlion.clone_backup_aborted); } else { jQuery('#updraft_clone_progress').html(updraftlion.clone_backup_complete); } }; console.log("UpdraftPlus: ID of started job: " + updraft_backupnow_nonce); } updraft_activejobs_update(true); }); } /** * This function will send an AJAX request to the backend to poll for the clones install information * * @param {string} clone_id - the clone id * @param {string} secret_token - the clone secret */ function temporary_clone_poll(clone_id, secret_token) { var options = { clone_id: clone_id, secret_token: secret_token, }; setTimeout(function () { updraft_send_command('process_updraftplus_clone_poll', options, function (response) { if (response.hasOwnProperty('status')) { if ('error' == response.status) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status').html(updraftlion.error + ' ' + response.message).show(); return; } if ('success' === response.status) { if (response.hasOwnProperty('data') && response.data.hasOwnProperty('wordpress_credentials')) { $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner').removeClass('visible'); $('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_clone_progress').append('
                WordPress ' + updraftlion.credentials + ':
                ' + updraftlion.username + ': ' + response.data.wordpress_credentials.username + '
                ' + updraftlion.password + ': ' + response.data.wordpress_credentials.password); return; } } } else { console.log(response); } temporary_clone_poll(clone_id, secret_token); }); }, 60000); } $('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod a.updraft_add_instance', function(e) { e.preventDefault(); updraft_settings_form_changed = true; var method = $(this).data('method'); add_new_instance(method); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod a.updraft_delete_instance', function(e) { e.preventDefault(); updraft_settings_form_changed = true; var method = $(this).data('method'); var instance_id = $(this).data('instance_id'); if (1 === $('.' + method + '_updraft_remote_storage_border').length) { add_new_instance(method); } $('.' + method + '-' + instance_id).hide('slow', function() { $(this).remove(); }); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod .updraft_edit_label_instance', function(e) { $(this).find('span').hide(); $(this).attr('contentEditable', true).trigger('focus'); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('keyup', '.updraftplusmethod .updraft_edit_label_instance', function(e) { var method = jQuery(this).data('method'); var instance_id = jQuery(this).data('instance_id'); var content = jQuery(this).text(); $('#updraft_' + method + '_instance_label_' + instance_id).val(content); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('blur', '.updraftplusmethod .updraft_edit_label_instance', function(e) { $(this).attr('contentEditable', false); $(this).find('span').show(); }); $('#updraft-navtab-settings-content #remote-storage-holder').on('keypress', '.updraftplusmethod .updraft_edit_label_instance', function(e) { if (13 === e.which) { $(this).attr('contentEditable', false); $(this).find('span').show(); $(this).trigger('blur'); } }); /** * This method will get the default options and compile a template with them * * @param {string} method - the remote storage name * @param {boolean} first_instance - indicates if this is the first instance of this type */ function add_new_instance(method) { var template = Handlebars.compile(updraftlion.remote_storage_templates[method]); var context = {}; // Initiate a reference by assigning an empty object to a variable (in this case the context variable) so that it can be used as a target of merging one or more other objects. Unlike basic values (boolean, string, integer, etc.), in Javascript objects and arrays are passed by reference // copy what are in the template properties to the context overwriting the same object properties, and then copy what are in the default instance settings to the context overwriting all the same properties from the previous merging operation (if any). The context properties are overwritten by other objects that have the same properties later in the parameters order Object.assign(context, updraftlion.remote_storage_options[method]['template_properties'], updraftlion.remote_storage_options[method]['default']); var method_name = updraftlion.remote_storage_methods[method]; context['instance_id'] = 's-' + generate_instance_id(32); context['instance_enabled'] = 1; context['instance_label'] = method_name + ' (' + (jQuery('.' + method + '_updraft_remote_storage_border').length + 1) + ')'; context['instance_conditional_logic'] = { type: '', // always by default rules: [], day_of_the_week_options: updraftlion.conditional_logic.day_of_the_week_options, logic_options: updraftlion.conditional_logic.logic_options, operand_options: updraftlion.conditional_logic.operand_options, operator_options: updraftlion.conditional_logic.operator_options, }; var html = template(context); jQuery(html).hide().insertAfter(jQuery('.' + method + '_add_instance_container').first()).show('slow'); } /** * This method will return a random instance id string * * @param {integer} length - the length of the string to be generated * * @return string - the instance id */ function generate_instance_id(length) { var uuid = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for (var i = 0; i < length; i++) { uuid += characters.charAt(Math.floor(Math.random() * characters.length)); } return uuid; } jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("change", "input[class='updraft_instance_toggle']", function () { updraft_settings_form_changed = true; if (jQuery(this).is(':checked')) { jQuery(this).siblings('label').html(updraftlion.instance_enabled); } else { jQuery(this).siblings('label').html(updraftlion.instance_disabled); } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("change", "select[class='logic_type']", function () { updraft_settings_form_changed = true; if ('' !== this.value) { jQuery('div.logic', jQuery(this).parents('tr.updraftplusmethod')).show(); jQuery(this).parents('tr.updraftplusmethod').find('div.logic ul.rules > li').each(function() { jQuery(this).find('select').each(function() { jQuery(this).prop('disabled', false); }) }); } else { jQuery(this).parents('tr.updraftplusmethod').find('div.logic ul.rules > li').each(function() { jQuery(this).find('select').each(function() { jQuery(this).prop('disabled', true); }) }); jQuery(this).parents('tr.updraftplusmethod').find('div.logic').hide(); } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("change", "select[class='conditional_logic_operand']", function () { updraft_settings_form_changed = true; jQuery(this).parent().find('select:nth(2)').empty(); if ('day_of_the_week' === jQuery(this).val()) { for (var i=0; i').text(updraftlion.conditional_logic.day_of_the_week_options[i].value)); } } else if ('day_of_the_month' === jQuery(this).val()) { for (var i=1; i<=31; i++) { jQuery(this).parent().find('select:nth(2)').append(jQuery('').text(i)); } } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("click", "div.conditional_remote_backup ul.rules li span", function () { updraft_settings_form_changed = true; var $ul = jQuery(this).parents('ul.rules'); if (jQuery(this).hasClass('remove-rule')) { jQuery(this).parent().slideUp(function() { jQuery(this).remove(); if (jQuery($ul).find('> li').length < 2) { jQuery('li:nth(0) span.remove-rule', $ul).remove(); } }); } }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on("click", "div.conditional_remote_backup input.add-new-rule", function () { var $ul = jQuery(this).parent().find('ul.rules'); if (jQuery($ul).find('> li').length < 2) { jQuery($ul).find('li:nth(0)').append(''); } $cloned_item = jQuery($ul).find('> li').last().clone(); jQuery($cloned_item).find('> select').each(function() { jQuery(this).prop('name', jQuery(this).prop('name').replace(/\[instance_conditional_logic\]\[rules\]\[[0-9]+\]/gi, '[instance_conditional_logic][rules]['+jQuery($ul).data('rules')+']')); }); jQuery($ul).append($cloned_item); jQuery($ul).data('rules', parseInt(jQuery($ul).data('rules')) + 1); jQuery($cloned_item).find('select[name*="[operand]"]').trigger('change'); }); jQuery('#updraft-navtab-settings-content #remote-storage-holder').on('click', '.updraftplusmethod button.updraft-test-button', function() { var method = jQuery(this).data('method'); var instance_id = jQuery(this).data('instance_id'); updraft_remote_storage_test(method, function(response, status, data) { if ('sftp' != method) { return false; } if (data.hasOwnProperty('scp') && data.scp) { alert(updraftlion.settings_test_result.replace('%s', 'SCP')+' '+response.output); } else { alert(updraftlion.settings_test_result.replace('%s', 'SFTP')+' '+response.output); } if (response.hasOwnProperty('data') && response.data) { if (response.data.hasOwnProperty('valid_md5_fingerprint') && response.data.valid_md5_fingerprint) { $('#updraft_sftp_fingerprint_'+instance_id).val(response.data.valid_md5_fingerprint); } } return true; }, instance_id); }); $('#updraft-navtab-settings-content select.updraft_interval, #updraft-navtab-settings-content select.updraft_interval_database').on('change', function() { updraft_check_same_times(); }); $('#backupnow_includefiles_showmoreoptions').on('click', function(e) { e.preventDefault(); $('#backupnow_includefiles_moreoptions').toggle(); }); $('#backupnow_database_showmoreoptions').on('click', function(e) { e.preventDefault(); $('#backupnow_database_moreoptions').toggle(); }); $('#updraft-navtab-migrate-content').on('click', '#backupnow_database_showmoreoptions', function (e) { e.preventDefault(); $('#updraft-navtab-migrate-content #backupnow_database_moreoptions').toggle(); }); $('#backupnow_db_anon_all').on('click', function(e) { if ($('#backupnow_db_anon_non_staff').prop('checked')) $('#backupnow_db_anon_non_staff').prop("checked", false); }); $('#backupnow_db_anon_non_staff').on('click', function(e) { if ($('#backupnow_db_anon_all').prop('checked')) $('#backupnow_db_anon_all').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_migration_backupnow_db_anon_all', function() { if ($('#updraftplus_migration_backupnow_db_anon_non_staff').prop('checked')) $('#updraftplus_migration_backupnow_db_anon_non_staff').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_migration_backupnow_db_anon_non_staff', function() { if ($('#updraftplus_migration_backupnow_db_anon_all').prop('checked')) $('#updraftplus_migration_backupnow_db_anon_all').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_clone_backupnow_db_anon_all', function() { if ($('#updraftplus_clone_backupnow_db_anon_non_staff').prop('checked')) $('#updraftplus_clone_backupnow_db_anon_non_staff').prop("checked", false); }); $('#updraft-navtab-migrate-content').on('click', '#updraftplus_clone_backupnow_db_anon_non_staff', function() { if ($('#updraftplus_clone_backupnow_db_anon_all').prop('checked')) $('#updraftplus_clone_backupnow_db_anon_all').prop("checked", false); }); $('#updraft-backupnow-modal').on('click', '#backupnow_includecloud_showmoreoptions', function(e) { e.preventDefault(); $('#backupnow_includecloud_moreoptions').toggle(); }); $('#updraft-navtab-backups-content').on('click', 'a.updraft_diskspaceused_update',function(e) { e.preventDefault(); updraftplus_diskspace(); }); // For Advanced Tools > Site information > Web-server disk space in use by UpdraftPlus $('.advanced_settings_content a.updraft_diskspaceused_update').on('click', function(e) { e.preventDefault(); jQuery('.advanced_settings_content .updraft_diskspaceused').html(''+updraftlion.calculating+''); updraft_send_command('get_fragment', { fragment: 'disk_usage', data: 'updraft' }, function(response) { jQuery('.advanced_settings_content .updraft_diskspaceused').html(response.output); }, { type: 'GET' }); }); $('#updraft-navtab-backups-content a.updraft_uploader_toggle').on('click', function(e) { e.preventDefault(); $('#updraft-plupload-modal').slideToggle(); }); $('#updraft-navtab-backups-content a.updraft_rescan_local').on('click', function(e) { e.preventDefault(); updraft_updatehistory(1, 0); }); $('#updraft-navtab-backups-content a.updraft_rescan_remote').on('click', function(e) { e.preventDefault(); if (!confirm(updraftlion.remote_scan_warning)) return; updraft_updatehistory(1, 1); }); $('#updraftplus-remote-rescan-debug').on('click', function(e) { e.preventDefault(); updraft_updatehistory(1, 1, 1); }); jQuery('#updraft_reset_sid').on('click', function(e) { e.preventDefault(); updraft_send_command('reset_site_id', null, function(response) { jQuery('#updraft_show_sid').html(response); }, { json_parse: false }); }); jQuery("#updraft-navtab-settings-content form input:not('.udignorechange'), #updraft-navtab-settings-content form select").on('change', function(e) { updraft_settings_form_changed = true; }); jQuery("#updraft-navtab-settings-content form input[type='submit']").on('click', function (e) { updraft_settings_form_changed = false; }); var bigbutton_width = 180; jQuery('.updraft-bigbutton').each(function(x,y) { var bwid = jQuery(y).width(); if (bwid > bigbutton_width) bigbutton_width = bwid; }); if (bigbutton_width > 180) jQuery('.updraft-bigbutton').width(bigbutton_width); if (jQuery('#updraft-navtab-backups-content').length) { // setTimeout(function(){updraft_showlastlog(true);}, 1200); setInterval(function() { updraft_activejobs_update(false);}, 1250); } // Prevent profusion of notices setTimeout(function() { jQuery('#setting-error-settings_updated').slideUp();}, 5000); jQuery('#updraft_restore_db').on('change', function() { if (jQuery('#updraft_restore_db').is(':checked') && 1 == jQuery(this).data('encrypted')) { jQuery('#updraft_restorer_dboptions').slideDown(); } else { jQuery('#updraft_restorer_dboptions').slideUp(); } }); updraft_check_same_times(); var updraft_message_modal_buttons = {}; updraft_message_modal_buttons[updraftlion.close] = function() { jQuery(this).dialog("close"); }; jQuery("#updraft-message-modal").dialog({ autoOpen: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 520); $(this).dialog('option', 'minHeight', 260); if ($(window).height() > 360 ) { $(this).dialog('option', 'height', 360); } else { $(this).dialog('option', 'height', $(window).height()-30); } }, modal: true, buttons: updraft_message_modal_buttons }); var updraft_delete_modal_buttons = {}; updraft_delete_modal_buttons[updraftlion.deletebutton] = function() { updraft_remove_backup_sets(0, 0, 0, 0); }; function updraft_remove_backup_sets(deleted_counter, backup_local, backup_remote, backup_sets) { jQuery("#updraft-delete-modal").dialog('close'); var deleted_files_counter = deleted_counter; var local_deleted = backup_local; var remote_deleted = backup_remote; var sets_deleted = backup_sets; var timestamps = jQuery('#updraft_delete_timestamp').val().split(','); var error_log_prompt = ''; var form_data = jQuery('#updraft_delete_form').serializeArray(); var data = {}; $.each(form_data, function() { if (undefined !== data[this.name]) { if (!data[this.name].push) { data[this.name] = [data[this.name]]; } data[this.name].push(this.value || ''); } else { data[this.name] = this.value || ''; } }); if (data.delete_remote) { jQuery('#updraft-delete-waitwarning').find('.updraft-deleting-remote').show(); } else { jQuery('#updraft-delete-waitwarning').find('.updraft-deleting-remote').hide(); } jQuery('#updraft-delete-waitwarning').slideDown().addClass('active'); data.remote_delete_limit = updraftlion.remote_delete_limit; delete data.action; delete data.subaction; delete data.nonce; updraft_send_command('deleteset', data, function(resp) { if (!resp.hasOwnProperty('result') || resp.result == null) { jQuery('#updraft-delete-waitwarning').slideUp(); return; } if (resp.result == 'error') { jQuery('#updraft-delete-waitwarning').slideUp(); alert(updraftlion.error+' '+resp.message); } else if (resp.result == 'continue') { deleted_files_counter = deleted_files_counter + resp.backup_local + resp.backup_remote; local_deleted = local_deleted + resp.backup_local; remote_deleted = remote_deleted + resp.backup_remote; sets_deleted = sets_deleted + resp.backup_sets; var deleted_timestamps = resp.deleted_timestamps.split(','); for (var i = 0; i < deleted_timestamps.length; i++) { var timestamp = deleted_timestamps[i]; jQuery('#updraft-navtab-backups-content .updraft_existing_backups_row_' + timestamp).slideUp().remove(); } jQuery('#updraft_delete_timestamp').val(resp.timestamps); jQuery('#updraft-deleted-files-total').text(deleted_files_counter + ' ' + updraftlion.remote_files_deleted); updraft_remove_backup_sets(deleted_files_counter, local_deleted, remote_deleted, sets_deleted); } else if (resp.result == 'success') { setTimeout(function() { jQuery('#updraft-deleted-files-total').text(''); jQuery('#updraft-delete-waitwarning').slideUp(); }, 500); update_backupnow_modal(resp); if (resp.hasOwnProperty('backupnow_file_entities')) { impossible_increment_entities = resp.backupnow_file_entities; } if (resp.hasOwnProperty('count_backups')) { jQuery('#updraft-existing-backups-heading').html(updraftlion.existing_backups+' '+resp.count_backups+''); } for (var i = 0; i < timestamps.length; i++) { var timestamp = timestamps[i]; jQuery('#updraft-navtab-backups-content .updraft_existing_backups_row_'+timestamp).slideUp().remove(); } updraft_backups_selection.checkSelectionStatus(); updraft_history_lastchecksum = false; local_deleted = local_deleted + resp.backup_local; remote_deleted = remote_deleted + resp.backup_remote; sets_deleted = sets_deleted + resp.backup_sets; if ('' != resp.error_messages) { error_log_prompt = updraftlion.delete_error_log_prompt; } setTimeout(function() { alert(resp.set_message + " " + sets_deleted + "\n" + resp.local_message + " " + local_deleted + "\n" + resp.remote_message + " " + remote_deleted + "\n\n" + resp.error_messages + "\n" + error_log_prompt); }, 900); } }); }; updraft_delete_modal_buttons[updraftlion.cancel] = function() { jQuery(this).dialog("close"); }; jQuery("#updraft-delete-modal").dialog({ autoOpen: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).css('minHeight', 83); }, modal: true, buttons: updraft_delete_modal_buttons }); var updraft_restore_modal = { initialized: false, init: function() { if (this.initialized) return; this.initialized = true; // Setup cancel button events $('.updraft-restore--cancel').on('click', function(e) { e.preventDefault(); jQuery('#ud_downloadstatus2').html(''); this.close(); }.bind(this)); this.default_next_text = $('.updraft-restore--next-step').eq(0).text(); // Setup next button event $('.updraft-restore--next-step').on('click', function(e) { e.preventDefault(); this.process_next_action(); }.bind(this)); }, close: function() { $('.updraft_restore_container').hide(); $('body').removeClass('updraft-modal-is-opened'); }, open: function() { this.init(); // reset elements $('#updraft-restore-modal-stage1').show(); $('#updraft-restore-modal-stage2').hide(); $('#updraft-restore-modal-stage2a').html(''); $('.updraft-restore--next-step').text(this.default_next_text); $('.updraft-restore--stages li').removeClass('active').first().addClass('active'); // Show restoration window $('.updraft_restore_container').show(); $('body').addClass('updraft-modal-is-opened'); }, process_next_action: function() { var anyselected = 0; var moreselected = 0; var dbselected = 0; var pluginselected = 0; var themeselected = 0; var whichselected = []; // Make a list of what files we want var already_added_wpcore = 0; var meta_foreign = $('#updraft_restore_meta_foreign').val(); $('input[name="updraft_restore[]"]').each(function(x, y) { if ($(y).is(':checked') && !$(y).is(':disabled')) { anyselected = 1; var howmany = $(y).data('howmany'); var type = $(y).val(); if ('more' == type) moreselected = 1; if ('db' == type) dbselected = 1; if ('plugins' == type) pluginselected = 1; if ('themes' == type) themeselected = 1; if (1 == meta_foreign || (2 == meta_foreign && 'db' != type)) { if ('wpcore' != type) { howmany = $('#updraft_restore_form #updraft_restore_wpcore').data('howmany'); } type = 'wpcore'; } if ('wpcore' != type || already_added_wpcore == 0) { var restobj = [ type, howmany ]; whichselected.push(restobj); // alert($(y).val()); if ('wpcore' == type) { already_added_wpcore = 1; } } } }); if (1 == anyselected) { // Work out what to download if (1 == updraft_restore_stage) { // meta_foreign == 1 : All-in-one format: the only thing to download, always, is wpcore // if ('1' == meta_foreign) { // whichselected = []; // whichselected.push([ 'wpcore', 0 ]); // } else if ('2' == meta_foreign) { // $(whichselected).each(function(x,y) { // restobj = whichselected[x]; // }); // whichselected = []; // whichselected.push([ 'wpcore', 0 ]); // } $('.updraft-restore--stages li').removeClass('active').eq(1).addClass('active'); $('#updraft-restore-modal-stage1').slideUp('slow'); $('#updraft-restore-modal-stage2').show(); updraft_restore_stage = 2; var pretty_date = $('.updraft_restore_date').first().text(); // Create the downloader active widgets // See if we some are already known to be downloaded - in which case, skip creating the download widget. (That saves on HTTP round-trips, as each widget creates a new POST request. Of course, this is at the expense of one extra one here). var which_to_download = whichselected; var backup_timestamp = $('#updraft_restore_timestamp').val(); try { $('.updraft-restore--next-step').prop('disabled', true); $('#updraft-restore-modal-stage2a').html(' '+updraftlion.maybe_downloading_entities); updraft_send_command('whichdownloadsneeded', { downloads: whichselected, timestamp: backup_timestamp }, function(response) { $('.updraft-restore--next-step').prop('disabled', false); if (response.hasOwnProperty('downloads')) { console.log('UpdraftPlus: items which still require downloading follow'); which_to_download = response.downloads; console.log(which_to_download); } // Kick off any downloads, if needed if (0 == which_to_download.length) { updraft_restorer_checkstage2(0); } else { for (var i=0; i'+resp.fatal_error_message+'

                '); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; $('#updraft-restore-modal-stage2a').html('

                '+error_message+'

                '); console.log(error_message); console.log(response); } } }); } catch (err) { console.log("UpdraftPlus: error (follows) when looking for items needing downloading"); console.log(err); alert(updraftlion.jsonnotunderstood); } // Make sure all are downloaded } else if (2 == updraft_restore_stage) { updraft_restorer_checkstage2(1); } else if (3 == updraft_restore_stage) { var continue_restore = 1; jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', true); $('#updraft_restoreoptions_ui input.required').each(function(index) { if (continue_restore == 0) return; var sitename = $(this).val(); if (sitename == '') { alert(updraftlion.pleasefillinrequired); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); continue_restore = 0; } else if ($(this).attr('pattern') != '') { var pattern = $(this).attr('pattern'); var re = new RegExp(pattern, "g"); if (!re.test(sitename)) { alert($(this).data('invalidpattern')); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); continue_restore = 0; } } }); if (1 == dbselected) { anyselected = 0; jQuery('input[name="updraft_restore_tables_options[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) anyselected = 1; }); if (0 == anyselected && !skipped_db_scan) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (1 == pluginselected) { anyselected = 0; if (!jQuery(".updraftplus_restore_plugins_options_container").length) anyselected = 1; jQuery('input[name="updraft_restore_plugins_options[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) anyselected = 1; }); if (0 == anyselected) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (1 == themeselected) { anyselected = 0; if (!jQuery(".updraftplus_restore_themes_options_container").length) anyselected = 1; jQuery('input[name="updraft_restore_themes_options[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) anyselected = 1; }); if (0 == anyselected) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (1 == moreselected) { anyselected = 0; jQuery('input[name="updraft_include_more_index[]"').each(function (x, y) { if (jQuery(y).is(':checked') && !jQuery(y).is(':disabled')) { anyselected = 1; if ('' == jQuery('#updraft_include_more_path_restore' + x).val()) { alert(updraftlion.emptyrestorepath); } } }); if (0 == anyselected) { alert(updraftlion.youdidnotselectany); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); return; } } if (!continue_restore) return; var restore_options = $('#updraft_restoreoptions_ui select, #updraft_restoreoptions_ui input').serialize(); // jQuery serialize does not pick up unchecked checkboxes, but we want to include these so that we have a list of table/plugins/themes the user does not want to restore we prepend these with udp-skip-{entity}- and check this on the backend var entities = ['table', 'plugins', 'themes']; jQuery.each(entities, function(i, entity) { jQuery.each(jQuery('input[name="updraft_restore_' + entity + '_options[]').filter(function(idx) { return jQuery(this).prop('checked') === false }), function(idx, el) { restore_options += '&' + jQuery(el).attr('name') + '=' + 'udp-skip-' + entity + '-' + jQuery(el).val(); }); }) console.log("Restore options: "+restore_options); if (typeof php_max_input_vars !== 'undefined') { var restore_options_length = restore_options.split("&").length; var warning_template_start = '

                ' + updraftlion.warnings +'

                  '; var warning_template_end = '
                '; // If we can't detect the php_max_input_vars assume the PHP default of 1000 if (!php_max_input_vars && 1000 <= restore_options_length) { console.log('Restore options: ' + restore_options_length + ' PHP max input vars not detected; using default: 1000'); } else if (php_max_input_vars && restore_options_length >= php_max_input_vars) { var warning = '
              • ' + updraftlion.php_max_input_vars_detected_warning + '
              • '; if (1 != jQuery('#updraft-restore-modal-stage2a .notice-warning').length) { var final_warning = warning_template_start + warning + warning_template_end; jQuery('#updraft_restoreoptions_ui').prepend(final_warning); } else { jQuery('#updraft-restore-modal-stage2a #updraft_restore_warnings').append(warning); } console.log('Restore options: ' + restore_options_length + ' PHP max input vars: ' + php_max_input_vars); jQuery('.updraft-restore--next-step, .updraft-restore--cancel').prop('disabled', false); php_max_input_vars = undefined; return; } } $('#updraft_restorer_restore_options').val(restore_options); // This must be done last, as it wipes out the section with #updraft_restoreoptions_ui $('#updraft-restore-modal-stage2a').html(updraftlion.restore_proceeding); $('#updraft_restore_form').trigger('submit'); // In progress; prevent the button being pressed again updraft_restore_stage = 4; } } else { alert(updraftlion.youdidnotselectany); } } } var original_restore_main_activity_width = $('.updraft_restore_main--activity').width(); jQuery('#activity-full-log').on('click', function() { var activity_log_max_width = $('.updraft_restore_main').css('max-width') == '1460px' ? '860px' : '1460px'; var restore_main_activity_width = $('.updraft_restore_main--activity').width() == original_restore_main_activity_width ? '100%' : original_restore_main_activity_width + 'px'; var activity_log_max_height = $('.updraft_restore_main--activity').css('min-height') == '600px' ? '0px' : '600px'; var activity_log_icon_title = $('#activity-full-log').attr('title') == updraftlion.restoreactivitylogscreenexit ? updraftlion.restoreactivitylogfullscreen : updraftlion.restoreactivitylogscreenexit; $('#activity-full-log').toggleClass('dashicons-fullscreen-exit-alt'); $('#activity-full-log').attr('title', activity_log_icon_title); $('.updraft_restore_main--components').toggle('fast'); $('.updraft_restore_main--header').toggle('fast'); $('.updraft_restore_main--activity').animate({minHeight: activity_log_max_height, width: restore_main_activity_width}); $('.updraft_restore_main').animate({maxWidth: activity_log_max_width}); }); jQuery("#updraft-iframe-modal").dialog({ autoOpen: false, height: 500, width: 780, modal: true }); jQuery("#updraft-backupnow-inpage-modal").dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 580); $(this).dialog('option', 'minHeight', 261); $(this).dialog('option', 'height', 380); }, }); var backupnow_modal_buttons = {}; backupnow_modal_buttons[updraftlion.backupnow] = function() { var backupnow_nodb = jQuery('#backupnow_includedb').is(':checked') ? 0 : 1; var backupnow_nofiles = jQuery('#backupnow_includefiles').is(':checked') ? 0 : 1; var backupnow_nocloud = jQuery('#backupnow_includecloud').is(':checked') ? 0 : 1; var db_anon_all = jQuery('#backupnow_db_anon_all').is(':checked') ? 1 : 0; var db_anon_non_staff = jQuery('#backupnow_db_anon_non_staff').is(':checked') ? 1 : 0; var db_anon_wc_orders = jQuery('#backupnow_db_anon_wc_order_data').is(':checked') ? 1 : 0; var onlythesetableentities = backupnow_whichtables_checked(''); var always_keep = jQuery('#always_keep').is(':checked') ? 1 : 0; var incremental = ('incremental' == jQuery('#updraft-backupnow-modal').data('backup-type')) ? 1 : 0; if (updraftlion.hosting_restriction.includes('only_one_backup_per_month') && !incremental) { alert(updraftlion.hosting_restriction_one_backup_permonth); return; } if (updraftlion.hosting_restriction.includes('only_one_incremental_per_day') && incremental) { alert(updraftlion.hosting_restriction_one_incremental_perday); return; } if ('' == onlythesetableentities && 0 == backupnow_nodb) { alert(updraftlion.notableschosen); jQuery('#backupnow_database_moreoptions').show(); return; } if (typeof onlythesetableentities === 'boolean') { onlythesetableentities = null; } var onlythesefileentities = backupnow_whichfiles_checked(''); if ('' == onlythesefileentities && 0 == backupnow_nofiles) { alert(updraftlion.nofileschosen); jQuery('#backupnow_includefiles_moreoptions').show(); return; } var only_these_cloud_services = jQuery("input[name^='updraft_include_remote_service_']").serializeArray(); if ('' == only_these_cloud_services && 0 == backupnow_nocloud) { alert(updraftlion.nocloudserviceschosen); jQuery('#backupnow_includecloud_moreoptions').show(); return; } if (typeof only_these_cloud_services === 'boolean') { only_these_cloud_services = null; } if (backupnow_nodb && backupnow_nofiles) { alert(updraftlion.excludedeverything); return; } jQuery(this).dialog("close"); setTimeout(function() { jQuery('#updraft_lastlogmessagerow').fadeOut('slow', function() { jQuery(this).fadeIn('slow'); }); }, 1700); updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythesefileentities, {always_keep: always_keep, incremental: incremental, db_anon: { all: db_anon_all, non_staff: db_anon_non_staff, wc_orders: db_anon_wc_orders }}, jQuery('#backupnow_label').val(), onlythesetableentities, only_these_cloud_services); }; backupnow_modal_buttons[updraftlion.cancel] = function() { jQuery(this).dialog("close"); }; jQuery("#updraft-backupnow-modal").dialog({ autoOpen: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 610); $(this).dialog('option', 'minHeight', 300); $(this).dialog('option', 'height', 472); }, modal: true, buttons: backupnow_modal_buttons, create: function () { $(this).closest(".ui-dialog") .find(".ui-dialog-buttonpane .ui-button").first() // the first button .addClass("js-tour-backup-now-button"); } }); jQuery("#updraft-poplog").dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 860); $(this).dialog('option', 'minHeight', 260); if ($(window).height() > 600) { $(this).dialog('option', 'height', 600); } else { $(this).dialog('option', 'height', $(window).height()-50); } }, }); jQuery('#updraft-navtab-settings-content .enableexpertmode').on('click', function() { jQuery('#updraft-navtab-settings-content .expertmode').fadeIn(); jQuery('#updraft-navtab-settings-content .enableexpertmode').off('click'); return false; }); jQuery('#updraft-navtab-settings-content .backupdirrow').on('click', 'a.updraft_backup_dir_reset', function() { jQuery('#updraft_dir').val('updraft'); return false; }); function setup_file_entity_exclude_field(field, instant) { if (jQuery('#updraft-navtab-settings-content #updraft_include_'+field).is(':checked')) { if (instant) { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude_container').show(); } else { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude_container').slideDown(); } } else { if (instant) { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude').hide(); } else { jQuery('#updraft-navtab-settings-content #updraft_include_'+field+'_exclude_container').slideUp(); } } } jQuery('#updraft-navtab-settings-content .updraft_include_entity').on('click', function() { var has_exclude_field = jQuery(this).data('toggle_exclude_field'); if (has_exclude_field) { setup_file_entity_exclude_field(has_exclude_field, false); } }); jQuery('.updraft_exclude_entity_container').on('click', '.updraft_exclude_entity_delete', function(event) { event.preventDefault(); if (!confirm(updraftlion.exclude_rule_remove_conformation_msg)) return; var include_entity_name = jQuery(this).data('include-backup-file'); jQuery.when( jQuery(this).closest('.updraft_exclude_entity_wrapper').remove() ).then( updraft_exclude_entity_update(include_entity_name) ); }); jQuery('.updraft_exclude_entity_container').on('click', '.updraft_exclude_entity_edit', function(event) { event.preventDefault(); var wrapper = jQuery(this).hide().closest('.updraft_exclude_entity_wrapper'); var input = wrapper.find('input'); input.prop('readonly', false).trigger('focus'); // place caret at the end of the text var input_val = input.val(); input.val(''); input.val(input_val); wrapper.find('.updraft_exclude_entity_update').addClass('is-active').show(); }); jQuery('.updraft_exclude_entity_container').on('click', '.updraft_exclude_entity_update', function(event) { event.preventDefault(); var wrapper = jQuery(this).closest('.updraft_exclude_entity_wrapper'); var include_backup_file = jQuery(this).data('include-backup-file') var exclude_item_val = wrapper.find('input').val().trim(); var should_be_updated = false; if (exclude_item_val == wrapper.find('input').data('val')) { should_be_updated = true; } else if (updraft_is_unique_exclude_rule(exclude_item_val, include_backup_file)) { should_be_updated = true; } if (should_be_updated) { jQuery(this).hide().removeClass('is-active'); jQuery.when( wrapper.find('input').prop('readonly', 'readonly').data('val', exclude_item_val) ).then(function() { wrapper.find('.updraft_exclude_entity_edit').show(); updraft_exclude_entity_update(include_backup_file); }); } }); jQuery('#updraft_exclude_modal').dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event,ui) { $(this).parent().trigger('focus'); $(this).dialog('option', 'width', 520); $(this).dialog('option', 'minHeight', 260); if ($(window).height() > 579) { $(this).css('height', 'auto'); } else if ($(window).height() < 580 && $(window).height() > 410) { $(this).dialog('option', 'height', 410); $(this).css('height', 'auto'); } else { $(this).dialog('option', 'height', $(window).height()-20); } } }); jQuery('#updraft_include_others_exclude_container, #updraft_include_uploads_exclude_container, .updraft_exclude_container').on('click', 'a.updraft_add_exclude_item', function(event) { event.preventDefault(); var backup_entity = jQuery(this).data('include-backup-file'); jQuery('#updraft_exclude_modal_for').val(backup_entity); jQuery('#updraft_exclude_modal_path').val(jQuery(this).data('path')); if ('uploads' == backup_entity) { jQuery('#updraft-exclude-file-dir-prefix').html(jQuery('#updraft-exclude-upload-base-dir').val()); } jQuery('.updraft-exclude-modal-reset').trigger('click'); jQuery('#updraft_exclude_modal').dialog('open'); }); jQuery('.updraft-exclude-link').on('click', function(event) { event.preventDefault(); var panel = jQuery(this).data('panel'); if ('file-dir' == panel) { jQuery('#updraft_exclude_files_folders_jstree').jstree({ "core": { "multiple": false, "data": function (nodeid, callback) { updraft_send_command('get_jstree_directory_nodes', {entity: 'filebrowser', node:nodeid, path: jQuery('#updraft_exclude_modal_path').val(), findex: 0, skip_root_node: true}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else { callback.call(this, response.nodes); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft_zip_files_jstree').html('

                '+resp.fatal_error_message+'

                '); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft_zip_files_jstree').html('

                '+error_message+'

                '); console.log(error_message); alert(error_message); console.log(response); } } }); }, "error": function(error) { alert(error); console.log(error); }, }, "search": { "show_only_matches": true }, "plugins": ["sort"], }); } else if ('contain-clause' == panel) { jQuery('#updraft_exclude_files_folders_wildcards_jstree').jstree({ "core": { "multiple": false, "data": function (nodeid, callback) { updraft_send_command('get_jstree_directory_nodes', {entity: 'filebrowser', directories_only: 1, node:nodeid, path: jQuery('#updraft_exclude_modal_path').val(), findex: 0, skip_root_node: 0}, function(response) { if (response.hasOwnProperty('error')) { alert(response.error); } else { callback.call(this, response.nodes); } }, { error_callback: function(response, status, error_code, resp) { if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); jQuery('#updraft_zip_files_jstree').html('

                '+resp.fatal_error_message+'

                '); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; jQuery('#updraft_zip_files_jstree').html('

                '+error_message+'

                '); console.log(error_message); alert(error_message); console.log(response); } } }); }, "error": function(error) { alert(error); console.log(error); }, }, "search": { "show_only_matches": true }, "plugins": ["sort"], }); } jQuery('#updraft_exclude_modal_main').slideUp(); jQuery('.updraft-exclude-panel').hide(); jQuery('.updraft-exclude-panel[data-panel='+panel+']').slideDown(); }); jQuery('.updraft-exclude-modal-reset').on('click', function(event) { event.preventDefault(); jQuery('#updraft_exclude_files_folders_jstree').jstree("destroy"); jQuery('#updraft_exclude_files_folders_wildcards_jstree').jstree("destroy"); jQuery('#updraft_exclude_extension_field').val(''); jQuery('#updraft_exclude_prefix_field').val(''); jQuery('.updraft-exclude-panel').slideUp(); jQuery('#updraft_exclude_modal_main').slideDown(); }); jQuery('.updraft-exclude-submit').on('click', function() { var panel = jQuery(this).data('panel'); var exclude_item_val = ''; switch (panel) { case 'file-dir': var exclude_jstree_selected = jQuery("#updraft_exclude_files_folders_jstree").jstree("get_selected"); if (0 == exclude_jstree_selected.length) { alert(updraftlion.exclude_select_file_or_folder_msg); return; } var selected_file_or_folder = exclude_jstree_selected[0]; var prefix_path = jQuery('#updraft_exclude_modal_path').val(); if (selected_file_or_folder.substr(0, prefix_path.length) == prefix_path) { selected_file_or_folder = selected_file_or_folder.substr(prefix_path.length, selected_file_or_folder.length); } if ('/' == selected_file_or_folder.charAt(0)) selected_file_or_folder = selected_file_or_folder.substr(1); if ('/' == selected_file_or_folder.charAt(selected_file_or_folder.length - 1)) selected_file_or_folder = selected_file_or_folder.substr(0, selected_file_or_folder.length - 1); exclude_item_val = selected_file_or_folder; break; case 'extension': var exclude_extension = jQuery('#updraft_exclude_extension_field').val(); if ('' == exclude_extension) { alert(updraftlion.exclude_type_ext_msg); return; } if (!exclude_extension.match(/^[0-9a-zA-Z]+$/)) { alert(updraftlion.exclude_ext_error_msg); return; } exclude_item_val = 'ext:'+exclude_extension; break; case 'begin-with': var prefix = jQuery('#updraft_exclude_prefix_field').val(); if ('' == prefix) { alert(updraftlion.exclude_type_prefix_msg); return; } if (!prefix.match(/^\s*[a-z-_\d,\s]+\s*$/i)) { alert(updraftlion.exclude_prefix_error_msg); return; } exclude_item_val = 'prefix:'+prefix; break; case 'contain-clause': var exclude_jstree_selected = jQuery("#updraft_exclude_files_folders_wildcards_jstree").jstree("get_selected"); if (0 == exclude_jstree_selected.length) { alert(updraftlion.exclude_select_folder_wildcards_msg); return; } var clause_val = jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container input').val(); jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container input').val(''); var clause_type = jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container select').val(); if ('' == clause_val) { alert(updraftlion.exclude_contain_error_msg); return; } jQuery(this).parents('div.updraft-exclude-panel').find('div.clause-input-container select option').eq(0).prop('selected', true); var selected_file_or_folder = exclude_jstree_selected[0]; var prefix_path = jQuery('#updraft_exclude_modal_path').val(); if (selected_file_or_folder.substr(0, prefix_path.length) == prefix_path) { selected_file_or_folder = selected_file_or_folder.substr(prefix_path.length, selected_file_or_folder.length); } if ('/' == selected_file_or_folder.charAt(0)) selected_file_or_folder = selected_file_or_folder.substr(1); if ('/' == selected_file_or_folder.charAt(selected_file_or_folder.length - 1)) selected_file_or_folder = selected_file_or_folder.substr(0, selected_file_or_folder.length - 1); exclude_item_val = selected_file_or_folder; if ('' !== exclude_item_val) exclude_item_val += '/'; clause_val = clause_val.replace(/\*/g, '\\*'); if ('beginning' === clause_type) { exclude_item_val += clause_val + '*'; } else if ('middle' === clause_type) { exclude_item_val += '*' + clause_val + '*'; } else if ('end' === clause_type) { exclude_item_val += '*' + clause_val; } break; default: return; } var include_backup_file = jQuery('#updraft_exclude_modal_for').val(); if (!updraft_is_unique_exclude_rule(exclude_item_val, include_backup_file)) return; var exclude_entity_html = '
                '; jQuery('.updraft_exclude_entity_container[data-include-backup-file="' + include_backup_file + '"]').append(exclude_entity_html); updraft_exclude_entity_update(include_backup_file); jQuery('#updraft_exclude_modal').dialog('close'); }); // TODO: This is suspected to be obsolete. Confirm + remove. jQuery('#updraft-navtab-settings-content .updraft-service').on('change', function() { var active_class = jQuery(this).val(); jQuery('#updraft-navtab-settings-content .updraftplusmethod').hide(); jQuery('#updraft-navtab-settings-content .'+active_class).show(); }); jQuery('#updraft-navtab-settings-content a.updraft_show_decryption_widget').on('click', function(e) { e.preventDefault(); jQuery('#updraftplus_db_decrypt').val(jQuery('#updraft_encryptionphrase').val()); jQuery('#updraft-manualdecrypt-modal').slideToggle(); }); jQuery('#updraftplus-phpinfo').on('click', function(e) { e.preventDefault(); updraft_iframe_modal('phpinfo', updraftlion.phpinfo); }); jQuery('#updraftplus-rawbackuphistory').on('click', function(e) { e.preventDefault(); updraft_iframe_modal('rawbackuphistory', updraftlion.raw); }); // + Added addons navtab jQuery('#updraft-navtab-status').on('click', function(e) { e.preventDefault(); updraft_open_main_tab('status'); updraft_page_is_visible = 1; updraft_console_focussed_tab = 'status'; // Refresh the console, as its next update might be far away updraft_activejobs_update(true); }); jQuery('#updraft-navtab-expert').on('click', function(e) { e.preventDefault(); updraft_open_main_tab('expert'); updraft_page_is_visible = 1; }); jQuery('#updraft-navtab-settings, #updraft-navtab-settings2, #updraft_backupnow_gotosettings').on('click', function(e) { e.preventDefault(); // These next two should only do anything if the relevant selector was clicked jQuery(this).parents('.updraftmessage').remove(); jQuery('#updraft-backupnow-modal').dialog('close'); updraft_open_main_tab('settings'); updraft_page_is_visible = 1; }); jQuery('#updraft-navtab-addons').on('click', function(e) { e.preventDefault(); jQuery(this).addClass('b#nav-tab-active'); updraft_open_main_tab('addons'); updraft_page_is_visible = 1; }); jQuery('#updraft-navtab-backups').on('click', function(e) { e.preventDefault(); updraft_console_focussed_tab = 'backups'; updraft_historytimertoggle(1); updraft_open_main_tab('backups'); }); jQuery('#updraft-navtab-migrate').on('click', function(e) { e.preventDefault(); jQuery('#updraft_migrate_tab_alt').html('').hide(); updraft_open_main_tab('migrate'); updraft_page_is_visible = 1; if (!jQuery('#updraft_migrate .updraft_migrate_widget_module_content').is(':visible')) { jQuery('.updraft_migrate_intro').show(); } }); if ('migrate' == updraftlion.tab) jQuery('#updraft-navtab-migrate').trigger('click'); updraft_send_command('ping', null, function(data, response) { if ('success' == response && data != 'pong' && data.indexOf('pong')>=0) { jQuery('#updraft-navtab-backups-content .ud-whitespace-warning').show(); console.log("UpdraftPlus: Extra output warning: response (which should be just (string)'pong') follows."); console.log(data); } }, { json_parse: false, type: 'GET' }); // Section: Plupload try { if (typeof updraft_plupload_config !== 'undefined') { plupload_init(); } } catch (err) { console.log(err); } function plupload_init() { // create the uploader and pass the config from above var uploader = new plupload.Uploader(updraft_plupload_config); // checks if browser supports drag and drop upload, makes some css adjustments if necessary uploader.bind('Init', function(up) { var uploaddiv = jQuery('#plupload-upload-ui'); if (up.features.dragdrop) { uploaddiv.addClass('drag-drop'); jQuery('#drag-drop-area') .on('dragover.wp-uploader', function() { uploaddiv.addClass('drag-over'); }) .on('dragleave.wp-uploader, drop.wp-uploader', function() { uploaddiv.removeClass('drag-over'); }); } else { uploaddiv.removeClass('drag-drop'); jQuery('#drag-drop-area').off('.wp-uploader'); } }); uploader.init(); // a file was added in the queue uploader.bind('FilesAdded', function(up, files) { if ($('#updraft-plupload-modal').is(':hidden')) { $('#updraft-plupload-modal').slideToggle(); } // var hundredmb = 100 * 1024 * 1024, max = parseInt(up.settings.max_file_size, 10); plupload.each(files, function(file) { // @codingStandardsIgnoreLine if (! /^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+?)?(\.(zip|gz|gz\.crypt))?$/i.test(file.name) && ! /^log\.([0-9a-f]{12})\.txt$/.test(file.name)) { var accepted_file = false; for (var i = 0; i'+file.name+"

                "+updraftlion.notarchive2); jQuery('#updraft-message-modal').dialog('open'); } else { alert(file.name+": "+updraftlion.notarchive); } uploader.removeFile(file); return; } } // a file was added, you may want to update your DOM here... jQuery('#filelist').append( '
                ' + file.name + ' (' + plupload.formatSize(0) + '/' + plupload.formatSize(file.size) + ') ' + '
                '); }); up.refresh(); up.start(); }); uploader.bind('UploadProgress', function(up, file) { jQuery('#' + file.id + " .fileprogress").width(file.percent + "%"); jQuery('#' + file.id + " span").html(plupload.formatSize(parseInt(file.size * file.percent / 100))); if (file.size == file.loaded) { jQuery('#' + file.id).html('
                ' + file.name + ' (' + plupload.formatSize(parseInt(file.size * file.percent / 100)) + '/' + plupload.formatSize(file.size) + ') - ' + updraftlion.complete + '
                '); // Removed
                (just before closing
                ) to make clearer it's complete. jQuery('#' + file.id + " .fileprogress").width(file.percent + "%"); } }); uploader.bind('Error', function(up, error) { console.log(error); var err_makesure; if (error.code == "-200") { err_makesure = '\n'+updraftlion.makesure2; } else { err_makesure = updraftlion.makesure; } var msg = updraftlion.uploaderr+' (code '+error.code+') : '+error.message; if (error.hasOwnProperty('status') && error.status) { msg += ' ('+updraftlion.http_code+' '+error.status+')'; } if (error.hasOwnProperty('response')) { console.log('UpdraftPlus: plupload error: '+error.response); if (error.response.length < 100) msg += ' '+updraftlion.error+' '+error.response+'\n'; } msg += ' '+err_makesure; alert(msg); }); // a file was uploaded uploader.bind('FileUploaded', function(up, file, response) { if (response.status == '200') { // this is your ajax response, update the DOM with it or something... try { resp = ud_parse_json(response.response); if (resp.e) { alert(updraftlion.uploaderror+" "+resp.e); } else if (resp.dm) { alert(resp.dm); updraft_updatehistory(1, 0); } else if (resp.m) { updraft_updatehistory(1, 0); } else { alert('Unknown server response: '+response.response); } } catch (err) { console.log(response); alert(updraftlion.jsonnotunderstood); } } else { alert('Unknown server response status: '+response.code); console.log(response); } }); } // Functions in the debugging console jQuery('#updraftplus_httpget_go').on('click', function(e) { e.preventDefault(); updraftplus_httpget_go(0); }); jQuery('#updraftplus_httpget_gocurl').on('click', function(e) { e.preventDefault(); updraftplus_httpget_go(1); }); jQuery('#updraftplus_callwpaction_go').on('click', function(e) { e.preventDefault(); params = { wpaction: jQuery('#updraftplus_callwpaction').val() }; updraft_send_command('call_wordpress_action', params, function(response) { if (response.e) { alert(response.e); } else if (response.s) { // Silence } else if (response.r) { jQuery('#updraftplus_callwpaction_results').html(response.r); } else { console.log(response); alert(updraftlion.jsonnotunderstood); } }); }); function updraftplus_httpget_go(curl) { params = { uri: jQuery('#updraftplus_httpget_uri').val() }; params.curl = curl; updraft_send_command('httpget', params, function(resp) { if (resp.e) { alert(resp.e); } if (resp.r) { jQuery('#updraftplus_httpget_results').html('
                '+resp.r+'
                '); } else { console.log(resp); } }, { type: 'GET' }); } jQuery('#updraft_activejobs_table, #updraft-navtab-migrate-content').on('click', '.updraft_jobinfo_delete', function(e) { e.preventDefault(); var job_id = jQuery(this).data('jobid'); if (job_id) { $(this).addClass('disabled'); updraft_activejobs_delete(job_id); } else { console.log("UpdraftPlus: A stop job link was clicked, but the Job ID could not be found"); } }); jQuery('#updraft_activejobs_table, #updraft-navtab-backups-content .updraft_existing_backups, #updraft-backupnow-inpage-modal, #updraft-navtab-migrate-content').on('click', '.updraft-log-link', function(e) { e.preventDefault(); var file_id = jQuery(this).data('fileid'); var job_id = jQuery(this).data('jobid'); if (file_id) { updraft_popuplog(file_id); } else if (job_id) { updraft_popuplog(job_id); } else { console.log("UpdraftPlus: A log link was clicked, but the Job ID could not be found"); } }); function updraft_restore_setup(entities, key, show_data) { updraft_restore_setoptions(entities); jQuery('#updraft_restore_timestamp').val(key); jQuery('.updraft_restore_date').html(show_data); updraft_restore_stage = 1; // jQuery('#updraft-restore-modal').dialog('open'); updraft_restore_modal.open(); updraft_activejobs_update(true); } jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', 'button.choose-components-button', function(e) { var entities = jQuery(this).data('entities'); var backup_timestamp = jQuery(this).data('backup_timestamp'); var show_data = jQuery(this).data('showdata'); updraft_restore_setup(entities, backup_timestamp, show_data); }); /** * Get the value of a named URL parameter - https://stackoverflow.com/questions/4548487/jquery-read-query-string * * @param {string} name - URL parameter to return the value of * * @returns {string} */ function get_parameter_by_name(name) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regex_s = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp(regex_s); var results = regex.exec(window.location.href); if (results == null) { return ''; } else { return decodeURIComponent(results[1].replace(/\+/g, ' ')); } } if (get_parameter_by_name('udaction') == 'initiate_restore') { var entities = get_parameter_by_name('entities'); var backup_timestamp = get_parameter_by_name('backup_timestamp'); var show_data = get_parameter_by_name('showdata'); updraft_restore_setup(entities, backup_timestamp, show_data); } var updraft_upload_modal_buttons = {}; updraft_upload_modal_buttons[updraftlion.uploadbutton] = function () { var key = jQuery('#updraft_upload_timestamp').val(); var nonce = jQuery('#updraft_upload_nonce').val(); var services = ''; var send_list = false; jQuery('.updraft_remote_storage_destination').each(function (index) { if (jQuery(this).is(':checked')) { send_list = true; } }); if (!send_list) { jQuery('#updraft-upload-modal-error').html(updraftlion.local_upload_error); return; } else { services = jQuery("input[name^='updraft_remote_storage_destination_']").serializeArray(); } jQuery(this).dialog("close"); alert(updraftlion.local_upload_started); updraft_send_command('upload_local_backup', { use_nonce: nonce, use_timestamp: key, services: services }, function (response) {}); }; updraft_upload_modal_buttons[updraftlion.cancel] = function () { jQuery(this).dialog("close"); }; jQuery("#updraft-upload-modal").dialog({ autoOpen: false, modal: true, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).parent().trigger('focus'); $(this).dialog('option', 'width', 308); if (jQuery(window).height() > 460) { $(this).dialog('option', 'height', 318); } else if (jQuery(window).height() > 250 && jQuery(window).height() < 461) { $(this).dialog('option', 'height', 460); } else { $(this).dialog('option', 'height', jQuery(window).height() - 20); } }, buttons: updraft_upload_modal_buttons }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', 'button.updraft-upload-link', function (e) { e.preventDefault(); var nonce = jQuery(this).data('nonce').toString(); var key = jQuery(this).data('key').toString(); var services = jQuery(this).data('services').toString(); if (nonce) { updraft_upload(key, nonce, services); } else { console.log("UpdraftPlus: A upload link was clicked, but the Job ID could not be found"); } }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', '.updraft-load-more-backups', function (e) { e.preventDefault(); var backup_count = parseInt(jQuery('#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row').length) + parseInt(updraftlion.existing_backups_limit); updraft_updatehistory(0, 0, 0, backup_count); }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', '.updraft-load-all-backups', function (e) { e.preventDefault(); updraft_updatehistory(0, 0, 0, 9999999); }); /** * Opens the dialog box for confirmation of where to upload the backup * * @param {string} key - The UNIX timestamp of the backup * @param {string} nonce - The backup job ID * @param {string} services - A list of services that have not been uploaded to yet */ function updraft_upload(key, nonce, services) { jQuery('#updraft_upload_timestamp').val(key); jQuery('#updraft_upload_nonce').val(nonce); var services_array = services.split(","); jQuery('.updraft_remote_storage_destination').each(function (index) { var name = jQuery(this).val(); if (jQuery.inArray(name, services_array) == -1) { jQuery(this).prop('checked', false); jQuery(this).prop('disabled', true); var label = $(this).prop("labels"); jQuery(label).find('span').show(); } }); jQuery('#updraft-upload-modal').dialog('open'); } jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', '.updraft-delete-link', function(e) { e.preventDefault(); var hasremote = jQuery(this).data('hasremote'); var nonce = jQuery(this).data('nonce').toString(); var key = jQuery(this).data('key').toString(); if (nonce) { updraft_delete(key, nonce, hasremote); } else { console.log("UpdraftPlus: A delete link was clicked, but the Job ID could not be found"); } }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('click', 'button.updraft_download_button', function(e) { e.preventDefault(); var base = 'uddlstatus_'; var backup_timestamp = jQuery(this).data('backup_timestamp'); var what = jQuery(this).data('what'); var whicharea = '.ud_downloadstatus'; var set_contents = jQuery(this).data('set_contents'); var prettydate = jQuery(this).data('prettydate'); var async = true; updraft_downloader(base, backup_timestamp, what, whicharea, set_contents, prettydate, async); }); jQuery('#updraft-navtab-backups-content .updraft_existing_backups').on('dblclick', '.updraft_existingbackup_date', function (e) { e.preventDefault(); var nonce = jQuery(this).data('nonce').toString(); var timestamp = jQuery(this).data('timestamp').toString(); updraft_send_command('rawbackup_history', { timestamp: timestamp, nonce: nonce }, function (response) { if (response.hasOwnProperty('rawbackup')) { var textArea = document.createElement('textarea'); textArea.innerHTML = response.rawbackup; updraft_html_modal(textArea.value, updraftlion.raw, 780, 500); } else { updraft_html_modal(updraftlion.jsonnotunderstood, updraftlion.raw, 780, 500); } }, { type: 'POST' }); updraft_html_modal('

                '+ updraftlion.loading +'
                ', updraftlion.raw, 780, 500); }); jQuery('#backupnow_database_moreoptions').on('click', 'div.backupnow-db-tables > a', function(e) { e.preventDefault(); jQuery('> input', jQuery(this).parents('div.backupnow-db-tables')).prop('checked', false); if (jQuery(this).hasClass('backupnow-select-all-table')) { jQuery('> input', jQuery(this).parents('div.backupnow-db-tables')).prop('checked', true); } else if (jQuery(this).hasClass('backupnow-select-all-this-site')) { jQuery('> input', jQuery(this).parents('div.backupnow-db-tables')).not('[data-non_wp_table]').prop('checked', true); } }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_select_all_themes', function(e) { e.preventDefault(); jQuery('.updraft_restore_themes_options').prop('checked', true); }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_deselect_all_themes', function(e) { e.preventDefault(); jQuery('.updraft_restore_themes_options').prop('checked', false); }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_select_all_plugins', function(e) { e.preventDefault(); jQuery('.updraft_restore_plugins_options').prop('checked', true); }); jQuery('#updraft-restore-modal').on('click', '.updraft_restore_deselect_all_plugins', function(e) { e.preventDefault(); jQuery('.updraft_restore_plugins_options').prop('checked', false); }); jQuery('.updraftmessage.admin-warning-litespeed').on('click', '.notice-dismiss', function(e) { e.preventDefault(); updraft_send_command('dismiss_admin_warning_litespeed', 1, function (response) {}); }); function apply_search_on_db_size() { var value = jQuery('.db-search').val().toLowerCase(); jQuery(".db-size-content tr").filter(function() { jQuery(this).toggle(jQuery(this).text().toLowerCase().indexOf(value) > -1) }); } jQuery('#db_size.advanced_tools_button, .db-size-refresh').on('click', function(e) { e.preventDefault(); var $total_size = jQuery('.advanced_settings_content .advanced_tools.db_size .total-size'); var $table_body = jQuery('.advanced_settings_content .advanced_tools.db_size tbody.db-size-content'); // trigger the ajax from the 'Database size' menu only for the first time if (jQuery(this).hasClass('advanced_tools_button') && '' != $table_body.html()) { return; } $table_body.html(''); updraft_send_command('db_size', 1, function (response) { $total_size.html(response.size); $table_body.html(response.html); apply_search_on_db_size(); }); }); jQuery('.db-search').on('input', function() { apply_search_on_db_size(); }); jQuery('.db-search-clear').on('click', function(e) { e.preventDefault(); jQuery('.db-search').val(''); apply_search_on_db_size(); }); }); // UpdraftVault jQuery(function($) { var settings_css_prefix = '#updraft-navtab-settings-content '; $(settings_css_prefix+'#remote-storage-holder').on('click', '.updraftvault_backtostart', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_settings_showoptions').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connect').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connected').slideUp(); $(settings_css_prefix+'#updraftvault_settings_default').slideDown(); }); // Prevent default event when pressing return in the form $(settings_css_prefix).on('keypress','#updraftvault_settings_connect input', function(e) { if (13 == e.which) { $(settings_css_prefix+'#updraftvault_connect_go').trigger('click'); return false; } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_recountquota', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.counting); try { updraft_send_command('vault_recountquota', { instance_id: $('#updraftvault_settings_connect').data('instance_id') }, function(response) { $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount); if (response.hasOwnProperty('html')) { $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html); if (response.hasOwnProperty('connected')) { if (response.connected) { $(settings_css_prefix+'#updraftvault_settings_default').hide(); $(settings_css_prefix+'#updraftvault_settings_connected').show(); } else { $(settings_css_prefix+'#updraftvault_settings_connected').hide(); $(settings_css_prefix+'#updraftvault_settings_default').show(); } } } }, { error_callback: function(response, status, error_code, resp) { $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); } catch (err) { $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount); console.log(err); } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_disconnect', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnecting); try { updraft_send_command('vault_disconnect', { immediate_echo: true, instance_id: $('#updraftvault_settings_connect').data('instance_id') }, function(response) { $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect); if (response.hasOwnProperty('html')) { $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html).slideUp(); $(settings_css_prefix+'#updraftvault_settings_default').slideDown(); } }, { error_callback: function(response, status, error_code, resp) { $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); } catch (err) { $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect); console.log(err); } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_connect', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_settings_default').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connect').slideDown(); }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_showoptions', function(e) { e.preventDefault(); $(settings_css_prefix+'#updraftvault_settings_default').slideUp(); $(settings_css_prefix+'#updraftvault_settings_showoptions').slideDown(); }); $('#remote-storage-holder').on('keyup', '.updraftplus_onedrive_folder_input', function(e) { var folder = $(this).val(); var td_container = $(this).closest('td') if (0 == folder.indexOf('https:') || 0 == folder.indexOf('http:')) { if (!td_container.find('.onedrive_folder_error').length) { td_container.append('
                '+updraftlion.onedrive_folder_url_warning+'
                '); } } else { td_container.find('.onedrive_folder_error').slideUp('slow', function() { td_container.find('.onedrive_folder_error').remove(); }); } }); $(settings_css_prefix+'#remote-storage-holder').on('click', '#updraftvault_connect_go', function(e) { $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connecting); updraft_send_command('vault_connect', { email: $('#updraftvault_email').val(), pass: $('#updraftvault_pass').val(), instance_id: $('#updraftvault_settings_connect').data('instance_id'), }, function(resp, status, response) { $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connect); if (resp.hasOwnProperty('e')) { updraft_html_modal('

                '+updraftlion.errornocolon+'

                '+resp.e+'

                ', updraftlion.disconnect, 400, 250); if (resp.hasOwnProperty('code') && resp.code == 'no_quota') { $(settings_css_prefix+'#updraftvault_settings_connect').slideUp(); $(settings_css_prefix+'#updraftvault_settings_default').slideDown(); } } else if (resp.hasOwnProperty('connected') && resp.connected && resp.hasOwnProperty('html')) { $(settings_css_prefix+'#updraftvault_settings_connect').slideUp(); $(settings_css_prefix+'#updraftvault_settings_connected').html(resp.html).slideDown(); } else { console.log(resp); alert(updraftlion.unexpectedresponse+' '+response); } }, { error_callback: function(response, status, error_code, resp) { $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connect); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } } }); return false; }); // Mark a backup as always keep (do not delete) $('#updraft-iframe-modal').on('change', '#always_keep_this_backup', function() { var backup_key = $(this).data('backup_key'); var params = { backup_key: backup_key, always_keep: $(this).is(':checked') ? 1 : 0, }; updraft_send_command('always_keep_this_backup', params, function(resp) { if (resp.hasOwnProperty('rawbackup')) { jQuery('#updraft-iframe-modal').dialog('close'); jQuery('.updraft_existing_backups_row_'+backup_key+' .updraft_existingbackup_date').data('rawbackup', resp.rawbackup); updraft_html_modal(jQuery('.updraft_existing_backups_row_'+backup_key+' .updraft_existingbackup_date').data('rawbackup'), updraftlion.raw, 780, 500); } }); }); }); // End ready Vault // Next: the encrypted database pluploader jQuery(function($) { try { if (typeof updraft_plupload_config2 !== 'undefined') { plupload_init(); } } catch (err) { console.log(err); } function plupload_init() { // create the uploader and pass the config from above var uploader = new plupload.Uploader(updraft_plupload_config2); // checks if browser supports drag and drop upload, makes some css adjustments if necessary uploader.bind('Init', function(up) { var uploaddiv = jQuery('#plupload-upload-ui2'); if (up.features.dragdrop) { uploaddiv.addClass('drag-drop'); jQuery('#drag-drop-area2') .on('dragover.wp-uploader', function() { uploaddiv.addClass('drag-over'); }) .on('dragleave.wp-uploader, drop.wp-uploader', function() { uploaddiv.removeClass('drag-over'); }); } else { uploaddiv.removeClass('drag-drop'); jQuery('#drag-drop-area2').off('.wp-uploader'); } }); uploader.init(); // a file was added in the queue uploader.bind('FilesAdded', function(up, files) { // var hundredmb = 100 * 1024 * 1024, max = parseInt(up.settings.max_file_size, 10); plupload.each(files, function(file) { // @codingStandardsIgnoreLine if (!/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-db([0-9]+)?\.(gz\.crypt)$/i.test(file.name)) { alert(file.name+': '+updraftlion.notdba); uploader.removeFile(file); return; } // a file was added, you may want to update your DOM here... jQuery('#filelist2').append( '
                ' + file.name + ' (' + plupload.formatSize(0) + '/' + plupload.formatSize(file.size) + ') ' + '
                '); }); up.refresh(); up.start(); }); uploader.bind('UploadProgress', function(up, file) { jQuery('#' + file.id + " .fileprogress").width(file.percent + "%"); jQuery('#' + file.id + " span").html(plupload.formatSize(parseInt(file.size * file.percent / 100))); }); uploader.bind('Error', function(up, error) { if ('-200' == error.code) { err_makesure = '\n'+updraftlion.makesure2; } else { err_makesure = updraftlion.makesure; } alert(updraftlion.uploaderr+' (code '+error.code+") : "+error.message+" "+err_makesure); }); // a file was uploaded uploader.bind('FileUploaded', function(up, file, response) { if (response.status == '200') { // this is your ajax response, update the DOM with it or something... if (response.response.substring(0,6) == 'ERROR:') { alert(updraftlion.uploaderror+" "+response.response.substring(6)); } else if (response.response.substring(0,3) == 'OK:') { bkey = response.response.substring(3); jQuery('#' + file.id + " .fileprogress").hide(); jQuery('#' + file.id).append(updraftlion.uploaded+' '+updraftlion.followlink+' '+updraftlion.thiskey+' '+jQuery('#updraftplus_db_decrypt').val().replace(/&/g, "&").replace(//g, ">")); } else { alert(updraftlion.unknownresp+' '+response.response); } } else { alert(updraftlion.ukrespstatus+' '+response.code); } }); } jQuery('#updraft-hidethis').remove(); /* * A Handlebarsjs helper function that is used to compare * two values if they are equal. Please refer to the example below. * Assuming "comment_status" contains the value of "spam". * * @param {mixed} a The first value to compare * @param {mixed} b The second value to compare * * @example * // returns "I am spam!", otherwise "I am not a spam!" * {{#ifeq "spam" comment_status}} * I am spam! * {{else}} * I am not a spam! * {{/ifeq}} * * @return {string} */ Handlebars.registerHelper('ifeq', function (a, b, opts) { if ('string' !== typeof a && 'undefined' !== typeof a && null !== a) a = a.toString(); if ('string' !== typeof b && 'undefined' !== typeof b && null !== b) b = b.toString(); if (a === b) { return opts.fn(this); } else { return opts.inverse(this); } }); /* * Handlebars helper function to replace all password chars into asterisk char * * @param {string} password Required. The plain-text password * * @return {string} */ Handlebars.registerHelper('maskPassword', function(password) { return password.replace(/./gi,'*'); }); /* * Handlebars helper function that wraps javascript encodeURIComponent so that it could encode the following characters: , / ? : @ & = + $ # * * @param {string} uri Required. The URI to be encoded */ Handlebars.registerHelper('encodeURIComponent', function(uri) { return encodeURIComponent(uri); }); /** * Handlebars helper function to compare two values using a specified operator * * @see https://stackoverflow.com/questions/8853396/logical-operator-in-a-handlebars-js-if-conditional#answer-16315366 * * @param {mixed} v1 the first value to compare * @param {mixed} v2 the second value to compare * * @return {boolean} true if the first value matched against the second value, false otherwise */ Handlebars.registerHelper('ifCond', function(v1, operator, v2, options) { switch (operator) { case '==': return (v1 == v2) ? options.fn(this) : options.inverse(this); case '===': return (v1 === v2) ? options.fn(this) : options.inverse(this); case '!=': return (v1 != v2) ? options.fn(this) : options.inverse(this); case '!==': return (v1 !== v2) ? options.fn(this) : options.inverse(this); case '<': return (v1 < v2) ? options.fn(this) : options.inverse(this); case '<=': return (v1 <= v2) ? options.fn(this) : options.inverse(this); case '>': return (v1 > v2) ? options.fn(this) : options.inverse(this); case '>=': return (v1 >= v2) ? options.fn(this) : options.inverse(this); case '&&': return (v1 && v2) ? options.fn(this) : options.inverse(this); case '||': return (v1 || v2) ? options.fn(this) : options.inverse(this); case 'typeof': return (v1 === typeof v2) ? options.fn(this) : options.inverse(this); case 'not_typeof': return (v1 !== typeof v2) ? options.fn(this) : options.inverse(this); default: return options.inverse(this); } }); /** * Handlebars helper function for looping through a block of code a specified number of times * * @param {mixed} from the start value * @param {mixed} to the end value where the loop will stop * @param {mixed} incr the increment number * * @return {mixed} the current processing number */ Handlebars.registerHelper('for', function(from, to, incr, block) { var accum = ''; for (var i = from; i < to; i += incr) accum += block.fn(i); return accum; }); /** * Assign value into a variable * * @param {string} name the variable name * @param {mixed} val the value */ Handlebars.registerHelper('set_var', function(name, val, options) { if (!options.data.root) { options.data.root = {}; } options.data.root[name] = val; }); /** * Get length of an array/object * * @param {mixed} object the object */ Handlebars.registerHelper('get_length', function(object) { if ("undefined" !== typeof object && false === object instanceof Array) { return Object.keys(object).length; } else if (true === object instanceof Array) { return object.length; } else { return 0; } }); /** * Return a space-separated list of CSS classes suitable for rows in the configuration section * * @see UpdraftPlus_BackupModule::get_css_classes() * * @param {boolean} include_instance a boolean value to indicate if we want to include the instance_id in the css class, we may not want to include the instance if it's for a UI element that we don't want to be removed along with other UI elements that do include a instance id * @return {string} the list of CSS classes */ Handlebars.registerHelper('get_template_css_classes', function(include_instance, options) { var css_classes = options.data.root.css_class + ' ' + options.data.root.method_id; if (!include_instance || !options.data.root['is_multi_options_feature_supported']) return css_classes; if (options.data.root['is_config_templates_feature_supported']) { css_classes += ' ' + options.data.root.method_id + '-' + options.data.root.instance_id; } else { css_classes += ' ' + options.data.root.method_id + '-' + options.data.root._instance_id; } return css_classes; }); /** * Output the value of an id or name attribute, as if currently within an input tag * This assumes standardised options handling (i.e. that the options array is updraft_(method-id)) * * @see UpdraftPlus_BackupModule::output_settings_field_name_and_id() * * @param {string} input_attribute The attribute of an input tag * @param {mixed} fields the field identifiers * @return {string} a specific value to the given input attribute */ Handlebars.registerHelper('get_template_input_attribute_value', function(input_attribute, fields, options) { var instance_id = options.data.root['is_config_templates_feature_supported'] ? options.data.root.instance_id : options.data.root._instance_id; var id = ename = ''; var method_id = options.data.root.method_id; try { fields = JSON.parse(fields); } catch (e) {} if ("undefined" !== typeof fields && Array === fields.constructor) { for (var i=0; i \ \ \

                \ \

                \ \ '; }); // Add remote methods html using handlebarjs if ($('#remote-storage-holder').length) { var html = ''; var not_instance_ids = ['default', 'template_properties']; for (var method in updraftlion.remote_storage_templates) { if ('undefined' != typeof updraftlion.remote_storage_options[method] && not_instance_ids.length < Object.keys(updraftlion.remote_storage_options[method]).length) { var template = Handlebars.compile(updraftlion.remote_storage_templates[method]); for (var partial_template_name in updraftlion.remote_storage_partial_templates[method]) { Handlebars.registerPartial(partial_template_name, Handlebars.compile(updraftlion.remote_storage_partial_templates[method][partial_template_name])); } var first_instance = true; var instance_count = 1; for (var instance_id in updraftlion.remote_storage_options[method]) { if (not_instance_ids.indexOf(instance_id) > -1) continue; var context = {}; // Initiate a reference by assigning an empty object to a variable (in this case the context variable) so that it can be used as a target of merging one or more other objects. Unlike basic values (boolean, string, integer, etc.), in Javascript objects and arrays are passed by reference // copy what are in the template properties to the context overwriting the same object properties, and then copy what are in the instance settings to the context overwriting all the same properties from the previous merging operation (if any). The context properties are overwritten by other objects that have the same properties later in the parameters order Object.assign(context, updraftlion.remote_storage_options[method]['template_properties'], updraftlion.remote_storage_options[method][instance_id]); if ('undefined' == typeof context['instance_conditional_logic']) { context['instance_conditional_logic'] = { type: '', // always by default rules: [], }; } context['instance_conditional_logic'].day_of_the_week_options = updraftlion.conditional_logic.day_of_the_week_options; context['instance_conditional_logic'].logic_options = updraftlion.conditional_logic.logic_options; context['instance_conditional_logic'].operand_options = updraftlion.conditional_logic.operand_options; context['instance_conditional_logic'].operator_options = updraftlion.conditional_logic.operator_options; context['first_instance'] = first_instance; if ('undefined' == typeof context['instance_enabled']) { context['instance_enabled'] = 1; } if ('undefined' == typeof context['instance_label'] || '' == context['instance_label']) { var method_name = updraftlion.remote_storage_methods[method]; var instance_label = ' (' + instance_count + ')'; if (1 == instance_count) { instance_label = ''; } context['instance_label'] = method_name + instance_label; } html += template(context); first_instance = false; instance_count++; } } else { html += updraftlion.remote_storage_templates[method]; } } $('#remote-storage-holder').append(html).ready(function () { $('.updraftplusmethod').not('.none').hide(); updraft_remote_storage_tabs_setup(); // Displays warning to the user of their mistake if they try to enter a URL in the OneDrive settings and saved $('#remote-storage-holder .updraftplus_onedrive_folder_input').trigger('keyup'); }); } }); // Save/Export/Import settings via AJAX jQuery(function($) { // Pre-load the image so that it doesn't jerk when first used var my_image = new Image(); my_image.src = updraftlion.ud_url+'/images/notices/updraft_logo.png'; // When inclusion options for file entities in the settings tab, reflect that in the "Backup Now" dialog, to prevent unexpected surprises $('#updraft-navtab-settings-content input.updraft_include_entity').on('change', function(e) { var event_target = $(this).attr('id'); var checked = $(this).is(':checked'); var backup_target = '#backupnow_files_'+event_target; $(backup_target).prop('checked', checked); }); $('#updraftplus-settings-save').on('click', function(e) { e.preventDefault(); $.blockUI({ css: { width: '300px', border: 'none', 'border-radius': '10px', left: 'calc(50% - 150px)', padding: '20px', }, message: '

                '+updraftlion.saving+'
                ' }); var form_data = gather_updraft_settings('string'); // POST the settings back to the AJAX handler updraft_send_command('savesettings', { settings: form_data, updraftplus_version: updraftlion.updraftplus_version }, function(resp, status, response) { // Add page updates etc based on response updraft_handle_page_updates(resp, response); $('#updraft-wrap .fade').delay(6000).fadeOut(2000); if (window.updraft_main_tour && !window.updraft_main_tour.canceled) { window.updraft_main_tour.show('settings_saved'); check_cloud_authentication(); } else { $('html, body').animate({ scrollTop: $("#updraft-wrap").offset().top }, 1000, function() { check_cloud_authentication() }); } $.unblockUI(); }, { action: 'updraft_savesettings', error_callback: function(response, status, error_code, resp) { $.unblockUI(); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); alert(error_message); console.log(response); } }, nonce: updraftplus_settings_nonce}); }); $('#updraftplus-settings-export').on('click', function() { if (updraft_settings_form_changed) { alert(updraftlion.unsaved_settings_export); } export_settings(); }); $('#updraftplus-settings-import').on('click', function() { $.blockUI({ css: { width: '300px', border: 'none', 'border-radius': '10px', left: 'calc(50% - 150px)', padding: '20px', }, message: '

                '+updraftlion.importing+'
                ' }); var updraft_import_file_input = document.getElementById('import_settings'); if (updraft_import_file_input.files.length == 0) { alert(updraftlion.import_select_file); $.unblockUI(); return; } var updraft_import_file_file = updraft_import_file_input.files[0]; var updraft_import_file_reader = new FileReader(); updraft_import_file_reader.onload = function() { import_settings(this.result); }; updraft_import_file_reader.readAsText(updraft_import_file_file); }); function export_settings() { var form_data = gather_updraft_settings('object'); var date_now = new Date(); // The 'version' attribute indicates the last time the format changed - i.e. do not update this unless there is a format change form_data = JSON.stringify({ version: '1.12.40', epoch_date: date_now.getTime(), local_date: date_now.toLocaleString(), network_site_url: updraftlion.network_site_url, data: form_data }); // Attach this data to an anchor on page var link = document.body.appendChild(document.createElement('a')); link.setAttribute('download', updraftlion.export_settings_file_name); link.setAttribute('style', "display:none;"); link.setAttribute('href', 'data:text/json' + ';charset=UTF-8,' + encodeURIComponent(form_data)); link.click(); } function import_settings(updraft_file_result) { var parsed; try { parsed = ud_parse_json(updraft_file_result); } catch (e) { $.unblockUI(); jQuery('#import_settings').val(''); console.log(updraft_file_result); console.log(e); alert(updraftlion.import_invalid_json_file); return; } if (window.confirm(updraftlion.importing_data_from + ' ' + parsed['network_site_url'] + "\n" + updraftlion.exported_on + ' ' + parsed['local_date'] + "\n" + updraftlion.continue_import)) { // GET the settings back to the AJAX handler var stringified = JSON.stringify(parsed['data']); updraft_send_command('importsettings', { settings: stringified, updraftplus_version: updraftlion.updraftplus_version, }, function(decoded_response, status, response) { var resp = updraft_handle_page_updates(decoded_response); if (!resp.hasOwnProperty('saved') || resp.saved) { // Prevent the user being told they have unsaved settings updraft_settings_form_changed = false; // Add page updates etc based on response location.replace(updraftlion.updraft_settings_url); } else { $.unblockUI(); if (resp.hasOwnProperty('error_message') && resp.error_message) { alert(resp.error_message); } } }, { action: 'updraft_importsettings', nonce: updraftplus_settings_nonce, error_callback: function(response, status, error_code, resp) { $.unblockUI(); if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { console.error(resp.fatal_error_message); alert(resp.fatal_error_message); } else { var error_message = "updraft_send_command: error: "+status+" ("+error_code+")"; console.log(error_message); console.log(response); alert(error_message); } } }); } else { $.unblockUI(); } } /** * Retrieve the current settings from the DOM * * @param {string} output_format - the output format; valid values are 'string' or 'object' * * @returns String|Object */ function gather_updraft_settings(output_format) { var form_data = ''; var output_format = ('undefined' === typeof output_format) ? 'string' : output_format; if ('object' == output_format) { // Excluding the unnecessary 'action' input avoids triggering a very mis-conceived mod_security rule seen on one user's site form_data = $("#updraft-navtab-settings-content form input[name!='action'][name!='option_page'][name!='_wpnonce'][name!='_wp_http_referer'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select, #updraft-navtab-settings-content form input[type=checkbox]").serializeJSON({checkboxUncheckedValue: '0', useIntKeysAsArrayIndex: true}); } else { // Excluding the unnecessary 'action' input avoids triggering a very mis-conceived mod_security rule seen on one user's site form_data = $("#updraft-navtab-settings-content form input[name!='action'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select").serialize(); // include unchecked checkboxes. user filter to only include unchecked boxes. $.each($('#updraft-navtab-settings-content form input[type=checkbox]') .filter(function(idx) { return $(this).prop('checked') == false }), function(idx, el) { // attach matched element names to the form_data with chosen value. var empty_val = '0'; form_data += '&' + $(el).attr('name') + '=' + empty_val; } ); } return form_data; } /** * Method to parse the response from the backend and update the page with the returned content or display error messages if failed * * @param {array} resp - the JSON-decoded response containing information to update the settings page with * @param {string} response - the JSON-encoded response containing information to update the settings page with * * @return {object} - the decoded response (empty if decoding was not successful) */ function updraft_handle_page_updates(resp, response) { try { var messages = resp.messages; // var debug = resp.changed.updraft_debug_mode; // If backup dir is not writable, change the text, and grey out the 'Backup Now' button var backup_dir_writable = resp.backup_dir.writable; var backup_dir_message = resp.backup_dir.message; var backup_button_title = resp.backup_dir.button_title; } catch (e) { console.log(e); console.log(response); alert(updraftlion.jsonnotunderstood); $.unblockUI(); return {}; } if (resp.hasOwnProperty('changed')) { console.log("UpdraftPlus: savesettings: some values were changed after being filtered"); console.log(resp.changed); for (prop in resp.changed) { if ('object' === typeof resp.changed[prop]) { for (innerprop in resp.changed[prop]) { if (!$("[name='"+innerprop+"']").is(':checkbox')) { $("[name='"+prop+"["+innerprop+"]']").val(resp.changed[prop][innerprop]); } } } else { if (!$("[name='"+prop+"']").is(':checkbox')) { $("[name='"+prop+"']").val(resp.changed[prop]); } } } } $('#updraft_writable_mess').html(backup_dir_message); if (false == backup_dir_writable) { $('#updraft-backupnow-button').attr('disabled', 'disabled'); $('#updraft-backupnow-button').attr('title', backup_button_title); $('.backupdirrow').css('display', 'table-row'); } else { $('#updraft-backupnow-button').prop('disabled', false); $('#updraft-backupnow-button').removeAttr('title'); // $('.backupdirrow').hide(); } if (resp.hasOwnProperty('updraft_include_more_path')) { $('#backupnow_includefiles_moreoptions').html(resp.updraft_include_more_path); } if (resp.hasOwnProperty('backup_now_message')) { $('#backupnow_remote_container').html(resp.backup_now_message); } // Move from 2 to 1 $('.updraftmessage').remove(); $('#updraft_backup_started').before(resp.messages); console.log(resp); // $('#updraft-next-backup-inner').html(resp.scheduled); $('#updraft-next-files-backup-inner').html(resp.files_scheduled); $('#updraft-next-database-backup-inner').html(resp.database_scheduled); return resp; } /** * This function has the workings for checking if any cloud storage needs authentication * If so, these are amended to the HTML and the popup is shown to the users. */ function check_cloud_authentication(){ var show_auth_modal = false; jQuery('#updraft-authenticate-modal-innards').html(''); jQuery("div[class*=updraft_authenticate_] a.updraft_authlink").each(function () { var pretext = jQuery(this).data('pretext'); if ('undefined' === typeof pretext) pretext = ''; jQuery("#updraft-authenticate-modal-innards").append(pretext+'

                '+jQuery(this).html()+'

                '); show_auth_modal = true; }); if (show_auth_modal) { var updraft_authenticate_modal_buttons = {}; updraft_authenticate_modal_buttons[updraftlion.cancel] = function() { jQuery(this).dialog("close"); }; jQuery('#updraft-authenticate-modal').dialog({autoOpen: true, modal: true, resizable: false, draggable: false, resizeOnWindowResize: true, scrollWithViewport: true, resizeAccordingToViewport: true, useContentSize: false, open: function(event, ui) { $(this).dialog('option', 'width', 860); $(this).dialog('option', 'height', 260); }, buttons: updraft_authenticate_modal_buttons}).dialog('open'); } } $('.udp-replace-with-iframe--js').on('click', function(e) { e.preventDefault(); var url = $(this).prop('href'); var iframe = $(''),jQuery("#updraft-iframe-modal").dialog({title:e,resizeOnWindowResize:!0,scrollWithViewport:!0,resizeAccordingToViewport:!0,useContentSize:!1,open:function(t,e){jQuery(this).dialog("option","width",780),jQuery(this).dialog("option","minHeight",260),500r?jQuery(this).dialog("option","height",r):jQuery(this).dialog("option","height",jQuery(window).height()-30)}}).dialog("open")}function updraftplus_diskspace(){jQuery("#updraft-navtab-backups-content .updraft_diskspaceused").html(""+updraftlion.calculating+""),updraft_send_command("get_fragment",{fragment:"disk_usage",data:"updraft"},function(t){jQuery("#updraft-navtab-backups-content .updraft_diskspaceused").html(t.output)},{type:"GET"})}"undefined"!=typeof updraft_siteurl&&setInterval(function(){jQuery.get(updraft_siteurl+"/wp-cron.php")},21e4);lastlog_lastmessage="";function updraftplus_deletefromserver(t,e,a){updraft_send_command("updraft_download_backup",{stage:"delete",timestamp:t,type:e,findex:a=a||0},null,{action:"updraft_download_backup",nonce:updraft_download_nonce,nonce_key:"_wpnonce"})}function updraftplus_downloadstage2(t,e,a){location.href=ajaxurl+"?_wpnonce="+updraft_download_nonce+"×tamp="+t+"&type="+e+"&stage=2&findex="+a+"&action=updraft_download_backup"}function updraftplus_show_contents(t,e,a){updraft_html_modal('

                '+updraftlion.zip_file_contents_info+' -

                '+updraftlion.browse_download_link+'
                ',updraftlion.zip_file_contents,780,500),zip_files_jstree("zipbrowser",t,e,a)}function zip_files_jstree(a,r,n,o){jQuery("#updraft_zip_files_jstree").jstree({core:{multiple:!1,data:function(t,e){updraft_send_command("get_jstree_directory_nodes",{entity:a,node:t,timestamp:r,type:n,findex:o},function(t){t.hasOwnProperty("error")?alert(t.error):e.call(this,t.nodes)},{error_callback:function(t,e,a,r){void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),jQuery("#updraft_zip_files_jstree").html('

                '+r.fatal_error_message+"

                "),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",jQuery("#updraft_zip_files_jstree").html('

                '+r+"

                "),console.log(r),alert(r),console.log(t))}})},error:function(t){alert(t),console.log(t)}},search:{show_only_matches:!0},plugins:["search","sort"]}),jQuery("#updraft_zip_files_jstree").on("ready.jstree",function(t,e){jQuery("#updraft-iframe-modal").dialog("option","title",updraftlion.zip_file_contents+": "+e.instance.get_node("#").children[0])});var t=!1;jQuery("#zip_files_jstree_search").on("keyup",function(){t&&clearTimeout(t),t=setTimeout(function(){var t=jQuery("#zip_files_jstree_search").val();jQuery("#updraft_zip_files_jstree").jstree(!0).search(t)},250)}),jQuery("#updraft_zip_files_jstree").on("changed.jstree",function(t,e){jQuery("#updraft_zip_path_text").text(e.node.li_attr.path),e.node.li_attr.size?(jQuery("#updraft_zip_size_text").text(e.node.li_attr.size),jQuery("#updraft_zip_download_item").show()):(jQuery("#updraft_zip_size_text").text(""),jQuery("#updraft_zip_download_item").hide())}),jQuery("#updraft_zip_download_item").on("click",function(t){t.preventDefault(),updraft_send_command("get_zipfile_download",{path:jQuery("#updraft_zip_path_text").text(),timestamp:r,type:n,findex:o},function(t){t.hasOwnProperty("error")?alert(t.error):t.hasOwnProperty("path")?location.href=ajaxurl+"?_wpnonce="+updraft_download_nonce+"×tamp="+r+"&type="+n+"&stage=2&findex="+o+"&filepath="+t.path+"&action=updraft_download_backup":alert(updraftlion.download_timeout)},{error_callback:function(t,e,a,r){void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",console.log(r),alert(r),console.log(t))}})})}function remove_updraft_downloader(t,e){jQuery(t).closest(".updraftplus_downloader").fadeOut().remove(),0==jQuery(".updraftplus_downloader_container_"+e+" .updraftplus_downloader").length&&jQuery(".updraftplus_downloader_container_"+e).remove()}function updraft_downloader(t,e,a,r,n,o,d){"string"!=typeof n&&(n=n.toString()),jQuery(".ud_downloadstatus").show();var n=n.split(","),o=o||e,u=jQuery("#updraft-navtab-backups-content .uddownloadform_"+a+"_"+e+"_"+n[0]).data("wp_nonce").toString();jQuery(".updraftplus_downloader_container_"+a).length||(jQuery(r).append('
                '),jQuery(".updraftplus_downloader_container_"+a).append(''+updraftlion.download+" "+a+" ("+o+"):"));for(var s=0;s'+a+l+':
                '+updraftlion.begunlooking+'
                '),jQuery(p).data("downloaderfor",{base:t,nonce:e,what:a,index:n[s]}),setTimeout(function(){updraft_activejobs_update(!0)},1500)),jQuery(p).data("lasttimebegan",(new Date).getTime())}return updraft_send_command("updraft_download_backup",{type:a,timestamp:e,findex:n},function(t){},{action:"updraft_download_backup",nonce_key:"_wpnonce",nonce:u,timeout:1e4,async:d=!!d}),!1}function ud_parse_json(e,a){if(!(a=void 0!==a))try{return JSON.parse(e)}catch(t){console.log("UpdraftPlus: Exception when trying to parse JSON (1) - will attempt to fix/re-parse based upon first/last curly brackets"),console.log(e)}var r=e.indexOf("{"),n=e.lastIndexOf("}");if(-1 '+updraftlion.preparing_backup_files),updraft_send_command("restore_alldownloaded",{timestamp:jQuery("#updraft_restore_timestamp").val(),restoreopts:jQuery("#updraft_restore_form").serialize()},function(e,t,a){var r=null;jQuery("#updraft_restorer_restore_options").val(""),jQuery(".updraft-restore--next-step").prop("disabled",!1);try{if(null==e)jQuery("#updraft-restore-modal-stage2a").html(updraftlion.emptyresponse);else{var n=e.m;if(""!=e.w&&(n=n+'

                '+updraftlion.warnings+"

                "+e.w+"
                "),""!=e.e?n=n+'

                '+updraftlion.errors+"

                "+e.e+"
                ":updraft_restore_stage=3,e.hasOwnProperty("i")){try{(r=ud_parse_json(e.i)).hasOwnProperty("addui")&&(console.log("Further UI options are being displayed"),n+='
                '+r.addui+"
                ","object"==typeof JSON)&&"function"==typeof JSON.stringify&&(delete r.addui,e.i=JSON.stringify(r)),r.hasOwnProperty("php_max_input_vars")&&(php_max_input_vars=parseInt(r.php_max_input_vars)),r.hasOwnProperty("skipped_db_scan")&&(skipped_db_scan=parseInt(r.skipped_db_scan))}catch(t){console.log(t),console.log(e)}jQuery("#updraft_restorer_backup_info").val(e.i)}else jQuery("#updraft_restorer_backup_info").val();jQuery("#updraft-restore-modal-stage2a").html(n),jQuery(".updraft-restore--next-step").text(updraftlion.restore),0'+r.fatal_error_message+"

                "),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",jQuery("#updraft-restore-modal-stage2a").html('

                '+r+"

                "),console.log(r),alert(r),console.log(t))}}))}function updraft_downloader_status(t,e,a,r){}function updraft_downloader_status_update(t,n){var o=0;return jQuery(t).each(function(t,e){var a,r;""!=e.base&&(a="."+(e.base+e.timestamp+"_"+e.what+"_"+e.findex),null!=e.e?(jQuery(a+" .raw").html(""+updraftlion.error+" "+e.e),console.log(e)):null!=e.p?(jQuery(a+"_st .dlfileprogress").width(e.p+"%"),null!=e.a&&0"+updraftlion.downloadtocomputer+' \t\t\t\t",e.hasOwnProperty("can_show_contents")&&e.can_show_contents&&(r+=' "),jQuery(a+" .raw").html(r),jQuery(a+"_st").remove()))):null!=e.m?jQuery(a+" .raw").html(e.m):(jQuery(a+" .raw").html(updraftlion.jsonnotunderstood+" ("+n+")"),o=1))}),o}function updraft_backupnow_go(t,e,a,r,n,o,d,u){var s,t={backupnow_nodb:t,backupnow_nofiles:e,backupnow_nocloud:a,backupnow_label:o,extradata:n};""!=r&&(t.onlythisfileentity=r),""!=d&&(t.onlythesetableentities=d),""!=u&&(t.only_these_cloud_services=u),t.always_keep=void 0!==n.always_keep?n.always_keep:0,delete n.always_keep,t.incremental=void 0!==n.incremental?n.incremental:0,delete n.incremental,t.db_anon_all=void 0!==n.db_anon&&void 0!==n.db_anon.all?n.db_anon.all:0,t.db_anon_non_staff=void 0!==n.db_anon&&void 0!==n.db_anon.non_staff?n.db_anon.non_staff:0,t.db_anon_wc_orders=void 0!==n.db_anon&&void 0!==n.db_anon.wc_orders?n.db_anon.wc_orders:0,void 0!==n.db_anon&&(delete n.db_anon.all,delete n.db_anon.non_staff,delete n.db_anon.wc_orders),jQuery(".updraft_requeststart").length||((s=jQuery('
                ').html(''+updraftlion.requeststart)).data("remove",!1),setTimeout(function(){s.data("remove",!0)},3e3),setTimeout(function(){s.remove()},75e3),jQuery("#updraft_activejobsrow").before(s)),updraft_activejobslist_backupnownonce_only=1,updraft_send_command("backupnow",t,function(t){t.hasOwnProperty("error")?(jQuery(".updraft_requeststart").remove(),alert(t.error)):(jQuery("#updraft_backup_started").html(t.m),t.hasOwnProperty("nonce")&&(updraft_backupnow_nonce=t.nonce,console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce)),setTimeout(function(){updraft_activejobs_update(!0)},500))})}function updraft_process_status_check(t,e,a){if(t.hasOwnProperty("fatal_error"))console.error(t.fatal_error_message),!0===updraftplus_activejobs_list_fatal_error_alert&&(updraftplus_activejobs_list_fatal_error_alert=!1,alert(this.alert_done+" "+t.fatal_error_message));else try{t.hasOwnProperty("l")&&(t.l?(jQuery("#updraft_lastlogmessagerow").show(),jQuery("#updraft_lastlogcontainer").html(t.l)):(jQuery("#updraft_lastlogmessagerow").hide(),jQuery("#updraft_lastlogcontainer").html("("+updraftlion.nothing_yet_logged+")"))),updraftlion.hasOwnProperty("hosting_restriction")&&updraftlion.hosting_restriction instanceof Array&&(updraftlion.hosting_restriction.length=0,t.hasOwnProperty("hosting_restriction"))&&(t.hosting_restriction&&t.hosting_restriction.includes("only_one_backup_per_month")&&updraftlion.hosting_restriction.push("only_one_backup_per_month"),t.hosting_restriction)&&t.hosting_restriction.includes("only_one_incremental_per_day")&&updraftlion.hosting_restriction.push("only_one_incremental_per_day"),jQuery("#updraft-wrap #updraft-navtab-settings-content").is(":hidden")||t.hasOwnProperty("automatic_updates")&&jQuery('input[name="updraft_auto_updates"]').prop("checked",t.automatic_updates);var r,n,o=-1,d=jQuery(".updraft_requeststart"),u=(t.j&&d.length&&d.data("remove")&&d.remove(),jQuery(t.j)),s=(u.find(".updraft_jobtimings").each(function(t,e){var a,e=jQuery(e);e.data("jobid")&&(a=e.data("jobid"),e=e.closest(".updraft_row"),updraft_aborted_jobs[a])&&e.hide()}),jQuery("#updraft_activejobsrow").html(u),u.find('.job-id[data-isclone="1"]'));0updraft_last_forced_when+1e5&&(updraft_last_forced_jobid!=a||e!=updraft_last_forced_resumption)&&(updraft_last_forced_resumption=e,updraft_last_forced_jobid=a,updraft_last_forced_when=timenow,console.log("UpdraftPlus: force resumption: job_id="+a+", resumption="+e),updraft_send_command("forcescheduledresumption",{resumption:e,job_id:a},function(t){console.log(t)},{json_parse:!1,alert_on_error:!1}))}),timenow=(new Date).getTime(),updraft_activejobs_nextupdate=timenow+18e4,1==updraft_page_is_visible&&"backups"==updraft_console_focussed_tab&&(updraft_activejobs_nextupdate=-1"+updraftlion.error+" "+updraftlion.servererrorcode)):0<=a.url.search("subaction=restore_alldownloaded")&&jQuery("#updraft-restore-modal-stage2a").append("
                "+updraftlion.error+" "+updraftlion.servererrorcode+": "+r))}),jQuery(function(h){var e;h(document).on("udp/checkout/done",function(t,e){e.hasOwnProperty("product")&&"updraftpremium"===e.product&&"complete"===e.status&&(h(".premium-upgrade-purchase-success").show(),h(".updraft_feat_table").closest("section").hide(),h(".updraft_premium_cta__action").hide())}),h(".expertmode .advanced_settings_container .advanced_tools_button").on("click",function(){var t;t=h(this).attr("id"),h('.expertmode .advanced_settings_container .advanced_tools:not(".'+t+'")').hide(),h(".expertmode .advanced_settings_container .advanced_tools."+t).fadeIn("slow"),h(".expertmode .advanced_settings_container .advanced_tools_button:not(#"+t+")").removeClass("active"),h(".expertmode .advanced_settings_container .advanced_tools_button#"+t).addClass("active")}),jQuery.ui&&jQuery.ui.dialog&&jQuery.ui.dialog.prototype._allowInteraction&&(e=jQuery.ui.dialog.prototype._allowInteraction,jQuery.ui.dialog.prototype._allowInteraction=function(t){return!!jQuery(t.target).closest(".select2-dropdown").length||e.apply(this,arguments)}),h("#updraft-navtab-settings-content #remote-storage-holder").on("change keyup paste",".updraft_webdav_settings",function(){var t,e,r=[],a=(h(".updraft_webdav_settings").each(function(t,e){var a,e=h(e).attr("id");e&&"updraft_webdav_"==e.substring(0,15)&&(e=e.substring(15),e=(id_split=e.split("_"))[0],a=id_split[1],void 0===r[a]&&(r[a]=[]),r[a][e]=this.value)}),"@"),n="/",o=":",d=":";for(e in r)(0<=r[e].host.indexOf("@")||""===r[e].host)&&(a=""),0<=r[e].host.indexOf("/")?h(".webdav-"+e+" .updraft_webdav_host_error").show():h(".webdav-"+e+" .updraft_webdav_host_error").hide(),0!=r[e].path.indexOf("/")&&""!==r[e].path||(n=""),""!==r[e].user&&""!==r[e].pass||(o=""),""!==r[e].host&&""!==r[e].port||(d=""),t=r[e].webdav+r[e].user+o+r[e].pass+a+encodeURIComponent(r[e].host)+d+r[e].port+n+r[e].path,masked_webdav_url=r[e].webdav+r[e].user+o+r[e].pass.replace(/./gi,"*")+a+encodeURIComponent(r[e].host)+d+r[e].port+n+r[e].path,h("#updraft_webdav_url_"+e).val(t),h("#updraft_webdav_masked_url_"+e).val(masked_webdav_url)}),h("div.ud-phpseclib-notice").on("click","button.notice-dismiss",function(t){t.stopImmediatePropagation(),updraft_send_command("dismiss_phpseclib_notice",null,function(t,e,a){t.hasOwnProperty("success")&&1===t.success||(console.log(t),alert(updraftlion.unexpectedresponse+" "+a))})}),h("#updraft-navtab-backups-content").on("click",".js--delete-selected-backups",function(t){t.preventDefault(),updraft_deleteallselected()}),h("#updraft-navtab-backups-content").on("click",".updraft_existing_backups .backup-select input",function(t){updraft_backups_selection.toggle(h(this).closest(".updraft_existing_backups_row"))}),h("#updraft-navtab-backups-content").on("click","#cb-select-all",function(t){h(this).is(":checked")?updraft_backups_selection.selectAll():updraft_backups_selection.deselectAll()}),h("#updraft-wrap").on("click","[id^=updraftplus_manual_authorisation_submit_]",function(t){t.preventDefault();var e,t=h(this).data("method"),a=h("#updraftplus_manual_authentication_data_"+t).val();h("#updraftplus_manual_authentication_error_"+t).text(),h("#updraft-wrap #updraftplus_manual_authorisation_template_"+t+" .updraftplus_spinner.spinner").addClass("visible"),h("#updraftplus_manual_authorisation_submit_"+t).prop("disabled",!0),updraft_send_command("manual_remote_storage_authentication",{method:e=t,auth_data:a},function(t){h("#updraft-wrap #updraftplus_manual_authorisation_template_"+e+" .updraftplus_spinner.spinner").removeClass("visible"),t.hasOwnProperty("result")&&"success"===t.result?(h("#updraft-wrap .updraftplus-top-menu").before(t.data),h("#updraft-wrap #updraftplus_manual_authorisation_template_"+e).parent().remove(),h("#updraft-wrap .updraft_authenticate_"+e).remove()):t.hasOwnProperty("result")&&"error"===t.result&&(h("#updraftplus_manual_authentication_error_"+e).text(t.data),h("#updraftplus_manual_authorisation_submit_"+e).prop("disabled",!1))})}),h("#updraft-navtab-backups-content").on("click",".js--select-all-backups",function(t){updraft_backups_selection.selectAll()}),h("#updraft-navtab-backups-content").on("click",".js--deselect-all-backups",function(t){updraft_backups_selection.deselectAll()}),h("#updraft-navtab-backups-content").on("click",".updraft_existing_backups .updraft_existing_backups_row",function(t){(t.ctrlKey||t.metaKey)&&(t.shiftKey?(void 0===updraft_backups_selection.firstMultipleSelectionIndex?(h(document).on("keyup.MultipleSelection",function(t){updraft_backups_selection.unregister_highlight_mode(),h(document).off(".MultipleSelection")}),updraft_backups_selection.select(this),h(this).addClass("range-selection-start"),updraft_backups_selection.register_highlight_mode()):(updraft_backups_selection.selectAllInBetween(this),jQuery("#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row").removeClass("range-selection")),updraft_backups_selection.firstMultipleSelectionIndex=this.rowIndex-1):updraft_backups_selection.toggle(this))}),updraft_backups_selection.checkSelectionStatus(),h("#updraft-navtab-addons-content .wrap").on("click",".updraftplus_com_login .ud_connectsubmit",function(t){t.preventDefault();var t=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_email").val(),e=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_password").val(),a=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_updates").is(":checked")?1:0,r=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_udc_connect").is(":checked")?1:0;n.submit({email:t,password:e,auto_update:a,auto_udc_connect:r})}),h("#updraft-navtab-addons-content .wrap").on("keydown",".updraftplus_com_login input",function(t){var e,a,r;13==t.which&&(t.preventDefault(),t=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_email").val(),e=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_password").val(),a=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_updates").is(":checked")?1:0,r=h("#updraft-navtab-addons-content .wrap .updraftplus_com_login #updraftplus-addons_options_auto_udc_connect").is(":checked")?1:0,n.submit({email:t,password:e,auto_update:a,auto_udc_connect:r}))}),h("#updraft-navtab-migrate-content").on("click",".updraftclone_show_step_1",function(t){h(".updraftplus-clone").addClass("opened"),h(".updraftclone_show_step_1").hide(),h(".updraft_migrate_widget_temporary_clone_stage1").show(),h(".updraft_migrate_widget_temporary_clone_stage0").hide()}),h("#updraft-navtab-migrate-content").on("click",".updraft_migrate_widget_temporary_clone_show_stage0",function(t){t.preventDefault(),h(".updraft_migrate_widget_temporary_clone_stage0").toggle()}),setup_migrate_tabs(),h("#updraft-navtab-migrate-content").on("click",".updraft_migrate_widget_module_content .close",function(t){h(".updraft_migrate_intro").show(),h(this).closest(".updraft_migrate_widget_module_content").hide()}),h("#updraft-navtab-migrate-content").on("click","#updraft_migrate_tab_alt .close",function(t){t.preventDefault(),h(".updraft_migrate_intro").show(),h("#updraft_migrate_tab_alt").html("").hide()}),h("#updraft-navtab-migrate-content").on("click",".updraft_migrate_add_site--trigger",function(t){t.preventDefault(),h(".updraft_migrate_add_site").toggle()}),h("#updraft-navtab-migrate-content").on("click",".updraft_migrate_widget_module_content .updraftplus_com_login .ud_connectsubmit",function(t){t.preventDefault();var t=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_email").val(),e=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_password").val(),a=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code").val(),r=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .temporary_clone_terms_and_conditions").is(":checked")?1:0;t&&e?o({form_data:{email:t,password:e,two_factor_code:a,consent:r}}):h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status").html(""+updraftlion.error+" "+updraftlion.username_password_required).show()}),h("#updraft-navtab-migrate-content").on("keydown",".updraft_migrate_widget_module_content .updraftplus_com_login input",function(t){var e,a,r;13==t.which&&(t.preventDefault(),t=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_email").val(),e=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_password").val(),a=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code").val(),r=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .temporary_clone_terms_and_conditions").is(":checked")?1:0,t&&e?o({form_data:{email:t,password:e,two_factor_code:a,consent:r}}):h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status").html(""+updraftlion.error+" "+updraftlion.username_password_required).show())}),h("#updraft-navtab-migrate-content").on("click",".updraft_migrate_widget_module_content .updraftplus_com_key .ud_key_connectsubmit",function(t){t.preventDefault();var t=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key #temporary_clone_options_key").val(),e=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .temporary_clone_terms_and_conditions").is(":checked")?1:0;t?a({form_data:{clone_key:t,consent:e}}):h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status").html(""+updraftlion.error+" "+updraftlion.clone_key_required).show()}),h("#updraft-navtab-migrate-content").on("keydown",".updraft_migrate_widget_module_content .updraftplus_com_key input",function(t){var e;13==t.which&&(t.preventDefault(),t=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key #temporary_clone_options_key").val(),e=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .temporary_clone_terms_and_conditions").is(":checked")?1:0,t?a({form_data:{clone_key:t,consent:e}}):h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status").html(""+updraftlion.error+" "+updraftlion.clone_key_required).show())}),h("#updraft-navtab-migrate-content").on("change",".updraft_migrate_widget_module_content #updraftplus_clone_php_options",function(){var t=h(this).data("php_version");h(this).val() option").each(function(){var t=h(this).val();"starter"==t&&h('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+t+'"]').prop("selected",!0),h('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+t+'"]').prop("disabled",!1)});var a,t=h(this).find("option:selected");"current"!=h(t).data("nonce")&&"wp_only"!=h(t).data("nonce")&&(a=h(t).data("size"),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options > option").each(function(){var t=h(this).data("size"),e=h(this).val();if(!(t<=a))return h('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+e+'"]').prop("selected",!0),!1;h('#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options option[value="'+e+'"]').prop("disabled",!0)}))}),h("#updraft-navtab-migrate-content").on("click",".updraft_migrate_widget_module_content #updraft_migrate_createclone",function(t){t.preventDefault(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone").prop("disabled",!0),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status").html(""),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner").addClass("visible");var t=h(this).data("clone_id"),e=h(this).data("secret_token"),a=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_php_options").val(),r=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_wp_options").val(),n=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_region_options").val(),o=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_package_options").val(),d=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_updraftclone_branch").val(),u=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_updraftplus_branch").val(),s=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_admin_login_options").is(":checked"),i=h("#updraftplus_clone_use_queue").is(":checked")?1:0,p=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_all").is(":checked")?1:0,l=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_non_staff").is(":checked")?1:0,_=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backupnow_db_anon_wc_order_data").is(":checked")?1:0,c="current",f="current",m=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backup_options").length,g=h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraftplus_clone_backup_options").find("option:selected"),m=(0!==m&&void 0!==g&&(c=g.data("nonce"),f=g.data("timestamp")),{form_data:{clone_id:t,secret_token:e,install_info:{php_version:a,wp_version:r,region:n,package:o,admin_only:s,updraftclone_branch:void 0===d?"":d,updraftplus_branch:void 0===u?"":u,use_queue:void 0===i?1:i}}}),g={db_anon_all:p,db_anon_non_staff:l,db_anon_wc_orders:_,clone_region:n};"wp_only"===c&&(m.form_data.install_info.wp_only=1),function t(r,n,o,d){var u="";"current"!=n&&updraft_send_command("whichdownloadsneeded",{updraftplus_clone:!0,timestamp:n},function(t){if(t.hasOwnProperty("downloads")&&(console.log("UpdraftPlus: items which still require downloading follow"),u=t.downloads,console.log(u)),0!=u.length)for(var e=0;e'+r.fatal_error_message+"

                ")):(r="updraft_send_command: error: "+e+" ("+a+")",h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status").html('

                '+r+"

                "),console.log(r),console.log(t))}});setTimeout(function(){var e,a;0!=u.length?t(r,n,o,d):(e=r.form_data.clone_id,a=r.form_data.secret_token,updraft_send_command("process_updraftplus_clone_create",r,function(t){try{h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone").prop("disabled",!1),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner").removeClass("visible"),t.hasOwnProperty("status")&&"error"==t.status?h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status").html(updraftlion.error+" "+t.message).show():"success"===t.status&&(h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage3").show(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage3").html(t.html),temporary_clone_timeout&&clearTimeout(temporary_clone_timeout),t.hasOwnProperty("secret_token")&&(a=t.secret_token),"wp_only"===o?(jQuery("#updraft_clone_progress .updraftplus_spinner.spinner").addClass("visible"),y(e,a)):(jQuery("#updraft_clone_progress .updraftplus_spinner.spinner").addClass("visible"),b(e,a,t.url,t.key,o,n,d)))}catch(t){h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_migrate_createclone").prop("disabled",!1),console.log("Error when processing the response of process_updraftplus_clone_create (as follows)"),console.log(t)}}))},5e3)}(m,f,c,g)});var n={};function o(t){h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status").html("").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .updraftplus_spinner.spinner").addClass("visible"),updraft_send_command("process_updraftplus_clone_login",t,function(t){try{h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login .updraftplus_spinner.spinner").removeClass("visible"),t.hasOwnProperty("status")&&"error"==t.status?(h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login_status").html(t.message).show(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields").show(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_login #temporary_clone_options_two_factor_code").val("")):(t.hasOwnProperty("tfa_enabled")&&1==t.tfa_enabled&&(h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields").show(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 input#temporary_clone_options_two_factor_code").trigger("focus")),"authenticated"===t.status&&(h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .non_tfa_fields").show(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 .tfa_fields").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1 input#temporary_clone_options_two_factor_code").val(""),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2").show(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2").html(t.html),t.hasOwnProperty("clone_info"))&&t.clone_info.hasOwnProperty("expires_after")&&r(t.clone_info.expires_after))}catch(t){console.log(t)}})}function a(t){h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status").html("").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .updraftplus_spinner.spinner").addClass("visible"),updraft_send_command("process_updraftplus_clone_login",t,function(t){try{h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key .updraftplus_spinner.spinner").removeClass("visible"),t.hasOwnProperty("status")&&"error"==t.status?h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_com_key_status").html(t.message).show():"authenticated"===t.status&&(h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2").show(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2").html(t.html),t.hasOwnProperty("clone_info"))&&t.clone_info.hasOwnProperty("expires_after")&&r(t.clone_info.expires_after)}catch(t){console.log(t)}})}function r(t){temporary_clone_timeout=setTimeout(function(){h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2").hide(),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage2").html(""),h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraft_migrate_widget_temporary_clone_stage1").show()},1e3*t)}function b(t,e,a,r,n,o,d){t={updraftplus_clone_backup:1,backupnow_nodb:0,backupnow_nofiles:0,backupnow_nocloud:0,backupnow_label:"UpdraftClone",extradata:"",onlythisfileentity:"plugins,themes,uploads,others",clone_id:t,secret_token:e,clone_url:a,key:r,backup_nonce:n,backup_timestamp:o,db_anon_all:d.db_anon_all,db_anon_non_staff:d.db_anon_non_staff,db_anon_wc_orders:d.db_anon_wc_orders,clone_region:d.clone_region};updraft_activejobslist_backupnownonce_only=1,updraft_send_command("backupnow",t,function(t){jQuery("#updraft_clone_progress .updraftplus_spinner.spinner").removeClass("visible"),jQuery("#updraft_backup_started").html(t.m),t.hasOwnProperty("nonce")&&(updraft_backupnow_nonce=t.nonce,updraft_clone_jobs.push(updraft_backupnow_nonce),updraft_inpage_success_callback=function(){jQuery("#updraft_clone_activejobsrow").hide(),updraft_aborted_jobs[updraft_backupnow_nonce]?jQuery("#updraft_clone_progress").html(updraftlion.clone_backup_aborted):jQuery("#updraft_clone_progress").html(updraftlion.clone_backup_complete)},console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce)),updraft_activejobs_update(!0)})}function y(e,a){var t={clone_id:e,secret_token:a};setTimeout(function(){updraft_send_command("process_updraftplus_clone_poll",t,function(t){if(t.hasOwnProperty("status")){if("error"==t.status)return void h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_clone_status").html(updraftlion.error+" "+t.message).show();if("success"===t.status&&t.hasOwnProperty("data")&&t.data.hasOwnProperty("wordpress_credentials"))return h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content .updraftplus_spinner.spinner").removeClass("visible"),void h("#updraft-navtab-migrate-content .updraft_migrate_widget_module_content #updraft_clone_progress").append("
                WordPress "+updraftlion.credentials+":
                "+updraftlion.username+": "+t.data.wordpress_credentials.username+"
                "+updraftlion.password+": "+t.data.wordpress_credentials.password)}else console.log(t);y(e,a)})},6e4)}function d(t){var e=Handlebars.compile(updraftlion.remote_storage_templates[t]),a={},r=(Object.assign(a,updraftlion.remote_storage_options[t].template_properties,updraftlion.remote_storage_options[t].default),updraftlion.remote_storage_methods[t]),r=(a.instance_id="s-"+function(t){for(var e="",a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r=0;r li").each(function(){jQuery(this).find("select").each(function(){jQuery(this).prop("disabled",!1)})})):(jQuery(this).parents("tr.updraftplusmethod").find("div.logic ul.rules > li").each(function(){jQuery(this).find("select").each(function(){jQuery(this).prop("disabled",!0)})}),jQuery(this).parents("tr.updraftplusmethod").find("div.logic").hide())}),jQuery("#updraft-navtab-settings-content #remote-storage-holder").on("change","select[class='conditional_logic_operand']",function(){if(updraft_settings_form_changed=!0,jQuery(this).parent().find("select:nth(2)").empty(),"day_of_the_week"===jQuery(this).val())for(var t=0;t').text(updraftlion.conditional_logic.day_of_the_week_options[t].value));else if("day_of_the_month"===jQuery(this).val())for(t=1;t<=31;t++)jQuery(this).parent().find("select:nth(2)").append(jQuery('').text(t))}),jQuery("#updraft-navtab-settings-content #remote-storage-holder").on("click","div.conditional_remote_backup ul.rules li span",function(){updraft_settings_form_changed=!0;var t=jQuery(this).parents("ul.rules");jQuery(this).hasClass("remove-rule")&&jQuery(this).parent().slideUp(function(){jQuery(this).remove(),jQuery(t).find("> li").length<2&&jQuery("li:nth(0) span.remove-rule",t).remove()})}),jQuery("#updraft-navtab-settings-content #remote-storage-holder").on("click","div.conditional_remote_backup input.add-new-rule",function(){var t=jQuery(this).parent().find("ul.rules");jQuery(t).find("> li").length<2&&jQuery(t).find("li:nth(0)").append(''),$cloned_item=jQuery(t).find("> li").last().clone(),jQuery($cloned_item).find("> select").each(function(){jQuery(this).prop("name",jQuery(this).prop("name").replace(/\[instance_conditional_logic\]\[rules\]\[[0-9]+\]/gi,"[instance_conditional_logic][rules]["+jQuery(t).data("rules")+"]"))}),jQuery(t).append($cloned_item),jQuery(t).data("rules",parseInt(jQuery(t).data("rules"))+1),jQuery($cloned_item).find('select[name*="[operand]"]').trigger("change")}),jQuery("#updraft-navtab-settings-content #remote-storage-holder").on("click",".updraftplusmethod button.updraft-test-button",function(){var r=jQuery(this).data("method"),n=jQuery(this).data("instance_id");updraft_remote_storage_test(r,function(t,e,a){return"sftp"==r&&(a.hasOwnProperty("scp")&&a.scp?alert(updraftlion.settings_test_result.replace("%s","SCP")+" "+t.output):alert(updraftlion.settings_test_result.replace("%s","SFTP")+" "+t.output),t.hasOwnProperty("data")&&t.data&&t.data.hasOwnProperty("valid_md5_fingerprint")&&t.data.valid_md5_fingerprint&&h("#updraft_sftp_fingerprint_"+n).val(t.data.valid_md5_fingerprint),!0)},n)}),h("#updraft-navtab-settings-content select.updraft_interval, #updraft-navtab-settings-content select.updraft_interval_database").on("change",function(){updraft_check_same_times()}),h("#backupnow_includefiles_showmoreoptions").on("click",function(t){t.preventDefault(),h("#backupnow_includefiles_moreoptions").toggle()}),h("#backupnow_database_showmoreoptions").on("click",function(t){t.preventDefault(),h("#backupnow_database_moreoptions").toggle()}),h("#updraft-navtab-migrate-content").on("click","#backupnow_database_showmoreoptions",function(t){t.preventDefault(),h("#updraft-navtab-migrate-content #backupnow_database_moreoptions").toggle()}),h("#backupnow_db_anon_all").on("click",function(t){h("#backupnow_db_anon_non_staff").prop("checked")&&h("#backupnow_db_anon_non_staff").prop("checked",!1)}),h("#backupnow_db_anon_non_staff").on("click",function(t){h("#backupnow_db_anon_all").prop("checked")&&h("#backupnow_db_anon_all").prop("checked",!1)}),h("#updraft-navtab-migrate-content").on("click","#updraftplus_migration_backupnow_db_anon_all",function(){h("#updraftplus_migration_backupnow_db_anon_non_staff").prop("checked")&&h("#updraftplus_migration_backupnow_db_anon_non_staff").prop("checked",!1)}),h("#updraft-navtab-migrate-content").on("click","#updraftplus_migration_backupnow_db_anon_non_staff",function(){h("#updraftplus_migration_backupnow_db_anon_all").prop("checked")&&h("#updraftplus_migration_backupnow_db_anon_all").prop("checked",!1)}),h("#updraft-navtab-migrate-content").on("click","#updraftplus_clone_backupnow_db_anon_all",function(){h("#updraftplus_clone_backupnow_db_anon_non_staff").prop("checked")&&h("#updraftplus_clone_backupnow_db_anon_non_staff").prop("checked",!1)}),h("#updraft-navtab-migrate-content").on("click","#updraftplus_clone_backupnow_db_anon_non_staff",function(){h("#updraftplus_clone_backupnow_db_anon_all").prop("checked")&&h("#updraftplus_clone_backupnow_db_anon_all").prop("checked",!1)}),h("#updraft-backupnow-modal").on("click","#backupnow_includecloud_showmoreoptions",function(t){t.preventDefault(),h("#backupnow_includecloud_moreoptions").toggle()}),h("#updraft-navtab-backups-content").on("click","a.updraft_diskspaceused_update",function(t){t.preventDefault(),updraftplus_diskspace()}),h(".advanced_settings_content a.updraft_diskspaceused_update").on("click",function(t){t.preventDefault(),jQuery(".advanced_settings_content .updraft_diskspaceused").html(""+updraftlion.calculating+""),updraft_send_command("get_fragment",{fragment:"disk_usage",data:"updraft"},function(t){jQuery(".advanced_settings_content .updraft_diskspaceused").html(t.output)},{type:"GET"})}),h("#updraft-navtab-backups-content a.updraft_uploader_toggle").on("click",function(t){t.preventDefault(),h("#updraft-plupload-modal").slideToggle()}),h("#updraft-navtab-backups-content a.updraft_rescan_local").on("click",function(t){t.preventDefault(),updraft_updatehistory(1,0)}),h("#updraft-navtab-backups-content a.updraft_rescan_remote").on("click",function(t){t.preventDefault(),confirm(updraftlion.remote_scan_warning)&&updraft_updatehistory(1,1)}),h("#updraftplus-remote-rescan-debug").on("click",function(t){t.preventDefault(),updraft_updatehistory(1,1,1)}),jQuery("#updraft_reset_sid").on("click",function(t){t.preventDefault(),updraft_send_command("reset_site_id",null,function(t){jQuery("#updraft_show_sid").html(t)},{json_parse:!1})}),jQuery("#updraft-navtab-settings-content form input:not('.udignorechange'), #updraft-navtab-settings-content form select").on("change",function(t){updraft_settings_form_changed=!0}),jQuery("#updraft-navtab-settings-content form input[type='submit']").on("click",function(t){updraft_settings_form_changed=!1});var u=180,t=(jQuery(".updraft-bigbutton").each(function(t,e){e=jQuery(e).width();u'+t.count_backups+"");for(a=0;a '+updraftlion.maybe_downloading_entities),updraft_send_command("whichdownloadsneeded",{downloads:s,timestamp:_},function(t){if(h(".updraft-restore--next-step").prop("disabled",!1),t.hasOwnProperty("downloads")&&(console.log("UpdraftPlus: items which still require downloading follow"),l=t.downloads,console.log(l)),0==l.length)updraft_restorer_checkstage2(0);else for(var e=0;e'+r.fatal_error_message+"

                ")):(r="updraft_send_command: error: "+e+" ("+a+")",h("#updraft-restore-modal-stage2a").html('

                '+r+"

                "),console.log(r),console.log(t))}})}catch(t){console.log("UpdraftPlus: error (follows) when looking for items needing downloading"),console.log(t),alert(updraftlion.jsonnotunderstood)}}else if(2==updraft_restore_stage)updraft_restorer_checkstage2(1);else if(3==updraft_restore_stage){var c=1;if(jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!0),h("#updraft_restoreoptions_ui input.required").each(function(t){var e,a;0!=c&&(""==(e=h(this).val())?(alert(updraftlion.pleasefillinrequired),jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!1),c=0):""!=h(this).attr("pattern")&&(a=h(this).attr("pattern"),new RegExp(a,"g").test(e)||(alert(h(this).data("invalidpattern")),jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!1),c=0)))}),1!=o||(r=0,jQuery('input[name="updraft_restore_tables_options[]"').each(function(t,e){jQuery(e).is(":checked")&&!jQuery(e).is(":disabled")&&(r=1)}),0!=r)||skipped_db_scan){if(1==d&&(r=0,jQuery(".updraftplus_restore_plugins_options_container").length||(r=1),jQuery('input[name="updraft_restore_plugins_options[]"').each(function(t,e){jQuery(e).is(":checked")&&!jQuery(e).is(":disabled")&&(r=1)}),0==r))alert(updraftlion.youdidnotselectany),jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!1);else if(1==u&&(r=0,jQuery(".updraftplus_restore_themes_options_container").length||(r=1),jQuery('input[name="updraft_restore_themes_options[]"').each(function(t,e){jQuery(e).is(":checked")&&!jQuery(e).is(":disabled")&&(r=1)}),0==r))alert(updraftlion.youdidnotselectany),jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!1);else if(1==n&&(r=0,jQuery('input[name="updraft_include_more_index[]"').each(function(t,e){jQuery(e).is(":checked")&&!jQuery(e).is(":disabled")&&(r=1,""==jQuery("#updraft_include_more_path_restore"+t).val())&&alert(updraftlion.emptyrestorepath)}),0==r))alert(updraftlion.youdidnotselectany),jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!1);else if(c){var f=h("#updraft_restoreoptions_ui select, #updraft_restoreoptions_ui input").serialize();if(jQuery.each(["table","plugins","themes"],function(t,a){jQuery.each(jQuery('input[name="updraft_restore_'+a+"_options[]").filter(function(t){return!1===jQuery(this).prop("checked")}),function(t,e){f+="&"+jQuery(e).attr("name")+"=udp-skip-"+a+"-"+jQuery(e).val()})}),console.log("Restore options: "+f),void 0!==php_max_input_vars){var t,e=f.split("&").length,m='

                '+updraftlion.warnings+'

                  ';if(!php_max_input_vars&&1e3<=e)console.log("Restore options: "+e+" PHP max input vars not detected; using default: 1000");else if(php_max_input_vars&&php_max_input_vars<=e)return t="
                • "+updraftlion.php_max_input_vars_detected_warning+"
                • ",1!=jQuery("#updraft-restore-modal-stage2a .notice-warning").length?(m=m+t+"
                ",jQuery("#updraft_restoreoptions_ui").prepend(m)):jQuery("#updraft-restore-modal-stage2a #updraft_restore_warnings").append(t),console.log("Restore options: "+e+" PHP max input vars: "+php_max_input_vars),jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!1),void(php_max_input_vars=void 0)}h("#updraft_restorer_restore_options").val(f),h("#updraft-restore-modal-stage2a").html(updraftlion.restore_proceeding),h("#updraft_restore_form").trigger("submit"),updraft_restore_stage=4}}else alert(updraftlion.youdidnotselectany),jQuery(".updraft-restore--next-step, .updraft-restore--cancel").prop("disabled",!1)}}else alert(updraftlion.youdidnotselectany)}},p=h(".updraft_restore_main--activity").width(),t=(jQuery("#activity-full-log").on("click",function(){var t="1460px"==h(".updraft_restore_main").css("max-width")?"860px":"1460px",e=h(".updraft_restore_main--activity").width()==p?"100%":p+"px",a="600px"==h(".updraft_restore_main--activity").css("min-height")?"0px":"600px",r=h("#activity-full-log").attr("title")==updraftlion.restoreactivitylogscreenexit?updraftlion.restoreactivitylogfullscreen:updraftlion.restoreactivitylogscreenexit;h("#activity-full-log").toggleClass("dashicons-fullscreen-exit-alt"),h("#activity-full-log").attr("title",r),h(".updraft_restore_main--components").toggle("fast"),h(".updraft_restore_main--header").toggle("fast"),h(".updraft_restore_main--activity").animate({minHeight:a,width:e}),h(".updraft_restore_main").animate({maxWidth:t})}),jQuery("#updraft-iframe-modal").dialog({autoOpen:!1,height:500,width:780,modal:!0}),jQuery("#updraft-backupnow-inpage-modal").dialog({autoOpen:!1,modal:!0,resizeOnWindowResize:!0,scrollWithViewport:!0,resizeAccordingToViewport:!0,useContentSize:!1,open:function(t,e){h(this).dialog("option","width",580),h(this).dialog("option","minHeight",261),h(this).dialog("option","height",380)}}),{});t[updraftlion.backupnow]=function(){var t,e,a=jQuery("#backupnow_includedb").is(":checked")?0:1,r=jQuery("#backupnow_includefiles").is(":checked")?0:1,n=jQuery("#backupnow_includecloud").is(":checked")?0:1,o=jQuery("#backupnow_db_anon_all").is(":checked")?1:0,d=jQuery("#backupnow_db_anon_non_staff").is(":checked")?1:0,u=jQuery("#backupnow_db_anon_wc_order_data").is(":checked")?1:0,s=backupnow_whichtables_checked(""),i=jQuery("#always_keep").is(":checked")?1:0,p="incremental"==jQuery("#updraft-backupnow-modal").data("backup-type")?1:0;updraftlion.hosting_restriction.includes("only_one_backup_per_month")&&!p?alert(updraftlion.hosting_restriction_one_backup_permonth):updraftlion.hosting_restriction.includes("only_one_incremental_per_day")&&p?alert(updraftlion.hosting_restriction_one_incremental_perday):""==s&&0==a?(alert(updraftlion.notableschosen),jQuery("#backupnow_database_moreoptions").show()):("boolean"==typeof s&&(s=null),""==(t=backupnow_whichfiles_checked(""))&&0==r?(alert(updraftlion.nofileschosen),jQuery("#backupnow_includefiles_moreoptions").show()):""==(e=jQuery("input[name^='updraft_include_remote_service_']").serializeArray())&&0==n?(alert(updraftlion.nocloudserviceschosen),jQuery("#backupnow_includecloud_moreoptions").show()):("boolean"==typeof e&&(e=null),a&&r?alert(updraftlion.excludedeverything):(jQuery(this).dialog("close"),setTimeout(function(){jQuery("#updraft_lastlogmessagerow").fadeOut("slow",function(){jQuery(this).fadeIn("slow")})},1700),updraft_backupnow_go(a,r,n,t,{always_keep:i,incremental:p,db_anon:{all:o,non_staff:d,wc_orders:u}},jQuery("#backupnow_label").val(),s,e))))},t[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-backupnow-modal").dialog({autoOpen:!1,resizeOnWindowResize:!0,scrollWithViewport:!0,resizeAccordingToViewport:!0,useContentSize:!1,open:function(t,e){h(this).dialog("option","width",610),h(this).dialog("option","minHeight",300),h(this).dialog("option","height",472)},modal:!0,buttons:t,create:function(){h(this).closest(".ui-dialog").find(".ui-dialog-buttonpane .ui-button").first().addClass("js-tour-backup-now-button")}}),jQuery("#updraft-poplog").dialog({autoOpen:!1,modal:!0,resizeOnWindowResize:!0,scrollWithViewport:!0,resizeAccordingToViewport:!0,useContentSize:!1,open:function(t,e){h(this).dialog("option","width",860),h(this).dialog("option","minHeight",260),600'+r.fatal_error_message+"

                "),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",jQuery("#updraft_zip_files_jstree").html('

                '+r+"

                "),console.log(r),alert(r),console.log(t))}})},error:function(t){alert(t),console.log(t)}},search:{show_only_matches:!0},plugins:["sort"]}):"contain-clause"==t&&jQuery("#updraft_exclude_files_folders_wildcards_jstree").jstree({core:{multiple:!1,data:function(t,e){updraft_send_command("get_jstree_directory_nodes",{entity:"filebrowser",directories_only:1,node:t,path:jQuery("#updraft_exclude_modal_path").val(),findex:0,skip_root_node:0},function(t){t.hasOwnProperty("error")?alert(t.error):e.call(this,t.nodes)},{error_callback:function(t,e,a,r){void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),jQuery("#updraft_zip_files_jstree").html('

                '+r.fatal_error_message+"

                "),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",jQuery("#updraft_zip_files_jstree").html('

                '+r+"

                "),console.log(r),alert(r),console.log(t))}})},error:function(t){alert(t),console.log(t)}},search:{show_only_matches:!0},plugins:["sort"]}),jQuery("#updraft_exclude_modal_main").slideUp(),jQuery(".updraft-exclude-panel").hide(),jQuery(".updraft-exclude-panel[data-panel="+t+"]").slideDown()}),jQuery(".updraft-exclude-modal-reset").on("click",function(t){t.preventDefault(),jQuery("#updraft_exclude_files_folders_jstree").jstree("destroy"),jQuery("#updraft_exclude_files_folders_wildcards_jstree").jstree("destroy"),jQuery("#updraft_exclude_extension_field").val(""),jQuery("#updraft_exclude_prefix_field").val(""),jQuery(".updraft-exclude-panel").slideUp(),jQuery("#updraft_exclude_modal_main").slideDown()}),jQuery(".updraft-exclude-submit").on("click",function(){var t,e="";switch(jQuery(this).data("panel")){case"file-dir":if(0==(t=jQuery("#updraft_exclude_files_folders_jstree").jstree("get_selected")).length)return void alert(updraftlion.exclude_select_file_or_folder_msg);var a=t[0],r=jQuery("#updraft_exclude_modal_path").val(),e=a="/"==(a="/"==(a=a.substr(0,r.length)==r?a.substr(r.length,a.length):a).charAt(0)?a.substr(1):a).charAt(a.length-1)?a.substr(0,a.length-1):a;break;case"extension":var n=jQuery("#updraft_exclude_extension_field").val();if(""==n)return void alert(updraftlion.exclude_type_ext_msg);if(!n.match(/^[0-9a-zA-Z]+$/))return void alert(updraftlion.exclude_ext_error_msg);e="ext:"+n;break;case"begin-with":n=jQuery("#updraft_exclude_prefix_field").val();if(""==n)return void alert(updraftlion.exclude_type_prefix_msg);if(!n.match(/^\s*[a-z-_\d,\s]+\s*$/i))return void alert(updraftlion.exclude_prefix_error_msg);e="prefix:"+n;break;case"contain-clause":if(0==(t=jQuery("#updraft_exclude_files_folders_wildcards_jstree").jstree("get_selected")).length)return void alert(updraftlion.exclude_select_folder_wildcards_msg);var n=jQuery(this).parents("div.updraft-exclude-panel").find("div.clause-input-container input").val(),o=(jQuery(this).parents("div.updraft-exclude-panel").find("div.clause-input-container input").val(""),jQuery(this).parents("div.updraft-exclude-panel").find("div.clause-input-container select").val());if(""==n)return void alert(updraftlion.exclude_contain_error_msg);jQuery(this).parents("div.updraft-exclude-panel").find("div.clause-input-container select option").eq(0).prop("selected",!0);a=t[0],r=jQuery("#updraft_exclude_modal_path").val();""!==(e=a="/"==(a="/"==(a=a.substr(0,r.length)==r?a.substr(r.length,a.length):a).charAt(0)?a.substr(1):a).charAt(a.length-1)?a.substr(0,a.length-1):a)&&(e+="/"),n=n.replace(/\*/g,"\\*"),"beginning"===o?e+=n+"*":"middle"===o?e+="*"+n+"*":"end"===o&&(e+="*"+n);break;default:return}var d,u=jQuery("#updraft_exclude_modal_for").val();updraft_is_unique_exclude_rule(e,u)&&(d='
                ',jQuery('.updraft_exclude_entity_container[data-include-backup-file="'+u+'"]').append(d),updraft_exclude_entity_update(u),jQuery("#updraft_exclude_modal").dialog("close"))}),jQuery("#updraft-navtab-settings-content .updraft-service").on("change",function(){var t=jQuery(this).val();jQuery("#updraft-navtab-settings-content .updraftplusmethod").hide(),jQuery("#updraft-navtab-settings-content ."+t).show()}),jQuery("#updraft-navtab-settings-content a.updraft_show_decryption_widget").on("click",function(t){t.preventDefault(),jQuery("#updraftplus_db_decrypt").val(jQuery("#updraft_encryptionphrase").val()),jQuery("#updraft-manualdecrypt-modal").slideToggle()}),jQuery("#updraftplus-phpinfo").on("click",function(t){t.preventDefault(),updraft_iframe_modal("phpinfo",updraftlion.phpinfo)}),jQuery("#updraftplus-rawbackuphistory").on("click",function(t){t.preventDefault(),updraft_iframe_modal("rawbackuphistory",updraftlion.raw)}),jQuery("#updraft-navtab-status").on("click",function(t){t.preventDefault(),updraft_open_main_tab("status"),updraft_page_is_visible=1,updraft_console_focussed_tab="status",updraft_activejobs_update(!0)}),jQuery("#updraft-navtab-expert").on("click",function(t){t.preventDefault(),updraft_open_main_tab("expert"),updraft_page_is_visible=1}),jQuery("#updraft-navtab-settings, #updraft-navtab-settings2, #updraft_backupnow_gotosettings").on("click",function(t){t.preventDefault(),jQuery(this).parents(".updraftmessage").remove(),jQuery("#updraft-backupnow-modal").dialog("close"),updraft_open_main_tab("settings"),updraft_page_is_visible=1}),jQuery("#updraft-navtab-addons").on("click",function(t){t.preventDefault(),jQuery(this).addClass("b#nav-tab-active"),updraft_open_main_tab("addons"),updraft_page_is_visible=1}),jQuery("#updraft-navtab-backups").on("click",function(t){t.preventDefault(),updraft_console_focussed_tab="backups",updraft_historytimertoggle(1),updraft_open_main_tab("backups")}),jQuery("#updraft-navtab-migrate").on("click",function(t){t.preventDefault(),jQuery("#updraft_migrate_tab_alt").html("").hide(),updraft_open_main_tab("migrate"),updraft_page_is_visible=1,jQuery("#updraft_migrate .updraft_migrate_widget_module_content").is(":visible")||jQuery(".updraft_migrate_intro").show()}),"migrate"==updraftlion.tab&&jQuery("#updraft-navtab-migrate").trigger("click"),updraft_send_command("ping",null,function(t,e){"success"==e&&"pong"!=t&&0<=t.indexOf("pong")&&(jQuery("#updraft-navtab-backups-content .ud-whitespace-warning").show(),console.log("UpdraftPlus: Extra output warning: response (which should be just (string)'pong') follows."),console.log(t))},{json_parse:!1,type:"GET"});try{"undefined"!=typeof updraft_plupload_config&&((s=new plupload.Uploader(updraft_plupload_config)).bind("Init",function(t){var e=jQuery("#plupload-upload-ui");t.features.dragdrop?(e.addClass("drag-drop"),jQuery("#drag-drop-area").on("dragover.wp-uploader",function(){e.addClass("drag-over")}).on("dragleave.wp-uploader, drop.wp-uploader",function(){e.removeClass("drag-over")})):(e.removeClass("drag-drop"),jQuery("#drag-drop-area").off(".wp-uploader"))}),s.init(),s.bind("FilesAdded",function(t,e){h("#updraft-plupload-modal").is(":hidden")&&h("#updraft-plupload-modal").slideToggle(),plupload.each(e,function(t){if(!/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+?)?(\.(zip|gz|gz\.crypt))?$/i.test(t.name)&&!/^log\.([0-9a-f]{12})\.txt$/.test(t.name)){for(var e=!1,a=0;a"+t.name+"

                "+updraftlion.notarchive2),jQuery("#updraft-message-modal").dialog("open")):alert(t.name+": "+updraftlion.notarchive),void s.removeFile(t)}jQuery("#filelist").append('
                '+t.name+" ("+plupload.formatSize(0)+"/"+plupload.formatSize(t.size)+')
                ')}),t.refresh(),t.start()}),s.bind("UploadProgress",function(t,e){jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"),jQuery("#"+e.id+" span").html(plupload.formatSize(parseInt(e.size*e.percent/100))),e.size==e.loaded&&(jQuery("#"+e.id).html('
                '+e.name+" ("+plupload.formatSize(parseInt(e.size*e.percent/100))+"/"+plupload.formatSize(e.size)+") - "+updraftlion.complete+"
                "),jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"))}),s.bind("Error",function(t,e){console.log(e),a="-200"==e.code?"\n"+updraftlion.makesure2:updraftlion.makesure;var a,r=updraftlion.uploaderr+" (code "+e.code+") : "+e.message;e.hasOwnProperty("status")&&e.status&&(r+=" ("+updraftlion.http_code+" "+e.status+")"),e.hasOwnProperty("response")&&(console.log("UpdraftPlus: plupload error: "+e.response),e.response.length<100)&&(r+=" "+updraftlion.error+" "+e.response+"\n"),r+=" "+a,alert(r)}),s.bind("FileUploaded",function(t,e,a){if("200"==a.status)try{(resp=ud_parse_json(a.response)).e?alert(updraftlion.uploaderror+" "+resp.e):resp.dm?(alert(resp.dm),updraft_updatehistory(1,0)):resp.m?updraft_updatehistory(1,0):alert("Unknown server response: "+a.response)}catch(t){console.log(a),alert(updraftlion.jsonnotunderstood)}else alert("Unknown server response status: "+a.code),console.log(a)}))}catch(t){console.log(t)}function l(t){(params={uri:jQuery("#updraftplus_httpget_uri").val()}).curl=t,updraft_send_command("httpget",params,function(t){t.e&&alert(t.e),t.r?jQuery("#updraftplus_httpget_results").html("
                "+t.r+"
                "):console.log(t)},{type:"GET"})}function _(t,e,a){updraft_restore_setoptions(t),jQuery("#updraft_restore_timestamp").val(e),jQuery(".updraft_restore_date").html(a),updraft_restore_stage=1,i.open(),updraft_activejobs_update(!0)}function c(t){t=t.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");t=new RegExp("[\\?&]"+t+"=([^&#]*)").exec(window.location.href);return null==t?"":decodeURIComponent(t[1].replace(/\+/g," "))}jQuery("#updraftplus_httpget_go").on("click",function(t){t.preventDefault(),l(0)}),jQuery("#updraftplus_httpget_gocurl").on("click",function(t){t.preventDefault(),l(1)}),jQuery("#updraftplus_callwpaction_go").on("click",function(t){t.preventDefault(),updraft_send_command("call_wordpress_action",params={wpaction:jQuery("#updraftplus_callwpaction").val()},function(t){t.e?alert(t.e):t.s||(t.r?jQuery("#updraftplus_callwpaction_results").html(t.r):(console.log(t),alert(updraftlion.jsonnotunderstood)))})}),jQuery("#updraft_activejobs_table, #updraft-navtab-migrate-content").on("click",".updraft_jobinfo_delete",function(t){t.preventDefault();t=jQuery(this).data("jobid");t?(h(this).addClass("disabled"),updraft_activejobs_delete(t)):console.log("UpdraftPlus: A stop job link was clicked, but the Job ID could not be found")}),jQuery("#updraft_activejobs_table, #updraft-navtab-backups-content .updraft_existing_backups, #updraft-backupnow-inpage-modal, #updraft-navtab-migrate-content").on("click",".updraft-log-link",function(t){t.preventDefault();var t=jQuery(this).data("fileid"),e=jQuery(this).data("jobid");t?updraft_popuplog(t):e?updraft_popuplog(e):console.log("UpdraftPlus: A log link was clicked, but the Job ID could not be found")}),jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("click","button.choose-components-button",function(t){_(jQuery(this).data("entities"),jQuery(this).data("backup_timestamp"),jQuery(this).data("showdata"))}),"initiate_restore"==c("udaction")&&_(c("entities"),c("backup_timestamp"),c("showdata"));t={};function f(){var t=jQuery(".db-search").val().toLowerCase();jQuery(".db-size-content tr").filter(function(){jQuery(this).toggle(-1
                '+updraftlion.loading+"
                ",updraftlion.raw,780,500)}),jQuery("#backupnow_database_moreoptions").on("click","div.backupnow-db-tables > a",function(t){t.preventDefault(),jQuery("> input",jQuery(this).parents("div.backupnow-db-tables")).prop("checked",!1),jQuery(this).hasClass("backupnow-select-all-table")?jQuery("> input",jQuery(this).parents("div.backupnow-db-tables")).prop("checked",!0):jQuery(this).hasClass("backupnow-select-all-this-site")&&jQuery("> input",jQuery(this).parents("div.backupnow-db-tables")).not("[data-non_wp_table]").prop("checked",!0)}),jQuery("#updraft-restore-modal").on("click",".updraft_restore_select_all_themes",function(t){t.preventDefault(),jQuery(".updraft_restore_themes_options").prop("checked",!0)}),jQuery("#updraft-restore-modal").on("click",".updraft_restore_deselect_all_themes",function(t){t.preventDefault(),jQuery(".updraft_restore_themes_options").prop("checked",!1)}),jQuery("#updraft-restore-modal").on("click",".updraft_restore_select_all_plugins",function(t){t.preventDefault(),jQuery(".updraft_restore_plugins_options").prop("checked",!0)}),jQuery("#updraft-restore-modal").on("click",".updraft_restore_deselect_all_plugins",function(t){t.preventDefault(),jQuery(".updraft_restore_plugins_options").prop("checked",!1)}),jQuery(".updraftmessage.admin-warning-litespeed").on("click",".notice-dismiss",function(t){t.preventDefault(),updraft_send_command("dismiss_admin_warning_litespeed",1,function(t){})}),jQuery("#db_size.advanced_tools_button, .db-size-refresh").on("click",function(t){t.preventDefault();var e=jQuery(".advanced_settings_content .advanced_tools.db_size .total-size"),a=jQuery(".advanced_settings_content .advanced_tools.db_size tbody.db-size-content");jQuery(this).hasClass("advanced_tools_button")&&""!=a.html()||(a.html(""),updraft_send_command("db_size",1,function(t){e.html(t.size),a.html(t.html),f()}))}),jQuery(".db-search").on("input",function(){f()}),jQuery(".db-search-clear").on("click",function(t){t.preventDefault(),jQuery(".db-search").val(""),f()})}),jQuery(function(n){var o="#updraft-navtab-settings-content ";n(o+"#remote-storage-holder").on("click",".updraftvault_backtostart",function(t){t.preventDefault(),n(o+"#updraftvault_settings_showoptions").slideUp(),n(o+"#updraftvault_settings_connect").slideUp(),n(o+"#updraftvault_settings_connected").slideUp(),n(o+"#updraftvault_settings_default").slideDown()}),n(o).on("keypress","#updraftvault_settings_connect input",function(t){if(13==t.which)return n(o+"#updraftvault_connect_go").trigger("click"),!1}),n(o+"#remote-storage-holder").on("click","#updraftvault_recountquota",function(t){t.preventDefault(),n(o+"#updraftvault_recountquota").html(updraftlion.counting);try{updraft_send_command("vault_recountquota",{instance_id:n("#updraftvault_settings_connect").data("instance_id")},function(t){n(o+"#updraftvault_recountquota").html(updraftlion.updatequotacount),t.hasOwnProperty("html")&&(n(o+"#updraftvault_settings_connected").html(t.html),t.hasOwnProperty("connected"))&&(t.connected?(n(o+"#updraftvault_settings_default").hide(),n(o+"#updraftvault_settings_connected")):(n(o+"#updraftvault_settings_connected").hide(),n(o+"#updraftvault_settings_default"))).show()},{error_callback:function(t,e,a,r){n(o+"#updraftvault_recountquota").html(updraftlion.updatequotacount),void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",console.log(r),alert(r),console.log(t))}})}catch(t){n(o+"#updraftvault_recountquota").html(updraftlion.updatequotacount),console.log(t)}}),n(o+"#remote-storage-holder").on("click","#updraftvault_disconnect",function(t){t.preventDefault(),n(o+"#updraftvault_disconnect").html(updraftlion.disconnecting);try{updraft_send_command("vault_disconnect",{immediate_echo:!0,instance_id:n("#updraftvault_settings_connect").data("instance_id")},function(t){n(o+"#updraftvault_disconnect").html(updraftlion.disconnect),t.hasOwnProperty("html")&&(n(o+"#updraftvault_settings_connected").html(t.html).slideUp(),n(o+"#updraftvault_settings_default").slideDown())},{error_callback:function(t,e,a,r){n(o+"#updraftvault_disconnect").html(updraftlion.disconnect),void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",console.log(r),alert(r),console.log(t))}})}catch(t){n(o+"#updraftvault_disconnect").html(updraftlion.disconnect),console.log(t)}}),n(o+"#remote-storage-holder").on("click","#updraftvault_connect",function(t){t.preventDefault(),n(o+"#updraftvault_settings_default").slideUp(),n(o+"#updraftvault_settings_connect").slideDown()}),n(o+"#remote-storage-holder").on("click","#updraftvault_showoptions",function(t){t.preventDefault(),n(o+"#updraftvault_settings_default").slideUp(),n(o+"#updraftvault_settings_showoptions").slideDown()}),n("#remote-storage-holder").on("keyup",".updraftplus_onedrive_folder_input",function(t){var e=n(this).val(),a=n(this).closest("td");0==e.indexOf("https:")||0==e.indexOf("http:")?a.find(".onedrive_folder_error").length||a.append('
                '+updraftlion.onedrive_folder_url_warning+"
                "):a.find(".onedrive_folder_error").slideUp("slow",function(){a.find(".onedrive_folder_error").remove()})}),n(o+"#remote-storage-holder").on("click","#updraftvault_connect_go",function(t){return n(o+"#updraftvault_connect_go").html(updraftlion.connecting),updraft_send_command("vault_connect",{email:n("#updraftvault_email").val(),pass:n("#updraftvault_pass").val(),instance_id:n("#updraftvault_settings_connect").data("instance_id")},function(t,e,a){n(o+"#updraftvault_connect_go").html(updraftlion.connect),t.hasOwnProperty("e")?(updraft_html_modal('

                '+updraftlion.errornocolon+"

                "+t.e+"

                ",updraftlion.disconnect,400,250),t.hasOwnProperty("code")&&"no_quota"==t.code&&(n(o+"#updraftvault_settings_connect").slideUp(),n(o+"#updraftvault_settings_default").slideDown())):t.hasOwnProperty("connected")&&t.connected&&t.hasOwnProperty("html")?(n(o+"#updraftvault_settings_connect").slideUp(),n(o+"#updraftvault_settings_connected").html(t.html).slideDown()):(console.log(t),alert(updraftlion.unexpectedresponse+" "+a))},{error_callback:function(t,e,a,r){n(o+"#updraftvault_connect_go").html(updraftlion.connect),void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",console.log(r),alert(r),console.log(t))}}),!1}),n("#updraft-iframe-modal").on("change","#always_keep_this_backup",function(){var e=n(this).data("backup_key");updraft_send_command("always_keep_this_backup",{backup_key:e,always_keep:n(this).is(":checked")?1:0},function(t){t.hasOwnProperty("rawbackup")&&(jQuery("#updraft-iframe-modal").dialog("close"),jQuery(".updraft_existing_backups_row_"+e+" .updraft_existingbackup_date").data("rawbackup",t.rawbackup),updraft_html_modal(jQuery(".updraft_existing_backups_row_"+e+" .updraft_existingbackup_date").data("rawbackup"),updraftlion.raw,780,500))})})}),jQuery(function(t){try{"undefined"!=typeof updraft_plupload_config2&&((a=new plupload.Uploader(updraft_plupload_config2)).bind("Init",function(t){var e=jQuery("#plupload-upload-ui2");t.features.dragdrop?(e.addClass("drag-drop"),jQuery("#drag-drop-area2").on("dragover.wp-uploader",function(){e.addClass("drag-over")}).on("dragleave.wp-uploader, drop.wp-uploader",function(){e.removeClass("drag-over")})):(e.removeClass("drag-drop"),jQuery("#drag-drop-area2").off(".wp-uploader"))}),a.init(),a.bind("FilesAdded",function(t,e){plupload.each(e,function(t){/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-db([0-9]+)?\.(gz\.crypt)$/i.test(t.name)?jQuery("#filelist2").append('
                '+t.name+" ("+plupload.formatSize(0)+"/"+plupload.formatSize(t.size)+')
                '):(alert(t.name+": "+updraftlion.notdba),a.removeFile(t))}),t.refresh(),t.start()}),a.bind("UploadProgress",function(t,e){jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"),jQuery("#"+e.id+" span").html(plupload.formatSize(parseInt(e.size*e.percent/100)))}),a.bind("Error",function(t,e){err_makesure="-200"==e.code?"\n"+updraftlion.makesure2:updraftlion.makesure,alert(updraftlion.uploaderr+" (code "+e.code+") : "+e.message+" "+err_makesure)}),a.bind("FileUploaded",function(t,e,a){"200"==a.status?"ERROR:"==a.response.substring(0,6)?alert(updraftlion.uploaderror+" "+a.response.substring(6)):"OK:"==a.response.substring(0,3)?(bkey=a.response.substring(3),jQuery("#"+e.id+" .fileprogress").hide(),jQuery("#"+e.id).append(updraftlion.uploaded+' '+updraftlion.followlink+" "+updraftlion.thiskey+" "+jQuery("#updraftplus_db_decrypt").val().replace(/&/g,"&").replace(//g,">"))):alert(updraftlion.unknownresp+" "+a.response):alert(updraftlion.ukrespstatus+" "+a.code)}))}catch(t){console.log(t)}var a;if(jQuery("#updraft-hidethis").remove(),Handlebars.registerHelper("ifeq",function(t,e,a){return(t="string"!=typeof t&&null!=t?t.toString():t)===(e="string"!=typeof e&&null!=e?e.toString():e)?a.fn(this):a.inverse(this)}),Handlebars.registerHelper("maskPassword",function(t){return t.replace(/./gi,"*")}),Handlebars.registerHelper("encodeURIComponent",function(t){return encodeURIComponent(t)}),Handlebars.registerHelper("ifCond",function(t,e,a,r){switch(e){case"==":return t==a?r.fn(this):r.inverse(this);case"===":return t===a?r.fn(this):r.inverse(this);case"!=":return t!=a?r.fn(this):r.inverse(this);case"!==":return t!==a?r.fn(this):r.inverse(this);case"<":return t":return a=":return a<=t?r.fn(this):r.inverse(this);case"&&":return t&&a?r.fn(this):r.inverse(this);case"||":return t||a?r.fn(this):r.inverse(this);case"typeof":return t===typeof a?r.fn(this):r.inverse(this);case"not_typeof":return t!==typeof a?r.fn(this):r.inverse(this);default:return r.inverse(this)}}),Handlebars.registerHelper("for",function(t,e,a,r){for(var n="",o=t;o \t\t\t \t\t\t \t\t\t\t

                \t\t\t\t\t \t\t\t\t

                \t\t\t \t\t"}),t("#remote-storage-holder").length){var e,r="",n=["default","template_properties"];for(e in updraftlion.remote_storage_templates)if(void 0!==updraftlion.remote_storage_options[e]&&n.length'+jQuery(this).html()+"

                "),e=!0}),e&&((t={})[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-authenticate-modal").dialog({autoOpen:!0,modal:!0,resizable:!1,draggable:!1,resizeOnWindowResize:!0,scrollWithViewport:!0,resizeAccordingToViewport:!0,useContentSize:!1,open:function(t,e){o(this).dialog("option","width",860),o(this).dialog("option","height",260)},buttons:t}).dialog("open"))}(new Image).src=updraftlion.ud_url+"/images/notices/updraft_logo.png",o("#updraft-navtab-settings-content input.updraft_include_entity").on("change",function(t){var e=o(this).attr("id"),a=o(this).is(":checked");o("#backupnow_files_"+e).prop("checked",a)}),o("#updraftplus-settings-save").on("click",function(t){t.preventDefault(),o.blockUI({css:{width:"300px",border:"none","border-radius":"10px",left:"calc(50% - 150px)",padding:"20px"},message:'

                '+updraftlion.saving+"
                "}),updraft_send_command("savesettings",{settings:a("string"),updraftplus_version:updraftlion.updraftplus_version},function(t,e,a){r(t,a),o("#updraft-wrap .fade").delay(6e3).fadeOut(2e3),window.updraft_main_tour&&!window.updraft_main_tour.canceled?(window.updraft_main_tour.show("settings_saved"),n()):o("html, body").animate({scrollTop:o("#updraft-wrap").offset().top},1e3,function(){n()}),o.unblockUI()},{action:"updraft_savesettings",error_callback:function(t,e,a,r){o.unblockUI(),void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",console.log(r),alert(r),console.log(t))},nonce:updraftplus_settings_nonce})}),o("#updraftplus-settings-export").on("click",function(){var t,e;updraft_settings_form_changed&&alert(updraftlion.unsaved_settings_export),t=a("object"),e=new Date,t=JSON.stringify({version:"1.12.40",epoch_date:e.getTime(),local_date:e.toLocaleString(),network_site_url:updraftlion.network_site_url,data:t}),(e=document.body.appendChild(document.createElement("a"))).setAttribute("download",updraftlion.export_settings_file_name),e.setAttribute("style","display:none;"),e.setAttribute("href","data:text/json;charset=UTF-8,"+encodeURIComponent(t)),e.click()}),o("#updraftplus-settings-import").on("click",function(){o.blockUI({css:{width:"300px",border:"none","border-radius":"10px",left:"calc(50% - 150px)",padding:"20px"},message:'

                '+updraftlion.importing+"
                "});var t,e=document.getElementById("import_settings");0==e.files.length?(alert(updraftlion.import_select_file),o.unblockUI()):(e=e.files[0],(t=new FileReader).onload=function(){var t,e=this.result;try{t=ud_parse_json(e)}catch(t){return void(o.unblockUI(),jQuery("#import_settings").val(""),console.log(e),console.log(t),alert(updraftlion.import_invalid_json_file))}window.confirm(updraftlion.importing_data_from+" "+t.network_site_url+"\n"+updraftlion.exported_on+" "+t.local_date+"\n"+updraftlion.continue_import)?updraft_send_command("importsettings",{settings:JSON.stringify(t.data),updraftplus_version:updraftlion.updraftplus_version},function(t,e,a){t=r(t);!t.hasOwnProperty("saved")||t.saved?(updraft_settings_form_changed=!1,location.replace(updraftlion.updraft_settings_url)):(o.unblockUI(),t.hasOwnProperty("error_message")&&t.error_message&&alert(t.error_message))},{action:"updraft_importsettings",nonce:updraftplus_settings_nonce,error_callback:function(t,e,a,r){o.unblockUI(),void 0!==r&&r.hasOwnProperty("fatal_error")?(console.error(r.fatal_error_message),alert(r.fatal_error_message)):(r="updraft_send_command: error: "+e+" ("+a+")",console.log(r),console.log(t),alert(r))}}):o.unblockUI()},t.readAsText(e))}),o(".udp-replace-with-iframe--js").on("click",function(t){t.preventDefault();t=o(this).prop("href");o('