diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/dashboard.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/dashboard.php new file mode 100644 index 00000000..4bb68d1b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/dashboard.php @@ -0,0 +1,577 @@ +

'.__( 'Companion Auto Update was not able to set the event for sending you emails, please re-activate the plugin in order to set the event', 'companion-auto-update' ).'.

'; +} + +// Database requires an update +if ( cau_incorrectDatabaseVersion() ) { + echo '

'.__( 'Companion Auto Update Database Update', 'companion-auto-update' ).' – + '.__( 'We need you to update to the latest database version', 'companion-auto-update' ).'. '.__( 'Run updater now', 'companion-auto-update' ).'

'; +} + +// Update log DB is empty +if ( cau_updateLogDBisEmpty() ) { + echo '

'.__( 'Companion Auto Update Database Update', 'companion-auto-update' ).' – + '.__( 'We need to add some information to your database', 'companion-auto-update' ).'. '.__( 'Run updater now', 'companion-auto-update' ).'

'; +} + +// Save settings +if( isset( $_POST['submit'] ) ) { + + check_admin_referer( 'cau_save_settings' ); + + global $wpdb; + $table_name = $wpdb->prefix . "auto_updates"; + + // Auto updater + $plugins = isset( $_POST['plugins'] ) ? sanitize_text_field( $_POST['plugins'] ) : ''; + $themes = isset( $_POST['themes'] ) ? sanitize_text_field( $_POST['themes'] ) : ''; + $minor = isset( $_POST['minor'] ) ? sanitize_text_field( $_POST['minor'] ) : ''; + $major = isset( $_POST['major'] ) ? sanitize_text_field( $_POST['major'] ) : ''; + $translations = isset( $_POST['translations'] ) ? sanitize_text_field( $_POST['translations'] ) : ''; + + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugins'", $plugins ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'themes'", $themes ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'minor'", $minor ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'major'", $major ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'translations'", $translations ) ); + + // Emails + $send = isset( $_POST['cau_send'] ) ? sanitize_text_field( $_POST['cau_send'] ) : ''; + $sendupdate = isset( $_POST['cau_send_update'] ) ? sanitize_text_field( $_POST['cau_send_update'] ) : ''; + $sendoutdated = isset( $_POST['cau_send_outdated'] ) ? sanitize_text_field( $_POST['cau_send_outdated'] ) : ''; + $wpemails = isset( $_POST['wpemails'] ) ? sanitize_text_field( $_POST['wpemails'] ) : ''; + $email = isset( $_POST['cau_email'] ) ? sanitize_text_field( $_POST['cau_email'] ) : ''; + $html_or_text = isset( $_POST['html_or_text'] ) ? sanitize_text_field( $_POST['html_or_text'] ) : 'html'; + $dbupdateemails = isset( $_POST['dbupdateemails'] ) ? sanitize_text_field( $_POST['dbupdateemails'] ) : ''; + + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'email'", $email ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'send'", $send ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'sendupdate'", $sendupdate ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'sendoutdated'", $sendoutdated ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'wpemails'", $wpemails ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'html_or_text'", $html_or_text ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'dbupdateemails'", $dbupdateemails ) ); + + // Advanced + $allow_editor = isset( $_POST['allow_editor'] ) ? sanitize_text_field( $_POST['allow_editor'] ) : ''; + $allow_author = isset( $_POST['allow_author'] ) ? sanitize_text_field( $_POST['allow_author'] ) : ''; + $advanced_info_emails = isset( $_POST['advanced_info_emails'] ) ? sanitize_text_field( $_POST['advanced_info_emails'] ) : ''; + $plugin_links_emails = isset( $_POST['plugin_links_emails'] ) ? sanitize_text_field( $_POST['plugin_links_emails'] ) : ''; + + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'allow_editor'", $allow_editor ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'allow_author'", $allow_author ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'advanced_info_emails'", $advanced_info_emails ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'plugin_links_emails'", $plugin_links_emails ) ); + + // Delay + $update_delay = isset( $_POST['update_delay'] ) ? sanitize_text_field( $_POST['update_delay'] ) : ''; + $update_delay_days = isset( $_POST['update_delay_days'] ) ? sanitize_text_field( $_POST['update_delay_days'] ) : ''; + + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay'", $update_delay ) ); + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = %s WHERE name = 'update_delay_days'", $update_delay_days ) ); + + // Intervals + + // Set variables + $plugin_sc = sanitize_text_field( $_POST['plugin_schedule'] ); + $theme_sc = sanitize_text_field( $_POST['theme_schedule'] ); + $core_sc = sanitize_text_field( $_POST['core_schedule'] ); + $schedule_mail = sanitize_text_field( $_POST['update_notifications'] ); + $outdated_notifier = sanitize_text_field( $_POST['outdated_notifier'] ); + + // First clear schedules + wp_clear_scheduled_hook( 'wp_update_plugins' ); + wp_clear_scheduled_hook( 'wp_update_themes' ); + wp_clear_scheduled_hook( 'wp_version_check' ); + wp_clear_scheduled_hook( 'cau_set_schedule_mail' ); + wp_clear_scheduled_hook( 'cau_custom_hooks_plugins' ); + wp_clear_scheduled_hook( 'cau_custom_hooks_themes' ); + wp_clear_scheduled_hook( 'cau_log_updater' ); + wp_clear_scheduled_hook( 'cau_outdated_notifier' ); + + // Then set the new times + + // Plugins + if( $plugin_sc == 'daily' ) { + + $date = date( 'Y-m-d' ); + $hours = sanitize_text_field( $_POST['plugin_schedule-sethour'] ); + $minutes = sanitize_text_field( $_POST['plugin_schedule-setminutes'] ); + $seconds = date( 's' ); + $fullDate = $date.' '.$hours.':'.$minutes.':'.$seconds; + $pluginSetTime = strtotime( $fullDate ); + + wp_schedule_event( $pluginSetTime, $plugin_sc, 'wp_update_plugins' ); + wp_schedule_event( $pluginSetTime, $plugin_sc, 'cau_custom_hooks_plugins' ); + wp_schedule_event( ( $pluginSetTime - 1800 ), $plugin_sc, 'cau_log_updater' ); + + } else { + wp_schedule_event( time(), $plugin_sc, 'wp_update_plugins' ); + wp_schedule_event( time(), $plugin_sc, 'cau_custom_hooks_plugins' ); + wp_schedule_event( ( time() - 1800 ), $plugin_sc, 'cau_log_updater' ); + } + + // Themes + if( $theme_sc == 'daily' ) { + + $dateT = date( 'Y-m-d' ); + $hoursT = sanitize_text_field( $_POST['theme_schedule-sethour'] ); + $minutesT = sanitize_text_field( $_POST['theme_schedule-setminutes'] ); + $secondsT = date( 's' ); + $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT; + $themeSetTime = strtotime( $fullDateT ); + + wp_schedule_event( $themeSetTime, $theme_sc, 'wp_update_themes' ); + wp_schedule_event( $themeSetTime, $theme_sc, 'cau_custom_hooks_themes' ); + + } else { + wp_schedule_event( time(), $theme_sc, 'wp_update_themes' ); + wp_schedule_event( time(), $theme_sc, 'cau_custom_hooks_themes' ); + } + + // Core + if( $core_sc == 'daily' ) { + + $dateC = date( 'Y-m-d' ); + $hoursC = sanitize_text_field( $_POST['core_schedule-sethour'] ); + $minutesC = sanitize_text_field( $_POST['core_schedule-setminutes'] ); + $secondsC = date( 's' ); + $fullDateC = $dateC.' '.$hoursC.':'.$minutesC.':'.$secondsC; + $coreSetTime = strtotime( $fullDateC ); + + wp_schedule_event( $coreSetTime, $core_sc, 'wp_version_check' ); + + } else { + wp_schedule_event( time(), $core_sc, 'wp_version_check' ); + } + + // Update notifications + if( $schedule_mail == 'daily' ) { + + $dateT = date( 'Y-m-d' ); + $hoursT = sanitize_text_field( $_POST['update_notifications-sethour'] ); + $minutesT = sanitize_text_field( $_POST['update_notifications-setminutes'] ); + $secondsT = date( 's' ); + $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT; + $emailSetTime = strtotime( $fullDateT ); + + wp_schedule_event( $emailSetTime, $schedule_mail, 'cau_set_schedule_mail' ); + + } else { + wp_schedule_event( time(), $schedule_mail, 'cau_set_schedule_mail' ); + } + + // Outdated notifications + if( $outdated_notifier == 'daily' ) { + + $dateT = date( 'Y-m-d' ); + $hoursT = sanitize_text_field( $_POST['outdated_notifier-sethour'] ); + $minutesT = sanitize_text_field( $_POST['outdated_notifier-setminutes'] ); + $secondsT = date( 's' ); + $fullDateT = $dateT.' '.$hoursT.':'.$minutesT.':'.$secondsT; + $emailSetTime = strtotime( $fullDateT ); + + wp_schedule_event( $emailSetTime, $outdated_notifier, 'cau_outdated_notifier' ); + + } else { + wp_schedule_event( time(), $outdated_notifier, 'cau_outdated_notifier' ); + } + + + echo '

'.__( 'Settings saved.' ).'

'; + +} + +// Welcome screen for first time viewers +if( isset( $_GET['welcome'] ) ) { + echo '
+
+
+ +

'.__( 'Welcome to Companion Auto Update', 'companion-auto-update' ).'

+
+

'.__( 'You\'re set and ready to go', 'companion-auto-update' ).'

+

'.__( 'The plugin is all set and ready to go with the recommended settings, but if you\'d like you can change them below.' ).'

+
+

'.__( 'Get Started' ).': '.__( 'Update filter', 'companion-auto-update' ).'   |   + '.__( 'More Actions' ).': '.__('Give feedback', 'companion-auto-update').' - '.__( 'Help us translate', 'companion-auto-update' ).'

+ +
+
'; +} + +$cs_hooks_p = wp_get_schedule( 'cau_custom_hooks_plugins' ); +$cs_hooks_t = wp_get_schedule( 'cau_custom_hooks_themes' ); + +?> + +
+ +
+ +
+ +

+ + + + + +
+
+ +

"; + echo "

"; + echo "

"; + echo "

"; + echo "

"; + + ?> + +
+
+ +
+ + + +
+ +

+ + "; + echo ""; + echo "

"; + + // Set the time when daily is selected + echo ""; + + } + + ?> + +
+ +

+ + +
+ +
+ +

+ + +
+ +
+ +

+ + +
+ +

+ +
+ +

+ + +
+ +
+ +

+ + +
+ +
+ +
+ +

+ + + + + + + + + + + + + + > + + + + +
+

+

+

+
+

+
+ +

+

Please note: Delaying updates does not work with WordPress updates yet.

+
+ +
+ + + +
+ +
+
+ + + +
+ +
+ +
+
+

+
    +
  • +
  • +
+ +

+
    +
  • +
  • +
  • +
+
+
+

+
    +
  • +
+
+
+ +
+
+

+

+

+

+
+
+ +
+

+

You get useful software and we get to carry on making it better.', 'companion-auto-update'); ?>

+ + + + + + +

+
+ +
+

Plugin Promotion

+

Keep your site fast with our Revision Manager

+

Post Revisions are great, but will also slow down your site. Take back control over revisions with Companion Revision Manager!

+ Read more +
+ +
+ + + + \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/log.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/log.php new file mode 100644 index 00000000..8bdf0542 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/log.php @@ -0,0 +1,19 @@ + + + + +
+ + + + + +
+ + +
+ We've had to (temporarily) disable the theme filter because it was causing issues on some installations. We'll try to get it working again in a future update. +
+ + +

+ +prefix."auto_updates"; + +// Save list +if( isset( $_POST['submit'] ) ) { + + check_admin_referer( 'cau_save_pluginlist' ); + + $noUpdateList = ''; + $i = 0; + $noUpdateCount = 0; + + if( isset( $_POST['post'] ) ) { + $noUpdateCount = count( $_POST['post'] ); + } + + if( $noUpdateCount > 0 ) { + foreach ( $_POST['post'] as $key ) { + $noUpdateList .= sanitize_text_field( $key ); + $i++; + if( $i != $noUpdateCount ) $noUpdateList .= ', '; + } + } + + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = '%s'", $noUpdateList, $db_table ) ); + echo '

'.__( 'Succes', 'companion-auto-update' ).' – '.sprintf( esc_html__( '%1$s %2$s have been added to the no-update-list', 'companion-auto-update' ), $noUpdateCount, strtolower( $filter_name ) ).'.

'; +} + + +// Reset list +if( isset( $_POST['reset'] ) ) { + + check_admin_referer( 'cau_save_pluginlist' ); + + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET onoroff = '%s' WHERE name = %s", "", $db_table ) ); + echo '

'.__( 'Succes', 'companion-auto-update' ).' – '.sprintf( esc_html__( 'The no-update-list has been reset, all %s will be auto-updated from now on', 'companion-auto-update' ), strtolower( $filter_name ) ).'.

'; +} + + +?> + +
+ +
+ + +
+ + + + + + + + + + + + + + $value ) { + + $slug = $key; + $explosion = explode( '/', $slug ); + $actualSlug = array_shift( $explosion ); + $slug_hash = md5( $slug[0] ); + + if( $filter == 'themes' ) { + + $theme = wp_get_theme( $actualSlug ); + $name = $theme->get( 'Name' ); + $description = $theme->get( 'Description' ); + + } else { + + foreach ( $value as $k => $v ) { + + if( $k == "Name" ) $name = $v; + if( $k == "Description" ) $description = $v; + + } + + } + + if( in_array( $actualSlug, donotupdatelist( $filter ) ) ) { + + $class = 'inactive'; + $checked = 'CHECKED'; + $statusicon = 'no'; + $statusName = 'disabled'; + + } else { + + $class = 'active'; + $checked = ''; + $statusicon = 'yes'; + $statusName = 'enabled'; + } + + echo ' + + + + + + + + + + '; + + } + ?> + + +
 
+ + +
+
+

'. $name .'

+ '.$actualSlug.' +
+

'.__( 'Auto Updater', 'companion-auto-update' ).':

+
+

'.$description.'

+
+ + + +
+ + +
+ +
\ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/rollback.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/rollback.php new file mode 100644 index 00000000..c0325af9 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/admin/rollback.php @@ -0,0 +1,2 @@ +prefix . "auto_updates"; + $schedules = wp_get_schedules(); + $interval_names = cau_wp_get_schedules(); + + // Update the database + if( isset( $_GET['run'] ) && $_GET['run'] == 'db_update' ) { + cau_manual_update(); + echo '

'.__( 'Database update completed' ).'

'; + } + + if( isset( $_GET['run'] ) && $_GET['run'] == 'db_info_update' ) { + cau_savePluginInformation(); + echo '

'.__( 'Database information update completed' ).'

'; + } + + if( isset( $_GET['ignore_report'] ) ) { + + $report_to_ignore = sanitize_text_field( $_GET['ignore_report'] ); + $allowedValues = array( 'seo', 'cron' ); + + if( !in_array( $report_to_ignore, $allowedValues ) ) { + + wp_die( 'Trying to cheat eh?' ); + + } else { + + $table_name = $wpdb->prefix . "auto_updates"; + $wpdb->query( $wpdb->prepare( "UPDATE {$table_name} SET onoroff = %s WHERE name = 'ignore_$report_to_ignore'", 'yes' ) ); + $__ignored = __( 'This report will now be ignored', 'companion-auto-update' ); + echo "

$__ignored

"; + + } + + } + +?> + + + +
+ + array( + 'name' => __( 'Events', 'companion-auto-update' ), + 'fields' => array( + 'plugins' => __( 'Plugins', 'companion-auto-update' ), + 'themes' => __( 'Themes', 'companion-auto-update' ), + 'minor' => __( 'Core (Minor)', 'companion-auto-update' ), + 'major' => __( 'Core (Major)', 'companion-auto-update' ), + 'send' => __( 'Update available', 'companion-auto-update' ), + 'sendupdate' => __( 'Successful update', 'companion-auto-update' ), + 'wpemails' => __( 'Core notifications', 'companion-auto-update' ), + 'update_delay' => __( 'Log updater', 'companion-auto-update' ), + ), + 'values' => array( + 'plugins' => 'wp_update_plugins', + 'themes' => 'wp_update_themes', + 'minor' => 'wp_version_check', + 'major' => 'wp_version_check', + 'send' => 'cau_set_schedule_mail', + 'sendupdate' => 'cau_set_schedule_mail', + 'wpemails' => 'cau_set_schedule_mail', + 'update_delay' => 'cau_log_updater', + ), + 'explain' => array( + 'plugins' => __('Auto update plugins?', 'companion-auto-update'), + 'themes' => __('Auto update themes?', 'companion-auto-update'), + 'minor' => __('Auto update minor core updates?', 'companion-auto-update'), + 'major' => __('Auto update major core updates?', 'companion-auto-update'), + 'send' => __( 'Will notify you of available updates.', 'companion-auto-update' ), + 'sendupdate' => __( 'Will notify you after successful updates.', 'companion-auto-update' ), + 'wpemails' => __( 'The default WordPress notifications.', 'companion-auto-update' ), + 'update_delay' => __( 'Will keep track of the update log and make sure updates are delayed when needed.', 'companion-auto-update' ), + ) + ), + ); + + $__sta = __( 'Status', 'companion-auto-update' ); + $__int = __( 'Interval', 'companion-auto-update' ); + $__nxt = __( 'Next', 'companion-auto-update' ); + + foreach( $events as $event => $info ) { + + echo " + + + + + + + + + + + "; + + foreach ( $info['fields'] as $key => $value ) { + + $is_on = ( cau_get_db_value( $key ) == 'on' && wp_get_schedule( $info['values'][$key] ) ) ? true : false; + $__status = $is_on ? 'enabled' : 'warning'; + $__icon = $is_on ? 'yes-alt' : 'marker'; + $__text = $is_on ? __( 'Enabled', 'companion-auto-update' ) : __( 'Disabled', 'companion-auto-update' ); + $__interval = $is_on ? $interval_names[wp_get_schedule( $info['values'][$key] )] : '‐'; + $__next = $is_on ? date_i18n( $dateFormat, wp_next_scheduled( $info['values'][$key] ) ) : '‐'; + $__exp = !empty( $info['explain'][$key] ) ? '
'.$info['explain'][$key].'' : ''; + $__nxt = __( 'Next', 'companion-auto-update' ); + + echo " + + + + + + "; + + } + + echo " + +
{$info['name']}{$__sta}{$__int}{$__nxt}
$value$__exp$__text$__interval$__nxt: $__next
"; + + } + + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $__text"; + } else { + $__text = __( 'Disabled', 'companion-auto-update' ); + echo ""; + } + ?> + + + + > + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
$__text
+ + + + + +
DISABLE_WP_CRON true + + +
wp_version_check
VCS'>
+ + + + + + + + + + + + + + + + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + +
WordPress
PHP (Required: 5.1.0 or up)
Database (Latest: )
(GMT ) -
+ + + + + + + + + + + + $value ) { + if( is_plugin_active( $key ) ) { + echo ' + + + + '; + } + } + + ?> + + +
'.$key.''.$value.''.__( 'How to fix this', 'companion-auto-update' ).'
+ + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + prefix}update_log"; + $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) ); + + foreach ( $put_on_hold as $plugin ) { + + $__name = $plugin->slug; + $__poh = $plugin->put_on_hold; + $__udd = ( cau_get_db_value( 'update_delay_days' ) != '' ) ? cau_get_db_value( 'update_delay_days' ) : '2'; + $__date = date_i18n( $dateFormat, strtotime( "+".$__udd." days", $__poh ) ); + + echo " + + + "; + } + + echo empty( $put_on_hold ) ? "" : ""; + + ?> + + +
{$__name}{$__date}
".__( 'No plugins have been put on hold.', 'companion-auto-update' )."
+ +
+ + $string ) { + + if( strpos( file_get_contents( $conFile ), $string ) !== false) { + $contents = file_get_contents( $conFile ); + $contents = str_replace( $string, $revLine, $contents ); + file_put_contents( $conFile, $contents ); + $melding = __( "We've fixed the error for you", 'companion-auto-update' ).' :)'; + $meldingS = 'updated'; + } + + } + + echo "

$melding

"; + +} diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/check.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/check.svg new file mode 100644 index 00000000..10065cf4 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/check.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/email.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/email.svg new file mode 100644 index 00000000..278ffd98 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/email.svg @@ -0,0 +1,96 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/help.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/help.svg new file mode 100644 index 00000000..b10cc782 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/help.svg @@ -0,0 +1,67 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/interval.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/interval.svg new file mode 100644 index 00000000..2219c00f --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/interval.svg @@ -0,0 +1,69 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/love.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/love.svg new file mode 100644 index 00000000..8b341634 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/love.svg @@ -0,0 +1,116 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/settings.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/settings.svg new file mode 100644 index 00000000..63020b4b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/settings.svg @@ -0,0 +1,124 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/support.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/support.svg new file mode 100644 index 00000000..8750aa46 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/support.svg @@ -0,0 +1,102 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/update.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/update.svg new file mode 100644 index 00000000..059c5215 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/update.svg @@ -0,0 +1,91 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/welcome.svg b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/welcome.svg new file mode 100644 index 00000000..77542371 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/images/welcome.svg @@ -0,0 +1,181 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/style.css b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/style.css new file mode 100644 index 00000000..72e20a23 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/style.css @@ -0,0 +1,582 @@ +/* Default Stylings */ +.nowrap { + white-space: nowrap; +} +.cau_spacing { + height: 25px; +} +.cau_support_buttons { + display: inline-block; +} + +/* Welcome screen */ +.welcome-to-cau { + background: #FFF; + border: 1px solid #CCD0D4; + margin: 25px 0; + padding: 30px; + background-size: 140px; + background-position: left bottom; + background-repeat: no-repeat; + box-shadow: 0 1px 1px rgba(0,0,0,.04); +} +.welcome-to-cau .welcome-image { + display: inline-block; + vertical-align: middle; + width: 100px; + height: 100px; + background-image: url('images/welcome.svg'); + background-size: contain; + background-position: center; + box-sizing: border-box; +} +.welcome-to-cau .welcome-content { + display: inline-block; + vertical-align: middle; + width: calc(100% - 100px); + padding-left: 25px; + box-sizing: border-box; +} +.welcome-to-cau .welcome-content strong { + color: #000; +} +.welcome-to-cau .welcome-content p { + margin: 2px 0; +} +.welcome-to-cau.help-bg { + background-image: url('images/help.svg'); +} +.welcome-to-cau.support-bg { + background-image: url('images/support.svg'); +} +.welcome-to-cau.love-bg { + background-image: url('images/love.svg'); +} +.welcome-to-cau.update-bg { + background-image: url('images/update.svg'); +} +.welcome-to-cau.email-bg { + background-image: url('images/email.svg'); +} +.welcome-to-cau.interval-bg { + background-image: url('images/interval.svg'); +} +.welcome-to-cau.advanced-bg { + background-image: url('images/settings.svg'); +} +.welcome-to-cau h2 { + margin: 0; + margin-bottom: 25px; + font-size: 21px; + font-weight: 400; + line-height: 1.2; +} +.welcome-to-cau h2.title { + margin-bottom: 10px; +} +.welcome-to-cau h3 { + font-size: 16px; + margin-top: 0; +} +.welcome-to-cau a { + text-decoration: none; +} +.welcome-to-cau .welcome-column { + display: inline-block; + vertical-align: top; + box-sizing: border-box; +} +.welcome-to-cau.cau-show-love .welcome-column { + vertical-align: middle; +} +.welcome-to-cau .welcome-column.welcome-column-first { + display: block; + width: 100%; +} +.first-column { + padding-left: 140px; +} +.welcome-to-cau .welcome-column.welcome-column-half { + width: 50%; +} +.welcome-to-cau .welcome-column.welcome-column-third { + width: 33%; +} +.welcome-to-cau .welcome-column.welcome-column-quarter { + width: 25%; +} +.welcome-to-cau a.minimal-button { + display: inline-block; + padding: 5px; +} +select.schedule_interval { + max-width: 90%; + width: 225px; +} +.cau_save_button.fixed_button { + background: #FFF; + box-sizing: border-box; + position: fixed; + width: 100%; + right: 0; + bottom: 0; + margin-left: -25px; + z-index: 1001; + padding: 5px; + box-shadow: 0 -8px 16px 0 rgb(85 93 102 / 30%); +} +.cau_save_button.fixed_button p.submit { + display: block; + text-align: center; + font-weight: bold; + margin: 0; + padding: 0; +} +.cau_save_button.fixed_button p.submit input { + width: 100%; + max-width: 250px; + height: 100%; + padding: 5px; +} +.cau_save_button__space { + height: 75px; +} + +/* Overwrite core UI */ +/*.cau_content input[type="checkbox"]:checked::before { + content: ""; + background: url( 'images/check.svg' ); + background-size: contain; + background-position: center center; +}*/ +.cau_content a { + color: #9178B7; +} +.cau_content a.nav-tab { + color: #23282D; +} +.cau_content .button-primary { + background-color: #9178B7!important; + border-color: #9178B7!important; +} +.cau_content .button-alt { + color: #9178B7!important; + border-color: #9178B7!important; +} +.cau_content .button-hero { + font-weight: 500; + padding: 2px 15px!important; +} +#message.cau { + background: #FFF; + border: 1px solid #CCD0D4; + border-left-width: 4px; + border-left-color: #9178B7; + box-shadow: 0 1px 1px rgba(0,0,0,.04); + margin: 25px 0px 5px 0; + padding: 15px; +} +#message.cau a, #message.cau strong { + color: #9178B7; +} + +/* Dashboard */ +.cau-column-wide { + box-sizing: border-box; + display: inline-block; + vertical-align: top; + width: calc(100% - 450px); + padding-right: 25px; +} +.cau-column-small { + display: inline-block; + vertical-align: top; + width: 450px; +} +.cau-dashboard-box { + background-position: right bottom; +} +.cau-column-wide .cau-dashboard-box { + padding-right: 125px; +} +.cau-dashboard-box a { + margin-left: 0px; + margin-top: 10px; +} +.cau-dashboard-box .welcome-column { + padding-right: 25px; +} +.support-sidebar-list { + margin-bottom: 25px; +} +.cau_content .nav-tab { + position: relative; +} +.cau_content .nav-tab .cau_melding { + display: inline-block; + width: 11px; + height: 11px; + border-radius: 10px; + margin-left: 5px; + position: relative; + bottom: -1px; +} +.cau_content .nav-tab .cau_melding.level-okay { + background: #7AD03A; +} +.cau_content .nav-tab .cau_melding.level-low { + background: #FFBA00; +} +.cau_content .nav-tab .cau_melding.level-high { + background: #FF0000; +} + +/* Table Styling */ +.cau_content .widefat td { + vertical-align: middle!important; +} +table.autoupdate th.head-plugin { + min-width: 250px; +} +table.autoupdate th.head-status { + min-width: 150px; +} +table.autoupdate th.check-column { + position: relative; + min-width: 55px; +} +table.autoupdate tr.inactive { + background: #FEF7F1; +} +table.autoupdate tr.active .check-column { + border-left: 3px solid transparent; +} +table.autoupdate tr.inactive .check-column { + border-left: 3px solid #D54E21; +} +table.autoupdate tr.inactive td.column-status p { + color: #BF3D3C; +} +table.autoupdate tr.active td.column-status p { + color: #000; +} +table.autoupdate tr td.column-description p { + overflow: hidden; + max-height: 18px; +} + +/* Update Log */ +table.autoupdatelog { + margin-top: 25px; +} +table.autoupdatelog strong { + color: #000; +} +table.autoupdatelog .dashicons { + color: #00A0D2; +} + +/* Status */ +table.cau_status_list { + margin-top: 25px; +} +table.cau_status_list:not(.no_column_width) th, table.cau_status_list:not(.no_column_width) td { + width: 25%; +} +.cau_enabled { + color: #7AD03A; +} +.cau_disabled { + color: #FF0000; +} +.cau_warning { + color: #FFBA00; +} +.cau_mobile_prefix { + display: none; +} +table.cau_status_list .cau_status_icon { + width: 50px!important; +} +table.cau_status_list .cau_status_icon .dashicons, table.cau_status_list .cau_status_icon .dashicons-before:before { + height: 25px; + font-size: 2em; +} + +/* Rollback list */ +table.rollbacklist { + max-width: 650px; +} +table.rollbacklist td { + vertical-align: middle; +} +table.rollbacklist td a.versionselectbutton { + display: inline-block; + width: 100px; + text-align: center; +} + +/* Plugin list */ +.pluginListButtons { + display: block; + padding: 15px 0; +} +.pluginListButtons p.submit { + display: inline-block; + margin: 0!important; + padding: 0!important; +} +.cau_content #the-list input[type="checkbox"]:not(:checked), .cau_content #the-list input[type="checkbox"]:checked { + width: 45px; + height: 45px; + position: absolute; + top: 0; + bottom: 0; + z-index: 100; + display: block; + opacity: 0; +} +.cau_content #the-list input[type="checkbox"]:not(:checked) + label, .cau_content #the-list input[type="checkbox"]:checked + label { + position: absolute; + top: 15px; + left: 12px; + cursor: pointer; +} +.cau_content #the-list input[type="checkbox"]:not(:checked) + label:before, .cau_content #the-list input[type="checkbox"]:checked + label:before, .cau_content #the-list input[type="checkbox"]:not(:checked) + label:after, .cau_content #the-list input[type="checkbox"]:checked + label:after { + content: ''; + position: absolute; +} +.cau_content #the-list input[type="checkbox"]:not(:checked) + label:before, .cau_content #the-list input[type="checkbox"]:checked + label:before { + left: 0; + top: -3px; + width: 30px; + height: 16px; + background: transparent; + border: 2px solid #9178B7; + border-radius: 15px; + transition: background-color .2s; +} +.cau_content #the-list input[type="checkbox"]:not(:checked) + label:after, .cau_content #the-list input[type="checkbox"]:checked + label:after { + width: 8px; + height: 8px; + transition: all .2s; + border-radius: 500px; + background: transparent; + border: 2px solid #9178B7; + top: 1px; + left: 5px; +} +.cau_content #the-list input[type="checkbox"]:not(:checked) + label:before { + background: #9178B7; + border: 2px solid #9178B7; +} +.cau_content #the-list input[type="checkbox"]:not(:checked) + label:after { + background: #9178B7; + border-color: #FFF; + left: 18px; +} + +/* Scheduling */ +.cau_schedule_input { + display: inline-block; + vertical-align: middle; + width: 50px; + padding-top: 5px; +} +.cau_schedule_input input { + max-width: 100%; + text-align: center; +} +.cau_schedule_input_div { + display: inline-block; + vertical-align: middle; + padding: 0 6px; + font-weight: bold; +} +.cau_shedule_notation { + display: inline-block; + vertical-align: middle; + width: 125px; + padding-left: 5px; +} +.cau_shedule_notation .dashicons { + position: relative; + bottom: -5px; +} + +/* Tooltip */ +.cau_tooltip { + position: relative; +} +.cau_tooltip .cau_tooltip_text { + visibility: hidden; + background-color: rgba(0,0,0,0.7); + color: #FFF; + text-align: left; + font-size: 14px; + padding: 15px; + border-radius: 6px; + position: absolute; + z-index: 1; + width: 240px; + bottom: 100%; + left: 50%; + margin-left: -60px; + margin-bottom: 10px; + opacity: 0; + transition: .3s; + font-weight: normal; +} +.cau_tooltip:hover .cau_tooltip_text { + visibility: visible; + opacity: 1; +} +.cau_tooltip .cau_tooltip_text::after { + content: " "; + position: absolute; + top: 100%; + left: 50%; + margin-left: -75px; + border-width: 5px; + border-style: solid; + border-color: rgba(0,0,0,0.7) transparent transparent transparent; +} + +/* Responsive */ +@media screen and (max-width: 1400px) { + + .cau-column-wide { + width: calc(100% - 350px); + } + .cau-column-small { + width: 350px; + } + .welcome-to-cau .welcome-column.welcome-column-quarter { + width: 50%; + padding-bottom: 35px; + } + .cau-column-small .welcome-to-cau { + background-image: none; + } + +} +@media screen and (max-width: 1150px) { + + .cau-column-wide, .cau-column-small { + width: 100%; + padding: 0; + } + +} +@media screen and (max-width: 1000px) { + + /* Basics */ + .cau_hide_on_mobile, table.autoupdate thead { + display: none!important; + } + .form-table td fieldset p { + display: block; + padding: 5px 0; + } + .form-table td fieldset input[type="checkbox"] { + display: inline-block; + vertical-align: middle; + width: 25px; + } + .form-table td fieldset label { + display: inline-block; + vertical-align: middle; + width: calc(100% - 40px); + box-sizing: border-box; + padding-left: 5px; + } + .cau_content .nav-tab-wrapper { + position: relative; + top: -20px; + border-bottom: 1px solid #CCC!important; + padding-bottom: 15px!important; + margin-bottom: 0px!important; + } + .cau_content .nav-tab { + font-size: 12px; + margin: 5px 5px 0 0!important; + box-sizing: border-box; + text-align: center; + } + + /* Scheduling */ + .cau_schedule_input { + width: 75px; + } + + /* Custom buttons */ + .cau-button { + display: block; + text-align: center; + margin: 5px 0; + } + .cau-button .dashicons { + float: left; + } + + /* Dashboard */ + .welcome-to-cau { + background-position: right bottom; + } + .welcome-to-cau.love-bg { + background-image: none; + } + .welcome-to-cau .welcome-column { + min-width: 100%; + } + .welcome-to-cau .welcome-column.welcome-column-first { + padding-left: 0px; + } + .cau-column-wide .cau-dashboard-box { + padding-right: 30px; + padding-bottom: 125px + } + .majorMinorExplain { + display: none; + } + + /* Status */ + table.cau_status_list .cau_status_name { + display: inline-block; + width: 50%; + box-sizing: border-box; + font-weight: 500; + } + table.cau_status_list .cau_status_interval { + display: none; + } + table.cau_status_list th.cau_status_next { + display: none; + } + table.cau_status_list td.cau_status_next { + display: block; + width: 100%; + } + table.cau_status_list .cau_status_active_state { + display: inline-block; + width: 50%; + box-sizing: border-box; + text-align: right; + } + .cau_mobile_prefix { + display: inline-block; + padding-right: 5px; + } + table.cau_status_list.cau_status_warnings td { + display: block; + width: 100%; + box-sizing: border-box; + } + table.cau_status_list.cau_status_warnings th.cau_plugin_issue_explain, table.cau_status_list.cau_status_warnings th.cau_plugin_issue_fixit { + display: none; + } + table.cau_status_list.cau_status_warnings td.cau_plugin_issue_name { + font-weight: 500; + } + +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/warningbar.css b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/warningbar.css new file mode 100644 index 00000000..88e62556 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/backend/warningbar.css @@ -0,0 +1,11 @@ +#wpadminbar #wp-admin-bar-cau-has-issues .ab-icon:before { + /*content: "\f463";*/ + content: "\f332"; + top: 3px; +} +#wpadminbar #wp-admin-bar-cau-has-issues .cau-level-low { + /*color: #FFBA00;*/ +} +#wpadminbar #wp-admin-bar-cau-has-issues .cau-level-high { + color: #FF0000; +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/cau_emails.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/cau_emails.php new file mode 100644 index 00000000..a04f3b81 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/cau_emails.php @@ -0,0 +1,535 @@ + $version ) { + if( $version == '' ) $version = __( "Unknown", "companion-auto-update" ); + $text .= "- ".sprintf( esc_html__( "%s tested up to: %s", "companion-auto-update" ), $plugin, $version )."\n"; + } + + } + + return $text; + +} + +// Set the content for the emails about pending updates +function cau_pending_message( $single, $plural, $list ) { + + // What markup to use + if( cau_is_html() ) $break = '
'; + else $break = "\n"; + + // Base text + $text = sprintf( esc_html__( 'You have pending %1$s updates on your WordPress site at %2$s.', 'companion-auto-update' ), $single, get_site_url() ); + $text .= $break; + + if( !empty( $list ) ) { + + $text .= $break; + $text .= sprintf( esc_html__( 'The following %1$s have new versions available.', 'companion-auto-update' ), $plural ); + $text .= $break; + + if( cau_is_html() ) $text .= "
    "; + foreach ( $list as $key => $value ) { + if( cau_is_html() ) { + $text .= "
  1. $value
  2. "; + } else { + $text .= "-$value\n"; + } + } + if( cau_is_html() ) $text .= "
