/home/lnzliplg/www/cli.tar
crawler.cls.php000064400000011534151730712240007502 0ustar00<?php

namespace LiteSpeed\CLI;

defined('WPINC') || exit();

use LiteSpeed\Debug2;
use LiteSpeed\Base;
use LiteSpeed\Task;
use LiteSpeed\Crawler as Crawler2;
use WP_CLI;

/**
 * Crawler
 */
class Crawler extends Base
{
	private $__crawler;

	public function __construct()
	{
		Debug2::debug('CLI_Crawler init');

		$this->__crawler = Crawler2::cls();
	}

	/**
	 * List all crawler
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # List all crawlers
	 *     $ wp litespeed-crawler l
	 *
	 */
	public function l()
	{
		$this->list();
	}

	/**
	 * List all crawler
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # List all crawlers
	 *     $ wp litespeed-crawler list
	 *
	 */
	public function list()
	{
		$crawler_list = $this->__crawler->list_crawlers();
		$summary = Crawler2::get_summary();
		if ($summary['curr_crawler'] >= count($crawler_list)) {
			$summary['curr_crawler'] = 0;
		}
		$is_running = time() - $summary['is_running'] <= $this->conf(Base::O_CRAWLER_RUN_DURATION);

		$seconds = $this->conf(Base::O_CRAWLER_RUN_INTERVAL);
		if ($seconds > 0) {
			$recurrence = '';
			$hours = (int) floor($seconds / 3600);
			if ($hours) {
				if ($hours > 1) {
					$recurrence .= sprintf(__('%d hours', 'litespeed-cache'), $hours);
				} else {
					$recurrence .= sprintf(__('%d hour', 'litespeed-cache'), $hours);
				}
			}
			$minutes = (int) floor(($seconds % 3600) / 60);
			if ($minutes) {
				$recurrence .= ' ';
				if ($minutes > 1) {
					$recurrence .= sprintf(__('%d minutes', 'litespeed-cache'), $minutes);
				} else {
					$recurrence .= sprintf(__('%d minute', 'litespeed-cache'), $minutes);
				}
			}
		}

		$list = array();
		foreach ($crawler_list as $i => $v) {
			$hit = !empty($summary['crawler_stats'][$i]['H']) ? $summary['crawler_stats'][$i]['H'] : 0;
			$miss = !empty($summary['crawler_stats'][$i]['M']) ? $summary['crawler_stats'][$i]['M'] : 0;

			$blacklisted = !empty($summary['crawler_stats'][$i]['B']) ? $summary['crawler_stats'][$i]['B'] : 0;
			$blacklisted += !empty($summary['crawler_stats'][$i]['N']) ? $summary['crawler_stats'][$i]['N'] : 0;

			if (isset($summary['crawler_stats'][$i]['W'])) {
				$waiting = $summary['crawler_stats'][$i]['W'] ?: 0;
			} else {
				$waiting = $summary['list_size'] - $hit - $miss - $blacklisted;
			}

			$analytics = 'Waiting: ' . $waiting;
			$analytics .= '     Hit: ' . $hit;
			$analytics .= '     Miss: ' . $miss;
			$analytics .= '     Blocked: ' . $blacklisted;

			$running = '';
			if ($i == $summary['curr_crawler']) {
				$running = 'Pos: ' . ($summary['last_pos'] + 1);
				if ($is_running) {
					$running .= '(Running)';
				}
			}

			$status = $this->__crawler->is_active($i) ? '✅' : '❌';

			$list[] = array(
				'ID' => $i + 1,
				'Name' => wp_strip_all_tags($v['title']),
				'Frequency' => $recurrence,
				'Status' => $status,
				'Analytics' => $analytics,
				'Running' => $running,
			);
		}

		WP_CLI\Utils\format_items('table', $list, array('ID', 'Name', 'Frequency', 'Status', 'Analytics', 'Running'));
	}

	/**
	 * Enable one crawler
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Turn on 2nd crawler
	 *     $ wp litespeed-crawler enable 2
	 *
	 */
	public function enable($args)
	{
		$id = $args[0] - 1;
		if ($this->__crawler->is_active($id)) {
			WP_CLI::error('ID #' . $id . ' had been enabled');
			return;
		}

		$this->__crawler->toggle_activeness($id);
		WP_CLI::success('Enabled crawler #' . $id);
	}

	/**
	 * Disable one crawler
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Turn off 1st crawler
	 *     $ wp litespeed-crawler disable 1
	 *
	 */
	public function disable($args)
	{
		$id = $args[0] - 1;
		if (!$this->__crawler->is_active($id)) {
			WP_CLI::error('ID #' . $id . ' has been disabled');
			return;
		}

		$this->__crawler->toggle_activeness($id);
		WP_CLI::success('Disabled crawler #' . $id);
	}

	/**
	 * Run crawling
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Start crawling
	 *     $ wp litespeed-crawler r
	 *
	 */
	public function r()
	{
		$this->run();
	}

	/**
	 * Run crawling
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Start crawling
	 *     $ wp litespeed-crawler run
	 *
	 */
	public function run()
	{
		self::debug('⚠️⚠️⚠️ Forced take over lane (CLI)');
		$this->__crawler->Release_lane();

		Task::async_call('crawler');

		$summary = Crawler2::get_summary();

		WP_CLI::success('Start crawling. Current crawler #' . ($summary['curr_crawler'] + 1) . ' [position] ' . $summary['last_pos'] . ' [total] ' . $summary['list_size']);
	}

	/**
	 * Reset position
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Reset crawler position
	 *     $ wp litespeed-crawler reset
	 *
	 */
	public function reset()
	{
		$this->__crawler->reset_pos();

		$summary = Crawler2::get_summary();

		WP_CLI::success('Reset position. Current crawler #' . ($summary['curr_crawler'] + 1) . ' [position] ' . $summary['last_pos'] . ' [total] ' . $summary['list_size']);
	}
}
online.cls.php000064400000006305151730712240007327 0ustar00<?php

namespace LiteSpeed\CLI;

defined('WPINC') || exit();

use LiteSpeed\Debug2;
use LiteSpeed\Cloud;
use WP_CLI;

/**
 * QUIC.cloud API CLI
 */
class Online
{
	private $__cloud;

	public function __construct()
	{
		Debug2::debug('CLI_Cloud init');

		$this->__cloud = Cloud::cls();
	}

	/**
	 * Generate domain key from QUIC.cloud server (See https://quic.cloud/terms/)
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Generate domain API key from QUIC.cloud
	 *     $ wp litespeed-online init
	 *
	 */
	public function init()
	{
		$key = $this->__cloud->gen_key();
		if ($key) {
			WP_CLI::success('key = ' . $key);
		}
	}

	/**
	 * Sync usage data from QUIC.cloud
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Sync QUIC.cloud service usage info
	 *     $ wp litespeed-online sync
	 *
	 */
	public function sync($args, $assoc_args)
	{
		$json = $this->__cloud->sync_usage();

		if (!empty($assoc_args['format'])) {
			WP_CLI::print_value($json, $assoc_args);
			return;
		}

		WP_CLI::success('Sync successfully');

		$list = array();
		foreach (Cloud::$SERVICES as $v) {
			$list[] = array(
				'key' => $v,
				'used' => !empty($json['usage.' . $v]['used']) ? $json['usage.' . $v]['used'] : 0,
				'quota' => !empty($json['usage.' . $v]['quota']) ? $json['usage.' . $v]['quota'] : 0,
				'PayAsYouGo_Used' => !empty($json['usage.' . $v]['pag_used']) ? $json['usage.' . $v]['pag_used'] : 0,
				'PayAsYouGo_Balance' => !empty($json['usage.' . $v]['pag_bal']) ? $json['usage.' . $v]['pag_bal'] : 0,
			);
		}

		WP_CLI\Utils\format_items('table', $list, array('key', 'used', 'quota', 'PayAsYouGo_Used', 'PayAsYouGo_Balance'));
	}

	/**
	 * List all QUIC.cloud services
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # List all services tag
	 *     $ wp litespeed-online services
	 *
	 */
	public function services($args, $assoc_args)
	{
		if (!empty($assoc_args['format'])) {
			WP_CLI::print_value(Cloud::$SERVICES, $assoc_args);
			return;
		}

		$list = array();
		foreach (Cloud::$SERVICES as $v) {
			$list[] = array(
				'service' => $v,
			);
		}

		WP_CLI\Utils\format_items('table', $list, array('service'));
	}

	/**
	 * List all QUIC.cloud servers in use
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # List all QUIC.cloud servers in use
	 *     $ wp litespeed-online nodes
	 *
	 */
	public function nodes($args, $assoc_args)
	{
		$json = Cloud::get_summary();

		$list = array();
		$json_output = array();
		foreach (Cloud::$SERVICES as $v) {
			$server = !empty($json['server.' . $v]) ? $json['server.' . $v] : '';
			$list[] = array(
				'service' => $v,
				'server' => $server,
			);
			$json_output[] = array($v => $server);
		}

		if (!empty($assoc_args['format'])) {
			WP_CLI::print_value($json_output, $assoc_args);
			return;
		}

		WP_CLI\Utils\format_items('table', $list, array('service', 'server'));
	}

	/**
	 * Detect closest node server for current service
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Detect closest node for one service
	 *     $ wp litespeed-online ping img_optm
	 *
	 */
	public function ping($param)
	{
		$svc = $param[0];
		$json = $this->__cloud->detect_cloud($svc);
		WP_CLI::success('Updated closest server.');
		WP_CLI::log('svc = ' . $svc);
		WP_CLI::log('node = ' . $json);
	}
}
purge.cls.php000064400000015244151730712240007167 0ustar00<?php
namespace LiteSpeed\CLI;

defined('WPINC') || exit();

use LiteSpeed\Core;
use LiteSpeed\Router;
use LiteSpeed\Admin_Display;
use WP_CLI;

/**
 * LiteSpeed Cache Purge Interface
 */
class Purge
{
	/**
	 * List all site domains and ids on the network.
	 *
	 * For use with the blog subcommand.
	 *
	 * ## EXAMPLES
	 *
	 *     # List all the site domains and ids in a table.
	 *     $ wp litespeed-purge network_list
	 */
	public function network_list($args)
	{
		if (!is_multisite()) {
			WP_CLI::error('This is not a multisite installation!');

			return;
		}
		$buf = WP_CLI::colorize("%CThe list of installs:%n\n");

		if (version_compare($GLOBALS['wp_version'], '4.6', '<')) {
			$sites = wp_get_sites();
			foreach ($sites as $site) {
				$buf .= WP_CLI::colorize('%Y' . $site['domain'] . $site['path'] . ':%n ID ' . $site['blog_id']) . "\n";
			}
		} else {
			$sites = get_sites();
			foreach ($sites as $site) {
				$buf .= WP_CLI::colorize('%Y' . $site->domain . $site->path . ':%n ID ' . $site->blog_id) . "\n";
			}
		}

		WP_CLI::line($buf);
	}

