OrderPK ! r0 0 libs/CSVParser/CSVParser.phpnu [ import_data = $data; } /** * Detect the CSV delimiter, by analyzing some rows to determine the most probable delimiter character. * * @since 1.0.0 * * @return string Most probable delimiter character. */ public function find_delimiter() { $data = &$this->import_data; $delimiter_count = array(); $enclosed = false; $current_line = 0; // Walk through each character in the CSV string (up to $this->delimiter_search_max_lines) and search potential delimiter characters. $data_length = strlen( $data ); for ( $i = 0; $i < $data_length; $i++ ) { $prev_char = ( $i - 1 >= 0 ) ? $data[ $i - 1 ] : ''; $curr_char = $data[ $i ]; $next_char = ( $i + 1 < $data_length ) ? $data[ $i + 1 ] : ''; if ( $curr_char === $this->enclosure ) { // Open and closing quotes. if ( ! $enclosed || $next_char !== $this->enclosure ) { $enclosed = ! $enclosed; // Flip bool. } elseif ( $enclosed ) { $i++; // Skip next character. } } elseif ( ( "\n" === $curr_char && "\r" !== $prev_char || "\r" === $curr_char ) && ! $enclosed ) { // Reached end of a line. $current_line++; if ( $current_line >= $this->delimiter_search_max_lines ) { break; } } elseif ( ! $enclosed ) { // At this point, $curr_char seems to be used as a delimiter, as it is not enclosed. // Count $curr_char if it is not in the $this->non_delimiter_chars list if ( 0 === preg_match( '#[' . $this->non_delimiter_chars . ']#i', $curr_char ) ) { if ( ! isset( $delimiter_count[ $curr_char ][ $current_line ] ) ) { $delimiter_count[ $curr_char ][ $current_line ] = 0; // Initialize empty } $delimiter_count[ $curr_char ][ $current_line ]++; } } } // Find most probable delimiter, by sorting their counts. $potential_delimiters = array(); foreach ( $delimiter_count as $char => $line_counts ) { $is_possible_delimiter = $this->_check_delimiter_count( $char, $line_counts, $current_line ); if ( false !== $is_possible_delimiter ) { $potential_delimiters[ $is_possible_delimiter ] = $char; } } ksort( $potential_delimiters ); // If no valid delimiter was found, use the character that was found in most rows. if ( empty( $potential_delimiters ) ) { $delimiter_counts = array_map( 'count', $delimiter_count ); arsort( $delimiter_counts, SORT_NUMERIC ); $potential_delimiters = array_keys( $delimiter_counts ); } // Return first array element, as that has the highest count. return array_shift( $potential_delimiters ); } /** * Check if passed character can be a delimiter, by checking counts in each line. * * @since 1.0.0 * * @param string $char Character to check. * @param array $line_counts Counts for the characters in the lines. * @param int $number_lines Number of lines. * @return bool|string False if delimiter is not possible, string to be used as a sort key if character could be a delimiter. */ protected function _check_delimiter_count( $char, array $line_counts, $number_lines ) { // Was the potential delimiter found in every line? if ( count( $line_counts ) !== $number_lines ) { return false; } // Check if the count in every line is the same (or one higher for an "almost"). $first = null; $equal = null; $almost = false; foreach ( $line_counts as $line => $count ) { if ( is_null( $first ) ) { $first = $count; } elseif ( $count === $first && false !== $equal ) { $equal = true; } elseif ( $count === $first + 1 && false !== $equal ) { $equal = true; $almost = true; } else { $equal = false; } } // Check equality only if there's more than one line. if ( $number_lines > 1 && ! $equal ) { return false; } // At this point, count is equal in all lines, so determine a string to sort priority. $match = ( $almost ) ? 2 : 1; $pref = strpos( $this->preferred_delimiter_chars, $char ); $pref = ( false !== $pref ) ? str_pad( $pref, 3, '0', STR_PAD_LEFT ) : '999'; return $pref . $match . '.' . ( 99999 - str_pad( $first, 5, '0', STR_PAD_LEFT ) ); } /** * Parse CSV string into a two-dimensional array. * * @since 1.0.0 * * @param string $delimiter Delimiter character for the CSV parsing. * @return array Two-dimensional array with the data from the CSV string. */ public function parse( $delimiter ) { $data = &$this->import_data; // Filter delimiter from the list, if it is a whitespace character. $white_spaces = str_replace( $delimiter, '', " \t\x0B\0" ); $rows = array(); // Complete rows. $row = array(); // Row that is currently built. $column = 0; // Current column index. $cell_content = ''; // Content of the currently processed cell. $enclosed = false; $was_enclosed = false; // To determine if the cell content will be trimmed of whitespace (only for enclosed cells). // Walk through each character in the CSV string. $data_length = strlen( $data ); for ( $i = 0; $i < $data_length; $i++ ) { $curr_char = $data[ $i ]; $next_char = ( $i + 1 < $data_length ) ? $data[ $i + 1 ] : ''; if ( $curr_char === $this->enclosure ) { // Open/close quotes, and inline quotes. if ( ! $enclosed ) { if ( '' === ltrim( $cell_content, $white_spaces ) ) { $enclosed = true; $was_enclosed = true; } else { $this->error = 2; $error_line = count( $rows ) + 1; $error_column = $column + 1; if ( ! isset( $this->error_info[ "{$error_line}-{$error_column}" ] ) ) { $this->error_info[ "{$error_line}-{$error_column}" ] = array( 'type' => 2, 'info' => "Syntax error found in line {$error_line}. Non-enclosed fields can not contain double-quotes.", 'line' => $error_line, 'column' => $error_column, ); } $cell_content .= $curr_char; } } elseif ( $next_char === $this->enclosure ) { // Enclosure character within enclosed cell (" encoded as ""). $cell_content .= $curr_char; $i++; // Skip next character } elseif ( $next_char !== $delimiter && "\r" !== $next_char && "\n" !== $next_char ) { // for-loop (instead of while-loop) that skips whitespace. for ( $x = ( $i + 1 ); isset( $data[ $x ] ) && '' === ltrim( $data[ $x ], $white_spaces ); $x++ ) { // Action is in iterator check. } if ( $data[ $x ] === $delimiter ) { $enclosed = false; $i = $x; } else { if ( $this->error < 1 ) { $this->error = 1; } $error_line = count( $rows ) + 1; $error_column = $column + 1; if ( ! isset( $this->error_info[ "{$error_line}-{$error_column}" ] ) ) { $this->error_info[ "{$error_line}-{$error_column}" ] = array( 'type' => 1, 'info' => "Syntax error found in line {$error_line}. A single double-quote was found within an enclosed string. Enclosed double-quotes must be escaped with a second double-quote.", 'line' => $error_line, 'column' => $error_column, ); } $cell_content .= $curr_char; $enclosed = false; } } else { // The " was the closing one for the cell. $enclosed = false; } } elseif ( ( $curr_char === $delimiter || "\n" === $curr_char || "\r" === $curr_char ) && ! $enclosed ) { // End of cell (by $delimiter), or end of line (by line break, and not enclosed!). $columnContent = ( $was_enclosed ) ? $cell_content : trim( $cell_content ); $row[ $column ] = $columnContent; $cell_content = ''; $was_enclosed = false; $column++; // End of line. if ( "\n" === $curr_char || "\r" === $curr_char ) { // Append completed row. $rows[] = $row; $row = array(); $column = 0; if ( "\r" === $curr_char && "\n" === $next_char ) { // Skip next character in \r\n line breaks. $i++; } } } else { // Append character to current cell. $cell_content .= $curr_char; } } return $rows; } } // class CSV_Parser PK ! .r+ r+ 9 libs/ff_plugin_updater/updater/FluentFormAddOnUpdater.phpnu [ api_url = trailingslashit($_api_url); $this->api_data = $_api_data; $this->name = plugin_basename($_plugin_file); $this->slug = basename($_plugin_file, '.php'); $this->response_transient_key = md5(sanitize_key($this->name) . 'response_transient'); $this->version = $_api_data['version']; if (is_array($_plugin_update_data) and isset($_plugin_update_data['license_status'], $_plugin_update_data['admin_page_url'], $_plugin_update_data['purchase_url'], $_plugin_update_data['plugin_title']) ) { $this->license_status = $_plugin_update_data ['license_status']; $this->admin_page_url = $_plugin_update_data['admin_page_url']; $this->purchase_url = $_plugin_update_data['purchase_url']; $this->plugin_title = $_plugin_update_data['plugin_title']; } // Set up hooks. $this->init(); } /** * Set up WordPress filters to hook into WP's update process. * * @uses add_filter() * * @return void */ public function init() { $this->maybe_delete_transients(); add_filter('pre_set_site_transient_update_plugins', array($this, 'check_update'), 51); add_action( 'delete_site_transient_update_plugins', [ $this, 'delete_transients' ] ); // add_filter('plugins_api', array($this, 'plugins_api_filter'), 10, 3); remove_action( 'after_plugin_row_' . $this->name, 'wp_plugin_update_row' ); // // add_action( 'after_plugin_row_' . $this->name, [ $this, 'show_update_notification' ], 10, 2 ); } function remove_plugin_update_message() { remove_action('after_plugin_row_' . $this->name, 'wp_plugin_update_row', 10, 2); } function check_update($_transient_data) { global $pagenow; if (!is_object($_transient_data)) { $_transient_data = new \stdClass(); } if ('plugins.php' === $pagenow && is_multisite()) { return $_transient_data; } return $this->check_transient_data($_transient_data); } private function check_transient_data($_transient_data) { if (!is_object($_transient_data)) { $_transient_data = new \stdClass(); } if (empty($_transient_data->checked)) { return $_transient_data; } $version_info = $this->get_transient($this->response_transient_key); if (false === $version_info) { $version_info = $this->api_request('plugin_latest_version', array('slug' => $this->slug)); if (is_wp_error($version_info)) { $version_info = new \stdClass(); $version_info->error = true; } $this->set_transient($this->response_transient_key, $version_info); } if (!empty($version_info->error) || !$version_info) { return $_transient_data; } if (is_object($version_info) && isset($version_info->new_version)) { if (version_compare($this->version, $version_info->new_version, '<')) { $_transient_data->response[$this->name] = $version_info; } $_transient_data->last_checked = time(); $_transient_data->checked[$this->name] = $this->version; } return $_transient_data; } /** * show update nofication row -- needed for multisite subsites, because WP won't tell you otherwise! * * @param string $file * @param array $plugin */ public function show_update_notification($file, $plugin) { if ( is_network_admin() ) { return; } if ( ! current_user_can( 'update_plugins' ) ) { return; } if ( $this->name !== $file ) { return; } // Remove our filter on the site transient remove_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_update' ] ); $update_cache = get_site_transient( 'update_plugins' ); $update_cache = $this->check_transient_data( $update_cache ); // set_site_transient( 'update_plugins', $update_cache ); // Restore our filter add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_update' ] ); } /** * Updates information on the "View version x.x details" page with custom data. * * @uses api_request() * * @param mixed $_data * @param string $_action * @param object $_args * * @return object $_data */ function plugins_api_filter($_data, $_action = '', $_args = null) { if ( 'plugin_information' !== $_action ) { return $_data; } if (!isset($_args->slug) || ($_args->slug != $this->slug)) { return $_data; } $cache_key = $this->slug.'_api_request_' . substr( md5( serialize( $this->slug ) ), 0, 15 ); $api_request_transient = get_site_transient( $cache_key ); if ( empty( $api_request_transient ) ) { $to_send = array( 'slug' => $this->slug, 'is_ssl' => is_ssl(), 'fields' => array( 'banners' => false, // These will be supported soon hopefully 'reviews' => false ) ); $api_request_transient = $this->api_request('plugin_information', $to_send); // Expires in 1 day set_site_transient( $cache_key, $api_request_transient, DAY_IN_SECONDS ); } if (false !== $api_request_transient) { $_data = $api_request_transient; } return $_data; } /** * Disable SSL verification in order to prevent download update failures * * @param array $args * @param string $url * * @return object $array */ function http_request_args($args, $url) { // If it is an https request and we are performing a package download, disable ssl verification if (strpos($url, 'https://') !== false && strpos($url, 'edd_action=package_download')) { $args['sslverify'] = false; } return $args; } /** * Calls the API and, if successfull, returns the object delivered by the API. * * @uses get_bloginfo() * @uses wp_remote_post() * @uses is_wp_error() * * @param string $_action The requested action. * @param array $_data Parameters for the API action. * * @return false|object */ private function api_request($_action, $_data) { global $wp_version; $data = array_merge($this->api_data, $_data); if ($data['slug'] != $this->slug) { return; } if ($this->api_url == home_url()) { return false; // Don't allow a plugin to ping itself } $siteUrl = home_url(); if (is_multisite()) { $siteUrl = network_site_url(); } $api_params = array( 'edd_action' => 'get_version', 'license' => !empty($data['license']) ? $data['license'] : '', //'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false, 'item_id' => isset($data['item_id']) ? $data['item_id'] : false, 'slug' => $data['slug'], 'author' => $data['author'], 'url' => $siteUrl ); $request = wp_remote_post($this->api_url, array('timeout' => 15, 'sslverify' => false, 'body' => $api_params)); if (!is_wp_error($request)) { $request = json_decode(wp_remote_retrieve_body($request)); } if ($request && isset($request->sections)) { $request->sections = maybe_unserialize($request->sections); } else { $request = false; } return $request; } public function show_changelog() { if (empty($_REQUEST['edd_sl_action']) || 'view_plugin_changelog' != $_REQUEST['edd_sl_action']) { return; } if (empty($_REQUEST['plugin'])) { return; } if (empty($_REQUEST['slug'])) { return; } if (!current_user_can('update_plugins')) { wp_die(__('You do not have permission to install plugin updates', 'edd'), __('Error', 'edd'), array('response' => 403)); } $response = $this->api_request('plugin_latest_version', array('slug' => $_REQUEST['slug'])); if ($response && isset($response->sections['changelog'])) { echo '
' . sprintf(__('The %s license needs to be activated. %sActivate Now%s', 'fluentformpro'), $this->get_var('plugin_title'), '', '') . '
get_var('contact_url') . '" target="_blank">', ''); ?>
', $this->get_var('plugin_title'), '', date('d M Y', strtotime($licenseData->expires)) . '', '', '' . '
'); } private function willShowExpirationNotice() { if (!defined('FLUENTFORM_VERSION') || !\FluentForm\App\Modules\Acl\Acl::hasAnyFormPermission()) { return false; } global $pagenow; $showablePages = ['index.php', 'plugins.php']; if (in_array($pagenow, $showablePages)) { return true; } return false; } private function getRenewHtml($license_data) { if (!$license_data) { return; } $status = $this->getSavedLicenseStatus(); if (!$status) { return; } $renewUrl = $this->getRenewUrl(); $renewHTML = ''; if ($status == 'expired') { $expiredDate = date('d M Y', strtotime($license_data->expires)); $renewHTML = sprintf(__('%sYour license was expired at %s', 'fluentformpro'), '', '' . $expiredDate . '
'); $renewHTML .= sprintf(__('%sClick Here to renew your license%s', 'fluentformpro'), ''); } else if ($status == 'valid') { if ($license_data->expires != 'lifetime') { $expireDate = date('d M Y', strtotime($license_data->expires)); $interval = strtotime($license_data->expires) - time(); $intervalDays = intval($interval / (60 * 60 * 24)); if ($intervalDays < 30) { $renewHTML = sprintf(__('%sYour license will be expired in %s days%s', 'fluentformpro'), '', $intervalDays, '
'); $renewHTML .= sprintf(__('%sPlease %sClick Here to renew your license%s', 'fluentformpro'), '', '', '
'); } } } return $renewHTML; } private function getRenewUrl($licenseKey = false) { if (!$licenseKey) { $licenseKey = $this->getSavedLicenseKey(); } if ($licenseKey) { $renewUrl = $this->get_var('store_site') . '/checkout/?edd_license_key=' . $licenseKey . '&download_id=' . $this->get_var('item_id'); } else { $renewUrl = $this->get_var('purchase_url'); } return $renewUrl; } private function getOtherInfo() { if (!$this->timeMatched()) { return false; } global $wp_version; return [ 'plugin_version' => FLUENTFORMPRO_VERSION, 'php_version' => (defined('PHP_VERSION')) ? PHP_VERSION : phpversion(), 'wp_version' => $wp_version, 'plugins' => (array)get_option('active_plugins'), 'site_lang' => get_bloginfo('language'), 'site_title' => get_bloginfo('name'), 'theme' => wp_get_theme()->get('Name') ]; } private function timeMatched() { $prevValue = get_option('_fluent_last_m_run'); if (!$prevValue) { return true; } return (time() - $prevValue) > 518400; // 6 days match } } PK ! & 3 libs/ff_plugin_updater/ff-fluentform-pro-update.phpnu [ FLUENTFORMPRO_DIR_FILE, // The current version of the plugin. // Also need to change in readme.txt and plugin header. 'version' => FLUENTFORMPRO_VERSION, // The main URL of your store for license verification 'store_url' => 'https://apiv2.wpmanageninja.com/plugin', 'store_site' => 'https://wpmanageninja.com', // Your name 'author' => 'WP Manage Ninja', // The URL to renew or purchase a license 'purchase_url' => 'https://wpmanageninja.com/downloads/fluentform-pro-add-on/', // The URL of your contact page 'contact_url' => 'https://wpmanageninja.com/contact', // This should match the download name exactly 'item_id' => '542', // The option names to store the license key and activation status 'license_key' => '_ff_fluentform_pro_license_key', 'license_status' => '_ff_fluentform_pro_license_status', // Option group param for the settings api 'option_group' => '_ff_fluentform_pro_license', // The plugin settings admin page slug 'admin_page_slug' => 'fluent_forms_add_ons', // If using add_menu_page, this is the parent slug to add a submenu item underneath. 'activate_url' => admin_url('admin.php?page=fluent_forms_settings&component=license_page'), // The translatable title of the plugin 'plugin_title' => __('Fluent Forms Pro Add On', 'fluentformpro'), 'menu_slug' => 'fluentform-pro-add-on', 'menu_title' => __('Fluent Forms Pro License', 'fluentformpro'), 'cache_time' => 168 * 60 * 60 // 7 days )); function fluentFormProActivateLicense($licenseKey) { $instance = FluentFormAddOnChecker::getInstance(); if ($instance) { return $instance->tryActivateLicense($licenseKey); } return false; } PK ! T libs/index.phpnu [ .el-menu-item{border-bottom:2px solid transparent;color:#909399;float:left;height:60px;line-height:60px;margin:0}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover{background-color:#fff}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409eff;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{border-bottom:2px solid transparent;color:#909399;height:60px;line-height:60px}.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{margin-left:8px;margin-top:-3px;position:static;vertical-align:middle}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#fff;color:#909399;float:none;height:36px;line-height:36px;padding:0 10px}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{color:#303133;outline:0}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409eff;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;text-align:center;vertical-align:middle;width:24px}.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{display:inline-block;height:0;overflow:hidden;visibility:hidden;width:0}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-submenu{min-width:200px}.el-menu--collapse .el-submenu{position:relative}.el-menu--collapse .el-submenu .el-menu{border:1px solid #e4e7ed;border-radius:2px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);left:100%;margin-left:5px;position:absolute;top:0;z-index:10}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{transform:none}.el-menu--popup{border:none;border-radius:2px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);min-width:200px;padding:5px 0;z-index:100}.el-menu-item,.el-submenu__title{line-height:56px;list-style:none;padding:0 20px;position:relative;white-space:nowrap}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{box-sizing:border-box;color:#303133;cursor:pointer;font-size:14px;height:56px;transition:border-color .3s,background-color .3s,color .3s}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{background-color:#ecf5ff;outline:0}.el-menu-item.is-disabled{background:0 0!important;cursor:not-allowed;opacity:.25}.el-menu-item [class^=el-icon-]{font-size:18px;margin-right:5px;text-align:center;vertical-align:middle;width:24px}.el-menu-item.is-active{color:#409eff}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{box-sizing:border-box;color:#303133;cursor:pointer;font-size:14px;height:56px;transition:border-color .3s,background-color .3s,color .3s}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{background-color:#ecf5ff;outline:0}.el-submenu__title.is-disabled{background:0 0!important;cursor:not-allowed;opacity:.25}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;min-width:200px;padding:0 45px}.el-submenu__icon-arrow{font-size:12px;margin-top:-7px;position:absolute;right:20px;top:50%;transition:transform .3s}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409eff}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{transform:rotate(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{background:0 0!important;cursor:not-allowed;opacity:.25}.el-submenu [class^=el-icon-]{font-size:18px;margin-right:5px;text-align:center;vertical-align:middle;width:24px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{color:#909399;font-size:12px;line-height:normal;padding:7px 0 7px 20px}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{opacity:0;transition:.2s} .ff_pre_settings_wrapper{background:#f1f1f1;border-radius:20px;margin:50px auto;max-width:800px;padding:20px 50px 50px;text-align:center}.ff_pre_settings_wrapper h2{font-size:26px;line-height:36px;margin-bottom:10px}.ff_pre_settings_wrapper p{font-size:16px;margin-bottom:20px}.ff_payment_wrapper .el-tabs--border-card>.el-tabs__content{padding:45px}.ff_payment_sub_section{background:#f2f2f2;border-radius:8px;padding:20px 30px}.ff_connect_ok{background:#f0f9eb;border-left:5px solid #67c23a}.ff_connect_ok,.ff_connect_require{border-radius:5px;margin-bottom:20px;padding:15px 20px}.ff_connect_require{background:#fcf4e6;border-left:5px solid #ff6154}.ff_connect_require img{max-width:200px}.ff_pay_navigation{border-bottom:1px solid #e4e7ec;display:block;margin-bottom:20px;width:100%}.ff_pay_navigation li{cursor:pointer;display:inline-block;font-size:14px;font-weight:500;margin:0;padding-bottom:15px;position:relative}.ff_pay_navigation li:not(:last-child){margin-right:20px}.ff_pay_navigation li:after{background-color:#1a7efb;bottom:-1px;content:"";height:2px;left:0;position:absolute;transition:.3s;width:0}.ff_pay_navigation li.ff_active{color:#1a7efb}.ff_pay_navigation li.ff_active:after{width:100%}.el-menu-demo{background-color:transparent}.el-menu-demo.el-menu--horizontal{border-bottom:0}.el-menu-demo.el-menu--horizontal>.el-menu-item{border-bottom:0;border-radius:6px;color:#606266;display:block;float:none;height:auto;line-height:inherit;margin-bottom:10px;padding:8px 14px}.el-menu-demo.el-menu--horizontal>.el-menu-item.is-active,.el-menu-demo.el-menu--horizontal>.el-menu-item:hover{background-color:#ddddde;color:#1e1f21}.el-tabs__item{color:#606266;font-weight:400;height:auto;line-height:inherit;padding-bottom:15px;padding-left:15px;padding-right:15px}.el-tabs__nav-wrap:after{height:1px}.ff_method_settings_form h2{font-size:18px;margin-bottom:6px}.ff_method_settings_form p:not(.text-note){margin-bottom:15px} PK ! &