"; + + $text .= $break; + } + + $text .= __( 'Leaving your site outdated is a security risk so please consider manually updating them.', 'companion-auto-update' ); + $text .= $break; + + // End + $text .= sprintf( esc_html__( 'Head over to %1$s and check the ones you want to update.', 'companion-auto-update' ), get_admin_url().'update-core.php' ); + + return $text; + +} + +// Set the content for the emails about recent updates +function cau_updated_message( $type, $updatedList ) { + + // What markup to use + if( cau_is_html() ) $break = '
'; + else $break = "\n"; + + // The message + $text = sprintf( esc_html__( + 'One or more %1$s on your WordPress site at %2$s have been updated by Companion Auto Update. No further action is needed on your part. +For more info on what is new visit your dashboard and check the changelog.', 'companion-auto-update' + ), $type, get_site_url() ); + + $text .= $break; + $text .= $break; + $text .= sprintf( esc_html__( + 'The following %1$s have been updated:', 'companion-auto-update' + ), $type ); + + $text .= $break; + $text .= $updatedList; + + $text .= $break; + $text .= __( "(You'll also receive this email if you manually updated a plugin or theme)", "companion-auto-update" ); + + return $text; + +} + +// Checks if plugins are out of date +function cau_list_outdated_software() { + + // Check if cau_get_db_value() function exists. + if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' ); + + // Set up mail + $subject = '['.get_bloginfo( 'name' ).'] ' . __( 'You have outdated plugins on your site.', 'companion-auto-update' ); + $type = __( 'plugin', 'companion-auto-update' ); + $type_plural = __( 'plugins', 'companion-auto-update' ); + $message = cau_outdated_message( $type, $type_plural, cau_list_outdated() ); + + // Send to all addresses + foreach ( cau_set_email() as $key => $value ) { + foreach ( $value as $k => $v ) { + wp_mail( $v, $subject, $message ); + } + break; + } + +} + +// Checks if theme updates are available +function cau_list_theme_updates() { + + global $wpdb; + $table_name = $wpdb->prefix . "auto_updates"; + + $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'themes'"); + foreach ( $configs as $config ) { + + if( $config->onoroff != 'on' ) { + + // Check for required files + if ( !function_exists( 'get_theme_updates' ) ) { + require_once ABSPATH . 'wp-admin/includes/update.php'; + } + + // Begin + $themes = get_theme_updates(); + $list = array(); + + if ( !empty( $themes ) ) { + + foreach ( $themes as $stylesheet => $theme ) { + array_push( $list, $theme->get( 'Name' ) ); + } + + $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Theme update available.', 'companion-auto-update' ); + $type = __('theme', 'companion-auto-update'); + $type_plural = __('themes', 'companion-auto-update'); + $message = cau_pending_message( $type, $type_plural, $list ); + + foreach ( cau_set_email() as $key => $value) { + foreach ($value as $k => $v) { + wp_mail( $v, $subject, $message ); + } + break; + } + } + + } + + } + +} + +// Checks if plugin updates are available +function cau_list_plugin_updates() { + + global $wpdb; + $table_name = $wpdb->prefix . "auto_updates"; + + $configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'plugins'"); + foreach ( $configs as $config ) { + + if( $config->onoroff != 'on' ) { + + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + // Make sure get_plugin_updates() and get_plugins() are defined + if ( !function_exists( 'get_plugin_updates' ) OR !function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + require_once ABSPATH . 'wp-admin/includes/update.php'; + } + + // Begin + $plugins = get_plugin_updates(); + + if ( !empty( $plugins ) ) { + + $list = array(); + foreach ( (array) $plugins as $plugin_file => $plugin_data ) { + $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true ); + $name = $plugin_data->Name; + array_push( $list, $name ); + } + + $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Plugin update available.', 'companion-auto-update' ); + $type = __( 'plugin', 'companion-auto-update' ); + $type_plural = __( 'plugins', 'companion-auto-update' ); + $message = cau_pending_message( $type, $type_plural, $list ); + + foreach ( cau_set_email() as $key => $value) { + foreach ($value as $k => $v) { + wp_mail( $v, $subject, $message ); + } + break; + } + } + + } + + } +} + +// Alerts when plugin has been updated +function cau_plugin_updated() { + + // Check if cau_get_db_value() function exists. + if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' ); + + // Set the correct timezone for emails + date_default_timezone_set( cau_get_proper_timezone() ); + + // Create arrays + $pluginNames = array(); + $pluginDates = array(); + $pluginVersion = array(); + $pluginSlug = array(); + $pluginTimes = array(); + $themeNames = array(); + $themeDates = array(); + $themeTimes = array(); + + // Where to look for plugins + $plugdir = plugin_dir_path( __DIR__ ); + if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // Check if get_plugins() function exists. + $allPlugins = get_plugins(); + + // Where to look for themes + $themedir = get_theme_root(); + $allThemes = wp_get_themes(); + + // Mail schedule + $schedule_mail = wp_get_schedule( 'cau_set_schedule_mail' ); + + // Loop trough all plugins + foreach ( $allPlugins as $key => $value ) { + + // Get plugin data + $fullPath = $plugdir.'/'.$key; + $getFile = $path_parts = pathinfo( $fullPath ); + $pluginData = get_plugin_data( $fullPath ); + + // Get the slug + $explosion = explode( '/', $key ); + $actualSlug = array_shift( $explosion ); + + // Get last update date + $fileDate = date ( 'YmdHi', filemtime( $fullPath ) ); + + switch ( $schedule_mail ) { + case 'hourly': + $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) ); + break; + case 'twicedaily': + $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) ); + break; + default: + $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) ); + break; + } + + $dateFormat = get_option( 'date_format' ); + $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) ); + $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) ); + + if( $fileDate >= $lastday ) { + + // Get plugin name + foreach ( $pluginData as $dataKey => $dataValue ) { + if( $dataKey == 'Name') { + array_push( $pluginNames , $dataValue ); + } + if( $dataKey == 'Version') { + array_push( $pluginVersion , $dataValue ); + } + } + + array_push( $pluginDates, $fileDate ); + array_push( $pluginSlug, $actualSlug ); + array_push( $pluginTimes, $timestamp ); + } + + } + + // Loop trough all themes + foreach ( $allThemes as $key => $value ) { + + // Get theme data + $fullPath = $themedir.'/'.$key; + $getFile = $path_parts = pathinfo( $fullPath ); + + // Get last update date + $dateFormat = get_option( 'date_format' ); + $fileDate = date ( 'YmdHi', filemtime( $fullPath ) ); + + if( $schedule_mail == 'hourly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) ); + } elseif( $schedule_mail == 'twicedaily' ) { + $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) ); + } elseif( $schedule_mail == 'daily' ) { + $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) ); + } + + $dateFormat = get_option( 'date_format' ); + $timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) ); + $timestamp .= ' - '.date( 'H:i', filemtime( $fullPath ) ); + + if( $fileDate >= $lastday ) { + array_push( $themeNames, $path_parts['filename'] ); + array_push( $themeDates, $fileDate ); + array_push( $themeTimes, $timestamp ); + } + + } + + $totalNumP = 0; + $totalNumT = 0; + $updatedListP = ''; + $updatedListT = ''; + + if( cau_get_db_value( 'html_or_text' ) == 'html' ) { + $updatedListP .= '
    '; + $updatedListT .= '
      '; + } + + foreach ( $pluginDates as $key => $value ) { + + // Set up some var + $plugin_name = $pluginNames[$key]; + $plugin_slug = $pluginSlug[$key]; + $to_version = __( "to version", "companion-auto-update" ).' '.$pluginVersion[$key]; + $more_info_arr = array( __( "Time of update", "companion-auto-update" ) => $pluginTimes[$key] ); + + // Plugin links + if( cau_get_db_value( 'plugin_links_emails' ) == 'on' ) { + $more_info_arr[__( "Plugin details", "companion-auto-update" )] = "".__( "Visit", "companion-auto-update" ).""; + $more_info_arr[__( "Release notes", "companion-auto-update" )] = "".__( "Visit", "companion-auto-update" ).""; + $more_info_arr[__( "Support", "companion-auto-update" )] = "".__( "Visit", "companion-auto-update" ).""; + } + + // Email format + $use_html = ( cau_get_db_value( 'html_or_text' ) == 'html' ) ? true : false; + + // Email content + $updatedListP .= $use_html ? "
    1. " : "-"; // Start row + + $updatedListP .= $use_html ? "{$plugin_name} " : "{$plugin_name} "; // Show plugin name + $updatedListP .= $to_version; // To version + + // Get advanced info + if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) { + foreach( $more_info_arr as $label => $value ) { + $updatedListP .= $use_html ? "
      {$label}: {$value}" : "\n{$label}: {$value}"; + } + } + + $updatedListP .= $use_html ? "
    2. " : "\n"; // End row + + $totalNumP++; + } + + foreach ( $themeNames as $key => $value ) { + + if( cau_get_db_value( 'html_or_text' ) == 'html' ) { + + $more_info = ''; + if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "
      ".__( "Time of update", "companion-auto-update" ).": ".$themeTimes[$key].""; + $updatedListT .= "
    3. ".$themeNames[$key]."".$more_info."
    4. "; + + } else { + $updatedListT .= "- ".$themeNames[$key]."\n"; + } + + $totalNumT++; + } + + if( cau_get_db_value( 'html_or_text' ) == 'html' ) { + $updatedListP .= '
    '; + $updatedListT .= '
'; + } + + // Set the email content type + if( cau_get_db_value( 'html_or_text' ) == 'html' ) { + function cau_mail_content_type() { + return 'text/html'; + } + add_filter( 'wp_mail_content_type', 'cau_mail_content_type' ); + } + + // If plugins have been updated, send email + if( $totalNumP > 0 ) { + + // E-mail content + $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more plugins have been updated.', 'companion-auto-update'); + $type = __('plugins', 'companion-auto-update'); + $message = cau_updated_message( $type, $updatedListP ); + + // Send to all addresses + foreach ( cau_set_email() as $key => $value) { + foreach ($value as $k => $v) { + wp_mail( $v, $subject, $message ); + } + break; + } + + } + + // If themes have been updated, send email + if( $totalNumT > 0 ) { + + // E-mail content + $subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more themes have been updated.', 'companion-auto-update'); + $type = __('themes', 'companion-auto-update'); + $message = cau_updated_message( $type, $updatedListT ); + + // Send to all addresses + foreach ( cau_set_email() as $key => $value) { + foreach ($value as $k => $v) { + wp_mail( $v, $subject, $message ); + } + break; + } + + } + + if( cau_get_db_value( 'html_or_text' ) == 'html' ) remove_filter( 'wp_mail_content_type', 'cau_mail_content_type' ); + + // Prevent duplicate emails by setting the event again + if( $totalNumT > 0 OR $totalNumP > 0 ) { + if( $schedule_mail == 'hourly' ) { + wp_clear_scheduled_hook('cau_set_schedule_mail'); + wp_schedule_event( strtotime( '+1 hour', time() ) , 'hourly', 'cau_set_schedule_mail' ); + } + } + +} + +function cau_notify_outofdate_db() { + + // Check if cau_get_db_value() function exists. + if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' ); + + // Database requires an update + if ( cau_incorrectDatabaseVersion() ) { + + // Set up mail + $subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'We need your help with something', 'companion-auto-update' ); + $message = __( 'Hi there! We need your help updating the database of Companion Auto Update to the latest version. No rush, old features will continue to work but some new features might not work until you update the database.', 'companion-auto-update' ); + + // Send to all addresses + foreach ( cau_set_email() as $key => $value ) { + foreach ( $value as $k => $v ) { + wp_mail( $v, $subject, $message ); + } + break; + } + + } + +} diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/cau_functions.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/cau_functions.php new file mode 100644 index 00000000..e97c835a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/cau_functions.php @@ -0,0 +1,1457 @@ +prefix.'auto_updates'; + $cau_configs = $wpdb->get_results( "SELECT name, onoroff FROM {$table_name} WHERE name = 'allow_editor' OR name = 'allow_author'" ); + + foreach ( $cau_configs as $config ) { + if( $config->onoroff == 'on' ) $allowed_roles[] = str_replace( "allow_", "", $config->name ); + } + + // Return array + return $allowed_roles; + +} + +// What user rights can edit plugin settings? TRUE/FALSE +function cau_allowed_user_rights() { + + // Current user + $user = wp_get_current_user(); + + // Allow roles + $allowed_roles = cau_allowed_user_rights_array(); + + // Check + if ( array_intersect( $allowed_roles, $user->roles ) ) { + return true; + } else { + return false; + } + +} + +// Get database value +function cau_get_db_value( $name, $table = 'auto_updates' ) { + + global $wpdb; + $table_name = $wpdb->prefix.$table; + $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT onoroff FROM {$table_name} WHERE name = '%s'", $name ) ); + foreach ( $cau_configs as $config ) return $config->onoroff; + +} + +// Get database value +function cau_get_plugininfo( $check, $field ) { + + global $wpdb; + $table_name = $wpdb->prefix.'update_log'; + $cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE slug = '%s'", $check ) ); + foreach ( $cau_configs as $config ) return $config->$field; + +} + +// Get the set timezone +function cau_get_proper_timezone() { + + // WP 5.3 adds the wp_timezone_string function + if ( !function_exists( 'wp_timezone_string' ) ) { + $timezone = get_option( 'timezone_string' ); + } else { + $timezone = wp_timezone_string(); + } + + // Should fix an reported issue + if( $timezone == '+00:00' ) { + $timezone = 'UTC'; + } + + return $timezone; + +} + +// Copy of the wp_timezone_string for < 5.3 compat +if ( !function_exists( 'wp_timezone_string' ) ) { + function wp_timezone_string() { + $timezone_string = get_option( 'timezone_string' ); + + if ( $timezone_string ) { + return $timezone_string; + } + + $offset = (float) get_option( 'gmt_offset' ); + $hours = (int) $offset; + $minutes = ( $offset - $hours ); + + $sign = ( $offset < 0 ) ? '-' : '+'; + $abs_hour = abs( $hours ); + $abs_mins = abs( $minutes * 60 ); + $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins ); + + return $tz_offset; + } +} + +// List of incompatible plugins +function cau_incompatiblePluginlist() { + + // Pluginlist, write as Plugin path => Issue + $pluginList = array( + 'better-wp-security/better-wp-security.php' => " May block auto-updating for everything.", + 'updraftplus/updraftplus.php' => " By default this plugin will not be auto-updated. You'll have to do this manually or enable auto-updating in the settings. Causes no issues with other plugins." + ); + + return $pluginList; + +} +function cau_incompatiblePlugins() { + + $return = false; + + foreach ( cau_incompatiblePluginlist() as $key => $value ) { + if( is_plugin_active( $key ) ) { + $return = true; + } + } + + return $return; + +} + +// Check if has issues +function cau_pluginHasIssues() { + + $return = false; + + if( get_option( 'blog_public' ) == 0 && cau_get_db_value( 'ignore_seo' ) != 'yes' ) { + $return = true; + } + + if( checkAutomaticUpdaterDisabled() ) { + $return = true; + } + + if( checkCronjobsDisabled() && cau_get_db_value( 'ignore_cron' ) != 'yes' ) { + $return = true; + } + + if( cau_incorrectDatabaseVersion() ) { + $return = true; + } + + return $return; +} +function cau_pluginIssueLevels() { + + if( checkAutomaticUpdaterDisabled() ) { + $level = 'high'; + } else { + $level = 'low'; + } + + return $level; +} +function cau_pluginIssueCount() { + + $count = 0; + + // blog_public check + if( get_option( 'blog_public' ) == 0 ) $count++; + + // checkAutomaticUpdaterDisabled + if( checkAutomaticUpdaterDisabled() ) $count++; + + // checkCronjobsDisabled + if( checkCronjobsDisabled() ) $count++; + + // cau_incorrectDatabaseVersion + if( cau_incorrectDatabaseVersion() ) $count++; + + // cau_incompatiblePlugins + if( cau_incompatiblePlugins() ) { + foreach ( cau_incompatiblePluginlist() as $key => $value ) { + if( is_plugin_active( $key ) ) { + $count++; + } + } + } + + return $count; +} +function cau_incorrectDatabaseVersion() { + if( get_option( "cau_db_version" ) != cau_db_version() ) { + return true; + } else { + return false; + } +} + +// Run custom hooks on plugin update +function cau_run_custom_hooks_p() { + + // Check if function exists + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + // Create array + $allDates = array(); + + // Where to look for plugins + $dirr = plugin_dir_path( __DIR__ ); + $listOfAll = get_plugins(); + + // Number of updates + $numOfUpdates = 0; + + // Loop trough all plugins + foreach ( $listOfAll as $key => $value ) { + + // Get data + $fullPath = $dirr.'/'.$key; + $fileDate = date ( 'YmdHi', filemtime( $fullPath ) ); + $fileTime = date ( 'Hi', filemtime( $fullPath ) ); + $updateSched = wp_get_schedule( 'wp_update_plugins' ); + + // Check when the last update was + if( $updateSched == 'hourly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) ); + } elseif( $updateSched == 'twicedaily' ) { + $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) ); + } elseif( $updateSched == 'daily' ) { + $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) ); + } elseif( $updateSched == 'weekly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) ); + } elseif( $updateSched == 'monthly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) ); + } else { + $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) ); + } + + $update_time = wp_next_scheduled( 'wp_update_plugins' ); + $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) ); + $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) ); + + if( $fileDate >= $lastday ) { + + // Push to array + array_push( $allDates, $fileDate ); + + // Update info + if( $fileTime > $range_start && $fileTime < $range_end ) { + $status = __( 'Automatic', 'companion-auto-update' ); + } else { + $status = __( 'Manual', 'companion-auto-update' ); + } + + $numOfUpdates++; + + cau_updatePluginInformation( $key, $status ); + + } + + } + + // If there have been plugin updates run hook + if( $numOfUpdates >= 1 ) { + do_action( 'cau_after_plugin_update' ); + } + +} + +// Run custom hooks on theme update +function cau_run_custom_hooks_t() { + + // Create array + $allDates = array(); + + // Where to look for plugins + $dirr = get_theme_root(); + $listOfAll = wp_get_themes(); + + // Loop trough all plugins + foreach ( $listOfAll as $key => $value) { + + // Get data + $fullPath = $dirr.'/'.$key; + $fileDate = date ( 'YmdHi', filemtime( $fullPath ) ); + $fileTime = date ( 'Hi', filemtime( $fullPath ) ); + $updateSched = wp_get_schedule( 'wp_update_themes' ); + + // Check when the last update was + if( $updateSched == 'hourly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) ); + } elseif( $updateSched == 'twicedaily' ) { + $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) ); + } elseif( $updateSched == 'daily' ) { + $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) ); + } elseif( $updateSched == 'weekly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) ); + } elseif( $updateSched == 'monthly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) ); + } else { + $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) ); + } + + $update_time = wp_next_scheduled( 'wp_update_themes' ); + $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) ); + $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) ); + + if( $fileDate >= $lastday ) { + + // Push to array + array_push( $allDates, $fileDate ); + + // Update info + if( $fileTime > $range_start && $fileTime < $range_end ) { + $status = __( 'Automatic', 'companion-auto-update' ); + } else { + $status = __( 'Manual', 'companion-auto-update' ); + } + cau_updatePluginInformation( $key, $status ); + + } + + } + + $totalNum = 0; + + // Count number of updated plugins + foreach ( $allDates as $key => $value ) $totalNum++; + + // If there have been plugin updates run hook + if( $totalNum > 0 ) { + do_action( 'cau_after_theme_update' ); + } + +} + +// Run custom hooks on core update +function cau_run_custom_hooks_c() { + + // Create array + $totalNum = 0; + + // Get data + $fullPath = ABSPATH.'wp-includes/version.php'; + $fileDate = date ( 'YmdHi', filemtime( $fullPath ) ); + $updateSched = wp_get_schedule( 'wp_version_check' ); + + // Check when the last update was + if( $updateSched == 'hourly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) ); + } elseif( $updateSched == 'twicedaily' ) { + $lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) ); + } elseif( $updateSched == 'daily' ) { + $lastday = date( 'YmdHi', strtotime( '-1 day', time() ) ); + } elseif( $updateSched == 'weekly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 week', time() ) ); + } elseif( $updateSched == 'monthly' ) { + $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) ); + } else { + $lastday = date( 'YmdHi', strtotime( '-1 month', time() ) ); + } + + // Check manual or automatic + $update_time = wp_next_scheduled( 'wp_version_check' ); + $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) ); + $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) ); + + if( $fileDate >= $lastday ) { + + // Update info + if( $fileDate > $range_start && $fileDate < $range_end ) { + $status = __( 'Automatic', 'companion-auto-update' ); + } else { + $status = __( 'Manual', 'companion-auto-update' ); + } + cau_updatePluginInformation( 'core', $status ); + + $totalNum++; + + } + + // If there have been plugin updates run hook + if( $totalNum > 0 ) { + do_action( 'cau_after_core_update' ); + } + +} + +// Check if automatic updating is disabled globally +function checkAutomaticUpdaterDisabled() { + + // I mean, I know this can be done waaaay better but I's quite late and I need to push a fix so take it or leave it untill I decide to fix this :) + + if ( defined( 'automatic_updater_disabled' ) ) { + if( doing_filter( 'automatic_updater_disabled' ) ) { + return true; + } elseif( constant( 'automatic_updater_disabled' ) == 'true' ) { + return true; + } elseif( constant( 'automatic_updater_disabled' ) == 'minor' ) { + return true; + } else { + return false; + } + + } else if ( defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) { + if( doing_filter( 'AUTOMATIC_UPDATER_DISABLED' ) ) { + return true; + } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'true' ) { + return true; + } elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'minor' ) { + return true; + } else { + return false; + } + + } else { + return false; + } + +} + +// Check if cronjobs are disabled +function checkCronjobsDisabled() { + + if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) { + return true; + } else { + return false; + } + +} + +// Menu location +function cau_menloc( $after = '' ) { + return 'tools.php'.$after; +} +function cau_url( $tab = '' ) { + return admin_url( cau_menloc( '?page=cau-settings&tab='.$tab ) ); +} + +// Get the active tab +function active_tab( $page, $identifier = 'tab' ) { + echo _active_tab( $page, $identifier ); +} +function _active_tab( $page, $identifier = 'tab' ) { + + if( !isset( $_GET[ $identifier ] ) ) { + $cur_page = ''; + } else { + $cur_page = $_GET[ $identifier ]; + } + + if( $page == $cur_page ) { + return 'nav-tab-active'; + } + +} + +// Get the active subtab +function active_subtab( $page, $identifier = 'tab' ) { + + if( !isset( $_GET[ $identifier ] ) ) { + $cur_page = ''; + } else { + $cur_page = $_GET[ $identifier ]; + } + + if( $page == $cur_page ) { + echo 'current'; + } + +} + +// List of plugins that should not be updated +function donotupdatelist( $filter = 'plugins' ) { + + // Select correct database row + switch ( $filter ) { + case 'themes': + $db_table = 'notUpdateListTh'; + break; + case 'plugins': + $db_table = 'notUpdateList'; + break; + default: + $db_table = 'notUpdateList'; + break; + } + + // Create list + global $wpdb; + $table_name = $wpdb->prefix."auto_updates"; + $config = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = '{$db_table}'"); + + $list = $config[0]->onoroff; + $list = explode( ", ", $list ); + $returnList = array(); + + foreach ( $list as $key ) array_push( $returnList, $key ); + + return $returnList; + +} +function plugins_donotupdatelist() { + + // Base array + $array = array(); + + // Filtered plugins + $filteredplugins = donotupdatelist( 'plugins' ); + foreach ( $filteredplugins as $filteredplugin ) array_push( $array, $filteredplugin ); + + // Plugin added to the delay list + $delayedplugins = cau_delayed_updates__formated(); + foreach ( $delayedplugins as $delayedplugin ) array_push( $array, $delayedplugin ); + + // Return array + return $array; +} +function themes_donotupdatelist() { + return donotupdatelist( 'themes' ); +} + +// Show the update log +function cau_fetch_log( $limit, $format = 'simple' ) { + + // Database + global $wpdb; + $updateLog = "update_log"; + $updateLogDB = $wpdb->prefix.$updateLog; + + // Filter log + if( isset( $_GET['filter'] ) ) { + $filter = $_GET['filter']; + } else { + $filter = 'all'; + } + + switch( $filter ) { + + case 'plugins': + $plugins = true; + $themes = false; + $core = false; + $translations = false; + break; + + case 'themes': + $plugins = false; + $themes = true; + $core = false; + $translations = false; + break; + + case 'translations': + $plugins = false; + $themes = false; + $core = false; + $translations = true; + break; + + default: + $plugins = true; + $themes = true; + $core = true; + $translations = false; + break; + } + + // Create arrays + $pluginNames = array(); + $pluginVersion = array(); + $pluginDates = array(); + $pluginDatesF = array(); + $plugslug = array(); + $type = array(); + $method = array(); + + // Date format + $dateFormat = get_option( 'date_format' ); + + // PLUGINS + if( $plugins ) { + + // Check if function exists + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + // Where to look for plugins + $plugdir = plugin_dir_path( __DIR__ ); + $allPlugins = get_plugins(); + + // Loop trough all plugins + foreach ( $allPlugins as $key => $value) { + + // Get plugin data + $fullPath = $plugdir.'/'.$key; + $getFile = $path_parts = pathinfo( $fullPath ); + $pluginData = get_plugin_data( $fullPath ); + $pluginSlug = explode( "/", plugin_basename( $key ) ); + $pluginSlug = $pluginSlug[0]; + + array_push( $plugslug , $pluginSlug ); + + // Automatic or Manual (non-db-version) + $date_tod = date ( 'ydm' ); + $fileDay = date ( 'ydm', filemtime( $fullPath ) ); + $fileTime = date ( 'Hi', filemtime( $fullPath ) ); + $updateSched = wp_next_scheduled( 'wp_update_plugins' ); + $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) ); + $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) ); + + if( $date_tod == $fileDay ) { + + if( $fileTime > $range_start && $fileTime < $range_end ) { + $status = __( 'Automatic', 'companion-auto-update' ); + } else { + $status = __( 'Manual', 'companion-auto-update' ); + } + + array_push( $method , $status ); + + } else { + + // Get info from database + if( cau_check_if_exists( $key, 'slug', $updateLog ) ) { + array_push( $method , cau_get_plugininfo( $key, 'method' ) ); + } else { + array_push( $method , '-' ); + } + + } + + // Get plugin name + foreach ( $pluginData as $dataKey => $dataValue ) { + if( $dataKey == 'Name') { + array_push( $pluginNames , $dataValue ); + } + if( $dataKey == 'Version') { + array_push( $pluginVersion , $dataValue ); + } + } + + // Get last update date + $fileDate = date ( 'YmdHi', filemtime( $fullPath ) ); + if( $format == 'table' ) { + $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) ); + $fileDateF .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) ); + } else { + $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) ); + } + array_push( $pluginDates, $fileDate ); + array_push( $pluginDatesF, $fileDateF ); + array_push( $type, 'Plugin' ); + + } + + } + + // THEMES + if( $themes ) { + + // Where to look for themes + $themedir = get_theme_root(); + $allThemes = wp_get_themes(); + + // Loop trough all themes + foreach ( $allThemes as $key => $value) { + + // Get theme data + $fullPath = $themedir.'/'.$key; + $getFile = $path_parts = pathinfo( $fullPath ); + + // Get theme name + $theme_data = wp_get_theme( $path_parts['filename'] ); + $themeName = $theme_data->get( 'Name' ); + $themeVersion = $theme_data->get( 'Version' ); + array_push( $pluginNames , $themeName ); + array_push( $pluginVersion , $themeVersion ); + + // Automatic or Manual (non-db-version) + $date_tod = date ( 'ydm' ); + $fileDay = date ( 'ydm', filemtime( $fullPath ) ); + $fileTime = date ( 'Hi', filemtime( $fullPath ) ); + $updateSched = wp_next_scheduled( 'wp_update_themes' ); + $range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) ); + $range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) ); + + if( $date_tod == $fileDay ) { + + if( $fileTime > $range_start && $fileTime < $range_end ) { + $status = __( 'Automatic', 'companion-auto-update' ); + } else { + $status = __( 'Manual', 'companion-auto-update' ); + } + + array_push( $method , $status ); + + } else { + + // Get info from database + if( cau_check_if_exists( $key, 'slug', $updateLog ) ) { + array_push( $method , cau_get_plugininfo( $key, 'method' ) ); + } else { + array_push( $method , '-' ); + } + + } + + // Get last update date + $fileDate = date( 'YmdHi', filemtime( $fullPath ) ); + + if( $format == 'table' ) { + $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) ); + $fileDateF .= ' ‐ '.date ( 'H:i', filemtime( $fullPath ) ); + } else { + $fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) ); + } + + array_push( $pluginDates, $fileDate ); + array_push( $pluginDatesF, $fileDateF ); + array_push( $type, 'Theme' ); + array_push( $plugslug , '' ); + + } + + } + + // TRANSLATIONS + if( $translations ) { + + // There is no way (at this time) to check if someone changed this link, so therefore it won't work when it's changed, sorry + $transFolder = get_home_path().'wp-content/languages'; + if( file_exists( $transFolder ) ) { + + $allThemTranslations = array(); + $allThemTypes = array(); + + $pt = __( 'Plugin translations', 'companion-auto-update' ); + $tt = __( 'Theme translations', 'companion-auto-update' ); + $ct = __( 'Core translations', 'companion-auto-update' ); + + // Plugin translations + $files = glob( $transFolder.'/plugins/*.{mo}', GLOB_BRACE ); + foreach( $files as $file ) { + array_push( $allThemTranslations, $file ); + array_push( $allThemTypes, $pt ); + } + + // Theme translations + $files = glob( $transFolder.'/themes/*.{mo}', GLOB_BRACE ); + foreach( $files as $file ) { + array_push( $allThemTranslations, $file ); + array_push( $allThemTypes, $tt ); + } + + // Core translations + $files = glob( $transFolder.'/*.{mo}', GLOB_BRACE ); + foreach( $files as $file ) { + array_push( $allThemTranslations, $file ); + array_push( $allThemTypes, $ct ); + } + + foreach( $allThemTranslations as $key => $trans_file ) { + + $transDate = date( 'YmdHi', filemtime( $trans_file ) ); + + if( $format == 'table' ) { + $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) ); + $transDateF .= ' ‐ '.date ( 'H:i', filemtime( $trans_file ) ); + } else { + $transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) ); + } + + $trans_name = basename( $trans_file ); + $trans_name = str_replace( "-", " ", $trans_name ); + $trans_name = str_replace( ".mo", "", $trans_name ); + $trans_name = str_replace( ".json", "", $trans_name ); + $trans_lang = substr( $trans_name, strrpos( $trans_name, " " ) + 1 ); + $trans_name = str_replace( $trans_lang, "", $trans_name ); + $trans_lang = substr( $trans_lang, strrpos( $trans_lang, "_" ) + 1 ); + + // Push + array_push( $pluginNames, ucfirst( $trans_name ).': '.$trans_lang ); + array_push( $type, $allThemTypes[$key] ); + array_push( $pluginVersion, '-' ); + array_push( $pluginDates, $transDate ); + array_push( $pluginDatesF, $transDateF ); + array_push( $plugslug , '' ); + array_push( $method , '-' ); + + } + + } else { + + $transDate = date('YmdHi'); + $transDateF = 'Could not read translations date.'; + + array_push( $pluginNames, 'Translations' ); + array_push( $type, $trans_type.' translations' ); + array_push( $pluginVersion, '-' ); + array_push( $pluginDates, $transDate ); + array_push( $pluginDatesF, $transDateF ); + array_push( $plugslug , '' ); + + // Get info from database + array_push( $method , '-' ); + + } + + } + + // CORE + if( $core ) { + + $coreFile = ABSPATH.'wp-includes/version.php'; + $updateSched = wp_next_scheduled( 'wp_version_check' ); + + if( file_exists( $coreFile ) ) { + + $coreDate = date( 'YmdHi', filemtime( $coreFile ) ); + + if( $format == 'table' ) { + $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) ); + $coreDateF .= ' ‐ '.date ( 'H:i', filemtime( $coreFile ) ); + } else { + $coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) ); + } + + // Automatic or Manual (non-db-version) + $date_tod = date ( 'ydm' ); + $fileDay = date ( 'ydm', filemtime( $coreFile ) ); + $fileTime = date ( 'Hi', filemtime( $coreFile ) ); + $update_time = wp_next_scheduled( 'wp_version_check' ); + $range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) ); + $range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) ); + + if( $date_tod == $fileDay ) { + + if( $fileTime > $range_start && $fileTime < $range_end ) { + $methodVal = __( 'Automatic', 'companion-auto-update' ); + } else { + $methodVal = __( 'Manual', 'companion-auto-update' ); + } + + } else { + + // Get info from database + if( cau_check_if_exists( $key, 'slug', $updateLog ) ) { + $methodVal = cau_get_plugininfo( 'core', 'method' ); + } else { + $methodVal = ''; + } + + } + + + } else { + $coreDate = date('YmdHi'); + $coreDateF = 'Could not read core date.'; + } + + array_push( $pluginNames, 'WordPress' ); + array_push( $type, 'WordPress' ); + array_push( $pluginVersion, get_bloginfo( 'version' ) ); + array_push( $pluginDates, $coreDate ); + array_push( $pluginDatesF, $coreDateF ); + array_push( $plugslug , '' ); + + // Get info from database + array_push( $method , $methodVal ); + + } + + // Sort array by date + arsort( $pluginDates ); + + if( $limit == 'all' ) { + $limit = 999; + } + + $listClasses = 'wp-list-table widefat autoupdate autoupdatelog'; + + if( $format == 'table' ) { + $listClasses .= ' autoupdatelog striped'; + } else { + $listClasses .= ' autoupdatewidget'; + } + + echo ''; + + // Show the last updated plugins + if( $format == 'table' ) { + + echo ' + + '; + if( !$translations ) echo ''; + echo ' + + + + '; + + } + + echo ''; + + $loopings = 0; + + foreach ( $pluginDates as $key => $value ) { + + if( $loopings < $limit ) { + + echo ''; + + if( $format == 'table' ) { + $pluginName = $pluginNames[$key]; + } else { + $pluginName = substr( $pluginNames[$key], 0, 25); + if( strlen( $pluginNames[$key] ) > 25 ) { + $pluginName .= '...'; + } + } + + echo ''; + + if( $format == 'table' ) { + + if( $type[$key] == 'Plugin' ) { + $thisType = __( 'Plugin', 'companion-auto-update' ); + } else if( $type[$key] == 'Theme' ) { + $thisType = __( 'Theme', 'companion-auto-update' ); + } else { + $thisType = $type[$key]; + } + + if( !$translations ) echo ''; + echo ''; + + } + + echo ''; + + if( $format == 'table' ) { + echo ''; + } + + echo ''; + + $loopings++; + + } + + } + + echo "
'.__( 'Name', 'companion-auto-update' ).''.__( 'To version', 'companion-auto-update' ).''.__( 'Type', 'companion-auto-update' ).''.__( 'Last updated on', 'companion-auto-update' ).''.__( 'Update method', 'companion-auto-update' ).'

'.cau_getChangelogUrl( $type[$key], $pluginNames[$key], $plugslug[$key] ).'

'. $pluginVersion[$key] .'

'. $thisType .'

'. $pluginDatesF[$key] .'

'. $method[$key] .'

"; + +} + +// Get the proper changelog URL +function cau_getChangelogUrl( $type, $name, $plugslug ) { + + switch( $type ) { + case 'WordPress': + $url = ''; + break; + case 'Plugin': + $url = admin_url( 'plugin-install.php?tab=plugin-information&plugin='.$plugslug.'§ion=changelog&TB_iframe=true&width=772&height=772' ); + break; + case 'Theme': + $url = ''; + break; + } + + if( !empty( $url ) ) { + return ''.$name.''; + } else { + return $name; + } + +} + +// Only update plugins which are enabled +function cau_dontUpdatePlugins( $update, $item ) { + + $plugins = plugins_donotupdatelist(); + + if ( in_array( $item->slug, $plugins ) ) { + return false; // Don't update these plugins + } else { + return true; // Always update these plugins + } + + +} +function cau_dontUpdateThemes( $update, $item ) { + + $themes = themes_donotupdatelist(); + + if ( in_array( $item->slug, $themes ) ) { + return false; // Don't update these themes + } else { + return true; // Always update these themes + } + + +} + +// Get plugin information of repository +function cau_plugin_info( $slug, $what ) { + + $slug = sanitize_title( $slug ); + $cau_transient_name = 'cau' . $slug; + $cau_info = get_transient( $cau_transient_name ); + + if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' ); + $cau_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) ); + + if ( ! $cau_info or is_wp_error( $cau_info ) ) { + return false; + } + + set_transient( $cau_transient_name, $cau_info, 3600 ); + + switch ( $what ) { + case 'versions': + return $cau_info->versions; + break; + case 'version': + return $cau_info->version; + break; + case 'name': + return $cau_info->name; + break; + case 'slug': + return $cau_info->slug; + break; + } + +} + +// Get list of outdated plugins +function cau_list_outdated() { + + $outdatedList = array(); + + // Check if function exists + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + if( !function_exists( 'plugins_api' ) ) { + require_once( ABSPATH.'wp-admin/includes/plugin-install.php' ); + } + + foreach ( get_plugins() as $key => $value) { + + $slug = $key; + $explosion = explode( '/', $slug ); + $actualSlug = array_shift( $explosion ); + + // Get plugin name + foreach ( $value as $k => $v ) if( $k == "Name" ) $name = $v; + + // Get plugins tested up to version + $api = plugins_api( 'plugin_information', array( 'slug' => wp_unslash( $actualSlug ), 'tested' => true ) ); + + // Version compare + $tested_version = substr( $api->tested, 0, 3 ); // Format version number + + // Check if "tested up to" version number is set + if( $tested_version != '' ) { + + $current_version = substr( get_bloginfo( 'version' ), 0, 3 ); // Format version number + $version_difference = ( (int)$current_version - (int)$tested_version ); // Get the difference + // $tested_wp = ( empty( $api->tested ) || cau_version_compare( get_bloginfo( 'version' ), $api->tested, '<' ) ); + + if( $version_difference >= '0.3' ) { + $outdatedList[$name] = substr( $api->tested, 0, 3 ); + } + + } else { + $outdatedList[$name] = ''; // We'll catch this when sending the e-mail + } + + } + + return $outdatedList; + +} + +// Better version compare +function cau_version_compare( $ver1, $ver2, $operator = null ) { + $p = '#(\.0+)+($|-)#'; + $ver1 = preg_replace( $p, '', $ver1 ); + $ver2 = preg_replace( $p, '', $ver2 ); + return isset( $operator ) ? version_compare( $ver1, $ver2, $operator ) : version_compare( $ver1, $ver2 ); +} + +// Get plugin information of currently installed plugins +function cau_active_plugin_info( $slug, $what ) { + + // Check if function exists + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + $allPlugins = get_plugins(); + + foreach( $allPlugins as $key => $value ) { + $thisSlug = explode('/', $key); + $thisSlugE = $thisSlug[0]; + if( $thisSlug == $slug ) { + if( $what == 'version' ) return $value['Version']; + } + } + +} + +// Remove update nag when major updates are disabled +function cau_hideUpdateNag() { + if( cau_get_db_value( 'major' ) != 'on' ) { + remove_action( 'admin_notices', 'update_nag', 3 ); + remove_action( 'network_admin_notices', 'maintenance_nag', 10 ); + } +} +add_action( 'admin_head', 'cau_hideUpdateNag', 100 ); + +// Add more intervals to event schedules +function cau_addMoreIntervals( $schedules ) { + + // Add a weekly interval. + $schedules['weekly'] = array( + 'interval' => 604800, + 'display' => __( 'Every week', 'companion-auto-update' ), + ); + + // Add a twice montly interval. + $schedules['twice_monthly'] = array( + 'interval' => 1209600, + 'display' => __( 'Every 2 weeks', 'companion-auto-update' ), + ); + + // Add a montly interval. + $schedules['once_monthly'] = array( + 'interval' => 2419200, + 'display' => __( 'Every 4 weeks', 'companion-auto-update' ), + ); + + return $schedules; + +} +add_filter( 'cron_schedules', 'cau_addMoreIntervals' ); + +// Get only unique schedules +function cau_wp_get_schedules() { + + // Start variables + $availableIntervals = wp_get_schedules(); + $array_unique = array(); + $intervalTimes = array(); + $intervalNames = array(); + $intervalUniques = array(); + $counter = 0; + + // Get all intervals + foreach ( $availableIntervals as $key => $value ) { + + // Do a bunch of checks to format them the right way + foreach ( $value as $display => $interval ) { + + if( $display == 'interval' ) { + + if( $interval == '86400' ) $key = 'daily'; // Force the daily interval to be called daily, required by a bunch of handles of this plugin + + $intervalTimes[$counter] = $key; // Add the backend name (i.e. "once_monthly" or "daily") + $intervalUniques[$counter] = $interval; // Add the unix timestamp of this interval, used to identify unique items + + // Format display name in a proper way + $numOfMinutes = ($interval/60); + $identifier = __( 'minutes', 'companion-auto-update' ); + + // I just know there's an easier way for this, but I can't come up with it and this works so... + if( $interval >= (60*60) ) { + $numOfMinutes = ($numOfMinutes/60); + $identifier = __( 'hours', 'companion-auto-update' ); + } + if( $interval >= (60*60*24) ) { + $numOfMinutes = ($numOfMinutes/24); + $identifier = __( 'days', 'companion-auto-update' ); + } + if( $interval >= (60*60*24*7) ) { + $numOfMinutes = ($numOfMinutes/7); + $identifier = __( 'weeks', 'companion-auto-update' ); + } + if( $interval >= (60*60*24*7*(52/12)) ) { + $numOfMinutes = ($numOfMinutes/(52/12)); + $identifier = __( 'months', 'companion-auto-update' ); + } + + $display = sprintf( esc_html__( 'Every %s %s', 'companion-auto-update' ), round( $numOfMinutes, 2 ), $identifier ); // Translateble + $intervalNames[$counter] = $display; // Add the display name (i.e. "Once a month" or "Once Daily") + + $counter++; // Make sure the next interval gets a new "key" value + } + + } + + } + + // Sort the interval from smallest to largest + asort( $intervalUniques ); + + // Prevent duplicates + foreach ( array_unique( $intervalUniques ) as $key => $value ) { + // $value is the timestamp + // $intervalTimes[$key] is the backend name + // $intervalNames[$key] is the display name + $array_unique[$intervalTimes[$key]] = $intervalNames[$key]; + } + + // Return the array + return $array_unique; + +} + +// Check if the update log db is empty +function cau_updateLogDBisEmpty() { + + global $wpdb; + $updateDB = "update_log"; + $updateLog = $wpdb->prefix.$updateDB; + $row_count = $wpdb->get_var( "SELECT COUNT(*) FROM $updateLog" ); + + if( $row_count > 0 ) { + return false; + } else { + return true; + } +} + +// Plugin information to DB +function cau_savePluginInformation( $method = 'New' ) { + + // Check if function exists + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + // Set variables + global $wpdb; + $updateDB = "update_log"; + $updateLog = $wpdb->prefix.$updateDB; + $allPlugins = get_plugins(); + $allThemes = wp_get_themes(); + + // Loop trough all themes + foreach ( $allThemes as $key => $value ) { + if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) ); + } + + // Loop trough all plugins + foreach ( $allPlugins as $key => $value ) { + if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) ); + } + + // Core + if( !cau_check_if_exists( 'core', 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => 'core', 'oldVersion' => '-', 'method' => $method ) ); + +} + +function cau_updatePluginInformation( $slug, $method = '-', $newVersion = '-' ) { + + global $wpdb; + $updateDB = "update_log"; + $updateLog = $wpdb->prefix.$updateDB; + $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET newVersion = '%s', method = %s WHERE slug = '%s'", $newVersion, $method, $slug ) ); + +} + +function cau_siteHealthSignature() { + return '

'.__( 'This was reported by the Companion Auto Update plugin', 'companion-auto-update' ).'

'; +} + +function cau_add_siteHealthTest( $tests ) { + $tests['direct']['cau_disabled'] = array( 'label' => __( 'Companion Auto Update', 'companion-auto-update' ), 'test' => 'cau_disabled_test' ); + return $tests; +} +add_filter( 'site_status_tests', 'cau_add_siteHealthTest' ); + +function cau_disabled_test() { + + $result = array( + 'label' => __( 'Auto updating is enabled', 'companion-auto-update' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( '

%s

', __( "Automatic updating isn't disabled on this site.", 'companion-auto-update' ) ), + 'actions' => '', + 'test' => 'cau_disabled', + ); + + if ( checkAutomaticUpdaterDisabled() OR !has_filter( 'wp_version_check', 'wp_version_check' ) ) { + $result['status'] = 'critical'; + $result['label'] = __( 'Auto updating is disabled', 'companion-auto-update' ); + $result['description'] = __( 'Automatic updating is disabled on this site by either WordPress, another plugin or your webhost.', 'companion-auto-update' ); + $result['description'] .= ' '.__( 'For more information about this error check the status page.', 'companion-auto-update' ); + $result['actions'] .= sprintf( '

%s', esc_url( cau_url( 'status' ) ), __( 'Check the status page', 'companion-auto-update' ) ); + } + + $result['actions'] .= cau_siteHealthSignature(); + + return $result; +} + +// Check for version control +function cau_test_is_vcs_checkout( $context ) { + + $context_dirs = array( ABSPATH ); + $vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' ); + $check_dirs = array(); + $result = array(); + + foreach ( $context_dirs as $context_dir ) { + // Walk up from $context_dir to the root. + do { + $check_dirs[] = $context_dir; + + // Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here. + if ( $context_dir == dirname( $context_dir ) ) + break; + + // Continue one level at a time. + } while ( $context_dir = dirname( $context_dir ) ); + } + + $check_dirs = array_unique( $check_dirs ); + + // Search all directories we've found for evidence of version control. + foreach ( $vcs_dirs as $vcs_dir ) { + foreach ( $check_dirs as $check_dir ) { + if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) { + break 2; + } + } + } + + if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, $context ) ) { + $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s), but the %s filter is allowing updates' , 'companion-auto-update' ), "$check_dir", "automatic_updates_is_vcs_checkout" ); + $result['icon'] = 'warning'; + $result['status'] = 'info'; + } else if ( $checkout ) { + $result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s)' , 'companion-auto-update' ), "$check_dir", "$vcs_dir" ); + $result['icon'] = 'no'; + $result['status'] = 'disabled'; + } else { + $result['description'] = __( 'No issues detected' , 'companion-auto-update' ); + $result['icon'] = 'yes-alt'; + $result['status'] = 'enabled'; + } + + return $result; +} + +// Check if plugins need to be delayed +function cau_check_delayed() { + if( cau_get_db_value( 'update_delay' ) == 'on' ) { + cau_hold_updates(); + cau_unhold_updates(); + } else { + cau_unhold_all_updates(); + } +} + +// List of all delayed plugins +function cau_delayed_updates() { + + global $wpdb; + $plugin_list = array(); + $updateLog = $wpdb->prefix."update_log"; + $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) ); + foreach ( $put_on_hold as $plugin ) { + array_push( $plugin_list, $plugin->slug ); + } + return $plugin_list; + +} + +// List of all delayed plugins for the update function +function cau_delayed_updates__formated() { + + $plugin_list = array(); + foreach ( cau_delayed_updates() as $plugin ) { + $explosion = explode( '/', $plugin ); + $short_slug = array_shift( $explosion ); + array_push( $plugin_list, $short_slug ); + } + return $plugin_list; + +} + +// Add "put on hold" timestamp to the database if it hasn't been set yet +function cau_hold_updates() { + + if ( !function_exists( 'get_plugin_updates' ) ) require_once ABSPATH . 'wp-admin/includes/update.php'; + $plugins = get_plugin_updates(); + + if ( !empty( $plugins ) ) { + $list = array(); + foreach ( (array)$plugins as $plugin_file => $plugin_data ) { + if( !in_array( $plugin_file, cau_delayed_updates() ) ) { + global $wpdb; + $updateLog = "{$wpdb->prefix}update_log"; + $wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET put_on_hold = '%s' WHERE slug = '%s'", strtotime( "now" ), $plugin_file ) ); + } + } + } +} + +// Remove plugins from "put on hold" after x days +function cau_unhold_updates() { + + + global $wpdb; + + $after_x_days = ( cau_get_db_value( 'update_delay_days' ) != '' ) ? cau_get_db_value( 'update_delay_days' ) : '2'; + $today = strtotime( "now" ); + $updateLog = "{$wpdb->prefix}update_log"; + $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) ); + + foreach ( $put_on_hold as $plugin ) { + + $plugin_file = $plugin->slug; + $put_on_hold_date = $plugin->put_on_hold; + $remove_after = strtotime( '+'.$after_x_days.' days', $put_on_hold_date ); + + if( $remove_after <= $today ) { + $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) ); + } + + } + +} + +// Remove all plugins from "put on hold" if option is disabled +function cau_unhold_all_updates() { + global $wpdb; + $updateLog = "{$wpdb->prefix}update_log"; + $put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) ); + foreach ( $put_on_hold as $plugin ) { + $plugin_file = $plugin->slug; + $wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/companion-auto-update.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/companion-auto-update.php new file mode 100644 index 00000000..f617f83c --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/companion-auto-update.php @@ -0,0 +1,420 @@ +get_col( "SELECT blog_id FROM $wpdb->blogs" ); + foreach ( $blog_ids as $blog_id ) { + switch_to_blog( $blog_id ); + cau_database_creation(); + restore_current_blog(); + } + } else { + cau_database_creation(); + } + + if (! wp_next_scheduled ( 'cau_set_schedule_mail' )) wp_schedule_event( time(), 'daily', 'cau_set_schedule_mail'); // Set schedule for basic notifcations + if (! wp_next_scheduled ( 'cau_custom_hooks_plugins' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_plugins'); // Run custom hooks on plugin updates + if (! wp_next_scheduled ( 'cau_custom_hooks_themes' )) wp_schedule_event( time(), 'daily', 'cau_custom_hooks_themes'); // Run custom hooks on theme updates + if (! wp_next_scheduled ( 'cau_log_updater' )) wp_schedule_event( ( time() - 1800 ), 'daily', 'cau_log_updater'); // Keep the log up to date + if (! wp_next_scheduled ( 'cau_outdated_notifier' )) wp_schedule_event( time(), 'daily', 'cau_outdated_notifier'); // Set schedule for basic notifcations +} + +add_action( 'cau_set_schedule_mail', 'cau_check_updates_mail' ); +add_action( 'cau_outdated_notifier', 'cau_outdated_notifier_mail' ); +add_action( 'wp_update_plugins', 'cau_run_custom_hooks_p' ); +add_action( 'wp_update_themes', 'cau_run_custom_hooks_t' ); +add_action( 'wp_version_check', 'cau_run_custom_hooks_c' ); + +// Hourly event to keep the log up to date +function cau_keep_log_uptodate() { + cau_savePluginInformation(); // Check for new plugins and themes + cau_check_delayed(); // Check for plugin delays +} +add_action( 'cau_log_updater', 'cau_keep_log_uptodate' ); + +// Redirect to welcome screen on activation of plugin +function cau_pluginActivateWelcome() { + add_option( 'cau_redirectToWelcomeScreen', true ); +} +register_activation_hook(__FILE__, 'cau_pluginActivateWelcome'); + +// Redirect to welcome screen on activation of plugin +function cau_pluginRedirectWelcomeScreen() { + if ( get_option( 'cau_redirectToWelcomeScreen', false ) ) { + delete_option( 'cau_redirectToWelcomeScreen' ); + if( !isset( $_GET['activate-multi'] ) ) { + wp_redirect( admin_url( cau_menloc().'?page=cau-settings&welcome=1' ) ); + } + } +} +add_action( 'admin_init', 'cau_pluginRedirectWelcomeScreen' ); + +// Donate url +function cau_donateUrl() { + return 'https://www.paypal.me/dakel/10/'; +} + +// Database version +function cau_db_version() { + return '3.8.3'; +} + +function cau_database_creation() { + + global $wpdb; + + // Plugin db info + $cau_db_version = cau_db_version(); + $autoupdates = $wpdb->prefix."auto_updates"; + $updateLog = $wpdb->prefix."update_log"; + + // WordPress db info + $charset_collate = $wpdb->get_charset_collate(); + + // DB table creation queries + $sql = "CREATE TABLE $autoupdates ( id INT(9) NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, onoroff TEXT NOT NULL, UNIQUE KEY id (id) ) $charset_collate;"; + $sql2 = "CREATE TABLE $updateLog ( id INT(9) NOT NULL AUTO_INCREMENT, slug VARCHAR(255) NOT NULL, oldVersion VARCHAR(10) NOT NULL, newVersion VARCHAR(10) NOT NULL, method VARCHAR(10) NOT NULL, put_on_hold VARCHAR(100) DEFAULT '0', UNIQUE KEY id (id) ) $charset_collate;"; + + // Create DB tables + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + dbDelta( $sql ); + dbDelta( $sql2 ); + + // Database version + add_option( "cau_db_version", "$cau_db_version" ); + + // Insert data + cau_install_data(); +} + +// Check if database table exists before creating +function cau_check_if_exists( $whattocheck, $id = 'name', $db_table = 'auto_updates' ) { + + global $wpdb; + + $table_name = $wpdb->prefix.$db_table; + $rows = $wpdb->get_col( "SELECT COUNT(*) as num_rows FROM {$table_name} WHERE {$id} = '{$whattocheck}'" ); + $check = $rows[0]; + + return ( $check > 0 ) ? true : false; + +} + +// Insert date into database +function cau_install_data() { + + global $wpdb; + + $table_name = $wpdb->prefix . "auto_updates"; + $toemail = get_option('admin_email'); + + // Update configs + if( !cau_check_if_exists( 'plugins' ) ) $wpdb->insert( $table_name, array( 'name' => 'plugins', 'onoroff' => 'on' ) ); + if( !cau_check_if_exists( 'themes' ) ) $wpdb->insert( $table_name, array( 'name' => 'themes', 'onoroff' => 'on' ) ); + if( !cau_check_if_exists( 'minor' ) ) $wpdb->insert( $table_name, array( 'name' => 'minor', 'onoroff' => 'on' ) ); + if( !cau_check_if_exists( 'major' ) ) $wpdb->insert( $table_name, array( 'name' => 'major', 'onoroff' => '' ) ); + + // Email configs + if( !cau_check_if_exists( 'email' ) ) $wpdb->insert( $table_name, array( 'name' => 'email', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'send' ) ) $wpdb->insert( $table_name, array( 'name' => 'send', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'sendupdate' ) ) $wpdb->insert( $table_name, array( 'name' => 'sendupdate', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'sendoutdated' ) ) $wpdb->insert( $table_name, array( 'name' => 'sendoutdated', 'onoroff' => '' ) ); + + // Advanced + if( !cau_check_if_exists( 'notUpdateList' ) ) $wpdb->insert( $table_name, array( 'name' => 'notUpdateList', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'translations' ) ) $wpdb->insert( $table_name, array( 'name' => 'translations', 'onoroff' => 'on' ) ); + if( !cau_check_if_exists( 'wpemails' ) ) $wpdb->insert( $table_name, array( 'name' => 'wpemails', 'onoroff' => 'on' ) ); + if( !cau_check_if_exists( 'notUpdateListTh' ) ) $wpdb->insert( $table_name, array( 'name' => 'notUpdateListTh', 'onoroff' => '' ) ); + + // Stuff + if( !cau_check_if_exists( 'html_or_text' ) ) $wpdb->insert( $table_name, array( 'name' => 'html_or_text', 'onoroff' => 'html' ) ); + if( !cau_check_if_exists( 'dbupdateemails' ) ) $wpdb->insert( $table_name, array( 'name' => 'dbupdateemails', 'onoroff' => '' ) ); + + // Advanced + if( !cau_check_if_exists( 'allow_administrator' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_administrator', 'onoroff' => 'on' ) ); + if( !cau_check_if_exists( 'allow_editor' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_editor', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'allow_author' ) ) $wpdb->insert( $table_name, array( 'name' => 'allow_author', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'ignore_seo' ) ) $wpdb->insert( $table_name, array( 'name' => 'ignore_seo', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'ignore_cron' ) ) $wpdb->insert( $table_name, array( 'name' => 'ignore_cron', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'advanced_info_emails' ) ) $wpdb->insert( $table_name, array( 'name' => 'advanced_info_emails', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'update_delay' ) ) $wpdb->insert( $table_name, array( 'name' => 'update_delay', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'update_delay_days' ) ) $wpdb->insert( $table_name, array( 'name' => 'update_delay_days', 'onoroff' => '' ) ); + if( !cau_check_if_exists( 'plugin_links_emails' ) ) $wpdb->insert( $table_name, array( 'name' => 'plugin_links_emails', 'onoroff' => '' ) ); + +} +register_activation_hook( __FILE__, 'cau_install' ); + +// Clear everything on deactivation +function cau_remove() { + + // Delete tables + global $wpdb; + $autoupdates = $wpdb->prefix."auto_updates"; + $updateLog = $wpdb->prefix."update_log"; + $wpdb->query( "DROP TABLE IF EXISTS $autoupdates" ); + $wpdb->query( "DROP TABLE IF EXISTS $updateLog" ); + + // Clear schedules + wp_clear_scheduled_hook( 'cau_set_schedule_mail' ); + wp_clear_scheduled_hook( 'cau_custom_hooks_plugins' ); + wp_clear_scheduled_hook( 'cau_custom_hooks_themes' ); + wp_clear_scheduled_hook( 'cau_log_updater' ); + + // Restore WordPress 5.5 default update functionality + add_filter( 'plugins_auto_update_enabled', '__return_true' ); + add_filter( 'themes_auto_update_enabled', '__return_true' ); + add_filter( 'auto_plugin_update_send_email', '__return_true' ); + add_filter( 'auto_theme_update_send_email', '__return_true' ); + +} +register_deactivation_hook( __FILE__, 'cau_remove' ); + +// Update +function cau_update_db_check() { + + $cau_db_version = cau_db_version(); + + if ( get_site_option( 'cau_db_version' ) != $cau_db_version ) { + + cau_database_creation(); + + // In 3.7.2 we've added $wpdb->get_charset_collate + if( get_site_option( 'cau_db_version' ) < '3.7.2' ) { + + global $wpdb; + $autoupdates = $wpdb->prefix."auto_updates"; + $updateLog = $wpdb->prefix."update_log"; + $db_charset = constant( 'DB_CHARSET' ); + $wpdb->query( "ALTER TABLE $autoupdates CONVERT TO CHARACTER SET $db_charset" ); + $wpdb->query( "ALTER TABLE $updateLog CONVERT TO CHARACTER SET $db_charset" ); + } + update_option( "cau_db_version", $cau_db_version ); + + } + +} + +add_action( 'upgrader_process_complete', 'cau_update_db_check' ); + +// Manual update +function cau_manual_update() { + cau_update_db_check(); +} + +// Load custom functions +require_once( plugin_dir_path( __FILE__ ) . 'cau_functions.php' ); + +// Add plugin to menu +function register_cau_menu_page() { + if( cau_allowed_user_rights() ) add_submenu_page( cau_menloc() , __( 'Auto Updater', 'companion-auto-update' ), __( 'Auto Updater', 'companion-auto-update' ), 'manage_options', 'cau-settings', 'cau_frontend' ); +} +add_action( 'admin_menu', 'register_cau_menu_page' ); + +// Settings page +function cau_frontend() { + + echo "

+

".__( 'Companion Auto Update', 'companion-auto-update' )."

+
"; + + // Make sure the correct timezone is used + date_default_timezone_set( cau_get_proper_timezone() ); + + // Allow only access to these pages + $allowedPages = array( + 'dashboard' => __( 'Dashboard' ), + 'pluginlist' => __( 'Update filter', 'companion-auto-update' ), + 'log' => __( 'Update log', 'companion-auto-update' ), + 'status' => __( 'Status', 'companion-auto-update' ), + ); + + // Show subtabs + echo ""; + + // Show page content + if( !isset( $_GET['tab'] ) ) { + $requestedPage = 'dashboard'; + echo ""; // Set active tab class + } else { + $requestedPage = sanitize_key( $_GET['tab'] ); + } + + if( array_key_exists( $requestedPage, $allowedPages ) ) { + require_once( plugin_dir_path( __FILE__ ) . 'admin/'.$requestedPage.'.php' ); + } else { + wp_die( 'You\'re not allowed to view '.$requestedPage.'.' ); + } + + echo '
'; + +} + +// Add a widget to the dashboard. +function cau_add_widget() { + if ( cau_allowed_user_rights() ) wp_add_dashboard_widget( 'cau-update-log', __('Update log', 'companion-auto-update'), 'cau_widget' ); +} +add_action( 'wp_dashboard_setup', 'cau_add_widget' ); + +// Widget content +function cau_widget() { + echo ''; + echo '

'.__('Below are the last 7 updates ran on this site. Includes plugins and themes, both automatically updated and manually updated.', 'companion-auto-update').'

'; + cau_fetch_log( '7' ); + echo '

'.__( 'View full changelog', 'companion-auto-update' ).' | '.__( 'Settings' ).'

'; +} + +// Load admin styles +function load_cau_global_styles( $hook ) { + wp_enqueue_style( 'cau_admin_styles', plugins_url( 'backend/style.css' , __FILE__ ) ); // Plugin scripts + wp_enqueue_style( 'cau_warning_styles', plugins_url( 'backend/warningbar.css' , __FILE__ ) ); // Check for issues +} +add_action( 'admin_enqueue_scripts', 'load_cau_global_styles', 99 ); + +// Load admin styles +function load_cau_page_styles( $hook ) { + + // Only load on plugins' pages + if( $hook != 'tools_page_cau-settings' && $hook != 'index_page_cau-settings' ) return; + + // WordPress scripts we need + wp_enqueue_style( 'thickbox' ); + wp_enqueue_script( 'thickbox' ); + wp_enqueue_script( 'plugin-install' ); +} +add_action( 'admin_enqueue_scripts', 'load_cau_page_styles', 100 ); + +// Send e-mails +require_once( plugin_dir_path( __FILE__ ) . 'cau_emails.php' ); + +// Add settings link on plugin page +function cau_settings_link( $links ) { + + $settings_link = ''.__( 'Settings' ).''; + $settings_link2 = ''.__( 'Help us translate', 'companion-auto-update' ).''; + $settings_link3 = ''.__( 'Donate to help development', 'companion-auto-update' ).''; + + array_unshift( $links, $settings_link2 ); + array_unshift( $links, $settings_link3 ); + if( cau_allowed_user_rights() ) array_unshift( $links, $settings_link ); + + return $links; + +} +$plugin = plugin_basename(__FILE__); +add_filter( "plugin_action_links_$plugin", "cau_settings_link" ); + +// Auto Update Class +class CAU_auto_update { + + // Enable Update filters + public function __construct() { + add_action( 'plugins_loaded', array( &$this, 'CAU_auto_update_filters' ), 1 ); + } + + public function CAU_auto_update_filters() { + + global $wpdb; + $table_name = $wpdb->prefix . "auto_updates"; + + // Disable WP emails + add_filter( 'auto_plugin_update_send_email', '__return_false' ); // Plugin updates + add_filter( 'auto_theme_update_send_email', '__return_false' ); // Theme updates + + // Enable for major updates + $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'major'"); + foreach ( $configs as $config ) { + if( $config->onoroff == 'on' ) add_filter( 'allow_major_auto_core_updates', '__return_true', 1 ); // Turn on + else add_filter( 'allow_major_auto_core_updates', '__return_false', 1 ); // Turn off + } + + // Enable for minor updates + $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'minor'"); + foreach ( $configs as $config ) { + if( $config->onoroff == 'on' ) add_filter( 'allow_minor_auto_core_updates', '__return_true', 1 ); // Turn on + else add_filter( 'allow_minor_auto_core_updates', '__return_false', 1 ); // Turn off + } + + // Enable for plugins + $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'plugins'"); + foreach ( $configs as $config ) { + if( $config->onoroff == 'on' ) add_filter( 'auto_update_plugin', 'cau_dontUpdatePlugins', 10, 2 ); // Turn on + else add_filter( 'auto_update_plugin', '__return_false', 1 ); // Turn off + } + + // Enable for themes + $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'themes'"); + foreach ( $configs as $config ) { + if( $config->onoroff == 'on' ) add_filter( 'auto_update_theme', '__return_true' ); // Turn on + else add_filter( 'auto_update_theme', '__return_false', 1 ); // Turn off + } + + // Enable for translation files + $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'translations'"); + foreach ( $configs as $config ) { + if( $config->onoroff == 'on' ) add_filter( 'auto_update_translation', '__return_true', 1 ); // Turn on + else add_filter( 'auto_update_translation', '__return_false', 1 ); // Turn off + } + + // WP Email Config + $configs = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = 'wpemails'"); + foreach ( $configs as $config ) { + if( $config->onoroff == 'on' ) add_filter( 'auto_core_update_send_email', '__return_true', 1 ); // Turn on + else add_filter( 'auto_core_update_send_email', '__return_false', 1 ); // Turn off + } + + } + +} +new CAU_auto_update(); + +// Check for issues +function cau_checkForIssues( $admin_bar ) { + if( cau_pluginHasIssues() && is_admin() && cau_pluginIssueLevels() == 'high' ) { + $admin_bar->add_menu( array( + 'id' => 'cau-has-issues', + 'title' => ''.cau_pluginIssueCount().'', + 'href' => cau_url( 'status' ), + 'meta' => array( + 'target' => '_self', + 'title' => __( 'Companion Auto Update ran into a critical error. View the status log for more info.', 'companion-auto-update' ), + ), + )); + } +} +add_action( 'admin_bar_menu', 'cau_checkForIssues', 150 ); diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/index.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/index.php new file mode 100644 index 00000000..ef5b27f6 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/index.php @@ -0,0 +1,2 @@ +\n" +"Language-Team: LANGUAGE \n" + +#: companion_portfolio.php:96 +msgid "Auto Updater" +msgstr "" + +#: companion_portfolio.php:122 +msgid "Auto update plugins?" +msgstr "" + +#: companion_portfolio.php:122 +msgid "Auto update themes?" +msgstr "" + +#: companion_portfolio.php:122 +msgid "Auto update minor core updates?" +msgstr "" + +#: companion_portfolio.php:122 +msgid "Auto update major core updates?" +msgstr "" + +#: companion_portfolio.php:125 +msgid "Settings saved" +msgstr "" + +#: companion_portfolio.php:125 +msgid "Settings" +msgstr "" + +#. Plugin Name of the plugin/theme +msgid "Companion Auto Update" +msgstr "" + +#. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-# +#. Plugin URI of the plugin/theme +#. #-#-#-#-# plugin.pot (Companion Auto Update 1.0) #-#-#-#-# +#. Author URI of the plugin/theme +msgid "https://qreative-web.com" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"This plugin auto updates all plugins, all themes and the wordpress core." +msgstr "" + +#. Author of the plugin/theme +msgid "Qreative-Web" +msgstr "" \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/companion-auto-update/languages/index.php b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/languages/index.php new file mode 100644 index 00000000..81a4f1bd --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/companion-auto-update/languages/index.php @@ -0,0 +1,4 @@ + Auto Updater + +== Frequently Asked Questions == + += Check our website for the FAQ = + +[https://codeermeneer.nl/documentation/auto-update/faq-auto-updater/](https://codeermeneer.nl/documentation/auto-update/faq-auto-updater/) + += What features can I expect to see in the future? = + +Your feedback is what made this plugin what is and what it’ll become so keep the feedback coming! To see what features you've suggested and what we're working on [read our blogpost here](https://codeermeneer.nl/blog/companion-auto-update-and-its-future/) + += What's the difference between WordPress 5.5 and this plugin? = + +WordPress 5.5 was released recently and it packs tons of new features. One of those features is auto-updates for plugins and themes. Something Companion Auto Update does too. +So obviously, some of you wondered what the difference would be between the default WordPress method and the one offered by Companion Auto Update and I figured I’d quickly write a blog about it, explaining the differences. + +[You can read this blogpost here](https://codeermeneer.nl/blog/wordpress-5-5-versus-companion-auto-update/) + + +== Screenshots == + +1. Full control over what to update and when to recieve notifications +2. Disable auto-updating for certain plugins and/or themes +3. Advanced scheduling options for updating and notifcations +4. Keep track of updates with the update log + +== Changelog == + += 3.8.7.1 (September 28, 2022) = +* Tweak: Extended function_exists check with get_plugins() for the fatal error when trying to send update emails + += 3.8.7 (September 12, 2022) = +* Fix: Fatal error when trying to send update emails + += 3.8.6 (August 11, 2022) = +* Tweak: Code optimization for better performance + += 3.8.5 (March 17, 2022) = +* New: Added more checks on the status page and added an explanation to some of them. +* New: Added an list of delayed updates on the status page to help with troubleshooting. +* Tweak: Made some improvements to the update delay feature. +* Tweak: Added a notice to explain that update delay does not work with WordPress update currently. +* Tweak: Improved code on the status page to be more reliable. + += 3.8.4 (February 2, 2022) = +* Tweak: Fixed a few styling errors with WP5.9 + += 3.8.3 (December 9, 2021) = +* New: Plugin update e-mails now have an option to link to a few important pages +* Fix: Error: Undefined index: dbupdateemails +* Fix: Error: A non-numeric value encountered + += 3.8.2 (July 1, 2021) = +* Fix: Error: Call to undefined function get_plugin_updates() + += 3.8.1 (June 4, 2021) = +* New: Be notified when we need your help updating to a new database version [Feature Request](https://wordpress.org/support/topic/feature-request-839/) +* Tweak: Made some under the hood performance improvements + += 3.8.0 (January 14, 2021) = +* New: Better handling of plugins with an unknown WP version +* New: More intervals for notifications +* Fix: Call to undefined function errors + += 3.7.1.1 (November 2, 2020) = +* Fix: Type in wp_next_scheduled + += 3.7.1 (October 30, 2020) = +* Fix: PHP Warning: strtotime() expects parameter 2 to be integer, string given + += 3.7 (September 8, 2020) = +* New: Delay updates with an x number of days +* New: Be notified of plugins that have not been tested with the latest 3 major releases of WordPress. +* New: Choose to see more info in the emails (like the time at which the update happened) +* Fix: "Contact for support" button will work again +* Fix: Fixed a few PHP errors +* Tweak: Made improvements to the "Fix it" button for the "All automatic updates are disabled" error. +* Tweak: You can now choose to ignore the "Search Engine Visibility" and "Cronjobs" warnings +* Tweak: Reports on the Site Health page will only show a summary and point to the status page for more information and possible fixes +* Tweak: Removed cronjob check and Search Engine Visibility check from site health +* Tweak: E-mails are now fully translatable +* Tweak: Renamed Core notifications to WordPress notifications +* Tweak: WordPress plugin and theme update notifications are now disabled + +Also: Check out what features we're working on at [our blogpost](https://codeermeneer.nl/blog/companion-auto-update-and-its-future/) + += 3.6 (August 12, 2020) = +* New: Added an "after core update" hook [More info](https://codeermeneer.nl/documentation/codex-auto-updater/) +* New: Select which userroles can access settings. (Defaults to only administrators) +* Tweak: Added Theme and Core update method the log +* Tweak: Few WordPress 5.5 improvements + += 3.5.5 (August 5, 2020) = +* Fix: Added better multisite support +* Tweak: We've added a bunch more checks to the status page and you can now see more passed checks. +* Support for WordPress 5.5 + += 3.5.4.1 (June 20, 2020) = +* Fix: Sometimes the hour settings for intervals wouldn't show up + += 3.5.4 (June 19, 2020) = +* New: See translations in the update log +* New: We've added a few checks to WordPress' Site Health page +* Fix: Error with Companion Auto Update Database Update +* Fix: Schedule interval duplicates + += 3.5.3 (June 5, 2020) = +* New: We're working on a better update log. You should see the Update method (Manual/Automatic) in the log now. (Only works for Plugins right now) +Please report any issues with this feature over at our sticky post: [Problems with the Update method in the new update log?](https://wordpress.org/support/topic/problems-with-the-update-method-in-the-new-update-log/) +* Fix: Not able to see checks in boxes (reverted back to before it all went wrong) +* Fix: Error date_default_timezone_set(): Timezone ID +00:00 is invalid +* Tweak: The status tab will no longer show turned-off settings as an error +* Tweak: Made some improvements to the "Update pending" emails, you can now see a list of all pending updates and go directly to the update page. + += 3.5.2 (April 1, 2020) = +* Fix: Not able to see checks in boxes + += 3.5.1 (March 25, 2020) = +* Tweak: You seem to like the new dashboard, we've fixed a few issues regarding the responsiveness of the design. We've also tweaked the icons to be a bit more transparant. +* Tweak: We've added the release notes link to Plain text emails +* Tweak: Fixed a few typos +* Tweak: Various minor security improvements + += 3.5.0 (March 5, 2020) = +* New: In version 3.4.6 we've changed to HTML emails rather than plain text, in this version you can opt to change it back to plain text emails +* Fix: We've 'fixed an issue where on occasion nothing would update +* Tweak: Made some improvements to the "Fix it" button for the AUTOMATIC_UPDATER_DISABLED error +* Tweak: We've changed the dashboard, moved both the settings page and de support page to the dashboard. Please let us know if you like this change or not. +* Bug: We've had to (temporarily) disable the theme filter because it was causing issues on some installations. We'll try to get it working again in a future update. + +[View full changelog](https://codeermeneer.nl/stuffs/auto-updater-changelog/) \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/CHANGELOG.md b/wp-content/upgrade-temp-backup/plugins/menu-icons/CHANGELOG.md new file mode 100644 index 00000000..521880a0 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/CHANGELOG.md @@ -0,0 +1,116 @@ +##### [Version 0.13.7](https://github.com/codeinwp/wp-menu-icons/compare/v0.13.6...v0.13.7) (2023-08-17) + +- Updated dependencies +- Fixed broken button layout issues in other languages + +##### [Version 0.13.6](https://github.com/codeinwp/wp-menu-icons/compare/v0.13.5...v0.13.6) (2023-07-07) + +- Updated composer dependencies to address warning in the widgets section + +##### [Version 0.13.5](https://github.com/codeinwp/wp-menu-icons/compare/v0.13.4...v0.13.5) (2023-03-30) + +- Updated Dependencies and WordPress core tested up to version 6.2 + +##### [Version 0.13.4](https://github.com/codeinwp/wp-menu-icons/compare/v0.13.3...v0.13.4) (2023-03-01) + +Update dependencies + +##### [Version 0.13.3](https://github.com/codeinwp/wp-menu-icons/compare/v0.13.2...v0.13.3) (2023-02-25) + +- Fix img width/height value, props @Htbaa +- Update dependencies + +##### [Version 0.13.2](https://github.com/codeinwp/wp-menu-icons/compare/v0.13.1...v0.13.2) (2022-11-24) + +* Fix - update dependencies + +##### [Version 0.13.1](https://github.com/codeinwp/wp-menu-icons/compare/v0.13.0...v0.13.1) (2022-11-04) + +Tested with the WordPress 6.1 version + +#### [Version 0.13.0](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.12...v0.13.0) (2022-08-23) + +* Fix Neve upsells showing up inconsistently on edge cases +* Fix inconsistency with Font Awesome 5 and adds compatibility with 6th version +* Fix compatibility with JupiterX +* Update dependencies + +##### [Version 0.12.12](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.11...v0.12.12) (2022-05-27) + +- Fix the style handler conflict issue which breaks the arrow icon of the submenus on some themes +- Fix dismiss dashboard notice issue on some edge cases +- Fix compatibility with the Max Mega Menu plugin + +##### [Version 0.12.11](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.10...v0.12.11) (2022-03-16) + +Add font awesome 5 support +Enhance compatibility with Otter/Neve + +##### [Version 0.12.10](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.9...v0.12.10) (2022-02-07) + +- [Fix] Add support for alt attribute for SVG icons +- Tested up with WordPress 5.9 + +##### [Version 0.12.9](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.8...v0.12.9) (2021-08-04) + +* Tested compatibility with WordPress 5.8 + +##### [Version 0.12.8](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.7...v0.12.8) (2021-05-12) + +* Fix issue when the image is not accessible to fetch the width/height metadata. + +##### [Version 0.12.7](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.6...v0.12.7) (2021-05-07) + +Fix PHP fatal error when uploading SVG with the image uploader + +##### [Version 0.12.6](https://github.com/codeinwp/wp-menu-icons/compare/v0.12.5...v0.12.6) (2021-05-05) + +* Adds explicit width/height to icons to prevent layout shifts issues + +### v0.12.5 - 2020-08-18 + **Changes:** + + ### v0.12.4 - 2020-07-13 + **Changes:** + * Fix Font Awesome not loading + + ### v0.12.3 - 2020-07-13 + **Changes:** + * Fixed Menu Icons in Block Editor not working +* Fixed CWP links. + + ### v0.12.2 - 2019-11-15 + **Changes:** + + ### v0.12.1 - 2019-11-15 + **Changes:** + * Improve legacy compatibility + + ### v0.12.0 - 2019-11-15 + **Changes:** + * Fix issues with WordPress 5.3. + + ### v0.11.5 - 2019-05-23 + **Changes:** + * Sync composer dependencies with the latest version + + ### v0.11.4 - 2018-12-10 + **Changes:** + * fix issue with composer libraries. + + ### v0.11.3 - 2018-12-10 + **Changes:** + * Tested with WP 5.0 + + ### v0.11.2 - 2018-03-05 + **Changes:** + * Improve popup sidebar layout. + + ### v0.11.1 - 2018-02-24 + **Changes:** + * Add recommendation boxes in the menu icon popup. + + ### v0.11.0 - 2018-01-05 + **Changes:** + * Change ownership to ThemeIsle. +* Improves compatibility with various ThemeIsle products. diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/CONTRIBUTING.md b/wp-content/upgrade-temp-backup/plugins/menu-icons/CONTRIBUTING.md new file mode 100644 index 00000000..36b5b5b1 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/CONTRIBUTING.md @@ -0,0 +1,13 @@ +## Releasing + +This repository uses conventional [changelog commit](https://github.com/Codeinwp/conventional-changelog-simple-preset) messages to trigger release + +How to release a new version: + +- Clone the master branch +- Do your changes +- Send a PR to master and merge it using the following subject message + - `release: ` - for patch release + - `release(minor): ` - for minor release + - `release(major): ` - for major release + The release notes will inherit the body of the commit message which triggered the release. For more details check the [simple-preset](https://github.com/Codeinwp/conventional-changelog-simple-preset) that we use. \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/LICENSE b/wp-content/upgrade-temp-backup/plugins/menu-icons/LICENSE new file mode 100644 index 00000000..d7f10513 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + 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. + + {signature of Ty Coon}, 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. diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/admin.css b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/admin.css new file mode 100644 index 00000000..288acd71 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/admin.css @@ -0,0 +1,246 @@ +.menu-icons-wrap { + margin-top: 5px; + margin-bottom: 5px; +} + +.menu-icons-wrap p { + min-height: 2.2em; + margin-bottom: 0; +} + +.menu-icons-wrap p a, +.menu-icons-wrap p label { + display: inline-block; + height: 100%; + line-height: 2.2em; + vertical-align: middle; +} + +.menu-icons-wrap a { + text-decoration: none; + cursor: pointer; +} + +.menu-icons-wrap .submitdelete { + display: inline-block; + float: none; + height: 100%; + margin: 0; + padding: 0; + line-height: 2.2em; +} + +.menu-icons-wrap .hidden { + display: none; +} + +.menu-icons-wrap ._icon { + width: auto; + height: auto; + margin: -0.1em 0.2em 0 0.2em; + color: #666; + font-size: 1.9em; + vertical-align: middle; +} + +.menu-icons-wrap img._icon { + max-width: 24px; +} + +.menu-icons-wrap a._select:focus ._icon, +.menu-icons-wrap a._select:hover ._icon { + color: #101010; +} + +.mi-preview.menu-item { + min-height: 0; + font-size: 1.2em; +} + +.mi-preview.menu-item a { + text-decoration: none; +} + +.mi-preview.menu-item a > * { + display: inline-block; + height: 100%; + line-height: 100%; + vertical-align: middle; +} + +.mi-preview.menu-item ._icon { + margin-right: 0.25em; +} + +.rtl .mi-preview.menu-item ._icon { + margin-right: 0; +} + +.media-sidebar .mi-settings .setting input[type="number"], +.menu-icons-settings input[type="number"] { + float: none; + width: auto; + max-width: 5em; +} + +.media-sidebar .mi-settings .setting input, +.media-sidebar .mi-settings span.description { + float: none; +} + +/** Settings Meta Box **/ +.menu-icons-settings ._field { + padding: 0.5em 0; +} + +.menu-icons-settings ._field ._main { + display: block; + margin-bottom: 0.25em; + font-weight: bold; +} + +#menu-settings-column .menu-icons-settings .inside { + margin-top: 0; +} + +.menu-icons-settings .taxonomydiv .tabs-panel { + max-height: none; + margin-bottom: 0.75em; + padding-top: 0.3em; + padding-bottom: 0.4em; +} + +.js .menu-icons-settings .taxonomydiv .tabs-panel { + margin-bottom: 0; +} + +.menu-icons-settings h4 { + margin: 0; +} + +.menu-icons-settings ._menu span.description { + margin-left: 0.5em; +} + +.menu-icons-settings ._extensions ul { + margin-top: 0.75em; + padding-left: 1.5em; + list-style: disc; +} + +.menu-icons-settings ._extensions ul a { + text-decoration: none; +} + +.menu-icons-settings .spinner { + float: none; + margin: 0 5px 0 0; + vertical-align: middle; +} + +.attachment .svg-icon img { + max-width: 100%; +} + +.nv-upgrade-notice { + width: 90%; + margin-top: 0; + padding: 15px; +} + +#menu-icons-sidebar div.new-card { + width: auto; + min-width: initial; + max-width: initial; + margin: 10px auto; +} + +.menu-icons-subscribe { + padding: 15px; +} + +.menu-icons-submit-mail { + width: auto; +} + +#success { + display: none; +} + +#failure { + display: none; +} + +.attachments-browser.iconpicker-fonts-browser .media-toolbar { + width: 62%; +} + +.attachments-browser.iconpicker-fonts-browser .attachments.iconpicker-items { + width: 64%; +} + +.attachments-browser.iconpicker-fonts-browser .media-sidebar { + width: 32%; +} + +.nv-upgrade-notice { + background: #FFFFFF; + border: 1px solid #E1E1E1; + box-sizing: border-box; + padding: 20px; + display: flex; + flex-wrap: wrap; +} + +.nv-upgrade-notice .menu-icon-notice-popup-img { + width: 115px; + height: 100px; + background-color: #f1f1f1; + margin-right: 20px; + margin-bottom: 20px; +} + +.nv-upgrade-notice .menu-icon-notice-popup-img img{ + width: 100%; + height: 100%; + object-fit: cover; +} + +.nv-upgrade-notice .menu-icon-notice-popup { + flex: 1; +} + +.nv-upgrade-notice .menu-icon-notice-popup h4{ + padding: 0; + margin: 0 0 8px; + font-weight: 590; + font-size: 14px; + line-height: 1.2; + color: #000000; + display: block; + width: 100%; +} + +.nv-upgrade-notice .menu-icon-notice-popup p { + font-size: 13px; + line-height: 1.2; + color: #000000; + margin: 0 0 16px; + display: block; + padding: 0; +} + +.nv-upgrade-notice .menu-icon-notice-popup .button { + width: auto; + height: 30px; + background: #0071AE; + border-radius: 4px; + padding: 5px 12px; + font-size: 13px; + line-height: 1.5; + color: #fff; +} + +.nv-upgrade-notice .menu-icon-notice-popup .button:hover { + color: #fff; +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/admin.min.css b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/admin.min.css new file mode 100644 index 00000000..2d4fd049 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/admin.min.css @@ -0,0 +1 @@ +.menu-icons-wrap{margin-top:5px;margin-bottom:5px}.menu-icons-wrap p{min-height:2.2em;margin-bottom:0}.menu-icons-wrap p a,.menu-icons-wrap p label{display:inline-block;height:100%;line-height:2.2em;vertical-align:middle}.menu-icons-wrap a{text-decoration:none;cursor:pointer}.menu-icons-wrap .submitdelete{display:inline-block;float:none;height:100%;margin:0;padding:0;line-height:2.2em}.menu-icons-wrap .hidden{display:none}.menu-icons-wrap ._icon{width:auto;height:auto;margin:-.1em .2em 0 .2em;color:#666;font-size:1.9em;vertical-align:middle}.menu-icons-wrap img._icon{max-width:24px}.menu-icons-wrap a._select:focus ._icon,.menu-icons-wrap a._select:hover ._icon{color:#101010}.mi-preview.menu-item{min-height:0;font-size:1.2em}.mi-preview.menu-item a{text-decoration:none}.mi-preview.menu-item a>*{display:inline-block;height:100%;line-height:100%;vertical-align:middle}.mi-preview.menu-item ._icon{margin-right:.25em}.rtl .mi-preview.menu-item ._icon{margin-right:0}.media-sidebar .mi-settings .setting input[type=number],.menu-icons-settings input[type=number]{float:none;width:auto;max-width:5em}.media-sidebar .mi-settings .setting input,.media-sidebar .mi-settings span.description{float:none}.menu-icons-settings ._field{padding:.5em 0}.menu-icons-settings ._field ._main{display:block;margin-bottom:.25em;font-weight:700}#menu-settings-column .menu-icons-settings .inside{margin-top:0}.menu-icons-settings .taxonomydiv .tabs-panel{max-height:none;margin-bottom:.75em;padding-top:.3em;padding-bottom:.4em}.js .menu-icons-settings .taxonomydiv .tabs-panel{margin-bottom:0}.menu-icons-settings h4{margin:0}.menu-icons-settings ._menu span.description{margin-left:.5em}.menu-icons-settings ._extensions ul{margin-top:.75em;padding-left:1.5em;list-style:disc}.menu-icons-settings ._extensions ul a{text-decoration:none}.menu-icons-settings .spinner{float:none;margin:0 5px 0 0;vertical-align:middle}.attachment .svg-icon img{max-width:100%}.nv-upgrade-notice{width:90%;margin-top:0;padding:15px}#menu-icons-sidebar div.new-card{width:auto;min-width:initial;max-width:initial;margin:10px auto}.menu-icons-subscribe{padding:15px}.menu-icons-submit-mail{width:auto}#success{display:none}#failure{display:none}.attachments-browser.iconpicker-fonts-browser .media-toolbar{width:62%}.attachments-browser.iconpicker-fonts-browser .attachments.iconpicker-items{width:64%}.attachments-browser.iconpicker-fonts-browser .media-sidebar{width:32%}.nv-upgrade-notice{background:#fff;border:1px solid #e1e1e1;box-sizing:border-box;padding:20px;display:flex;flex-wrap:wrap}.nv-upgrade-notice .menu-icon-notice-popup-img{width:115px;height:100px;background-color:#f1f1f1;margin-right:20px;margin-bottom:20px}.nv-upgrade-notice .menu-icon-notice-popup-img img{width:100%;height:100%;object-fit:cover}.nv-upgrade-notice .menu-icon-notice-popup{flex:1}.nv-upgrade-notice .menu-icon-notice-popup h4{padding:0;margin:0 0 8px;font-weight:590;font-size:14px;line-height:1.2;color:#000;display:block;width:100%}.nv-upgrade-notice .menu-icon-notice-popup p{font-size:13px;line-height:1.2;color:#000;margin:0 0 16px;display:block;padding:0}.nv-upgrade-notice .menu-icon-notice-popup .button{width:auto;height:30px;background:#0071ae;border-radius:4px;padding:5px 12px;font-size:13px;line-height:1.5;color:#fff}.nv-upgrade-notice .menu-icon-notice-popup .button:hover{color:#fff} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/dashboard-notice.css b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/dashboard-notice.css new file mode 100644 index 00000000..7a937595 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/dashboard-notice.css @@ -0,0 +1,45 @@ +.menu-icon-dashboard-notice { + position: relative; + background: #FFFFFF; + border: 1px solid #E1E1E1; + box-sizing: border-box; + padding: 24px; + border-left: 4px solid #72AEE6; + margin: 0 0 30px; +} + +.menu-icon-dashboard-notice h2 { + padding: 0; + margin: 0 0 8px; + font-weight: bold; + font-size: 18px; + line-height: 1.2; + color: #000000; +} + +.menu-icon-dashboard-notice p { + font-size: 12px; + line-height: 1.2; + color: #000000; + display: block; + margin-bottom: 16px; +} + +.menu-icon-dashboard-notice .button { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding: 5px 12px; + background: #0071AE; + border-radius: 4px; + display: inline-block; + width: auto; + height: 30px; + color: #FFFFFF; + font-size: 13px; + line-height: 1.5; +} +.menu-icon-dashboard-notice .notice-dismiss { + text-decoration: none; +} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/dashboard-notice.min.css b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/dashboard-notice.min.css new file mode 100644 index 00000000..65ed114b --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/dashboard-notice.min.css @@ -0,0 +1 @@ +.menu-icon-dashboard-notice{position:relative;background:#fff;border:1px solid #e1e1e1;box-sizing:border-box;padding:24px;border-left:4px solid #72aee6;margin:0 0 30px}.menu-icon-dashboard-notice h2{padding:0;margin:0 0 8px;font-weight:700;font-size:18px;line-height:1.2;color:#000}.menu-icon-dashboard-notice p{font-size:12px;line-height:1.2;color:#000;display:block;margin-bottom:16px}.menu-icon-dashboard-notice .button{display:flex;flex-direction:row;justify-content:center;align-items:center;padding:5px 12px;background:#0071ae;border-radius:4px;display:inline-block;width:auto;height:30px;color:#fff;font-size:13px;line-height:1.5}.menu-icon-dashboard-notice .notice-dismiss{text-decoration:none} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/extra.css b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/extra.css new file mode 100644 index 00000000..ec8b2a60 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/extra.css @@ -0,0 +1,74 @@ +.menu-item i._mi, +.menu-item img._mi { + display: inline-block; + vertical-align: middle; +} + +.menu-item i._mi { + width: auto; + height: auto; + margin-top: -0.265em; + font-size: 1.2em; + line-height: 1; +} + +.menu-item i._before, +.rtl .menu-item i._after { + margin-right: 0.25em; +} + +.menu-item i._after, +.rtl .menu-item i._before { + margin-left: 0.25em; +} + +.menu-item img._before, +.rtl .menu-item img._after { + margin-right: 0.5em; +} + +.menu-item img._after, +.rtl .menu-item img._before { + margin-left: 0.5em; +} + +.menu-item ._svg { + width: 1em; +} + +.rtl .menu-item i._before { + margin-right: 0; +} + +.rtl .menu-item i._after { + margin-left: 0; +} + +.visuallyhidden { + overflow: hidden; + clip: rect(0 0 0 0); + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + border: 0; +} + +.menu-item i.elusive { + margin-top: -0.3em; +} + +/** + * Force the icons' styles + * + * Some themes -- notably 2014 -- has nasty rules that + * could override the icons' styles so we need to force them here. + */ +.dashicons-admin-site:before { + content: "\f319" !important; +} + +.dashicons-welcome-view-site:before { + content: "\f115" !important; +} diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/extra.min.css b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/extra.min.css new file mode 100644 index 00000000..7ff02d86 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/extra.min.css @@ -0,0 +1 @@ +.menu-item i._mi,.menu-item img._mi{display:inline-block;vertical-align:middle}.menu-item i._mi{width:auto;height:auto;margin-top:-.265em;font-size:1.2em;line-height:1}.menu-item i._before,.rtl .menu-item i._after{margin-right:.25em}.menu-item i._after,.rtl .menu-item i._before{margin-left:.25em}.menu-item img._before,.rtl .menu-item img._after{margin-right:.5em}.menu-item img._after,.rtl .menu-item img._before{margin-left:.5em}.menu-item ._svg{width:1em}.rtl .menu-item i._before{margin-right:0}.rtl .menu-item i._after{margin-left:0}.visuallyhidden{overflow:hidden;clip:rect(0 0 0 0);position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0}.menu-item i.elusive{margin-top:-.3em}.dashicons-admin-site:before{content:"\f319"!important}.dashicons-welcome-view-site:before{content:"\f115"!important} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/LICENSE.txt b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/LICENSE.txt new file mode 100644 index 00000000..f31bef92 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/LICENSE.txt @@ -0,0 +1,34 @@ +Font Awesome Free License +------------------------- + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license/free. + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) +In the Font Awesome Free download, the CC BY 4.0 license applies to all icons +packaged as SVG and JS file types. + +# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) +In the Font Awesome Free download, the SIL OFL license applies to all icons +packaged as web and desktop font files. + +# Code: MIT License (https://opensource.org/licenses/MIT) +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +# Attribution +Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +# Brand Icons +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/css/all.min.css b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/css/all.min.css new file mode 100644 index 00000000..b9a01fbb --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/css/all.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.1.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2022 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-duotone,.fa-light,.fa-regular,.fa-solid,.fa-thin,.fab,.fad,.fal,.far,.fas,.fat{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-a:before{content:"\41"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-anchor:before{content:"\f13d"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-anchor-lock:before{content:"\e4ad"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-ankh:before{content:"\f644"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-archway:before{content:"\f557"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-arrow-trend-down:before{content:"\e097"}.fa-arrow-trend-up:before{content:"\e098"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-arrows-spin:before{content:"\e4bb"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-asterisk:before{content:"\2a"}.fa-at:before{content:"\40"}.fa-atom:before{content:"\f5d2"}.fa-audio-description:before{content:"\f29e"}.fa-austral-sign:before{content:"\e0a9"}.fa-award:before{content:"\f559"}.fa-b:before{content:"\42"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-backward:before{content:"\f04a"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-baht-sign:before{content:"\e0ac"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-barcode:before{content:"\f02a"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-bell:before{content:"\f0f3"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blog:before{content:"\f781"}.fa-bold:before{content:"\f032"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-book-bookmark:before{content:"\e0bb"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-bookmark:before{content:"\f02e"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-bore-hole:before{content:"\e4c3"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-bottle-water:before{content:"\e4c5"}.fa-bowl-food:before{content:"\e4c6"}.fa-bowl-rice:before{content:"\e2eb"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes-packing:before{content:"\e4c7"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-bread-slice:before{content:"\f7ec"}.fa-bridge:before{content:"\e4c8"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-bridge-water:before{content:"\e4ce"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broom:before{content:"\f51a"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-brush:before{content:"\f55d"}.fa-bucket:before{content:"\e4cf"}.fa-bug:before{content:"\f188"}.fa-bug-slash:before{content:"\e490"}.fa-bugs:before{content:"\e4d0"}.fa-building:before{content:"\f1ad"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-building-circle-check:before{content:"\e4d2"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-building-flag:before{content:"\e4d5"}.fa-building-lock:before{content:"\e4d6"}.fa-building-ngo:before{content:"\e4d7"}.fa-building-shield:before{content:"\e4d8"}.fa-building-un:before{content:"\e4d9"}.fa-building-user:before{content:"\e4da"}.fa-building-wheat:before{content:"\e4db"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-burst:before{content:"\e4dc"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-c:before{content:"\43"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-week:before{content:"\f784"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-camera-rotate:before{content:"\e0d8"}.fa-campground:before{content:"\f6bb"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-car-on:before{content:"\e4dd"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-car-side:before{content:"\f5e4"}.fa-car-tunnel:before{content:"\e4de"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-cart-plus:before{content:"\f217"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cedi-sign:before{content:"\e0df"}.fa-cent-sign:before{content:"\e3f5"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-charging-station:before{content:"\f5e7"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-chart-column:before{content:"\e0e3"}.fa-chart-gantt:before{content:"\e0e4"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-chart-simple:before{content:"\e473"}.fa-check:before{content:"\f00c"}.fa-check-double:before{content:"\f560"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-child-dress:before{content:"\e59c"}.fa-child-reaching:before{content:"\e59d"}.fa-child-rifle:before{content:"\e4e0"}.fa-children:before{content:"\e4e1"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-circle-nodes:before{content:"\e4e2"}.fa-circle-notch:before{content:"\f1ce"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-city:before{content:"\f64f"}.fa-clapperboard:before{content:"\e131"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clipboard-question:before{content:"\e4e3"}.fa-clipboard-user:before{content:"\f7f3"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-clover:before{content:"\e139"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-code-commit:before{content:"\f386"}.fa-code-compare:before{content:"\e13a"}.fa-code-fork:before{content:"\e13b"}.fa-code-merge:before{content:"\f387"}.fa-code-pull-request:before{content:"\e13c"}.fa-coins:before{content:"\f51e"}.fa-colon-sign:before{content:"\e140"}.fa-comment:before{content:"\f075"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-compress:before{content:"\f066"}.fa-computer:before{content:"\e4e5"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cow:before{content:"\f6c8"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-d:before{content:"\44"}.fa-database:before{content:"\f1c0"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-democrat:before{content:"\f747"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-dharmachakra:before{content:"\f655"}.fa-diagram-next:before{content:"\e476"}.fa-diagram-predecessor:before{content:"\e477"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-diagram-successor:before{content:"\e47a"}.fa-diamond:before{content:"\f219"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-disease:before{content:"\f7fa"}.fa-display:before{content:"\e163"}.fa-divide:before{content:"\f529"}.fa-dna:before{content:"\f471"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-dong-sign:before{content:"\e169"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dove:before{content:"\f4ba"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-download:before{content:"\f019"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-e:before{content:"\45"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elevator:before{content:"\e16d"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-equals:before{content:"\3d"}.fa-eraser:before{content:"\f12d"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-exclamation:before{content:"\21"}.fa-expand:before{content:"\f065"}.fa-explosion:before{content:"\e4e9"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-eye-slash:before{content:"\f070"}.fa-f:before{content:"\46"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-fan:before{content:"\f863"}.fa-faucet:before{content:"\e005"}.fa-faucet-drip:before{content:"\e006"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-ferry:before{content:"\e4ea"}.fa-file:before{content:"\f15b"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-file-audio:before{content:"\f1c7"}.fa-file-circle-check:before{content:"\e5a0"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-file-circle-plus:before{content:"\e494"}.fa-file-circle-question:before{content:"\e4ef"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-excel:before{content:"\f1c3"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-file-medical:before{content:"\f477"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-shield:before{content:"\e4f0"}.fa-file-signature:before{content:"\f573"}.fa-file-video:before{content:"\f1c8"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-file-word:before{content:"\f1c2"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-burner:before{content:"\e4f1"}.fa-fire-extinguisher:before{content:"\f134"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-fish:before{content:"\f578"}.fa-fish-fins:before{content:"\e4f2"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flask-vial:before{content:"\e4f3"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-florin-sign:before{content:"\e184"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-folder-closed:before{content:"\e185"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-folder-tree:before{content:"\f802"}.fa-font:before{content:"\f031"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-franc-sign:before{content:"\e18f"}.fa-frog:before{content:"\f52e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-g:before{content:"\47"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-glass-water:before{content:"\e4f4"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-glasses:before{content:"\f530"}.fa-globe:before{content:"\f0ac"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-greater-than:before{content:"\3e"}.fa-greater-than-equal:before{content:"\f532"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-guarani-sign:before{content:"\e19a"}.fa-guitar:before{content:"\f7a6"}.fa-gun:before{content:"\e19b"}.fa-h:before{content:"\48"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-handcuffs:before{content:"\e4f8"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-hands-bound:before{content:"\e4f9"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-hands-clapping:before{content:"\e1a8"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-handshake:before{content:"\f2b5"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-hashtag:before{content:"\23"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-heart-circle-plus:before{content:"\e500"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-helicopter-symbol:before{content:"\e502"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-helmet-un:before{content:"\e503"}.fa-highlighter:before{content:"\f591"}.fa-hill-avalanche:before{content:"\e507"}.fa-hill-rockslide:before{content:"\e508"}.fa-hippo:before{content:"\f6ed"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-house-chimney-user:before{content:"\e065"}.fa-house-chimney-window:before{content:"\e00d"}.fa-house-circle-check:before{content:"\e509"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-house-crack:before{content:"\e3b1"}.fa-house-fire:before{content:"\e50c"}.fa-house-flag:before{content:"\e50d"}.fa-house-flood-water:before{content:"\e50e"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-house-lock:before{content:"\e510"}.fa-house-medical:before{content:"\e3b2"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-house-medical-flag:before{content:"\e514"}.fa-house-signal:before{content:"\e012"}.fa-house-tsunami:before{content:"\e515"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-hurricane:before{content:"\f751"}.fa-i:before{content:"\49"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-images:before{content:"\f302"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-italic:before{content:"\f033"}.fa-j:before{content:"\4a"}.fa-jar:before{content:"\e516"}.fa-jar-wheat:before{content:"\e517"}.fa-jedi:before{content:"\f669"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-jet-fighter-up:before{content:"\e518"}.fa-joint:before{content:"\f595"}.fa-jug-detergent:before{content:"\e519"}.fa-k:before{content:"\4b"}.fa-kaaba:before{content:"\f66b"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-khanda:before{content:"\f66d"}.fa-kip-sign:before{content:"\e1c4"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-kitchen-set:before{content:"\e51a"}.fa-kiwi-bird:before{content:"\f535"}.fa-l:before{content:"\4c"}.fa-land-mine-on:before{content:"\e51b"}.fa-landmark:before{content:"\f66f"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-landmark-flag:before{content:"\e51c"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-file:before{content:"\e51d"}.fa-laptop-medical:before{content:"\f812"}.fa-lari-sign:before{content:"\e1c8"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-lemon:before{content:"\f094"}.fa-less-than:before{content:"\3c"}.fa-less-than-equal:before{content:"\f537"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-lines-leaning:before{content:"\e51e"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-lira-sign:before{content:"\f195"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-location-arrow:before{content:"\f124"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-location-pin-lock:before{content:"\e51f"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-locust:before{content:"\e520"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-m:before{content:"\4d"}.fa-magnet:before{content:"\f076"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-manat-sign:before{content:"\e1d5"}.fa-map:before{content:"\f279"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-pin:before{content:"\f276"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-and-venus:before{content:"\f224"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-mask:before{content:"\f6fa"}.fa-mask-face:before{content:"\e1d7"}.fa-mask-ventilator:before{content:"\e524"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-mattress-pillow:before{content:"\e525"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-medal:before{content:"\f5a2"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-mill-sign:before{content:"\e1ed"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-mitten:before{content:"\f7b5"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-mobile-button:before{content:"\f10b"}.fa-mobile-retro:before{content:"\e527"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-money-bills:before{content:"\e1f3"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-mosquito-net:before{content:"\e52c"}.fa-motorcycle:before{content:"\f21c"}.fa-mound:before{content:"\e52d"}.fa-mountain:before{content:"\f6fc"}.fa-mountain-city:before{content:"\e52e"}.fa-mountain-sun:before{content:"\e52f"}.fa-mug-hot:before{content:"\f7b6"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-music:before{content:"\f001"}.fa-n:before{content:"\4e"}.fa-naira-sign:before{content:"\e1f6"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-not-equal:before{content:"\f53e"}.fa-notdef:before{content:"\e1fe"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-notes-medical:before{content:"\f481"}.fa-o:before{content:"\4f"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-oil-can:before{content:"\f613"}.fa-oil-well:before{content:"\e532"}.fa-om:before{content:"\f679"}.fa-otter:before{content:"\f700"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-p:before{content:"\50"}.fa-pager:before{content:"\f815"}.fa-paint-roller:before{content:"\f5aa"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-palette:before{content:"\f53f"}.fa-pallet:before{content:"\f482"}.fa-panorama:before{content:"\e209"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-passport:before{content:"\f5ab"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-pause:before{content:"\f04c"}.fa-paw:before{content:"\f1b0"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-people-group:before{content:"\e533"}.fa-people-line:before{content:"\e534"}.fa-people-pulling:before{content:"\e535"}.fa-people-robbery:before{content:"\e536"}.fa-people-roof:before{content:"\e537"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-person-booth:before{content:"\f756"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-person-burst:before{content:"\e53b"}.fa-person-cane:before{content:"\e53c"}.fa-person-chalkboard:before{content:"\e53d"}.fa-person-circle-check:before{content:"\e53e"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-person-circle-minus:before{content:"\e540"}.fa-person-circle-plus:before{content:"\e541"}.fa-person-circle-question:before{content:"\e542"}.fa-person-circle-xmark:before{content:"\e543"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-person-dress-burst:before{content:"\e544"}.fa-person-drowning:before{content:"\e545"}.fa-person-falling:before{content:"\e546"}.fa-person-falling-burst:before{content:"\e547"}.fa-person-half-dress:before{content:"\e548"}.fa-person-harassing:before{content:"\e549"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-person-military-pointing:before{content:"\e54a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-person-military-to-person:before{content:"\e54c"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-person-pregnant:before{content:"\e31e"}.fa-person-rays:before{content:"\e54d"}.fa-person-rifle:before{content:"\e54e"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-person-shelter:before{content:"\e54f"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-person-through-window:before{content:"\e5a9"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-person-walking-luggage:before{content:"\e554"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-peseta-sign:before{content:"\e221"}.fa-peso-sign:before{content:"\e222"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-circle-check:before{content:"\e555"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-lock:before{content:"\e558"}.fa-plane-slash:before{content:"\e069"}.fa-plane-up:before{content:"\e22d"}.fa-plant-wilt:before{content:"\e5aa"}.fa-plate-wheat:before{content:"\e55a"}.fa-play:before{content:"\f04b"}.fa-plug:before{content:"\f1e6"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-plug-circle-check:before{content:"\e55c"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-plus-minus:before{content:"\e43c"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-puzzle-piece:before{content:"\f12e"}.fa-q:before{content:"\51"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\3f"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-r:before{content:"\52"}.fa-radiation:before{content:"\f7b9"}.fa-radio:before{content:"\f8d7"}.fa-rainbow:before{content:"\f75b"}.fa-ranking-star:before{content:"\e561"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-recycle:before{content:"\f1b8"}.fa-registered:before{content:"\f25d"}.fa-repeat:before{content:"\f363"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-republican:before{content:"\f75e"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-road-barrier:before{content:"\e562"}.fa-road-bridge:before{content:"\e563"}.fa-road-circle-check:before{content:"\e564"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-road-circle-xmark:before{content:"\e566"}.fa-road-lock:before{content:"\e567"}.fa-road-spikes:before{content:"\e568"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-route:before{content:"\f4d7"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-rug:before{content:"\e569"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-rupiah-sign:before{content:"\e23d"}.fa-s:before{content:"\53"}.fa-sack-dollar:before{content:"\f81d"}.fa-sack-xmark:before{content:"\e56a"}.fa-sailboat:before{content:"\e445"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-school:before{content:"\f549"}.fa-school-circle-check:before{content:"\e56b"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-school-flag:before{content:"\e56e"}.fa-school-lock:before{content:"\e56f"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-screwdriver:before{content:"\f54a"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-scroll:before{content:"\f70e"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-sd-card:before{content:"\f7c2"}.fa-section:before{content:"\e447"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-server:before{content:"\f233"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-sheet-plastic:before{content:"\e571"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-shield-cat:before{content:"\e572"}.fa-shield-dog:before{content:"\e573"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-shield-heart:before{content:"\e574"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-shoe-prints:before{content:"\f54b"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-shop-lock:before{content:"\e4a5"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-shower:before{content:"\f2cc"}.fa-shrimp:before{content:"\e448"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-sim-card:before{content:"\f7c4"}.fa-sink:before{content:"\e06d"}.fa-sitemap:before{content:"\f0e8"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-spa:before{content:"\f5bb"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-spray-can:before{content:"\f5bd"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-square:before{content:"\f0c8"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-square-full:before{content:"\f45c"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-square-nfi:before{content:"\e576"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-square-person-confined:before{content:"\e577"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-square-virus:before{content:"\e578"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-stairs:before{content:"\e289"}.fa-stamp:before{content:"\f5bf"}.fa-stapler:before{content:"\e5af"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-stethoscope:before{content:"\f0f1"}.fa-stop:before{content:"\f04d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-slash:before{content:"\e071"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stroopwafel:before{content:"\f551"}.fa-subscript:before{content:"\f12c"}.fa-suitcase:before{content:"\f0f2"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-superscript:before{content:"\f12b"}.fa-swatchbook:before{content:"\f5c3"}.fa-synagogue:before{content:"\f69b"}.fa-syringe:before{content:"\f48e"}.fa-t:before{content:"\54"}.fa-table:before{content:"\f0ce"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-tablet-button:before{content:"\f10a"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tarp:before{content:"\e57b"}.fa-tarp-droplet:before{content:"\e57c"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-tent:before{content:"\e57d"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tent-arrows-down:before{content:"\e581"}.fa-tents:before{content:"\e582"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-text-width:before{content:"\f035"}.fa-thermometer:before{content:"\f491"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-ticket:before{content:"\f145"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-timeline:before{content:"\e29c"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toilet-portable:before{content:"\e583"}.fa-toilets-portable:before{content:"\e584"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torii-gate:before{content:"\f6a1"}.fa-tornado:before{content:"\f76f"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-tower-cell:before{content:"\e585"}.fa-tower-observation:before{content:"\e586"}.fa-tractor:before{content:"\f722"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-train-tram:before{content:"\e5b4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-tree-city:before{content:"\e587"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-trophy:before{content:"\f091"}.fa-trowel:before{content:"\e589"}.fa-trowel-bricks:before{content:"\e58a"}.fa-truck:before{content:"\f0d1"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-truck-droplet:before{content:"\e58c"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-truck-field:before{content:"\e58d"}.fa-truck-field-un:before{content:"\e58e"}.fa-truck-front:before{content:"\e2b7"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-truck-plane:before{content:"\e58f"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-u:before{content:"\55"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-universal-access:before{content:"\f29a"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-upload:before{content:"\f093"}.fa-user:before{content:"\f007"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-clock:before{content:"\f4fd"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-user-graduate:before{content:"\f501"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-user-injured:before{content:"\f728"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-user-lock:before{content:"\f502"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-between-lines:before{content:"\e591"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-users-line:before{content:"\e592"}.fa-users-rays:before{content:"\e593"}.fa-users-rectangle:before{content:"\e594"}.fa-users-slash:before{content:"\e073"}.fa-users-viewfinder:before{content:"\e595"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-v:before{content:"\56"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-vault:before{content:"\e2c5"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-vial:before{content:"\f492"}.fa-vial-circle-check:before{content:"\e596"}.fa-vial-virus:before{content:"\e597"}.fa-vials:before{content:"\f493"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-virus:before{content:"\e074"}.fa-virus-covid:before{content:"\e4a8"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-voicemail:before{content:"\f897"}.fa-volcano:before{content:"\f770"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-vr-cardboard:before{content:"\f729"}.fa-w:before{content:"\57"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-wallet:before{content:"\f555"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-wand-sparkles:before{content:"\f72b"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-wave-square:before{content:"\f83e"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-wheelchair:before{content:"\f193"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-wind:before{content:"\f72e"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-worm:before{content:"\e599"}.fa-wrench:before{content:"\f0ad"}.fa-x:before{content:"\58"}.fa-x-ray:before{content:"\f497"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-xmarks-lines:before{content:"\e59a"}.fa-y:before{content:"\59"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-z:before{content:"\5a"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-family:"Font Awesome 6 Brands";font-weight:400}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-alipay:before{content:"\f642"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-amilia:before{content:"\f36d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-artstation:before{content:"\f77a"}.fa-asymmetrik:before{content:"\f372"}.fa-atlassian:before{content:"\f77b"}.fa-audible:before{content:"\f373"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-bandcamp:before{content:"\f2d5"}.fa-battle-net:before{content:"\f835"}.fa-behance:before{content:"\f1b4"}.fa-bilibili:before{content:"\e3d9"}.fa-bimobject:before{content:"\f378"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bootstrap:before{content:"\f836"}.fa-bots:before{content:"\e340"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-buromobelexperte:before{content:"\f37f"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cmplid:before{content:"\e360"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-critical-role:before{content:"\f6c9"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dhl:before{content:"\f790"}.fa-diaspora:before{content:"\f791"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-elementor:before{content:"\f430"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-evernote:before{content:"\f839"}.fa-expeditedssl:before{content:"\f23e"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-figma:before{content:"\f799"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-fulcrum:before{content:"\f50b"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-gofore:before{content:"\f3a7"}.fa-golang:before{content:"\e40f"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-wallet:before{content:"\f1ee"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-gulp:before{content:"\f3ae"}.fa-hacker-news:before{content:"\f1d4"}.fa-hackerrank:before{content:"\f5f7"}.fa-hashnode:before{content:"\e499"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-hive:before{content:"\e07f"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hotjar:before{content:"\f3b1"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-ideal:before{content:"\e013"}.fa-imdb:before{content:"\f2d8"}.fa-instagram:before{content:"\f16d"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaggle:before{content:"\f5fa"}.fa-keybase:before{content:"\f4f5"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-leanpub:before{content:"\f212"}.fa-less:before{content:"\f41d"}.fa-line:before{content:"\f3c0"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-mailchimp:before{content:"\f59e"}.fa-mandalorian:before{content:"\f50f"}.fa-markdown:before{content:"\f60f"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medapps:before{content:"\f3c6"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-mendeley:before{content:"\f7b3"}.fa-meta:before{content:"\e49b"}.fa-microblog:before{content:"\e01a"}.fa-microsoft:before{content:"\f3ca"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-nfc-directional:before{content:"\e530"}.fa-nfc-symbol:before{content:"\e531"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-padlet:before{content:"\e4a0"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-palfed:before{content:"\f3d8"}.fa-patreon:before{content:"\f3d9"}.fa-paypal:before{content:"\f1ed"}.fa-perbyte:before{content:"\e083"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pix:before{content:"\e43a"}.fa-playstation:before{content:"\f3df"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-r-project:before{content:"\f4f7"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-redhat:before{content:"\f7bc"}.fa-renren:before{content:"\f18b"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-rev:before{content:"\f5b2"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rust:before{content:"\e07a"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-schlix:before{content:"\f3ea"}.fa-screenpal:before{content:"\e570"}.fa-scribd:before{content:"\f28a"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-servicestack:before{content:"\f3ec"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopify:before{content:"\e057"}.fa-shopware:before{content:"\f5b5"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sith:before{content:"\f512"}.fa-sitrox:before{content:"\e44a"}.fa-sketch:before{content:"\f7c6"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-slideshare:before{content:"\f1e7"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-space-awesome:before{content:"\e5ac"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spotify:before{content:"\f1bc"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-symbol:before{content:"\f3f6"}.fa-sticker-mule:before{content:"\f3f7"}.fa-strava:before{content:"\f428"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-superpowers:before{content:"\f2dd"}.fa-supple:before{content:"\f3f9"}.fa-suse:before{content:"\f7d6"}.fa-swift:before{content:"\f8e1"}.fa-symfony:before{content:"\f83d"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-the-red-yeti:before{content:"\f69d"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-think-peaks:before{content:"\f731"}.fa-tiktok:before{content:"\e07b"}.fa-trade-federation:before{content:"\f513"}.fa-trello:before{content:"\f181"}.fa-tumblr:before{content:"\f173"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-uncharted:before{content:"\e084"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-vaadin:before{content:"\f408"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viber:before{content:"\f409"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-vuejs:before{content:"\f41f"}.fa-watchman-monitoring:before{content:"\e087"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whmcs:before{content:"\f40d"}.fa-wikipedia-w:before{content:"\f266"}.fa-windows:before{content:"\f17a"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-zhihu:before{content:"\f63f"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-family:"Font Awesome 6 Free";font-weight:400}:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-family:"Font Awesome 6 Free";font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-brands-400.ttf b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..24ca8b17 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-brands-400.ttf differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-brands-400.woff2 b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..e67e5cd5 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-brands-400.woff2 differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-regular-400.ttf b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..c5ac0095 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-regular-400.ttf differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-regular-400.woff2 b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..7dca1d90 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-regular-400.woff2 differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-solid-900.ttf b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..43ba1cc7 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-solid-900.ttf differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-solid-900.woff2 b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..4a7f9665 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-solid-900.woff2 differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-v4compatibility.ttf b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-v4compatibility.ttf new file mode 100644 index 00000000..243bc25b Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-v4compatibility.ttf differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-v4compatibility.woff2 b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 00000000..e18a16d5 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/css/fontawesome/webfonts/fa-v4compatibility.woff2 differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/images/neve-theme.jpg b/wp-content/upgrade-temp-backup/plugins/menu-icons/images/neve-theme.jpg new file mode 100644 index 00000000..2e1c1c56 Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/images/neve-theme.jpg differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/images/otter-block.png b/wp-content/upgrade-temp-backup/plugins/menu-icons/images/otter-block.png new file mode 100644 index 00000000..dec4b8cd Binary files /dev/null and b/wp-content/upgrade-temp-backup/plugins/menu-icons/images/otter-block.png differ diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/front.php b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/front.php new file mode 100644 index 00000000..7bfb0952 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/front.php @@ -0,0 +1,514 @@ + + */ +final class Menu_Icons_Front_End { + + /** + * Icon types + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $icon_types = array(); + + /** + * Default icon style + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $default_style = array( + 'font_size' => array( + 'property' => 'font-size', + 'value' => '1.2', + 'unit' => 'em', + ), + 'vertical_align' => array( + 'property' => 'vertical-align', + 'value' => 'middle', + 'unit' => null, + ), + 'svg_width' => array( + 'property' => 'width', + 'value' => '1', + 'unit' => 'em', + ), + ); + + /** + * Hidden label class + * + * @since 0.9.0 + * @access protected + * @var string + */ + protected static $hidden_label_class = 'visuallyhidden'; + + + /** + * Add hooks for front-end functionalities + * + * @since 0.9.0 + */ + public static function init() { + $active_types = Menu_Icons_Settings::get( 'global', 'icon_types' ); + + if ( empty( $active_types ) ) { + return; + } + + foreach ( Menu_Icons::get( 'types' ) as $type ) { + if ( in_array( $type->id, $active_types, true ) ) { + self::$icon_types[ $type->id ] = $type; + } + } + + /** + * Allow themes/plugins to override the hidden label class + * + * @since 0.8.0 + * @param string $hidden_label_class Hidden label class. + * @return string + */ + self::$hidden_label_class = apply_filters( 'menu_icons_hidden_label_class', self::$hidden_label_class ); + + /** + * Allow themes/plugins to override default inline style + * + * @since 0.9.0 + * @param array $default_style Default inline style. + * @return array + */ + self::$default_style = apply_filters( 'menu_icons_default_style', self::$default_style ); + + add_action( 'wp_enqueue_scripts', array( __CLASS__, '_enqueue_styles' ), 4 ); + add_filter( 'wp_nav_menu_args', array( __CLASS__, '_add_menu_item_title_filter' ) ); + add_filter( 'wp_nav_menu', array( __CLASS__, '_remove_menu_item_title_filter' ) ); + } + + + /** + * Get nav menu ID based on arguments passed to wp_nav_menu() + * + * @since 0.3.0 + * @param array $args wp_nav_menu() Arguments + * @return mixed Nav menu ID or FALSE on failure + */ + public static function get_nav_menu_id( $args ) { + $args = (object) $args; + $menu = wp_get_nav_menu_object( $args->menu ); + + // Get the nav menu based on the theme_location + if ( ! $menu + && $args->theme_location + && ( $locations = get_nav_menu_locations() ) + && isset( $locations[ $args->theme_location ] ) + ) { + $menu = wp_get_nav_menu_object( $locations[ $args->theme_location ] ); + } + + // get the first menu that has items if we still can't find a menu + if ( ! $menu && ! $args->theme_location ) { + $menus = wp_get_nav_menus(); + foreach ( $menus as $menu_maybe ) { + if ( $menu_items = wp_get_nav_menu_items( $menu_maybe->term_id, array( 'update_post_term_cache' => false ) ) ) { + $menu = $menu_maybe; + break; + } + } + } + + if ( is_object( $menu ) && ! is_wp_error( $menu ) ) { + return $menu->term_id; + } else { + return false; + } + } + + + /** + * Enqueue stylesheets + * + * @since 0.1.0 + * @wp_hook action wp_enqueue_scripts + * @link http://codex.wordpress.org/Plugin_API/Action_Reference/wp_enqueue_scripts + */ + public static function _enqueue_styles() { + // Deregister icon picker plugin font-awesome style and re-register with the new handler to avoid other plugin/theme style handler conflict. + $wp_styles = wp_styles(); + if ( $wp_styles && isset( $wp_styles->registered['font-awesome'] ) ) { + $registered = $wp_styles->registered['font-awesome']; + if ( strpos( $registered->src, Menu_Icons::get( 'url' ) ) !== false ) { + $wp_styles->remove( 'font-awesome' ); + $registered->ver = Menu_Icons_Font_Awesome::$version; + $wp_styles->add( 'menu-icon-' . $registered->handle, $registered->src, $registered->deps, $registered->ver, $registered->args ); + } + } + + foreach ( self::$icon_types as $type ) { + $stylesheet_id = $type->stylesheet_id; + if ( 'font-awesome' === $stylesheet_id ) { + $stylesheet_id = 'menu-icon-' . $stylesheet_id; + } + if ( wp_style_is( $stylesheet_id, 'registered' ) ) { + wp_enqueue_style( $stylesheet_id ); + } + } + + /** + * Allow plugins/themes to override the extra stylesheet location + * + * @since 0.9.0 + * @param string $extra_stylesheet_uri Extra stylesheet URI. + */ + $extra_stylesheet_uri = apply_filters( + 'menu_icons_extra_stylesheet_uri', + sprintf( '%scss/extra%s.css', Menu_Icons::get( 'url' ), kucrut_get_script_suffix() ) + ); + + wp_enqueue_style( + 'menu-icons-extra', + $extra_stylesheet_uri, + false, + Menu_Icons::VERSION + ); + } + + + /** + * Add filter to 'the_title' hook + * + * We need to filter the menu item title but **not** regular post titles. + * Thus, we're adding the filter when `wp_nav_menu()` is called. + * + * @since 0.1.0 + * @wp_hook filter wp_nav_menu_args + * @param array $args Not used. + * + * @return array + */ + public static function _add_menu_item_title_filter( $args ) { + add_filter( 'the_title', array( __CLASS__, '_add_icon' ), 999, 2 ); + add_filter( 'megamenu_the_title', array( __CLASS__, '_add_icon' ), 999, 2 ); + add_filter( 'megamenu_nav_menu_css_class', array( __CLASS__, '_add_menu_item_class' ), 10, 3 ); + + return $args; + } + + + /** + * Remove filter from 'the_title' hook + * + * Because we don't want to filter post titles, we need to remove our + * filter when `wp_nav_menu()` exits. + * + * @since 0.1.0 + * @wp_hook filter wp_nav_menu + * @param array $nav_menu Not used. + * @return array + */ + public static function _remove_menu_item_title_filter( $nav_menu ) { + remove_filter( 'the_title', array( __CLASS__, '_add_icon' ), 999, 2 ); + remove_filter( 'megamenu_the_title', array( __CLASS__, '_add_icon' ), 999, 2 ); + remove_filter( 'megamenu_nav_menu_css_class', array( __CLASS__, '_add_menu_item_class' ), 10, 3 ); + return $nav_menu; + } + + + /** + * Add icon to menu item title + * + * @since 0.1.0 + * @since 0.9.0 Renamed the method to `add_icon()`. + * @wp_hook filter the_title + * @param string $title Menu item title. + * @param int $id Menu item ID. + * + * @return string + */ + public static function _add_icon( $title, $id ) { + $meta = Menu_Icons_Meta::get( $id ); + $icon = self::get_icon( $meta ); + + if ( empty( $icon ) ) { + return $title; + } + + $title_class = ! empty( $meta['hide_label'] ) ? self::$hidden_label_class : ''; + $title_wrapped = sprintf( + '%s', + ( ! empty( $title_class ) ) ? sprintf( ' class="%s"', esc_attr( $title_class ) ) : '', + $title + ); + + if ( 'after' === $meta['position'] ) { + $title_with_icon = "{$title_wrapped}{$icon}"; + } else { + $title_with_icon = "{$icon}{$title_wrapped}"; + } + + /** + * Allow plugins/themes to override menu item markup + * + * @since 0.8.0 + * + * @param string $title_with_icon Menu item markup after the icon is added. + * @param integer $id Menu item ID. + * @param array $meta Menu item metadata values. + * @param string $title Original menu item title. + * + * @return string + */ + $title_with_icon = apply_filters( 'menu_icons_item_title', $title_with_icon, $id, $meta, $title ); + + return $title_with_icon; + } + + + /** + * Get icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_icon( $meta ) { + $icon = ''; + + // Icon type is not set. + if ( empty( $meta['type'] ) ) { + return $icon; + } + + // Icon is not set. + if ( empty( $meta['icon'] ) ) { + return $icon; + } + + // Icon type is not registered/enabled. + if ( ! isset( self::$icon_types[ $meta['type'] ] ) ) { + return $icon; + } + + $type = self::$icon_types[ $meta['type'] ]; + + $callbacks = array( + array( $type, 'get_icon' ), + array( __CLASS__, "get_{$type->id}_icon" ), + array( __CLASS__, "get_{$type->template_id}_icon" ), + ); + + foreach ( $callbacks as $callback ) { + if ( is_callable( $callback ) ) { + $icon = call_user_func( $callback, $meta ); + break; + } + } + + return $icon; + } + + + /** + * Get icon style + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @param array $keys Style properties. + * @param bool $as_attribute Optional. Whether to output the style as HTML attribute or value only. + * Defaults to TRUE. + * @return string + */ + public static function get_icon_style( $meta, $keys, $as_attribute = true ) { + $style_a = array(); + $style_s = ''; + + foreach ( $keys as $key ) { + if ( ! isset( self::$default_style[ $key ] ) ) { + continue; + } + + $rule = self::$default_style[ $key ]; + + if ( ! isset( $meta[ $key ] ) || $meta[ $key ] === $rule['value'] ) { + continue; + } + + $value = $meta[ $key ]; + if ( ! empty( $rule['unit'] ) ) { + $value .= $rule['unit']; + } + + $style_a[ $rule['property'] ] = $value; + } + + if ( empty( $style_a ) ) { + return $style_s; + } + + foreach ( $style_a as $key => $value ) { + $style_s .= "{$key}:{$value};"; + } + + $style_s = esc_attr( $style_s ); + + if ( $as_attribute ) { + $style_s = sprintf( ' style="%s"', $style_s ); + } + + return $style_s; + } + + + /** + * Get icon classes + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @param string $output Whether to output the classes as string or array. Defaults to string. + * @return string|array + */ + public static function get_icon_classes( $meta, $output = 'string' ) { + $classes = array( '_mi' ); + + if ( empty( $meta['hide_label'] ) ) { + $classes[] = "_{$meta['position']}"; + } + + if ( 'string' === $output ) { + $classes = implode( ' ', $classes ); + } + + return $classes; + } + + + /** + * Get font icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_font_icon( $meta ) { + $type = $meta['type']; + $icon = $meta['icon']; + + $font_awesome5 = font_awesome_backward_compatible(); + if ( ! empty( $type ) && 'fa' === $type ) { + $icon = explode( ' ', $icon ); + $type = reset( $icon ); + $icon = end( $icon ); + $fa_icon = sprintf( '%s-%s', $type, $icon ); + if ( array_key_exists( $fa_icon, $font_awesome5 ) ) { + $fa5_icon = $font_awesome5[ $fa_icon ]; + $fa5_class = explode( ' ', $fa5_icon ); + $type = reset( $fa5_class ); + $icon = end( $fa5_class ); + } + } + $classes = sprintf( '%s %s %s', self::get_icon_classes( $meta ), $type, $icon ); + $style = self::get_icon_style( $meta, array( 'font_size', 'vertical_align' ) ); + return sprintf( '', esc_attr( $classes ), $style ); + } + + + /** + * Get image icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_image_icon( $meta ) { + $args = array( + 'class' => sprintf( '%s _image', self::get_icon_classes( $meta ) ), + 'aria-hidden' => 'true', + ); + + $style = self::get_icon_style( $meta, array( 'vertical_align' ), false ); + if ( ! empty( $style ) ) { + $args['style'] = $style; + } + + return wp_get_attachment_image( $meta['icon'], $meta['image_size'], false, $args ); + } + + + /** + * Get SVG icon + * + * @since 0.9.0 + * @param array $meta Menu item meta value. + * @return string + */ + public static function get_svg_icon( $meta ) { + $classes = sprintf( '%s _svg', self::get_icon_classes( $meta ) ); + $style = self::get_icon_style( $meta, array( 'svg_width', 'vertical_align' ) ); + + $svg_icon = esc_url( wp_get_attachment_url( $meta['icon'] ) ); + $width = ''; + $height = ''; + if ( 'image/svg+xml' === get_post_mime_type( $meta['icon'] ) ) { + + // Check `WP_Filesystem` function exists OR not. + require_once ABSPATH . '/wp-admin/includes/file.php'; + \WP_Filesystem(); + global $wp_filesystem; + + $svg_icon = get_attached_file( $meta['icon'] ); + $svg_icon_content = $wp_filesystem->get_contents( $svg_icon ); + if ( $svg_icon_content ) { + $xmlget = simplexml_load_string( $svg_icon_content ); + $xmlattributes = $xmlget->attributes(); + $width = (string) $xmlattributes->width; + $width = (int) filter_var( $xmlattributes->width, FILTER_SANITIZE_NUMBER_INT ); + $height = (string) $xmlattributes->height; + $height = (int) filter_var( $xmlattributes->height, FILTER_SANITIZE_NUMBER_INT ); + } + } else { + $attachment_meta = wp_get_attachment_metadata( $meta['icon'] ); + if ( $attachment_meta ) { + $width = isset( $attachment_meta['width'] ) ? $attachment_meta['width'] : $width; + $height = isset( $attachment_meta['height'] ) ? $attachment_meta['height'] : $height; + } + } + if ( ! empty( $width ) ) { + $width = sprintf( ' width="%d"', $width ); + } + if ( ! empty( $height ) ) { + $height = sprintf( ' height="%d"', $height ); + } + $image_alt = get_post_meta( $meta['icon'], '_wp_attachment_image_alt', true ); + $image_alt = $image_alt ? wp_strip_all_tags( $image_alt ) : ''; + return sprintf( + '', + esc_url( wp_get_attachment_url( $meta['icon'] ) ), + esc_attr( $classes ), + $image_alt, + $width, + $height, + $style + ); + } + + /** + * Add menu item class in `Max Mega Menu` item. + * + * @param array $classes Item classes. + * @param array $item WP menu item. + * @param object $args Menu object. + * @return array + */ + public static function _add_menu_item_class( $classes, $item, $args ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore + $classes[] = 'menu-item'; + return $classes; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/compat.php b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/compat.php new file mode 100644 index 00000000..cf7ca6b0 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/compat.php @@ -0,0 +1,23 @@ + 'fab fa-500px', + 'fa-fa-address-book-o' => 'far fa-address-book', + 'fa-fa-address-card-o' => 'far fa-address-card', + 'fa-fa-adn' => 'fab fa-adn', + 'fa-fa-amazon' => 'fab fa-amazon', + 'fa-fa-android' => 'fab fa-android', + 'fa-fa-angellist' => 'fab fa-angellist', + 'fa-fa-apple' => 'fab fa-apple', + 'fa-fa-area-chart' => 'fas fa-chart-area', + 'fa-fa-arrow-circle-o-down' => 'far fa-arrow-alt-circle-down', + 'fa-fa-arrow-circle-o-left' => 'far fa-arrow-alt-circle-left', + 'fa-fa-arrow-circle-o-right' => 'far fa-arrow-alt-circle-right', + 'fa-fa-arrow-circle-o-up' => 'far fa-arrow-alt-circle-up', + 'fa-fa-arrows-alt' => 'fas fa-expand-arrows-alt', + 'fa-fa-arrows-h' => 'fas fa-arrows-alt-h', + 'fa-fa-arrows-v' => 'fas fa-arrows-alt-v', + 'fa-fa-arrows' => 'fas fa-arrows-alt', + 'fa-fa-asl-interpreting' => 'fas fa-american-sign-language-interpreting', + 'fa-fa-automobile' => 'fas fa-car', + 'fa-fa-bandcamp' => 'fab fa-bandcamp', + 'fa-fa-bank' => 'fas fa-university', + 'fa-fa-bar-chart-o' => 'far fa-chart-bar', + 'fa-fa-bar-chart' => 'far fa-chart-bar', + 'fa-fa-bathtub' => 'fas fa-bath', + 'fa-fa-battery-0' => 'fas fa-battery-empty', + 'fa-fa-battery-1' => 'fas fa-battery-quarter', + 'fa-fa-battery-2' => 'fas fa-battery-half', + 'fa-fa-battery-3' => 'fas fa-battery-three-quarters', + 'fa-fa-battery-4' => 'fas fa-battery-full', + 'fa-fa-battery' => 'fas fa-battery-full', + 'fa-fa-behance' => 'fab fa-behance', + 'fa-fa-behance-square' => 'fab fa-behance-square', + 'fa-fa-bell-o' => 'far fa-bell', + 'fa-fa-bell-slash-o' => 'far fa-bell-slash', + 'fa-fa-bitbucket-square' => 'fab fa-bitbucket', + 'fa-fa-bitbucket' => 'fab fa-bitbucket', + 'fa-fa-bitcoin' => 'fab fa-btc', + 'fa-fa-black-tie' => 'fab fa-black-tie', + 'fa-fa-bluetooth-b' => 'fab fa-bluetooth-b', + 'fa-fa-bluetooth' => 'fab fa-bluetooth', + 'fa-fa-bookmark-o' => 'far fa-bookmark', + 'fa-fa-btc' => 'fab fa-btc', + 'fa-fa-building-o' => 'far fa-building', + 'fa-fa-buysellads' => 'fab fa-buysellads', + 'fa-fa-cab' => 'fas fa-taxi', + 'fa-fa-calendar-check-o' => 'far fa-calendar-check', + 'fa-fa-calendar-minus-o' => 'far fa-calendar-minus', + 'fa-fa-calendar-o' => 'far fa-calendar', + 'fa-fa-calendar-plus-o' => 'far fa-calendar-plus', + 'fa-fa-calendar-times-o' => 'far fa-calendar-times', + 'fa-fa-calendar' => 'fas fa-calendar-alt', + 'fa-fa-caret-square-o-down' => 'far fa-caret-square-down', + 'fa-fa-caret-square-o-left' => 'far fa-caret-square-left', + 'fa-fa-caret-square-o-right' => 'far fa-caret-square-right', + 'fa-fa-caret-square-o-up' => 'far fa-caret-square-up', + 'fa-fa-cc-amex' => 'fab fa-cc-amex', + 'fa-fa-cc-diners-club' => 'fab fa-cc-diners-club', + 'fa-fa-cc-discover' => 'fab fa-cc-discover', + 'fa-fa-cc-jcb' => 'fab fa-cc-jcb', + 'fa-fa-cc-mastercard' => 'fab fa-cc-mastercard', + 'fa-fa-cc-paypal' => 'fab fa-cc-paypal', + 'fa-fa-cc-stripe' => 'fab fa-cc-stripe', + 'fa-fa-cc-visa' => 'fab fa-cc-visa', + 'fa-fa-cc' => 'far fa-closed-captioning', + 'fa-fa-chain-broken' => 'fas fa-unlink', + 'fa-fa-chain' => 'fas fa-link', + 'fa-fa-check-circle-o' => 'far fa-check-circle', + 'fa-fa-check-square-o' => 'far fa-check-square', + 'fa-fa-chrome' => 'fab fa-chrome', + 'fa-fa-circle-o-notch' => 'fas fa-circle-notch', + 'fa-fa-circle-o' => 'far fa-circle', + 'fa-fa-circle-thin' => 'far fa-circle', + 'fa-fa-clipboard' => 'far fa-clipboard', + 'fa-fa-clock-o' => 'far fa-clock', + 'fa-fa-clone' => 'far fa-clone', + 'fa-fa-close' => 'fas fa-times', + 'fa-fa-cloud-download' => 'fas fa-cloud-download-alt', + 'fa-fa-cloud-upload' => 'fas fa-cloud-upload-alt', + 'fa-fa-cny' => 'fas fa-yen-sign', + 'fa-fa-code-fork' => 'fas fa-code-branch', + 'fa-fa-codepen' => 'fab fa-codepen', + 'fa-fa-codiepie' => 'fab fa-codiepie', + 'fa-fa-comment-o' => 'far fa-comment', + 'fa-fa-commenting-o' => 'far fa-comment-dots', + 'fa-fa-commenting' => 'fas fa-comment-dots', + 'fa-fa-comments-o' => 'far fa-comments', + 'fa-fa-compass' => 'far fa-compass', + 'fa-fa-connectdevelop' => 'fab fa-connectdevelop', + 'fa-fa-contao' => 'fab fa-contao', + 'fa-fa-copyright' => 'far fa-copyright', + 'fa-fa-creative-commons' => 'fab fa-creative-commons', + 'fa-fa-credit-card-alt' => 'fas fa-credit-card', + 'fa-fa-credit-card' => 'far fa-credit-card', + 'fa-fa-css3' => 'fab fa-css3', + 'fa-fa-cutlery' => 'fas fa-utensils', + 'fa-fa-dashboard' => 'fas fa-tachometer-alt', + 'fa-fa-dashcube' => 'fab fa-dashcube', + 'fa-fa-deafness' => 'fas fa-deaf', + 'fa-fa-dedent' => 'fas fa-outdent', + 'fa-fa-delicious' => 'fab fa-delicious', + 'fa-fa-deviantart' => 'fab fa-deviantart', + 'fa-fa-diamond' => 'far fa-gem', + 'fa-fa-digg' => 'fab fa-digg', + 'fa-fa-dollar' => 'fas fa-dollar-sign', + 'fa-fa-dot-circle-o' => 'far fa-dot-circle', + 'fa-fa-dribbble' => 'fab fa-dribbble', + 'fa-fa-drivers-license-o' => 'far fa-id-card', + 'fa-fa-drivers-license' => 'fas fa-id-card', + 'fa-fa-dropbox' => 'fab fa-dropbox', + 'fa-fa-drupal' => 'fab fa-drupal', + 'fa-fa-edge' => 'fab fa-edge', + 'fa-fa-eercast' => 'fab fa-sellcast', + 'fa-fa-empire' => 'fab fa-empire', + 'fa-fa-envelope-open-o' => 'far fa-envelope-open', + 'fa-fa-envelope-o' => 'far fa-envelope', + 'fa-fa-envira' => 'fab fa-envira', + 'fa-fa-etsy' => 'fab fa-etsy', + 'fa-fa-euro' => 'fas fa-euro-sign', + 'fa-fa-eur' => 'fas fa-euro-sign', + 'fa-fa-exchange' => 'fas fa-exchange-alt', + 'fa-fa-expeditedssl' => 'fab fa-expeditedssl', + 'fa-fa-external-link-square' => 'fas fa-external-link-square-alt', + 'fa-fa-external-link' => 'fas fa-external-link-alt', + 'fa-fa-eye-slash' => 'far fa-eye-slash', + 'fa-fa-eyedropper' => 'fas fa-eye-dropper', + 'fa-fa-eye' => 'far fa-eye', + 'fa-fa-facebook-f' => 'fab fa-facebook-f', + 'fa-fa-facebook-official' => 'fab fa-facebook', + 'fa-fa-facebook-square' => 'fab fa-facebook-square', + 'fa-fa-facebook' => 'fab fa-facebook-f', + 'fa-fa-feed' => 'fas fa-rss', + 'fa-fa-file-archive-o' => 'far fa-file-archive', + 'fa-fa-file-audio-o' => 'far fa-file-audio', + 'fa-fa-file-code-o' => 'far fa-file-code', + 'fa-fa-file-excel-o' => 'far fa-file-excel', + 'fa-fa-file-image-o' => 'far fa-file-image', + 'fa-fa-file-movie-o' => 'far fa-file-video', + 'fa-fa-file-o' => 'far fa-file', + 'fa-fa-file-pdf-o' => 'far fa-file-pdf', + 'fa-fa-file-photo-o' => 'far fa-file-image', + 'fa-fa-file-picture-o' => 'far fa-file-image', + 'fa-fa-file-powerpoint-o' => 'far fa-file-powerpoint', + 'fa-fa-file-sound-o' => 'far fa-file-audio', + 'fa-fa-file-text-o' => 'far fa-file-alt', + 'fa-fa-file-text' => 'fas fa-file-alt', + 'fa-fa-file-video-o' => 'far fa-file-video', + 'fa-fa-file-word-o' => 'far fa-file-word', + 'fa-fa-file-zip-o' => 'far fa-file-archive', + 'fa-fa-files-o' => 'far fa-copy', + 'fa-fa-firefox' => 'fab fa-firefox', + 'fa-fa-first-order' => 'fab fa-first-order', + 'fa-fa-flag-o' => 'far fa-flag', + 'fa-fa-flash' => 'fas fa-bolt', + 'fa-fa-flickr' => 'fab fa-flickr', + 'fa-fa-floppy-o' => 'far fa-save', + 'fa-fa-folder-o' => 'far fa-folder', + 'fa-fa-folder-open-o' => 'far fa-folder-open', + 'fa-fa-font-awesome' => 'fab fa-font-awesome', + 'fa-fa-fonticons' => 'fab fa-fonticons', + 'fa-fa-fort-awesome' => 'fab fa-fort-awesome', + 'fa-fa-forumbee' => 'fab fa-forumbee', + 'fa-fa-foursquare' => 'fab fa-foursquare', + 'fa-fa-free-code-camp' => 'fab fa-free-code-camp', + 'fa-fa-frown-o' => 'far fa-frown', + 'fa-fa-futbol-o' => 'far fa-futbol', + 'fa-fa-gbp' => 'fas fa-pound-sign', + 'fa-fa-gears' => 'fas fa-cogs', + 'fa-fa-gear' => 'fas fa-cog', + 'fa-fa-get-pocket' => 'fab fa-get-pocket', + 'fa-fa-ge' => 'fab fa-empire', + 'fa-fa-gg-circle' => 'fab fa-gg-circle', + 'fa-fa-gg' => 'fab fa-gg', + 'fa-fa-git-square' => 'fab fa-git-square', + 'fa-fa-github-alt' => 'fab fa-github-alt', + 'fa-fa-github-square' => 'fab fa-github-square', + 'fa-fa-github' => 'fab fa-github', + 'fa-fa-gitlab' => 'fab fa-gitlab', + 'fa-fa-gittip' => 'fab fa-gratipay', + 'fa-fa-git' => 'fab fa-git', + 'fa-fa-glass' => 'fas fa-glass-martini', + 'fa-fa-glide-g' => 'fab fa-glide-g', + 'fa-fa-glide' => 'fab fa-glide', + 'fa-fa-google-plus-circle' => 'fab fa-google-plus', + 'fa-fa-google-plus-official' => 'fab fa-google-plus', + 'fa-fa-google-plus-square' => 'fab fa-google-plus-square', + 'fa-fa-google-plus' => 'fab fa-google-plus-g', + 'fa-fa-google-wallet' => 'fab fa-google-wallet', + 'fa-fa-google' => 'fab fa-google', + 'fa-fa-gratipay' => 'fab fa-gratipay', + 'fa-fa-grav' => 'fab fa-grav', + 'fa-fa-group' => 'fas fa-users', + 'fa-fa-hacker-news' => 'fab fa-hacker-news', + 'fa-fa-hand-grab-o' => 'far fa-hand-rock', + 'fa-fa-hand-lizard-o' => 'far fa-hand-lizard', + 'fa-fa-hand-o-down' => 'far fa-hand-point-down', + 'fa-fa-hand-o-left' => 'far fa-hand-point-left', + 'fa-fa-hand-o-right' => 'far fa-hand-point-right', + 'fa-fa-hand-o-up' => 'far fa-hand-point-up', + 'fa-fa-hand-paper-o' => 'far fa-hand-paper', + 'fa-fa-hand-peace-o' => 'far fa-hand-peace', + 'fa-fa-hand-pointer-o' => 'far fa-hand-pointer', + 'fa-fa-hand-rock-o' => 'far fa-hand-rock', + 'fa-fa-hand-scissors-o' => 'far fa-hand-scissors', + 'fa-fa-hand-spock-o' => 'far fa-hand-spock', + 'fa-fa-hand-stop-o' => 'far fa-hand-paper', + 'fa-fa-handshake-o' => 'far fa-handshake', + 'fa-fa-hard-of-hearing' => 'fas fa-deaf', + 'fa-fa-hdd-o' => 'far fa-hdd', + 'fa-fa-header' => 'fas fa-heading', + 'fa-fa-heart-o' => 'far fa-heart', + 'fa-fa-hospital-o' => 'far fa-hospital', + 'fa-fa-hotel' => 'fas fa-bed', + 'fa-fa-hourglass-1' => 'fas fa-hourglass-start', + 'fa-fa-hourglass-2' => 'fas fa-hourglass-half', + 'fa-fa-hourglass-3' => 'fas fa-hourglass-end', + 'fa-fa-hourglass-o' => 'far fa-hourglass', + 'fa-fa-houzz' => 'fab fa-houzz', + 'fa-fa-html5' => 'fab fa-html5', + 'fa-fa-id-badge' => 'far fa-id-badge', + 'fa-fa-id-card-o' => 'far fa-id-card', + 'fa-fa-ils' => 'fas fa-shekel-sign', + 'fa-fa-image' => 'far fa-image', + 'fa-fa-imdb' => 'fab fa-imdb', + 'fa-fa-inr' => 'fas fa-rupee-sign', + 'fa-fa-instagram' => 'fab fa-instagram', + 'fa-fa-institution' => 'fas fa-university', + 'fa-fa-internet-explorer' => 'fab fa-internet-explorer', + 'fa-fa-intersex' => 'fas fa-transgender', + 'fa-fa-ioxhost' => 'fab fa-ioxhost', + 'fa-fa-joomla' => 'fab fa-joomla', + 'fa-fa-jpy' => 'fas fa-yen-sign', + 'fa-fa-jsfiddle' => 'fab fa-jsfiddle', + 'fa-fa-keyboard-o' => 'far fa-keyboard', + 'fa-fa-krw' => 'fas fa-won-sign', + 'fa-fa-lastfm-square' => 'fab fa-lastfm-square', + 'fa-fa-lastfm' => 'fab fa-lastfm', + 'fa-fa-leanpub' => 'fab fa-leanpub', + 'fa-fa-legal' => 'fas fa-gavel', + 'fa-fa-lemon-o' => 'far fa-lemon', + 'fa-fa-level-down' => 'fas fa-level-down-alt', + 'fa-fa-level-up' => 'fas fa-level-up-alt', + 'fa-fa-life-bouy' => 'far fa-life-ring', + 'fa-fa-life-buoy' => 'far fa-life-ring', + 'fa-fa-life-ring' => 'far fa-life-ring', + 'fa-fa-life-saver' => 'far fa-life-ring', + 'fa-fa-lightbulb-o' => 'far fa-lightbulb', + 'fa-fa-line-chart' => 'fas fa-chart-line', + 'fa-fa-linkedin-square' => 'fab fa-linkedin', + 'fa-fa-linkedin' => 'fab fa-linkedin-in', + 'fa-fa-linode' => 'fab fa-linode', + 'fa-fa-linux' => 'fab fa-linux', + 'fa-fa-list-alt' => 'far fa-list-alt', + 'fa-fa-long-arrow-down' => 'fas fa-long-arrow-alt-down', + 'fa-fa-long-arrow-left' => 'fas fa-long-arrow-alt-left', + 'fa-fa-long-arrow-right' => 'fas fa-long-arrow-alt-right', + 'fa-fa-long-arrow-up' => 'fas fa-long-arrow-alt-up', + 'fa-fa-mail-forward' => 'fas fa-share', + 'fa-fa-mail-reply-all' => 'fas fa-reply-all', + 'fa-fa-mail-reply' => 'fas fa-reply', + 'fa-fa-map-marker' => 'fas fa-map-marker-alt', + 'fa-fa-map-o' => 'far fa-map', + 'fa-fa-maxcdn' => 'fab fa-maxcdn', + 'fa-fa-meanpath' => 'fab fa-font-awesome', + 'fa-fa-medium' => 'fab fa-medium', + 'fa-fa-meetup' => 'fab fa-meetup', + 'fa-fa-meh-o' => 'far fa-meh', + 'fa-fa-minus-square-o' => 'far fa-minus-square', + 'fa-fa-mixcloud' => 'fab fa-mixcloud', + 'fa-fa-mobile-phone' => 'fas fa-mobile-alt', + 'fa-fa-mobile' => 'fas fa-mobile-alt', + 'fa-fa-modx' => 'fab fa-modx', + 'fa-fa-moon-o' => 'far fa-moon', + 'fa-fa-money' => 'far fa-money-bill-alt', + 'fa-fa-mortar-board' => 'fas fa-graduation-cap', + 'fa-fa-navicon' => 'fas fa-bars', + 'fa-fa-newspaper-o' => 'far fa-newspaper', + 'fa-fa-object-group' => 'far fa-object-group', + 'fa-fa-object-ungroup' => 'far fa-object-ungroup', + 'fa-fa-odnoklassniki-square' => 'fab fa-odnoklassniki-square', + 'fa-fa-odnoklassniki' => 'fab fa-odnoklassniki', + 'fa-fa-opencart' => 'fab fa-opencart', + 'fa-fa-openid' => 'fab fa-openid', + 'fa-fa-opera' => 'fab fa-opera', + 'fa-fa-optin-monster' => 'fab fa-optin-monster', + 'fa-fa-pagelines' => 'fab fa-pagelines', + 'fa-fa-paper-plane-o' => 'far fa-paper-plane', + 'fa-fa-paste' => 'far fa-clipboard', + 'fa-fa-pause-circle-o' => 'far fa-pause-circle', + 'fa-fa-paypal' => 'fab fa-paypal', + 'fa-fa-pencil-square' => 'fas fa-pen-square', + 'fa-fa-pencil-square-o' => 'far fa-edit', + 'fa-fa-pencil' => 'fas fa-pencil-alt', + 'fa-fa-photo' => 'far fa-image', + 'fa-fa-picture-o' => 'far fa-image', + 'fa-fa-pie-chart' => 'fas fa-chart-pie', + 'fa-fa-pied-piper-alt' => 'fab fa-pied-piper-alt', + 'fa-fa-pied-piper-pp' => 'fab fa-pied-piper-pp', + 'fa-fa-pied-piper' => 'fab fa-pied-piper', + 'fa-fa-pinterest-p' => 'fab fa-pinterest-p', + 'fa-fa-pinterest-square' => 'fab fa-pinterest-square', + 'fa-fa-pinterest' => 'fab fa-pinterest', + 'fa-fa-play-circle-o' => 'far fa-play-circle', + 'fa-fa-plus-square-o' => 'far fa-plus-square', + 'fa-fa-product-hunt' => 'fab fa-product-hunt', + 'fa-fa-qq' => 'fab fa-qq', + 'fa-fa-question-circle-o' => 'far fa-question-circle', + 'fa-fa-quora' => 'fab fa-quora', + 'fa-fa-ravelry' => 'fab fa-ravelry', + 'fa-fa-ra' => 'fab fa-rebel', + 'fa-fa-rebel' => 'fab fa-rebel', + 'fa-fa-reddit-alien' => 'fab fa-reddit-alien', + 'fa-fa-reddit-square' => 'fab fa-reddit-square', + 'fa-fa-reddit' => 'fab fa-reddit', + 'fa-fa-refresh' => 'fas fa-sync', + 'fa-fa-registered' => 'far fa-registered', + 'fa-fa-remove' => 'fas fa-times', + 'fa-fa-renren' => 'fab fa-renren', + 'fa-fa-reorder' => 'fas fa-bars', + 'fa-fa-repeat' => 'fas fa-redo', + 'fa-fa-resistance' => 'fab fa-rebel', + 'fa-fa-rmb' => 'fas fa-yen-sign', + 'fa-fa-rotate-left' => 'fas fa-undo', + 'fa-fa-rotate-right' => 'fas fa-redo', + 'fa-fa-rouble' => 'fas fa-ruble-sign', + 'fa-fa-ruble' => 'fas fa-ruble-sign', + 'fa-fa-rub' => 'fas fa-ruble-sign', + 'fa-fa-rupee' => 'fas fa-rupee-sign', + 'fa-fa-s15' => 'fas fa-bath', + 'fa-fa-safari' => 'fab fa-safari', + 'fa-fa-scissors' => 'fas fa-cut', + 'fa-fa-scribd' => 'fab fa-scribd', + 'fa-fa-sellsy' => 'fab fa-sellsy', + 'fa-fa-send-o' => 'far fa-paper-plane', + 'fa-fa-send' => 'fas fa-paper-plane', + 'fa-fa-share-square-o' => 'far fa-share-square', + 'fa-fa-shekel' => 'fas fa-shekel-sign', + 'fa-fa-sheqel' => 'fas fa-shekel-sign', + 'fa-fa-shield' => 'fas fa-shield-alt', + 'fa-fa-shirtsinbulk' => 'fab fa-shirtsinbulk', + 'fa-fa-sign-in' => 'fas fa-sign-in-alt', + 'fa-fa-sign-out' => 'fas fa-sign-out-alt', + 'fa-fa-signing' => 'fas fa-sign-language', + 'fa-fa-simplybuilt' => 'fab fa-simplybuilt', + 'fa-fa-skyatlas' => 'fab fa-skyatlas', + 'fa-fa-skype' => 'fab fa-skype', + 'fa-fa-slack' => 'fab fa-slack', + 'fa-fa-sliders' => 'fas fa-sliders-h', + 'fa-fa-slideshare' => 'fab fa-slideshare', + 'fa-fa-smile-o' => 'far fa-smile', + 'fa-fa-snapchat-ghost' => 'fab fa-snapchat-ghost', + 'fa-fa-snapchat-square' => 'fab fa-snapchat-square', + 'fa-fa-snapchat' => 'fab fa-snapchat', + 'fa-fa-snowflake-o' => 'far fa-snowflake', + 'fa-fa-soccer-ball-o' => 'far fa-futbol', + 'fa-fa-sort-alpha-asc' => 'fas fa-sort-alpha-down', + 'fa-fa-sort-alpha-desc' => 'fas fa-sort-alpha-up', + 'fa-fa-sort-amount-asc' => 'fas fa-sort-amount-down', + 'fa-fa-sort-amount-desc' => 'fas fa-sort-amount-up', + 'fa-fa-sort-asc' => 'fas fa-sort-up', + 'fa-fa-sort-desc' => 'fas fa-sort-down', + 'fa-fa-sort-numeric-asc' => 'fas fa-sort-numeric-down', + 'fa-fa-sort-numeric-desc' => 'fas fa-sort-numeric-up', + 'fa-fa-soundcloud' => 'fab fa-soundcloud', + 'fa-fa-spoon' => 'fas fa-utensil-spoon', + 'fa-fa-spotify' => 'fab fa-spotify', + 'fa-fa-square-o' => 'far fa-square', + 'fa-fa-stack-exchange' => 'fab fa-stack-exchange', + 'fa-fa-stack-overflow' => 'fab fa-stack-overflow', + 'fa-fa-star-half-empty' => 'far fa-star-half', + 'fa-fa-star-half-full' => 'far fa-star-half', + 'fa-fa-star-half-o' => 'far fa-star-half', + 'fa-fa-star-o' => 'far fa-star', + 'fa-fa-steam-square' => 'fab fa-steam-square', + 'fa-fa-steam' => 'fab fa-steam', + 'fa-fa-sticky-note-o' => 'far fa-sticky-note', + 'fa-fa-stop-circle-o' => 'far fa-stop-circle', + 'fa-fa-stumbleupon-circle' => 'fab fa-stumbleupon-circle', + 'fa-fa-stumbleupon' => 'fab fa-stumbleupon', + 'fa-fa-sun-o' => 'far fa-sun', + 'fa-fa-superpowers' => 'fab fa-superpowers', + 'fa-fa-support' => 'far fa-life-ring', + 'fa-fa-tablet' => 'fas fa-tablet-alt', + 'fa-fa-tachometer' => 'fas fa-tachometer-alt', + 'fa-fa-telegram' => 'fab fa-telegram', + 'fa-fa-television' => 'fas fa-tv', + 'fa-fa-tencent-weibo' => 'fab fa-tencent-weibo', + 'fa-fa-themeisle' => 'fab fa-themeisle', + 'fa-fa-thermometer-0' => 'fas fa-thermometer-empty', + 'fa-fa-thermometer-1' => 'fas fa-thermometer-quarter', + 'fa-fa-thermometer-2' => 'fas fa-thermometer-half', + 'fa-fa-thermometer-3' => 'fas fa-thermometer-three-quarters', + 'fa-fa-thermometer-4' => 'fas fa-thermometer-full', + 'fa-fa-thermometer' => 'fas fa-thermometer-full', + 'fa-fa-thumb-tack' => 'fas fa-thumbtack', + 'fa-fa-thumbs-o-down' => 'far fa-thumbs-down', + 'fa-fa-thumbs-o-up' => 'far fa-thumbs-up', + 'fa-fa-ticket' => 'fas fa-ticket-alt', + 'fa-fa-times-circle-o' => 'far fa-times-circle', + 'fa-fa-times-rectangle-o' => 'far fa-window-close', + 'fa-fa-times-rectangle' => 'fas fa-window-close', + 'fa-fa-toggle-down' => 'far fa-caret-square-down', + 'fa-fa-toggle-left' => 'far fa-caret-square-left', + 'fa-fa-toggle-right' => 'far fa-caret-square-right', + 'fa-fa-toggle-up' => 'far fa-caret-square-up', + 'fa-fa-trash-o' => 'far fa-trash-alt', + 'fa-fa-trash' => 'fas fa-trash-alt', + 'fa-fa-trello' => 'fab fa-trello', + 'fa-fa-tripadvisor' => 'fab fa-tripadvisor', + 'fa-fa-try' => 'fas fa-lira-sign', + 'fa-fa-tumblr-square' => 'fab fa-tumblr-square', + 'fa-fa-tumblr' => 'fab fa-tumblr', + 'fa-fa-turkish-lira' => 'fas fa-lira-sign', + 'fa-fa-twitch' => 'fab fa-twitch', + 'fa-fa-twitter-square' => 'fab fa-twitter-square', + 'fa-fa-twitter' => 'fab fa-twitter', + 'fa-fa-unsorted' => 'fas fa-sort', + 'fa-fa-usb' => 'fab fa-usb', + 'fa-fa-usd' => 'fas fa-dollar-sign', + 'fa-fa-user-circle-o' => 'far fa-user-circle', + 'fa-fa-user-o' => 'far fa-user', + 'fa-fa-vcard-o' => 'far fa-address-card', + 'fa-fa-vcard' => 'fas fa-address-card', + 'fa-fa-viacoin' => 'fab fa-viacoin', + 'fa-fa-viadeo-square' => 'fab fa-viadeo-square', + 'fa-fa-viadeo' => 'fab fa-viadeo', + 'fa-fa-video-camera' => 'fas fa-video', + 'fa-fa-vimeo-square' => 'fab fa-vimeo-square', + 'fa-fa-vimeo' => 'fab fa-vimeo-v', + 'fa-fa-vine' => 'fab fa-vine', + 'fa-fa-vk' => 'fab fa-vk', + 'fa-fa-volume-control-phone' => 'fas fa-phone-volume', + 'fa-fa-warning' => 'fas fa-exclamation-triangle', + 'fa-fa-wechat' => 'fab fa-weixin', + 'fa-fa-weibo' => 'fab fa-weibo', + 'fa-fa-weixin' => 'fab fa-weixin', + 'fa-fa-whatsapp' => 'fab fa-whatsapp', + 'fa-fa-wheelchair-alt' => 'fab fa-accessible-icon', + 'fa-fa-wikipedia-w' => 'fab fa-wikipedia-w', + 'fa-fa-window-close-o' => 'far fa-window-close', + 'fa-fa-window-maximize' => 'far fa-window-maximize', + 'fa-fa-window-restore' => 'far fa-window-restore', + 'fa-fa-windows' => 'fab fa-windows', + 'fa-fa-won' => 'fas fa-won-sign', + 'fa-fa-wordpress' => 'fab fa-wordpress', + 'fa-fa-wpbeginner' => 'fab fa-wpbeginner', + 'fa-fa-wpexplorer' => 'fab fa-wpexplorer', + 'fa-fa-wpforms' => 'fab fa-wpforms', + 'fa-fa-xing-square' => 'fab fa-xing-square', + 'fa-fa-xing' => 'fab fa-xing', + 'fa-fa-y-combinator-square' => 'fab fa-hacker-news', + 'fa-fa-y-combinator' => 'fab fa-y-combinator', + 'fa-fa-yahoo' => 'fab fa-yahoo', + 'fa-fa-yc' => 'fab fa-y-combinator', + 'fa-fa-yc-square' => 'fab fa-hacker-news', + 'fa-fa-yelp' => 'fab fa-yelp', + 'fa-fa-yen' => 'fas fa-yen-sign', + 'fa-fa-yoast' => 'fab fa-yoast', + 'fa-fa-youtube-play' => 'fab fa-youtube', + 'fa-fa-youtube-square' => 'fab fa-youtube-square', + 'fa-fa-youtube' => 'fab fa-youtube', + 'fa-fa-fa' => 'fab fa-font-awesome', + ); + $font_awesome_icon = apply_filters( 'menu_icons_backward_compatibility_icons', $font_awesome_icon ); + + return $font_awesome_icon; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/font-awesome/font-awesome.php b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/font-awesome/font-awesome.php new file mode 100644 index 00000000..3f674bf4 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/font-awesome/font-awesome.php @@ -0,0 +1,122 @@ +version + ); + } + + return $stylesheet_uri; + } + + + /** + * Icon picker fontawesome items. + * + * @param array $icons Icons. + * @return array Icons. + */ + public static function _icon_picker_fa_items( $icons ) { + if ( empty( $icons ) ) { + return $icons; + } + + $deprecated_icons = array_search( 'fa-tripadvisor', array_column( $icons, 'id' ), true ); + if ( false !== $deprecated_icons ) { + unset( $icons[ $deprecated_icons ] ); + $icons = array_values( $icons ); + } + + $font_awesome = font_awesome_backward_compatible(); + foreach ( $icons as $key => $icon ) { + $old_fa_icon = sprintf( 'fa-%s', $icons[ $key ]['id'] ); + if ( array_key_exists( $old_fa_icon, $font_awesome ) ) { + $icons[ $key ]['id'] = trim( $font_awesome[ $old_fa_icon ] ); + } else { + $icons[ $key ]['id'] = sprintf( 'fa %s', trim( $icons[ $key ]['id'] ) ); + } + } + + // Fa5 extra icons support. + $global_settins = get_option( 'menu-icons', false ); + if ( ! empty( $global_settins['global']['fa5_extra_icons'] ) ) { + $fa5_extra_icons = $global_settins['global']['fa5_extra_icons']; + $fa5_extra_icons = explode( ',', $fa5_extra_icons ); + $fa5_extra_icons = array_map( 'trim', $fa5_extra_icons ); + if ( ! empty( $fa5_extra_icons ) ) { + foreach ( $fa5_extra_icons as $fa5_icon ) { + $icon_name = explode( '-', $fa5_icon ); + $icon_name = end( $icon_name ); + $icons[] = array( + 'group' => 'all', + 'id' => $fa5_icon, + 'name' => $icon_name, + ); + } + } + } + + return $icons; + } + + + /** + * Icon picker font media template. + * + * @param string $template Media template. + * @return string Media template. + */ + public static function _icon_picker_font_media_templates( $template ) { + $templates = array( + 'icon' => '', + 'item' => sprintf( + '
+
+ +
{{ data.name }}
+
+
+
', + esc_attr__( 'Deselect', 'icon-picker' ) + ), + ); + + return $templates; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/form-fields.php b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/form-fields.php new file mode 100644 index 00000000..a63962ce --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/form-fields.php @@ -0,0 +1,575 @@ + + */ + +/** + * Form Fields + */ +abstract class Kucrut_Form_Field { + + /** + * Holds field & argument defaults + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected static $defaults = array( + 'field' => array( + 'id' => '', + 'type' => 'text', + 'value' => null, + 'default' => null, + 'attributes' => array(), + 'description' => '', + 'choices' => array(), + ), + 'args' => array( + 'keys' => array(), + 'inline_description' => false, + ), + ); + + /** + * Holds field attributes + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected static $types = array( + 'text' => 'Kucrut_Form_Field_Text', + 'number' => 'Kucrut_Form_Field_Text', + 'url' => 'Kucrut_Form_Field_Text', + 'color' => 'Kucrut_Form_Field_Text', + 'date' => 'Kucrut_Form_Field_Text', + 'hidden' => 'Kucrut_Form_Field_Text', + 'checkbox' => 'Kucrut_Form_Field_Checkbox', + 'radio' => 'Kucrut_Form_Field_Radio', + 'textarea' => 'Kucrut_Form_Field_Textarea', + 'select' => 'Kucrut_Form_Field_Select', + 'select_multiple' => 'Kucrut_Form_Field_Select_Multiple', + 'select_pages' => 'Kucrut_Form_Field_Select_Pages', + 'special' => 'Kucrut_Form_Field_Special', + ); + + /** + * Holds forbidden attributes + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected static $forbidden_attributes = array( + 'id', + 'name', + 'value', + 'checked', + 'multiple', + ); + + /** + * Holds allowed html tags + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected $allowed_html = array( + 'a' => array( + 'href' => true, + 'target' => true, + 'title' => true, + ), + 'code' => true, + 'em' => true, + 'p' => array( 'class' => true ), + 'span' => array( 'class' => true ), + 'strong' => true, + ); + + /** + * Holds constructed field + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected $field; + + + /** + * Holds field attributes + * + * @since 0.1.0 + * @var array + * @access protected + */ + protected $attributes = array(); + + + /** + * Loader + * + * @param string URL path to this directory + */ + final public static function load( $url_path = null ) { + // Set URL path for assets + if ( ! is_null( $url_path ) ) { + self::$url_path = $url_path; + } else { + self::$url_path = plugin_dir_url( __FILE__ ); + } + + // Supported field types + self::$types = apply_filters( + 'form_field_types', + self::$types + ); + } + + + /** + * Create field + * + * @param array $field Field array + * @param array $args Extra field arguments + */ + final public static function create( array $field, $args = array() ) { + $field = wp_parse_args( $field, self::$defaults['field'] ); + if ( ! isset( self::$types[ $field['type'] ] ) + || ! is_subclass_of( self::$types[ $field['type'] ], __CLASS__ ) + ) { + trigger_error( + sprintf( + esc_html__( '%1$s: Type %2$s is not supported, reverting to text.', 'menu-icons' ), + __CLASS__, + esc_html( $field['type'] ) + ), + E_USER_WARNING + ); + $field['type'] = 'text'; + } + + if ( is_null( $field['value'] ) && ! is_null( $field['default'] ) ) { + $field['value'] = $field['default']; + } + + foreach ( self::$forbidden_attributes as $key ) { + unset( $field['attributes'][ $key ] ); + } + + $args = (object) wp_parse_args( $args, self::$defaults['args'] ); + $class = self::$types[ $field['type'] ]; + + return new $class( $field, $args ); + } + + + /** + * Constructor + * + * @since 0.1.0 + * @param array $field Field array + * @param object $args Extra field arguments + */ + public function __construct( $field, $args ) { + $this->field = $field; + $this->args = $args; + + if ( ! is_array( $this->args->keys ) ) { + $this->args->keys = array(); + } + $this->args->keys[] = $field['id']; + + $this->attributes['id'] = $this->create_id(); + $this->attributes['name'] = $this->create_name(); + + $this->attributes = wp_parse_args( + $this->attributes, + (array) $field['attributes'] + ); + + $this->set_properties(); + } + + + /** + * Attribute + * + * @since 0.1.0 + * @param string $key Attribute key + * @return mixed NULL if attribute doesn't exist + */ + public function __get( $key ) { + foreach ( array( 'attributes', 'field' ) as $group ) { + if ( isset( $this->{$group}[ $key ] ) ) { + return $this->{$group}[ $key ]; + } + } + + return null; + } + + + /** + * Create id/name attribute + * + * @since 0.1.0 + * @param string $format Attribute format + */ + protected function create_id_name( $format ) { + return call_user_func_array( + 'sprintf', + array_merge( + array( $format ), + $this->args->keys + ) + ); + } + + + /** + * Create id attribute + * + * @since 0.1.0 + * @access protected + * @return string + */ + protected function create_id() { + $format = implode( '-', $this->args->keys ); + + return $this->create_id_name( $format ); + } + + + /** + * Create name attribute + * + * @since 0.1.0 + * @access protected + * @return string + */ + protected function create_name() { + $format = '%s'; + $format .= str_repeat( '[%s]', ( count( $this->args->keys ) - 1 ) ); + + return $this->create_id_name( $format ); + } + + + /** + * Set field properties + * + * @since 0.1.0 + */ + protected function set_properties() {} + + + /** + * Build field attributes + * + * @since 0.1.0 + * @param array $excludes Attributes to be excluded + * @return string + */ + protected function build_attributes( $excludes = array() ) { + $excludes = array_filter( (array) $excludes ); + $attributes = ''; + + foreach ( $this->attributes as $key => $value ) { + if ( in_array( $key, $excludes, true ) ) { + continue; + } + + if ( 'class' === $key ) { + $value = implode( ' ', (array) $value ); + } + + $attributes .= sprintf( + ' %s="%s"', + esc_attr( $key ), + esc_attr( $value ) + ); + } + + return $attributes; + } + + + /** + * Print field + * + * @since 0.1.0 + */ + abstract public function render(); + + + /** + * Print field description + * + * @since 0.1.0 + */ + public function description() { + if ( ! empty( $this->field['description'] ) ) { + $tag = ( ! empty( $this->args->inline_description ) ) ? 'span' : 'p'; + + printf( // WPCS: XSS ok. + '<%1$s class="description">%2$s', + $tag, + wp_kses( $this->field['description'], $this->allowed_html ) + ); + } + } +} + + +/** + * Field: text + */ +class Kucrut_Form_Field_Text extends Kucrut_Form_Field { + + protected $template = ''; + + + protected function set_properties() { + if ( ! is_string( $this->field['value'] ) ) { + $this->field['value'] = ''; + } + + if ( in_array( $this->field['type'], array( 'text', 'url' ), true ) ) { + if ( ! isset( $this->attributes['class'] ) ) { + $this->attributes['class'] = array(); + } + $this->attributes['class'] = array_unique( + array_merge( + array( 'regular-text' ), + $this->attributes['class'] + ) + ); + } + } + + + public function render() { + printf( // WPCS: xss ok + $this->template, + esc_attr( $this->field['type'] ), + esc_attr( $this->field['value'] ), + $this->build_attributes() + ); + $this->description(); + } +} + + +/** + * Field: Textarea + */ +class Kucrut_Form_Field_Textarea extends Kucrut_Form_Field { + + protected $template = '%s'; + + protected $attributes = array( + 'class' => 'widefat', + 'cols' => 50, + 'rows' => 5, + ); + + + public function render() { + printf( // WPCS: XSS ok. + $this->template, + $this->build_attributes(), + esc_textarea( $this->field['value'] ) + ); + } +} + + +/** + * Field: Checkbox + */ +class Kucrut_Form_Field_Checkbox extends Kucrut_Form_Field { + + protected $template = '
'; + + + protected function set_properties() { + $this->field['value'] = array_filter( (array) $this->field['value'] ); + $this->attributes['name'] .= '[]'; + } + + + protected function checked( $value ) { + return checked( in_array( $value, $this->field['value'], true ), true, false ); + } + + + public function render() { + foreach ( $this->field['choices'] as $value => $label ) { + printf( // WPCS: XSS ok. + $this->template, + $this->field['type'], + esc_attr( $value ), + $this->checked( $value ), + $this->build_attributes( 'id' ), + esc_html( $label ) + ); + } + } +} + + +/** + * Field: Radio + */ +class Kucrut_Form_Field_Radio extends Kucrut_Form_Field_Checkbox { + + protected function set_properties() { + if ( ! is_string( $this->field['value'] ) ) { + $this->field['value'] = ''; + } + } + + + protected function checked( $value ) { + return checked( $value, $this->field['value'], false ); + } +} + + +/** + * Field: Select + */ +class Kucrut_Form_Field_Select extends Kucrut_Form_Field { + + protected $template = ''; + + + protected function set_properties() { + if ( ! is_string( $this->field['value'] ) ) { + $this->field['value'] = ''; + } + } + + + protected function selected( $value ) { + return selected( ( $value === $this->field['value'] ), true, false ); + } + + + public function render() { + ?> + build_attributes() // xss ok ?>> + field['choices'] as $index => $choice ) : ?> + + template, + esc_attr( $value ), + $this->selected( $value ), + esc_html( $label ) + ); + ?> + + + field['value'] = array_filter( (array) $this->field['value'] ); + $this->attributes['name'] .= '[]'; + $this->attributes['multiple'] = 'multiple'; + } + + + protected function selected( $value ) { + return selected( in_array( $value, $this->field['value'], true ), true, false ); + } +} + + +/** + * Field: Select Pages + */ +class Kucrut_Form_Field_Select_Pages extends Kucrut_Form_Field_Select { + + protected $wp_dropdown_pages_args = array( + 'depth' => 0, + 'child_of' => 0, + 'option_none_value' => '', + ); + + + public function __construct( $field, $args ) { + $this->wp_dropdown_pages_args['show_option_none'] = __( '— Select —', 'menu-icons' ); + parent::__construct( $field, $args ); + } + + + public function set_properties() { + parent::set_properties(); + + if ( empty( $this->args->wp_dropdown_pages_args ) ) { + $this->args->wp_dropdown_pages_args = array(); + } + + // Apply defeaults + $this->args->wp_dropdown_pages_args = wp_parse_args( + $this->args->wp_dropdown_pages_args, + $this->wp_dropdown_pages_args + ); + + // Force some args + $this->args->wp_dropdown_pages_args = array_merge( + $this->args->wp_dropdown_pages_args, + array( + 'echo' => true, + 'name' => $this->attributes['name'], + 'id' => $this->attributes['id'], + 'selected' => $this->field['value'], + ) + ); + } + + + public function render() { + wp_dropdown_pages( $this->args->wp_dropdown_pages_args ); // WPCS: XSS ok. + } +} + + +/** + * Field: Special (Callback) + */ +class Kucrut_Form_Field_Special extends Kucrut_Form_Field { + public function render() { + call_user_func_array( + $this->field['render_cb'], + array( $this ) + ); + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/functions.php b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/functions.php new file mode 100644 index 00000000..7985369a --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/library/functions.php @@ -0,0 +1,111 @@ + + */ + + +if ( ! function_exists( 'kucrut_get_array_value_deep' ) ) { + /** + * Get value of a multidimensional array + * + * @since 0.1.0 + * @param array $array Haystack + * @param array $keys Needles + * @return mixed + */ + function kucrut_get_array_value_deep( array $array, array $keys ) { + if ( empty( $array ) || empty( $keys ) ) { + return $array; + } + + foreach ( $keys as $idx => $key ) { + unset( $keys[ $idx ] ); + + if ( ! isset( $array[ $key ] ) ) { + return null; + } + + if ( ! empty( $keys ) ) { + $array = $array[ $key ]; + } + } + + if ( ! isset( $array[ $key ] ) ) { + return null; + } + + return $array[ $key ]; + } +} + + +if ( ! function_exists( 'kucrut_validate' ) ) { + /** + * Validate settings values + * + * @param array $values Settings values + * @return array + */ + function kucrut_validate( $values, $sanitize_cb = 'wp_kses_data' ) { + foreach ( $values as $key => $value ) { + if ( is_array( $value ) ) { + $values[ $key ] = kucrut_validate( $value ); + } else { + $values[ $key ] = call_user_func_array( + $sanitize_cb, + array( $value ) + ); + } + } + + return $values; + } +} + + +if ( ! function_exists( 'kucrut_get_image_sizes' ) ) { + /** + * Get image sizes + * + * @since 0.9.0 + * @access protected + * @return array + */ + function kucrut_get_image_sizes() { + $_sizes = array( + 'thumbnail' => __( 'Thumbnail', 'menu-icons' ), + 'medium' => __( 'Medium', 'menu-icons' ), + 'large' => __( 'Large', 'menu-icons' ), + 'full' => __( 'Full Size', 'menu-icons' ), + ); + + $_sizes = apply_filters( 'image_size_names_choose', $_sizes ); + + $sizes = array(); + foreach ( $_sizes as $value => $label ) { + $sizes[] = array( + 'value' => $value, + 'label' => $label, + ); + } + + return $sizes; + } +} + + +if ( ! function_exists( 'kucrut_get_script_suffix' ) ) { + /** + * Get script & style suffix + * + * When SCRIPT_DEBUG is defined true, this will return '.min'. + * + * @return string + */ + function kucrut_get_script_suffix() { + return ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/media-template.php b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/media-template.php new file mode 100644 index 00000000..4749e150 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/media-template.php @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ +final class Menu_Icons_Meta { + + const KEY = 'menu-icons'; + + /** + * Default meta value + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $defaults = array( + 'type' => '', + 'icon' => '', + 'url' => '', + ); + + + /** + * Initialize metadata functionalities + * + * @since 0.9.0 + */ + public static function init() { + add_filter( 'is_protected_meta', array( __CLASS__, '_protect_meta_key' ), 10, 3 ); + } + + + /** + * Protect meta key + * + * This prevents our meta key from showing up on Custom Fields meta box. + * + * @since 0.3.0 + * @wp_hook filter is_protected_meta + * @param bool $protected Protection status. + * @param string $meta_key Meta key. + * @param string $meta_type Meta type. + * @return bool Protection status. + */ + public static function _protect_meta_key( $protected, $meta_key, $meta_type ) { + if ( self::KEY === $meta_key ) { + $protected = true; + } + + return $protected; + } + + + /** + * Get menu item meta value + * + * @since 0.3.0 + * @since 0.9.0 Add $defaults parameter. + * @param int $id Menu item ID. + * @param array $defaults Optional. Default value. + * @return array + */ + public static function get( $id, $defaults = array() ) { + $defaults = wp_parse_args( $defaults, self::$defaults ); + $value = get_post_meta( $id, self::KEY, true ); + $value = wp_parse_args( (array) $value, $defaults ); + + if ( ! empty( $value['type'] ) && 'fa' === $value['type'] ) { + if ( ! empty( $value['icon'] ) && count( explode( ' ', $value['icon'] ) ) <= 1 ) { + $value['icon'] = sprintf( 'fa %s', $value['icon'] ); + } + } + + $font_awesome5 = font_awesome_backward_compatible(); + $icon = ! empty( $value['icon'] ) ? $value['icon'] : ''; + $icon = explode( ' ', $icon ); + $icon = sprintf( '%s-%s', reset( $icon ), end( $icon ) ); + + if ( ! empty( $font_awesome5[ $icon ] ) ) { + $value['icon'] = $font_awesome5[ $icon ]; + } + + // Backward-compatibility. + if ( empty( $value['icon'] ) && + ! empty( $value['type'] ) && + ! empty( $value[ "{$value['type']}-icon" ] ) + ) { + $value['icon'] = $value[ "{$value['type']}-icon" ]; + } + + if ( ! empty( $value['width'] ) ) { + $value['svg_width'] = $value['width']; + } + unset( $value['width'] ); + + if ( isset( $value['position'] ) && + ! in_array( $value['position'], array( 'before', 'after' ), true ) + ) { + $value['position'] = $defaults['position']; + } + + if ( isset( $value['size'] ) && ! isset( $value['font_size'] ) ) { + $value['font_size'] = $value['size']; + unset( $value['size'] ); + } + + // The values below will NOT be saved + if ( ! empty( $value['icon'] ) && + in_array( $value['type'], array( 'image', 'svg' ), true ) + ) { + $value['url'] = wp_get_attachment_image_url( $value['icon'], 'thumbnail', false ); + } + + return $value; + } + + + /** + * Update menu item metadata + * + * @since 0.9.0 + * + * @param int $id Menu item ID. + * @param mixed $value Metadata value. + * + * @return void + */ + public static function update( $id, $value ) { + /** + * Allow plugins/themes to filter the values + * + * Deprecated. + * + * @since 0.1.0 + * @param array $value Metadata value. + * @param int $id Menu item ID. + */ + $_value = apply_filters( 'menu_icons_values', $value, $id ); + + if ( $_value !== $value && WP_DEBUG ) { + _deprecated_function( 'menu_icons_values', '0.8.0', 'menu_icons_item_meta_values' ); + } + + /** + * Allow plugins/themes to filter the values + * + * @since 0.8.0 + * @param array $value Metadata value. + * @param int $id Menu item ID. + */ + $value = apply_filters( 'menu_icons_item_meta_values', $_value, $id ); + + // Don't bother saving if `type` or `icon` is not set. + if ( empty( $value['type'] ) || empty( $value['icon'] ) ) { + $value = false; + } + + // Update + if ( ! empty( $value ) ) { + update_post_meta( $id, self::KEY, $value ); + } else { + delete_post_meta( $id, self::KEY ); + } + } +} diff --git a/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/picker.php b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/picker.php new file mode 100644 index 00000000..f653abe6 --- /dev/null +++ b/wp-content/upgrade-temp-backup/plugins/menu-icons/includes/picker.php @@ -0,0 +1,305 @@ + + */ + + +/** + * Nav menu admin + */ +final class Menu_Icons_Picker { + + /** + * Initialize class + * + * @since 0.1.0 + */ + public static function init() { + add_action( 'load-nav-menus.php', array( __CLASS__, '_load_nav_menus' ) ); + add_filter( 'wp_nav_menu_item_custom_fields', array( __CLASS__, '_fields' ), 10, 4 ); + add_filter( 'manage_nav-menus_columns', array( __CLASS__, '_columns' ), 99 ); + add_action( 'wp_update_nav_menu_item', array( __CLASS__, '_save' ), 10, 3 ); + add_filter( 'icon_picker_type_props', array( __CLASS__, '_add_extra_type_props_data' ), 10, 3 ); + + if ( ! version_compare( get_bloginfo( 'version' ), '5.4', '>=' ) ) { + add_filter( + 'wp_edit_nav_menu_walker', function() { + return 'Menu_Item_Custom_Fields_Walker'; + }, 99 + ); + } + } + + + /** + * Load Icon Picker + * + * @since 0.9.0 + * @wp_hook action load-nav-menus.php + */ + public static function _load_nav_menus() { + Icon_Picker::instance()->load(); + + add_action( 'print_media_templates', array( __CLASS__, '_media_templates' ) ); + } + + + /** + * Get menu item setting fields + * + * @since 0.9.0 + * @access protected + * @param array $meta Menu item meta value. + * @return array + */ + protected static function _get_menu_item_fields( $meta ) { + $fa_icon = sprintf( '%s-%s', $meta['type'], $meta['icon'] ); + $font_awesome5 = font_awesome_backward_compatible(); + + if ( array_key_exists( $fa_icon, $font_awesome5 ) ) { + $fa5_icon = $font_awesome5[ $fa_icon ]; + $fa5_class = explode( ' ', $fa5_icon ); + $type = reset( $fa5_class ); + $icon = end( $fa5_class ); + $meta['icon'] = sprintf( '%s %s', $type, $icon ); + } + + $fields = array_merge( + array( + array( + 'id' => 'type', + 'label' => __( 'Type', 'menu-icons' ), + 'value' => $meta['type'], + ), + array( + 'id' => 'icon', + 'label' => __( 'Icon', 'menu-icons' ), + 'value' => $meta['icon'], + ), + ), + Menu_Icons_Settings::get_settings_fields( $meta ) + ); + + return $fields; + } + + + /** + * Print fields + * + * @since 0.1.0 + * @access protected + * @uses add_action() Calls 'menu_icons_before_fields' hook + * @uses add_action() Calls 'menu_icons_after_fields' hook + * @wp_hook action menu_item_custom_fields + * + * @param object $item Menu item data object. + * @param int $depth Nav menu depth. + * @param array $args Menu item args. + * @param int $id Nav menu ID. + * + * @return string Form fields + */ + public static function _fields( $id, $item, $depth, $args ) { + $input_id = sprintf( 'menu-icons-%d', $item->ID ); + $input_name = sprintf( 'menu-icons[%d]', $item->ID ); + $menu_settings = Menu_Icons_Settings::get_menu_settings( Menu_Icons_Settings::get_current_menu_id() ); + $meta = Menu_Icons_Meta::get( $item->ID, $menu_settings ); + $fields = self::_get_menu_item_fields( $meta ); + ?> + + id ) { + return; + } + + check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); + + // Sanitize + if ( ! empty( $_POST['menu-icons'][ $menu_item_db_id ] ) ) { + $value = array_map( + 'sanitize_text_field', + wp_unslash( (array) $_POST['menu-icons'][ $menu_item_db_id ] ) + ); + } else { + $value = array(); + } + + Menu_Icons_Meta::update( $menu_item_db_id, $value ); + } + + + /** + * Get and print media templates from all types + * + * @since 0.2.0 + * @since 0.9.0 Deprecate menu_icons_media_templates filter. + * @wp_hook action print_media_templates + */ + public static function _media_templates() { + $id_prefix = 'tmpl-menu-icons'; + + // Deprecated. + $templates = apply_filters( 'menu_icons_media_templates', array() ); + + if ( ! empty( $templates ) ) { + if ( WP_DEBUG ) { + _deprecated_function( 'menu_icons_media_templates', '0.9.0', 'menu_icons_js_templates' ); + } + + foreach ( $templates as $key => $template ) { + $id = sprintf( '%s-%s', $id_prefix, $key ); + self::_print_tempate( $id, $template ); + } + } + + require_once dirname( __FILE__ ) . '/media-template.php'; + } + + + /** + * Print media template + * + * @since 0.2.0 + * @param string $id Template ID. + * @param string $template Media template HTML. + */ + protected static function _print_tempate( $id, $template ) { + ?> + + + */ + +/** + * Menu Icons Settings module + */ +final class Menu_Icons_Settings { + + const UPDATE_KEY = 'menu-icons-settings-update'; + + const RESET_KEY = 'menu-icons-settings-reset'; + + const TRANSIENT_KEY = 'menu_icons_message'; + + /** + * Default setting values + * + * @since 0.3.0 + * @var array + * @access protected + */ + protected static $defaults = array( + 'global' => array( + 'icon_types' => array( 'dashicons' ), + ), + ); + + /** + * Setting values + * + * @since 0.3.0 + * @var array + * @access protected + */ + protected static $settings = array(); + + /** + * Script dependencies + * + * @since 0.9.0 + * @access protected + * @var array + */ + protected static $script_deps = array( 'jquery' ); + + /** + * Settings init + * + * @since 0.3.0 + */ + public static function init() { + // Include Menu Icons for Block Editor + if ( class_exists( '\ThemeIsle\GutenbergMenuIcons' ) ) { + \ThemeIsle\GutenbergMenuIcons::instance(); + add_action( 'enqueue_block_assets', array( __CLASS__, '_enqueue_font_awesome' ) ); + } + + /** + * Allow themes/plugins to override the default settings + * + * @since 0.9.0 + * + * @param array $default_settings Default settings. + */ + self::$defaults = apply_filters( 'menu_icons_settings_defaults', self::$defaults ); + + self::$settings = get_option( 'menu-icons', self::$defaults ); + + foreach ( self::$settings as $key => &$value ) { + if ( 'global' === $key ) { + // Remove unregistered icon types. + $value['icon_types'] = array_values( + array_intersect( + array_keys( Menu_Icons::get( 'types' ) ), + array_filter( (array) $value['icon_types'] ) + ) + ); + } else { + // Backward-compatibility. + if ( isset( $value['width'] ) && ! isset( $value['svg_width'] ) ) { + $value['svg_width'] = $value['width']; + } + + unset( $value['width'] ); + } + } + + unset( $value ); + + /** + * Allow themes/plugins to override the settings + * + * @since 0.9.0 + * + * @param array $settings Menu Icons settings. + */ + self::$settings = apply_filters( 'menu_icons_settings', self::$settings ); + + if ( self::is_menu_icons_disabled_for_menu() ) { + return; + } + + if ( ! empty( self::$settings['global']['icon_types'] ) ) { + require_once Menu_Icons::get( 'dir' ) . 'includes/picker.php'; + Menu_Icons_Picker::init(); + self::$script_deps[] = 'icon-picker'; + } + + add_action( 'load-nav-menus.php', array( __CLASS__, '_load_nav_menus' ), 1 ); + add_action( 'wp_ajax_menu_icons_update_settings', array( __CLASS__, '_ajax_menu_icons_update_settings' ) ); + } + + /** + * Check if menu icons is disabled for a menu + * + * @since 0.8.0 + * + * @param int $menu_id Menu ID. Defaults to current menu being edited. + * + * @return bool + */ + public static function is_menu_icons_disabled_for_menu( $menu_id = 0 ) { + if ( empty( $menu_id ) ) { + $menu_id = self::get_current_menu_id(); + } + + // When we're creating a new menu or the recently edited menu + // could not be found. + if ( empty( $menu_id ) ) { + return true; + } + + $menu_settings = self::get_menu_settings( $menu_id ); + $is_disabled = ! empty( $menu_settings['disabled'] ); + + return $is_disabled; + } + + /** + * Get ID of menu being edited + * + * @since 0.7.0 + * @since 0.8.0 Get the recently edited menu from user option. + * + * @return int + */ + public static function get_current_menu_id() { + global $nav_menu_selected_id; + + if ( ! empty( $nav_menu_selected_id ) ) { + return $nav_menu_selected_id; + } + + if ( is_admin() && isset( $_REQUEST['menu'] ) ) { + $menu_id = absint( $_REQUEST['menu'] ); + } else { + $menu_id = absint( get_user_option( 'nav_menu_recently_edited' ) ); + } + + return $menu_id; + } + + /** + * Get menu settings + * + * @since 0.3.0 + * + * @param int $menu_id + * + * @return array + */ + public static function get_menu_settings( $menu_id ) { + $menu_settings = self::get( sprintf( 'menu_%d', $menu_id ) ); + $menu_settings = apply_filters( 'menu_icons_menu_settings', $menu_settings, $menu_id ); + + if ( ! is_array( $menu_settings ) ) { + $menu_settings = array(); + } + + return $menu_settings; + } + + /** + * Get setting value + * + * @since 0.3.0 + * @return mixed + */ + public static function get() { + $args = func_get_args(); + + return kucrut_get_array_value_deep( self::$settings, $args ); + } + + /** + * Prepare wp-admin/nav-menus.php page + * + * @since 0.3.0 + * @wp_hook action load-nav-menus.php + */ + public static function _load_nav_menus() { + add_action( 'admin_enqueue_scripts', array( __CLASS__, '_enqueue_assets' ), 99 ); + + /** + * Allow settings meta box to be disabled. + * + * @since 0.4.0 + * + * @param bool $disabled Defaults to FALSE. + */ + $settings_disabled = apply_filters( 'menu_icons_disable_settings', false ); + if ( true === $settings_disabled ) { + return; + } + + self::_maybe_update_settings(); + self::_add_settings_meta_box(); + + add_action( 'admin_notices', array( __CLASS__, '_admin_notices' ) ); + } + + /** + * Update settings + * + * @since 0.3.0 + */ + public static function _maybe_update_settings() { + if ( ! empty( $_POST['menu-icons']['settings'] ) ) { + check_admin_referer( self::UPDATE_KEY, self::UPDATE_KEY ); + + $redirect_url = self::_update_settings( $_POST['menu-icons']['settings'] ); // Input var okay. + wp_redirect( $redirect_url ); + } elseif ( ! empty( $_REQUEST[ self::RESET_KEY ] ) ) { + check_admin_referer( self::RESET_KEY, self::RESET_KEY ); + wp_redirect( self::_reset_settings() ); + } + } + + /** + * Update settings + * + * @since 0.7.0 + * @access protected + * + * @param array $values Settings values. + * + * @return string Redirect URL. + */ + protected static function _update_settings( $values ) { + update_option( + 'menu-icons', + wp_parse_args( + kucrut_validate( $values ), + self::$settings + ) + ); + set_transient( self::TRANSIENT_KEY, 'updated', 30 ); + + $redirect_url = remove_query_arg( + array( 'menu-icons-reset' ), + wp_get_referer() + ); + + return $redirect_url; + } + + /** + * Reset settings + * + * @since 0.7.0 + * @access protected + * @return string Redirect URL. + */ + protected static function _reset_settings() { + delete_option( 'menu-icons' ); + set_transient( self::TRANSIENT_KEY, 'reset', 30 ); + + $redirect_url = remove_query_arg( + array( self::RESET_KEY, 'menu-icons-updated' ), + wp_get_referer() + ); + + return $redirect_url; + } + + /** + * Settings meta box + * + * @since 0.3.0 + * @access private + */ + private static function _add_settings_meta_box() { + add_meta_box( + 'menu-icons-settings', + __( 'Menu Icons Settings', 'menu-icons' ), + array( __CLASS__, '_meta_box' ), + 'nav-menus', + 'side', + 'low', + array() + ); + } + + /** + * Update settings via ajax + * + * @since 0.7.0 + * @wp_hook action wp_ajax_menu_icons_update_settings + */ + public static function _ajax_menu_icons_update_settings() { + check_ajax_referer( self::UPDATE_KEY, self::UPDATE_KEY ); + + if ( empty( $_POST['menu-icons']['settings'] ) ) { + wp_send_json_error(); + } + + $redirect_url = self::_update_settings( $_POST['menu-icons']['settings'] ); // Input var okay. + wp_send_json_success( array( 'redirectUrl' => $redirect_url ) ); + } + + /** + * Print admin notices + * + * @since 0.3.0 + * @wp_hook action admin_notices + */ + public static function _admin_notices() { + $messages = array( + 'updated' => __( 'Menu Icons Settings have been successfully updated.', 'menu-icons' ), + 'reset' => __( 'Menu Icons Settings have been successfully reset.', 'menu-icons' ), + ); + + $message_type = get_transient( self::TRANSIENT_KEY ); + + if ( ! empty( $message_type ) && ! empty( $messages[ $message_type ] ) ) { + printf( + '

%s

', + wp_kses( $messages[ $message_type ], array( 'strong' => true ) ) + ); + } + + delete_transient( self::TRANSIENT_KEY ); + } + + /** + * Settings meta box + * + * @since 0.3.0 + */ + public static function _meta_box() { + ?> +
+ + $section ) : ?> + + + +
+

+ + + %s', + esc_url( + wp_nonce_url( + admin_url( '/nav-menus.php' ), + self::RESET_KEY, + self::RESET_KEY + ) + ), + esc_attr__( 'Discard all changes and reset to default state', 'menu-icons' ), + esc_html__( 'Reset', 'menu-icons' ) + ); + ?> + + + + + + +

+ array( + 'id' => 'global', + 'title' => __( 'Global', 'menu-icons' ), + 'description' => __( 'Global settings', 'menu-icons' ), + 'fields' => array( + array( + 'id' => 'icon_types', + 'type' => 'checkbox', + 'label' => __( 'Icon Types', 'menu-icons' ), + 'choices' => $icon_types, + 'value' => self::get( 'global', 'icon_types' ), + ), + array( + 'id' => 'fa5_extra_icons', + 'type' => 'textarea', + 'label' => __( 'FA Custom Icon Classes', 'menu-icons' ), + 'value' => self::get( 'global', 'fa5_extra_icons' ), + 'help_text' => '( comma separated icons )', + ), + ), + 'args' => array(), + ), + ); + + if ( ! empty( $menu_id ) ) { + $menu_term = get_term( $menu_id, 'nav_menu' ); + $menu_key = sprintf( 'menu_%d', $menu_id ); + $menu_settings = self::get_menu_settings( $menu_id ); + + $sections['menu'] = array( + 'id' => $menu_key, + 'title' => __( 'Current Menu', 'menu-icons' ), + 'description' => sprintf( + __( '"%s" menu settings', 'menu-icons' ), + apply_filters( 'single_term_title', $menu_term->name ) + ), + 'fields' => self::get_settings_fields( $menu_settings ), + 'args' => array( 'inline_description' => true ), + ); + } + + return apply_filters( 'menu_icons_settings_sections', $sections, $menu_id ); + } + + /** + * Get settings fields + * + * @since 0.4.0 + * + * @param array $values Values to be applied to each field. + * + * @uses apply_filters() Calls 'menu_icons_settings_fields'. + * @return array + */ + public static function get_settings_fields( array $values = array() ) { + $fields = array( + 'hide_label' => array( + 'id' => 'hide_label', + 'type' => 'select', + 'label' => __( 'Hide Label', 'menu-icons' ), + 'default' => '', + 'choices' => array( + array( + 'value' => '', + 'label' => __( 'No', 'menu-icons' ), + ), + array( + 'value' => '1', + 'label' => __( 'Yes', 'menu-icons' ), + ), + ), + ), + 'position' => array( + 'id' => 'position', + 'type' => 'select', + 'label' => __( 'Position', 'menu-icons' ), + 'default' => 'before', + 'choices' => array( + array( + 'value' => 'before', + 'label' => __( 'Before', 'menu-icons' ), + ), + array( + 'value' => 'after', + 'label' => __( 'After', 'menu-icons' ), + ), + ), + ), + 'vertical_align' => array( + 'id' => 'vertical_align', + 'type' => 'select', + 'label' => __( 'Vertical Align', 'menu-icons' ), + 'default' => 'middle', + 'choices' => array( + array( + 'value' => 'super', + 'label' => __( 'Super', 'menu-icons' ), + ), + array( + 'value' => 'top', + 'label' => __( 'Top', 'menu-icons' ), + ), + array( + 'value' => 'text-top', + 'label' => __( 'Text Top', 'menu-icons' ), + ), + array( + 'value' => 'middle', + 'label' => __( 'Middle', 'menu-icons' ), + ), + array( + 'value' => 'baseline', + 'label' => __( 'Baseline', 'menu-icons' ), + ), + array( + 'value' => 'text-bottom', + 'label' => __( 'Text Bottom', 'menu-icons' ), + ), + array( + 'value' => 'bottom', + 'label' => __( 'Bottom', 'menu-icons' ), + ), + array( + 'value' => 'sub', + 'label' => __( 'Sub', 'menu-icons' ), + ), + ), + ), + 'font_size' => array( + 'id' => 'font_size', + 'type' => 'number', + 'label' => __( 'Font Size', 'menu-icons' ), + 'default' => '1.2', + 'description' => 'em', + 'attributes' => array( + 'min' => '0.1', + 'step' => '0.1', + ), + ), + 'svg_width' => array( + 'id' => 'svg_width', + 'type' => 'number', + 'label' => __( 'SVG Width', 'menu-icons' ), + 'default' => '1', + 'description' => 'em', + 'attributes' => array( + 'min' => '.5', + 'step' => '.1', + ), + ), + 'image_size' => array( + 'id' => 'image_size', + 'type' => 'select', + 'label' => __( 'Image Size', 'menu-icons' ), + 'default' => 'thumbnail', + 'choices' => kucrut_get_image_sizes(), + ), + ); + + $fields = apply_filters( 'menu_icons_settings_fields', $fields ); + + foreach ( $fields as &$field ) { + if ( isset( $values[ $field['id'] ] ) ) { + $field['value'] = $values[ $field['id'] ]; + } + + if ( ! isset( $field['value'] ) && isset( $field['default'] ) ) { + $field['value'] = $field['default']; + } + } + + unset( $field ); + + return $fields; + } + + /** + * Get processed settings fields + * + * @since 0.3.0 + * @access private + * @return array + */ + private static function _get_fields() { + if ( ! class_exists( 'Kucrut_Form_Field' ) ) { + require_once Menu_Icons::get( 'dir' ) . 'includes/library/form-fields.php'; + } + + $keys = array( 'menu-icons', 'settings' ); + $sections = self::get_fields(); + + foreach ( $sections as &$section ) { + $_keys = array_merge( $keys, array( $section['id'] ) ); + $_args = array_merge( array( 'keys' => $_keys ), $section['args'] ); + + foreach ( $section['fields'] as &$field ) { + $field = Kucrut_Form_Field::create( $field, $_args ); + } + + unset( $field ); + } + + unset( $section ); + + return $sections; + } + + /** + * Enqueue scripts & styles for Block Icons + * + * @since 0.3.0 + * @wp_hook action enqueue_block_assets + */ + public static function _enqueue_font_awesome() { + $url = Menu_Icons::get( 'url' ); + + wp_register_style( + 'font-awesome-5', + "{$url}css/fontawesome/css/all.min.css" + ); + } + + /** + * Enqueue scripts & styles for Appearance > Menus page + * + * @since 0.3.0 + * @wp_hook action admin_enqueue_scripts + */ + public static function _enqueue_assets() { + $url = Menu_Icons::get( 'url' ); + $suffix = kucrut_get_script_suffix(); + + if ( defined( 'MENU_ICONS_SCRIPT_DEBUG' ) && MENU_ICONS_SCRIPT_DEBUG ) { + $script_url = '//localhost:8081/'; + } else { + $script_url = $url; + } + + wp_enqueue_style( + 'menu-icons', + "{$url}css/admin{$suffix}.css", + false, + Menu_Icons::VERSION + ); + + wp_enqueue_script( + 'menu-icons', + "{$script_url}js/admin{$suffix}.js", + self::$script_deps, + Menu_Icons::VERSION, + true + ); + + $customizer_url = add_query_arg( + array( + 'autofocus[section]' => 'custom_css', + 'return' => admin_url( 'nav-menus.php' ), + ), + admin_url( 'customize.php' ) + ); + + /** + * Allow plugins/themes to filter the settings' JS data + * + * @since 0.9.0 + * + * @param array $js_data JS Data. + */ + $menu_current_theme = ''; + $theme = wp_get_theme(); + if ( ! empty( $theme ) ) { + if ( is_child_theme() && $theme->parent() ) { + $menu_current_theme = $theme->parent()->get( 'Name' ); + } else { + $menu_current_theme = $theme->get( 'Name' ); + } + } + $upsell_notices = array(); + $box_data = '