	/**
	 * Sends an ajax request to the site. Takes an action and the nonce string to perform.
	 *
	 * @since 1.0.14
	 */
	private function _send_request($action, $extra = array())
	{
		$data = array(
			Router::ACTION => $action,
			Router::NONCE => wp_create_nonce($action),
		);
		if (!empty($extra)) {
			$data = array_merge($data, $extra);
		}

		$url = admin_url('admin-ajax.php');
		WP_CLI::debug('URL is ' . $url);

		$out = WP_CLI\Utils\http_request('GET', $url, $data);
		return $out;
	}

	/**
	 * Purges all cache entries for the blog (the entire network if multisite).
	 *
	 * ## EXAMPLES
	 *
	 *     # Purge Everything associated with the WordPress install.
	 *     $ wp litespeed-purge all
	 *
	 */
	public function all($args)
	{
		if (is_multisite()) {
			$action = Core::ACTION_QS_PURGE_EMPTYCACHE;
		} else {
			$action = Core::ACTION_QS_PURGE_ALL;
		}

		$purge_ret = $this->_send_request($action);

		if ($purge_ret->success) {
			WP_CLI::success(__('Purged All!', 'litespeed-cache'));
		} else {
			WP_CLI::error('Something went wrong! Got ' . $purge_ret->status_code);
		}
	}

	/**
	 * Purges all cache entries for the blog.
	 *
	 * ## OPTIONS
	 *
	 * <blogid>
	 * : The blog id to purge
	 *
	 * ## EXAMPLES
	 *
	 *     # In a multisite install, purge only the shop.example.com cache (stored as blog id 2).
	 *     $ wp litespeed-purge blog 2
	 *
	 */
	public function blog($args)
	{
		if (!is_multisite()) {
			WP_CLI::error('Not a multisite installation.');
			return;
		}
		$blogid = $args[0];
		if (!is_numeric($blogid)) {
			$error = WP_CLI::colorize('%RError: invalid blog id entered.%n');
			WP_CLI::line($error);
			$this->network_list($args);
			return;
		}
		$site = get_blog_details($blogid);
		if ($site === false) {
			$error = WP_CLI::colorize('%RError: invalid blog id entered.%n');
			WP_CLI::line($error);
			$this->network_list($args);
			return;
		}
		switch_to_blog($blogid);

		$purge_ret = $this->_send_request(Core::ACTION_QS_PURGE_ALL);
		if ($purge_ret->success) {
			WP_CLI::success(__('Purged the blog!', 'litespeed-cache'));
		} else {
			WP_CLI::error('Something went wrong! Got ' . $purge_ret->status_code);
		}
	}

	/**
	 * Purges all cache tags related to a url.
	 *
	 * ## OPTIONS
	 *
	 * <url>
	 * : The url to purge.
	 *
	 * ## EXAMPLES
	 *
	 *     # Purge the front page.
	 *     $ wp litespeed-purge url https://mysite.com/
	 *
	 */
	public function url($args)
	{
		$data = array(
			Router::ACTION => Core::ACTION_QS_PURGE,
		);
		$url = $args[0];
		$deconstructed = wp_parse_url($url);
		if (empty($deconstructed)) {
			WP_CLI::error('url passed in is invalid.');
			return;
		}

		if (is_multisite()) {
			if (get_blog_id_from_url($deconstructed['host'], '/') === 0) {
				WP_CLI::error('Multisite url passed in is invalid.');
				return;
			}
		} else {
			$deconstructed_site = wp_parse_url(get_home_url());
			if ($deconstructed['host'] !== $deconstructed_site['host']) {
				WP_CLI::error('Single site url passed in is invalid.');
				return;
			}
		}

		WP_CLI::debug('url is ' . $url);

		$purge_ret = WP_CLI\Utils\http_request('GET', $url, $data);
		if ($purge_ret->success) {
			WP_CLI::success(__('Purged the url!', 'litespeed-cache'));
		} else {
			WP_CLI::error('Something went wrong! Got ' . $purge_ret->status_code);
		}
	}

	/**
	 * Helper function for purging by ids.
	 *
	 * @access private
	 * @since 1.0.15
	 * @param array $args The id list to parse.
	 * @param string $select The purge by kind
	 * @param function(int $id) $callback The callback function to check the id.
	 */
	private function _purgeby($args, $select, $callback)
	{
		$filtered = array();
		foreach ($args as $val) {
			if (!ctype_digit($val)) {
				WP_CLI::debug('[LSCACHE] Skip val, not a number. ' . $val);
				continue;
			}
			$term = $callback($val);
			if (!empty($term)) {
				WP_CLI::line($term->name);
				$filtered[] = in_array($callback, array('get_tag', 'get_category')) ? $term->name : $val;
			} else {
				WP_CLI::debug('[LSCACHE] Skip val, not a valid term. ' . $val);
			}
		}

		if (empty($filtered)) {
			WP_CLI::error('Arguments must be integer ids.');
			return;
		}

		$str = implode(',', $filtered);

		$purge_titles = array(
			0 => 'Category',
			1 => 'Post ID',
			2 => 'Tag',
			3 => 'URL',
		);

		WP_CLI::line('Will purge the following: [' . $purge_titles[$select] . '] ' . $str);

		$data = array(
			Admin_Display::PURGEBYOPT_SELECT => $select,
			Admin_Display::PURGEBYOPT_LIST => $str,
		);

		$purge_ret = $this->_send_request(Core::ACTION_PURGE_BY, $data);
		if ($purge_ret->success) {
			WP_CLI::success(__('Purged!', 'litespeed-cache'));
		} else {
			WP_CLI::error('Something went wrong! Got ' . $purge_ret->status_code);
		}
	}

	/**
	 * Purges cache tags for a WordPress tag
	 *
	 * ## OPTIONS
	 *
	 * <ids>...
	 * : the Term IDs to purge.
	 *
	 * ## EXAMPLES
	 *
	 *     # Purge the tag ids 1, 3, and 5
	 *     $ wp litespeed-purge tag 1 3 5
	 *
	 */
	public function tag($args)
	{
		$this->_purgeby($args, Admin_Display::PURGEBY_TAG, 'get_tag');
	}

	/**
	 * Purges cache tags for a WordPress category
	 *
	 * ## OPTIONS
	 *
	 * <ids>...
	 * : the Term IDs to purge.
	 *
	 * ## EXAMPLES
	 *
	 *     # Purge the category ids 1, 3, and 5
	 *     $ wp litespeed-purge category 1 3 5
	 *
	 */
	public function category($args)
	{
		$this->_purgeby($args, Admin_Display::PURGEBY_CAT, 'get_category');
	}

	/**
	 * Purges cache tags for a WordPress Post/Product
	 *
	 * @alias product
	 *
	 * ## OPTIONS
	 *
	 * <ids>...
	 * : the Post IDs to purge.
	 *
	 * ## EXAMPLES
	 *
	 *     # Purge the post ids 1, 3, and 5
	 *     $ wp litespeed-purge post_id 1 3 5
	 *
	 */
	public function post_id($args)
	{
		$this->_purgeby($args, Admin_Display::PURGEBY_PID, 'get_post');
	}
}
debug.cls.php000064400000001044151730712250007125 0ustar00<?php
namespace LiteSpeed\CLI;
defined('WPINC') || exit();

use LiteSpeed\Debug2;
use LiteSpeed\Report;
use WP_CLI;

/**
 * Debug API CLI
 */
class Debug
{
	private $__report;

	public function __construct()
	{
		Debug2::debug('CLI_Debug init');

		$this->__report = Report::cls();
	}

	/**
	 * Send report
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Send env report to LiteSpeed
	 *     $ wp litespeed-debug send
	 *
	 */
	public function send()
	{
		$num = $this->__report->post_env();
		WP_CLI::success('Report Number = ' . $num);
	}
}
presets.cls.php000064400000002660151730712250007531 0ustar00<?php
namespace LiteSpeed\CLI;
defined('WPINC') || exit();

use LiteSpeed\Debug2;
use LiteSpeed\Preset;
use WP_CLI;

/**
 * Presets CLI
 */

class Presets
{
	private $__preset;

	public function __construct()
	{
		Debug2::debug('CLI_Presets init');

		$this->__preset = Preset::cls();
	}

	/**
	 * Applies a standard preset's settings.
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Apply the preset called "basic"
	 *     $ wp litespeed-presets apply basic
	 *
	 */

	public function apply($args)
	{
		$preset = $args[0];

		if (!isset($preset)) {
			WP_CLI::error('Please specify a preset to apply.');
			return;
		}

		return $this->__preset->apply($preset);
	}

	/**
	 * Returns sorted backup names.
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Get all backups
	 *     $ wp litespeed-presets get_backups
	 *
	 */

	public function get_backups()
	{
		$backups = $this->__preset->get_backups();

		foreach ($backups as $backup) {
			WP_CLI::line($backup);
		}
	}

	/**
	 * Restores settings from the backup file with the given timestamp, then deletes the file.
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Restore the backup with the timestamp 1667485245
	 *     $ wp litespeed-presets restore 1667485245
	 *
	 */

	public function restore($args)
	{
		$timestamp = $args[0];

		if (!isset($timestamp)) {
			WP_CLI::error('Please specify a timestamp to restore.');
			return;
		}

		return $this->__preset->restore($timestamp);
	}
}
option.cls.php000064400000021154151730712250007353 0ustar00<?php
namespace LiteSpeed\CLI;

defined('WPINC') || exit();

use LiteSpeed\Base;
use LiteSpeed\Admin_Settings;
use LiteSpeed\Utility;
use WP_CLI;

/**
 * LiteSpeed Cache option Interface
 */
class Option extends Base
{
	/**
	 * Set an individual LiteSpeed Cache option.
	 *
	 * ## OPTIONS
	 *
	 * <key>
	 * : The option key to update.
	 *
	 * <newvalue>
	 * : The new value to set the option to.
	 *
	 * ## EXAMPLES
	 *
	 *     # Set to not cache the login page
	 *     $ wp litespeed-option set cache-priv false
	 *     $ wp litespeed-option set 'cdn-mapping[url][0]' https://cdn.EXAMPLE.com
	 *     $ wp litespeed-option set media-lqip_exc $'line1\nline2'
	 *
	 */
	public function set($args, $assoc_args)
	{
		/**
		 * Note: If the value is multiple dimensions like cdn-mapping, need to specially handle it both here and in `const.default.ini`
		 *
		 * For CDN/Crawler mutlti dimension settings, if all children are empty in one line, will delete that line. To delete one line, just set all to empty.
		 * E.g. to delete cdn-mapping[0], need to run below:
		 * 											`set cdn-mapping[url][0] ''`
		 * 											`set cdn-mapping[inc_img][0] ''`
		 * 											`set cdn-mapping[inc_css][0] ''`
		 * 											`set cdn-mapping[inc_js][0] ''`
		 * 											`set cdn-mapping[filetype][0] ''`
		 */
		$key = $args[0];
		$val = $args[1];

		/**
		 * For CDN mapping, allow:
		 * 		`set 'cdn-mapping[url][0]' https://the1st_cdn_url`
		 * 		`set 'cdn-mapping[inc_img][0]' true`
		 * 		`set 'cdn-mapping[inc_img][0]' 1`
		 * @since  2.7.1
		 *
		 * For Crawler cookies:
		 * 		`set 'crawler-cookies[name][0]' my_currency`
		 * 		`set 'crawler-cookies[vals][0]' "USD\nTWD"`
		 *
		 * For multi lines setting:
		 * 		`set media-lqip_exc $'img1.jpg\nimg2.jpg'`
		 */

		// Build raw data
		$raw_data = array(
			Admin_Settings::ENROLL => array($key),
		);

		// Contains child set
		if (strpos($key, '[')) {
			parse_str($key . '=' . $val, $key2);
			$raw_data = array_merge($raw_data, $key2);
		} else {
			$raw_data[$key] = $val;
		}

		$this->cls('Admin_Settings')->save($raw_data);
		WP_CLI::line("$key:");
		$this->get($args, $assoc_args);
	}

	/**
	 * Get the plugin options.
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Get all options
	 *     $ wp litespeed-option all
	 *     $ wp litespeed-option all --json
	 *
	 */
	public function all($args, $assoc_args)
	{
		$options = $this->get_options();

		if (!empty($assoc_args['format'])) {
			WP_CLI::print_value($options, $assoc_args);
			return;
		}

		$option_out = array();

		$buf = WP_CLI::colorize('%CThe list of options:%n');
		WP_CLI::line($buf);

		foreach ($options as $k => $v) {
			if ($k == self::O_CDN_MAPPING || $k == self::O_CRAWLER_COOKIES) {
				foreach ($v as $k2 => $v2) {
					// $k2 is numeric
					if (is_array($v2)) {
						foreach ($v2 as $k3 => $v3) {
							// $k3 = 'url/inc_img/name/vals'
							if (is_array($v3)) {
								$option_out[] = array('key' => '', 'value' => '');
								foreach ($v3 as $k4 => $v4) {
									$option_out[] = array('key' => $k4 == 0 ? "{$k}[$k3][$k2]" : '', 'value' => $v4);
								}
								$option_out[] = array('key' => '', 'value' => '');
							} else {
								$option_out[] = array('key' => "{$k}[$k3][$k2]", 'value' => $v3);
							}
						}
					}
				}
				continue;
			} elseif (is_array($v) && $v) {
				// $v = implode( PHP_EOL, $v );
				$option_out[] = array('key' => '', 'value' => '');
				foreach ($v as $k2 => $v2) {
					$option_out[] = array('key' => $k2 == 0 ? $k : '', 'value' => $v2);
				}
				$option_out[] = array('key' => '', 'value' => '');
				continue;
			}

			if (array_key_exists($k, self::$_default_options) && is_bool(self::$_default_options[$k]) && !$v) {
				$v = 0;
			}

			if ($v === '' || $v === array()) {
				$v = "''";
			}

			$option_out[] = array('key' => $k, 'value' => $v);
		}

		WP_CLI\Utils\format_items('table', $option_out, array('key', 'value'));
	}

	/**
	 * Get the plugin options.
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Get one option
	 *     $ wp litespeed-option get cache-priv
	 *     $ wp litespeed-option get 'cdn-mapping[url][0]'
	 *
	 */
	public function get($args, $assoc_args)
	{
		$id = $args[0];

		$child = false;
		if (strpos($id, '[')) {
			parse_str($id, $id2);
			Utility::compatibility();
			$id = array_key_first($id2);

			$child = array_key_first($id2[$id]); // `url`
			if (!$child) {
				WP_CLI::error('Wrong child key');
				return;
			}
			$numeric = array_key_first($id2[$id][$child]); // `0`
			if ($numeric === null) {
				WP_CLI::error('Wrong 2nd level numeric key');
				return;
			}
		}

		if (!isset(self::$_default_options[$id])) {
			WP_CLI::error('ID not exist [id] ' . $id);
			return;
		}

		$v = $this->conf($id);
		$default_v = self::$_default_options[$id];

		/**
		 * For CDN_mapping and crawler_cookies
		 * Examples of option name:
		 * 		cdn-mapping[url][0]
		 * 		crawler-cookies[name][1]
		 */
		if ($id == self::O_CDN_MAPPING) {
			if (!in_array($child, array(self::CDN_MAPPING_URL, self::CDN_MAPPING_INC_IMG, self::CDN_MAPPING_INC_CSS, self::CDN_MAPPING_INC_JS, self::CDN_MAPPING_FILETYPE))) {
				WP_CLI::error('Wrong child key');
				return;
			}
		}
		if ($id == self::O_CRAWLER_COOKIES) {
			if (!in_array($child, array(self::CRWL_COOKIE_NAME, self::CRWL_COOKIE_VALS))) {
				WP_CLI::error('Wrong child key');
				return;
			}
		}

		if ($id == self::O_CDN_MAPPING || $id == self::O_CRAWLER_COOKIES) {
			if (!empty($v[$numeric][$child])) {
				$v = $v[$numeric][$child];
			} else {
				if ($id == self::O_CDN_MAPPING) {
					if (in_array($child, array(self::CDN_MAPPING_INC_IMG, self::CDN_MAPPING_INC_CSS, self::CDN_MAPPING_INC_JS))) {
						$v = 0;
					} else {
						$v = "''";
					}
				} else {
					$v = "''";
				}
			}
		}

		if (is_array($v)) {
			$v = implode(PHP_EOL, $v);
		}

		if (!$v && $id != self::O_CDN_MAPPING && $id != self::O_CRAWLER_COOKIES) {
			// empty array for CDN/crawler has been handled
			if (is_bool($default_v)) {
				$v = 0;
			} elseif (!is_array($default_v)) {
				$v = "''";
			}
		}

		WP_CLI::line($v);
	}

	/**
	 * Export plugin options to a file.
	 *
	 * ## OPTIONS
	 *
	 * [--filename=<path>]
	 * : The default path used is CURRENTDIR/lscache_wp_options_DATE-TIME.txt.
	 * To select a different file, use this option.
	 *
	 * ## EXAMPLES
	 *
	 *     # Export options to a file.
	 *     $ wp litespeed-option export
	 *
	 */
	public function export($args, $assoc_args)
	{
		if (isset($assoc_args['filename'])) {
			$file = $assoc_args['filename'];
		} else {
			$file = getcwd() . '/litespeed_options_' . date('d_m_Y-His') . '.data';
		}

		if (!is_writable(dirname($file))) {
			WP_CLI::error('Directory not writable.');
			return;
		}

		$data = $this->cls('Import')->export(true);

		if (file_put_contents($file, $data) === false) {
			WP_CLI::error('Failed to create file.');
		} else {
			WP_CLI::success('Created file ' . $file);
		}
	}

	/**
	 * Import plugin options from a file.
	 *
	 * The file must be formatted as such:
	 * option_key=option_value
	 * One per line.
	 * A Semicolon at the beginning of the line indicates a comment and will be skipped.
	 *
	 * ## OPTIONS
	 *
	 * <file>
	 * : The file to import options from.
	 *
	 * ## EXAMPLES
	 *
	 *     # Import options from CURRENTDIR/options.txt
	 *     $ wp litespeed-option import options.txt
	 *
	 */
	public function import($args, $assoc_args)
	{
		$file = $args[0];
		if (!file_exists($file) || !is_readable($file)) {
			WP_CLI::error('File does not exist or is not readable.');
		}

		$res = $this->cls('Import')->import($file);

		if (!$res) {
			WP_CLI::error('Failed to parse serialized data from file.');
		}

		WP_CLI::success('Options imported. [File] ' . $file);
	}

	/**
	 * Import plugin options from a remote file.
	 *
	 * The file must be formatted as such:
	 * option_key=option_value
	 * One per line.
	 * A Semicolon at the beginning of the line indicates a comment and will be skipped.
	 *
	 * ## OPTIONS
	 *
	 * <url>
	 * : The URL to import options from.
	 *
	 * ## EXAMPLES
	 *
	 *     # Import options from https://domain.com/options.txt
	 *     $ wp litespeed-option import_remote https://domain.com/options.txt
	 *
	 */

	public function import_remote($args, $assoc_args)
	{
		$file = $args[0];

		$tmp_file = download_url($file);

		if (is_wp_error($tmp_file)) {
			WP_CLI::error('Failed to download file.');
			return;
		}

		$res = $this->cls('Import')->import($tmp_file);

		if (!$res) {
			WP_CLI::error('Failed to parse serialized data from file.');
		}

		WP_CLI::success('Options imported. [File] ' . $file);
	}

	/**
	 * Reset all options to default.
	 *
	 * ## EXAMPLES
	 *
	 *     # Reset all options
	 *     $ wp litespeed-option reset
	 *
	 */
	public function reset()
	{
		$this->cls('Import')->reset();
	}
}
image.cls.php000064400000006434151730712250007131 0ustar00<?php

namespace LiteSpeed\CLI;

defined('WPINC') || exit();

use LiteSpeed\Lang;
use LiteSpeed\Debug2;
use LiteSpeed\Img_Optm;
use LiteSpeed\Utility;
use WP_CLI;

/**
 * Image Optm API CLI
 */
class Image
{
	private $__img_optm;

	public function __construct()
	{
		Debug2::debug('CLI_Cloud init');

		$this->__img_optm = Img_Optm::cls();
	}

	/**
	 * Batch toggle optimized images w/ original images
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Switch to original images
	 *     $ wp litespeed-image batch_switch orig
	 *
	 *     # Switch to optimized images
	 *     $ wp litespeed-image batch_switch optm
	 *
	 */
	public function batch_switch($param)
	{
		$type = $param[0];
		$this->__img_optm->batch_switch($type);
	}

	/**
	 * Send image optimization request to QUIC.cloud server
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Send image optimization request
	 *     $ wp litespeed-image push
	 *
	 */
	public function push()
	{
		$this->__img_optm->new_req();
	}

	/**
	 * Pull optimized images from QUIC.cloud server
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Pull images back from cloud
	 *     $ wp litespeed-image pull
	 *
	 */
	public function pull()
	{
		$this->__img_optm->pull(true);
	}

	/**
	 * Show optimization status based on local data
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Show optimization status
	 *     $ wp litespeed-image s
	 *
	 */
	public function s()
	{
		$this->status();
	}

	/**
	 * Show optimization status based on local data
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Show optimization status
	 *     $ wp litespeed-image status
	 *
	 */
	public function status()
	{
		$summary = Img_Optm::get_summary();
		$img_count = $this->__img_optm->img_count();
		foreach (Lang::img_status() as $k => $v) {
			if (isset($img_count["img.$k"])) {
				$img_count["$v - images"] = $img_count["img.$k"];
				unset($img_count["img.$k"]);
			}
			if (isset($img_count["group.$k"])) {
				$img_count["$v - groups"] = $img_count["group.$k"];
				unset($img_count["group.$k"]);
			}
		}

		foreach (array('reduced', 'reduced_webp') as $v) {
			if (!empty($summary[$v])) {
				$summary[$v] = Utility::real_size($summary[$v]);
			}
		}

		if (!empty($summary['last_requested'])) {
			$summary['last_requested'] = date('m/d/y H:i:s', $summary['last_requested']);
		}

		$list = array();
		foreach ($summary as $k => $v) {
			$list[] = array('key' => $k, 'value' => $v);
		}

		$list2 = array();
		foreach ($img_count as $k => $v) {
			if (!$v) {
				continue;
			}
			$list2[] = array('key' => $k, 'value' => $v);
		}

		WP_CLI\Utils\format_items('table', $list, array('key', 'value'));

		WP_CLI::line(WP_CLI::colorize('%CImages in database summary:%n'));
		WP_CLI\Utils\format_items('table', $list2, array('key', 'value'));
	}

	/**
	 * Clean up unfinished image data from QUIC.cloud server
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Clean up unfinished requests
	 *     $ wp litespeed-image clean
	 *
	 */
	public function clean()
	{
		$this->__img_optm->clean();

		WP_CLI::line(WP_CLI::colorize('%CLatest status:%n'));

		$this->status();
	}

	/**
	 * Remove original image backups
	 *
	 * ## OPTIONS
	 *
	 * ## EXAMPLES
	 *
	 *     # Remove original image backups
	 *     $ wp litespeed-image rm_bkup
	 *
	 */
	public function rm_bkup()
	{
		$this->__img_optm->rm_bkup();
	}
}
__pycache__/chardetect.cpython-36.pyc000064400000005671151731502720013524 0ustar003

�&�]�
�@srdZddlmZmZmZddlZddlZddlmZddl	m
Z
ddlmZd
dd	�Z
dd
d�Zedkrne�dS)a
Script which takes one or more file paths and reports on their detected
encodings

Example::

    % chardetect somefile someotherfile
    somefile: windows-1252 with confidence 0.5
    someotherfile: ascii with confidence 1.0

If no paths are provided, it takes its input from stdin.

�)�absolute_import�print_function�unicode_literalsN)�__version__)�PY2)�UniversalDetector�stdincCs|t�}x&|D]}t|�}|j|�|jrPqW|j�|j}trP|jtj	�d�}|drndj
||d|d�Sdj
|�SdS)z�
    Return a string describing the probable encoding of a file or
    list of strings.

    :param lines: The lines to get the encoding of.
    :type lines: Iterable of bytes
    :param name: Name of file or collection of lines
    :type name: str
    �ignore�encodingz{0}: {1} with confidence {2}Z
confidencez{0}: no resultN)r�	bytearrayZfeed�done�close�resultr�decode�sys�getfilesystemencoding�format)�lines�name�u�liner�r� /usr/lib/python3.6/chardetect.py�description_ofs



rcCs�tjdd�}|jddtjd�dtr(tjntjjgd�|jdd	d
jt	�d�|j
|�}x4|jD]*}|j�rxt
dtjd�t
t||j��q^WdS)z�
    Handles command line arguments and gets things started.

    :param argv: List of arguments, as if specified on the command-line.
                 If None, ``sys.argv[1:]`` is used instead.
    :type argv: list of str
    zVTakes one or more file paths and reports their detected                      encodings)�description�inputz^File whose encoding we would like to determine.                               (default: stdin)�rb�*)�help�type�nargs�defaultz	--version�versionz%(prog)s {0})�actionr"z0You are running chardetect interactively. Press z8CTRL-D twice at the start of a blank line to signal the z4end of your input. If you want help, run chardetect z--help
)�fileNzhYou are running chardetect interactively. Press CTRL-D twice at the start of a blank line to signal the z�You are running chardetect interactively. Press CTRL-D twice at the start of a blank line to signal the end of your input. If you want help, run chardetect z�You are running chardetect interactively. Press CTRL-D twice at the start of a blank line to signal the end of your input. If you want help, run chardetect --help
)�argparse�ArgumentParser�add_argumentZFileTyperrr�bufferrr�
parse_argsr�isatty�print�stderrrr)�argv�parser�args�frrr�main5s	

r1�__main__)r)N)�__doc__Z
__future__rrrr%rZchardetrZchardet.compatrZchardet.universaldetectorrrr1�__name__rrrr�<module>
s

__pycache__/__init__.cpython-36.pyc000064400000000161151731502730013143 0ustar003

��X�@sdS)N�rrr�/usr/lib/python3.6/__init__.py�<module>s__pycache__/__init__.cpython-36.opt-1.pyc000064400000000161151731502750014104 0ustar003

��X�@sdS)N�rrr�/usr/lib/python3.6/__init__.py�<module>s__pycache__/chardetect.cpython-36.opt-1.pyc000064400000005671151731502750014466 0ustar003

�&�]�
�@srdZddlmZmZmZddlZddlZddlmZddl	m
Z
ddlmZd
dd	�Z
dd
d�Zedkrne�dS)a
Script which takes one or more file paths and reports on their detected
encodings

Example::

    % chardetect somefile someotherfile
    somefile: windows-1252 with confidence 0.5
    someotherfile: ascii with confidence 1.0

If no paths are provided, it takes its input from stdin.

�)�absolute_import�print_function�unicode_literalsN)�__version__)�PY2)�UniversalDetector�stdincCs|t�}x&|D]}t|�}|j|�|jrPqW|j�|j}trP|jtj	�d�}|drndj
||d|d�Sdj
|�SdS)z�
    Return a string describing the probable encoding of a file or
    list of strings.

    :param lines: The lines to get the encoding of.
    :type lines: Iterable of bytes
    :param name: Name of file or collection of lines
    :type name: str
    �ignore�encodingz{0}: {1} with confidence {2}Z
confidencez{0}: no resultN)r�	bytearrayZfeed�done�close�resultr�decode�sys�getfilesystemencoding�format)�lines�name�u�liner�r� /usr/lib/python3.6/chardetect.py�description_ofs



rcCs�tjdd�}|jddtjd�dtr(tjntjjgd�|jdd	d
jt	�d�|j
|�}x4|jD]*}|j�rxt
dtjd�t
t||j��q^WdS)z�
    Handles command line arguments and gets things started.

    :param argv: List of arguments, as if specified on the command-line.
                 If None, ``sys.argv[1:]`` is used instead.
    :type argv: list of str
    zVTakes one or more file paths and reports their detected                      encodings)�description�inputz^File whose encoding we would like to determine.                               (default: stdin)�rb�*)�help�type�nargs�defaultz	--version�versionz%(prog)s {0})�actionr"z0You are running chardetect interactively. Press z8CTRL-D twice at the start of a blank line to signal the z4end of your input. If you want help, run chardetect z--help
)�fileNzhYou are running chardetect interactively. Press CTRL-D twice at the start of a blank line to signal the z�You are running chardetect interactively. Press CTRL-D twice at the start of a blank line to signal the end of your input. If you want help, run chardetect z�You are running chardetect interactively. Press CTRL-D twice at the start of a blank line to signal the end of your input. If you want help, run chardetect --help
)�argparse�ArgumentParser�add_argumentZFileTyperrr�bufferrr�
parse_argsr�isatty�print�stderrrr)�argv�parser�args�frrr�main5s	

r1�__main__)r)N)�__doc__Z
__future__rrrr%rZchardetrZchardet.compatrZchardet.universaldetectorrrr1�__name__rrrr�<module>
s

__init__.py000064400000000001151731502770006654 0ustar00
chardetect.py000064400000005234151731503010007224 0ustar00"""
Script which takes one or more file paths and reports on their detected
encodings

Example::

    % chardetect somefile someotherfile
    somefile: windows-1252 with confidence 0.5
    someotherfile: ascii with confidence 1.0

If no paths are provided, it takes its input from stdin.

"""

from __future__ import absolute_import, print_function, unicode_literals

import argparse
import sys

from chardet import __version__
from chardet.compat import PY2
from chardet.universaldetector import UniversalDetector


def description_of(lines, name='stdin'):
    """
    Return a string describing the probable encoding of a file or
    list of strings.

    :param lines: The lines to get the encoding of.
    :type lines: Iterable of bytes
    :param name: Name of file or collection of lines
    :type name: str
    """
    u = UniversalDetector()
    for line in lines:
        line = bytearray(line)
        u.feed(line)
        # shortcut out of the loop to save reading further - particularly useful if we read a BOM.
        if u.done:
            break
    u.close()
    result = u.result
    if PY2:
        name = name.decode(sys.getfilesystemencoding(), 'ignore')
    if result['encoding']:
        return '{0}: {1} with confidence {2}'.format(name, result['encoding'],
                                                     result['confidence'])
    else:
        return '{0}: no result'.format(name)


def main(argv=None):
    """
    Handles command line arguments and gets things started.

    :param argv: List of arguments, as if specified on the command-line.
                 If None, ``sys.argv[1:]`` is used instead.
    :type argv: list of str
    """
    # Get command line arguments
    parser = argparse.ArgumentParser(
        description="Takes one or more file paths and reports their detected \
                     encodings")
    parser.add_argument('input',
                        help='File whose encoding we would like to determine. \
                              (default: stdin)',
                        type=argparse.FileType('rb'), nargs='*',
                        default=[sys.stdin if PY2 else sys.stdin.buffer])
    parser.add_argument('--version', action='version',
                        version='%(prog)s {0}'.format(__version__))
    args = parser.parse_args(argv)

    for f in args.input:
        if f.isatty():
            print("You are running chardetect interactively. Press " +
                  "CTRL-D twice at the start of a blank line to signal the " +
                  "end of your input. If you want help, run chardetect " +
                  "--help\n", file=sys.stderr)
        print(description_of(f, f.name))


if __name__ == '__main__':
    main()
qdisc/fq_codel.so000075500000027400151734743000010000 0ustar00ELF>�
@�'@8	@�� 88 8 �� `` ` 888$$���  S�td���  P�td���44Q�tdR�td88 8 ��GNU+p2�d���a�2E
��r�Z�@ BE���|�qX�+ ��h�U�a y, >F"m! �! t! __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longoptargnl_cli_parse_u32rtnl_qdisc_fq_codel_set_targetrtnl_qdisc_fq_codel_set_limitputsrtnl_qdisc_fq_codel_set_flowsrtnl_qdisc_fq_codel_set_intervalrtnl_qdisc_fq_codel_set_quantum__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endfq_codel.soGLIBC_2.4GLIBC_2.2.5cii
�ui	�8 �@ H �P �
X X   J
   O
@  U
`  ]
�  c
�  l
�  s
�  �� � � � � x � � � � � � � 	� 
� 
� � ��H��H�� H��t��H����5 �% ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1�������%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D���%� D���%� D���%� D���%� D��H�=� ������H�=� �0���H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=b H��tH�=� �9����d����] ]������w������AVI��AUA��ATI��USH� H��dH�%(H�D$1�H�l$I��H��H�3L��D���D$�x������t=��~6=����=u�H�� H�8����L�����U������ht+=u�H�] H�8���L���������n���fDH�=����H�D$dH3%(urH��[]A\A]A^��H�	 H�8���L�����g�������f�H�� H�8�q���L�����w������f�H�� H�8�Q���L�������������]�����H��H���hhelplimitquantumflowsintervaltargetfq_codelUsage: nl-qdisc-add [...] fq_codel [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --limit=LIMIT         Maximum queue length in number of bytes.
     --quantum=SIZE        Amount of bytes to serve at once.
     --flows=N             Number of flows.
     --interval=N          The interval in usec.
     --target=N            The minimum delay in usec.

EXAMPLE    # Attach fq_codel with a 4096 packets limit to eth1
    nl-qdisc-add --dev=eth1 --parent=root fq_codel --limit=4096;4��P����xp���������P����zRx�$�����FJw�?:*3$"D0����@\����cF�E�E �D(�A0�K@�
0A(A BBBH����������GNU����
X Sc�@	
4
8 H ���o`p�
�`   p�	���o���o@���o�o���o
` p	�	�	�	�	�	�	�	�	

 
J
hO
U
]
c
l
s
�GA$3a1@	A
GA$3p1029�
3
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignfq_codel.so-3.7.0-1.el8.x86_64.debug��7zXZ�ִF!t/��W!]?�E�h=��ڊ�2N�	����dP�t�4�iZ��\yR+�*b=2%JHN����6�:����XB�ÊW�j��0G
�&!�/�Vٞ\qg�Q3x,��43�qx䵦ȏcǨ���G�S�7(�W����~fj�2(��s��ѫ
׾\�Jk5�����_����E��BM�j��jv�K�)!y�u�7�v���r���������
!v�����Yk��|�1�F�>�-�-O����‘�}�.j3��"��ך5��˫���b)�g��:�n��1�ĕM -��>z��ffd�+�}�m�N����zD/��|�XqG�����$�+9���~��N��Դ���s���郴%nA�WL�;��!���/�Z���}�;��I�Bg�O����a�
VSB�
���\cL��,xq�y���z3xm�5�x�+��s� 3H��Vy[)�`.wd�������E����È�3����w���U�}�6�I�/��Cu����<c��o�,i�#��tx-moy�>K�uP��u+'��H_@#	��U:��~V�2� � �/��@��!��'���׳B�`��O�7Vk"���,�'�0Ž��?mB$/*y���ZЦ��F��!�NUY���_��,/l.�b����W����������&��#6�T%���jza.Td�}�a[WP�\�AR���7!���ķ����.���S�,bF�|�i��sǺ'|}��yC'B-=�85H���%EA�<�<)�w|������;Fv��������g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(���0pp�8���o(E���o@@0Tpp�^B   h@	@	c`	`	�n0
0
�w�
�
C}4
4

�2H
H
8���4������� �8 8�H H�X X�` `�` `��    �! !�!`!�
#,0#d�&(qdisc/hfsc.so000075500000027750151734743000007157 0ustar00ELF>�@�(@8	@��   �� 88 8 888$$���  S�td���  P�td���DDQ�tdR�td  ��GNUG�K� �B�S%�{�����@ BE���|�qXr! ���w�c��� j, �4UF"\c�! v�! j�! __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizestrdupstrstrstrchrstrtoulfree__stack_chk_failgetopt_longoptargrtnl_class_hfsc_set_rscrtnl_class_hfsc_set_uscrtnl_class_hfsc_set_fscputsnl_cli_fatalnl_cli_parse_u32rtnl_qdisc_hfsc_set_defclsnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endhfsc.soGLIBC_2.4GLIBC_2.2.5Yii
�ui	� �
 
  �
( �0 0   j   o`  j�  w�  z�  ��  } ! �8! �`! �x! �� � � � � P X ` h p x � � 	� 
� � 
� � � � � � ��H��H�a H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h��������%� D���%} D���%u D���%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D��H��H�=A ���H�=u H�����f.�f���H��H�=Q ���H�= H�����f.�f�H�=Y H�R H9�tH�� H��t	�����H�=) H�5" H)�H��H��H��?H�H�tH�e H��t��fD�����=� u+UH�=B H��tH�=n ����d����� ]������w����AWAVAUATI��USH��dH�%(H�D$1����H���pH�5"H��H�����H���&�xL�p�8�,L�����H��H����H��
L�����A��L94$��H��H�5�H���,���H�����xL�x���,L�����H��H�����H��
L�����A��L9<$��H��H�5`H������H�����xH�XtvH��
H���V���I��H9$t]H�����E�,$1�E�t$E�|$H�L$dH3%(uKH��[]A\A]A^A_�fDH��E1�����DE1��p����H���8������문�����D��AWAVA��AUI��ATA���U1�SH��8H�|$L�|$H�\$dH�%(H�D$(1��M��H�
v L��D��H�\�D$�,�������3=��F��h��=u�H�� H��H�8���A�ą��H�|$H�ރ��	�����=��=�j���H�c H��H�8�h���A�ą���H�|$H�ރ�����8����H�) H��H�8�.���A�ą���H�|$H�ރ�������fDH�=����H�D$(dH3%(uoH��8[]A\A]A^A_�DH�� H��H�8����A�ą�x'H�|$H���"���덅�u�H�5
D��1����H�� H�5D��H�1��m���������AVI��AUA��ATI��USH�d H��dH�%(H�D$1�H�l$I��H��H��L��D���D$�[������t:��ht)=u�H��
 H�8����L����������H�=�����H�D$dH3%(u
H��[]A\A]A^������H��H���m1:d:m2:hInvalid argumentshvhelpdefaultrtlsulhfscUsage: nl-class-add [...] hfsc [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --ls=SC               Link-sharing service curve
     --rt=SC               Real-time service curve
     --sc=SC               Specifiy both of the above
     --ul=SC               Upper limit
     where SC := [ [ m1 bits ] d usec ] m2 bits

EXAMPLE    # Attach class 1:1 to hfsc qdisc 1: and use rt and ls curve
    nl-class-add --dev=eth1 --parent=1: --classid=1:1 hfsc --sc=m1:250,d:8,m2:100Unable to parse sc "%s": Invalid format.Usage: nl-qdisc-add [...] hfsc [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --default=ID          Default class for unclassified traffic.

EXAMPLE    # Create hfsc root qdisc 1: and direct unclassified traffic to class 1:10
    nl-qdisc-add --dev=eth1 --parent=root --handle=1: hfsc --default=10;D��`�����������|��������������8zRx�$@� FJw�?:*3$"D8���H\P����B�B�B �B(�D0�A8�DPN
8A0A(B BBBGH������F�B�E �E(�G0�C8�DpH
8A0A(B BBBF@�H����F�E�E �D(�A0�K@�
0A(A BBBA8����$HWP<���$HWGNU��

�
�0 IY{x

8   ���o`��
�8 ����	���o���o����o�o����o8 �
�
�
�
�
 0@P`p����jhojhwz�}����GA$3a1x
EGA$3p1029�6GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�
6GA+GLIBCXX_ASSERTIONShfsc.so-3.7.0-1.el8.x86_64.debug����7zXZ�ִF!t/���@]?�E�h=��ڊ�2N�`ca �����'�'�	��A�A"�X��:���0�]x���N|��|
�F�=#�n�2GYbx�`�h�&E8�{_����^�L�X�O��Y��<B@F=�)ŵ��(�l��@I�k�J�V��*˫իW!�{mWh��G0�5���]һ�ۣ�U:j�D�V}�6Y��؄S]~����lF�k/�6A[�*Hrv��rq��Q�̦��,�N�ɟ]E�����~h5
<'�g,)t��$��ly�̝���\x2zl��y��Q/��P�@��IAt�6����򿣔��Ƭ��m�3�?�M��VT��<X?�N��J��H��V�^�$�$�q�NGQ���w'��c�dU�Yqu@���'Rc	��N�������r�
��*��X�u��h�t��t$RnC����ʁ{d	X��ຄ�p�r1�4۲$�wI�nJ���c	�R���$š�/�[���'eǦ
D|4�ʢ�|���D�]�?F9ݎ}5s�q�Z{�0���S��;o�t�
�G�3�c�=񏐈��ʕ�D5ݚ�x�S�Y�x�:�eQG,q�nS�R�ٌ���8;Ty2梲�������v���&�J�oJZgsǀ��UǶ��7~���
�c5�ֆ�Q9�h@w��YP,!�	�>7�E���gý
�������<���Y.<kK���ի)ԝ�!�`��� �	��5�������Z�Y��1/�uVAf�Q�s��@u${r�"�g�l�]t=<�n�)L4�Sa�7
�a��!�>�ߢuc��6�B�z#c�m��A�$*{ld
D8H�tEIYT����H�����|p��g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(��X0���8���o��2E���o��0T���^B���hx
x
c�
�
 n��w��f}88
�2HH����D�@@h��� � �   �0 0�8 8�8 8��   � ��! �!��!`�!D
�#(�#�|'(qdisc/htb.so000075500000030070151734743000006776 0ustar00ELF>@
@�(@8	@pp   �� 88 8 888$$PPP  S�tdPPP  P�td���<<Q�tdR�td  ��GNU*`k�+�$���ͽ��w��@ BE���|�qXK a���Uf� ��y�, ^1mF"��! ��! ��! __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longputsoptargnl_size2intrtnl_htb_set_cbufferrtnl_htb_set_ceilnl_cli_parse_u32rtnl_htb_set_priortnl_htb_set_rbufferrtnl_htb_set_quantumrtnl_htb_set_rate__stack_chk_failnl_cli_fatalrtnl_htb_set_defclsrtnl_htb_set_rate2quantumnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endhtb.soGLIBC_2.4GLIBC_2.2.5�ii
�ui	� P p
  ( @
0 0   �   �@  ��  ��  ��  ��  �! � ! �@! ��! ��! `�! ��! �� � 
� � � P X ` h p x � � 	� � 
� � � � � � � ��H��H�� H��t��H����5* �%+ ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h��������% D���%
 D���% D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D��H��H�=1 ���H�=e H�����f.�f���H��H�=A ���H�=� H�����f.�f�H�=I H�B H9�tH� H��t	�����H�= H�5 H)�H��H��H��?H�H�tH�� H��t��fD�����=� u+UH�=� H��tH�=� ����d����� ]������w������AWAVI��AUA��ATI��USH� H��dH�%(H�D$1�H�l$f�I��H��H��L��D���D$�������t/=��N=�+����hu�H�=��\���H�D$dH3%(�#H��[]A\A]A^A_�f�=��|c=�h���L�=� I�?����H���,��L������A����L�=y I�?���H������L���N�������f�H�I H�8���L����������f�L�=) I�?�a���H������L����������f�L�=� I�?�1���H��xO��L���������DL�=� I�?�	���H��x��L������u����P���I���H�541����I���H�5�1����I���H�5�1�����I���H�5+1�����I���H�5�1�������AVI��AUA��ATI��USH�T H��dH�%(H�D$1�H�l$I��H��H��L��D���D$������t=t_=t8��hu�H�=d�G���H�D$dH3%(uUH��[]A\A]A^�f.�H�� H�8�!���L�����W����w���f�H�� H�8����L��������W����
�����H��H���hhvhelpr2qdefaultratequantumceilpriocbursthtbUsage: nl-class-add [...] htb [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --rate=RATE           Rate limit.
     --ceil=RATE           Rate limit while borrowing (default: equal to --rate).
     --prio=PRIO           Priority, lower is served first (default: 0).
     --quantum=SIZE        Amount of bytes to serve at once (default: rate/r2q).
     --burst=SIZE          Max charge size of rate burst buffer (default: auto).
     --cburst=SIZE         Max charge size of ceil rate burst buffer (default: auto)

EXAMPLE    # Attach class 1:1 to htb qdisc 1: and rate limit it to 20mbit
    nl-class-add --dev=eth1 --parent=1: --classid=1:1 htb --rate=20mbitUnable to parse htb rate "%s": Invalid format.Unable to parse htb ceil rate "%s": Invalid format.Unable to parse quantum "%s": Invalid format.Unable to parse burst "%s": Invalid format.Unable to parse cburst "%s": Invalid format.Usage: nl-qdisc-add [...] htb [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --r2q=DIV             Rate to quantum divisor (default: 10)
     --default=ID          Default class for unclassified traffic.

EXAMPLE    # Create htb root qdisc 1: and direct unclassified traffic to class 1:10
    nl-qdisc-add --dev=eth1 --parent=root --handle=1: htb --default=10;< �X@����P���@����(p���������zRx�$�� FJw�?:*3$"D��H\���/F�B�E �E(�D0�A8�KP�
8A0A(B BBBJ@������F�E�E �D(�A0�K@m
0A(A BBBK�P���$HW���$HWGNU�Pp
@
0 s���

t   ���o`��
�8 �P	@	���o���o����o�o����o8  0@P`p�������� �h���h�������`��GA$3a1�
�GA$3p1029@
sGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY`sGA+GLIBCXX_ASSERTIONShtb.so-3.7.0-1.el8.x86_64.debug���9�7zXZ�ִF!t/��w6]?�E�h=��ڊ�2N� ����fi�̨V�����p�@F��T���V�O�����'��i �䓂�P#[��o��5�ݦԀ��j� Pg��L��������a6Y��f`H�rCFs�Lb����6R��l���>�Z�b�q��)��&����h�_����dQO}�O�h��b�*��g�e��s��Z�a4s��=�`�c���S�S���j��ݾX^_O0Na	1Wvdݾ�D�zo~���Dr�E�w�����еZ��3���p3�����C��^X1n��
>M�c�E�&�-U�������uݞk��h���T	pdw�ᬚ)�LRq�X$LU'�?��:��j1�8YD˓�R�Kֱ��5|J��?�$j�>��f�o� �U
�(��`��� t��[
��T��)D�)^~��F�[U3I#��Z.�ti^V@/!��g�qB~�hW��}�[s���׮��:�7�0�B�8HU�*^�?�a�7;���:��/O��bU� ��RY�\�ΈǠ�j��M����!���N$�
�,~�+�㹫�ߩ
2���JRg�M0���k�֘DZ=FI�A4�ƵE�Z�uܚX���2R'�ϗ��e\j4|ra�����}*�^��hf���<�l���?����A�U�h<u�3�;}�=M��ט�)a)��/`�:-ǩ�WGu+��ZX�]Z�?t�N��5g3�̷Vy���4jy���+��D����#Mi��rryX�w�Q�:B��Q�i-4O��8<�i�(&�2�v�+v���ft�u|�C,,�c>)��H���
E��g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(��X0���8���o��2E���o��0T@^BP	P	�h�
�
c n00w@
@
3}tt
�2��h���<�00�PP � �   �0 0�8 8�8 8��   � ��! �!��!`�!D
4$$X$x�'(qdisc/pfifo.so000075500000017160151734743000007331 0ustar00ELF>�@0@8	@�� X
X
 X
 8@ �
�
 �
 888$$���  S�td���  P�td���44Q�tdR�tdX
X
 X
 ��GNU�����났�+@~
�����
�@ 
BE���|�qX� �h�Uya , �F"�� �� �� __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longoptargnl_cli_parse_u32rtnl_qdisc_fifo_set_limitputs__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endpfifo.soGLIBC_2.4GLIBC_2.2.5�ii
ui	X
 �	`
 �h
 `	p
 �x
 x
  z
  
` �
x �	� � � 	� 
� � � � � � � � � ��H��H�A H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q�������%= D���%5 D���%- D���%% D���% D���% D���%
 D���% D��H�=� ������H�=u �`���H�=� H�� H9�tH�� H��t	�����H�=i H�5b H)�H��H��H��?H�H�tH�� H��t��fD�����=% u+UH�=� H��tH�=� �9����d����� ]������w������AVI��AUA��ATI��USH�4 H��dH�%(H�D$1�H�l$I��H��H��L��D���D$������t:��ht)=u�H�� H�8�K���L�����q�����H�=Q����H�D$dH3%(u
H��[]A\A]A^�������H��H���hhelplimitpfifoUsage: nl-qdisc-add [...] pfifo [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --limit=LIMIT         Maximum queue length in number of packets.

EXAMPLE    # Attach pfifo with a 32 packet limit to eth1
    nl-qdisc-add --dev=eth1 --parent=root pfifo --limit=32;4���P����x����(���������zRx�$�����FJw�?:*3$"D����@\`����F�E�E �D(�A0�K@�
0A(A BBBA�L����(���GNU��	�`	�x
 ���
h
X
 h
 ���o`�
"� ���P	���o���oX���o�o2���o	�
 ��� 0@z
h
�
�	GA$3a1�u
GA$3p1029�f
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignpfifo.so-3.7.0-1.el8.x86_64.debugz@��7zXZ�ִF!t/��O]?�E�h=��ڊ�2N�`W�N ��^)U)�v3*f�ʹ��Ƃ?�(
Ny���V����%0z֒<4�x2O6k\X�p���=T+%����0�9Ge�f����f�aڶ�^��{g��
���:jP»m�J�������6{�
2���m}���Q:YՋ��E�A�~t53dstbo�3��C7qg�0��)!��-F����2�o��!�Rm}�2vu��K��Ij \J�K������4Gv��,��*�%<������t�J+h�{w�-֧��x�.�?|齲����I�D?Y�?m?�,��ŗ�H?�M���6�e��qU��~�>��l68M�
�,m0����Y�d�؉���Pjk:A�0�yϗ��Z\$��O��#m����h��Q��������l�hpi0z�M#%�
��~�AD�'��w�I2�o�!�0u\�";4��V֮�ܻ9���K"�X���-�Aht��֣5��>m9���7Q�z��_���mY]+�}�I���
������t�9f��M=$�����C47�L"_s8�Q\��#��������Ƶ���:�y?���=;�z�E:3lp�AC�]����ҰD�V�E�&�_ j�e��2�C�Cab�0�Z����r��P!�%#����Đ۲m
@p�aІ��W�#�fB_K�����j��]�9�T�x�����Ё<b�N�����z�%0Xo�<�մo@�U�,t3�C{��,�xa� L���䏸:>j�E�o�:(X�Q�u�Rp���*�:�����p(��g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(���0"8���o22 E���oXX0T��P^B���h��c���nPP�w���}h
h

�2x
x
@���4������� �X
 X
�h
 h
�x
 x
��
 �
�� ��� � �� ���`��
�(�X(qdisc/ingress.so000075500000017120151734743000007674 0ustar00ELF>�@@8	@ p
p
 p
  �
�
 �
 888$$�
�
�
  S�td�
�
�
  P�td


44Q�tdR�tdp
p
 p
 ��GNU�o�;1Yp^aS�W�_��
�@ 
BE���|�qXw afU , �F"�p �x �p __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longputs__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endingress.soGLIBC_2.4GLIBC_2.2.5�ii
�ui	�p
 �x
 ��
 @�
 ��
 �
  :	@ ?	X �� � � � 	� � � � � � 	��H��H�!	 H��t��H����5� �%� ��h�������h��������h�������h�������h�������h��������%U D���%M D���%E D���%= D���%5 D���%- D��H�=� ������H�=u ���H�=� H�� H9�tH�� H��t	�����H�=i H�5b H)�H��H��H��?H�H�tH�� H��t��fD�����=% u+UH�=� H��tH�=. �9����d����� ]������w������AUA��ATI��USH�Y H��dH�%(H�D$1�H�l$�fD��htCI��H��H�^L��D���D$������u�H�D$dH3%(uH��[]A\A]�H�=1�D������M�����H��H���hhelpingressUsage: nl-qdisc-add [...] ingress

OPTIONS
     --help                Show this help text.

EXAMPLE    # Attach ingress to eth1
    nl-qdisc-add --dev=eth1 --parent=root ingress;4��PP���x���������������zRx�$����pFJw�?:*3$"D���`8\�����F�E�D �A(�K@[
(A ABBD�������GNU���@��
 ����
$	p
 �
 ���o`��
�� �( 	���o���o����o�o����o�
 � 0@:	h?	�GA$3a1�1	GA$3p1029�#	GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realigningress.so-3.7.0-1.el8.x86_64.debug���9�7zXZ�ִF!t/��O]?�E�h=��ڊ�2N����^ ���d��:D6�_v��i
��S�ƪ��O:qGU#!��`ő��.�ajw���R�5AF��?3U&�W��x��n�3�ILJ���!�H���@��u�~L��#�-���tXM�v�tr��6ɿ���f�
0%d���i-L�� �3�Nָ[2�N01�ԯv��o*G9�
t�c^
L��
�n�w#�x�,�!	v�`��XJ���g�wa���J4�!T��[��"��ߪ�? W	1�N���yG�G^�V�U��G���4��C�⠗��8�`q�P���'���$�afD �e�����yx~���2QQS[�Ic�`{ns��7,x$�.�YH
�XN���7mpG���%�ae�Z��3t*���fD���$��i�]��FFa����G��YC��PV�P"qP�>V����	��n��V?c��{R�9��8n�!��xZ�~�׶[��E$s���
�!7w��L�ւ0��υ{*1Uaȕ�e8m=��P4Bb;��j�?�����N���I�`�%|�=~e*\�T�K����zQ��=�p{��G�̮<s��V�ێƁ:�� ~�a�=q3�Z)�ue�MZ��:"��2˅Kq@��6N,;����~�o~a���2�f���wfr���\����1ݑ;�j)w�C�K�ƶ�Þ1�+��YcY"59��\��|Y��Y�6�"`�����0`��*���纚�'�����c/r��
��'�#�8�U�y%V�.��4kH2u�� 뮱�g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(��80���8���o��E���o��0T ^B((�h��c��pnPP`w��s}$	$	
�28	8	��

4�8
8
���
�
 �p
 p
��
 �
��
 �
��
 �
�� �h� p �p p�x`p�
d(�X�(qdisc/plug.so000075500000027320151734743000007174 0ustar00ELF>`
@�'@8	@pp @@ @ �� hh h 888$$PPP  S�tdPPP  P�tdPPP44Q�tdR�td@@ @ ��GNU�p�%'l�
��}f���@ BE���|�qX� �h���Ua �, yF"A�  T�  H�  __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longoptargnl_cli_parse_u32rtnl_qdisc_plug_set_limitrtnl_qdisc_plug_release_indefiniteputsrtnl_qdisc_plug_bufferrtnl_qdisc_plug_release_one__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endplug.soGLIBC_2.4GLIBC_2.2.57ii
aui	k@ 0H p
P �
X `
` `   Z   _@  e`  l�  x�  ��  @� � 	� 
� � � � � � � � � � � 
� � ��H��H� H��t��H����5z �%{ ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A�������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%} D���%u D��H�=U �����H�=E �0���H�=i H�b H9�tH�> H��t	�����H�=9 H�52 H)�H��H��H��?H�H�tH� H��t��fD�����=� u+UH�=� H��tH�=N �9����d����� ]������w������AVI��AUA��ATI��USH�� H��dH�%(H�D$1�H�l$I��H��H��L��D���D$�x������t_=t|*��htE=u�H�' H�8����L�����u����=tY=u�L��������H�=�����H�D$dH3%(u1H��[]A\A]A^��L������K���L������;��������H��H���hhelplimitbufferrelease-onerelease-indefiniteplugUsage: nl-qdisc-add [...] plug [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --limit               Maximum queue length in bytes.
     --buffer              create a new buffer(plug) and queue incoming traffic into it.
     --release-one         release traffic from previous buffer.
     --release-indefinite  stop buffering and release all (buffered and new) packets.

EXAMPLE    # Attach plug qdisc with 32KB queue size to ifb0
    nl-qdisc-add --dev=ifb0 --parent=root plug --limit=32768
    # Plug network traffic arriving at ifb0
    nl-qdisc-add --dev=ifb0 --parent=root --update plug --buffer
    # Unplug traffic arriving at ifb0 indefinitely
    nl-qdisc-add --dev=ifb0 --parent=root --update plug --release-indefinite

    # If operating in output buffering mode:
    # at time t=t0, create a new output buffer b0 to hold network output
    nl-qdisc-add --dev=ifb0 --parent=root --update plug --buffer

    # at time t=t1, take a checkpoint c0, create a new output buffer b1
    nl-qdisc-add --dev=ifb0 --parent=root --update plug --buffer
    # at time t=t1+r, after c0 is committed, release b0
    nl-qdisc-add --dev=ifb0 --parent=root --update plug --release-one

    # at time t=t2, take a checkpoint c1, create a new output buffer b2
    nl-qdisc-add --dev=ifb0 --parent=root --update plug --buffer
    # at time t=t2+r, after c1 is committed, release b1
    nl-qdisc-add --dev=ifb0 --parent=root --update plug --release-one;4����P`���x���� ������zRx�$H����FJw�?:*3$"D���@\X���F�E�E �D(�A0�K@�
0A(A BBBH�D���� ���GNU�0p
�
`
` '7Y�
D@ P ���o`X�
wh �(�	���o���o����o�o����oh 		 	0	@	P	`	p	�	�	�	Zh_elx�@GA$3a1�QGA$3p1029`
BGA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignplug.so-3.7.0-1.el8.x86_64.debug9��E�7zXZ�ִF!t/��G]?�E�h=��ڊ�2N��J��N����A� �t���'_�ia��r�T�}��Yg��Xd��y�N��
�2Gӂ�)؎X���6�p��di��C�D�s�~!��.I^�I����$�8pX���2�
�:Q�l 7�n`�F�D�j�,�[��ka�Ӫ�J&�v� ~���}g�1*#~�ڝ>��^���b����@!��ק���e�G�w�����HcĥA6��-O�G��52w5uq0��>��$��>[IG{������&�+�?DjK�$��Mdk�<l��x{�H�(m��;�q���U���[W��ԍ�"�v�օd�Pj'>����k�Q*˨oA�w�n��:��J�a��ix�m�o���Y\I��-�ODD�xة�O����s��YW�p֧��5"ZJ�B���+X�z+[�m�jc�����V􄹓5�]Z�c�I/̪�c2�y�V�3���*R�O�zt���EI���I�ؔsr`��Қ�$-�3��.��5H�c����152��8a॓�q2b=-�4�B��oBV�Vsi�
�]�A�@z��{E_�;�7�i����mj@G�ZU�\]���cO+�CH<RBI�k����"�U����H�Gu�yN�@�5W����5�i��C�+�x	�l	����,�;���^rօ�NX��6����b�,�K��Y�ҢG�����%���
����H��4�Ou���l�惒���i��bY����cڗ2T�~t��<|���U�����+�l�3‰‚qK��P}F;��g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(���0XXw8���o��&E���o��0T((�^B��h��c���n�	�	�w`
`
�}DD
�2XX��PP4�����PP �@ @�P P�` `�h h�h h��   � ��  � �� `� �
�"(#Xd&(qdisc/bfifo.so000075500000027150151734743000007313 0ustar00ELF> 	@('@8	@�
�
 PP P @H xx x 888$$h
h
h
  S�tdh
h
h
  P�td```44Q�tdR�tdPP P ��GNUx��
�d«�`wn�1X)}��@ BE���|�qX� ���Uta , �hF"��  �  ��  __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longoptargnl_size2intrtnl_qdisc_fifo_set_limitputsnl_cli_fatal__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endbfifo.soGLIBC_2.4GLIBC_2.2.5�ii
ui	P �	X 0	` �	h  	p p   �
   �
`  �
x  
� � � 	� 
� 
� � � � � � � � � 
��H��H�	 H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a�������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D��H�=5 �����H�=% �P���H�=I H�B H9�tH�~ H��t	�����H�= H�5 H)�H��H��H��?H�H�tH�U H��t��fD�����=� u+UH�=2 H��tH�=� �9����d����� ]������w������AWAVI��AUA��ATI��USH�� H��dH�%(H�D$1�H�l$I��H��H��L��D���D$�y������t@��ht/=u�L�=q I�?�����x@��L���[����f�H�=i����H�D$dH3%(u"H��[]A\A]A^A_�I���H�5a1����������H��H���hhelplimitbfifoUsage: nl-qdisc-add [...] bfifo [OPTIONS]...

OPTIONS
     --help                Show this help text.
     --limit=LIMIT         Maximum queue length in number of bytes.

EXAMPLE    # Attach bfifo with a 4KB bytes limit to eth1
    nl-qdisc-add --dev=eth1 --parent=root bfifo --limit=4096Unable to parse bfifo limit "%s": Invalid format.;4����P0���x��������������zRx�$8����FJw�?:*3$"D�����H\����F�B�E �E(�D0�A8�KP�
8A0A(B BBBA�������GNU��	0	�	 	p ���
�
P ` ���o`(�
*x ���P	���o���ox���o�oR���o	x  0@P`p��
h�
�

GA$3a1��
GA$3p1029 	�
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignbfifo.so-3.7.0-1.el8.x86_64.debug��G�7zXZ�ִF!t/��O]?�E�h=��ڊ�2N�.�wGD���4�E����0��()H���1y��Q���'6��D���qY��5GT&H��IT����[.�	f&��$�����ɩ\�F�'�v�ff�:���+1P�p5����������b�qĴ�d-I�"λx�{|>M�i�ā4�s�xp>i�\��QM�C���)�]6����x��
��S���?��J���N4��V�X
E�
COT�gM��'��9
�U[��̗��T4%�mK�F��Yh	Tf�1��{��O��!��ͲRp���K�9���1F�J�*��Ա���u�>��kxã�z&=�F�xN�m���n$�5��ϲ{��?�I�le1i���F�Ǟ��uW��-[+� x��yL�`>��*�@߱���ㆾ*:�(�ƀN�@�)��]<�=�u����su�3�\]�J��<��k4�A�椢u�Z��i��p�ά��o��[L=b���XT���O��M8j�S{n&�loN���� ��o��X���%H\�,F.k�*m�J<\,�6��9P�X���	���B�jrzݶ���0"�2�ګ�|��9{�1`3����3�I\��.d������(�=���X����@u��ԯ��~��~U�}D��ï%��]��T�j[J�=��-W��s�c���>���}nq�@� ��%+��u5\5{��CKFK�v"��3��Ú�9��O�-哹L��f�MX+����H=�Gf/��X�+���+�d�kҥ����x�DZ�g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(���0((*8���oRR"E���oxx0T��P^B���h��c���n���w 	 	�}�
�

�2�
�
x�``4�����h
h
 �P P�` `�p p�x x�x x��   � ��  � �� `� �
�"(�"P�%(qdisc/blackhole.so000075500000017120151734743000010146 0ustar00ELF>�@@8	@88 p
p
 p
  �
�
 �
 888$$  S�td  P�td 
 
 
44Q�tdR�tdp
p
 p
 ��GNU +
�����~�ϫr�S��
�@ 
BE���|�qXw afU , �F"�p �x �p __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longputs__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endblackhole.soGLIBC_2.4GLIBC_2.2.5�ii
�ui	�p
 �x
 ��
 @�
 ��
 �
  :	@ ?	X �� � � � 	� � � � � � 	��H��H�!	 H��t��H����5� �%� ��h�������h��������h�������h�������h�������h��������%U D���%M D���%E D���%= D���%5 D���%- D��H�=� ������H�=u ���H�=� H�� H9�tH�� H��t	�����H�=i H�5b H)�H��H��H��?H�H�tH�� H��t��fD�����=% u+UH�=� H��tH�=. �9����d����� ]������w������AUA��ATI��USH�Y H��dH�%(H�D$1�H�l$�fD��htCI��H��H�^L��D���D$������u�H�D$dH3%(uH��[]A\A]�H�=9�D������M�����H��H���hhelpblackholeUsage: nl-qdisc-add [...] blackhole [OPTIONS]...

OPTIONS
     --help                Show this help text.

EXAMPLE    # Drop all outgoing packets on eth1
    nl-qdisc-add --dev=eth1 --parent=root blackhole;4����P0���x����������p����zRx�$h���pFJw�?:*3$"D����`8\����F�E�D �A(�K@[
(A ABBD���������GNU���@��
 ����
$	p
 �
 ���o`��
�� �( 	���o���o����o�o����o�
 � 0@:	h?	�GA$3a1�1	GA$3p1029�#	GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignblackhole.so-3.7.0-1.el8.x86_64.debug�b(��7zXZ�ִF!t/��W]?�E�h=��ڊ�2N����^ ���P�I.�D6�_v��i
��O���@wJ�Bv������o�~�+�0`��67�:�P�i��+L!C��G)��2�|�Z�9z�����]�	������b��5Cy!�Ǽ�Jw�9i�a}��*%�\�m����]s�+�[�JJ�����TW�O��H���Mֆƾ���T<2
�>읠�/�0���'Ǚ�]��jɟ�r���֚���0d�[3�Xm�i�]�.š
?g>����(�݈�zч����7����C�޷��o�ohS9kμ��9��`�n�b��SP������[��OY�{�c�]S����|㜼�ͪ��"��{\��o!�|������[$q�Z�0;;�dVR�x,ߤ�#���m�+^Ѫ'�-�+��a-xŔ���\�Ϙho������л���b�iy���KxR������j{���I��\*���������f����@Γ%�����E���e���0�q<-�G,R�cΖ�h�>4��,B��nZ:T��;��i=(!�S��$�U��;6w�-�w#�!7@f�7�<�%�;�0�&�ReWj-�g�Y�!e�z�T�1��T�	��)�;Ft��&�/�ި�/�����w���ӣ�C$��]�'�07���F��DYn���Ѝ�\���Uln�e��n�խ�Zӵ�+Z�Ư��0?��Z�:)w��+S	5����:�zs�Y3Y�D�_2�1k}4�n���z������7)��aX���g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(��80���8���o��E���o��0T ^B((�h��c��pnPP`w��s}$	$	
�28	8	�� 
 
4�X
X
�� �p
 p
��
 �
��
 �
��
 �
�� �h� p �p p�x`p�
d,�X�(cls/basic.so000075500000027220151734743000006763 0ustar00ELF>�
@P'@8	@�� 00 0 �� XX X 888$$���  S�td���  P�td���44Q�tdR�td00 0 ��GNU\�h�`/�w��  ����3�@ BE���|�qX�� ����U�a h��, F"5�  H�  <�  __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longoptargnl_cli_cls_parse_ematchrtnl_basic_set_ematchrtnl_tc_str2handlertnl_basic_set_targetputsexitnl_geterrornl_cli_fatal__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endbasic.soGLIBC_2.4GLIBC_2.2.5+ii
Vui	`0 �8 �
@ PH �
P P   �   
@  
�  
�  �� � 
� � � p x � � � � � � 	� � 
� � � ��H��H�� H��t��H����5J �%K ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!�������%u D���%m D���%e D���%] D���%U D���%M D���%E D���%= D���%5 D���%- D���%% D���% D���% D��H�=� ������H�=� ����H�=� H�� H9�tH�� H��t	�����H�=� H�5� H)�H��H��H��?H�H�tH�� H��t��fD�����=U u+UH�=� H��tH�=� �9����d����- ]������w������AWAVAUI��ATA��UH��SH��dH�%(H�D$1�H�\$I��DI��H�
 H��D��H���D$�T������tw��htZ��tt%��eu�H�� L��H�0�N���L��H���3���멐H�� L��H�8�>���A�Dž�xN�4$L�������f.�H�=����1�����DH�D$dH3%(u4H��[]A\A]A^A_É��b���H�59D��H��H�. H�1��T���������H��H���ht:e:Unable to parse target "%s":helptargetematchbasicUsage: nl-cls-add [...] basic [OPTIONS]...

OPTIONS
 -h, --help                Show this help text.
 -t, --target=ID           Target class to send matching packets to
 -e, --ematch=EXPR         Ematch expression

EXAMPLE    # Create a "catch-all" classifier, attached to "q_root", classyfing
    # all not yet classified packets to class "c_default"
    nl-cls-add --dev=eth0 --parent=q_root basic --target=c_default;4P���P0���x�����������zRx�$�����FJw�?:*3$"D�����H\H���!F�B�B �E(�D0�D8�DP�
8A0A(B BBBA�,�������GNU���
P�
P +M�
�0 @ ���o`��
lX 8�Ph	���o���o ���o�o����o
X  	0	@	P	`	p	�	�	�	�	�	�	�	�h
t
e
�GA$3a1��GA$3p1029�
�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignbasic.so-3.7.0-1.el8.x86_64.debug	���7zXZ�ִF!t/��G]?�E�h=��ڊ�2N���. ��Uf�G?*��5�z*��
Ns��N`�S�S���l�{;S�M��gtL�[a��k7��qE��p�!�_}������ͬ�DT��[
o�+݌�g�jKf�1}^@D�?a��,���W�_��)B�
{Zh�m�:¿l�݋�%ʯ�ך�I�eļ�3����n�Q/�$�S�r���S_c�w�"�q`�<�9�"���"P�c�G��ؿ(x�`s%��j�b��C�t{��-�m����r��k�����좖[��CYn�v<j�K���׍t��H���y�p���֓�
%r�kf�IB�+��qI�-�͝B�Q�({� .�A�$`W����Qu��kD
RT�~9f�������V��h}���a^>��9:���V~��1ay
v>��w�\DL��7�$��;�����p�)����	�Jn}?M
�v���S�#����]��z��eҋ�D[|
3�;�(�IK�Je	U�D�d�2��q�w�z��1gM���$�7S��vN_8"p",�P;���b���+aZ��|%���ƹ����B���~7�����`�쫨�n={�=�~20�A[թ�Zj��3�B�=	�?A�x�#=s�]���O#:v3w���}�CE$|��1LY����_-�,�L8�v���ս��\��\�)������j����2�-��6�v��j����s�=���K�ۍ�'ۀ����rb-P�-��
b���I,��м��ռ�N)I��F?נ��g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(���0��l8���o��*E���o  0TPPh^B��8h��c		�n�	�	�w�
�
}��
�2������4������� �0 0�@ @�P P�X X�X X��   � ��  � �� `� �
�"(�"\(&(cls/cgroup.so000075500000017140151734743000007201 0ustar00ELF> 	@ @8	@�� P
P
 P
 @H x
x
 x
 888$$���  S�td���  P�td���44Q�tdR�tdP
P
 P
 ��GNU�]��Z9�{�Vy��⃄��@ BE���|�qX� a�Uk r�f, �F"�� � �� __gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizegetopt_longputsexitoptargnl_cli_cls_parse_ematchrtnl_cgroup_set_ematch__stack_chk_failnl_cli_tc_registernl_cli_tc_unregisterlibpthread.so.0libc.so.6_edata__bss_start_endcgroup.soGLIBC_2.4GLIBC_2.2.5�ii
ui	 P
 �	X
 0	`
 �	h
  	p
 p
  �
  �
` �
x 
� � � � � 
� � � � � � 	� 
� � 
��H��H�	 H��t��H����5� �%� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a�������%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D���%� D��H�=5 ������H�=% �P���H�=I H�B H9�tH�~ H��t	�����H�= H�5 H)�H��H��H��?H�H�tH�U H��t��fD�����=� u+UH�=2 H��tH�=� �9����d����� ]������w������AVI��AUA��ATI��USH�� H��dH�%(H�D$1�H�l$I��H��H��L��D���D$�k������tF��et!��hu�H�=��0���1��y���f�H�Y L��H�0�>���L��H���C���떐H�D$dH3%(u
H��[]A\A]A^������H��H���he:helpematchcgroupUsage: nl-cls-add [...] cgroup [OPTIONS]...

OPTIONS
 -h, --help                Show this help text.
 -e, --ematch=EXPR         Ematch expression

EXAMPLE    nl-cls-add --dev=eth0 --parent=q_root cgroup;40���P���x`����p����@����zRx�$����FJw�?:*3$"DP����@\�����F�E�E �D(�A0�K@�
0A(A BBBA������p���GNU��	0	�	 	p
 ���
�
P
 `
 ���o`(�
,x ���P	���o���ox���o�oT���o	x
  0@P`p��
h�
e�

GA$3a1��
GA$3p1029 	�
GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realigncgroup.so-3.7.0-1.el8.x86_64.debug��L��7zXZ�ִF!t/��G
]?�E�h=��ڊ�2N�.�wGD���VPަ��U�]��ܷ�OgƬ�������&�U��2�DT���r>>�{p��\��r��2E(ܶ�B~�F��[j]�<��oyf��NA��$<h4����A��2�"$�|��j�D}ּ���g��q��9.-	;hЈR�ɐ�T��zs���5{d!C����g�&`�o��-$Jҝ���qoXc����6�f�]�b���~U�EYc�n��b���S�~<
�
_���BX��P"F`�8�хJ�p򷋌p=ie�������&�J��eJ�����[�4aq�j��+����T�\�>ZF_hRO�1B�!�;S$��n����^ߝ�!֯�)Z PM���U�A�%�j2�6��]B=bm���rR�~IQ�=U5��V"v��v��;��DC��Q&�d6$;�Hބ��ZDz�n�������9��m�%jd�Z�A��3r(gy�M�����J!D&��#:}���Z"�5[V_�R6�u6f�Q���M�����~�7a�ސ�!�K?������s�g�nk_N�̤(>Q9��2�0CT
�ƨƀfz�C��� �ѵ���z��l���|��r�~�h?�d8E9�%�:��>}�A�=����+Ji����I��|���cd�$
5Ӥ^���,᷻��&uw�W�AWas^ø/L�h�"*�9[�i�m��D������0^��<]�>	n��բ�1�P��6
�JRQ�7��|d�U)ϵ��bۃz,2��l��5
(f��sO�%��g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``0(���0((,8���oTT"E���oxx0T��P^B���h��c���n���w 	 	�}�
�

�2�
�
����4������� �P
 P
�`
 `
�p
 p
�x
 x
�x x�� � �� ���`��
�(�L�(